Cherche la position de la dernière occurrence d'une sous-chaîne dans une chaîne

  • « strripos
  • strspn »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Cherche la position de la dernière occurrence d'une sous-chaîne dans une chaîne

strrpos

(PHP 4, PHP 5, PHP 7, PHP 8)

strrpos — Cherche la position de la dernière occurrence d'une sous-chaîne dans une chaîne

Description

strrpos ( string $haystack , string $needle , int $offset = 0 ) : int|false

Cherche la position numérique de la dernière occurrence de needle dans la chaîne haystack.

Liste de paramètres

haystack

La chaîne dans laquelle chercher.

needle

Antérieur à PHP 8.0.0, si needle n'est pas une chaîne de caractères, elle est convertie en un entier et appliqué en tant que valeur ordinal d'un caractère. Ce comportement est obsolète à partir de PHP 7.3.0, et se fier à celui-ci est fortement déconseillé. En fonction du comportement attendu, needle doit être transtypé explicitement en une chaîne de caractère, ou un appel explicite à chr() doit être exécuté.

offset

Si zéro ou positif, la recherche est effectuée de gauche à droite omettant les premiers offset octets de haystack.

Si négatif, la recherche est effectuée de droite à gauche omettant les derniers offset octets de haystack et cherchant pour la première occurrence de needle.

Note:

Ceci est effectivement à la recherche de la dernière occurrence de needle avant les derniers offset octets.

Valeurs de retour

Retourne la position de la dernière occurrence de needle relativement au début de la chaîne haystack (indépendamment de la direction de recherche ou de l'offset).

Note: Les positions des chaîne de caractères débutent à 0, et pas à 1.

Retourne false si la needle n'a pas été trouvée.

Avertissement

Cette fonction peut retourner false, mais elle peut aussi retourner une valeur équivalent à false. Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour exacte de cette fonction.

Historique

Version | Description
8.0.0 | Passing an entier as needle is no longer supported.
7.3.0 | Passer un entier comme before_needle a été rendu obsolète.

Exemples

Exemple #1 Vérifie si une occurrence est trouvée dans une chaîne

Il est facile de faire une erreur quant à la valeur retournée entre "caractère trouvé à la position 0" et "caractère non trouvé". Voici comme détecter cette différence :

<?php

$pos = strrpos($mystring, "b");
if ($pos === false) { // note : 3 signes "="
    // non trouvé ...
}

?>

Exemple #2 Recherche avec des positions

<?php
$foo = "0123456789a123456789b123456789c";

// Chercher pour '0' depuis l'octet 0 (depuis le début)
var_dump(strrpos($foo, '0', 0));

// Chercher pour '0' depuis le 1er octet (après l'octet "0")
var_dump(strrpos($foo, '0', 1));

// Chercher pour '7' depuis le 21ème octet (après l'octet 20)
var_dump(strrpos($foo, '7', 20));

// Chercher pour '7' depuis le 29ème octet (après l'octet 28)
var_dump(strrpos($foo, '7', 28));

// Chercher pour '7' de droite à gauche depuis le 5ème octet depuis la fin
var_dump(strrpos($foo, '7', -5));

// Chercher pour 'c' de droite à gauche depuis le 2ème octet depuis la fin
var_dump(strrpos($foo, 'c', -2));

// Chercher pour '9c' de droite à gauche depuis le 2ème octet depuis la fin
var_dump(strrpos($foo, '9c', -2));
?>

L'exemple ci-dessus va afficher :

int(0)
bool(false)
int(27)
bool(false)
int(17)
bool(false)
int(29)

Voir aussi

  • strpos() - Cherche la position de la première occurrence dans une chaîne
  • stripos() - Recherche la position de la première occurrence dans une chaîne, sans tenir compte de la casse
  • strripos() - Cherche la position de la dernière occurrence d'une chaîne contenue dans une autre, de façon insensible à la casse
  • strrchr() - Trouve la dernière occurrence d'un caractère dans une chaîne
  • substr() - Retourne un segment de chaîne

User Contributed Notes

anonymous 29-Oct-2020 03:46
There is a lot of confusion around how $offset works and I feel it's really quite simple.

If $offset is positive, the operation ignores the first $offset characters of the haystack.
If $offset is negative, the operation ignores the last $offset-1 characters of the haystack (don't ask why -1...).

To understand this instinctively, just imagine the characters being replaced with invalid symbols. Here's an example:

<?php
$hackstack = '0123456789';

// Search the entire sequence 0123456789
var_dump(strrpos($hackstack, '0')); // int(0)
var_dump(strrpos($hackstack, '9')); // int(9)

// Only search ##23456789
var_dump(strrpos($hackstack, '1', 2)); // bool(false)
var_dump(strrpos($hackstack, '2', 2)); // int(2)

// Only search 0123456###
var_dump(strrpos($hackstack, '6', -4)); // int(6)
var_dump(strrpos($hackstack, '7', -4)); // bool(false)

?>
dave at pixelmetrics dot com 09-Jul-2019 10:22
The description of offset is wrong. Here’s how it works, with supporting examples.

Offset effects both the starting point and stopping point of the search. The direction is always right to left. (The description wrongly says PHP searches left to right when offset is positive.)

Here’s how it works:
When offset is positive, PHP searches right to left from the end of haystack to offset. This ignores the left side of haystack.

When offset is negative, PHP searches right to left, starting offset bytes from the end, to the start of haystack. This ignores the right side of haystack.

Example 1:
$foo = ‘aaaaaaaaaa’;
var_dump(strrpos($foo, 'a', 5));
Result: int(10)

Example 2:
$foo = "aaaaaa67890";
var_dump(strrpos($foo, 'a', 5));
Result: int(5)

Conclusion: When offset is positive, PHP searches right to left from the end of haystack.

Example 3:
$foo = "aaaaa567890";
var_dump(strrpos($foo, 'a', 5));
Result: bool(false)

Conclusion: When offset is positive, PHP stops searching at offset.

Example 4:
$foo = ‘aaaaaaaaaa’;
var_dump(strrpos($foo, 'a', -5));
Result: int(6)

Conclusion: When offset is negative, PHP searches right to left, starting offset bytes from the end.

Example 5:
$foo = "a234567890";
var_dump(strrpos($foo, 'a', -5));
Result: int(0)

Conclusion: When offset is negative, PHP searches right to left, all the way to the start of haystack.
david dot mann at djmann dot co dot uk 28-Mar-2018 02:16
Ten years on, Brian's note is still a good overview of how offsets work, but a shorter and simpler summary is:

    strrpos($x, $y, 50);  // 1: this tells strrpos() when to STOP, counting from the START of $x
    strrpos($x, $y, -50); // 2: this tells strrpos() when to START, counting from the END of $x

Or to put it another way, a positive number lets you search the rightmost section of the string, while a negative number lets you search the leftmost section of the string.

Both these variations are useful, but picking the wrong one can cause some highly confusing results!
stevewa 17-Oct-2016 07:25
i wanted to find a leading space BEFORE a hyphen

Crude Oil (Dec) 51.00-56.00

so I had to find the position of the hyphen

then subtract that position from the length of the string (to make it a negative number)
and then walk left toward the beginning of the string, looking for the first space before the hyphen

ex:
$str_position_hyphen  = strpos($line_new,"-",$str_position_spread);

$line_new_length = strlen($line_new);

$str_position_hyphen_from_end = $str_position_hyphen - $line_new_length;

echo "hyphen position from end = " . $str_position_hyphen_from_end . "<br />\n";

$str_position_space_before_hyphen  = strrpos($line_new, " ", $str_position_hyphen_from_end);

echo "*** previous space= " . $str_position_space_before_hyphen . "<br />\n";

$line_new = substr_replace($line_new, ",", $str_position_space_before_hyphen, 1  );

echo $line_new . "<br /><br />\n";
islandispeace at hotmail dot com 29-Nov-2015 07:30
$offset is very misleading, here is my understanding:

function mystrrpos($haystack, $needle, $offset = 0) {
    if ($offset == 0) {
        return strrpos ($haystack, $needle);
    } else {
        return strrpos (substr($haystack, 0, $offset), $needle);
    }
}
info at qrworld dot net 04-Nov-2014 02:52
I made a function using strrpos to get the extension of a file.

function getExtension($file) {
  $pos = strrpos($file, '.');
  if($pos===false){
    return false;
  } else {
    return substr($file, $pos+1);
  }
}

The link of the post where I took the code is:

http://softontherocks.blogspot.com/2013/07/obtener-la-extension-de-un-fichero-con.html
tremblay dot jf at gmail dot com 12-May-2014 06:57
I created an easy function that search a substring inside a string.
It reverse the string and the substring inside an strpos and substract the result to the length of the string.

if (!function_exists("real_strrpos")) {
   function real_strrpos($haystack,$needle) {
      $pos  = strlen($haystack);
      $pos -= strpos(strrev($haystack), strrev($needle) );
      $pos -= strlen($needle);
      return $pos;
   }
}
arlaud pierre 02-Jul-2012 01:51
This seems to behave like the exact equivalent to the PHP 5 offset parameter for a PHP 4 version.

<?php
 function strrpos_handmade($haystack, $needle, $offset = 0){

  if($offset === 0) return strrpos($haystack, $needle);

  $length = strlen($haystack);
  $size = strlen($needle);

  if($offset < 0) {
    $virtual_cut = $length+$offset;
    $haystack = substr($haystack, 0, $virtual_cut+$size);
    $ret = strrpos($haystack, $needle);
    return $ret > $virtual_cut ? false : $ret;
  } else {
    $haystack = substr($haystack, $offset);
    $ret = strrpos($haystack, $needle);
    return $ret === false ? $ret : $ret+$offset;
  }

}
?>
maxmike at gmail dot com 11-Jul-2009 10:05
I've got a simple method of performing a reverse strpos which may be of use.  This version I have treats the offset very simply:
Positive offsets search backwards from the supplied string index.
Negative offsets search backwards from the position of the character that many characters from the end of the string.

Here is an example of backwards stepping through instances of a string with this function:

<?php
function backwardStrpos($haystack, $needle, $offset = 0){
    $length = strlen($haystack);
    $offset = ($offset > 0)?($length - $offset):abs($offset);
    $pos = strpos(strrev($haystack), strrev($needle), $offset);
    return ($pos === false)?false:( $length - $pos - strlen($needle) );
}

$pos = 0;
$count = 0;
echo "Test1<br/>";
while(($pos = backwardStrpos("012340567890", "0", $pos)) !== false){
     echo $pos."<br/>";
    $pos--;
    if($pos < 0){
        echo "Done<br/>";break;
    }
}
echo "---===---<br/>\nTest2<br/>";
echo backwardStrpos("12341234", "1", 2)."<br/>";
echo backwardStrpos("12341234", "1", -2);
?>

Outputs:
Test1
11
5
0
Done
---===---
Test2
0
4

With Test2 the first line checks from the first 3 in "12341234" and runs backwards until it finds a 1 (at position 0)

The second line checks from the second 2 in "12341234" and seeks towards the beginning for the first 1 it finds (at position 4).

This function is useful for php4 and also useful if the offset parameter in the existing strrpos is equally confusing to you as it is for me.
alexandre at NOSPAM dot pixeline dot be 20-Dec-2008 08:35
I needed to check if a variable that contains a generated folder name based on user input had a trailing slash.

This did the trick:

<?php
    // Detect and remove a trailing slash
    $root_folder = ((strrpos($root_folder, '/') + 1) == strlen($root_folder)) ? substr($root_folder, 0, - 1) : $root_folder;
?>
dixonmd at gmail dot com 24-Dec-2007 02:42
<?php
        $pos = strlen(string $haystack) - strpos (strrev(string $haystack), strrev(string $needle)) - strlen(string $needle);
?>

         If in the needle there is more than one character then in php 4 we can use the above statement for finding the position of last occurrence of a substring in a string instead of strrpos. Because in php 4 strrpos uses the first character of the substring.

eg :
<?php
        $haystack = "you you you you you";
        $needle = "you";
        $pos1 = strlen($haystack) - strpos (strrev($haystack), strrev($needle)) - strlen($needle);
        echo $pos1 . "<br>";
        $pos2 strrpos($haystack, $needle);
        echo $pos2 . "<br>";
?>
Daniel Brinca 15-Oct-2007 05:41
Here is a simple function to find the position of the next occurrence of needle in haystack, but searching backwards  (lastIndexOf type function):

//search backwards for needle in haystack, and return its position
function rstrpos ($haystack, $needle, $offset){
    $size = strlen ($haystack);
    $pos = strpos (strrev($haystack), $needle, $size - $offset);

    if ($pos === false)
        return false;

    return $size - $pos;
}

Note: supports full strings as needle
pb at tdcspace dot dk 23-Sep-2007 07:26
what the hell are you all doing. Wanna find the *next* last from a specific position because strrpos is useless with the "offset" option, then....

ex: find 'Z' in $str from position $p,  backward...

while($p > -1 and $str{$p} <> 'Z') $p--;

Anyone will notice $p = -1 means: *not found* and that you must ensure a valid start offset in $p, that is >=0 and < string length. Doh
brian at enchanter dot net 16-Jul-2007 07:47
The documentation for 'offset' is misleading.

It says, "offset may be specified to begin searching an arbitrary number of characters into the string. Negative values will stop searching at an arbitrary point prior to the end of the string."

This is confusing if you think of strrpos as starting at the end of the string and working backwards.

A better way to think of offset is:

- If offset is positive, then strrpos only operates on the part of the string from offset to the end. This will usually have the same results as not specifying an offset, unless the only occurences of needle are before offset (in which case specifying the offset won't find the needle).

- If offset is negative, then strrpos only operates on that many characters at the end of the string. If the needle is farther away from the end of the string, it won't be found.

If, for example, you want to find the last space in a string before the 50th character, you'll need to do something like this:

strrpos($text, " ", -(strlen($text) - 50));

If instead you used strrpos($text, " ", 50), then you would find the last space between the 50th character and the end of the string, which may not have been what you were intending.
jafet at g dot m dot a dot i dot l dot com 12-Apr-2007 01:57
Full strpos() functionality, by yours truly.

<?php
function conforming_strrpos($haystack, $needle, $offset = 0)
{
    # Why does strpos() do this? Anyway...
    if(!is_string($needle)) $needle = ord(intval($needle));
    $haystack = strval($haystack);
    # Parameters
    $hlen = strlen($haystack);
    $nlen = strlen($needle);
    # Come on, this is a feature too
    if($nlen == 0)
    {
        trigger_error(__FUNCTION__.'(): Empty delimiter.', E_USER_WARNING);
        return false;
    }
    $offset = intval($offset);
    $hrev = strrev($haystack);
    $nrev = strrev($needle);
    # Search
    $pos = strpos($hrev, $nrev, $offset);
    if($pos === false) return false;
    else return $hlen - $nlen - $pos;
}
?>

Note that $offset is evaluated from the end of the string.

Also note that conforming_strrpos() performs some five times slower than strpos(). Just a thought.
mijsoot_at_gmail_dot_com 06-Mar-2007 01:43
To begin, i'm sorry for my English.
So, I needed of one function which gives me the front last position of a character.
Then I said myself that it should be better to make one which gives the "N" last position.

$return_context = "1173120681_0__0_0_Mijsoot_Thierry";

// Here i need to find = "Mijsoot_Thierry"

//echo $return_context."<br />";// -- DEBUG

function findPos($haystack,$needle,$position){
    $pos = strrpos($haystack, $needle);
    if($position>1){
        $position --;
        $haystack = substr($haystack, 0, $pos);
        $pos = findPos($haystack,$needle,$position);
    }else{
        // echo $haystack."<br />"; // -- DEBUG
        return $pos;
    }
    return $pos;
}

var_dump(findPos($return_context,"_",2)); // -- TEST
Christ Off 29-Jan-2007 10:50
Function to truncate a string
Removing dot and comma
Adding ... only if a is character found

function TruncateString($phrase, $longueurMax = 150) {
    $phrase = substr(trim($phrase), 0, $longueurMax);
    $pos = strrpos($phrase, " ");
    $phrase = substr($phrase, 0, $pos);
    if ((substr($phrase,-1,1) == ",") or (substr($phrase,-1,1) == ".")) {
        $phrase = substr($phrase,0,-1);
    }
    if ($pos === false) {
        $phrase = $phrase;
    }
    else {
        $phrase = $phrase . "...";
    }
return $phrase;
}
php NO at SPAMMERS willfris SREMMAPS dot ON nl 20-Dec-2006 06:48
<?php
/*******
 ** Maybe the shortest code to find the last occurence of a string, even in php4
 *******/
function stringrpos($haystack,$needle,$offset=NULL)
{
    return strlen($haystack)
           - strpos( strrev($haystack) , strrev($needle) , $offset)
           - strlen($needle);
}
// @return   ->   chopped up for readability.
?>
purpleidea 27-Nov-2006 12:07
I was having some issues when I moved my code to run it on a different server.
The earlier php version didn't support more than one character needles, so tada, bugs. It's in the docs, i'm just pointing it out in case you're scratching your head for a while.
dmitry dot polushkin at gmail dot com 03-Nov-2006 10:05
Returns the filename's string extension, else if no extension found returns false.
Example: filename_extension('some_file.mp3'); // mp3
Faster than the pathinfo() analogue in two times.
<?php
function filename_extension($filename) {
    $pos = strrpos($filename, '.');
    if($pos===false) {
        return false;
    } else {
        return substr($filename, $pos+1);
    }
}
?>
kavih7 at yahoo dot com 08-Jun-2006 12:53
<?php
###################################################
#
# DESCRIPTION:
# This function returns the last occurance of a string,
# rather than the last occurance of a single character like
# strrpos does. It also supports an offset from where to
# start the searching in the haystack string.
#
# ARGS:
# $haystack (required) -- the string to search upon
# $needle (required) -- the string you are looking for
# $offset (optional) -- the offset to start from
#
# RETURN VALS:
# returns integer on success
# returns false on failure to find the string at all
#
###################################################

function strrpos_string($haystack, $needle, $offset = 0)
{
    if(trim($haystack) != "" && trim($needle) != "" && $offset <= strlen($haystack))
    {
        $last_pos = $offset;
        $found = false;
        while(($curr_pos = strpos($haystack, $needle, $last_pos)) !== false)
        {
            $found = true;
            $last_pos = $curr_pos + 1;
        }
        if($found)
        {
            return $last_pos - 1;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}
?>
shimon at schoolportal dot co dot il 03-May-2006 11:31
In strrstr function in php 4 there is also no offset.
<?
// by Shimon Doodkin
function chrrpos($haystack, $needle, $offset=false)
{
 $needle=$needle[0];
 $l=strlen($haystack);
 if($l==0)  return false;
 if($offset===false)  $offset=$l-1;
 else
 {
  if($offset>$l) $offset=$l-1;
  if($offset<0) return false;
 }
 for(;$offset>0;$offset--)
  if($haystack[$offset]==$needle)
   return $offset;
 return false;
}
?>
gordon at kanazawa-gu dot ac dot jp 13-Sep-2005 09:56
The "find-last-occurrence-of-a-string" functions suggested here do not allow for a starting offset, so here's one, tried and tested, that does:

function my_strrpos($haystack, $needle, $offset=0) {
    // same as strrpos, except $needle can be a string
    $strrpos = false;
    if (is_string($haystack) && is_string($needle) && is_numeric($offset)) {
        $strlen = strlen($haystack);
        $strpos = strpos(strrev(substr($haystack, $offset)), strrev($needle));
        if (is_numeric($strpos)) {
            $strrpos = $strlen - $strpos - strlen($needle);
        }
    }
    return $strrpos;
}
genetically altered mastermind at gmail 22-Aug-2005 10:30
Very handy to get a file extension:
$this->data['extension'] = substr($this->data['name'],strrpos($this->data['name'],'.')+1);
fab 10-Aug-2005 04:07
RE: hao2lian

There are a lot of alternative - and unfortunately buggy - implementations of strrpos() (or last_index_of as it was called) on this page. This one is a slight modifiaction of the one below, but it should world like a *real* strrpos(), because it returns false if there is no needle in the haystack.

<?php

function my_strrpos($haystack, $needle) {
   $index = strpos(strrev($haystack), strrev($needle));
   if($index === false) {
        return false;
   }
   $index = strlen($haystack) - strlen($needle) - $index;
   return $index;
}

?>
jonas at jonasbjork dot net 06-Apr-2005 01:25
I needed to remove last directory from an path, and came up with this solution:

<?php

  $path_dir = "/my/sweet/home/";
  $path_up = substr( $path_dir, 0, strrpos( $path_dir, '/', -2 ) )."/";
  echo $path_up;

?>

Might be helpful for someone..
escii at hotmail dot com ( Brendan ) 10-Jan-2005 07:12
I was immediatley pissed when i found the behaviour of strrpos ( shouldnt it be called charrpos ?) the way it is, so i made my own implement to search for strings.

<?
function proper_strrpos($haystack,$needle){
        while($ret = strrpos($haystack,$needle))
        {
                if(strncmp(substr($haystack,$ret,strlen($needle)),
                                $needle,strlen($needle)) == 0 )
                        return $ret;
                $haystack = substr($haystack,0,$ret -1 );
        }
        return $ret;
}
?>
griffioen at justdesign dot nl 17-Nov-2004 10:57
If you wish to look for the last occurrence of a STRING in a string (instead of a single character) and don't have mb_strrpos working, try this:

    function lastIndexOf($haystack, $needle) {
        $index        = strpos(strrev($haystack), strrev($needle));
        $index        = strlen($haystack) - strlen(index) - $index;
        return $index;
    }
nexman at playoutloud dot net 07-Oct-2004 09:22
Function like the 5.0 version of strrpos for 4.x.
This will return the *last* occurence of a string within a string.

    function strepos($haystack, $needle, $offset=0) {
        $pos_rule = ($offset<0)?strlen($haystack)+($offset-1):$offset;
        $last_pos = false; $first_run = true;
        do {
            $pos=strpos($haystack, $needle, (intval($last_pos)+(($first_run)?0:strlen($needle))));
            if ($pos!==false && (($offset<0 && $pos <= $pos_rule)||$offset >= 0)) {
                $last_pos = $pos;
            } else { break; }
            $first_run = false;
        } while ($pos !== false);
        if ($offset>0 && $last_pos<$pos_rule) { $last_pos = false; }
        return $last_pos;
    }

If my math is off, please feel free to correct.
  - A positive offset will be the minimum character index position of the first character allowed.
  - A negative offset will be subtracted from the total length and the position directly before will be the maximum index of the first character being searched.

returns the character index ( 0+ ) of the last occurence of the needle.

* boolean FALSE will return no matches within the haystack, or outside boundries specified by the offset.
tsa at medicine dot wisc dot edu 24-May-2004 05:17
What the heck, I thought I'd throw another function in the mix.  It's not pretty but the following function counts backwards from your starting point and tells you the last occurrance of a mixed char string:

<?php
function strrposmixed ($haystack, $needle, $start=0) {
   // init start as the end of the str if not set
   if($start == 0) {
       $start = strlen($haystack);
   }

   // searches backward from $start
   $currentStrPos=$start;
   $lastFoundPos=false;

   while($currentStrPos != 0) {
       if(!(strpos($haystack,$needle,$currentStrPos) === false)) {
           $lastFoundPos=strpos($haystack,$needle,$currentStrPos);
           break;
       }
       $currentStrPos--;
   }

   if($lastFoundPos === false) {
       return false;
   } else {
       return $lastFoundPos;
   }
}
?>
ZaraWebFX 14-Oct-2003 11:06
this could be, what derek mentioned:

<?
function cut_last_occurence($string,$cut_off) {
    return strrev(substr(strstr(strrev($string), strrev($cut_off)),strlen($cut_off)));
}

//    example: cut off the last occurence of "limit"
    $str = "select delta_limit1, delta_limit2, delta_limit3 from table limit 1,7";
    $search = " limit";
    echo $str."\n";
    echo cut_last_occurence($str,"limit");
?>
lee at 5ss dot net 29-Aug-2003 07:21
I should have looked here first, but instead I wrote my own version of strrpos that supports searching for entire strings, rather than individual characters.  This is a recursive function.  I have not tested to see if it is more or less efficient than the others on the page.  I hope this helps someone!

<?php
//Find last occurance of needle in haystack
function str_rpos($haystack, $needle, $start = 0){
    $tempPos = strpos($haystack, $needle, $start);
    if($tempPos === false){
        if($start == 0){
            //Needle not in string at all
            return false;
        }else{
            //No more occurances found
            return $start - strlen($needle);
        }
    }else{
        //Find the next occurance
        return str_rpos($haystack, $needle, $tempPos + strlen($needle));
    }
}
?>
FIE 15-Feb-2003 05:03
refering to the comment and function about lastIndexOf()...
It seemed not to work for me the only reason I could find was the haystack was reversed and the string wasnt therefore it returnt the length of the haystack rather than the position of the last needle... i rewrote it as fallows:

<?php
function strlpos($f_haystack,$f_needle) {
      $rev_str = strrev($f_needle);
      $rev_hay = strrev($f_haystack);
      $hay_len = strlen($f_haystack);
      $ned_pos = strpos($rev_hay,$rev_str);
      $result  = $hay_len - $ned_pos - strlen($rev_str);
      return $result;
}
?>

this one fallows the strpos syntax rather than java's lastIndexOf.
I'm not positive if it takes more resources assigning all of those variables in there but you can put it all in return if you want, i dont care if i crash my server ;).

~SILENT WIND OF DOOM WOOSH!
php dot net at insite-out dot com 17-Dec-2002 11:47
I was looking for the equivalent of Java's lastIndexOf(). I couldn't find it so I wrote this:

<?php
/*
Method to return the last occurrence of a substring within a
string
*/
function last_index_of($sub_str,$instr) {
    if(strstr($instr,$sub_str)!="") {
        return(strlen($instr)-strpos(strrev($instr),$sub_str));
    }
    return(-1);
}
?>

It returns the numerical index of the substring you're searching for, or -1 if the substring doesn't exist within the string.
su.noseelg@naes, only backwards 13-Dec-2002 10:39
Maybe I'm the only one who's bothered by it, but it really bugs me when the last line in a paragraph is a single word. Here's an example to explain what I don't like:

The quick brown fox jumps over the lazy
dog.

So that's why I wrote this function. In any paragraph that contains more than 1 space (i.e., more than two words), it will replace the last space with '&nbsp;'.

<?php
function no_orphans($TheParagraph) {
    if (substr_count($TheParagraph," ") > 1) {
    $lastspace = strrpos($TheParagraph," ");
    $TheParagraph = substr_replace($TheParagraph,"&nbsp;",$lastspace,1);
    }
return $TheParagraph;
}
?>

So, it would change "The quick brown fox jumps over the lazy dog." to "The quick brown fox jumps over the lazy&nbsp;dog." That way, the last two words will always stay together.


Trouve la longueur du segment initial d'une chaîne contenant tous les caractères d'un masque donné

  • « strrpos
  • strstr »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Trouve la longueur du segment initial d'une chaîne contenant tous les caractères d'un masque donné

strspn

(PHP 4, PHP 5, PHP 7, PHP 8)

strspn — Trouve la longueur du segment initial d'une chaîne contenant tous les caractères d'un masque donné

Description

strspn ( string $string , string $characters , int $offset = 0 , int|null $length = null ) : int

Trouve la longueur du segment initial de string qui contient uniquement les caractères depuis le masque characters.

Si les paramètres offset et length sont omis, alors toutes les chaînes string seront analysées. S'ils sont fournis, alors les effets seront identiques à appeler strspn(substr($subject, $start, $length), $mask) (voir substr pour plus d'informations).

Le code suivant :

<?php
$var = strspn("42 est la réponse, mais quelle est la question.", "1234567890");
?>
assigne 2 à la variable $var, car la chaîne "42" est le segment initial du paramètre string dont les caractères sont contenus dans "1234567890".

Liste de paramètres

string

La chaîne à analyser.

characters

La liste des caractères autorisés.

offset

La position dans la chaîne string à partir de laquelle nous devons chercher.

Si offset est fourni et n'est pas négatif, alors strspn() commencera à analyser la chaîne string à la position offset. Par exemple, dans la chaîne 'abcdef', le caractère à la position 0 est 'a', le caractère à la position 2 est 'c', et ainsi de suite.

Si offset est fourni et est négatif, alors strspn() commencera à analyser la chaîne string à la position offset depuis la fin de la chaîne string.

length

La longueur de la chaîne à analyser.

Si length est fourni et n'est pas négatif, alors string sera examiné sur length caractères après la position de départ.

Si length est fourni et est négatif, alors string sera examiné sur length caractères depuis la fin de la chaîne string.

Valeurs de retour

Retourne la taille du segment initial de la chaîne string qui est entièrement constitué de caractères contenus dans characters.

Note:

Lorsque le paramètre offset est défini, la longueur retournée est comptée à partir de cette position, et non depuis le début du paramètre string.

Historique

Version | Description
8.0.0 | length est désormais nullable.

Exemples

Exemple #1 Exemple avec strspn()

<?php
// Le sujet ne commence pas par un des caractères depuis le masque
var_dump(strspn("foo", "o"));

// Examine 2 caractères depuis le début du sujet, à la position 1
var_dump(strspn("foo", "o", 1, 2));

// Examine un caractère depuis le début du sujet, à la position 1
var_dump(strspn("foo", "o", 1, 1));
?>

L'exemple ci-dessus va afficher :

int(0)
int(2)
int(1)

Notes

Note: Cette fonction gère les chaînes binaires.

Voir aussi

  • strcspn() - Trouve un segment de chaîne ne contenant pas certains caractères

User Contributed Notes

lincoln dot mahmud at gmail dot com 13-Aug-2020 01:34
Get Group match letter

<?php

$s= 'aaabbbcceeffaaeeeaaabbzmmm';

function groupby( $s ){
    static $a = [];
    static $i = 0;

    $o = strspn( $s, $s[$i], $i);
    $a[ $i ] = [  $s[$i] => $o ];
    $i += $o;

    if( $i < strlen($s) ) {
        groupby($s);
    }

    return $a;
}

print_r(groupby($s));

?>
ayaou dot mohammed at gmail dot com 14-Nov-2019 02:32
This function doesn't  work with non ASCII characters

Exemple:

<?php

$subject = "Comment ça va ma chérie";
$mask = "éèçà";

echo strspn($subject,$mask); // Echo 0

?>

See, we expected  1 but 0 was the correct result
nino dot skopac at gmail dot com 07-Feb-2018 06:59
strspon and preg_match seem to be equally fast for validating numbers:

<?php

$testValInvalid = 'foobar123^^';
$testValValid = '12346';
$allowedChars = '1234567890';

$t1 = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    assert(strspn($testValInvalid, $allowedChars) != strlen($testValInvalid));
    assert(strspn($testValValid, $allowedChars) == strlen($testValValid));
}
print 'Time taken for strspon: ' . (microtime(true) - $t1);
print PHP_EOL;

$t1 = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
    assert(preg_match('/^[0-9]+$/', $testValInvalid) === 0);
    assert(preg_match('/^[0-9]+$/', $testValValid));
}

print 'Time taken for preg_match: ' . (microtime(true) - $t1);
print PHP_EOL;

/**
nino-mcb:hosp_web ninoskopac$ php test.php
Time taken for strspon: 3.24165391922
Time taken for preg_match: 3.1820080280304
nino-mcb:hosp_web ninoskopac$ php test.php
Time taken for strspon: 3.1806418895721
Time taken for preg_match: 3.2244551181793
 */
?>
bob at example dot com 05-Jun-2012 03:37
Quick way to check if a string consists entirely of characters within the mask is to compare strspn with strlen eg:

<?php
$path = $_SERVER['PATH_INFO'];
if (strspn($path,'/') == strlen($path)) {
    //PATH_INFO is empty
}
?>
mrsohailkhan at gmail dot com 01-Feb-2011 12:56
very dificult to get from the definition directly, while i search for that,i came to know that

strspn() will tell you the length of a string consisting entirely of the set of characters in accept set. That is, it starts walking down str until it finds a character that is not in the set (that is, a character that is not to be accepted), and returns the length of the string so far.

and

strcspn() works much the same way, except that it walks down str until it finds a character in the reject set (that is, a character that is to be rejected.) It then returns the length of the string so far.

<?php
$acceptSet = "aeiou";
$rejectSet  = "y";

$str1 ="a banana";
$str2 ="the bolivian navy on manuvers in the south pacific";

echo $n = strspn($str1,$acceptSet);// $n == 1, just "a"

echo $n = strcspn($str2,$rejectSet);// n = 16, "the bolivian nav"
?>

hope this example will help in understanding the concept of strspn() and strcspn().
AT-HE (at_he.hotmail) 28-Nov-2010 02:45
you can use this function with strlen to check illegal characters, string lenght must be the same than strspn (characters from my string contained in another)

<?php

$digits='0123456789';

if (strlen($phone) != strspn($phone,$digits))
 echo "illegal characters";

?>
Dmitry Mazur 04-Mar-2009 10:23
The second parameter is a set of allowed characters.
strspn will return an zero-based index of a first non-allowed character.
barry dot balkowski at gmail dot com 08-Aug-2008 02:12
It took me some time to understand the way this function works…
I’ve compiled my own explanation with my own words that is more understandable for me personally than the official one or those that can be found in different tutorials on the web.
Perhaps, it will save someone several minutes…

<?php
strspn(string $haystack, string $char_list [, int $start [, int $length]])
?>

The way it works:
 -   searches for a segment of $haystack that consists entirely from supplied through the second argument chars
 -   $haystack must start from one of the chars supplied through $char_list, otherwise the function will find nothing
 -   as soon as the function encounters a char that was not mentioned in $chars it understands that the segment is over and stops (it doesn’t search for the second, third and so on segments)
 -   finally, it measures the segment’s length and return it (i.e. length)

In other words it finds a span (only the first one) in the string that consists entirely form chars supplied in $chars_list and returns its length
B Crawford 02-Oct-2007 05:20
This function is significantly faster for checking illegal characters than the equivalent preg_match() method.


Trouve la première occurrence dans une chaîne

  • « strspn
  • strtok »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Trouve la première occurrence dans une chaîne

strstr

(PHP 4, PHP 5, PHP 7, PHP 8)

strstr — Trouve la première occurrence dans une chaîne

Description

strstr ( string $haystack , string $needle , bool $before_needle = false ) : string|false

Retourne une sous-chaîne de haystack, allant de la première occurrence de needle (incluse) jusqu'à la fin de la chaîne.

Note:

strstr() est sensible à la casse. Pour une fonctionnalité identique, mais insensible à la casse, reportez-vous à stristr().

Note:

Si vous voulez juste déterminer si un needle particulier se trouve dans la chaîne haystack, utilisez la fonction strpos() qui est plus rapide et qui consomme moins de ressources.

Liste de paramètres

haystack

La chaîne d'entrée.

needle

Antérieur à PHP 8.0.0, si needle n'est pas une chaîne de caractères, elle est convertie en un entier et appliqué en tant que valeur ordinal d'un caractère. Ce comportement est obsolète à partir de PHP 7.3.0, et se fier à celui-ci est fortement déconseillé. En fonction du comportement attendu, needle doit être transtypé explicitement en une chaîne de caractère, ou un appel explicite à chr() doit être exécuté.

before_needle

Si vaut true, strstr() retourne la partie de haystack avant la première occurrence de needle (needle étant exclus).

Valeurs de retour

Retourne la portion de la chaîne, ou false si needle n'est pas trouvé.

Historique

Version | Description
8.0.0 | Passing an entier as needle is no longer supported.
7.3.0 | Passer un entier comme before_needle a été rendu obsolète.

Exemples

Exemple #1 Exemple avec strstr()

<?php
$email  = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // Affiche : @example.com

$user = strstr($email, '@', true); // Depuis PHP 5.3.0
echo $user; // Affiche : name
?>

Voir aussi

  • stristr() - Version insensible à la casse de strstr
  • strrchr() - Trouve la dernière occurrence d'un caractère dans une chaîne
  • strpos() - Cherche la position de la première occurrence dans une chaîne
  • strpbrk() - Recherche un ensemble de caractères dans une chaîne de caractères
  • preg_match() - Effectue une recherche de correspondance avec une expression rationnelle standard

User Contributed Notes

Gevorg Melkumyan 03-Feb-2021 03:17
Don't  confuse this function with strtr ) I lost like 1 hour on that
trent dot renshaw at objectst dot com dot au 25-Jun-2015 02:08
> root at mantoru dot de

PHP makes this easy for you. When working with domain portion of email addresses, simply pass the return of strstr() to substr() and start at 1:

substr(strstr($haystack, '@'), 1);
laszlo dot heredy at gmail dot com 07-Nov-2013 09:39
strstr() is not a way to avoid type-checking with strpos().

If $needle is the last character in $haystack, and testing $needle as a boolean by itself would evaluate to false, then testing strstr() as a boolean will evaluate to false (because, if successful, strstr() returns the first occurrence of $needle along with the rest of $haystack).

<?php
findZero('01234');  // found a zero
findZero('43210');  // did not find a zero
findZero('0');      // did not find a zero
findZero('00');     // found a zero
findZero('000');    // found a zero
findZero('10');     // did not find a zero
findZero('100');    // found a zero

function findZero($numberString) {
    if (strstr($numberString, '0')) {
        echo 'found a zero';
    } else {
        echo 'did not find a zero';
    }
}
?>

Also, strstr() is far more memory-intensive than strpos(), especially with longer strings as your $haystack, so if you are not interested in the substring that strstr() returns, you shouldn't be using it anyway.

There is no PHP function just to check only _if_ $needle occurs in $haystack; strpos() tells you if it _doesn't_ by returning false, but, if it does occur, it tells you _where_ it occurs as an integer, which is 0 (zero) if $needle is the first part of $haystack, which is why testing if (strpos($needle, $haystack)===false) is the only way to know for sure if $needle is not part of $haystack.

My advice is to start loving type checking immediately, and to familiarize yourself with the return value of the functions you are using.

Cheers.
xslidian at lidian dot info 21-Feb-2013 07:37
For those in need of the last occurrence of a string:

<?php
function strrstr($h, $n, $before = false) {
    $rpos = strrpos($h, $n);
    if($rpos === false) return false;
    if($before == false) return substr($h, $rpos);
    else return substr($h, 0, $rpos);
}
?>
gruessle at gmail dot com 20-Apr-2011 01:39
Been using this for years:

<?php
/**
*
* @author : Dennis T Kaplan
*
* @version : 1.0
* Date : June 17, 2007
* Function : reverse strstr()
* Purpose : Returns part of haystack string from start to the first occurrence of needle
* $haystack = 'this/that/whatever';
* $result = rstrstr($haystack, '/')
* $result == this
*
* @access public
* @param string $haystack, string $needle
* @return string
**/

function rstrstr($haystack,$needle)
    {
        return substr($haystack, 0,strpos($haystack, $needle));
    }
?>

You could change it to:
rstrstr ( string $haystack , mixed $needle [, int $start] )
<?php

function rstrstr($haystack,$needle, $start=0)
    {
        return substr($haystack, $start,strpos($haystack, $needle));
    }

?>
w3b_monk3y at yahoo dot com 20-Jan-2009 12:28
If you want to emulate strstr's new before_needle parameter pre 5.3 strtok is faster than using strpos to find the needle and cutting with substr. The amount of difference varies with string size but strtok is always faster.
brett dot jr dot alton at gmail dot com 25-Nov-2007 08:02
For the needle_before (first occurance) parameter when using PHP 5.x or less, try:

<?php
$haystack = 'php-homepage-20071125.png';
$needle = '-';
$result = substr($haystack, 0, strpos($haystack, $needle)); // $result = php
?>
root at mantoru dot de 10-Nov-2007 03:22
Please note that $needle is included in the return string, as shown in the example above. This ist not always desired behavior, _especially_ in the mentioned example. Use this if you want everything AFTER $needle.

<?php
function strstr_after($haystack, $needle, $case_insensitive = false) {
    $strpos = ($case_insensitive) ? 'stripos' : 'strpos';
    $pos = $strpos($haystack, $needle);
    if (is_int($pos)) {
        return substr($haystack, $pos + strlen($needle));
    }
    // Most likely false or null
    return $pos;
}

// Example
$email = 'name@example.com';
$domain = strstr_after($email, '@');
echo $domain; // prints example.com
?>
leo dot nard at free dot fr 24-May-2005 02:12
When encoding ASCII strings to HTML size-limited strings, sometimes some HTML special chars were cut.

For example, when encoding "??" to a string of size 10, you would get: "à&a" => the second character is cut.

This function will remove any unterminated HTML special characters from the string...

<?php
function cut_html($string)
{
    $a=$string;

    while ($a = strstr($a, '&'))
    {
        echo "'".$a."'\n";
        $b=strstr($a, ';');
        if (!$b)
        {
            echo "couper...\n";
            $nb=strlen($a);
            return substr($string, 0, strlen($string)-$nb);
        }
        $a=substr($a,1,strlen($a)-1);
    }
    return $string;
}
?>


Coupe une chaîne en segments

  • « strstr
  • strtolower »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Coupe une chaîne en segments

strtok

(PHP 4, PHP 5, PHP 7, PHP 8)

strtok — Coupe une chaîne en segments

Description

strtok ( string $string , string $token ) : string|false

Signature alternative (non supporté avec les arguments nommés) :

strtok ( string $token ) : string|false

strtok() coupe la chaîne string en segments, chaque segment étant délimité par token. Par exemple, si vous avez une chaîne telle que "Voici un bon exemple", vous pouvez en extraire les différents mots en utilisant l'espace comme token.

Notez que seul le premier appel à strtok() utilise l'argument string. Tous les appels ultérieurs à strtok() nécessitent uniquement le token à utiliser, car elle sait où elle se situe dans la chaîne courante. Pour recommencer ou découper une nouvelle chaîne vous pouvez simplement appeler strtok() avec le paramètre string de nouveau pour l'initialiser. Il est à noter qu'il est possible de mettre plusieurs tokens dans le paramètre token. La chaîne string sera découpée dès que l'un des caractères de l'argument token est trouvé.

Liste de paramètres

string

La chaîne à découper en plusieurs chaînes de tailles plus petites (tokens).

token

Le délimiteur utilisé pour découper string.

Valeurs de retour

Une string coupée, ou false si plus aucun token n'est disponible.

Exemples

Exemple #1 Exemple avec strtok()

<?php
$string = "This is\tan example\nstring";
// Utilisez aussi les nouvelles lignes et les tabulations
// comme séparateur de mots
$tok = strtok($string, " \n\t");

while ($tok !== false) {
    echo "Word=$tok<br />";
    $tok = strtok(" \n\t");
}
?>

Exemple #2 Comportement de strtok() sur une partie vide trouvée

<?php
$first_token  = strtok('/something', '/');
$second_token = strtok('/');
var_dump($first_token, $second_token);
?>

L'exemple ci-dessus va afficher :

    string(9) "something"
    bool(false)

Notes

Avertissement

Cette fonction peut retourner false, mais elle peut aussi retourner une valeur équivalent à false. Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour exacte de cette fonction.

Voir aussi

  • split() - Scinde une chaîne en un tableau, grâce à une expression rationnelle
  • explode() - Scinde une chaîne de caractères en segments

User Contributed Notes

David Spector 07-Feb-2021 02:58
After obtaining zero or more tokens with calls to strtok, you can obtain the remainder of the input string by calling strtok with an empty string as the delimiter.
heiangus at hotmail dot com 24-Jul-2019 06:04
I found this useful for parsing user entered links in text fields.

e.g. This is a link <http://example.com>

    function parselink($link) {
        $bit1 = trim(strtok($link, '<'));
        $bit2 = trim(strtok('>'));
        $html = '<a href="'.$bit2.'">'.$bit1.'</a>';
        return $html; // <a href="http://example.com">This is a link</a>
    }
charlie dot ded at orange dot fr 15-Nov-2016 01:41
@maisuma you invert paramaters of explode() and strtok() functions, your code does not do what you expect.
You expect to read the input string token after token so equivalent code for strtok() is  arra_filter(explode()) because explode() return lines of empty string when several delimiters are contiguous in the read string, for example  2 whitespaces between.

In fact strtok() is much faster (x2 at least) than arra_filter(explode()) if the read string contains several contiguous delimiters ,
 it is slower if the read string contains one and only one delimiter between tokens.

<?php

$repeat = 10;
$delimiter = ':';
$str=str_repeat('foo:',$repeat);

$timeStrtok=microtime(TRUE);
$token = strtok($str, $delimiter);
while($token!==FALSE){
    //echo $token . ',';
    $token=strtok($delimiter);
}
$timeStrtok -=microtime(TRUE);

$timeExplo=microtime(TRUE);
$arr = explode($delimiter, $str);
//$arr = array_filter($arr);
$timeExplo -=microtime(TRUE);

//print_r($arr);

$X = 1000000; $unit = 'microsec';

echo PHP_EOL . ' explode() : ' . -$timeExplo . ' ' .$unit .PHP_EOL . ' strtok() :   ' . -$timeStrtok . ' ' . $unit .PHP_EOL;

$timeExplo=round(-$timeExplo*$X);
$timeStrtok=round(-$timeStrtok*$X);

echo PHP_EOL . ' explode() : ' . $timeExplo . ' ' .$unit .PHP_EOL . ' strtok() :   ' . $timeStrtok . ' ' . $unit .PHP_EOL;
echo ' ratio explode / strtok : ' . round($timeExplo / $timeStrtok,1) . PHP_EOL;

?>
eep2004 at ukr dot net 06-Jan-2015 08:40
Remove GET variables from the URL
<?php
echo strtok('http://example.com/index.php?foo=1&bar=2', '?');
?>
Result:
http://example.com/index.php
eep2004 at ukr dot net 07-Oct-2014 10:01
Remove GET variables from the URL
<?php
$url = strtok('http://php.net/manual/en/ref.strings.php?foo=1&bar=2', '?');
// $url = 'http://php.net/manual/en/ref.strings.php'
info at maisuma dot jp 30-May-2014 08:15
If you want to tokenize by only one letter, explode() is much faster compared to strtok().

<?php
$str=str_repeat('foo ',10000);

//explode()
$time=microtime(TRUE);
$arr=explode($str,' ');
$time=microtime(TRUE)-$time;
echo "explode():$time sec.".PHP_EOL;

//strtok()
$time=microtime(TRUE);
$ret=strtok(' ',$str);
while($ret!==FALSE){
    $ret=strtok(' ');
}
$time=microtime(TRUE)-$time;
echo "strtok():$time sec.".PHP_EOL;

?>

The result is : (PHP 5.3.3 on CentOS)

explode():0.001317024230957 sec.
strtok():0.0058917999267578 sec.

explode() is about five times fast in short strings, too.
Axeia 11-Feb-2014 05:12
Might be pointing out the obvious but if you'd rather use a for loop rather than a while (to keep the token strings on the same line for readability for example), it can be done. Added bonus, it doesn't put a $tok variable outside the loop itself either.
Downside however is that you're not able to manually free up the memory used using the technique mentioned by elarlang.

<?php
for($tok = strtok($str, ' _-.'); $tok!==false; $tok = strtok(' _-.'))
{
  echo "$tok </br>";
}
?>
eep2004 at ukr dot net 18-Sep-2013 04:11
<?php
// strtok example
$str = 'Hello to all of Ukraine';
echo strtok($str, ' ').' '.strtok(' ').' '.strtok(' ');
?>
Result:
Hello to all
gilthans at NOSPAM dot gmail dot com 15-Jul-2012 06:47
Note that strtok may receive different tokens each time. Therefore, if, for example, you wish to extract several words and then the rest of the sentence:

<?php
$text = "13 202 5 This is a long message explaining the error codes.";
$error1 = strtok($text, " "); //13
$error2 = strtok(" "); //202
$error3 = strtok(" "); //5
$error_message = strtok(""); //Notice the different token parameter
echo $error_message; //This is a long message explaining the error codes.
?>
pradador at me dot com 13-May-2011 12:10
Here's a simple class that allows you to iterate through string tokens using a foreach loop.

<?php
/**
 * The TokenIterator class allows you to iterate through string tokens using
 * the familiar foreach control structure.
 *
 * Example:
 * <code>
 * <?php
 * $string = 'This is a test.';
 * $delimiters = ' ';
 * $ti = new TokenIterator($string, $delimiters);
 *
 * foreach ($ti as $count => $token) {
 *     echo sprintf("%d, %s\n", $count, $token);
 * }
 *
 * // Prints the following output:
 * // 0. This
 * // 1. is
 * // 2. a
 * // 3. test.
 * </code>
 */
class TokenIterator implements Iterator
{
    /**
     * The string to tokenize.
     * @var string
     */
    protected $_string;

    /**
     * The token delimiters.
     * @var string
     */
    protected $_delims;

    /**
     * Stores the current token.
     * @var mixed
     */
    protected $_token;

    /**
     * Internal token counter.
     * @var int
     */
    protected $_counter = 0;

    /**
     * Constructor.
     *
     * @param string $string The string to tokenize.
     * @param string $delims The token delimiters.
     */
    public function __construct($string, $delims)
    {
        $this->_string = $string;
        $this->_delims = $delims;
        $this->_token = strtok($string, $delims);
    }

    /**
     * @see Iterator::current()
     */
    public function current()
    {
        return $this->_token;
    }

    /**
     * @see Iterator::key()
     */
    public function key()
    {
        return $this->_counter;
    }

    /**
     * @see Iterator::next()
     */
    public function next()
    {
        $this->_token = strtok($this->_delims);

        if ($this->valid()) {
            ++$this->_counter;
        }
    }

    /**
     * @see Iterator::rewind()
     */
    public function rewind()
    {
        $this->_counter = 0;
        $this->_token   = strtok($this->_string, $this->_delims);
    }

    /**
     * @see Iterator::valid()
     */
    public function valid()
    {
        return $this->_token !== FALSE;
    }
}
?>
elarlang at gmail dot com 22-Mar-2011 10:45
If you have memory-usage critical solution, you should keep in mind, that strtok function holds input string parameter (or reference to it?) in memory after usage.

<?php
function tokenize($str, $token_symbols) {
    $word = strtok($str, $token_symbols);
    while (false !== $word) {
        // do something here...
        $word = strtok($token_symbols);
    }
}
?>
Test-cases with handling ~10MB plain-text file:
Case #1 - unset $str variable
<?php
$token_symbols = " \t\n";
$str = file_get_contents('10MB.txt'); // mem usage 9.75383758545 MB (memory_get_usage() / 1024 / 1024));
tokenize($str, $token_symbols); // mem usage 9.75400161743 MB
unset($str); // 9.75395584106 MB
?>
Case #1 result: memory is still used

Case #2 - call strtok again
<?php
$token_symbols = " \t\n";
$str = file_get_contents('10MB.txt'); // 9.75401306152 MB
tokenize($str, $token_symbols); // 9.75417709351
strtok('', ''); // 9.75421524048
?>
Case #2 result: memory is still used

Case #3 - call strtok again AND unset $str variable
<?php
$token_symbols = " \t\n";
$str = file_get_contents('10MB.txt'); // 9.75410079956 MB
tokenize($str, $token_symbols); // 9.75426483154 MB
unset($str);
strtok('', ''); // 0.0543975830078 MB
?>
Case #3 result: memory is free

So, better solution for tokenize function:
<?php
function tokenize($str, $token_symbols, $token_reset = true) {
    $word = strtok($str, $token_symbols);
    while (false !== $word) {
        // do something here...
        $word = strtok($token_symbols);
    }

    if($token_reset)
        strtok('', '');
}
?>
fabiolimasouto at gmail dot com 20-Nov-2010 05:54
this example will hopefully help you understand how this function works:

<?php
$selector = 'div.class#id';
$tagname = strtok($selector,'.#');
echo $tagname.'<br/>';

while($tok = strtok('.#'))
{
 echo $tok.'<br/>';
}

?>

Outputs:
div
class
id
benighted at gmail dot com 06-Nov-2009 06:47
Simple way to tokenize search parameters, including double or single quoted keys.  If only one quote is found, the rest of the string is assumed to be part of that token.

<?php
            $token = strtok($keywords,' ');
            while ($token) {
                // find double quoted tokens
                if ($token{0}=='"') { $token .= ' '.strtok('"').'"'; }
                // find single quoted tokens
                if ($token{0}=="'") { $token .= ' '.strtok("'")."'"; }

                $tokens[] = $token;
                $token = strtok(' ');
            }
?>

Use substr(1,strlen($token)) and remove the part that adds the trailing quotes if you want your output without quotes.
azeem 02-Sep-2009 12:14
Here is a java like StringTokenizer class using strtok function:

<?php

/**
 * The string tokenizer class allows an application to break a string into tokens.
 *
 * @example The following is one example of the use of the tokenizer. The code:
 * <code>
 * <?php
 *    $str = 'this is:@\t\n a test!';
 *    $delim = ' !@:'\t\n; // remove these chars
 *    $st = new StringTokenizer($str, $delim);
 *    while ($st->hasMoreTokens()) {
 *        echo $st->nextToken() . "\n";
 *    }
 *    prints the following output:
 *      this
 *      is
 *      a
 *      test
 * ?>
 * </code>
 */
class StringTokenizer {

    /**
     * @var string
     */
    private $token;

    /**
     * @var string
     */
    private $delim;
    /**
     * Constructs a string tokenizer for the specified string
     * @param string $str String to tokenize
     * @param string $delim The set of delimiters (the characters that separate tokens)
     * specified at creation time, default to ' '
     */
    public function __construct(/*string*/ $str, /*string*/ $delim = ' ') {
        $this->token = strtok($str, $delim);
        $this->delim = $delim;
    }

    public function __destruct() {
        unset($this);
    }

    /**
     * Tests if there are more tokens available from this tokenizer's string. It
     * does not move the internal pointer in any way. To move the internal pointer
     * to the next element call nextToken()
     * @return boolean - true if has more tokens, false otherwise
     */
    public function hasMoreTokens() {
        return ($this->token !== false);
    }

    /**
     * Returns the next token from this string tokenizer and advances the internal
     * pointer by one.
     * @return string - next element in the tokenized string
     */
    public function nextToken() {
        $current = $this->token;
        $this->token = strtok($this->delim);
        return $current;
    }
}
?>
yanick dot rochon at gmail dot com 15-Jun-2009 09:37
Here is a small function I wrote as I needed to extract some named tokens from a string (a la Google). For example, I needed to format a string like "extension:gif size:64M animated:true author:'John Bash'" into

array(
  'extension' => 'gif',
  'size' => '64M',
  'animated' => true,
  'author' => 'John Bash'
)

So, here's the code:

<?php

header('Content-type: text/plain; CHARSET=Windows-1252');

/**
 * NOTE : use mbstring.func_overload for multi-byte support with this function
 *
 * @param string $string             the string to tokenize
 * @param int $offset                the starting offset
 * @param string $defaultTokenName   the default token name if none specified
 * @param string $groupDelimiters    the characters to delimit token groups
 * @param string $groupNameDelimiter the character(s) to delimit token group names
 * @return array
 */
function getTokens(
        $string,
        $offset = 0,
        $defaultTokenName = null,
        $groupDelimiters = '\'"',
        $groupNameDelimiter = ':')
{

    if ($offset >= strlen($string)) {
        //echo "offset out of range";
        return false;
    }

    $spaces = " \t\n\r";   // space characters

    // add group delimiters to spaces...
    $groupSpaces = $spaces . $groupNameDelimiter;
    $delimiters = $groupSpaces . $groupDelimiters;

    //var_dump($groupSpaces);

    $string = ltrim(substr($string, $offset), $groupSpaces);
    $token_strings = array();

    //echo "String is : " . $string . "\n";

    // 1. split all tokens...
    while ($offset < strlen($string)) {
        $lastOffset = $offset;
        $escaped = false;

        if (false !== strpos($groupDelimiters, $char = $string[$offset])) {
            $groupChar = $char;
        } else {
            $groupChar = null;
        }

        if (null !== $groupChar) {
            while (($offset < strlen($string)) && (($groupChar !== ($char = $string[++$offset])) || $escaped)) {
                //$offset++;
                $escaped = ('\\' === $char);
            }
            $offset++;
            //echo "*** Grouped : " . substr($string, $lastOffset, $offset - $lastOffset) . "\n";
        } else {
            while (($offset < strlen($string)) && ((false === strpos($delimiters, $char = $string[$offset])) || $escaped)) {
                $offset++;
                $escaped = ('\\' === $char);
            }
            //echo "*** Non-group : " . substr($string, $lastOffset, $offset - $lastOffset) . "\n";
        }
        //skip spaces...
        while (($offset < strlen($string)) && ((false !== strpos($groupSpaces, $char = $string[$offset])) || $escaped)) {
            $offset++;
            $escaped = ('\\' === $char);
        }

        $token_strings[] = substr($string, $lastOffset, $offset - $lastOffset);
        //echo "Next token = '" . end($token_strings) . "'\n";
    }

    $tokens = array();
    $tokenName = null;
    foreach ($token_strings as $token_str) {
        // clean $token_str
        $token_str = trim(stripslashes($token_str), $spaces);
        $str_value = trim($token_str, $delimiters);
        switch (strtolower($str_value)) {
            case 'true': $str_value = true; break;
            case 'false': $str_value = false; break;
            default: break;
        }

        // is it a token name?
        if (':' === substr($token_str, -1, 1)) {
            if (!empty($tokenName)) {
                $tokens[$tokenName] = '';
            }
            $tokenName = trim($token_str, $delimiters);
        } else {
            if (!empty($tokenName)) {
                if (isset($tokens[$tokenName])) {
                    $tokens[$tokenName] = array(
                        $tokens[$tokenName],
                        $str_value
                    );
                } else {
                    $tokens[$tokenName] = $str_value;
                }
                $tokenName = null;
            } elseif (empty($defaultTokenName)) {
                $tokens[] = trim($token_str, $delimiters);;
            } else {
                if (isset($tokens[$defaultTokenName])) {
                    $tokens[$defaultTokenName] = array(
                        $tokens[$defaultTokenName],
                        $str_value
                    );
                } else {
                    $tokens[$defaultTokenName] = $str_value;
                }
            }
        }
    }
    if (!empty($tokenName)) {
        $tokens[$tokenName] = '';
    }

    return $tokens;
}

$str = "check1: test "
     . "check2:'hello world' "
     . 'check3: "foo" '
     . "check4: \\\"try this\\\""
     . '"buz" '
     . 'check1:true';

?>
KrazyBox 06-Mar-2009 06:11
As of the change in strtok()'s handling of empty strings, it is now useless for scripts that rely on empty data to function.

Take for instance, a standard header. (with UNIX newlines)

http/1.0 200 OK\n
Content-Type: text/html\n
\n
--HTML BODY HERE---

When parsing this with strtok, one would wait until it found an empty string to signal the end of the header. However, because strtok now skips empty segments, it is impossible to know when the header has ended.
This should not be called `correct' behavior, it certainly is not. It has rendered strtok incapable of (properly) processing a very simple standard.

This new functionality, however, does not affect Windows style headers. You would search for a line that only contains "\r"
This, however, is not a justification for the change.
Logikos 03-Jan-2009 10:12
This looks very simple, but it took me a long time to figure out so I thought I'd share it incase someone else was wanting the same thing:

this should work similar to substr() but with tokens instead!

<?php
/* subtok(string,chr,pos,len)
 *
 * chr = chr used to seperate tokens
 * pos = starting postion
 * len = length, if negative count back from right
 *
 *  subtok('a.b.c.d.e','.',0)     = 'a.b.c.d.e'
 *  subtok('a.b.c.d.e','.',0,2)   = 'a.b'
 *  subtok('a.b.c.d.e','.',2,1)   = 'c'
 *  subtok('a.b.c.d.e','.',2,-1)  = 'c.d'
 *  subtok('a.b.c.d.e','.',-4)    = 'b.c.d.e'
 *  subtok('a.b.c.d.e','.',-4,2)  = 'b.c'
 *  subtok('a.b.c.d.e','.',-4,-1) = 'b.c.d'
 */
function subtok($string,$chr,$pos,$len = NULL) {
  return implode($chr,array_slice(explode($chr,$string),$pos,$len));
}
?>

explode breaks the tokens up into an array, array slice alows you to pick then tokens you want, and then implode converts it back to a string

although its far from a clone, this was inspired by mIRC's gettok() function
mac.com@nemo 18-Feb-2006 01:49
This function takes a string and returns an array with words (delimited by spaces), also taking into account quotes, doublequotes, backticks and backslashes (for escaping stuff).
So

$string = "cp   'my file' to `Judy's file`";
var_dump(parse_cli($string));

would yield:

array(4) {
  [0]=>
  string(2) "cp"
  [1]=>
  string(7) "my file"
  [2]=>
  string(5) "to"
  [3]=>
  string(11) "Judy's file"
}

Way it works, runs through the string character by character, for each character looking up the action to take, based on that character and its current $state.
Actions can be (one or more of) adding the character/string to the current word, adding the word to the output array, and changing or (re)storing the state.
For example a space will become part of the current 'word' (or 'token') if $state is 'doublequoted', but it will start a new token if $state was 'unquoted'.
I was later told it's a "tokeniser using a finite state automaton". Who knew :-)

<?php

#_____________________
# parse_cli($string) /
function parse_cli($string) {
    $state = 'space';
    $previous = '';     // stores current state when encountering a backslash (which changes $state to 'escaped', but has to fall back into the previous $state afterwards)
    $out = array();     // the return value
    $word = '';
    $type = '';         // type of character
    // array[states][chartypes] => actions
    $chart = array(
        'space'        => array('space'=>'',   'quote'=>'q',  'doublequote'=>'d',  'backtick'=>'b',  'backslash'=>'ue', 'other'=>'ua'),
        'unquoted'     => array('space'=>'w ', 'quote'=>'a',  'doublequote'=>'a',  'backtick'=>'a',  'backslash'=>'e',  'other'=>'a'),
        'quoted'       => array('space'=>'a',  'quote'=>'w ', 'doublequote'=>'a',  'backtick'=>'a',  'backslash'=>'e',  'other'=>'a'),
        'doublequoted' => array('space'=>'a',  'quote'=>'a',  'doublequote'=>'w ', 'backtick'=>'a',  'backslash'=>'e',  'other'=>'a'),
        'backticked'   => array('space'=>'a',  'quote'=>'a',  'doublequote'=>'a',  'backtick'=>'w ', 'backslash'=>'e',  'other'=>'a'),
        'escaped'      => array('space'=>'ap', 'quote'=>'ap', 'doublequote'=>'ap', 'backtick'=>'ap', 'backslash'=>'ap', 'other'=>'ap'));
    for ($i=0; $i<=strlen($string); $i++) {
        $char = substr($string, $i, 1);
        $type = array_search($char, array('space'=>' ', 'quote'=>'\'', 'doublequote'=>'"', 'backtick'=>'`', 'backslash'=>'\\'));
        if (! $type) $type = 'other';
        if ($type == 'other') {
            // grabs all characters that are also 'other' following the current one in one go
            preg_match("/[ \'\"\`\\\]/", $string, $matches, PREG_OFFSET_CAPTURE, $i);
            if ($matches) {
                $matches = $matches[0];
                $char = substr($string, $i, $matches[1]-$i); // yep, $char length can be > 1
                $i = $matches[1] - 1;
            }else{
                // no more match on special characters, that must mean this is the last word!
                // the .= hereunder is because we *might* be in the middle of a word that just contained special chars
                $word .= substr($string, $i);
                break; // jumps out of the for() loop
            }
        }
        $actions = $chart[$state][$type];
        for($j=0; $j<strlen($actions); $j++) {
            $act = substr($actions, $j, 1);
            if ($act == ' ') $state = 'space';
            if ($act == 'u') $state = 'unquoted';
            if ($act == 'q') $state = 'quoted';
            if ($act == 'd') $state = 'doublequoted';
            if ($act == 'b') $state = 'backticked';
            if ($act == 'e') { $previous = $state; $state = 'escaped'; }
            if ($act == 'a') $word .= $char;
            if ($act == 'w') { $out[] = $word; $word = ''; }
            if ($act == 'p') $state = $previous;
        }
    }
    if (strlen($word)) $out[] = $word;
    return $out;
}

?>
manicdepressive at mindless dot com 19-Jun-2004 06:01
<pre><?php
/** get leading, trailing, and embedded separator tokens that were 'skipped'
if for some ungodly reason you are using php to implement a simple parser that
needs to detect nested clauses as it builds a parse tree */

$str = "(((alpha(beta))(gamma))";

$seps = '()';
$tok = strtok( $str,$seps ); // return false on empty string or null
$cur = 0;
$dumbDone = FALSE;
$done = (FALSE===$tok);
while (!$done) {
   // process skipped tokens (if any at first iteration) (special for last)
   $posTok = $dumbDone ? strlen($str) : strpos($str, $tok, $cur );
   $skippedMany = substr( $str, $cur, $posTok-$cur ); // false when 0 width
   $lenSkipped = strlen($skippedMany); // 0 when false
   if (0!==$lenSkipped) {
      $last = strlen($skippedMany) -1;
      for($i=0; $i<=$last; $i++){
         $skipped = $skippedMany[$i];
         $cur += strlen($skipped);
         echo "skipped: $skipped\n";
      }
   }
   if ($dumbDone) break; // this is the only place the loop is terminated

   // process current tok
   echo "curr tok: ".$tok."\n";

   // update cursor
   $cur += strlen($tok);

   // get any next tok
   if (!$dumbDone){
      $tok = strtok($seps);
      $dumbDone = (FALSE===$tok);
      // you're not really done till you check for trailing skipped
   }
};
?></pre>


Renvoie une chaîne en minuscules

  • « strtok
  • strtoupper »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Renvoie une chaîne en minuscules

strtolower

(PHP 4, PHP 5, PHP 7, PHP 8)

strtolower — Renvoie une chaîne en minuscules

Description

strtolower ( string $string ) : string

Retourne string, après avoir converti tous les caractères alphabétiques en minuscules.

Notez que la notion d'"alphabétique" est déterminée par la configuration de localisation. Cela signifie que pour la configuration par défaut "C", les caractères tels que les voyelles accentuées (comme é, è ou à) ne seront pas convertis.

Liste de paramètres

string

La chaîne d'entrée.

Valeurs de retour

Retourne la chaîne en minuscule.

Exemples

Exemple #1 Exemple avec strtolower()

<?php
$str = "Marie A un Petit Agneau, et l'aime TRès fORt.";
$str = strtolower($str);
echo $str; // marie a un petit agneau, et l'aime très fort.
?>

Notes

Note: Cette fonction gère les chaînes binaires.

Voir aussi

  • strtoupper() - Renvoie une chaîne en majuscules
  • ucfirst() - Met le premier caractère en majuscule
  • ucwords() - Met en majuscule la première lettre de tous les mots
  • mb_strtolower() - Met tous les caractères en minuscules

User Contributed Notes

Daniel Klein 07-May-2016 10:33
When the locale is set to "utf8" or "C" I can't get strtolower() to convert accented characters encoded as UTF-8, so here is my workaround.

<?php
function tolower($string) {
  if ($old_locale = setlocale(LC_CTYPE, 0)) {
    // 'fr_FR.ISO-8859-1' for *nix, 'French_France.1252' fallback for Windows
    if ($newlocale = setlocale(LC_CTYPE, 'fr_FR.ISO-8859-1', 'French_France.1252')) {
      preg_match('/\.(?<encoding>.+)$/', $newlocale, $match);
      $string = utf8_encode(strtolower(utf8_decode($string)));
    }
    setlocale(LC_CTYPE, $old_locale);
  }
  return $string;
}

print(tolower('DÉJÀ-VU'));  // prints déjà-vu
?>

Change the language-country codes if you want some language other than French.
helvete at bahno dot net 26-Nov-2014 01:05
It is worth noting that
<?php
var_dump(strtolower(null))
?>
returns:
string(0) ""
RCube 31-Mar-2011 04:57
To convert an entire array to lower, I prefer this method;

<?php
function arraytolower(array $array, $round = 0){
  return unserialize(strtolower(serialize($array)));
}
?>

3 lines of code seem a lot less overhead than 10-40.
If there's any intrinsic problem with this method, please post it.
marcin at maydesign dot pl 22-Jun-2010 03:16
strtolower(); doesn't work for polish chars

<?php strtolower("mAkA"); ?>
will return: mAka;

the best solution - use mb_strtolower()

<?php mb_strtolower("mAkA",'UTF-8'); ?>
will return: maka
leha_grobov 25-Jun-2009 08:03
the strtolower version to support most amount of languages including russian, french and so on:

<?php
function strtolower_utf8($string){
  $convert_to = array(
    "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u",
    "v", "w", "x", "y", "z", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï",
    "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "ø", "ù", "ú", "û", "ü", "ý", "?", "?", "?", "?", "?", "?", "?", "?",
    "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
    "?", "?", "?", "?"
  );
  $convert_from = array(
    "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",
    "V", "W", "X", "Y", "Z", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï",
    "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "Ø", "Ù", "Ú", "Û", "Ü", "Ý", "?", "?", "?", "?", "?", "?", "?", "?",
    "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?",
    "?", "?", "?", "?"
  );

  return str_replace($convert_from, $convert_to, $string);
}
?>
coder at bulgaria dot bg 03-Apr-2009 04:08
for cyrillic and UTF 8 use  mb_convert_case

exampel

<?php
$string = "?????????";
$string = mb_convert_case($string, MB_CASE_LOWER, "UTF-8");
echo $string;

//output is: ?????????
?>
dbers26 at gmail dot com 07-Jan-2009 01:34
the function  arraytolower will create duplicate entries since keys are case sensitive.

<?php
$array = array('test1' => 'asgAFasDAAd', 'TEST2' => 'ASddhshsDGb', 'TeSt3 '=> 'asdasda@asdadadASDASDgh');

$array = arraytolower($array);
?>
/*
Array
(
    [test1] => asgafasdaad
    [TEST2] => ASddhshsDGb
    [TeSt3] => asdasda@asdadadASDASDgh
    [test2] => asddhshsdgb
    [test3] => asdasda@asdadadasdasdgh
)
*/

I prefer this method

<?php
  function arraytolower($array, $include_leys=false) {

    if($include_leys) {
      foreach($array as $key => $value) {
        if(is_array($value))
          $array2[strtolower($key)] = arraytolower($value, $include_leys);
        else
          $array2[strtolower($key)] = strtolower($value);
      }
      $array = $array2;
    }
    else {
      foreach($array as $key => $value) {
        if(is_array($value))
          $array[$key] = arraytolower($value, $include_leys);
        else
          $array[$key] = strtolower($value);
      }
    }

    return $array;
  }
?>

which when used like this

<?php
$array = $array = array('test1' => 'asgAFasDAAd', 'TEST2' => 'ASddhshsDGb', 'TeSt3 '=> 'asdasda@asdadadASDASDgh');

$array1 = arraytolower($array);
$array2 = arraytolower($array,true);

print_r($array1);
print_r($array2);
?>

will give output of

Array
(
    [test1] => asgafasdaad
    [TEST2] => asddhshsdgb
    [TeSt3] => asdasda@asdadadasdasdgh
)
Array
(
    [test1] => asgafasdaad
    [test2] => asddhshsdgb
    [test3] => asdasda@asdadadasdasdgh
)
rodrigoATsistemasparainternetDOTcomDOTbr 09-Sep-2008 06:25
<?php
function fullLower($str){
   // convert to entities
   $subject = htmlentities($str,ENT_QUOTES);
   $pattern = '/&([a-z])(uml|acute|circ';
   $pattern.= '|tilde|ring|elig|grave|slash|horn|cedil|th);/e';
   $replace = "'&'.strtolower('\\1').'\\2'.';'";
   $result = preg_replace($pattern, $replace, $subject);
   // convert from entities back to characters
   $htmltable = get_html_translation_table(HTML_ENTITIES);
   foreach($htmltable as $key => $value) {
      $result = ereg_replace(addslashes($value),$key,$result);
   }
   return(strtolower($result));
}

echo fullLower("Ã É Ò Õ ÚÙÛ");

//results ã é ò õ úùû
//adapted from fullUpper on strtoupper manual
?>
patricia at steuerungb dot de 17-Oct-2007 06:29
When you're not sure, how the current locale is set, you might find the following function useful. It's strtolower for utf8-formatted text:

<?php
function strtolower_utf8($inputString) {
    $outputString    = utf8_decode($inputString);
    $outputString    = strtolower($outputString);
    $outputString    = utf8_encode($outputString);
    return $outputString;
}
?>

It's not suitable for every occasion, but it surely gets in handy. I use it for lowering German 'Umlauts' like ä and ö.
rok dot kralj at gmail dot com 04-Jun-2007 11:49
Slovenian characters

<?php
    function strtolower_slovenian($string)
    {
        $low=array("C" => "c", "Ž" => "ž", "Š" => "š");
        return strtolower(strtr($string,$low));
    }

?>
marco at recchiuti dot it 22-May-2007 12:43
Maybe it is not so elegant, but it Works.
It's just a fast Idea and it is what I need.
Any hacks for other characters (link !, ? etc etc) should help.

function RemoveShouting($string)
{
     $frase = "";
     $astri = explode(".", $string);
     foreach ($astri as $elem)
    $frase .= " ".ucfirst(trim(strtolower($elem))).". ";

    return trim($frase);
}

Cheers!
M
spiceee ddotty spiceee com 06-Mar-2006 04:53
If you ever need to strtolower a string with href tags on it and doesn't want to mess with the characters inside a tag, this is for you.

<?php

function loweroutsidetags ($str) {
    $chars = preg_split ("//", $str);
    $tolower = true;
    $str = '';

    foreach ($chars as $k) {
        if ($k == '<') { $tolower = false; }
        if ($tolower) { $k = strtolower ($k); }
        $str .= $k;
        if ($k == '>') { $tolower = true; }
    }
    return $str;
}

?>

this:
echo loweroutsidetags('aALalala <a href="?q=CASEsENSITIVINESSinURLSareSTUPID">')

will give:
aalalala <a href="?q=CASEsENSITIVINESSinURLSareSTUPID">
Patrick 19-Jan-2006 10:57
If you're considering using the below unhtmlentities function from phpContrib, I would suggest this one as an alternative:

<?php
function unhtmlentities($string)
{
   // replace numeric entities
   $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
   $string = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $string);
   // replace literal entities
   $trans_tbl = get_html_translation_table(HTML_ENTITIES);
   $trans_tbl = array_flip($trans_tbl);
   return strtr($string, $trans_tbl);
}
?>

That was copied exactly from the html_entity_decode manual page.  It'll handle numeric entities correctly, the below function won't.
mhuggins57 at yahoo dot com 19-Jul-2005 04:04
There's a ucfirst "function" to make the first character uppercase, but there's no "lcfirst" function to make the first character lowercase.  Here's my own code to accomplish this.

<?
function lcfirst($str) {
    return strtolower(substr($str, 0, 1)) . substr($str, 1);
}
?>

I found this particularly useful for generating XML nodes with the Reflection class.
kmcdermott at perimeterinstitute dot ca 08-Dec-2004 01:04
To do case insensitive comparisons in a database, strtolower() can be a quick and dirty solution:

$Sql = "SELECT * FROM tablename WHERE LOWER(column_name) = '".strtolower($my_var)."'";
bkimble at ebaseweb dot com 19-Jan-2003 10:39
Heres a small function I wrote to stop people from submitting data that is ALL IN CAPS SO THEY CAN GET MORE ATTENTION THAT THE REST OF THE USER SUBMITTED DATA on my website :) If you can make it better, by all means do so. This function splits up words delimited by a space, and makes only the first letter of each word capitalized. You can easily modify it so it's only the very first word of the string. I've also added some exceptions so you don't make things like roman numerals look like "Iii" or "Xcmii" or something.

function RemoveShouting($string)
{
 $lower_exceptions = array(
        "to" => "1", "a" => "1", "the" => "1", "of" => "1"
 );

 $higher_exceptions = array(
        "I" => "1", "II" => "1", "III" => "1", "IV" => "1",
        "V" => "1", "VI" => "1", "VII" => "1", "VIII" => "1",
        "XI" => "1", "X" => "1"
 );

 $words = split(" ", $string);
 $newwords = array();
 foreach ($words as $word)
 {
  if (!$higher_exceptions[$word]) $word = strtolower($word);
  if (!$lower_exceptions[$word]) $word[0] = strtoupper($word[0]);
  array_push($newwords, $word);
 }
 return join(" ", $newwords);
}

BK


Renvoie une chaîne en majuscules

  • « strtolower
  • strtr »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Renvoie une chaîne en majuscules

strtoupper

(PHP 4, PHP 5, PHP 7, PHP 8)

strtoupper — Renvoie une chaîne en majuscules

Description

strtoupper ( string $string ) : string

strtoupper() retourne string, après avoir converti tous les caractères alphabétiques en majuscules.

Notez que la notion d'"alphabétique" est déterminée par la configuration de localisation. Cela signifie que pour la configuration par défaut "C", les caractères tels que les voyelles accentuées (comme é, è ou à) ne seront pas converties.

Liste de paramètres

string

La chaîne d'entrée.

Valeurs de retour

Retourne la chaîne en majuscule.

Exemples

Exemple #1 Exemple avec strtoupper()

<?php
$str = "Marie A un Petit Agneau, et l'aime fORt.";
$str = strtoupper($str);
echo $str; // MARIE A UN PETIT AGNEAU, ET L'AIME FORT.

// Note : Très aurait été converti en TRèS
?>

Notes

Note: Cette fonction gère les chaînes binaires.

Voir aussi

  • strtolower() - Renvoie une chaîne en minuscules
  • ucfirst() - Met le premier caractère en majuscule
  • ucwords() - Met en majuscule la première lettre de tous les mots
  • mb_strtoupper() - Met tous les caractères en majuscules

User Contributed Notes

chris at ocproducts dot com 28-Jul-2019 01:08
This function has a real challenge when it comes to Turkish. In Turkish the ASCII letter 'i' uppercases to a non-ASCII character. This means that PHP cannot upper case it.

i.e. for the Turkish locale, strtoupper('i')=='i'

This can mess with basic program logic.

There's no simple solution. The core problem is discussed more here:
http://www.i18nguy.com/unicode/turkish-i18n.html
Dave 24-Jan-2018 07:55
Why this function isn't just named "uppercase" or has an alias named that, I don't know.
uilmind at favor.com.ua 09-Jul-2016 10:36
Here is how to make the character in upper case, except HTML-entities:

$s = substr(preg_replace('/(?<=^|;)(.+?)(?=&[0-9A-Za-z]+;|$)/e', "strtoupper('$1')", ' '.$s), 1);

There is small kludge, however. Unfortunately I tired to find out the way how to exclude HTML-entity at the start of the line, so I have added 1 dummy character at the start of the text and removing it after the conversion.
adriaanse06 at hotmail dot com 28-Jul-2015 11:51
$ther=''.THEREISALREADYA.' '.CONCEPT.' '.SAVED.' ';
or
$ther="There Is all ready A concept SAVED";

$fupper=substr("$ther",0,1);
pick the first char

$theru = strtoupper($fupper);
make it upper

$flower=substr("$ther",1,100);
pick the rest

$therl = strtolower($flower);
make them lower

Result:
There is all ready a concept saved
andre at koethur dot de 10-Jun-2013 08:28
One might think that setting the correct locale would do the trick with for example german umlauts, but this is not the case. You have to use mb_strtoupper() instead:

<?php

setlocale(LC_CTYPE, 'de_DE.UTF8');

echo strtoupper('Umlaute äöü in uppercase'); // outputs "UMLAUTE äöü IN UPPERCASE"
echo mb_strtoupper('Umlaute äöü in uppercase', 'UTF-8'); // outputs "UMLAUTE ÄÖÜ IN UPPERCASE"

?>
james at snasta dot ie 10-Nov-2011 06:44
In the Irish language certain initial mutations can never be capitalized — the following simple function can be used to capitalize text in Irish.

i.e. Muintir na hÉireann -> MUINTIR NA hÉIREANN

<?php
function strtoupper_ga($a) {
    return strtr(mb_strtoupper($a, "utf-8"), array(
      " MB" => " mB",
      " GC" => " gC",
      " ND" => " nD",
      " BHF" => " bhF",
      " NG" => " nG",
      " BP" => " bP",
      " DT" => " dT",
      " HA" => " hA",
      " HE" => " hE",
      " HI" => " hI",
      " HO" => " hO",
      " HU" => " hU",
      " HÁ" => " hÁ",
      " HÉ" => " hÉ",
      " HÍ" => " hÍ",
      " HÓ" => " hÓ",
      " HÚ" => " hÚ"
    ));
}
?>
smieat 01-May-2010 04:39
perfect solutions for turkish utf-8 (including i I conversations):

<?php
function strtolowertr($metin){
    return mb_convert_case(str_replace('I','i',$metin), MB_CASE_LOWER, "UTF-8");
}

function strtouppertr($metin){
    return mb_convert_case(str_replace('i','I',$metin), MB_CASE_UPPER, "UTF-8");
}

function ucwordstr($metin) {
    return ltrim(mb_convert_case(str_replace(array(' I',' i', ' I', ' i'),array(' I',' I',' I',' I'),' '.$metin), MB_CASE_TITLE, "UTF-8"));
}

function ucfirsttr($metin) {
    $metin = in_array(crc32($metin[0]),array(1309403428, -797999993, 957143474)) ? array(strtouppertr(substr($metin,0,2)),substr($metin,2)) : array(strtouppertr($metin[0]),substr($metin,1));
return $metin[0].$metin[1];
}
?>
chris at table4 dot com 19-Jan-2009 07:31
Simple function to change the case of your string and any accented html characters contained within it.

Inspired by fullUpper(), by silent at gmx dot li... just a little bit more atomic.

<?php

function convertCase($str, $case = 'upper')
{ //yours, courtesy of table4.com  :)
  switch($case)
  {
    case "upper" :
    default:
      $str = strtoupper($str);
      $pattern = '/&([A-Z])(UML|ACUTE|CIRC|TILDE|RING|';
      $pattern .= 'ELIG|GRAVE|SLASH|HORN|CEDIL|TH);/e';
      $replace = "'&'.'\\1'.strtolower('\\2').';'"; //convert the important bit back to lower
    break;

    case "lower" :
      $str = strtolower($str);
    break;
  }

  $str = preg_replace($pattern, $replace, $str);
  return $str;
}
?>

Depending on what you are trying to achieve you would call like this:

<?php

//with entities...
$str = convertCase(htmlentities($str, ENT_QUOTES, "ISO-8859-1"));

?>
spaceman at foo dot at 17-Apr-2008 09:59
It has been mentioned in a previous comment that all you need to do to let PHP's strtoupper() do the conversion - instead of writing more or less complicated functions yourself - is to specify the locale in which you're doing the case conversion:

<?php setlocale(LC_CTYPE, "de_AT") ?>

It is important to note that setlocale() will silently fail if it can't find the specified locale on your system, so *always* check its return value. Try different spellings: using "de_AT" as an example, there are various combinations that may or may not work for you: "de", "de_AT.utf8", "de_AT.iso-8859-1", "de_AT.latin1", "de_AT@euro", etc).

If you can't find an appropriate locale setting, check your system configuration (locales are a system-wide setting, PHP gets them from the OS). On Windows, locales can be set from the Control Panel; on Linux it depends on your distribution. You can try "sudo dpkg-reconfigure locales" on Debian-based distros, or configure them manually. On Ubuntu Dapper, I had to copy entries over from /usr/share/i18n/SUPPORTED to /var/lib/locales/supported.d/local, then do the dpkg-reconfigure.

After you're done, restart the web server.

That said, there are special cases where you want to do the conversion manually. In German, for example, the letter 'ß' (szlig) only exists as a lower-case character, and so doesn't get converted by strtoupper. The convential way to express a 'ß' in an uppercase string is "SS". This function will take care of this exception (for Latin1 and most of Latin9, at least):

<?php

define("LATIN1_UC_CHARS", "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝ");
define("LATIN1_LC_CHARS", "àáâãäåæçèéêëìíîïðñòóôõöøùúûüý");

function uc_latin1 ($str) {
    $str = strtoupper(strtr($str, LATIN1_LC_CHARS, LATIN1_UC_CHARS));
    return strtr($str, array("ß" => "SS"));
}

?>
Oliv. 11-Oct-2007 07:20
accents convertion trick :

<?php

    function ucfirstHTMLentity($matches){
        return "&".ucfirst(strtolower($matches[1])).";";
    }
    function fullUpper($str){
        $subject = strtoupper(htmlentities($str, null, 'UTF-8'));
        $pattern = '/&([A-Z]+);/';
        return preg_replace_callback($pattern, "ucfirstHTMLentity", $subject);
    }

        print fullUpper($_REQUEST["txt"]);

?>
RUNET 17-Apr-2007 05:33
Russian

function str_to_upper($str){
    return strtr($str,
    "abcdefghijklmnopqrstuvwxyz".
    "\xE0\xE1\xE2\xE3\xE4\xE5".
    "\xb8\xe6\xe7\xe8\xe9\xea".
    "\xeb\xeC\xeD\xeE\xeF\xf0".
    "\xf1\xf2\xf3\xf4\xf5\xf6".
    "\xf7\xf8\xf9\xfA\xfB\xfC".
    "\xfD\xfE\xfF",
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
    "\xC0\xC1\xC2\xC3\xC4\xC5".
    "\xA8\xC6\xC7\xC8\xC9\xCA".
    "\xCB\xCC\xCD\xCE\xCF\xD0".
    "\xD1\xD2\xD3\xD4\xD5\xD6".
    "\xD7\xD8\xD9\xDA\xDB\xDC".
    "\xDD\xDE\xDF");
}
bart at insane dot at 10-May-2006 04:31
When using UTF-8 and need to convert to uppercase with
special characters like the german ä,ö,ü (didn't test for french,polish,russian but think it should work, too) try this:

function strtoupper_utf8($string){
    $string=utf8_decode($string);
    $string=strtoupper($string);
    $string=utf8_encode($string);
    return $string;
}
30-May-2005 06:11
// 2005/5/30 Justin
    // Chinese_Traditional toupper
    function CT_to_upper($string)
    {
        $isChineseStart = false;

          $new_string = "";
         $i = 0;
          while($i < strlen($string))
          {
               if (ord(substr($string,$i,1)) <128)
               {
                   if( $isChineseStart == false )
                       $new_string .= strtoupper(mb_substr($string,$i,1));
                   else
                       $new_string .= substr($string,$i,1);
               }
               else
               {
                   if( $isChineseStart == false )
                       $isChineseStart = true;
                   else
                       $isChineseStart = false;

                     $new_string .= substr($string,$i,1);
               }
               $i++;
          }
          return $new_string;
    }
    //
willyann at gmail dot com 24-May-2005 09:31
chinese

function to_upper($string) {
  $new_string = "";
  $i = 0;
  while($i < strlen($string)) {
   if (ord(substr($string,$i,1)) <128)
   {
     $new_string .= strtoupper(substr($string,$i,1));
     $i++;
   } else {
     $new_string .= substr($string,$i,2);
     $i=$i+2;
   }
  }
  return $new_string;
}
30-Oct-2004 03:23
If you only need to extend the conversion by the characters of a certain language, it's possible to control this using an environment variable to change the locale:

setlocale(LC_CTYPE, "de_DE");
mec at stadeleck dot org 02-Dec-2002 06:54
something I myself first not thought about:
if there are any html entities (named entities) in your string, strtoupper will turn all letters within this entities to upper case, too. So if you want to manipulate a string with strtoupper it should contain only unicode entities (if ever).


Remplace des caractères dans une chaîne

  • « strtoupper
  • substr_compare »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Remplace des caractères dans une chaîne

strtr

(PHP 4, PHP 5, PHP 7, PHP 8)

strtr — Remplace des caractères dans une chaîne

Description

strtr ( string $string , string $from , string $to ) : string

Signature alternative (non supporté avec les arguments nommés) :

strtr ( string $string , array $replace_pairs ) : string

Si trois arguments sont utilisés, strtr() retourne la chaîne string après avoir remplacé chaque caractère (de un octet) du paramètre from par son équivalent dans le paramètre to, chaque occurence de $from[$n] est remplacée par $to[$n], où $n est une valeur valide pour chaque argument.

Si from et to sont de tailles différentes, les caractères en trop dans l'un ou l'autre seront ignorés. La taille de string sera la même que celle des valeurs retournées.

Si seuls deux arguments sont utilisés, le deuxième doit être un array de la forme array('from' => 'to', ...). La donnée retournée est une string dans laquelle toutes les occurrences des clés du tableau ont été remplacées par les valeurs correspondantes. Les clés les plus longues seront d'abord utilisées. Une fois une sous-chaine remplacée, sa nouvelle valeur ne sera plus recherchée.

Dans ce cas, les clés et les valeurs peuvent avoir n'importe quelle taille, en supposant qu'il n'y a pas de clé vide; aussi, la taille de la valeur retournée peut différer de celle de string. Cependant, cette fonction sera la plus efficace lorsque toutes les clés ont la même taille.

Liste de paramètres

string

La chaîne à traiter.

from

Les caractères de départ.

to

Les caractères de remplacement.

replace_pairs

Le paramètre replace_pairs peut être utilisé à la place de to et from et dans ce cas, ce sera un tableau sous la forme array('from' => 'to', ...).

Si replace_pairs contient une clé qui est une string vide (""), l'élément est ignoré ; à partir de PHP 8.0.0 une E_WARNING est levé dans ce cas.

Valeurs de retour

Retourne la chaîne de caractères modifiée.

Exemples

Exemple #1 Exemple avec strtr()

<?php
// Ici, strtr() remplace octet par octet, nous supposons
// donc ici des encodages sur un seul octet:
$addr = strtr($addr, "äåö", "aao");
?>

L'exemple suivant montre l'utilisation de strtr() avec deux arguments. Notez la préférence des remplacements (h n'est pas utilisé car il y a des correspondances plus longues) et comment le texte remplacé n'est pas réutilisé par la suite.

Exemple #2 Exemple avec strtr() et 2 arguments

<?php
$trans = array("h" => "-", "hello" => "hi", "hi" => "hello");
echo strtr("hi all, I said hello", $trans);
?>

L'exemple ci-dessus va afficher :

hello all, I said hi

Les deux comportements sont différents. Avec trois arguments, strtr() remplacera les octets; avec deux, elle peut remplacer des sous-chaines plus longues.

Exemple #3 Comparaison de comportement de strtr()

<?php
echo strtr("baab", "ab", "01"),"\n";

$trans = array("ab" => "01");
echo strtr("baab", $trans);
?>

L'exemple ci-dessus va afficher :

1001
ba01

Voir aussi

  • str_replace() - Remplace toutes les occurrences dans une chaîne
  • preg_replace() - Rechercher et remplacer par expression rationnelle standard

User Contributed Notes

tekintian#gmail.com 07-Jun-2020 12:08
/**
 *
 *  ??????????????????????'%+-()'???????????
 * @author tekintian#gmail.com
 * @param   string       $str         ?????
 *
 * @return  string       $str         ?????
 */
function str2byte_convert(String $str):String  {
    $arr = array('0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4',
        '5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9',
        'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E',
        'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J',
        'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O',
        'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T',
        'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y',
        'Z' => 'Z', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd',
        'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i',
        'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n',
        'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's',
        't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x',
        'y' => 'y', 'z' => 'z',
        '(' => '(', ')' => ')', '?' => '[', '?' => ']', '?' => '[',
        '?' => ']', '?' => '[', '?' => ']', '“' => '[', '”' => ']',
        '‘' => '[', '’' => ']', '{' => '{', '}' => '}', '«' => '<',
        '»' => '>',
        '%' => '%', '+' => '+', '—' => '-', '-' => '-', '~' => '-',
        ':' => ':', '?' => '.', '?' => ',', ',' => '.', '?' => '.',
        ';' => ',', '?' => '?', '!' => '!', '…' => '-', '?' => '|',
        '”' => '"', '’' => '`', '‘' => '`', '|' => '|', '?' => '"',
        ' ' => ' ');

    return strtr($str, $arr);
}
Anonymous 10-Jan-2020 10:58
The string, string form cannot remove characters, but the array form can.
Annubis 09-Sep-2018 06:49
Since I was having a lot of trouble finding a multibyte safe strtr and the solutions I found didn't help, I came out with this function, I don't know how it works with non latin chars but it works for me using spanish/french utf8, I hope it helps someone...
<?php
if(!function_exists('mb_strtr')) {
    function mb_strtr ($str, $from, $to = null) {
        if(is_array($from)) {
            $from = array_map('utf8_decode', $from);
            $from = array_map('utf8_decode', array_flip ($from));
            return utf8_encode (strtr (utf8_decode ($str), array_flip ($from)));
        }
        return utf8_encode (strtr (utf8_decode ($str), utf8_decode($from), utf8_decode ($to)));
    }
}
?>
evan dot king at NOSPAM dot example dot com 24-Apr-2015 03:05
Here's an important real-world example use-case for strtr where str_replace will not work or will introduce obscure bugs:

<?php

$strTemplate = "My name is :name, not :name2.";
$strParams = [
  ':name' => 'Dave',
  'Dave' => ':name2 or :password', // a wrench in the otherwise sensible input
  ':name2' => 'Steve',
  ':pass' => '7hf2348', // sensitive data that maybe shouldn't be here
];

echo strtr($strTemplate, $strParams);
// "My name is Dave, not Steve."

echo str_replace(array_keys($strParams), array_values($strParams), $strTemplate);
// "My name is Steve or 7hf2348word, not Steve or 7hf2348word2."

?>

Any time you're trying to template out a string and don't necessarily know what the replacement keys/values will be (or fully understand the implications of and control their content and order), str_replace will introduce the potential to incorrectly match your keys because it does not expand the longest keys first.

Further, str_replace will replace in previous replacements, introducing potential for unintended nested expansions.  Doing so can put the wrong data into the "sub-template" or even give users a chance to provide input that exposes data (if they get to define some of the replacement strings).

Don't support recursive expansion unless you need it and know it will be safe.  When you do support it, do so explicitly by repeating strtr calls until no more expansions are occurring or a sane iteration limit is reached, so that the results never implicitly depend on order of your replacement keys.  Also make certain that any user input will expanded in an isolated step after any sensitive data is already expanded into the output and no longer available as input.

Note: using some character(s) around your keys to designate them also reduces the possibility of unintended mangling of output, whether maliciously triggered or otherwise.  Thus the use of a colon prefix in these examples, which you can easily enforce when accepting replacement input to your templating/translation system.
Romain 23-Oct-2014 09:44
<?php
    /**
     * Clean string,
     * minimize and remove space, accent and other
     *
     * @param string $string
     * @return string
     */
    public function mb_strtoclean($string){
        // Valeur a nettoyer (conversion)
        $unwanted_array = array(    'Š'=>'S', 'š'=>'s', 'Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
                                    'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U',
                                    'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c',
                                    'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o',
                                    'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y',
                                    ' ' => '', '_' => '', '-' => '', '.'=> '', ',' => '', ';' => '');

        return mb_strtolower(strtr($string, $unwanted_array ));
    }
doydoy44 12-Aug-2013 04:01
The example of VOVA (http://www.php.net/manual/fr/function.strtr.php#111968) is good but the result is false:
His example dont replace the string.

<?php
function f1_strtr() {
  for($i=0; $i<1000000; ++$i) {
    $new_string = strtr("aboutdealers.com", array(".com" => ""));
  }
  return $new_string;
}
function f2_str_replace() {
  for($i=0; $i<1000000; ++$i) {
    $new_string = str_replace( ".com", "", "aboutdealers.com");
  }
  return $new_string;
}
$start = microtime(true);
$strtr = f1_strtr();
$stop = microtime(true);
$time_strtr = $stop - $start;

$start = microtime(true);
$str_replace = f2_str_replace();
$stop = microtime(true);
$time_str_replace = $stop - $start;

echo 'time strtr       : ' . $time_strtr       . "\tresult :" . $strtr       . "\n";
echo 'time str_replace : ' . $time_str_replace . "\tresult :" . $str_replace . "\n";
echo 'time strtr > time str_replace => ' . ($time_strtr > $time_str_replace);
?>
--------------------------------------
time strtr       : 3.9719619750977      result :aboutdealers
time str_replace : 2.9930369853973      result :aboutdealers
time strtr > time str_replace => 1

str_replace is faster than strtr
dcz at phpbb-seo dot com 08-Aug-2013 08:26
strstr will issue a notice when $replace_pairs contains an array, even unused, with php 5.5.0.

It was not the case with version at least up to 5.3.2, but I'm not sure the notice was added with exactly 5.5.0.

<?php
$str = 'hi all, I said hello';
$replace_pairs = array(
      'all' => 'everybody',
    'unused' => array('somtehing', 'something else'),
     'hello' => 'hey',
);
// php 5.5.0 Notice: Array to string conversion in test.php on line 8
echo strtr($str, $replace_pairs); // hi everybody, I said hey
?>

since the result is still correct, @strstr seems a working solution.
Hayley Watson 01-Feb-2013 02:04
Since strtr (like PHP's other string functions) treats strings as a sequence of bytes, and since UTF-8 and other multibyte encodings use - by definition - more than one byte for at least some characters, the three-string form is likely to have problems. Use the associative array form to specify the mapping.

<?php
// Assuming UTF-8
$str = 'Äbc Äbc'; // strtr() sees this as nine bytes (including two for each Ä)
echo strtr($str, 'Ä', 'a'); // The second argument is equivalent to the string "\xc3\x84" so "\xc3" gets replaced by "a" and the "\x84" is ignored

echo strtr($str, array('Ä' => 'a')); // Works much better
?>
qeremy [atta] gmail [dotta] com 22-Jan-2013 07:19
Weird, but strtr corrupting chars, if used like below and if file is encoded in UTF-8;

<?php
$str = 'Äbc Äbc';
echo strtr($str, 'Ä', 'a');
// output: a?bc a?bc
?>

And a simple solution;

<?php
function strtr_unicode($str, $a = null, $b = null) {
    $translate = $a;
    if (!is_array($a) && !is_array($b)) {
        $a = (array) $a;
        $b = (array) $b;
        $translate = array_combine(
            array_values($a),
            array_values($b)
        );
    }
    // again weird, but accepts an array in this case
    return strtr($str, $translate);
}

$str = 'Äbc Äbc';
echo strtr($str, 'Ä', 'a') ."\n";
echo strtr_unicode($str, 'Ä', 'a') ."\n";
echo strtr_unicode($str, array('Ä' => 'a')) ."\n";
// outputs
// a?bc a?bc
// abc abc
// abc abc
?>
Tedy 01-Nov-2012 08:43
Since strtr() is twice faster than strlwr I decided to write my own lowering function which also handles UTF-8 characters.

<?php

function strlwr($string, $utf = 1)
{
    $latin_letters = array('A' => 'a',
                            'Â' => 'a',
                            'Î' => 'i',
                            '?' => 's',
                            'S' => 's',
                            '?' => 't',
                            'T' => 't');

    $utf_letters = array('A' => 'a',
                        'Â' => 'â',
                        'Î' => 'î',
                        '?' => '?',
                        'S' => 's',
                        '?' => '?',
                        'T' => 't');

    $letters = array('A' => 'a',
                    'B' => 'b',
                    'C' => 'c',
                    'D' => 'd',
                    'E' => 'e',
                    'F' => 'f',
                    'G' => 'g',
                    'H' => 'h',
                    'I' => 'i',
                    'J' => 'j',
                    'K' => 'k',
                    'L' => 'l',
                    'M' => 'm',
                    'N' => 'n',
                    'O' => 'o',
                    'P' => 'p',
                    'Q' => 'q',
                    'R' => 'r',
                    'S' => 's',
                    'T' => 't',
                    'U' => 'u',
                    'V' => 'v',
                    'W' => 'w',
                    'X' => 'x',
                    'Y' => 'y',
                    'Z' => 'z');

    return ($utf == 1) ? strtr($string, array_merge($utf_letters, $letters)) : strtr($string, array_merge($latin_letters, $letters));
}

?>

This allows you to lower every character (even UTF-8 ones) if you don't set the second parameter, or just lower the UTF-8 ones into their specific latin characters (used when making friendly-urls for example).

I used romanian characters but, of course, you can add your own local characters.

Feel free to use/modify this function as you wish. Hope it helps.
Michael Schuijff 24-Oct-2011 10:02
I found that this approach is often faster than strtr() and won't change the same thing in your string twice (as opposed to str_replace(), which will overwrite things in the order of the array you feed it with):

<?php
function replace ($text, $replace) {
    $keys = array_keys($replace);
    $length = array_combine($keys, array_map('strlen', $keys));
    arsort($length);

    $array[] = $text;
    $count = 1;
    reset($length);
    while ($key = key($length)) {
        if (strpos($text, $key) !== false) {
            for ($i = 0; $i < $count; $i += 2) {
                if (($pos = strpos($array[$i], $key)) === false) continue;
                array_splice($array, $i, 1, array(substr($array[$i], 0, $pos), $replace[$key], substr($array[$i], $pos + strlen($key))));
                $count += 2;
            }
        }
        next($length);
    }
    return implode($array);
}
?>
elloromtz at gmail dot com 19-Apr-2010 05:08
If you supply 3 arguments and the 2nd is an array, strtr will search the "A" from "Array" (because you're treating it as a scalar string) and replace it with the 3rd argument:

strtr('Analogy', array('x'=>'y'),  '_'); //'_nalogy'

so in reality the above code has the same affect as:

strtr('Analogy', 'A' , '_');
allixsenos at gmail dot com 16-May-2009 08:55
fixed "normaliza" functions written below to include Slavic Latin characters... also, it doesn't return lowercase any more (you can easily get that by applying strtolower yourself)...

also, renamed to normalize()

<?php

function normalize ($string) {
    $table = array(
        'Š'=>'S', 'š'=>'s', 'Ð'=>'Dj', 'd'=>'dj', 'Ž'=>'Z', 'ž'=>'z', 'C'=>'C', 'c'=>'c', 'C'=>'C', 'c'=>'c',
        'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
        'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O',
        'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss',
        'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e',
        'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o',
        'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b',
        'ÿ'=>'y', 'R'=>'R', 'r'=>'r',
    );

    return strtr($string, $table);
}

?>
Sidney Ricardo 05-Sep-2008 11:54
This work fine to me:

<?php
function normaliza ($string){
    $a = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ
ßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿRr';
    $b = 'aaaaaaaceeeeiiiidnoooooouuuuy
bsaaaaaaaceeeeiiiidnoooooouuuyybyRr';
    $string = utf8_decode($string);
    $string = strtr($string, utf8_decode($a), $b);
    $string = strtolower($string);
    return utf8_encode($string);
}
?>
dot dot dot dot dot alexander at gmail dot com 25-Mar-2008 04:09
OK, I debugged the function (had some errors)
Here it is:

if(!function_exists("stritr")){
    function stritr($string, $one = NULL, $two = NULL){
/*
stritr - case insensitive version of strtr
Author: Alexander Peev
Posted in PHP.NET
*/
        if(  is_string( $one )  ){
            $two = strval( $two );
            $one = substr(  $one, 0, min( strlen($one), strlen($two) )  );
            $two = substr(  $two, 0, min( strlen($one), strlen($two) )  );
            $product = strtr(  $string, ( strtoupper($one) . strtolower($one) ), ( $two . $two )  );
            return $product;
        }
        else if(  is_array( $one )  ){
            $pos1 = 0;
            $product = $string;
            while(  count( $one ) > 0  ){
                $positions = array();
                foreach(  $one as $from => $to  ){
                    if(   (  $pos2 = stripos( $product, $from, $pos1 )  ) === FALSE   ){
                        unset(  $one[ $from ]  );
                    }
                    else{
                        $positions[ $from ] = $pos2;
                    }
                }
                if(  count( $one ) <= 0  )break;
                $winner = min( $positions );
                $key = array_search(  $winner, $positions  );
                $product = (   substr(  $product, 0, $winner  ) . $one[$key] . substr(  $product, ( $winner + strlen($key) )  )   );
                $pos1 = (  $winner + strlen( $one[$key] )  );
            }
            return $product;
        }
        else{
            return $string;
        }
    }/* endfunction stritr */
}/* endfunction exists stritr */
dot dot dot dot dot alexander at gmail dot com 25-Mar-2008 10:44
Here is the stritr I always needed... I wrote it in 15 minutes... But only after the idea struck me. Hope you find it helpful, and enjoy...
<?php
if(!function_exists("stritr")){
    function stritr($string, $one = NULL, $two = NULL){
/*
stritr - case insensitive version of strtr
Author: Alexander Peev
Posted in PHP.NET
*/
        if(  is_string( $one )  ){
            $two = strval( $two );
            $one = substr(  $one, 0, min( strlen($one), strlen($two) )  );
            $two = substr(  $two, 0, min( strlen($one), strlen($two) )  );
            $product = strtr(  $string, ( strtoupper($one) . strtolower($one) ), ( $two . $two )  );
            return $product;
        }
        else if(  is_array( $one )  ){
            $pos1 = 0;
            $product = $string;
            while(  count( $one ) > 0  ){
                $positions = array();
                foreach(  $one as $from => $to  ){
                    if(   (  $pos2 = stripos( $product, $from, $pos1 )  ) === FALSE   ){
                        unset(  $one[ $from ]  );
                    }
                    else{
                        $positions[ $from ] = $pos2;
                    }
                }
                $winner = min( $positions );
                $key = array_search(  $winner, $positions  );
                $product = (   substr(  $product, 0, $winner  ) . $positions[$key] . substr(  $product, ( $winner + strlen($key) )  )   );
                $pos1 = (  $winner + strlen( $positions[$key] )  );
            }
            return $product;
        }
        else{
            return $string;
        }
    }/* endfunction stritr */
}/* endfunction exists stritr */
?>
troelskn at gmail dot com 23-Jan-2008 03:39
Here's another transcribe function. This one converts cp1252 (aka. Windows-1252) into iso-8859-1 (aka. latin1, the default PHP charset). It only transcribes the few exotic characters, which are unique to cp1252.

function transcribe_cp1252_to_latin1($cp1252) {
  return strtr(
    $cp1252,
    array(
      "\x80" => "e",  "\x81" => " ",    "\x82" => "'", "\x83" => 'f',
      "\x84" => '"',  "\x85" => "...",  "\x86" => "+", "\x87" => "#",
      "\x88" => "^",  "\x89" => "0/00", "\x8A" => "S", "\x8B" => "<",
      "\x8C" => "OE", "\x8D" => " ",    "\x8E" => "Z", "\x8F" => " ",
      "\x90" => " ",  "\x91" => "`",    "\x92" => "'", "\x93" => '"',
      "\x94" => '"',  "\x95" => "*",    "\x96" => "-", "\x97" => "--",
      "\x98" => "~",  "\x99" => "(TM)", "\x9A" => "s", "\x9B" => ">",
      "\x9C" => "oe", "\x9D" => " ",    "\x9E" => "z", "\x9F" => "Y"));
ajitsingh4u at gmail dot com 06-Aug-2007 07:36
/**
* Replaces special characters with single quote,double quote and comma for charset iso-8859-1
*
* replaceSpecialChars()
* @param string $str
* @return string
*/
function replaceSpecialChars($str)
{
    //`(96) ’(130) „(132) ‘(145) ’(146) “(147) ”(148) ´(180)   // equivalent ascii values of these characters.
    $str = strtr($str, "`’„‘’´", "'','''");
    $str = strtr($str, '“”', '""');
    return $str;
}
horak.jan AT centrum.cz 22-May-2007 07:11
Here is a function to convert middle-european windows charset (cp1250) to the charset, that php script is written in:

<?php
    function cp1250_to_utf2($text){
        $dict  = array(chr(225) => 'á', chr(228) =>  'ä', chr(232) => 'c', chr(239) => 'd',
            chr(233) => 'é', chr(236) => 'e', chr(237) => 'í', chr(229) => 'l', chr(229) => 'l',
            chr(242) => 'n', chr(244) => 'ô', chr(243) => 'ó', chr(154) => 'š', chr(248) => 'r',
            chr(250) => 'ú', chr(249) => 'u', chr(157) => 't', chr(253) => 'ý', chr(158) => 'ž',
            chr(193) => 'Á', chr(196) => 'Ä', chr(200) => 'C', chr(207) => 'D', chr(201) => 'É',
            chr(204) => 'E', chr(205) => 'Í', chr(197) => 'L',    chr(188) => 'L', chr(210) => 'N',
            chr(212) => 'Ô', chr(211) => 'Ó', chr(138) => 'Š', chr(216) => 'R', chr(218) => 'Ú',
            chr(217) => 'U', chr(141) => 'T', chr(221) => 'Ý', chr(142) => 'Ž',
            chr(150) => '-');
        return strtr($text, $dict);
    }
?>
joeldegan AT yahoo 07-Apr-2006 08:49
After battling with strtr trying to strip out MS word formatting from things pasted into forms I ended up coming up with this..

it strips ALL non-standard ascii characters, preserving html codes and such, but gets rid of all the characters that refuse to show in firefox.

If you look at this page in firefox you will see a ton of "question mark" characters and so it is not possible to copy and paste those to remove them from strings..  (this fixes that issue nicely, though I admit it could be done a bit better)

<?
function fixoutput($str){
    $good[] = 9;  #tab
    $good[] = 10; #nl
    $good[] = 13; #cr
    for($a=32;$a<127;$a++){
        $good[] = $a;
    }
    $len = strlen($str);
    for($b=0;$b < $len+1; $b++){
        if(in_array(ord($str[$b]), $good)){
            $newstr .= $str[$b];
        }//fi
    }//rof
    return $newstr;
}
?>
martin[dot]pelikan[at]gmail[dot]com 29-Dec-2005 07:20
// if you are upset with windows' ^M characters at the end of the line,
// these two lines are for you:
$trans = array("\x0D" => "");
$text = strtr($orig_text,$trans);

// note that ctrl+M (in vim known as ^M) is hexadecimally 0x0D
tomhmambo at seznam dot cz 20-Dec-2005 02:54
<?
// Windows-1250 to ASCII
// This function replace all Windows-1250 accent characters with
// thier non-accent ekvivalents. Useful for Czech and Slovak languages.

function win2ascii($str)    {

    $str = StrTr($str,
        "\xE1\xE8\xEF\xEC\xE9\xED\xF2",
        "\x61\x63\x64\x65\x65\x69\x6E");

    $str = StrTr($str,
        "\xF3\xF8\x9A\x9D\xF9\xFA\xFD\x9E\xF4\xBC\xBE",
        "\x6F\x72\x73\x74\x75\x75\x79\x7A\x6F\x4C\x6C");

    $str = StrTr($str,
        "\xC1\xC8\xCF\xCC\xC9\xCD\xC2\xD3\xD8",
        "\x41\x43\x44\x45\x45\x49\x4E\x4F\x52");

    $str = StrTr($str,
        "\x8A\x8D\xDA\xDD\x8E\xD2\xD9\xEF\xCF",
        "\x53\x54\x55\x59\x5A\x4E\x55\x64\x44");

    return $str;
}
?>
ru dot dy at gmx dot net 10-Jul-2005 04:20
Posting umlaute here resulted in a mess. Heres a version of the same function that works with preg_replace only:
<?php
  function getRewriteString($sString) {
     $string = strtolower(htmlentities($sString));
     $string = preg_replace("/&(.)(uml);/", "$1e", $string);
     $string = preg_replace("/&(.)(acute|cedil|circ|ring|tilde|uml);/", "$1", $string);
     $string = preg_replace("/([^a-z0-9]+)/", "-", html_entity_decode($string));
     $string = trim($string, "-");
     return $string;
  }
?>
patrick at p-roocks dot de 06-Feb-2005 02:31
As Daijoubu suggested use str_replace instead of this function for large arrays/subjects. I just tried it with a array of 60 elements, a string with 8KB length, and the execution time of str_replace was faster at factor 20!

Patrick
11-Dec-2004 05:20
If you are going to call strtr a lot, consider using str_replace instead, as it is much faster. I cut execution time in half just by doing this.

<?
// i.e. instead of:
$s=strtr($s,$replace_array);

// use:
foreach($replace_array as $key=>$value) $s=str_replace($key,$value,$s);
?>
ktogias at math dot upatras dot gr 23-Sep-2004 03:32
This function is usefull for
accent insensitive regexp
searches into greek (iso8859-7) text:
(Select View -> Character Encoding -> Greek (iso8859-7)
at your browser to see the correct greek characters)

function gr_regexp($mystring){
        $replacement=array(
                array("?","?","?","?"),
                array("?","?","?","?"),
                array("?","?","?","?"),
                array("?","?","?","?","?","?"),
                array("?","?","?","?"),
                array("?","?","?","?","?","?"),
                array("?","?","?","?")
        );
        foreach($replacement as $group){
                foreach($group as $character){
                        $exp="[";
                        foreach($group as $expcharacter){
                                $exp.=$expcharacter;
                        }
                        $exp.="]";
                        $trans[$character]=$exp;
                }
        }
        $temp=explode(" ", $mystring);
        for ($i=0;$i<sizeof($temp);$i++){
                $temp[$i]=strtr($temp[$i],$trans);
                $temp[$i]=addslashes($temp[$i]);
        }
        return implode(".*",$temp);
}

$match=gr_regexp("????????????????????? ??? ????????");

//The next query string can be sent to MySQL
through mysql_query()
$query=
      "Select `column` from `table` where `column2` REGEXP
                         '".$match."'";
j at pureftpd dot org 30-Nov-2003 08:24
Here's a very useful function to translate Microsoft characters into Latin 15, so that people won't see any more square instead of characters in web pages .

function demicrosoftize($str) {
    return strtr($str,
"\x82\x83\x84\x85\x86\x87\x89\x8a" .
"\x8b\x8c\x8e\x91\x92\x93\x94\x95" .
"\x96\x97\x98\x99\x9a\x9b\x9c\x9e\x9f",
"'f\".**^\xa6<\xbc\xb4''" .
"\"\"---~ \xa8>\xbd\xb8\xbe");
}
Fernando "Malk" Piancastelli 29-Oct-2003 01:31
Here's a function to replace linebreaks to html <p> tags. This was initially designed to receive a typed text by a form in a "insert new notice" page and put in a database, then a "notice" page could get the text preformatted with paragraph tags instead of linebreaks that won't appear on browser. The function also removes repeated linebreaks the user may have typed in the form.

function break_to_tags(&$text) {

       // find and remove repeated linebreaks

       $double_break = array("\r\n\r\n" => "\r\n");
       do {
              $text = strtr($text, $double_break);
              $position = strpos($text, "\r\n\r\n");
       } while ($position !== false);

       // find and replace remanescent linebreaks by <p> tags

       $change = array("\r\n" => "<p>");
       $text = strtr($text, $change);
}

[]'s
Fernando
bisqwit at iki dot fi 10-Aug-2002 10:18
#!/bin/sh
# This shell script generates a strtr() call
# to translate from a character set to another.
# Requires: gnu recode, perl, php commandline binary
#
# Usage:
#  Set set1 and set2 to whatever you prefer
#  (multibyte character sets are not supported)
#  and run the script. The script outputs
#  a strtr() php code for you to use.
#
# Example is set to generate a
# cp437..latin9 conversion code.
#
set1=cp437
set2=iso-8859-15
result="`echo '<? for($c=32;$c<256;$c++)'\
              'echo chr($c);'\
         |php -q|recode -f $set1..$set2`"
echo "// This php function call converts \$string in $set1 to $set2";
cat <<EOF  | php -q
<?php
\$set1='`echo -n "$result"\
   |perl -pe "s/([\\\\\'])/\\\\\\\\\\$1/g"`';
\$set2='`echo -n "$result"|recode -f $set2..$set1\
   |perl -pe "s/([\\\\\'])/\\\\\\\\\\$1/g"`';
\$erase=array();
\$l=strlen(\$set1);
for(\$c=0;\$c<\$l;++\$c)
  if(\$set1[\$c]==\$set2[\$c])\$erase[\$set1[\$c]]='';
if(count(\$erase))
{
  \$set1=strtr(\$set1,\$erase);
  \$set2=strtr(\$set2,\$erase);
}
if(!strlen(\$set1))echo 'IRREVERSIBLE';else
echo "strtr(\\\$string,\n  '",
     ereg_replace('([\\\\\\'])', '\\\\\\1', \$set2),
     "',\n  '",
     ereg_replace('([\\\\\\'])', '\\\\\\1', \$set1),
     "');";
EOF
gabi at unica dot edu 17-Jul-2002 05:32
To convert special chars to their html entities strtr you can use strtr in conjunction with get_html_translation_table(HTML_ENTITIES) :

$trans = get_html_translation_table(HTML_ENTITIES);
$html_code = strtr($html_code, $trans);

This will replace in $html_code the ? by &Aacute; , etc.
symlink23-remove-my-spleen at yahoo dot com 18-Apr-2002 09:33
As noted in the str_rot13 docs, some servers don't provide the str_rot13() function. However, the presence of strtr makes it easy to build your own facsimile thereof:

if (!function_exists('str_rot13')) {
    function str_rot13($str) {
        $from = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $to   = 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM';

        return strtr($str, $from, $to);
    }
}

This is suitable for very light "encryption" such as hiding email addressess from spambots (then unscrambling them in a mail class, for example).

$mail_to=str_rot13("$mail_to");
erik at eldata dot se 23-Nov-2001 09:08
As an alternative to the not-yet-existing function stritr mentioned in the first note above You can easily do this:

strtr("abc","ABCabc","xyzxyz")

or more general:

strtr("abc",
strtoupper($fromchars).strtolower($fromchars),
$tochars.$tochars);

Just a thought.


Compare deux chaînes depuis un offset jusqu'à une longueur en caractères

  • « strtr
  • substr_count »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Compare deux chaînes depuis un offset jusqu'à une longueur en caractères

substr_compare

(PHP 5, PHP 7, PHP 8)

substr_compare — Compare deux chaînes depuis un offset jusqu'à une longueur en caractères

Description

substr_compare ( string $haystack , string $needle , int $offset , int|null $length = null , bool $case_insensitive = false ) : int

substr_compare() compare haystack à partir de la position offset avec needle pendant length caractères.

Liste de paramètres

haystack

La chaîne principale à comparer.

needle

La chaîne secondaire à comparer.

offset

La position de départ pour la comparaison. Si c'est une valeur négative, on commence à compter à partir de la fin de la chaîne.

length

La longueur de la comparaison. La valeur par défaut est le maximum entre la longueur de needle et la longueur de haystack moins le paramètre offset.

case_insensitive

Si case_insensitive vaut true, la comparaison est insensible à la casse.

Valeurs de retour

Retourne < 0 si haystack à partir de offset est inférieur à needle, > 0 s'il est plus grand que needle, et 0 si ils sont égaux. Si length est égal (antérieur à PJP 7.2.18, 7.3.5) ou plus grand que la taille de haystack ou que length est définit et inférieur à 0, substr_compare() affiche une alerte et retourne false.

Historique

Version | Description
8.0.0 | length est désormais nullable.
7.2.18, 7.3.5 | offset peut désormais être égal à la taille de haystack.

Exemples

Exemple #1 Exemple avec substr_compare()

<?php
echo substr_compare("abcde", "bc", 1, 2); // 0
echo substr_compare("abcde", "de", -2, 2); // 0
echo substr_compare("abcde", "bcg", 1, 2); // 0
echo substr_compare("abcde", "BC", 1, 2, true); // 0
echo substr_compare("abcde", "bc", 1, 3); // 1
echo substr_compare("abcde", "cd", 1, 2); // -1
echo substr_compare("abcde", "abc", 5, 1); // warning
?>

Voir aussi

  • strncmp() - Comparaison binaire des n premiers caractères

User Contributed Notes

bishop at php dot net 03-Oct-2016 07:28
This function efficiently implements checks for strings beginning or ending with other strings:

<?php

function str_begins($haystack, $needle) {
  return 0 === substr_compare($haystack, $needle, 0, strlen($needle));
}

function str_ends($haystack,  $needle) {
  return 0 === substr_compare($haystack, $needle, -strlen($needle));
}

var_dump(str_begins('http://example.com', 'https://'));

?>

Note that these are not multi-byte character set aware.
jimmetry at gmail dot com 16-Dec-2012 12:31
When you came to this page, you may have been looking for something a little simpler: A function that can check if a small string exists within a larger string starting at a particular index. Using substr_compare() for this can leave your code messy, because you need to check that your string is long enough (to avoid the warning), manually specify the length of the short string, and like many of the string functions, perform an integer comparison to answer a true/false question.

I put together a simple function to return true if $str exists within $mainStr. If $loc is specified, the $str must begin at that index. If not, the entire $mainStr will be searched.

<?php

function contains_substr($mainStr, $str, $loc = false) {
    if ($loc === false) return (strpos($mainStr, $str) !== false);
    if (strlen($mainStr) < strlen($str)) return false;
    if (($loc + strlen($str)) > strlen($mainStr)) return false;
    return (strcmp(substr($mainStr, $loc, strlen($str)), $str) == 0);
}

?>
Skyborne 03-Aug-2012 01:55
Take note of the `length` parameter: "The default value is the largest of the length of the str compared to the length of main_str less the offset."

This is *not* the length of str as you might (I always) expect, so if you leave it out, you'll get unexpected results.  Example:

<?php
$hash = '$5$lalalalalalalala$crypt.output.here';
var_dump(substr_compare($hash, '$5$', 0)); # int(34)
var_dump(substr_compare($hash, '$5$', 0, 3)); # int(0)
var_dump(PHP_VERSION); # string(6) "5.3.14"
?>
sleek 23-May-2005 05:07
Modified version of the original posted function. Use this one:

<?php
if (!function_exists('substr_compare')) {
    function substr_compare($main_str, $str, $offset, $length = NULL, $case_insensitivity = false) {
        $offset = (int) $offset;

        // Throw a warning because the offset is invalid
        if ($offset >= strlen($main_str)) {
            trigger_error('The start position cannot exceed initial string length.', E_USER_WARNING);
            return false;
        }

        // We are comparing the first n-characters of each string, so let's use the PHP function to do it
        if ($offset == 0 && is_int($length) && $case_insensitivity === true) {
            return strncasecmp($main_str, $str, $length);
        }

        // Get the substring that we are comparing
        if (is_int($length)) {
            $main_substr = substr($main_str, $offset, $length);
            $str_substr = substr($str, 0, $length);
        } else {
            $main_substr = substr($main_str, $offset);
            $str_substr = $str;
        }

        // Return a case-insensitive comparison of the two strings
        if ($case_insensitivity === true) {
            return strcasecmp($main_substr, $str_substr);
        }

        // Return a case-sensitive comparison of the two strings
        return strcmp($main_substr, $str_substr);
    }
}
?>


Compte le nombre d'occurrences de segments dans une chaîne

  • « substr_compare
  • substr_replace »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Compte le nombre d'occurrences de segments dans une chaîne

substr_count

(PHP 4, PHP 5, PHP 7, PHP 8)

substr_count — Compte le nombre d'occurrences de segments dans une chaîne

Description

substr_count ( string $haystack , string $needle , int $offset = 0 , int|null $length = null ) : int

substr_count() retourne le nombre d'occurrences de needle dans la chaîne haystack. Notez que needle est sensible à la casse.

Note:

Cette fonction ne compte pas les chaînes de caractères qui se recouvrent. Voyez l'exemple ci-dessous !

Liste de paramètres

haystack

La chaîne de caractères pour rechercher à l'intérieur

needle

La chaîne de caractères que l'on recherche

offset

Le décalage où on commence à compter. Si la position est négative, le comptage commence depuis la fin de la chaîne.

length

La taille maximale après le décalage spécifié pour rechercher la chaîne. La fonction émet une erreur si le décalage plus la taille est plus grand que la taille de haystack. Une taille négative fera que le comptage commencera à la fin de haystack.

Valeurs de retour

Cette fonction retourne un entier.

Historique

Version | Description
8.0.0 | length est désormais nullable.
7.1.0 | Ajout du support des nombres négatifs pour offset et length. length peut aussi être 0 maintenant.

Exemples

Exemple #1 Exemple avec substr_count()

<?php
$text = 'Ceci est un test';
echo strlen($text); // 16

echo substr_count($text, 'est'); // 2

// la chaîne de caractères est réduite à 'st un test', alors elle affiche 1
echo substr_count($text, 'est', 6);

// le texte est réduit à 'st u', alors elle affiche 0
echo substr_count($text, 'est', 6, 4);

// génère une erreur parce que 8+10 > 16
echo substr_count($text, 'est', 8, 10);

// affiche seulement 1, parce que elle ne compte pas les chaînes de caractères
// qui se recouvrent
$text2 = 'gcdgcdgcd';
echo substr_count($text2, 'gcdgcd');
?>

Voir aussi

  • count_chars() - Retourne des statistiques sur les caractères utilisés dans une chaîne
  • strpos() - Cherche la position de la première occurrence dans une chaîne
  • substr() - Retourne un segment de chaîne
  • strstr() - Trouve la première occurrence dans une chaîne

User Contributed Notes

tuxedobob 18-Apr-2016 06:55
It's worth noting this function is surprisingly fast. I first ran it against a ~500KB string on our web server. It found 6 occurrences of the needle I was looking for in 0.0000 seconds. Yes, it ran faster than microtime() could measure.

Looking to give it a challenge, I then ran it on a Mac laptop from 2010 against a 120.5MB string. For one test needle, it found 2385 occurrences in 0.0266 seconds. Another test needs found 290 occurrences in 0.114 seconds.

Long story short, if you're wondering whether this function is slowing down your script, the answer is probably not.
tweston at bangordailynews dot com 15-Apr-2015 03:10
To account for the case that jrhodes has pointed out, we can change the line to:

substr_count ( implode( ',', $haystackArray ), $needle );

This way:

array (
  0 => "mystringth",
  1 => "atislong"
);

Becomes

mystringth,atislong

Which brings the count for $needle = "that" to 0 again.
php at blink dot at 07-Jul-2014 01:30
This will handle a string where it is unknown if comma or period are used as thousand or decimal separator. Only exception where this leads to a conflict is when there is only a single comma or period and 3 possible decimals (123.456 or 123,456). An optional parameter is passed to handle this case (assume thousands, assume decimal, decimal when period, decimal when comma). It assumes an input string in any of the formats listed below.

function toFloat($pString, $seperatorOnConflict="f")
{
    $decSeperator=".";
    $thSeperator="";

    $pString=str_replace(" ", $thSeperator, $pString);

    $firstPeriod=strpos($pString, ".");
    $firstComma=strpos($pString, ",");
    if($firstPeriod!==FALSE && $firstComma!==FALSE) {
        if($firstPeriod<$firstComma) {
            $pString=str_replace(".", $thSeperator, $pString);
            $pString=str_replace(",", $decSeperator, $pString);
        }
        else {
            $pString=str_replace(",", $thSeperator, $pString);
        }
    }
    else if($firstPeriod!==FALSE || $firstComma!==FALSE) {
        $seperator=$firstPeriod!==FALSE?".":",";
        if(substr_count($pString, $seperator)==1) {
            $lastPeriodOrComma=strpos($pString, $seperator);
            if($lastPeriodOrComma==(strlen($pString)-4) && ($seperatorOnConflict!=$seperator && $seperatorOnConflict!="f")) {
                $pString=str_replace($seperator, $thSeperator, $pString);
            }
            else {
                $pString=str_replace($seperator, $decSeperator, $pString);
            }
        }
        else {
            $pString=str_replace($seperator, $thSeperator, $pString);
        }
    }
    return(float)$pString;
}

function testFloatParsing() {
    $floatvals = array(
        "22 000",
        "22,000",
        "22.000",
        "123 456",
        "123,456",
        "123.456",
        "22 000,76",
        "22.000,76",
        "22,000.76",
        "22000.76",
        "22000,76",
        "1.022.000,76",
        "1,022,000.76",
        "1,000,000",
        "1.000.000",
        "1022000.76",
        "1022000,76",
        "1022000",
        "0.76",
        "0,76",
        "0.00",
        "0,00",
        "1.00",
        "1,00",
        "-22 000,76",
        "-22.000,76",
        "-22,000.76",
        "-22 000",
        "-22,000",
        "-22.000",
        "-22000.76",
        "-22000,76",
        "-1.022.000,76",
        "-1,022,000.76",
        "-1,000,000",
        "-1.000.000",
        "-1022000.76",
        "-1022000,76",
        "-1022000",
        "-0.76",
        "-0,76",
        "-0.00",
        "-0,00",
        "-1.00",
        "-1,00"
    );

    echo "<table>
        <tr>
            <th>String</th>
            <th>thousands</th>
            <th>fraction</th>
            <th>dec. if period</th>
            <th>dec. if comma</th>
        </tr>";

    foreach ($floatvals as $fval) {
        echo "<tr>";
        echo "<td>" . (string) $fval . "</td>";

        echo "<td>" . (float) toFloat($fval, "") . "</td>";
        echo "<td>" . (float) toFloat($fval, "f") . "</td>";
        echo "<td>" . (float) toFloat($fval, ".") . "</td>";
        echo "<td>" . (float) toFloat($fval, ",") . "</td>";
        echo "</tr>";
    }
    echo "</table>";
}
qeremy [atta] gmail [dotta] com 20-Sep-2013 08:45
Unicode example with "case-sensitive" option;

<?php
function substr_count_unicode($str, $substr, $caseSensitive = true, $offset = 0, $length = null) {
    if ($offset) {
        $str = substr_unicode($str, $offset, $length);
    }

    $pattern = $caseSensitive
        ? '~(?:'. preg_quote($substr) .')~u'
        : '~(?:'. preg_quote($substr) .')~ui';
    preg_match_all($pattern, $str, $matches);

    return isset($matches[0]) ? count($matches[0]) : 0;
}

function substr_unicode($str, $start, $length = null) {
    return join('', array_slice(
        preg_split('~~u', $str, -1, PREG_SPLIT_NO_EMPTY), $start, $length));
}

$s = 'Ümit yüzüm gözüm...';
print substr_count_unicode($s, 'ü');            // 3
print substr_count_unicode($s, 'ü', false);     // 4
print substr_count_unicode($s, 'ü', false, 10); // 1

print substr_count_unicode($s, 'üm');           // 2
print substr_count_unicode($s, 'üm', false);    // 3
?>
chrisstocktonaz at gmail dot com 26-Aug-2009 04:52
In regards to anyone thinking of using code contributed by zmindster at gmail dot com

Please take careful consideration of possible edge cases with that regex, in example:

$url = 'http://w3.host.tld/path/to/file/..../file.extension';
$url = 'http://w3.host.tld/path/to/file/../file.extension?malicous=....';

This would cause a infinite loop and for example be a possible entry point for a denial of service attack. A correct fix would require additional code, a quick hack would be just adding a additional check, without clarity or performance in mind:

...
$i = 0;
while (substr_count($url, '../') && ++$i < strlen($url))
...

-Chris
jrhodes at roket-enterprises dot com 18-Jun-2009 01:37
It was suggested to use

substr_count ( implode( $haystackArray ), $needle );

instead of the function described previously, however this has one flaw.  For example this array:

array (
  0 => "mystringth",
  1 => "atislong"
);

If you are counting "that", the implode version will return 1, but the function previously described will return 0.
gigi at phpmycoder dot com 12-Jan-2009 08:17
below was suggested a function for substr_count'ing an array, yet for a simpler procedure, use the following:

<?php
substr_count ( implode( $haystackArray ), $needle );
?>
info at fat-fish dot co dot il 05-May-2007 04:07
a simple version for an array needle (multiply sub-strings):
<?php

function substr_count_array( $haystack, $needle ) {
     $count = 0;
     foreach ($needle as $substring) {
          $count += substr_count( $haystack, $substring);
     }
     return $count;
}
?>
flobi at flobi dot com 25-Oct-2006 07:07
Making this case insensitive is easy for anyone who needs this.  Simply convert the haystack and the needle to the same case (upper or lower).

substr_count(strtoupper($haystack), strtoupper($needle))
XinfoX X at X XkarlX X-X XphilippX X dot X XdeX 21-Dec-2003 01:27
Yet another reference to the "cgcgcgcgcgcgc" example posted by "chris at pecoraro dot net":

Your request can be fulfilled with the Perl compatible regular expressions and their lookahead and lookbehind features.

The example

 $number_of_full_pattern = preg_match_all('/(cgc)/', "cgcgcgcgcgcgcg", $chunks);

works like the substr_count function. The variable $number_of_full_pattern has the value 3, because the default behavior of Perl compatible regular expressions is to consume the characters of the string subject that were matched by the (sub)pattern. That is, the pointer will be moved to the end of the matched substring.
But we can use the lookahead feature that disables the moving of the pointer:

 $number_of_full_pattern = preg_match_all('/(cg(?=c))/', "cgcgcgcgcgcgcg", $chunks);

In this case the variable $number_of_full_pattern has the value 6.
Firstly a string "cg" will be matched and the pointer will be moved to the end of this string. Then the regular expression looks ahead whether a 'c' can be matched. Despite of the occurence of the character 'c' the pointer is not moved.


Remplace un segment dans une chaîne

  • « substr_count
  • substr »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Remplace un segment dans une chaîne

substr_replace

(PHP 4, PHP 5, PHP 7, PHP 8)

substr_replace — Remplace un segment dans une chaîne

Description

substr_replace ( array|string $string , array|string $replace , array|int $offset , array|int|null $length = null ) : string|array

substr_replace() remplace un segment de la chaîne string par la chaîne replace. Le segment est délimité par offset et éventuellement par length.

Liste de paramètres

string

La chaîne d'entrée.

Un tableau de chaînes de caractères peut être fourni, et dans ce cas, les remplacements surviendront sur chacune des chaînes. Dans cette situation, les paramètres replace, offset length doivent être fournis soit comme valeurs scalaires à appliquer sur chaque chaîne, ou comme tableaux où l'élément du tableau correspondant sera utilisé pour chaque chaîne d'entrée.

replace

La chaîne de remplacement.

offset

Si offset n'est pas négatif, le remplacement se fera à partir du caractère numéro offset dans string.

Si offset est négatif, le remplacement se fera à partir du offset-ième caractère en partant de la fin de la chaîne string.

length

Si length est fourni et positif, il représentera la longueur du segment de code remplacé dans la chaîne string. S'il est négatif, il représentera le nombre de caractères à partir de la fin de la chaîne string où arrêter le remplacement. S'il est omis, il prendra la valeur par défaut de la taille de la chaîne, et remplacera tout jusqu'à la fin de la chaîne string. Bien sûr, si length vaut 0, alors, cette fonction aura comme effet d'insérer replace dans string à la position offset donnée.

Valeurs de retour

La chaîne résultante est retournée. Si le paramètre string est un tableau, alors un tableau sera retourné.

Historique

Version | Description
8.0.0 | length est désormais nullable.

Exemples

Exemple #1 Exemple avec substr_replace()

<?php
$var = 'ABCDEFGH:/MNRPQR/';
echo "Original : $var<hr />\n";

// Remplace toute la chaîne $var par 'bob'.
echo substr_replace($var, 'bob', 0) . "<br />\n";
echo substr_replace($var, 'bob', 0, strlen($var)) . "<br />\n";

// Insert 'bob' au début de la chaîne
echo substr_replace($var, 'bob', 0, 0) . "<br />\n";

// Remplace la séquence 'MNRPQR' par 'bob'.
echo substr_replace($var, 'bob', 10, -1) . "<br />\n";
echo substr_replace($var, 'bob', -7, -1) . "<br />\n";

// Efface la séquence 'MNRPQR' de $var.
echo substr_replace($var, '', 10, -1) . "<br />\n";
?>

Exemple #2 Utilisation de substr_replace() pour remplacer plusieurs chaînes en une seule fois

<?php
$input = array('A: XXX', 'B: XXX', 'C: XXX');

// Un cas simple : remplacer XXX dans chaque chaîne par YYY.
echo implode('; ', substr_replace($input, 'YYY', 3, 3))."\n";

// Un cas plus complexe où chaque remplacement est différent.
$replace = array('AAA', 'BBB', 'CCC');
echo implode('; ', substr_replace($input, $replace, 3, 3))."\n";

// Remplace un nombre différent de caractères à chaque fois.
$length = array(1, 2, 3);
echo implode('; ', substr_replace($input, $replace, 3, $length))."\n";
?>

L'exemple ci-dessus va afficher :

A: YYY; B: YYY; C: YYY
A: AAA; B: BBB; C: CCC
A: AAAXX; B: BBBX; C: CCC

Notes

Note: Cette fonction gère les chaînes binaires.

Voir aussi

  • str_replace() - Remplace toutes les occurrences dans une chaîne
  • substr() - Retourne un segment de chaîne
  • Accès et modification d'une chaîne, par caractère

User Contributed Notes

meg dot phillips91 at gmail dot com 18-Jun-2020 04:47
This may be obvious to others, but I just spent hours and my feeble brain only caught up to it after a long break.

If you are looping through a string which has multiple substrings that need to be replaced, you have to add an offset factor to each original offset before you replaced any strings. Here is a real world example:

From draft.js we get paragraphs with multiple links designated only with offset, anchor text length, url, target. So each anchor text must be wrapped in the <a href="url" target="target">anchortext</a> to save proper content in the database.

Here is the implementation of offset factor:

 $offset_factor = 0;

 foreach($content->links->links as $index=>$link){
            $replacement = '<a href="'.$link->href.'"  target="$link->target">'.$link->anchorText.'</a>';
            $new_offset = $link->offset + $offset_factor;
            $newtext = \substr_replace($content->text, $replacement, $new_offset, $link->length);

            //now we reset the original paragraph text with newtext
            $content->text = $newtext;

            //calculate the new offset by calculating the difference in replacement length and original length and add that to the offset_factor
            $additional_characters = strlen($replacement) - $link->length;
            $offset_factor =  $offset_factor + $additional_characters;
        }

I hope this helps a noobie :) If there is another easier way, I would love to hear about it.
shaman_master at list dot ru 31-Dec-2019 10:48
Add prefix to strings:
<?php
substr_replace($strings, '_prefix', 0, 0);
?>
Add suffix/postfix to strings:
<?php
substr_replace($strings, '_suffix', array_map('strlen', $strings), 0);
?>
bkline at rksystems dot com 12-Mar-2019 01:21
I imagine the description of the parameters really means "number of bytes" where it says "number of characters" (confirmed by testing).
yeyijelud at amadamus dot com 08-Nov-2018 06:18
First Example can be simplified =>

 $input = array('A: XXX', 'B: XXX', 'C: XXX');

 substr_replace($input, 'YYY', -3);

output: Array ( [0] => A: YYY [1] => B: YYY [2] => C: YYY )
Hayley Watson 26-Sep-2017 12:32
See array_splice if you want to do this sort of thing to an array.
nospam at nospam dot com 21-Jan-2016 09:45
<?php

// shortens a long string to a max length while inserting a string into the exact middle
function strShorten($str, $maxlen = 10, $insert = '/.../') {
  if ($str && !is_array($str)) { // valid string
    if ($maxlen && is_numeric($maxlen) && $maxlen < strlen($str)) { // string needs shortening
      if ($insert && ($ilen = strlen($insert))) { // insert string and length
        if ($ilen >= $maxlen) { // insert string too long so use default insert
          $insert = '**'; // short default so works even when a very small $maxlen
          $ilen = 2;
        }
      }
      $chars = $maxlen - $ilen; // number of $str chars to keep
      $start = ceil($chars/2); // position to start cutting
      $end = floor($chars/2); // position from end to stop cutting
      return substr_replace($str, $insert, $start, -$end); // first.insert.last
    } else { // string already short enough
      return $str; // return original string
    }
  }
}

echo strShorten('123456789', 6, ''); // outputs 123789
echo strShorten('123456789', 6, '-'); // outputs 123-89
echo strShorten('123456789', 6, 'longstring'); // outputs 12**89
echo strShorten('abcdefghijklmnopqrstuvwxyz', 10, '..'); // outputs abcd..wxyz
echo strShorten('abcdefghijklmnopqrstuvwxyz'); // outputs abc/.../yz

?>
olav at schettler dot net 01-Nov-2015 08:12
Please note that the function array_slice(), which has a similar functionality but for arrays rather than for strings, has its parameters in a different order.
ivijan dot stefan at gmail dot com 05-Mar-2014 08:15
I have a little function that works like substr_replace ()  what I use for some purpose. Maybe someone needs it.

<?php
function putinplace($string=NULL, $put=NULL, $position=false)
{
    $d1=$d2=$i=false;
    $d=array(strlen($string), strlen($put));
    if($position > $d[0]) $position=$d[0];
    for($i=$d[0]; $i >= $position; $i--) $string[$i+$d[1]]=$string[$i];
    for($i=0; $i<$d[1]; $i++) $string[$position+$i]=$put[$i];
    return $string;
}

// Explanation
$string='My dog dont love postman'; // string
$put="'"; // put ' on position
$position=10; // number of characters (position)
print_r( putinplace($string, $put, $position) );
?>

RESULT: My dog don't love postman

This is a small powerful function that performs its job flawlessly.
blessador at gmail dot com 18-Jun-2013 08:36
<?php
$price = "12000";
$price = substr_replace ($price, ',', -3, 0)";
?>

ensure to remove the double quot  " at the end of substr_replace ($price, ',', -3, 0)" in the above  code to avoid error.
elloromtz at gmail dot com 17-Apr-2010 11:23
It's worth noting that when start and length are both negative -and- the length is less than or equal to start, the length will have the effect of being set as 0.

<?php
substr_replace('eggs','x',-1,-1); //eggxs
substr_replace('eggs','x',-1,-2); //eggxs
substr_replace('eggs','x',-1,-2); //eggxs
?>

Same as:
<?php
substr_replace('eggs','x',-1,0); //eggxs
?>

<?php
substr_replace('huevos','x',-2,-2); //huevxos
substr_replace('huevos','x',-2,-3); //huevxos
substr_replace('huevos','x',-2,-3); //huevxos
?>

Same as:
<?php
substr_replace('huevos','x',-2,0); //huevxos
?>

Another note, if length is negative and start offsets the same position as length, length (yet again) will have the effect as being set as 0. (Of course, as mentioned in the manual, when length is negative it actually represents the position before it)

<?php
substr_replace('abcd', 'x', 0, -4); //xabcd
?>

Same as:
<?php
substr_replace('abcd','x',0,0); //xabcd
?>

<?php
substr_replace('abcd', 'x', 1, -3); //axbcd
?>

Same as:
<?php
substr_replace('abcd', 'x', 1, 0); //axbcd
?>
den dot gierling at web dot de 19-Feb-2010 10:32
My problem was that substr_replace() always added $replacement, so i wrote my own function.
This function only adds $replacement, if substr() took action.
The parameter $length is optional - like substr()'s.
Or I was too stupid using $start and $length...

<?php
function substr_replace_provided($string,$replacement,$start,$length=NULL)
{
    $tmp=substr($string,$start,$length);
    if($string!==$tmp) {
        $string = $tmp.$replacement;
    }
    return $string;
}
?>
kalim dot fleet at gmail dot com 10-Oct-2009 09:49
This will truncate a longer string to a smaller string of specified length while replacing the middle portion with a separator exactly in the middle.

<?php

$longString = 'abcdefghijklmnopqrstuvwxyz0123456789z.jpg';
$separator = '/.../';
$separatorlength = strlen($separator) ;
$maxlength = 25 - $separatorlength;
$start = $maxlength / 2 ;
$trunc =  strlen($longString) - $maxlength;

echo substr_replace($longString, $separator, $start, $trunc);

//prints "abcdefghij/.../56789z.jpg"

?>
admiral at nuclearpixel dot com 06-Oct-2009 11:54
Hey everyone, I was noticing that there are a lot of ways below that people are using to write their own string truncation functions, but it kinda seemed like a lot of them went a bit too far out to make any sense to a n00b. Not that I am one anymore, but I though I'd add a note on this topic myself, in hopes that it might help others understand things a little better.

Here's a concept that some people don't know about, or remember to use often enough; You can actually pull individual characters out of a string by referencing that string as though it were an array. Example: If I have the string $s = 'cat', I can use $s[0] to actually get out only the first character of that string, 'c'. I use that same principle below, but I just use a loop to iterate through a string and add the characters to the output variable one by one until the $lenth param has been reached, or until the end of the string.

I hope this can help someone out!

-Admiral Potato

<?php

function admiralsTruncate($string, $length){
    settype($string, 'string');
    settype($length, 'integer');
    for($a = 0; $a < $length AND $a < strlen($string); $a++){
        $output .= $string[$a];
    }
    return($output);
}

$my_string = 'cfcd208495d565ef66e7dff9f98764da';

echo admiralsTruncate($my_string, 6);    // outputs: cfcd20

echo '<br>';

echo admiralsTruncate($my_string, 9);    // outputs: cfcd20849

?>
billg AT microsoft.com 07-Apr-2009 07:31
Forget all of the mb_substr_replace() implementations mentioned in this page, they're all buggy.

Here is a version that mimics the behavior of substr_replace() exactly:

<?php

if (function_exists('mb_substr_replace') === false)
{
    function mb_substr_replace($string, $replacement, $start, $length = null, $encoding = null)
    {
        if (extension_loaded('mbstring') === true)
        {
            $string_length = (is_null($encoding) === true) ? mb_strlen($string) : mb_strlen($string, $encoding);

            if ($start < 0)
            {
                $start = max(0, $string_length + $start);
            }

            else if ($start > $string_length)
            {
                $start = $string_length;
            }

            if ($length < 0)
            {
                $length = max(0, $string_length - $start + $length);
            }

            else if ((is_null($length) === true) || ($length > $string_length))
            {
                $length = $string_length;
            }

            if (($start + $length) > $string_length)
            {
                $length = $string_length - $start;
            }

            if (is_null($encoding) === true)
            {
                return mb_substr($string, 0, $start) . $replacement . mb_substr($string, $start + $length, $string_length - $start - $length);
            }

            return mb_substr($string, 0, $start, $encoding) . $replacement . mb_substr($string, $start + $length, $string_length - $start - $length, $encoding);
        }

        return (is_null($length) === true) ? substr_replace($string, $replacement, $start) : substr_replace($string, $replacement, $start, $length);
    }
}

?>
juichenieder-phnet at yahoo dot co dot uk 25-Mar-2009 10:58
I've just taken a look at the post by ntoniazzi and I have a very small correction to make.

In the second if statement, it should be a triple equals, so:

<?php if ($length === null) ?>

It requires the triple equals, for the case of pure insertion, where $length = 0, the double equals, will catch this, causing the string to be cut short.  I hope this helps someone.
NiX0n at fragfest dot cx 09-Oct-2008 09:41
The preemptive test to see if $string is "too long" shouldn't add strlen($replacement) to $max.  $max should represent the absolute maximum length of string returned.  The size of the $replacement is irrelevant in that determination.

The rest of the function (unchanged below) operates as defined above.  Meaning, the size of the $replacement is subtracted from the $max, so that the returned string is exactly the length of $max.

<?php
function truncate($string, $max = 20, $replacement = '')
{
    if (strlen($string) <= $max)
    {
        return $string;
    }
    $leave = $max - strlen ($replacement);
    return substr_replace($string, $replacement, $leave);
}
?>
spcl dot delivery at gmail dot com 27-Jul-2008 04:14
the version of my predecessor will add $rep even if the string is shorter than max. fixed version:

<?php
function truncate($string, $max = 20, $rep = '')
{
    if (strlen($string) <= ($max + strlen($rep)))
    {
        return $string;
    }
    $leave = $max - strlen ($rep);
    return substr_replace($string, $rep, $leave);
}
?>

To preserve the filename extension you can call it like this:

truncate([filename], 30, '...' . end(explode('.', [filename])))
eblejr AT phrebh DOT com 04-Jun-2008 08:42
PHP version of Java's removeCharAt() function:

<?php
function removeCharAt($str, $int){
  return substr_replace($str,"",$int,1);
}
?>
William Barry 23-Apr-2008 12:18
I recently ran across a situation where I need to strip a heavily nested html list such that only the top level was preserved.  I started with a regular expression solution, but found that I kept matching the wrong closing ul with an outer opening ul.

This was my alternative solution, and it seems to work well:

<?php

function stripNestedLists($str)
{
    $str2 = $str;
    $lastStr = $str2;

    do
    {
        // Find the first closing ul
        $cul = strpos($str2, '</ul>');
        $ul = 0;
        $lastUL = 0;
        do
        {
            // Find the next opening ul
            $lastUL = $ul;
            $ul = strpos($str2, '<ul', $ul+1);
        }
        while ($ul !== false && $ul < $cul);

        $lastStr = $str2;
        $str2 = substr_replace($str2, '', $lastUL, $cul-$lastUL+5);
        $str2 = trim($str2);
    }
    while (strlen($str2) > 0);

    return $lastStr;
}

?>

Hope this helps someone.
jaimthorn at yahoo dot com 25-Mar-2008 10:53
I recently needed a routine that would remove the characters in one string from another, like the regex

<?php
   $result = preg_replace("/[$chars]/", "", $string);
?>

and I needed it to be fast, and accept pretty much all input.  The regex above won't work when strlen($chars) == 0.  I came up with this, admittedly pretty horrible-looking code, that is quite fast:

<?php

function RemoveChars($string, $chars)
{
    return isset($chars{0}) ? str_replace($chars{0}, "", strtr($string, $chars, str_pad($chars{0}, strlen($chars), $chars{0}))) : $string;
}

?>

According to my own measurements, the regex in ONLY faster for when strlen($chars) == 1; for longer strings, my routine is faster.  What does it do?  Let's say you want to remove the period, the comma and the exclamation mark from a string, like so:
$result = RemoveChars("Isn't this, like, totally neat..!?", ".?!");
The str_pad function creates a string equal in length to the string that contains the character to be removed, but consisting only of the first character of that string:
The input is ".,!"
The output is "..."
The strtr function translates all characters in the string-to-be-processed ("Isn't this...") that also occur in the input (".,!") to the characters in the same position in the output ("...").  In other words:
Isn't this, like, totally neat..!?
becomes
Isn't this. like. totally neat....
Finally, the first character from the input (".,!") which happens to be, again, the period, is removed from that string by the str_replace call:
Isn't this like totally neat?
The function needs to check is $chars has at least one character, or else the str_pad function will fail.  If it's empty, then the unprocessed string is returned.
ntoniazzi at sqli dot com 14-Feb-2008 01:07
Almost... In the previous note, change this :
<?php
    function mb_substr_replace($string, $replacement, $start, $length=null, $encoding=null) {
        if ($encoding == null) $encoding = mb_internal_encoding();
        if($start < 0) $start = mb_strlen($string) + $start;
    [...]
?>
alishahnovin at hotmail dot com 07-Aug-2007 12:56
I like the truncate function below...however, I found a few issues. Particularly if you have content that may have any kind of punctuation in it (?, !, ?!?, --, ..., .., ;, etc.)

The older function would end up looking like "blah blah?..." or "blah blah,..." which doesn't look so nice to me...

Here's my fix. It removes all trailing punctuation (that you include in the $punctuation string below) and then adds an ellipse. So even if it has an ellipse with 3 dots, 2 dots, 4 dots, it'll be removed, then re-added.

<?php
function truncate($text,$numb,$etc = "...") {
$text = html_entity_decode($text, ENT_QUOTES);
if (strlen($text) > $numb) {
$text = substr($text, 0, $numb);
$text = substr($text,0,strrpos($text," "));

$punctuation = ".!?:;,-"; //punctuation you want removed

$text = (strspn(strrev($text),  $punctuation)!=0)
        ?
        substr($text, 0, -strspn(strrev($text),  $punctuation))
        :
$text;

$text = $text.$etc;
}
$text = htmlentities($text, ENT_QUOTES);
return $text;
}
?>

I also needed a sort of "middle" truncate. The above function truncates around the end, but if you want to truncate around the middle (ie "Hello this is a long string." --> "Hello this ... long string.") you can use this (requires the truncate function):

<?php
function mtruncate($text, $numb, $etc = " ... ") {
    $first_part = truncate(truncate($text, strlen($text)/2, ""), $numb/2, "");
    $second_part = truncate(strrev(truncate(strrev($text), strlen($text)/2, "")), $numb/2, "");
    return $first_part.$etc.$second_part;
}
?>
chuayw2000 at hotmail dot com 09-Dec-2005 03:33
I don't know if this function is multibyte safe but I've written a function that will do the same in multibyte mode.

<?php
//Check to see if it exists in case PHP has this function later
if (!function_exists("mb_substr_replace")){
   //Same parameters as substr_replace with the extra encoding parameter.
    function mb_substr_replace($string,$replacement,$start,$length=null,$encoding = null){
        if ($encoding == null){
            if ($length == null){
                return mb_substr($string,0,$start).$replacement;
            }
            else{
                return mb_substr($string,0,$start).$replacement.mb_substr($string,$start + $length);
            }
        }
        else{
            if ($length == null){
                return mb_substr($string,0,$start,$encoding).$replacement;
            }
            else{
                return mb_substr($string,0,$start,$encoding). $replacement. mb_substr($string,$start + $length,mb_strlen($string,$encoding),$encoding);
            }
        }
    }
}
?>
hermes at andycostell dot com 27-Aug-2005 11:48
I suggest changing the function suggested by Guru Evi slightly. I found that it doesn't work as written here.

Original:
function add_3dots($string,$repl,$start,$limit) {
   if(strlen($string) > $limit) {
       return substr_replace(strip_tags($string),$repl,$start,$limit);
   } else {
       return $string;
   };
};

I suggest:
function add_3dots($string,$repl,$limit) {
       if(strlen($string) > $limit) {
           return substr_replace(strip_tags($string),$repl,$limit-strlen($repl));
       } else {
           return $string;
       }
    }

Usage:

$max_length=10;//the max number of characters you want to display
$too_long_string="BLAH BLAH BLAH BLAH BLAH etc.";//the string you want to shorten (if it's longer than the $limit)
$shorter_string=add_3_dots($too_long_string,"...",$max_length);
Guru Evi 13-Jul-2005 12:44
If your string is not long enough to meet what you specify in start and length then the replacement string is added towards the end of the string.

I wanted to replace the end of the string with ... if the string was too long to display (for instance article preview on a website). The problem was that my string was sometimes not that long and it still added the replacement string. So I wrote a function to replace substr_replace in my website:

function add_3dots($string,$repl,$start,$limit) {
    if(strlen($string) > $limit) {
        return substr_replace(strip_tags($string),$repl,$start,$limit);
    } else {
        return $string;
    };
};

I use strip_tags to strip out the HTML otherwise you might get a screwed up HTML (when a tags open in the string, but because you cut-off it doesn't)
danieldoorduin at hotmail dot com 10-Dec-2004 02:48
Using substr_replace() can be avoided by using substr() instead:

<?
$string = substr($string, 0, $position_needle).$replace.substr($string, $position_needle+$length_needle);
?>

This can be useful when you need to replace parts of multibyte strings like strings encoded with utf-8. There isn't a multibute variant for substr_replace(), but for php substr() there is mb_substr(). For more information on multibyte strings see http://nl3.php.net/manual/en/ref.mbstring.php
dmron 17-Jun-2004 04:34
Regarding "...", even the short functions are too long and complicated, and there's no need to use substr_replace. substr() works better and is  way faster prior to 4.3.5 as the below poster stated.

function shorten( $str, $num = 100 ) {
  if( strlen( $str ) > $num ) $str = substr( $str, 0, $num ) . "...";
  return $str;
}
tony at outshine dot com 10-May-2004 02:25
The comment by geniusdex is a good one.  Short, simple functions are the best.  But if the string is not longer than the limit set, NOTHING is returned.  Here is the function re-done to always return a string:

<?php
function dot($str, $len, $dots = "...") {
    if (strlen($str) > $len) {
        $dotlen = strlen($dots);
        $str = substr_replace($str, $dots, $len - $dotlen);
    }
    return $str;
}
?>
geniusdex ( at ) brz ( dot ) nu 23-Feb-2004 07:33
This is my version of making dotted strings:

<?php
function dot($str, $len, $dots = "...") {
    if (strlen($str) > $len) {
        $dotlen = strlen($dots);
        substr_replace($str, $dots, $len - $dotlen);
    }
}
?>
Thijs Wijnmaalen (thijs[at]nllinux.nl) 20-Jan-2004 11:05
I wrote a function that you can use for example in combination with a search script to cut off the articles that are too long.

<?php
function substr_index($text, $maxChars = 20, $splitter
= '...') {

$theReturn = $text;
$lastSpace = false;

if (strlen($text) > $maxChars) {
$theReturn = substr($text, 0, $maxChars - 1);

if (in_array(substr($text, $maxChars - 1, 1),
array(' ', '.', '!', '?'))) {
$theReturn .= substr($text, $maxChars, 1);
} else {
$theReturn = substr($theReturn, 0, $maxChars -
strlen($splitter));
$lastSpace = strrpos($theReturn, ' ');

if ($lastSpace !== false) {
$theReturn = substr($theReturn, 0, $lastSpace);
}

if (in_array(substr($theReturn, -1, 1), array(','))) {
$theReturn = substr($theReturn, 0, -1);
}
$theReturn .= $splitter;
}
}
return $theReturn;
}
?>
david at ethinkn dot com 05-Jul-2003 05:36
Here is a simple function to shorten a string and add an ellipsis

<?php

/**
 * truncate() Simple function to shorten a string and add an ellipsis
 *
 * @param string $string Origonal string
 * @param integer $max Maximum length
 * @param string $rep Replace with... (Default = '' - No elipsis -)
 * @return string
 * @author David Duong
 **/
function truncate ($string, $max = 50, $rep = '') {
    $leave = $max - strlen ($rep);
    return substr_replace($string, $rep, $leave);
}

echo truncate ('akfhslakdhglksjdgh', 10, '...');
// Returns akfhsla... (10 chrs)

?>
thomasNOSPAM at sportentranceNOSPAM dot com 08-Oct-2002 03:01
To abbreviate links into '...' if they outreach a certain amount of space; use the preg_replace function instead.

For instance you grabbed the headlines of a news site for use on your own page and the lines are to long:

asuming the raw material is stored in $unedited;

$edited = preg_replace("/(>)([[:print:]]{52,})(<)/e", "'\\1'.substr_replace('\\2 ', '...', '48').'\\3'", $unedited);
echo $edited;

This will shorten strings longer than 52 characters into 51 characters, with the last being three dots...
klaas at group94 dot com 13-Feb-2002 10:38
THE DOT DOT DOT ISSUE

PROBLEM:
You want to abbreviate a string.
E.g. You want "BritneySpears" to show as "BritneySpe...", being only the ten first characters followed by "..."

SOLUTION:
<?
$oRIGINAL = "BritneySpears";
$sHORTER = substr_replace($oRIGINAL, '...', 10);
echo ($sHORTER);
?>

This will result in BritneySpe...
28-Sep-2001 08:30
If you would like to remove characters from the start or end of a string, try the substr() function.

For example, to remove the last three characters from a string:
$string = "To be or not to be.";
$string = substr ($string, 0, -3);
mrbrown8 at juno dot com 16-Apr-2001 12:16
Just to add to the examples, if replacement is longer than length, only the length number of chars are removed from string and all of replacement is put in its place, and therefor strlen($string) is inreased.

$var = 'ABCDEFGH:/MNRPQR/';
/*  Should return ABCDEFGH:/testingRPQR/   */
echo substr_replace ($var, 'testing', 10, 2);


Retourne un segment de chaîne

  • « substr_replace
  • trim »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Retourne un segment de chaîne

substr

(PHP 4, PHP 5, PHP 7, PHP 8)

substr — Retourne un segment de chaîne

Description

substr ( string $string , int $offset , int|null $length = null ) : string

Retourne le segment de string défini par offset et length.

Liste de paramètres

string

La chaîne de caractères d'entrée.

offset

Si offset est positif, la chaîne retournée commencera au caractère numéro offset, dans la chaîne string. Le premier caractère est numéroté zéro. En effet, dans la chaîne 'abcdef', le caractère à la position 0 est 'a', le caractère à la position 2 est 'c', et ainsi de suite.

Si offset est négatif, la chaîne retournée commencera au caractère numéro offset à compter de la fin de la chaîne string.

Si string est plus petit que offset caractères de long, false sera retourné.

Exemple #1 Exemple de offset négatif

<?php
$rest = substr("abcdef", -1);    // retourne "f"
$rest = substr("abcdef", -2);    // retourne "ef"
$rest = substr("abcdef", -3, 1); // retourne "d"
?>

length

Si length est fourni et est positif, la chaîne retournée contiendra au plus length caractères, en commençant à partir du caractère offset (en fonction de la taille de la chaîne string).

Si length est fourni et négatif, alors le même nombre de caractères sera omis, en partant de la fin de la chaîne string. Si offset représente une position hors de la chaîne, false sera retournée.

Si le paramètre length est fourni et vaut 0, false ou null, une chaîne vide sera retournée.

Si length est omis, la sous chaine commençant à partir de offset jusqu'à la fin sera retournée.

Exemple #2 Utilisation d'une valeur négative pour length

<?php
$rest = substr("abcdef", 0, -1);  // retourne "abcde"
$rest = substr("abcdef", 2, -1);  // retourne "cde"
$rest = substr("abcdef", 4, -4);  // retourne false
$rest = substr("abcdef", -3, -1); // retourne "de"
?>

Valeurs de retour

Retourne la partie extraite de la chaîne string; ou false si une erreur survient ou une chaine vide.

Historique

Version | Description
8.0.0 | length est désormais nullable.
8.0.0 | Cette fonction retourne une chaîne vide où auparavant elle retournait false

Exemples

Exemple #3 Exemple avec substr()

<?php
echo substr('abcdef', 1);     // bcdef
echo substr('abcdef', 1, 3);  // bcd
echo substr('abcdef', 0, 4);  // abcd
echo substr('abcdef', 0, 8);  // abcdef
echo substr('abcdef', -1, 1); // f

// Accéder à un simple caractère dans une chaîne
// peut également être réalisé en utilisant des crochets
$string = 'abcdef';
echo $string[0];                 // a
echo $string[3];                 // d
echo $string[strlen($string)-1]; // f

?>

Exemple #4 Comportement du cast avec substr()

<?php
class apple {
    public function __toString() {
        return "green";
    }
}

echo "1) ".var_export(substr("pear", 0, 2), true).PHP_EOL;
echo "2) ".var_export(substr(54321, 0, 2), true).PHP_EOL;
echo "3) ".var_export(substr(new apple(), 0, 2), true).PHP_EOL;
echo "4) ".var_export(substr(true, 0, 1), true).PHP_EOL;
echo "5) ".var_export(substr(false, 0, 1), true).PHP_EOL;
echo "6) ".var_export(substr("", 0, 1), true).PHP_EOL;
echo "7) ".var_export(substr(1.2e3, 0, 4), true).PHP_EOL;
?>

Résultat de l'exemple ci-dessus en PHP 7 :

1) 'pe'
2) '54'
3) 'gr'
4) '1'
5) ''
6) ''
7) '1200'

Résultat de l'exemple ci-dessus en PHP 5 :

1) 'pe'
2) '54'
3) 'gr'
4) '1'
5) false
6) false
7) '1200'

Erreurs / Exceptions

Retourne false si une erreur survient.

<?php
var_dump(substr('a', 2)); // bool(false)
?>

Voir aussi

  • strrchr() - Trouve la dernière occurrence d'un caractère dans une chaîne
  • substr_replace() - Remplace un segment dans une chaîne
  • preg_match() - Effectue une recherche de correspondance avec une expression rationnelle standard
  • trim() - Supprime les espaces (ou d'autres caractères) en début et fin de chaîne
  • mb_substr() - Lit une sous-chaîne
  • wordwrap() - Effectue la césure d'une chaîne
  • Accès et modification d'une chaîne, par caractère

User Contributed Notes

man13or at hotmail dot fr 30-Oct-2019 08:01
Shortcuts :

Getting the first character of a string
substr($string, 1)

Getting the last character of a string
substr($string, -1)

Remove the first character of a string
substr($string,1)

Remove the last character of a string
substr($string, 0, -1)
Anonymous 15-Nov-2017 01:17
Be aware of a slight inconsistency between substr and mb_substr

mb_substr("", 4);      returns empty string

substr("", 4);              returns boolean false

tested in PHP 7.1.11 (Fedora 26) and PHP 5.4.16 (CentOS 7.4)
m.m.j.kronenburg 06-Sep-2016 10:46
<?php

/**
  * Returns and extracts the portion of string specified by the
  * start and length parameters from the original string.
  *
  * This function is simulair to function substr() except that it
  * removes the substring from the orignal string
  * (passed by reference).
  *
  * @param string $string      The input string.
  * @param integer $start      The start position (see substr() for
  *                            explanation).
  * @param integer $length     The length (see substr()
  *                            for explanation).
  * @return mixed              The substring or FALSE (see substr()
  *                            for explanation).
  **/
function substrex(&$string, $start, $length = PHP_INT_MAX)
{
  if($start > strlen($string)) { return false; }
  if(empty($length))           { return ''; }
  if($start < 0) { $start = max(0, $start + strlen($string)); }
  $end = ($length < 0) ?
    strlen($string) + $length :
    min(strlen($string), $start + $length);
  if($end < $start) { return false; }
  $length = $end - $start;
  $substr = substr($string, $start, $length);
  $string = substr($string, 0, $start).substr($string, $end);
  return $substr;
}

?>
Nadeem 03-Jun-2014 08:16
Truncate a float number. Similar to the Excel trunc function.

<?php
function truncate_number($val,$decimals=2){

        $number=array();
        $number=explode(".",$val);
        $result=0;

        if (count($number)>1){

            $result = $number[0] . "." . substr($number[1],0,$decimals);

        } else {

            $result = $val;

        }

        unset($number);

        return $result;
}

echo truncate_number(99.123456,2); //result = 99.12
echo truncate_number(99.123456,5); //result = 99.12345
echo truncate_number(99.123456,1); //result = 99.1
?>
fatihmertdogancan at hotmail dot com 26-Jan-2014 08:28
[English]
I created python similar accesing list or string with php substr & strrev functions.

Use: str($string,$pattern)

About the python pattern,
http://docs.python.org/release/1.5.1p1/tut/strings.html
http://effbot.org/zone/python-list.htm

About of pattern structures
[start:stop:step]

Example,
<?php
$s = "fatihmertdogancan";
echo str($s,"1:9:-2");
echo "<br/>";
echo str($s,"1:-3:-2");
echo "<br/>";
echo str($s,"1:-11:-5");
echo "<br/>";
echo str($s,"1:9:4");
?>

Output,
thetoacn
eht
aom
htan

This is function phpfiddle link: http://phpfiddle.org/main/code/e82-y5d

or source;

<?php
    function str($str,$pattern){
        //[start:stop:step]
        //pattern ->            ([-]?[0-9]*|\s):([-]?[0-9]*|\s):([-]?[0-9]*|\s)
        preg_match("/([-]?[0-9]*|\s?):([-]?[0-9]*|\s?):?([-]?[0-9]*|\s?)/", $pattern, $yakala);
        $start = $yakala[1];
        $stop = $yakala[2];
        $step = $yakala[3];

        if(empty($start) && empty($stop) && $step == "-1"){//istisna durum
            return strrev($str);
        }else if(empty($start) && empty($stop) && isset($step)){//istisna durum
            $rev = "";
            $yeni = "";
            if($step[0] == "-" && $stop != "-1"){$rev = "VAR";}
            $atla = abs($step);
            for($i = 0; $i <= strlen($str); $i++){
                $offset = $i*$atla;
                if(isset($str[$offset])){
                    $yeni = $yeni.$str[$offset];
                }
            }
            if($rev != "VAR"){
                return substr($yeni,0,strlen($str)-1);
                //"hepsi bos, step dolu o da +";
            }else{
                return strrev(substr($yeni,0,strlen($str)-1));
                //"hepsi bos, step dolu o da -";
            }
        }

        if(empty($start) && empty($stop) && empty($step)){
            return $str;
            //"hepsi bos";
        }else if(empty($start)){
            if(isset($stop) && empty($step)){
                $rev = "";
                if($stop[0] == "-"){$rev = "VAR";}
                if($rev != "VAR"){
                    return substr($str,0,$stop);
                    //"start ve step bos, stop dolu"
                }else{
                    return strrev(substr($str,0,$stop));
                    //"start ve step bos, stop -1";
                }
            }else if(isset($stop) && isset($step)){
                $rev = "";
                if($stop[0] == "-"){$rev = "VAR";}
                $yeni = "";
                if($step == 1){
                    if($rev != "VAR"){
                        return $str;
                        //"start bos, stop ve step dolu, step 1";
                    }else{
                        return strrev(substr($str,0,abs($stop))); //abs -> mutlak deger (-5 = 5)
                        //"start bos, stop -, step dolu, step 1";
                    }
                }else{
                    $atla = abs($step);
                    for($i = 0; $i <= strlen($str); $i++){
                        $offset = $i*$atla;
                        if(isset($str[$offset])){
                            $yeni = $yeni.$str[$offset];
                        }
                    }
                    if($rev != "VAR"){
                        return substr($yeni,0,$stop);
                        //"start bos, step ve stop dolu";
                    }else{
                        return strrev(substr($yeni,0,abs($stop)));
                        //"start bos, step ve stop -";
                    }
                }
            }
        //start bos degilse
        }else if(!empty($start)){
            if(isset($stop) && empty($step)){
                $rev = "";
                if($stop[0] == "-"){$rev = "VAR";}
                if($rev != "VAR"){
                    return substr($str,$start,$stop);
                    //return "step bos, start ve stop dolu";
                }else{
                    return strrev(substr($str,0,abs($stop)));
                    //"step bos, start ve stop dolu, stop -";
                }
            }else if(isset($stop) && isset($step)){

                //hepsi dolu
                $rev = "";
                if($stop[0] == "-"){$rev = "VAR";}
                $yeni = "";
                if($step == 1){
                    if($rev != "VAR"){
                        return substr($str,$start,$stop);
                        //"hepsi dolu, step 1";
                    }else{
                        return substr($str,$start,abs($stop));
                        //"hepsi dolu, step 1, stop -";
                    }
                }else{
                    if($stop[0] == "-"){$rev = "VAR";}
                    $atla = abs($step);
                    for($i = 0; $i <= strlen($str); $i++){
                        $offset = $i*$atla;
                        if(isset($str[$offset])){
                            $yeni = $yeni.$str[$offset];
                        }
                    }
                    if($rev != "VAR"){
                        return substr($yeni,$start,$stop);
                        //"hepsi dolu";
                    }else{
                        return strrev(substr($yeni,$start,abs($stop)));
                        //"hepsi dolu, stop -";
                    }
                }
            }
        }
    }
?>

Good works..
greg at apparel dot com 20-Nov-2013 05:28
Coming to PHP from classic ASP I am used to the Left() and Right() functions built into ASP so I did a quick PHPversion. hope these help someone else making the switch

function left($str, $length) {
    return substr($str, 0, $length);
}

function right($str, $length) {
    return substr($str, -$length);
}
biohazard dot ge at gmail dot com 15-Jul-2013 02:30
may be by following functions will be easier to extract the needed sub parts from a string:

<?php
after ('@', 'biohazard@online.ge');
//returns 'online.ge'
//from the first occurrence of '@'

before ('@', 'biohazard@online.ge');
//returns 'biohazard'
//from the first occurrence of '@'

between ('@', '.', 'biohazard@online.ge');
//returns 'online'
//from the first occurrence of '@'

after_last ('[', 'sin[90]*cos[180]');
//returns '180]'
//from the last occurrence of '['

before_last ('[', 'sin[90]*cos[180]');
//returns 'sin[90]*cos['
//from the last occurrence of '['

between_last ('[', ']', 'sin[90]*cos[180]');
//returns '180'
//from the last occurrence of '['
?>

here comes the source:

<?php

    function after ($this, $inthat)
    {
        if (!is_bool(strpos($inthat, $this)))
        return substr($inthat, strpos($inthat,$this)+strlen($this));
    };

    function after_last ($this, $inthat)
    {
        if (!is_bool(strrevpos($inthat, $this)))
        return substr($inthat, strrevpos($inthat, $this)+strlen($this));
    };

    function before ($this, $inthat)
    {
        return substr($inthat, 0, strpos($inthat, $this));
    };

    function before_last ($this, $inthat)
    {
        return substr($inthat, 0, strrevpos($inthat, $this));
    };

    function between ($this, $that, $inthat)
    {
        return before ($that, after($this, $inthat));
    };

    function between_last ($this, $that, $inthat)
    {
     return after_last($this, before_last($that, $inthat));
    };

// use strrevpos function in case your php version does not include it
function strrevpos($instr, $needle)
{
    $rev_pos = strpos (strrev($instr), strrev($needle));
    if ($rev_pos===false) return false;
    else return strlen($instr) - $rev_pos - strlen($needle);
};
?>
pugazhenthi k 18-Jan-2013 09:57
<?Php

### SUB STRING  BY WORD USING substr() and strpos()  #####

### THIS SCRIPT WILL RETURN PART OF STRING  WITHOUT WORD BREAK ###

$description = ‘your description here your description here your description here your description here your description here your description here your description hereyour description here your description here’  // your description here .

$no_letter = 30 ;

if(strlen($desctiption) > 30 )
{
     echo substr($description,0,strpos($description,’ ‘,30));             //strpos to find ‘ ‘ after 30 characters.
}
else {
     echo $description;
}

?>
pheagey at gmail dot com 15-Jun-2012 02:27
Using a 0 as the last parameter for substr().

As per examples
<?php $var = substr($var, 4); ?>

works no problem. However
<?php $var = substr($var, 4, 0); ?>

will get you nothing. Just a quick heads up
leon weidauer 08-Jul-2011 01:07
When using a value of a wrong type as second parameter , substr() does not return FALSE but NULL although the docs say, it should return FALSE on error.

Prior to PHP 5.3, substr() tries to cast the second parameter to int and doesn't throw any errors. Since PHP 5.3 a warning is thrown.
Quicker 06-May-2011 04:17
If you need to parse utf-8 strings char by char, try this one:

<?php
     $utf8marker=chr(128);
     $count=0;
     while(isset($string{$count})){
       if($string{$count}>=$utf8marker) {
         $parsechar=substr($string,$count,2);
         $count+=2;
       } else {
         $parsechar=$string{$count};
         $count++;
       }
       /* do what you like with parsechar ... , eg.:*/  echo $parsechar."<BR>\r\n";
     }
?>

- it works without mb_substr
- it is fast, because it grabs characters based on indexes  when possible and avoids any count and split functions
slow at acedsl dot com 28-Mar-2011 01:47
Anyone coming from the Python world will be accustomed to making substrings by using a "slice index" on a string.  The following function emulates basic Python string slice behavior. (A more elaborate version could be made to support array input as well as string, and the optional third "step" argument.)

<?php

function py_slice($input, $slice) {
    $arg = explode(':', $slice);
    $start = intval($arg[0]);
    if ($start < 0) {
        $start += strlen($input);
    }
    if (count($arg) === 1) {
        return substr($input, $start, 1);
    }
    if (trim($arg[1]) === '') {
        return substr($input, $start);
    }
    $end = intval($arg[1]);
    if ($end < 0) {
        $end += strlen($input);
    }
    return substr($input, $start, $end - $start);
}

print py_slice('abcdefg', '2') . "\n";
print py_slice('abcdefg', '2:4') . "\n";
print py_slice('abcdefg', '2:') . "\n";
print py_slice('abcdefg', ':4') . "\n";
print py_slice('abcdefg', ':-3') . "\n";
print py_slice('abcdefg', '-3:') . "\n";

?>

The $slice parameter can be a single character index, or a range separated by a colon. The start of the range is inclusive and the end is exclusive, which may be  counterintuitive. (Eg, py_slice('abcdefg', '2:4') yields 'cd' not 'cde'). A negative range value means to count from the end of the string instead of the beginning. Both the start and end of the range may be omitted; the start defaults to 0 and the end defaults to the total length of the input.

The output from the examples:
c
cd
cdefg
abcd
abcd
efg
nikolai dot wuestemann at t-online dot de 14-Jan-2011 08:56
If you want to have a string BETWEEN two strings, just use this function:

<?php
function get_between($input, $start, $end)
{
  $substr = substr($input, strlen($start)+strpos($input, $start), (strlen($input) - strpos($input, $end))*(-1));
  return $substr;
}

//Example:

$string = "123456789";
$a = "12";
$b = "9";

echo get_between($string, $a, $b);

//Output:
//345678
?>
Cristianlf 29-Oct-2010 02:10
I needed a function like lpad from oracle, or right from SQL
 then I use this code :

<?php
function right($string,$chars)
{
    $vright = substr($string, strlen($string)-$chars,$chars);
    return $vright;

}

    echo right('0r0j4152',4);
?>

Result:
 4152
------------------------------------------------
This function is really simple, I just wanted to share, maybe helps someone out there.

regards,
vnonov at gmail dot com / Viktor Nonov 28-Jan-2010 10:32
<?php

//removes string from the end of other

function removeFromEnd($string, $stringToRemove) {
    $stringToRemoveLen = strlen($stringToRemove);
    $stringLen = strlen($string);

    $pos = $stringLen - $stringToRemoveLen;

    $out = substr($string, 0, $pos);

    return $out;
}

$string = 'picture.jpg.jpg';
$string = removeFromEnd($string, '.jpg');
?>
gkhelloworld at gmail dot com 26-Jul-2009 03:39
Shortens the filename and its expansion has seen.

<?php
$file = "Hellothisfilehasmorethan30charactersandthisfayl.exe";

function funclongwords($file)
{
if (strlen($file) > 30)
{
$vartypesf = strrchr($file,".");
$vartypesf_len = strlen($vartypesf);
$word_l_w = substr($file,0,15);
$word_r_w = substr($file,-15);
$word_r_a = substr($word_r_w,0,-$vartypesf_len);

return $word_l_w."...".$word_r_a.$vartypesf;
}
else
return $file;
}
// RETURN: Hellothisfileha...andthisfayl.exe
?>
kaysar in ymail in com 07-Jun-2009 11:58
Drop extensions of a file (even from a file location string)

<?php

$filename = "c:/some dir/abc defg. hi.jklmn";

echo substr($filename, 0, (strlen ($filename)) - (strlen (strrchr($filename,'.'))));

?>

output: c:/some dir/abc defg. hi

Hope it may help somebody like me.. (^_^)
Andreas Bur (andreas dot buro at gmail dot com) 29-Apr-2009 06:25
For getting a substring of UTF-8 characters, I highly recommend mb_substr

<?php
        $utf8string = "cakeæøå";

        echo substr($utf8string,0,5);
        // output cake#
        echo mb_substr($utf8string,0,5,'UTF-8');
        //output cakeæ
?>
webmaster at oehoeboeroe dot nl 18-Apr-2009 02:07
You might expect substr('123456', 6) to return an empty string. Instead it returns boolean FALSE.

This behavior should be mentioned in the Return Values section of the manual. Instead it is only mentioned in the Parameters section.

If you need an empty string instead of a boolean FALSE you should typecast the result to a string.

<?php
$a = substr('123456', 6);              // equivalent to $a = FALSE
$a = (string) substr('123456', 6);   // equivalent to $a = '';
?>
link 21-Mar-2009 05:52
And as always there is bound to be a bug:

<?php
function strlen_entities($text)
{
    preg_match_all(
        '/((?:&(?:#[0-9]{2,}|[a-z]{2,});)|(?:[^&])|'.
        '(?:&(?!\w;)))s',$text,$textarray);
    return count($textarray[0]);
}
function substr_entities($text,$start,$limit=0)
{
    $return = '';
    preg_match_all(
        '/((?:&(?:#[0-9]{2,}|[a-z]{2,});)|(?:[^&])|'.
        '(?:&(?!\w;)))s',$text,$textarray);
    $textarray = $textarray[0];
    $numchars = count($textarray)-1;
    if ($start>=$numchars)
        return false;
    if ($start<0)
    {
        $start = ($numchars)+$start+1;
    }
    if ($start>=0)
    {
        if ($limit==0)
        {
            $end=$numchars;
        }
        elseif ($limit>0)
        {
            $end = $start+($limit-1);
        }
        else
        {
            $end = ($numchars)+$limit;
        }

        for ($i=$start;($i<=$end && isset($textarray[$i]));$i++)
        {
            $return .= $textarray[$i];
        }
        return $return;
    }
}
?>
link 20-Mar-2009 07:19
I created some functions for entity-safe splitting+lengthcounting:

<?php
function strlen_entities($text)
{
    preg_match_all(
        '/((?:&(?:#[0-9]{2,}|[a-z]{2,});)|(?:[^&])|'.
        '(?:&(?!\w;)))s',$text,$textarray);
    return count($textarray[0]);
}
function substr_entities($text,$start,$limit=0)
{
    $return = '';
    preg_match_all(
        '/((?:&(?:#[0-9]{2,}|[a-z]{2,});)|(?:[^&])|'.
        '(?:&(?!\w;)))s',$text,$textarray);
    $textarray = $textarray[0];
    $numchars = count($textarray)-1;
    if ($start>=$numchars)
        return false;
    if ($start<0)
    {
        $start = ($numchars)+$start+1;
    }
    if ($start>=0)
    {
        if ($limit==0)
        {
            $end=$numchars;
        }
        elseif ($limit>0)
        {
            $end = $start+($limit-1);
        }
        else
        {
            $end = ($numchars)+$limit;
        }

        for ($i=$start;$i<=$end;$i++)
        {
            $return .= $textarray[$i];
        }
        return $return;
    }
}
?>
mar dot czapla at gmail dot com 24-Oct-2008 02:31
Here we have gr8 function which simply convert ip address to a number using substr with negative offset.
You can need it if you want to compare some IP addresses converted to a numbers.
For example when using ip2country, or eliminating same range of ip addresses from your website :D

<?php

function ip2no($val)
{
    list($A,$B,$C,$D)    =    explode(".",$val);
    return
        substr("000".$A,-3).
        substr("000".$B,-3).
        substr("000".$C,-3).
        substr("000".$D,-3);
}

$min        =    ip2no("10.11.1.0");
$max        =    ip2no("111.11.1.0");
$visitor    =    ip2no("105.1.20.200");

if($min<$visitor && $visitor<$max)
    {    echo 'Welcome !';    }
else
    {    echo 'Get out of here !';    }

?>
post [at] jannik - zappe [dot] de 05-Aug-2008 07:59
Just a little function to cut a string by the wanted amount. Works in both directions.

<?php
function cutString($str, $amount = 1, $dir = "right")
{
  if(($n = strlen($str)) > 0)
  {
    if($dir == "right")
    {
      $start = 0;
      $end = $n-$amount;
    } elseif( $dir == "left") {
      $start = $amount;
      $end = $n;
    }

    return substr($str, $start, $end);
  } else return false;
}
?>

Enjoy ;)
kriskra at gmail dot com 29-Feb-2008 05:21
The javascript charAt equivalent in php of felipe has a little bug. It's necessary to compare the type (implicit) aswell or the function returns a wrong result:
<?php
function charAt($str,$pos) {
    return (substr($str,$pos,1) !== false) ? substr($str,$pos,1) : -1;
}
?>
Petez 31-Aug-2007 03:56
I wanted to work out the fastest way to get the first few characters from a string, so I ran the following experiment to compare substr, direct string access and strstr:

<?php
/* substr access */
beginTimer();
for ($i = 0; $i < 1500000; $i++){
    $opening = substr($string,0,11);
    if ($opening == 'Lorem ipsum'){
        true;
    }else{
        false;
    }
}
$endtime1 = endTimer();

/* direct access */
beginTimer();
for ($i = 0; $i < 1500000; $i++){
    if ($string[0] == 'L' && $string[1] == 'o' && $string[2] == 'r' && $string[3] == 'e' && $string[4] == 'm' && $string[5] == ' ' && $string[6] == 'i' && $string[7] == 'p' && $string[8] == 's' && $string[9] == 'u' && $string[10] == 'm'){
        true;
    }else{
        false;
    }
}
$endtime2 = endTimer();

/* strstr access */
beginTimer();
for ($i = 0; $i < 1500000; $i++){
    $opening = strstr($string,'Lorem ipsum');
    if ($opening == true){
        true;
    }else{
        false;
    }
}
$endtime3 = endTimer();

echo $endtime1."\r\n".$endtime2."\r\n".$endtime3;
?>

The string was 6 paragraphs of Lorem Ipsum, and I was trying match the first two words. The experiment was run 3 times and averaged. The results were:

(substr) 3.24
(direct access) 11.49
(strstr) 4.96

(With standard deviations 0.01, 0.02 and 0.04)

THEREFORE substr is the fastest of the three methods for getting the first few letters of a string.
egingell at sisna dot com 19-Oct-2006 03:19
<?php

/**
 * string substrpos(string $str, mixed $start [[, mixed $end], boolean $ignore_case])
 *
 * If $start is a string, substrpos will return the string from the position of the first occuring $start to $end
 *
 * If $end is a string, substrpos will return the string from $start to the position of the first occuring $end
 *
 * If the first character in (string) $start or (string) $end is '-', the last occuring string will be used.
 *
 * If $ignore_case is true, substrpos will not care about the case.
 * If $ignore_case is false (or anything that is not (boolean) true, the function will be case sensitive.
 *        Both of the above: only applies if either $start or $end are strings.
 *
 * echo substrpos('This is a string with 0123456789 numbers in it.', 5, '5');
 *        // Prints 'is a string with 01234';
 *
 * echo substrpos('This is a string with 0123456789 numbers in it.', '5', 5);
 *        // Prints '56789'
 *
 * echo substrpos('This is a string with 0123456789 numbers in it and two strings.', -60, '-string')
 *        // Prints 's is a string with 0123456789 numbers in it and two '
 *
 * echo substrpos('This is a string with 0123456789 numbers in it and two strings.', -60, '-STRING', true)
 *        // Prints 's is a string with 0123456789 numbers in it and two '
 *
 * echo substrpos('This is a string with 0123456789 numbers in it and two strings.', -60, '-STRING', false)
 *        // Prints 's is a string with 0123456789 numbers in it and two strings.'
 *
 * Warnings:
 *        Since $start and $end both take either a string or an integer:
 *            If the character or string you are searching $str for is a number, pass it as a quoted string.
 *        If $end is (integer) 0, an empty string will be returned.
 *        Since this function takes negative strings ('-search_string'):
 *            If the string your using in $start or $end is a '-' or begins with a '-' escape it with a '\'.
 *            This only applies to the *first* character of $start or $end.
 */

// Define stripos() if not defined (PHP < 5).
if (!is_callable("stripos")) {
    function stripos($str, $needle, $offset = 0) {
        return strpos(strtolower($str), strtolower($needle), $offset);
    }
}

function substrpos($str, $start, $end = false, $ignore_case = false) {
    // Use variable functions
    if ($ignore_case === true) {
        $strpos = 'stripos'; // stripos() is included above in case it's not defined (PHP < 5).
    } else {
        $strpos = 'strpos';
    }

    // If end is false, set it to the length of $str
    if ($end === false) {
        $end = strlen($str);
    }

    // If $start is a string do what's needed to make it an integer position for substr().
    if (is_string($start)) {
        // If $start begins with '-' start processing until there's no more matches and use the last one found.
        if ($start{0} == '-') {
            // Strip off the '-'
            $start = substr($start, 1);
            $found = false;
            $pos = 0;
            while(($curr_pos = $strpos($str, $start, $pos)) !== false) {
                $found = true;
                $pos = $curr_pos + 1;
            }
            if ($found === false) {
                $pos = false;
            } else {
                $pos -= 1;
            }
        } else {
            // If $start begins with '\-', strip off the '\'.
            if ($start{0} . $start{1} == '\-') {
                $start = substr($start, 1);
            }
            $pos = $strpos($str, $start);
        }
        $start = $pos !== false ? $pos : 0;
    }

    // Chop the string from $start to strlen($str).
    $str = substr($str, $start);

    // If $end is a string, do exactly what was done to $start, above.
    if (is_string($end)) {
        if ($end{0} == '-') {
            $end = substr($end, 1);
            $found = false;
            $pos = 0;
            while(($curr_pos = strpos($str, $end, $pos)) !== false) {
                $found = true;
                $pos = $curr_pos + 1;
            }
            if ($found === false) {
                $pos = false;
            } else {
                $pos -= 1;
            }
        } else {
            if ($end{0} . $end{1} == '\-') {
                $end = substr($end, 1);
            }
            $pos = $strpos($str, $end);
        }
        $end = $pos !== false ? $pos : strlen($str);
    }

    // Since $str has already been chopped at $start, we can pass 0 as the new $start for substr()
    return substr($str, 0, $end);
}

?>
Bradley from California 10-Jan-2006 01:34
Add on to (a function originally written by) "Matias from Argentina": str_format_number function.

Just added handling of $String shorter then $Format by adding a side to start the fill and a string length to the while loop.

<?php
function str_format_number($String, $Format, $Start = 'left'){
    //If we want to fill from right to left incase string is shorter then format
    if ($Start == 'right') {
        $String = strrev($String);
        $Format = strrev($Format);
    }
    if($Format == '') return $String;
    if($String == '') return $String;
    $Result = '';
    $FormatPos = 0;
    $StringPos = 0;
    while ((strlen($Format) - 1) >= $FormatPos && strlen($String) > $StringPos) {
        //If its a number => stores it
        if (is_numeric(substr($Format, $FormatPos, 1))) {
            $Result .= substr($String, $StringPos, 1);
            $StringPos++;
            //If it is not a number => stores the caracter
        } else {
            $Result .= substr($Format, $FormatPos, 1);
        }
        //Next caracter at the mask.
        $FormatPos++;
    }
    if ($Start == 'right') $Result = strrev($Result);
    return $Result;
}
?>
frank at jkelloggs dot dk 25-Jul-2005 02:37
Regarding the utf8_substr function from lmak: The pattern '/./u' doesn't match newline characters. This means that the substring from 0 to the total length of the string will miss the number of characters in the end matching the number of newlines in the string. To fix this one can add the s modifier (PCRE_DOTALL) in the pattern:

<?php
function utf8_substr($str,$start)
{
   preg_match_all("/./su", $str, $ar);

   if(func_num_args() >= 3) {
       $end = func_get_arg(2);
       return join("",array_slice($ar[0],$start,$end));
   } else {
       return join("",array_slice($ar[0],$start));
   }
}
?>
php_net at thomas dot trella dot de 29-Jun-2005 08:07
I needed to cut a string after x chars at a  html converted utf-8 text (for example Japanese text like &#23344;&#35632;&#24368;&#33072;&#27440;&#32591;).
The problem was, the different length of the signs, so I wrote the following function to handle that.
Perhaps it helps.

<?php

function html_cutstr ($str, $len)
{
    if (!preg_match('/\&#[0-9]*;.*/i', $str))
    {
        $rVal = strlen($str, $len);
        break;
    }

    $chars = 0;
    $start = 0;
    for($i=0; $i < strlen($str); $i++)
    {
        if ($chars >= $len)
        break;

        $str_tmp = substr($str, $start, $i-$start);
        if (preg_match('/\&#[0-9]*;.*/i', $str_tmp))
        {
            $chars++;
            $start = $i;
        }
    }
    $rVal = substr($str, 0, $start);
    if (strlen($str) > $start)
    $rVal .= " ...";
    return $rVal;
}
?>
ivanhoe011 at gmail dot com 07-Jun-2005 08:31
If you need just a single character from the string you don't need to use substr(), just use curly braces notation:

<?php
    // both lines will output the 3rd character
    echo substr($my_string, 2, 1);
    echo $my_string{2};
?>

curly braces syntax is faster and more readable IMHO..
rob NOSPAM at clancentric dot net 07-Jun-2005 03:43
I have developed a function with a similar outcome to jay's

Checks if the last character is or isnt a space. (does it the normal way if it is)
It explodes the string into an array of seperate works, the effect is... it chops off anything after and including the last space.

<?php
function limit_string($string, $charlimit)
{
    if(substr($string,$charlimit-1,1) != ' ')
    {
        $string = substr($string,'0',$charlimit);
        $array = explode(' ',$string);
        array_pop($array);
        $new_string = implode(' ',$array);

        return $new_string.'...';
    }
    else
    {
        return substr($string,'0',$charlimit-1).'...';
    }
}
?>
bleakwind at msn dot com 25-May-2005 10:11
This returns the portion of str specified by the start and length parameters..
It can performs multi-byte safe on number of characters. like mb_strcut() ...

Note:
1.Use it like this bite_str(string str, int start, int length [,byte of on string]);
2.First character's position is 0. Second character position is 1, and so on...
3.$byte is one character length of your encoding, For example: utf-8 is "3", gb2312 and big5 is "2"...you can use the function strlen() get it...
Enjoy it :) ...

--- Bleakwind
QQ:940641
http://www.weaverdream.com

PS:I'm sorry my english is too poor... :(

<?php
// String intercept By Bleakwind
// utf-8:$byte=3 | gb2312:$byte=2 | big5:$byte=2
function bite_str($string, $start, $len, $byte=3)
{
    $str     = "";
    $count   = 0;
    $str_len = strlen($string);
    for ($i=0; $i<$str_len; $i++) {
        if (($count+1-$start)>$len) {
            $str  .= "...";
            break;
        } elseif ((ord(substr($string,$i,1)) <= 128) && ($count < $start)) {
            $count++;
        } elseif ((ord(substr($string,$i,1)) > 128) && ($count < $start)) {
            $count = $count+2;
            $i     = $i+$byte-1;
        } elseif ((ord(substr($string,$i,1)) <= 128) && ($count >= $start)) {
            $str  .= substr($string,$i,1);
            $count++;
        } elseif ((ord(substr($string,$i,1)) > 128) && ($count >= $start)) {
            $str  .= substr($string,$i,$byte);
            $count = $count+2;
            $i     = $i+$byte-1;
        }
    }
    return $str;
}

// Test
$str = "123456?????123456?????123456???????";
for($i=0;$i<30;$i++){
    echo "<br>".bite_str($str,$i,20);
}
?>
fanfatal at fanfatal dot pl 16-May-2005 11:45
Hmm ... this is a script I wrote, whitch is very similar to substr, but it isn't takes html and bbcode for counting and it takes portion of string and show avoided (html & bbcode) tags too ;]
Specially usefull for show part of serach result included html and bbcode tags

<?php

/**
 * string csubstr ( string string, int start [, int length] )
 *
 * @author FanFataL
 * @param string string
 * @param int start
 * @param [int length]
 * @return string
 */
function csubstr($string, $start, $length=false) {
    $pattern = '/(\[\w+[^\]]*?\]|\[\/\w+\]|<\w+[^>]*?>|<\/\w+>)/i';
    $clean = preg_replace($pattern, chr(1), $string);
    if(!$length)
        $str = substr($clean, $start);
    else {
        $str = substr($clean, $start, $length);
        $str = substr($clean, $start, $length + substr_count($str, chr(1)));
    }
    $pattern = str_replace(chr(1),'(.*?)',preg_quote($str));
    if(preg_match('/'.$pattern.'/is', $string, $matched))
        return $matched[0];
    return $string;
}

?>

Using this is similar to simple substr.

Greatings ;]
...
woutermb at gmail dot com 21-Mar-2005 11:19
Well this is a script I wrote, what it does is chop up long words with malicious meaning into several parts. This way, a chat in a table will not get stretched anymore.

<?php

function text($string,$limit=20,$chop=10){

$text = explode(" ",$string);
while(list($key, $value) = each($text)){
    $length = strlen($value);
    if($length >=20){
        for($i=0;$i<=$length;$i+=10){
            $new .= substr($value, $i, 10);
            $new .= " ";
        }
         $post .= $new;
    }
    elseif($length <=15){
        $post .= $value;
    }
    $post .= " ";
}
return($post);
}

// for example, this would return:
$output = text("Well this text doesn't get cut up, yet thisssssssssssssssssssssssss one does.", 10, 5);

echo($output); // "Well this text doesn't get cup up, yet thiss sssss sssss sssss sssss sss one does."
?>

I hope it was useful.. :)
steve at unicycle dot co dot nz 13-Mar-2005 09:34
To quickly trim an optional trailing slash off the end of a path name:

if (substr( $path, -1 ) == '/') $path = substr( $path, 0, -1 );


Supprime les espaces (ou d'autres caractères) en début et fin de chaîne

  • « substr
  • ucfirst »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Supprime les espaces (ou d'autres caractères) en début et fin de chaîne

trim

(PHP 4, PHP 5, PHP 7, PHP 8)

trim — Supprime les espaces (ou d'autres caractères) en début et fin de chaîne

Description

trim ( string $string , string $characters = " \n\r\t\v\0" ) : string

trim() retourne la chaîne string, après avoir supprimé les caractères invisibles en début et fin de chaîne. Si le second paramètre characters est omis, trim() supprimera les caractères suivants :

  • " " (ASCII 32 (0x20)), un espace ordinaire.
  • "\t" (ASCII 9 (0x09)), une tabulation.
  • "\n" (ASCII 10 (0x0A)), une nouvelle ligne (line feed).
  • "\r" (ASCII 13 (0x0D)), un retour chariot (carriage return).
  • "\0" (ASCII 0 (0x00)), le caractère NUL.
  • "\v" (ASCII 11 (0x0B)), une tabulation verticale.

Liste de paramètres

string

La chaîne de caractères qui sera coupée.

characters

Optionnellement, les caractères supprimés peuvent aussi être spécifiés en utilisant le paramètre characters. Listez simplement tous les caractères que vous voulez supprimer. Avec .. vous pouvez spécifier une plage de caractères.

Valeurs de retour

La chaîne de caractères coupée.

Exemples

Exemple #1 Exemple avec trim()

<?php

$text   = "\t\tThese are a few words :) ...  ";
$binary = "\x09Example string\x0A";
$hello  = "Hello World";
var_dump($text, $binary, $hello);

print "\n";

$trimmed = trim($text);
var_dump($trimmed);

$trimmed = trim($text, " \t.");
var_dump($trimmed);

$trimmed = trim($hello, "Hdle");
var_dump($trimmed);

$trimmed = trim($hello, 'HdWr');
var_dump($trimmed);

// Supprime les caractères de contrôle ASCII au début et à la fin de $binary
// (de 0 à 31 inclusif)
$clean = trim($binary, "\x00..\x1F");
var_dump($clean);

?>

L'exemple ci-dessus va afficher :

string(32) "        These are a few words :) ...  "
string(16) "    Example string
"
string(11) "Hello World"

string(28) "These are a few words :) ..."
string(24) "These are a few words :)"
string(5) "o Wor"
string(9) "ello Worl"
string(14) "Example string"

Exemple #2 Suppression de caractères dans un tableau avec trim()

<?php
function trim_value(&$value)
{
    $value = trim($value);
}

$fruit = array('apple','banana ', ' cranberry ');
var_dump($fruit);

array_walk($fruit, 'trim_value');
var_dump($fruit);

?>

L'exemple ci-dessus va afficher :

array(3) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(7) "banana "
  [2]=>
  string(11) " cranberry "
}
array(3) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(6) "banana"
  [2]=>
  string(9) "cranberry"
}

Notes

Note: Utilisation possible : suppression des caractères en milieu de chaîne

En raison du fait que la fonction trim() supprime des caractères en début et en fin de chaîne, ce peut être confus lorsque les caractères sont (ou pas) supprimés depuis le milieu. trim('abc', 'bad') supprime à la fois 'a' et 'b' car la fonction supprime 'a', puis, déplace 'b' en début de chaîne, qui sera également supprimé. Aussi, c'est la raison pour laquelle la fonction "marche" alors que trim('abc', 'b') ne fonctionne pas.

Voir aussi

  • ltrim() - Supprime les espaces (ou d'autres caractères) de début de chaîne
  • rtrim() - Supprime les espaces (ou d'autres caractères) de fin de chaîne
  • str_replace() - Remplace toutes les occurrences dans une chaîne

User Contributed Notes

roger21 at free dot fr 04-Apr-2019 11:02
It is worth mentioning that trim, ltrim and rtrim are NOT multi-byte safe, meaning that trying to remove an utf-8 encoded non-breaking space for instance will result in the destruction of utf-8 characters than contain parts of the utf-8 encoded non-breaking space, for instance:

non breaking-space is "\u{a0}" or "\xc2\xa0" in utf-8, "µ" is "\u{b5}" or "\xc2\xb5" in utf-8 and "à" is "\u{e0}" or "\xc3\xa0" in utf-8

$input = "\u{a0}µ déjà\u{a0}"; // " µ déjà "
$output = trim($input, "\u{a0}"); // "¦ déj¦" or whatever how the interpretation of broken utf-8 characters is performed

$output got both "\u{a0}" characters removed but also both "µ" and "à" characters destroyed
igor dot pellegrini at berlinonline dot de 04-Apr-2019 10:36
Beware with trimming apparently innocent characters. It is NOT a Unicode-safe function:

<?php
echo trim('˜ [Approximation sign]', '– [en-dash]');  // ?? [Approximation sig
?>

The en-dash here is breaking the Unicode characters.

And also prevents the open-square-bracket from being seen as part of the characters to trim on the left side, letting it untouched in the resulting string.
Mark-Centurion at ya dot ru 16-Feb-2019 05:54
utf-8:
trim($text, " \t\n\r\0\x0B\xC2\xA0");
solaimanshah059 at gmail dot com 18-Aug-2018 10:02
Simple Example I hope you will understand easily:

<?php

// Inserting empty variable;

$name = "";

if( !(empty( $name )) )
{
   $sql = "INSERT INTO `users`( name ) VALUE( '$name' );";
}

// But is not empty that will be inserted but space

$name2 = "     ";

if( !(empty( $name )) )
{
   $sql = "INSERT INTO `users`( name ) VALUE( '$name' );";
}

// Now that will not be inserted by using trim() function

$name3 = "     ";

if( !(empty( trim($name) )) )
{
   $sql = "INSERT INTO `users`( name ) VALUE( '$name' );";
}

?>
aalhad at NOSPAM dot gmail dot com 11-Jan-2018 11:28
When specifying the character mask,
make sure that you use double quotes

<?php
  $hello = "
      Hello World   "; //here is a string with some trailing and leading whitespace

  $trimmed_correct   = trim($hello, " \t\n\r"); //<--------OKAY
  $trimmed_incorrect = trim($hello, ' \t\n\r'); //<--------NOT AS EXPECTED

  print("----------------------------");
  print("TRIMMED OK:".PHP_EOL);
  print_r($trimmed_correct.PHP_EOL);
  print("----------------------------");
  print("TRIMMING NOT OK:".PHP_EOL);
  print_r($trimmed_incorrect.PHP_EOL);
  print("----------------------------".PHP_EOL);
?>

Here is the output:

----------------------------TRIMMED OK:
Hello World
----------------------------TRIMMING NOT OK:

      Hello World
----------------------------
johovich at yandex dot ru 30-Jul-2017 10:17
trim is the fastest way to remove first and last char.

Benchmark comparsion 4 different ways to trim string with  '/'
4 functions with the same result - array exploded by '/'

<?php
$s = '/catalog/lyustry/svet/dom-i-svet/';

$times = 100000;

print cycle("str_preg('$s');", $times);
print cycle("str_preg2('$s');", $times);
print cycle("str_sub_replace('$s');", $times);
print cycle("str_trim('$s');", $times);
print cycle("str_clear('$s');", $times);

//print_r(str_preg2($s));

function cycle($function, $times){
    $count = 0;
    if($times < 1){
        return false;
    }
    $start = microtime(true);
    while($times > $count){
        eval($function);
        $count++;
    }
    $end = microtime(true) - $start;
    return "\n $function exec time: $end";
}

function str_clear($s){
    $s = explode('/', $s);
    $s = array_filter($s, function ($s){if(!empty($s)) return true;});
    return $s;
}

function str_preg2($s){
    $s = preg_replace('/((?<!.)\/(?=.))?((?<=.)\/(?!.))?/i', '', $s);
    $s = explode('/', $s);
    return $s;
}

function str_preg($s){
    $s = preg_replace('/^(\/?)(.*?)(\/?)$/i', '$2', $s);
    $s = explode('/', $s);
    return $s;
}

function str_sub_replace($s){
    $s = str_replace('/' , '' , mb_substr( $s , 0, 1)) . mb_substr( $s , 1, -1) . str_replace('/', '', mb_substr(  $s , -1));
    $s = explode('/', $s);
    return $s;
}

function str_trim($s){
    $s = trim($s, '/');
    $s = explode('/', $s);
    return $s;
}
tongcheong77 at gmail dot com 09-Jul-2017 12:39
if you are using trim and you still can't remove the whitespace then check if your closing tag inside the html document is NOT at the next line.

<textarea class="form-control" rows="5"><?php echo trim($comment);?></textarea>

there should be no spaces at the beginning and end of your echo statement, else trim will not work as expected.
ivijan dot stefan at gmail dot com 03-Jul-2017 09:06
Standard trim() functions can be a problematic when come HTML entities. That's why i wrote "Super Trim" function what is used to handle with this problem and also you can choose is trimming from the begin, end or booth side of string.
<?php
function strim($str,$charlist=" ",$option=0){
    if(is_string($str))
    {
        // Translate HTML entities
        $return = strtr($str, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES)));
        // Remove multi whitespace
        $return = preg_replace("@\s+\s@Ui"," ",$return);
        // Choose trim option
        switch($option)
        {
            // Strip whitespace (and other characters) from the begin and end of string
            default:
            case 0:
                $return = trim($return,$charlist);
            break;
            // Strip whitespace (and other characters) from the begin of string
            case 1:
                $return = ltrim($return,$charlist);
            break;
            // Strip whitespace (and other characters) from the end of string
            case 2:
                $return = rtrim($return,$charlist);
            break;

        }
    }
    return $return;
}
?>
Anonymous 11-Jun-2017 04:45
The comment of "ludko2 at gmail dot com" for trimming non-breaking spaces is wrong due the the way UTF-8 works. For example, it breaks on `"&nbsp;abà"`.
jianglong at qiyi dot com 13-May-2015 08:09
Trim full width space will return mess character,  when target string starts with '«'

@example
echo trim("«", " ");

@return
?

php version 5.4.27

[EDIT by cmb AT php DOT net: it is not necessarily safe to use trim with multibyte character encodings. The given example is equivalent to echo trim("\xe3\80\8a", "\xe3\x80\x80").]
ludko2 at gmail dot com 09-Jul-2010 02:28
Non-breaking spaces can be troublesome with trim:

<?php
// turn some HTML with non-breaking spaces into a "normal" string
$myHTML = "&nbsp;abc";
$converted = strtr($myHTML, array_flip(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES)));

// this WILL NOT work as expected
// $converted will still appear as " abc" in view source
// (but not in od -x)
$converted = trim($converted);

// &nbsp; are translated to 0xA0, so use:
$converted = trim($converted, "\xA0"); // <- THIS DOES NOT WORK

// EDITED>>
// UTF encodes it as chr(0xC2).chr(0xA0)
$converted = trim($converted,chr(0xC2).chr(0xA0)); // should work

// PS: Thanks to John for saving my sanity!
?>
Piopier 12-Jan-2007 06:06
It may be useful to know that trim() returns an empty string when the argument is an unset/null variable.
dmr37 at cornell dot edu 17-May-2005 12:47
If you want to check whether something ONLY has whitespaces, use the following:

<?php

if (trim($foobar)=='') {
   echo 'The string $foobar only contains whitespace!';
}

?>
Hayley Watson 07-Feb-2005 04:46
Another way to trim all the elements of an array
<?php
$newarray = array_map('trim', $array);
?>
jubi at irc dot pl 20-Apr-2004 06:48
To remove multiple occurences of whitespace characters in a string an convert them all into single spaces, use this:

<?

$text = preg_replace('/\s+/', ' ', $text);

?>

------------
JUBI
http://www.jubi.buum.pl
HW 05-Jun-2003 06:32
You can combine character ranges and individual characters in trim()'s second argument (ditto for ltrim and rtrim). All of the specified characters and ranges will be used concurrently (i.e., if a character on either end of the string matches any of the specified charaters or character ranges, it will be trimmed). The characters and character ranges can be in any order (except of course that the character ranges need to be specified in increasing order) and may overlap.
E.g., trim any nongraphical non-ASCII character:
trim($text,"\x7f..\xff\x0..\x1f");


Met le premier caractère en majuscule

  • « trim
  • ucwords »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Met le premier caractère en majuscule

ucfirst

(PHP 4, PHP 5, PHP 7, PHP 8)

ucfirst — Met le premier caractère en majuscule

Description

ucfirst ( string $string ) : string

Retourne la chaîne string après avoir remplacé le premier caractère par sa majuscule, si le premier caractère est alphabétique.

Notez que la notion d'"alphabétique" est déterminée par la configuration de localisation. Cela signifie que pour la configuration par défaut "C", les caractères tels que les voyelles accentuées (comme é, è ou à) ne seront pas converties.

Liste de paramètres

string

La chaîne d'entrée.

Valeurs de retour

Retourne la chaîne après modification.

Exemples

Exemple #1 Exemple avec ucfirst()

<?php
$foo = 'bonjour tout le monde!';
$foo = ucfirst($foo);             // Bonjour tout le monde!

$bar = 'BONJOUR TOUT LE MONDE!';
$bar = ucfirst($bar);             // BONJOUR TOUT LE MONDE!
$bar = ucfirst(strtolower($bar)); // Bonjour tout le monde!
?>

Voir aussi

  • lcfirst() - Met le premier caractère en minuscule
  • strtolower() - Renvoie une chaîne en minuscules
  • strtoupper() - Renvoie une chaîne en majuscules
  • ucwords() - Met en majuscule la première lettre de tous les mots

User Contributed Notes

Ekin 31-Aug-2020 10:39
Using this function for Turkish language is won't work because of multi-byte characters. But you can use some tricks:

<?php
function ucfirst_tr($str) {
    $trMap = ['G'=>'g','Ü'=>'ü','S'=>'s','I'=>'i','Ö'=>'ö','Ç'=>'ç','I'=>'i'];
    $str = mb_strtolower(strtr($str, $trMap));
    $first = mb_substr($str, 0, 1);
    $first = strtr($first, array_flip($trMap));
    $first = mb_strtoupper($first);
    return $first . mb_substr($str, 1);
}
?>
divinity76 at gmail dot com 18-Nov-2019 12:59
here is how mb_ucfirst should be implemented in userland

<?php

function mb_ucfirst(string $str, string $encoding = null): string
{
    if ($encoding === null) {
        $encoding = mb_internal_encoding();
    }
    return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding) . mb_substr($str, 1, null, $encoding);
}
?>

(when i wrote this comment, everybody else's attempt got it wrong for one reason or another, for example: some don't allow you to specify encoding, and some defaulted to utf-8 instead of defaulting to mb_internal_encoding() )
Anonymous 23-Aug-2017 12:48
Format the input string:

<?php

function ucsentences($string){
    $parts = preg_split('/([^\.\!\?;]+[\.\!\?;"]+)/', strtolower($string), (-1), PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
    $r = '';
    foreach($parts as $key=>$sentence){
        $r .= ucfirst(trim($sentence)) . ' ';
    }
    $r = preg_replace('/\bi\b/', 'I', $r);
    $r = preg_replace_callback('/("[a-z])/', function($m){ return strtoupper($m[0]);}, $r);
    return rtrim($r);
}

$str = 'i\'m not sure. if this is good enough, but i thought: "hey, who know\'s. maybe i am right."';

?>
Outputs:
I'm not sure. If this is good enough, but I thought: "Hey, who know's. Maybe I am right."
nospam at nospam dot com 22-Feb-2017 07:46
Improved method of capitalizing first characters of sentences.
The first two manipulations (double spaces & all caps) are optional so can be removed without harm.

<?php
// return string with first letters of sentences capitalized
function ucsentence($str) {
  if ($str) { // input
    $str = preg_replace('/'.chr(32).chr(32).'+/', chr(32), $str); // recursively replaces all double spaces with a space
    if (($x = substr($str, 0, 10)) && ($x == strtoupper($x))) $str = strtolower($str); // sample of first 10 chars is ALLCAPS so convert $str to lowercase; if always done then any proper capitals would be lost
    $na = array('. ', '! ', '? '); // punctuation needles
    foreach ($na as $n) { // each punctuation needle
      if (strpos($str, $n) !== false) { // punctuation needle found
        $sa = explode($n, $str); // split
        foreach ($sa as $s) $ca[] = ucfirst($s); // capitalize
        $str = implode($n, $ca); // replace $str with rebuilt version
        unset($ca); //  clear for next loop
      }
    }
    return ucfirst(trim($str)); // capitalize first letter in case no punctuation needles found
  }
}
?>

"heLLo EarthLing!" >> "HeLLo EarthLing!"
"I'M MOSTLY. caps!  " >> "I'm mostly. Caps!"
"ALLCAPS" >> "Allcaps"
"i haVe neST.ed punct,u.ation!  sp    A  c es.  and CAPs..  " >> "I haVe neST.ed punct,u.ation! Sp A c es. And CAPs.."
kiprasbal at gmail dot com 16-May-2014 06:34
My version, converst first letter of the first word in the string to uppercase

public function mb_ucfirst($str) {
        $aParts = explode(" ",$str);
        $firstWord = mb_convert_case($aParts[0],MB_CASE_TITLE,"UTF-8");
        unset($aParts[0]);

        return $firstWord." ".implode(" ",$aParts);
    }
mingalevme at gmail dot com 05-Dec-2013 10:32
Implementation of multi-bytes ucfirst for "multiword"-strings (module mbstring is required):

<?php

public static function ucfirst($str)
{
    $str = mb_strtolower($str);
    $words = preg_split('/\b/u', $str, -1, PREG_SPLIT_NO_EMPTY);
    foreach ($words as $word) {
        $ucword = mb_strtoupper(mb_substr($word, 0, 1)) . mb_substr($word, 1);
        $str = str_replace($word, $ucword, $str);
    }
    return $str;
}

?>
Nethor 05-Oct-2012 04:14
Simple but workable solution:

<?php
mb_internal_encoding("UTF-8");  // before calling the function

function utf8_ucfirst($str){
    preg_match_all("~^(.)(.*)$~u", $str, $arr);
    return mb_strtoupper($arr[1][0]).$arr[2][0];
    }
?>
idont at remember dot it 18-May-2012 11:21
In case you need a French version of ucfirst:

"été indien" => "Eté indien"
"ça va?" => "Ça va?"

<?php
function frenchUcfirst($v) {
  $lowCase  = "\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE7\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF";
  $lowCase .= "\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFF\\u0161";
  $upperCase = "AAAAAA\\xC7EEEEIIIINOOOOOOUUUUYYS";
  return strtoupper(strtr(substr($v, 0, 1), $lowCase, $upperCase)) . substr($v, 1);
}
?>

Note:
- Latin non french accented characters follow the same rule:
"ändå" => "Andå"
- Non ASCII characters in the function are in HEX format to avoid encoding issue...
qeremy [atta] gmail [dotta] com 27-Feb-2012 04:41
A proper Turkish solution;

<?php
function ucfirst_turkish($str) {
    $tmp = preg_split("//u", $str, 2, PREG_SPLIT_NO_EMPTY);
    return mb_convert_case(
        str_replace("i", "I", $tmp[0]), MB_CASE_TITLE, "UTF-8").
        $tmp[1];
}

$str = "iyilik güzelLIK";
echo ucfirst($str) ."\n";   // Iyilik güzelLIK
echo ucfirst_turkish($str); // Iyilik güzelLIK
?>
vlknmtn at gmail dot com 17-Aug-2011 04:31
Turkish solution:

<?php
mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");

function tr_ilkbuyuk($text)
{
    $text = str_replace("I","i",$text);
    $text = mb_strtolower($text, 'UTF-8');

    if($text[0] == "i")
        $tr_text = "I".substr($text, 1);
    else
        $tr_text = mb_convert_case($text, MB_CASE_TITLE, "UTF-8");

    return trim($tr_text);
}

function tr_ucwords($text)
{
    $p = explode(" ",$text);
    if(is_array($p))
    {
        $tr_text = "";
        foreach($p AS $item)
            $tr_text .= " ".tr_ilkbuyuk($item);

        return trim($tr_text);
    }
    else
        return tr_ilkbuyuk($text);
}

$deger = "iisllslsdg";

echo tr_ucwords($deger);

?>
Quicker 10-May-2011 01:53
if you want to ucfirst for utf8 try this one:

<?php
function ucfirst_utf8($stri){
 if($stri{0}>="\xc3")
     return (($stri{1}>="\xa0")?
     ($stri{0}.chr(ord($stri{1})-32)):
     ($stri{0}.$stri{1})).substr($stri,2);
 else return ucfirst($stri);
}
?>

It is quick, not language (but utf8) dependend and does not use any mb-functions such as mb_ucfirst.
pete at namecube dot net 11-Apr-2010 07:08
for anyone wanting to ucfirst each word in a sentence this works for me:

<?php
function ucfirst_sentence($str)
{
    return preg_replace('/\b(\w)/e', 'strtoupper("$1")', $str);
}
?>
wilfried dot loche at fr dot adp dot com 22-Jan-2010 02:22
If someone looks for the equivalent on Oracle DB, here it is: INITCAP. Hope this helps!
octavius 26-Sep-2009 05:18
For lithuanian text with utf-8 encoding I use two functions (thanks [mattalexxpub at gmail dot com] and Svetoslav Marinov)

<?php
function my_ucfirst($string, $e ='utf-8') {
    if (function_exists('mb_strtoupper') && function_exists('mb_substr') && !empty($string)) {
        $string = mb_strtolower($string, $e);
        $upper = mb_strtoupper($string, $e);
            preg_match('#(.)#us', $upper, $matches);
            $string = $matches[1] . mb_substr($string, 1, mb_strlen($string, $e), $e);
    }
    else {
        $string = ucfirst($string);
    }
    return $string;
}

function sentence_case($string) {
    $sentences = preg_split('/([.?!]+)/', $string, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
    $new_string = '';
    foreach ($sentences as $key => $sentence) {
        $new_string .= ($key & 1) == 0?
            my_ucfirst(strtolower(trim($sentence))) :
            $sentence.' ';
    }
    return trim($new_string);
}
?>
bgschool 30-Jul-2009 04:39
Simple function for use ucfirst with utf-8 encoded cyrylic text

<?php
    public function capitalize_first($str) {
        $line = iconv("UTF-8", "Windows-1251", $str); // convert to windows-1251
        $line = ucfirst($line);
        $line = iconv("Windows-1251", "UTF-8", $line); // convert back to utf-8

        return $line;
    }
?>
svetoslavm at gmail dot com 20-Nov-2008 07:40
For some reason this worked for me.

Mac OS 10.5.1
PHP 5.2.6

<?php
   /**
     * ucfirst UTF-8 aware function
     *
     * @param string $string
     * @return string
     * @see http://ca.php.net/ucfirst
     */
    function my_ucfirst($string, $e ='utf-8') {
        if (function_exists('mb_strtoupper') && function_exists('mb_substr') && !empty($string)) {
            $string = mb_strtolower($string, $e);
            $upper = mb_strtoupper($string, $e);
            preg_match('#(.)#us', $upper, $matches);
            $string = $matches[1] . mb_substr($string, 1, mb_strlen($string, $e), $e);
        } else {
            $string = ucfirst($string);
        }
        return $string;
    }
?>

Svetoslav Marinov
http://slavi.biz
mattalexxpub at gmail dot com 09-Nov-2008 05:10
This is what I use for converting strings to sentence case:

<?php
function sentence_case($string) {
    $sentences = preg_split('/([.?!]+)/', $string, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
    $new_string = '';
    foreach ($sentences as $key => $sentence) {
        $new_string .= ($key & 1) == 0?
            ucfirst(strtolower(trim($sentence))) :
            $sentence.' ';
    }
    return trim($new_string);
}

print sentence_case('HMM. WOW! WHAT?');

// Outputs: "Hmm. Wow! What?"
?>
prokur.net - there is my email 29-Jun-2008 03:01
I believe that mb_ucfirst will be soon added in PHP, but for now this could be useful
<?php

if (!function_exists('mb_ucfirst') && function_exists('mb_substr')) {
    function mb_ucfirst($string) {
        $string = mb_strtoupper(mb_substr($string, 0, 1)) . mb_substr($string, 1);
        return $string;
    }
}

?>

it also check is mb support enabled or not
charliefortune 20-Feb-2008 03:48
Here's a function to capitalize segments of a name, and put the rest into lower case. You can pass the characters you want to use as delimiters.

i.e. <?php echo nameize("john o'grady-smith"); ?>

returns John O'Grady-Smith

<?php

function nameize($str,$a_char = array("'","-"," ")){
    //$str contains the complete raw name string
    //$a_char is an array containing the characters we use as separators for capitalization. If you don't pass anything, there are three in there as default.
    $string = strtolower($str);
    foreach ($a_char as $temp){
        $pos = strpos($string,$temp);
        if ($pos){
            //we are in the loop because we found one of the special characters in the array, so lets split it up into chunks and capitalize each one.
            $mend = '';
            $a_split = explode($temp,$string);
            foreach ($a_split as $temp2){
                //capitalize each portion of the string which was separated at a special character
                $mend .= ucfirst($temp2).$temp;
                }
            $string = substr($mend,0,-1);
            }
        }
    return ucfirst($string);
    }

?>
webmaster at onmyway dot cz 11-Feb-2008 03:31
Inspired by the lcfirst function a simple mb_lcfirst to cope with multibyte strings:

<?php
function mb_lcfirst($str, $enc = null)
{
  if($enc === null) $enc = mb_internal_encoding();
  return mb_strtolower(mb_substr($str, 0, 1, $enc), $enc).mb_substr($str, 1, mb_strlen($str, $enc), $enc);
}
?>
Uwe 26-Jul-2007 08:08
@adefoor, Ken and Zee

Changing the case can only be done by understanding the text. Take for example "USA", "Sunday", "March", "I am ...", abbreviations like "prob." and so on.
adefoor at gmail dot com 12-Jul-2007 11:57
Ken and zee

One thing I would do to make this more unviersally work would be to add strtolower() around your $sentence.  Doing this will allow you to convert an all caps text block as well as an all lowercase text block.

<?php

function sentence_cap($impexp, $sentence_split) {
    $textbad=explode($impexp, $sentence_split);
    $newtext = array();
    foreach ($textbad as $sentence) {
        $sentencegood=ucfirst(strtolower($sentence));
        $newtext[] = $sentencegood;
    }
    $textgood = implode($impexp, $newtext);
    return $textgood;
}

$text = "this is a sentence. this is another sentence! this is the fourth sentence? no, this is the fourth sentence.";
$text = sentence_cap(". ",$text);
$text = sentence_cap("! ",$text);
$text = sentence_cap("? ",$text);

echo $text; // This is a sentence. This is another sentence! This is the fourth sentence? No, this is the fourth sentence.

?>
Ken Kehler 14-Mar-2007 12:03
@ zee: this should solve your !, ?, and any punctuations you want to add. It can probably be cleaned up a bit.

<?php

function sentence_cap($impexp, $sentence_split) {
    $textbad=explode($impexp, $sentence_split);
    $newtext = array();
    foreach ($textbad as $sentence) {
        $sentencegood=ucfirst($sentence);
        $newtext[] = $sentencegood;
    }
    $textgood = implode($impexp, $newtext);
    return $textgood;
}

$text = "this is a sentence. this is another sentence! this is the fourth sentence? no, this is the fourth sentence.";
$text = sentence_cap(". ",$text);
$text = sentence_cap("! ",$text);
$text = sentence_cap("? ",$text);

echo $text; // This is a sentence. This is another sentence! This is the fourth sentence? No, this is the fourth sentence.

?>
Carel at divers information with dotcom 06-Jan-2007 02:55
I made a small change. Now it takes care of points in numbers

function ucsentence ($string){
   $string = explode ('.', $string);
   $count = count ($string);
   for ($i = 0; $i < $count; $i++){
       $string[$i]  = ucfirst (trim ($string[$i]));
       if ($i > 0){
           if ((ord($string[$i]{0})<48) || (ord($string[$i]{0})>57)) {
              $string[$i] = ' ' . $string[$i];
           }
       }
   }
   $string = implode ('.', $string);
   return $string;
}
26-Oct-2006 07:45
Some simple function for cyrillic and latin letters both:

function rucfirst($str) {
    if(ord(substr($str,0,1))<192) return ucfirst($str);
    else
    return chr(ord(substr($str,0,1))-32).substr($str,1);
}
Michael 12-Sep-2006 06:01
This is what you would expect php to deliver if there was a built-in function named ucsentence.

function ucsentence ($string){
    $string = explode ('.', $string);
    $count = count ($string);
    for ($i = 0; $i < $count; $i++){
        $string[$i]  = ucfirst (trim ($string[$i]));
        if ($i > 0){
            $string[$i] = '&nbsp;&nbsp;' . $string[$i];
        }
    }
    $string = implode ('.', $string);
    return $string;
}
Markus Ernst 31-Mar-2006 12:34
A combination of the below functions to enable ucfirst for multibyte strings in a shared hosting environment (where you can not always count on mbstring to be installed):

<?php
function my_mb_ucfirst($str, $e='utf-8') {
    if (function_exists('mb_strtoupper')) {
        $fc = mb_strtoupper(mb_substr($str, 0, 1, $e), $e);
        return $fc.mb_substr($str, 1, mb_strlen($str, $e), $e);
    }
    else {
        $str = utf8_decode($str);
        $str[0] = strtr($str[0],
            "abcdefghýijklmnopqrstuvwxyz".
            "\x9C\x9A\xE0\xE1\xE2\xE3".
            "\xE4\xE5\xE6\xE7\xE8\xE9".
            "\xEA\xEB\xEC\xED\xEE\xEF".
            "\xF0\xF1\xF2\xF3\xF4\xF5".
            "\xF6\xF8\xF9\xFA\xFB\xFC".
            "\xFE\xFF",
            "ABCDEFGHÝIJKLMNOPQRSTUVWXYZ".
            "\x8C\x8A\xC0\xC1\xC2\xC3\xC4".
            "\xC5\xC6\xC7\xC8\xC9\xCA\xCB".
            "\xCC\xCD\xCE\xCF\xD0\xD1\xD2".
            "\xD3\xD4\xD5\xD6\xD8\xD9\xDA".
            "\xDB\xDC\xDE\x9F");
        return utf8_encode($str);
    }
}
?>
Bartuc 26-Feb-2006 05:28
Here is the fixed function for Turkish alphabet..

<?php

function uc_first($str){
   $str[0] = strtr($str,
   "abcdefgh?ijklmnopqrstuvwxyz".
   "\x9C\x9A\xE0\xE1\xE2\xE3".
   "\xE4\xE5\xE6\xE7\xE8\xE9".
   "\xEA\xEB\xEC\xED\xEE\xEF".
   "\xF0\xF1\xF2\xF3\xF4\xF5".
   "\xF6\xF8\xF9\xFA\xFB\xFC".
   "\xFE\xFF",
   "ABCDEFGHI?JKLMNOPQRSTUVWXYZ".
   "\x8C\x8A\xC0\xC1\xC2\xC3\xC4".
   "\xC5\xC6\xC7\xC8\xC9\xCA\xCB".
   "\xCC\xCD\xCE\xCF\xD0\xD1\xD2".
   "\xD3\xD4\xD5\xD6\xD8\xD9\xDA".
   "\xDB\xDC\xDE\x9F");
   return $str;
}

?>
Markus Ernst 12-Jan-2006 06:39
plemieux' function did not work for me without passing the encoding to every single mb function (despite ini_set('default_charset', 'utf-8') at the top of the script). This is the example that works in my application (PHP 4.3):

<?php
function my_mb_ucfirst($str, $e='utf-8') {
    $fc = mb_strtoupper(mb_substr($str, 0, 1, $e), $e);
    return $fc.mb_substr($str, 1, mb_strlen($str, $e), $e);
}
?>
plemieux 29-Sep-2005 11:05
Simple multi-bytes ucfirst():

<?php
function my_mb_ucfirst($str) {
    $fc = mb_strtoupper(mb_substr($str, 0, 1));
    return $fc.mb_substr($str, 1);
}
?>
info [at] spwdesign [dot] com 23-Jun-2005 12:48
This is a simple code to get all the 'bad words', stored in a database, out of the text. You could use str_ireplace but since that's installed on PHP5 only, this works as well. It strtolowers the text first then places capitals with ucfirst() where it thinks a capital should be placed, at a new sentence. The previous sentence is ended by '. ' then.

<?php
function filter($text){
    $filters=mysql_query("SELECT word,result FROM filter");
    while($filter=mysql_fetch_array($filters)){
        $text=str_replace($filter[word],$filter[result],strtolower($text));
        $parts=explode(". ",$text);
        for($i=0;$i<count($parts);$i++){
            $parts[$i]=ucfirst($parts[$i]);
        }
        $text=implode(". ",$parts);
    }
    return $text;
}
?>
12-Mar-2005 05:11
Ah, the last code were spoiled, here is the fixed one:

<?php

function uc_first($str){
    $str[0] = strtr($str,
    "abcdefghijklmnopqrstuvwxyz".
    "\x9C\x9A\xE0\xE1\xE2\xE3".
    "\xE4\xE5\xE6\xE7\xE8\xE9".
    "\xEA\xEB\xEC\xED\xEE\xEF".
    "\xF0\xF1\xF2\xF3\xF4\xF5".
    "\xF6\xF8\xF9\xFA\xFB\xFC".
    "\xFD\xFE\xFF",
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ".
    "\x8C\x8A\xC0\xC1\xC2\xC3\xC4".
    "\xC5\xC6\xC7\xC8\xC9\xCA\xCB".
    "\xCC\xCD\xCE\xCF\xD0\xD1\xD2".
    "\xD3\xD4\xD5\xD6\xD8\xD9\xDA".
    "\xDB\xDC\xDD\xDE\x9F");
    return $str;
}

?>

So, this function changes also other letters into uppercase, ucfirst() does only change: a-z to: A-Z.
steven at tux dot appstate dot edu 21-Jun-2004 12:14
Note: the return for this function changed in versions 4.3 when a string is passed of length 0.  In <4.2 false is returned and in >4.3 a string of length 0 is returned.

Example:

$name = ucfirst("");
var_dump($name);

$name = ucfirst("owen");
var_dump($name);

Results for <4.2:
bool(false) string(4) "Owen"

Results for >4.3:
string(0) "" string(4) "Owen"
Ami Hughes (ami at mistress dot name) 07-Apr-2004 08:34
In the event you sort of need multiple delimiters to apply the same action to, you can preg_replace this "second delimiter" enveloping it with your actual delimiter.

A for instance, would be if you wanted to use something like Lee's FormatName function in an input box designed for their full name as this script was only designed to check the last name as if it were the entire string.  The problem is that you still want support for double-barreled names and you still want to be able to support the possibility that if the second part of the double-barreled name starts with "mc", that it will still be formatted correctly.

This example does a preg_replace that surrounds the separator with your actual delimiter.  This is just a really quick alternative to writing some bigger fancier blah-blah function.  If there's a shorter, simpler way to do it, feel free to inform me.  (Emphasis on shorter and simpler because that was the whole point of this.) :D

Here's the example.  I've removed Lee's comments as not to confuse them with my own.

<?php

   function FormatName($name=NULL)
   {
       if (empty($name))
           return false;

       $name = strtolower($name);
       $name = preg_replace("[\-]", " - ",$name); // Surround hyphens with our delimiter so our strncmp is accurate
       if (preg_match("/^[a-z]{2,}$/i",$name))  // Simple preg_match if statement
       {

           $names_array = explode(' ',$name);  // Set the delimiter as a space.

           for ($i = 0; $i < count($names_array); $i++)
           {
               if (strncmp($names_array[$i],'mc',2) == 0 || ereg('^[oO]\'[a-zA-Z]',$names_array[$i]))
               {
                   $names_array[$i][2] = strtoupper($names_array[$i][2]);
               }
               $names_array[$i] = ucfirst($names_array[$i]);

           }

           $name = implode(' ',$names_array);
           $name = preg_replace("[ \- ]", "-",$name); //  Remove the extra instances of our delimiter
           return ucwords($name);

       }
   }

?>
bkimble at ebaseweb dot com 08-Jun-2003 05:02
Here is a handy function that makes the first letter of everything in a sentence upercase. I used it to deal with titles of events posted on my website ... I've added exceptions for uppercase words and lowercase words so roman numeral "IV" doesn't get printed as "iv" and words like "a" and "the" and "of" stay lowercase.

function RemoveShouting($string)
{
 $lower_exceptions = array(
        "to" => "1", "a" => "1", "the" => "1", "of" => "1"
 );

 $higher_exceptions = array(
        "I" => "1", "II" => "1", "III" => "1", "IV" => "1",
        "V" => "1", "VI" => "1", "VII" => "1", "VIII" => "1",
        "XI" => "1", "X" => "1"
 );

 $words = split(" ", $string);
 $newwords = array();

 foreach ($words as $word)
 {
        if (!$higher_exceptions[$word])
                $word = strtolower($word);
        if (!$lower_exceptions[$word])
                $word = ucfirst($word);
         array_push($newwords, $word);

 }

 return join(" ", $newwords);
}


Met en majuscule la première lettre de tous les mots

  • « ucfirst
  • vfprintf »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Met en majuscule la première lettre de tous les mots

ucwords

(PHP 4, PHP 5, PHP 7, PHP 8)

ucwords — Met en majuscule la première lettre de tous les mots

Description

ucwords ( string $string , string $separators = " \t\r\n\f\v" ) : string

Retourne la chaîne string après avoir mis en majuscule la première lettre de tous les mots, si ce caractère est alphabétique.

La définition d'un mot est : toute séquence de caractères qui suit immédiatement n'importe quel caractère listé dans le paramètre separators (par défaut, ce sont : une espace, un saut à la ligne, une nouvelle ligne, un retour à la ligne, une tabulation horizontale, et une tabulation verticale).

Liste de paramètres

string

La chaîne d'entrée.

separators

Le paramètre optionnel separators contient le caractère de séparation.

Valeurs de retour

Retourne la chaîne, après modification.

Exemples

Exemple #1 Exemple avec ucwords()

<?php
$foo = 'bonjour tout le monde!';
$foo = ucwords($foo);             // Bonjour Tout Le Monde!

$bar = 'BONJOUR TOUT LE MONDE!';
$bar = ucwords($bar);             // BONJOUR TOUT LE MONDE!
$bar = ucwords(strtolower($bar)); // Bonjour Tout Le Monde!
?>

Exemple #2 Exemple avec ucwords() et un séparation personnalisé

<?php
$foo = 'hello|world!';
$bar = ucwords($foo);             // Hello|world!

$baz = ucwords($foo, "|");        // Hello|World!
?>

Exemple #3 Exemple de ucwords() des séparateurs supplémentaires

<?php
$foo = "mike o'hara";
$bar = ucwords($foo);                 // Mike O'hara

$baz = ucwords($foo, " \t\r\n\f\v'"); // Mike O'Hara
?>

Notes

Note: Cette fonction est conscient de la locale et traite l'entrée en fonction de la locale actuellement définie. Cependent, ceci ne fonctionne que sur des jeux de caractères d'un octet. Si vous devez utiliser des jeux de caractères multi-octet (la plupart des langues différentes de l'Europe de l'ouest) regarder à la place les extensions multibyte ou intl

Note: Cette fonction gère les chaînes binaires.

Voir aussi

  • strtoupper() - Renvoie une chaîne en majuscules
  • strtolower() - Renvoie une chaîne en minuscules
  • ucfirst() - Met le premier caractère en majuscule
  • mb_convert_case() - Modifie la casse d'une chaîne

User Contributed Notes

NOSPAM dot php at my dot jrklein dot com 25-Jul-2020 05:08
Based on code sample originally posted by "Anonymous" on 2005-12-14. The /e modifier is no longer supported by preg_replace(). Rewritten to use preg_replace_callback() instead. Tested with PHP 7.3.

The function below will standardize the capitalization on people's names, addresses, and the titles of reports and essays . Adapt the lists in "$all_uppercase" and "$all_lowercase" to suit the data that you are working with.

function ucwords_title($string, $is_name = false) {
    // Exceptions to standard case conversion
    if ($is_name) {
        $all_uppercase = '';
        $all_lowercase = 'De La|De Las|Der|Van De|Van Der|Vit De|Von|Or|And';
    } else {
        // Addresses, essay titles ... and anything else
        $all_uppercase = 'Us|Ca|Mx|Po|Rr|Se|Sw|Ne|Nw';
        $all_lowercase = 'A|And|As|By|In|Of|Or|To';
    }
    $prefixes = 'Mac|Mc';
    $suffixes = "'S";

    // Trim whitespace and convert to lowercase
    $str = strtolower(trim($string));

    // Capitalize all first letters
    $str = preg_replace_callback('/\\b(\\w)/', function ($m) {
        return strtoupper($m[1]);
    }, $str);

    if ($all_uppercase) {
        // Capitalize acronyms and initialisms (e.g. PHP)
        $str = preg_replace_callback('/\\b(' . $all_uppercase . ')\\b/', function ($m) {
            return strtoupper($m[1]);
        }, $str);
    }
    if ($all_lowercase) {
        // Decapitalize short words (e.g. and)
        if ($is_name) {
            // All occurrences will be changed to lowercase
            $str = preg_replace_callback('/\\b(' . $all_lowercase . ')\\b/', function ($m) {
                return strtolower($m[1]);
            }, $str);
        } else {
            // First and last word will not be changed to lower case (i.e. titles)
            $str = preg_replace_callback('/(?<=\\W)(' . $all_lowercase . ')(?=\\W)/', function ($m) {
                return strtolower($m[1]);
            }, $str);
        }
    }
    if ($prefixes) {
        // Capitalize letter after certain name prefixes (e.g 'Mc')
        $str = preg_replace_callback('/\\b(' . $prefixes . ')(\\w)/', function ($m) {
            return $m[1] . strtoupper($m[2]);
        }, $str);
    }
    if ($suffixes) {
        // Decapitalize certain word suffixes (e.g. 's)
        $str = preg_replace_callback('/(\\w)(' . $suffixes . ')\\b/', function ($m) {
            return $m[1] . strtolower($m[2]);
        }, $str);
    }

    return $str;
}

// A name example
print ucwords_title("MARIE-LOU VAN DER PLANCK-ST.JOHN", true);
// Output: Marie-Lou van der Planc-St.John

// A title example
print ucwords_title("to be or not to be");
// Output: "To Be or Not to Be"
ganzales at inbox dot ru 26-May-2020 01:03
<?php
function mb_ucwords($string, $delimiter = ' (-"[') {
    $result = $upper = '';
    for ($i = 0; $i < mb_strlen($string); $i++) {
        $letter = mb_substr($string, $i, 1);
        $result .= $upper || $i == 0 ? mb_convert_case($letter, MB_CASE_TITLE) : $letter;
        $upper = ($i + 1) < mb_strlen($string) && mb_strpos($delimiter, $letter) !== false ? 1 : 0;
    }
    return $result;
}
?>
@manzoorwanijk 04-Sep-2018 09:39
for PHP < 5.4.32 with $delimiters

function _ucwords( $str, $delimiters = " \t\r\n\f\v" ) {

    $delims = preg_split( '//u', $delimiters, -1, PREG_SPLIT_NO_EMPTY );

    foreach ( $delims as $delim ) {

        if ( false !== strpos( $str, $delim ) ) {

            $str = implode( $delim, array_map( 'ucfirst', explode( $delim, $str ) ) );
        }
    }

    return $str;
}
almino dot melo at gmail dot com 29-Feb-2016 08:36
ucwords for human names in Brazil.
ucwords personalizada para nomes próprios brasileiros.

<?php
    /**
     * ucwords for human names in Brazil
     * Edit from http://php.net/manual/pt_BR/function.ucwords.php#112795
     * @param string $str
     * @param array $delimiters
     * @param array $exceptions Exceptions are words you don't want converted
     * @return string
     */
    function name($str, $delimiters = array(
        " ",
        "-",
        ".",
        "'",
        "O'",
        "Mc",
    ), $exceptions = array(
        "de",
        "do",
        "da",
        "dos",
        "das",
    )) {
        $result = '';

        foreach ($delimiters as $delimiter) {
            # If string has a delimiter
            if (strstr($str, $delimiter)) {

                $ucfirst = array();
                # Apply ucfirst to every word
                foreach (explode($delimiter, mb_strtolower($str)) as $word) {
                    $word = mb_convert_case($word, MB_CASE_TITLE);

                    # Working with exceptions
                    if (in_array(mb_strtoupper($word), $exceptions)) {
                        $word = mb_strtoupper($word);
                    } elseif (in_array(mb_strtolower($word), $exceptions)) {
                        $word = mb_strtolower($word);
                    } elseif (preg_match('/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/', mb_strtoupper($word))) {
                        # Is roman numerals? # http://stackoverflow.com/a/267405/437459
                        $word = mb_strtoupper($word);
                    }

                    $ucfirst[] = $word;
                }

                # string's first character uppercased
                $result = implode($delimiter, $ucfirst);
            }
        }

        return $result;
    }
?>
Lech 01-Sep-2015 02:36
This will correct capitalisation in names taking note of special capitalisation for Mc..., Mac..., and O'... Other special cases, of which I am not aware, can be added easily.

This is just a slight improvement on "deepdene at email dot com"'s name_case function... Thank you for original function.

<?php

function name_case($name) {
    if( !$name ) return $name;
    $newname = strtoupper($name[0]);
    $break = false;
    for( $i=1; $i<strlen($name); ++$i ) {
      $subed = substr($name, $i, 1);
      if( ord($subed) > 64 && ord($subed) < 123 || ord($subed) > 48 && ord($subed) < 58 ) {
        if( $break ) {
          $newname .= strtoupper($subed);
        }
        elseif( $i > 1 && in_array(substr($newname, $i-2, 2), array('Mc', 'O\'')) || $i > 2 && in_array(substr($newname, $i-3, 3), array('Mac')) ) {
          $newname .= strtoupper($subed);
        }
        else {
          $newname .= strtolower($subed);
        }
        $break = false;
      }
      else {
        // not a letter - a boundary
        $newname .= $subed;
        $break = true;
      }
    }
    return $newname;

?>
Alex Milkovskyi 13-May-2015 09:22
Convert string to in camel-case, useful for class name patterns:
<?php
/**
   * Convert string to in camel-case, useful for class name patterns.
   *
   * @param $string
   *   Target string.
   *
   * @return string
   *   Camel-case string.
   */
function toCamelCase($string){
    $string = str_replace('-', ' ', $string);
    $string = str_replace('_', ' ', $string);
    $string = ucwords(strtolower($string));
    $string = str_replace(' ', '', $string);
    return $string;
}
?>

Example:
toCamelCase(make_mE camel-case pLEase) will return:
MakeMeCamelCasePlease
Florian 20-Feb-2015 08:03
to convert first letters in a firstname like: "jean-pierre" to "Jean-Pierre":

I simply replace the '-' with a vertical tabulation, because the ucwords() function replace the letter just after it.

so, I use the sentence:
$result=str_replace(chr(11),'-',ucwords(strtolower(str_replace('-',chr(11),$firstname))));
antoniomax at antoniomax dot com 23-Jul-2013 06:04
Para formatar nomes em pt-br:

<?php

    function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc"), $exceptions = array("de", "da", "dos", "das", "do", "I", "II", "III", "IV", "V", "VI"))
    {
        /*
         * Exceptions in lower case are words you don't want converted
         * Exceptions all in upper case are any words you don't want converted to title case
         *   but should be converted to upper case, e.g.:
         *   king henry viii or king henry Viii should be King Henry VIII
         */
        $string = mb_convert_case($string, MB_CASE_TITLE, "UTF-8");
        foreach ($delimiters as $dlnr => $delimiter) {
            $words = explode($delimiter, $string);
            $newwords = array();
            foreach ($words as $wordnr => $word) {
                if (in_array(mb_strtoupper($word, "UTF-8"), $exceptions)) {
                    // check exceptions list for any words that should be in upper case
                    $word = mb_strtoupper($word, "UTF-8");
                } elseif (in_array(mb_strtolower($word, "UTF-8"), $exceptions)) {
                    // check exceptions list for any words that should be in upper case
                    $word = mb_strtolower($word, "UTF-8");
                } elseif (!in_array($word, $exceptions)) {
                    // convert to uppercase (non-utf8 only)
                    $word = ucfirst($word);
                }
                array_push($newwords, $word);
            }
            $string = join($delimiter, $newwords);
       }//foreach
       return $string;
    }

?>

Usage:

<?php
    $s = 'SÃO JOÃO DOS SANTOS';
    $v = titleCase($s); // 'São João dos Santos'
?>
hrvoj3e at gmail dot com 30-Apr-2013 02:44
UTF-8 Title Case that works for me even with hyphens involved!

$str = 'ÐaaCaa-AAAaaa, BBbb';

$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");

echo($str): 'Ðaacaa-Aaaaaa, Bbbb'
Luca Borrione luca -a email -d c_o_m 10-Sep-2012 03:41
Features:
- multi byte compatible
- handles multiple delimiters

<?php
function ucwords_specific ($string, $delimiters = '', $encoding = NULL)
{
    if ($encoding === NULL) { $encoding = mb_internal_encoding();}

    if (is_string($delimiters))
    {
        $delimiters =  str_split( str_replace(' ', '', $delimiters));
    }

    $delimiters_pattern1 = array();
    $delimiters_replace1 = array();
    $delimiters_pattern2 = array();
    $delimiters_replace2 = array();
    foreach ($delimiters as $delimiter)
    {
        $uniqid = uniqid();
        $delimiters_pattern1[]   = '/'. preg_quote($delimiter) .'/';
        $delimiters_replace1[]   = $delimiter.$uniqid.' ';
        $delimiters_pattern2[]   = '/'. preg_quote($delimiter.$uniqid.' ') .'/';
        $delimiters_replace2[]   = $delimiter;
    }

    // $return_string = mb_strtolower($string, $encoding);
    $return_string = $string;
    $return_string = preg_replace($delimiters_pattern1, $delimiters_replace1, $return_string);

    $words = explode(' ', $return_string);

    foreach ($words as $index => $word)
    {
        $words[$index] = mb_strtoupper(mb_substr($word, 0, 1, $encoding), $encoding).mb_substr($word, 1, mb_strlen($word, $encoding), $encoding);
    }

    $return_string = implode(' ', $words);

    $return_string = preg_replace($delimiters_pattern2, $delimiters_replace2, $return_string);

    return $return_string;
}
?>

Params:
1. string: The string being converted
2. delimiters: a string with all wanted delimiters written one after the other e.g. "-'"
3. encoding: Is the character encoding. If it is omitted, the internal character encoding value will be used.

Example Usage:
<?php
mb_internal_encoding('UTF-8');
$string = "JEAN-PAUL d'artagnan sŠ-òÀ-éÌ hello - world";
echo ucwords_specific( mb_strtolower($string, 'UTF-8'), "-'");
?>

Output:
Jean-Paul D'Artagnan Sš-Òà-Éì Hello - World
qeremy [atta] gmail [dotta] com 27-Feb-2012 05:09
A proper Turkish solution;

<?php
function ucfirst_turkish($str) {
    $tmp = preg_split("//u", $str, 2, PREG_SPLIT_NO_EMPTY);
    return mb_convert_case(
        str_replace("i", "I", $tmp[0]), MB_CASE_TITLE, "UTF-8").
        $tmp[1];
}

function ucwords_turkish($str) {
    return preg_replace("/(\\w+)/ue", "ucfirst_turkish('\\\\1').'$2'", $str);
}

$str = "iyilik güzelLIK seker ";
echo ucwords($str) ."\\n";   // Iyilik GüzelLIK seker
echo ucwords_turkish($str); // Iyilik GüzelLIK Seker
?>
haijerome at gmail dot com 21-Nov-2011 09:14
Thanks a lot brother.

I tested it with a few variations. It works perfectly. Its really great and simple usage of the existing functions. It would be glad to all PHP folks and good to PHP if these kind of functions will be in PHP library on upcoming releases.

<?php

$name1 = "mark-yves robert";
$name2 = "mark-yves robert-bryan";

echo '<br/>Name 1 (mark-yves robert) =>'.
ucwordspecific($name1,'-'); //returns Mark-Yves Robert

echo '<br/>Name 2 (mark-yves robert-bryan)

=>'.ucwordspecific($name2,'-');
//returns Mark-Yves Robert-Bryan

function ucwordspecific($str,$delimiter){
$delimiter_space = '- ';
return str_replace($delimiter_space,$delimiter,ucwords

(str_replace($delimiter,$delimiter_space,$str)));
}

?>

Proud to be a PHP enthusiast always :-)
ahmet363 at gmail dot com 16-Oct-2011 11:14
Turkish character with the ucwords function...

<?php
function ucwords_tr($gelen){

  $sonuc='';

  $kelimeler=explode(" ", $gelen);

  foreach ($kelimeler as $kelime_duz){

    $kelime_uzunluk=strlen($kelime_duz);
    $ilk_karakter=mb_substr($kelime_duz,0,1,'UTF-8');

    if($ilk_karakter=='Ç' or $ilk_karakter=='ç'){

      $ilk_karakter='Ç';

    }elseif ($ilk_karakter=='G' or $ilk_karakter=='g') {

      $ilk_karakter='G';

    }elseif($ilk_karakter=='I' or $ilk_karakter=='i'){

      $ilk_karakter='I';

    }elseif ($ilk_karakter=='I' or $ilk_karakter=='i'){

      $ilk_karakter='I';

    }elseif ($ilk_karakter=='Ö' or $ilk_karakter=='ö'){

      $ilk_karakter='Ö';

    }elseif ($ilk_karakter=='S' or $ilk_karakter=='s'){

      $ilk_karakter='S';

    }elseif ($ilk_karakter=='Ü' or $ilk_karakter=='ü'){

      $ilk_karakter='Ü';

    }else{

      $ilk_karakter=strtoupper($ilk_karakter);

    }

    $digerleri=mb_substr($kelime_duz,1,$kelime_uzunluk,'UTF-8');
    $sonuc.=$ilk_karakter.kucuk_yap($digerleri).' ';

  }

  $son=trim(str_replace('  ', ' ', $sonuc));
  return $son;

}

function kucuk_yap($gelen){

  $gelen=str_replace('Ç', 'ç', $gelen);
  $gelen=str_replace('G', 'g', $gelen);
  $gelen=str_replace('I', 'i', $gelen);
  $gelen=str_replace('I', 'i', $gelen);
  $gelen=str_replace('Ö', 'ö', $gelen);
  $gelen=str_replace('S', 's', $gelen);
  $gelen=str_replace('Ü', 'ü', $gelen);
  $gelen=strtolower($gelen);

  return $gelen;
}

echo ucwords_tr('SEKardi SEMSIYE GELENÖ ÖMER'); // Sekardi Semsiye Gelenö Ömer
echo ucwords_tr('sEKER iMSAK sÖLEN'); // Seker Imsak Sölen
jmarois at ca dot ibm dot com 12-Feb-2010 08:51
My quick and dirty ucname (Upper Case Name) function.

<?php
//FUNCTION

function ucname($string) {
    $string =ucwords(strtolower($string));

    foreach (array('-', '\'') as $delimiter) {
      if (strpos($string, $delimiter)!==false) {
        $string =implode($delimiter, array_map('ucfirst', explode($delimiter, $string)));
      }
    }
    return $string;
}
?>
<?php
//TEST

$names =array(
  'JEAN-LUC PICARD',
  'MILES O\'BRIEN',
  'WILLIAM RIKER',
  'geordi la forge',
  'bEvErly CRuSHeR'
);
foreach ($names as $name) { print ucname("{$name}\n"); }

//PRINTS:
/*
Jean-Luc Picard
Miles O'Brien
William Riker
Geordi La Forge
Beverly Crusher
*/
?>

You can add more delimiters in the for-each loop array if you want to handle more characters.
robert at broofa dot com 08-Jul-2009 06:42
Some recipes for switching between underscore and camelcase naming:

<?php
// underscored to upper-camelcase
// e.g. "this_method_name" -> "ThisMethodName"
preg_replace('/(?:^|_)(.?)/e',"strtoupper('$1')",$string);

// underscored to lower-camelcase
// e.g. "this_method_name" -> "thisMethodName"
preg_replace('/_(.?)/e',"strtoupper('$1')",$string);

// camelcase (lower or upper) to underscored
// e.g. "thisMethodName" -> "this_method_name"
// e.g. "ThisMethodName" -> "this_method_name"
strtolower(preg_replace('/([^A-Z])([A-Z])/', "$1_$2", $string));
?>

Of course these aren't 100% symmetric.  For example...
  * this_is_a_string -> ThisIsAString -> this_is_astring
  * GetURLForString -> get_urlfor_string -> GetUrlforString
Greg S 26-Apr-2009 09:16
I did the same thing as Catalin, but for French names.

Here's what I'm doing :

For each word (not considering the single-quote as a word boundary character) :
- Put the word in lower case
- If the word is "de", return, else, put the first letter in upper-case
- See if the second character of the word is a single-quote
- Yes ? Put the next char in upper case
- And if the char before the single quote is D, put it back to lower case (-> d)

This complies with the French rules for capitalization in names.

Sample results :
-d'Afoo Bar
-de Foo Bar
-O'Foo Bar
-Foo'bar

<?php
function my_ucwords($s) {
        $s = preg_replace_callback("/(\b[\w|']+\b)/s", fixcase_callback, $s);

        return $s;

    }

    function fixcase_callback($word) {

        $word = $word[1];

        $word = strtolower($word);

        if($word == "de")
            return $word;

        $word = ucfirst($word);

        if(substr($word,1,1) == "'") {
            if(substr($word,0,1) == "D") {
                $word = strtolower($word);
            }
            $next = substr($word,2,1);
            $next = strtoupper($next);
            $word = substr_replace($word, $next, 2, 1);
        }

        return $word;
    }
?>
strazds at gmail dot com 01-Nov-2008 02:45
ucwords for UTF-8 strings:

<?php
function mb_ucwords($str) {
    $str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
    return ($str);
}
?>
Alex 27-Aug-2008 09:43
A modified sentenceNormalizer by gregomm

Features:
1- Removes duplicated question marks, exclamations and periods
2- Capitalize first letter of a sentence.
3- Split sentences not only with "." but also with "?" and "!"
4- Puts a white space at the end of each sentence
5- Retains newlines

--removed from orginal function--
undestand the meaning of "¡" and "¿" in languages like spanish.
undestand the htmlentitity version of this simbols.
--removed from orginal function--

<?php
function sentenceNormalizer($sentence_split) {
    $sentence_split = preg_replace(array('/[!]+/','/[?]+/','/[.]+/'),
                                   array('!','?','.'),$sentence_split);

    $textbad = preg_split("/(\!|\.|\?|\n)/", $sentence_split,-1,PREG_SPLIT_DELIM_CAPTURE);
    $newtext = array();
    $count = sizeof($textbad);

    foreach($textbad as $key => $string) {
        if (!empty($string)) {
            $text = trim($string, ' ');
            $size = strlen($text);

            if ($size > 1){
                $newtext[] = ucfirst(strtolower($text));
            }
                elseif ($size == 1) {
                    $newtext[] = ($text == "\n") ? $text : $text . ' ';
                }
        }
    }

    return implode($newtext);
}
?>
blake at goinoutwest dot com 29-Jan-2008 05:14
Relating to the mb_ucwords() function posted by Anonymous.  In order for this to actually be multi-byte compliant, you would also need to use mb_substr() and mb_strlen() instead of substr and strlen respectively.

Here it is corrected and extended even further to allow multiple word separators and a list of exceptions to correct after title casing. It's a bit tedious and inelegant, but things frequently are when dealing with human languages.

function mb_ucwords($str) {
    $exceptions = array();
    $exceptions['Hp'] = 'HP';
    $exceptions['Ibm'] = 'IBM';
    $exceptions['Gb'] = 'GB';
    $exceptions['Mb'] = 'MB';
    $exceptions['Cd'] = 'CD';
    $exceptions['Dvd'] = 'DVD';
    $exceptions['Usb'] = 'USB';
    $exceptions['Mm'] = 'mm';
    $exceptions['Cm'] = 'cm';
    //    etc.

    $separator = array(" ","-","+");

    $str = mb_strtolower(trim($str));
    foreach($separator as $s){
        $word = explode($s, $str);

        $return = "";
        foreach ($word as $val){
            $return .= $s . mb_strtoupper($val{0}) . mb_substr($val,1,mb_strlen($val)-1);
        }
        $str = mb_substr($return, 1);
    }

    foreach($exceptions as $find=>$replace){
        if (mb_strpos($return, $find) !== false){
            $return = str_replace($find, $replace, $return);
        }
    }
    return mb_substr($return, 1);
}
kendsnyder at gmail dot com 30-Jul-2007 01:02
Here is a function to capitalize a last name, accounting for hyphens, apostrophes, "Mc" and "Mac":

<?php
function CapitalizeLastName($name) {
    $name = strtolower($name);
    $name = join("'", array_map('ucwords', explode("'", $name)));
    $name = join("-", array_map('ucwords', explode("-", $name)));
    $name = join("Mac", array_map('ucwords', explode("Mac", $name)));
    $name = join("Mc", array_map('ucwords', explode("Mc", $name)));
    return $name;
}
?>

I speed tested it against functions that used preg_replace() with an "e" modifier, preg_replace_callback(), and a character-by-character parsing.  Unexpectedly, this function using join(), array_map() and explode() was fastest.
Q1712 at online dot ms 05-May-2007 12:49
ucwords() only excepts whitespace in front of a word, although some chars like '"' or '(' normally have no space between them and the following word:
<?php
$title = 'ELVIS "THE KING" PRESLEY - (LET ME BE YOUR) TEDDY BEAR';
echo ucwords(strtolower($title));
?>
prints: Elvis "the King" Presley - (let Me Be Your) Teddy Bear

To avoid this i use a small function adding and deleting blanks behind these chars, and using ucwords() in between:

<?php
function my_ucwords($string)
  {
    $noletters='"([/'; //add more if u need to
    for($i=0; $i<strlen($noletters); $i++)
      $string = str_replace($noletters[$i], $noletters[$i].' ', $string);
    $string=ucwords($string);
    for($i=0; $i<strlen($noletters); $i++)
      $string = str_replace($noletters[$i].' ', $noletters[$i], $string);
    return $string;
  }

$title = 'ELVIS "THE KING" PRESLEY - (LET ME BE YOUR) TEDDY BEAR';
echo my_ucwords(strtolower($title));
?>

prints: Elvis "The King" Presley - (Let Me Be Your) Teddy Bear
barnaby ritchley at exeye dot co dot uk 03-Jan-2007 08:53
A very easy way to convert to title case:

function titleCase($string)
     {
     return ucwords(strtolower($string));
     }

$myString = "SOME TEXT";

echo titleCase($myString);

//will print, "My Text"
Ismet Togay 30-May-2006 05:07
Response to arif:

We do not need that long functions. In order to make ucwords() worked properly in Turkish words that contain speacial characters, we can use the following command in our php codes:

setlocale(LC_ALL, 'tr_TR');

This will set locale to Turkish.
lev at phpfox dot com 06-May-2006 01:44
In the function ucsmart() posted by ieure at php dot net on 04-Dec-2005 11:57, I found a similar problem in this function to what he found in igua's.

<?php
function ucsmart($text)
{
   return preg_replace('/([^a-z]|^)([a-z])/e', '"$1".strtoupper("$2")',
                       strtolower($text));
}
?>

"igua's code adds a backslash in front of the first single quote for me. This doesn't alter the content in any way other than changing case."

Actually, it did end up changing the content for me (php 5.0.4) in the way that this function escapes a single quotation (apostrophe) in the MIDDLE of a word.

For example:

who's online?

Became:

Who\'s Online?

The fix is simple however, and merely requires fine-tuning the regular expression:

<?php
function ucsmart($text)
{
   return preg_replace('/([^a-z\']|^)([a-z])/e', '"$1".strtoupper("$2")',
                       strtolower($text));
}
?>

(note: while previewing this note before adding it, I am noticing php's website is not correctly displaying the change I made as I wrote it. After the first a-z in the expression, the single quotation should be escaped... If it isn't you will get a parse error! And apoligies if my text here is colored as php code; not my fault!)

This will not escape a single quotation mark which occurs in the middle of a word... Though, you may find that might need to add other characters inside the regular expression if you use other special characters inside your words and if you get funky output.

It's a great expression though! Simple, yet very powerful. Kudos!
24-Dec-2005 07:34
"ieure at php dot net", your idea is pure poetry!

The function below will standardize the capitalization on people's names and the titles of reports and essays . You may need to adapt the lists in "$all_uppercase" and "$all_lowercase" to suit the data that you are working with.

function my_ucwords($str, $is_name=false) {
   // exceptions to standard case conversion
   if ($is_name) {
       $all_uppercase = '';
       $all_lowercase = 'De La|De Las|Der|Van De|Van Der|Vit De|Von|Or|And';
   } else {
       // addresses, essay titles ... and anything else
       $all_uppercase = 'Po|Rr|Se|Sw|Ne|Nw';
       $all_lowercase = 'A|And|As|By|In|Of|Or|To';
   }
   $prefixes = 'Mc';
   $suffixes = "'S";

   // captialize all first letters
   $str = preg_replace('/\\b(\\w)/e', 'strtoupper("$1")', strtolower(trim($str)));

   if ($all_uppercase) {
       // capitalize acronymns and initialisms e.g. PHP
       $str = preg_replace("/\\b($all_uppercase)\\b/e", 'strtoupper("$1")', $str);
   }
   if ($all_lowercase) {
       // decapitalize short words e.g. and
       if ($is_name) {
           // all occurences will be changed to lowercase
           $str = preg_replace("/\\b($all_lowercase)\\b/e", 'strtolower("$1")', $str);
       } else {
           // first and last word will not be changed to lower case (i.e. titles)
           $str = preg_replace("/(?<=\\W)($all_lowercase)(?=\\W)/e", 'strtolower("$1")', $str);
       }
   }
   if ($prefixes) {
       // capitalize letter after certain name prefixes e.g 'Mc'
       $str = preg_replace("/\\b($prefixes)(\\w)/e", '"$1".strtoupper("$2")', $str);
   }
   if ($suffixes) {
       // decapitalize certain word suffixes e.g. 's
       $str = preg_replace("/(\\w)($suffixes)\\b/e", '"$1".strtolower("$2")', $str);
   }
   return $str;
}

// A name example
print my_ucwords("MARIE-LOU VAN DER PLANCK-ST.JOHN", true);
// Output: Marie-Lou van der Planc-St.John

// A title example
print my_ucwords("to be or not to be");
// Output: "To Be or Not to Be"
deepdene at email dot com 09-Dec-2002 11:20
A function knowing about name case (i.e. caps on McDonald etc)

function name_case($name)
{
    $newname = strtoupper($name[0]);
    for ($i=1; $i < strlen($name); $i++)
    {
        $subed = substr($name, $i, 1);
        if (((ord($subed) > 64) && (ord($subed) < 123)) ||
            ((ord($subed) > 48) && (ord($subed) < 58)))
        {
            $word_check = substr($name, $i - 2, 2);
            if (!strcasecmp($word_check, 'Mc') || !strcasecmp($word_check, "O'"))
            {
                $newname .= strtoupper($subed);
            }
            else if ($break)
            {

                $newname .= strtoupper($subed);
            }
            else
            {
                $newname .= strtolower($subed);
            }
             $break=0;
        }
        else
        {
            // not a letter - a boundary
             $newname .= $subed;
            $break=1;
        }
    }
    return $newname;
}
18-Jan-2002 06:14
This seems to be what people want:

function uc_all($string) {
    $temp = preg_split('/(\W)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE );
    foreach ($temp as $key=>$word) {
        $temp[$key] = ucfirst(strtolower($word));
    }
    return join ('', $temp);
}

[ed note: fixed the code to be correct]
neil at no-spam-ents24 dot com 21-Mar-2001 05:10
The code posted above by Joerg Krause only works for a string which ends with one of the delimiters. A possible fix is:

<?php
$text = "What?No delimiters,shit happens here.this solves all problems.";
preg_match_all("/(\w+[,. ?])+/U", $text, $words);
preg_match("/(\w+)$/", $text, $lastword);
$words[0][] = $lastword;
foreach($words[0] as $part) $uwords[] = ucfirst($part);
$text = implode("", $uwords);
echo $text;
?>


Écrit une chaîne formatée dans un flux

  • « ucwords
  • vprintf »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Écrit une chaîne formatée dans un flux

vfprintf

(PHP 5, PHP 7, PHP 8)

vfprintf — Écrit une chaîne formatée dans un flux

Description

vfprintf ( resource $stream , string $format , array $values ) : int

Écrit une chaîne produite en accord avec le paramètre format dans le flux stream.

Agit de la même façon que fprintf() excepté que vfprintf() accepte un tableau d'arguments, plutôt qu'un nombre variant d'arguments.

Liste de paramètres

stream

format

La chaîne de format est composé de zéro ou plusieurs directives : des caractères ordinaires (à l'exception de %) qui sont copiés directement dans le résultat et des spécifications de conversion, chacun ayant pour résultat de récupérer ses propres paramètre.

Une spécification de conversion qui suit ce prototype : %[argnum$][flags][width][.precision]specifier.

Argnum

Un entier suivit d'un signe dollar $, pour spécifier quel numéro d'argument à traiter dans la conversion.

Drapeaux
Drapeau | Description
- Justifie le texte à gauche donnée la largeur du champ ; Justification à droite est le comportement par défaut.
+ Préfixe les nombres positives avec un signe plus + ; Par défaut seul les nombres négatifs sont préfixés avec un signe négatif.
(espace) | Complète le résultat avec des espaces. Ceci est par défaut.
0 | Complète uniquement les nombres à gauches avec des zéros. Avec le spécificateur s ceci peut aussi compléter à droite avec des zéros.
'(char) | Complète le résultat avec le caractère (char).

Largeur

Un entier indiquant combien de caractères (au minimum) cette conversion doit avoir pour résultat.

Precision

Un point . suivie d'un entier dont sa signification dépend du spécificateur :

  • Pour les spécificateurs e, E, f et F : ceci est le nombre de chiffres à afficher après la virgule (par défaut, ceci est 6).
  • Pour les spécificateurs g et G : ceci est le nombre maximal de chiffres significatifs à afficher. digits to be printed.
  • Pour le spécificateur s : il agit comme un point de coupure, définissant une limite maximale de caractères de la chaîne.

Note: Si le point est spécifié sans une valeur explicite pour la précision, 0 est assumé.

Note: Tenter d'utiliser une position supérieure à PHP_INT_MAX génèrera une alerte.

Spécificateurs
Spécificateur | Description
% Un caractère de pourcentage littéral. Aucun argument n'est nécessaire.
b | L'argument est traité comme un entier et présenté comme un nombre binaire.
c | L'argument est traité comme un entier et présenté comme le caractère de code ASCII correspondant.
d | L'argument est traité comme un entier et présenté comme un nombre entier décimal (signé).
e | L'argument est traité comme une notation scientifique (e.g. 1.2e+2). Le spécificateur de précision représente le nombre de chiffres après la virgule depuis PHP 5.2.1. Dans les versions antérieures, il a été pris comme nombre des chiffres significatifs (moins un).
E | Comme le spécificateur e mais utilise une lettre majuscule (par exemple 1.2E+2).
f | L'argument est traité comme un nombre à virgule flottante (type nombre décimal) et présenté comme un nombre à virgule flottante (tenant compte de la locale utilisée).
F | L'argument est traité comme un nombre à virgule flottante (type nombre décimal) et présenté comme un nombre à virgule flottante (ne tenant pas compte de la locale utilisée). Disponible à partir de PHP 5.0.3.
g

Format général.

Soit P égal à la précision si différent de 0, 6 si la précision est omit ou 1 si la précision est zéro. Alors, si la conversion avec le style E aurait comme exposant X :

Si P > X = -4, la conversion est avec style f et précision P - (X + 1). Sinon, la conversion est avec le style e et précision P - 1.

G | Comme le spécificateur g mais utilise E et f.
h | Comme le spécificateur g mais utilise F. Disponible à partir de PHP 8.0.0.
H | Comme le spécificateur g mais utilise E et F. Disponible à partir de PHP 8.0.0.
o | L'argument est traité comme un entier et présenté comme un nombre octal.
s | L'argument est traité et présenté comme une chaîne de caractères.
u | L'argument est traité comme un entier et présenté comme un nombre décimal non signé.
x | L'argument est traité comme un entier et présenté comme un nombre hexadécimal (les lettres en minuscules).
X | L'argument est traité comme un entier et présenté comme un nombre hexadécimal (les lettres en majuscules).

Avertissement

Le spécificateur de type c ignore l'alignement et la taille.

Avertissement

Le fait de tenter d'utiliser une combinaison d'une chaîne et de spécificateurs avec des jeux de caractères qui nécessitent plus d'un octet par caractères donnera un résultat inattendu.

Les variables seront contraints à un type approprié pour le spécificateur :

Gestion des types
Type | Spécificateurs
string | s
integer | d, u, c, o, x, X, b
double | g, G, e, E, f, F

values

Valeurs de retour

Retourne la longueur de la chaîne retournée.

Exemples

Exemple #1 vfprintf() : zéro comme caractères d'espacements

<?php
if (!($fp = fopen('date.txt', 'w')))
    return;

vfprintf($fp, "%04d-%02d-%02d", array($year, $month, $day));
// écrira la date formatée ISO dans date.txt
?>

Voir aussi

  • printf() - Affiche une chaîne de caractères formatée
  • sprintf() - Retourne une chaîne formatée
  • fprintf() - Écrit une chaîne formatée dans un flux
  • vprintf() - Affiche une chaîne formatée
  • vsprintf() - Retourne une chaîne formatée
  • sscanf() - Analyse une chaîne à l'aide d'un format
  • fscanf() - Analyse un fichier en fonction d'un format
  • number_format() - Formate un nombre pour l'affichage
  • date() - Formate une date/heure locale

User Contributed Notes

There are no user contributed notes for this page.


Affiche une chaîne formatée

  • « vfprintf
  • vsprintf »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Affiche une chaîne formatée

vprintf

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

vprintf — Affiche une chaîne formatée

Description

vprintf ( string $format , array $values ) : int

vprintf() affiche le tableau args, sous forme de chaîne formatée grâce à format. Le format est le même que celui utilisé par sprintf().

vprintf() fonctionne comme printf(), mais accepte un tableau comme argument, au lieu d'une liste d'arguments.

Liste de paramètres

format

La chaîne de format est composé de zéro ou plusieurs directives : des caractères ordinaires (à l'exception de %) qui sont copiés directement dans le résultat et des spécifications de conversion, chacun ayant pour résultat de récupérer ses propres paramètre.

Une spécification de conversion qui suit ce prototype : %[argnum$][flags][width][.precision]specifier.

Argnum

Un entier suivit d'un signe dollar $, pour spécifier quel numéro d'argument à traiter dans la conversion.

Drapeaux
Drapeau | Description
- Justifie le texte à gauche donnée la largeur du champ ; Justification à droite est le comportement par défaut.
+ Préfixe les nombres positives avec un signe plus + ; Par défaut seul les nombres négatifs sont préfixés avec un signe négatif.
(espace) | Complète le résultat avec des espaces. Ceci est par défaut.
0 | Complète uniquement les nombres à gauches avec des zéros. Avec le spécificateur s ceci peut aussi compléter à droite avec des zéros.
'(char) | Complète le résultat avec le caractère (char).

Largeur

Un entier indiquant combien de caractères (au minimum) cette conversion doit avoir pour résultat.

Precision

Un point . suivie d'un entier dont sa signification dépend du spécificateur :

  • Pour les spécificateurs e, E, f et F : ceci est le nombre de chiffres à afficher après la virgule (par défaut, ceci est 6).
  • Pour les spécificateurs g et G : ceci est le nombre maximal de chiffres significatifs à afficher. digits to be printed.
  • Pour le spécificateur s : il agit comme un point de coupure, définissant une limite maximale de caractères de la chaîne.

Note: Si le point est spécifié sans une valeur explicite pour la précision, 0 est assumé.

Note: Tenter d'utiliser une position supérieure à PHP_INT_MAX génèrera une alerte.

Spécificateurs
Spécificateur | Description
% Un caractère de pourcentage littéral. Aucun argument n'est nécessaire.
b | L'argument est traité comme un entier et présenté comme un nombre binaire.
c | L'argument est traité comme un entier et présenté comme le caractère de code ASCII correspondant.
d | L'argument est traité comme un entier et présenté comme un nombre entier décimal (signé).
e | L'argument est traité comme une notation scientifique (e.g. 1.2e+2). Le spécificateur de précision représente le nombre de chiffres après la virgule depuis PHP 5.2.1. Dans les versions antérieures, il a été pris comme nombre des chiffres significatifs (moins un).
E | Comme le spécificateur e mais utilise une lettre majuscule (par exemple 1.2E+2).
f | L'argument est traité comme un nombre à virgule flottante (type nombre décimal) et présenté comme un nombre à virgule flottante (tenant compte de la locale utilisée).
F | L'argument est traité comme un nombre à virgule flottante (type nombre décimal) et présenté comme un nombre à virgule flottante (ne tenant pas compte de la locale utilisée). Disponible à partir de PHP 5.0.3.
g

Format général.

Soit P égal à la précision si différent de 0, 6 si la précision est omit ou 1 si la précision est zéro. Alors, si la conversion avec le style E aurait comme exposant X :

Si P > X = -4, la conversion est avec style f et précision P - (X + 1). Sinon, la conversion est avec le style e et précision P - 1.

G | Comme le spécificateur g mais utilise E et f.
h | Comme le spécificateur g mais utilise F. Disponible à partir de PHP 8.0.0.
H | Comme le spécificateur g mais utilise E et F. Disponible à partir de PHP 8.0.0.
o | L'argument est traité comme un entier et présenté comme un nombre octal.
s | L'argument est traité et présenté comme une chaîne de caractères.
u | L'argument est traité comme un entier et présenté comme un nombre décimal non signé.
x | L'argument est traité comme un entier et présenté comme un nombre hexadécimal (les lettres en minuscules).
X | L'argument est traité comme un entier et présenté comme un nombre hexadécimal (les lettres en majuscules).

Avertissement

Le spécificateur de type c ignore l'alignement et la taille.

Avertissement

Le fait de tenter d'utiliser une combinaison d'une chaîne et de spécificateurs avec des jeux de caractères qui nécessitent plus d'un octet par caractères donnera un résultat inattendu.

Les variables seront contraints à un type approprié pour le spécificateur :

Gestion des types
Type | Spécificateurs
string | s
integer | d, u, c, o, x, X, b
double | g, G, e, E, f, F

values

Valeurs de retour

Retourne la longueur de la chaîne retournée.

Exemples

Exemple #1 Exemple avec vprintf() : entiers complétés avec des zéros

<?php
vprintf("%04d-%02d-%02d", explode('-', '1988-8-1'));
?>

L'exemple ci-dessus va afficher :

1988-08-01

Voir aussi

  • printf() - Affiche une chaîne de caractères formatée
  • sprintf() - Retourne une chaîne formatée
  • fprintf() - Écrit une chaîne formatée dans un flux
  • vsprintf() - Retourne une chaîne formatée
  • vfprintf() - Écrit une chaîne formatée dans un flux
  • sscanf() - Analyse une chaîne à l'aide d'un format
  • fscanf() - Analyse un fichier en fonction d'un format
  • number_format() - Formate un nombre pour l'affichage
  • date() - Formate une date/heure locale

User Contributed Notes

phpcoder at gmail dot com 17-Jul-2019 12:43
Using the ... operator, vprintf($format, $array) is basically just printf($format, ...$array).
steve at stevelockwood dot net 18-Dec-2014 08:42
If, instead of an array, you pass an object PHP will automatically cast the object as an array so you can use it directly in vprintf.
<?php
 $object = new stdClass();
 $object->Property1 = 'Value 1';
 $object->Property2 = 'Value 2';
vprintf('%-20s %-20s', $object);

/* will output
 Value 1              Value 2
*/
?>
Chris 18-Oct-2012 05:49
Another way to display arrays is use an array_walk(). This can be useful inline echo/print where a foreach wouldn't work, e.g.

<?php
echo "These errors: ", (unset)array_walk($msgs, function($a) { echo "<p>$a</p>"; } ), "must be corrected.";
?>
taken from &#34;Php Phrasebook&#34; 15-Jun-2008 10:55
<?php
$string = 'The site runs on PHP '.phpversion();
preg_match('/php ((\d)\.\d\.\d+)/i',$string,$matches);
print_r($matches);
vprintf('Match: %s<br /> Version %s; Major:%d.',$matches);
?>

output:
Array ( [0] => PHP 5.2.5 [1] => 5.2.5 [2] => 5 )
Match: PHP 5.2.5 Version 5.2.5; Major:5.

For preg_match:

If matches  is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1]  will have the text that matched the first captured parenthesized subpattern, and so on.
badcop666 at hotmail dot com 28-Nov-2007 05:38
For blocks of text, sprintf() is slow according to my tests.

Also, having the mapping between place-holders and the list of actual variables or datastructures often makes this code difficult to read. But the printf() family are widely supported and have a huge range of nice features. Performance is a cold mistress though!

From an ease-of-reading and maintenance, debugging point of view, I much prefer HEREDOC and "...{$variable}..." methods.

For a block of HTML markup with place holders, the fastest by far was:-

?>
<div> markup etc<?= $variable ?>more markup
<?

My tests comprised 20 runs of a loop of 1 million iterations with output buffering, ditching the buffer on each loop.

The timings ranged from average 2.1msec/million repetitions for the <?= $var ?> method up to 7.6msec/million using printf().

I'll try some benchmarking tools too, since I just wrote this myself and it could be introducing bias, but they've run on dev servers with low load.

Hopefully interesting.
tehjosh at gamingg dot net 29-Jul-2007 07:19
To toolofthesystem at gmail dot com:

You don't need to use output buffering with vprintf() because you can use vsprintf(), which has the same functionality as vprintf(), except that it returns the resulting string instead of outputting it.
toolofthesystem at gmail dot com 27-Mar-2007 08:42
This function comes useful sometimes when trying to list information returned from MySQL:

function print_sql($query,$printf){
    $sql_sql = mysql_query($query);
    while($sql = mysql_fetch_row($sql_sql)){
        vprintf($printf,$sql);
    }
}

Unfortunately, this seems to sneak its way past output buffering when I tried creating an argument to allow it to be contained in a returned string... either that or I didn't do it right.
caleb at tekhawk dot com 29-Nov-2006 02:19
i know that you can use %1$s or %3$s to select the first or third string but how can you or can you use array names to select it

something like %'user'$s $'email'$s

i tend to add things to my databases over time and this could save loads of recoding


Retourne une chaîne formatée

  • « vprintf
  • wordwrap »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Retourne une chaîne formatée

vsprintf

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

vsprintf — Retourne une chaîne formatée

Description

vsprintf ( string $format , array $values ) : string

vsprintf() fonctionne comme sprintf(), mais accepte un tableau comme argument, au lieu d'une liste d'arguments.

Liste de paramètres

format

La chaîne de format est composé de zéro ou plusieurs directives : des caractères ordinaires (à l'exception de %) qui sont copiés directement dans le résultat et des spécifications de conversion, chacun ayant pour résultat de récupérer ses propres paramètre.

Une spécification de conversion qui suit ce prototype : %[argnum$][flags][width][.precision]specifier.

Argnum

Un entier suivit d'un signe dollar $, pour spécifier quel numéro d'argument à traiter dans la conversion.

Drapeaux
Drapeau | Description
- Justifie le texte à gauche donnée la largeur du champ ; Justification à droite est le comportement par défaut.
+ Préfixe les nombres positives avec un signe plus + ; Par défaut seul les nombres négatifs sont préfixés avec un signe négatif.
(espace) | Complète le résultat avec des espaces. Ceci est par défaut.
0 | Complète uniquement les nombres à gauches avec des zéros. Avec le spécificateur s ceci peut aussi compléter à droite avec des zéros.
'(char) | Complète le résultat avec le caractère (char).

Largeur

Un entier indiquant combien de caractères (au minimum) cette conversion doit avoir pour résultat.

Precision

Un point . suivie d'un entier dont sa signification dépend du spécificateur :

  • Pour les spécificateurs e, E, f et F : ceci est le nombre de chiffres à afficher après la virgule (par défaut, ceci est 6).
  • Pour les spécificateurs g et G : ceci est le nombre maximal de chiffres significatifs à afficher. digits to be printed.
  • Pour le spécificateur s : il agit comme un point de coupure, définissant une limite maximale de caractères de la chaîne.

Note: Si le point est spécifié sans une valeur explicite pour la précision, 0 est assumé.

Note: Tenter d'utiliser une position supérieure à PHP_INT_MAX génèrera une alerte.

Spécificateurs
Spécificateur | Description
% Un caractère de pourcentage littéral. Aucun argument n'est nécessaire.
b | L'argument est traité comme un entier et présenté comme un nombre binaire.
c | L'argument est traité comme un entier et présenté comme le caractère de code ASCII correspondant.
d | L'argument est traité comme un entier et présenté comme un nombre entier décimal (signé).
e | L'argument est traité comme une notation scientifique (e.g. 1.2e+2). Le spécificateur de précision représente le nombre de chiffres après la virgule depuis PHP 5.2.1. Dans les versions antérieures, il a été pris comme nombre des chiffres significatifs (moins un).
E | Comme le spécificateur e mais utilise une lettre majuscule (par exemple 1.2E+2).
f | L'argument est traité comme un nombre à virgule flottante (type nombre décimal) et présenté comme un nombre à virgule flottante (tenant compte de la locale utilisée).
F | L'argument est traité comme un nombre à virgule flottante (type nombre décimal) et présenté comme un nombre à virgule flottante (ne tenant pas compte de la locale utilisée). Disponible à partir de PHP 5.0.3.
g

Format général.

Soit P égal à la précision si différent de 0, 6 si la précision est omit ou 1 si la précision est zéro. Alors, si la conversion avec le style E aurait comme exposant X :

Si P > X = -4, la conversion est avec style f et précision P - (X + 1). Sinon, la conversion est avec le style e et précision P - 1.

G | Comme le spécificateur g mais utilise E et f.
h | Comme le spécificateur g mais utilise F. Disponible à partir de PHP 8.0.0.
H | Comme le spécificateur g mais utilise E et F. Disponible à partir de PHP 8.0.0.
o | L'argument est traité comme un entier et présenté comme un nombre octal.
s | L'argument est traité et présenté comme une chaîne de caractères.
u | L'argument est traité comme un entier et présenté comme un nombre décimal non signé.
x | L'argument est traité comme un entier et présenté comme un nombre hexadécimal (les lettres en minuscules).
X | L'argument est traité comme un entier et présenté comme un nombre hexadécimal (les lettres en majuscules).

Avertissement

Le spécificateur de type c ignore l'alignement et la taille.

Avertissement

Le fait de tenter d'utiliser une combinaison d'une chaîne et de spécificateurs avec des jeux de caractères qui nécessitent plus d'un octet par caractères donnera un résultat inattendu.

Les variables seront contraints à un type approprié pour le spécificateur :

Gestion des types
Type | Spécificateurs
string | s
integer | d, u, c, o, x, X, b
double | g, G, e, E, f, F

values

Valeurs de retour

Retourne une chaîne formatée à partir du tableau de valeurs values, et en utilisant le format format.

Historique

Version | Description
8.0.0 | Cette fonction ne retourne plus false en cas d'échec.

Exemples

Exemple #1 Exemple avec vsprintf() : entiers avec zéro initiaux

<?php
print vsprintf("%04d-%02d-%02d", explode('-', '1988-8-1'));
?>

L'exemple ci-dessus va afficher :

1988-08-01

Voir aussi

  • printf() - Affiche une chaîne de caractères formatée
  • sprintf() - Retourne une chaîne formatée
  • fprintf() - Écrit une chaîne formatée dans un flux
  • vprintf() - Affiche une chaîne formatée
  • vfprintf() - Écrit une chaîne formatée dans un flux
  • sscanf() - Analyse une chaîne à l'aide d'un format
  • fscanf() - Analyse un fichier en fonction d'un format
  • number_format() - Formate un nombre pour l'affichage
  • date() - Formate une date/heure locale

User Contributed Notes

steven at nevvix dot com 02-May-2018 04:14
<?php
/**
 * Return a formatted string like vsprintf() with named placeholders.
 *
 * When a placeholder doesn't have a matching key in `$args`,
 *   the placeholder is returned as is to see missing args.
 * @param string $format
 * @param array $args
 * @param string $pattern
 * @return string
 */
function p($format, array $args, $pattern="/\{(\w+)\}/") {
    return preg_replace_callback($pattern, function ($matches) use ($args) {
        return @$args[$matches[1]] ?: $matches[0];
    }, $format);
}

$args = ["database"=>"people", "user"=>"staff", "pass"=>"pass123", "host"=>"localhost"];

// With PHP-like placeholders: the variable is embedded in a string "{$database}" but without the dollar sign
$format = <<<SQL
CREATE DATABASE IF NOT EXISTS {database};
GRANT ALL PRIVILEGES ON {database_name}.* TO '{user}'@'{host}';
SET PASSWORD = PASSWORD('{pass}');
SQL;
echo p($format, $args);
/*
Result:

CREATE DATABASE IF NOT EXISTS people;
GRANT ALL PRIVILEGES ON {database_name}.* TO 'staff'@'localhost';
SET PASSWORD = PASSWORD('pass123');

The `{database_name}` placeholder doesn't exist as a matching key in `$args` so it's returned as is.
*/

// With Ruby-like placeholders
$format = <<<SQL
CREATE DATABASE IF NOT EXISTS :database;
GRANT ALL PRIVILEGES ON :database_name.* TO ':user'@':host';
SET PASSWORD = PASSWORD(':pass');
SQL;
echo p($format, $args, "/:(\w+)/");
/*
Result:

CREATE DATABASE IF NOT EXISTS people;
GRANT ALL PRIVILEGES ON :database_name.* TO 'staff'@'localhost';
SET PASSWORD = PASSWORD('pass123');

The `:database_name` placeholder doesn't exist as a matching key in `$args` so it's returned as is.
*/
ASchmidt at Anamera dot net 21-Nov-2017 06:58
It's necessary to clearly how to apply argument swapping when using an array of arguments. One might be tempted to use %0$ to reference $args[0].

In reality, the position specifier is always the array index+1:

$args[0]  is referenced by %1$...
$args[1]  is referenced by %2$...
etc.

Similarly, the first subpattern of a RegEx match would be found in $matches[1], the second in $match[2], etc. However if the $matches array is used as arguments to vsprint(), then the position specifier is subpattern+1:

preg_match( $pattern, $subject, $matches );
vsprintf( 'Full Match = %1$s, first Subpattern = %2$s, second Subpattern = %3$s', $matches );
spectrumcat 28-Sep-2016 10:51
Instead of inventing own functions in case you'd like to use array keys as placeholder names and replace corresponding array values in a string, just use the str_replace:

$string = 'Hello %name!';
$data = array(
  '%name' => 'John'
);

$greeting = str_replace(array_keys($data), array_values($data), $string);
dee jay simple zero07 at geemail dawt co 17-Jan-2013 05:03
Using a heredoc with vprintf:

<?php
$string = <<<THESTRING
I like the state of %1\$s <br />
I picked: %2\$d as a number, <br />
I also picked %2\$d as a number again <br />
%3\$s<br />
THESTRING;

$returnText = vprintf(  $string, array('Oregon','7','I Love Oregon')  );

echo $returnText;
?>
Josef Kufner 20-Nov-2012 11:51
<?php
/**
 * Like vsprintf, but accepts $args keys instead of order index.
 * Both numeric and strings matching /[a-zA-Z0-9_-]+/ are allowed.
 *
 * Example: vskprintf('y = %y$d, x = %x$1.1f', array('x' => 1, 'y' => 2))
 * Result:  'y = 2, x = 1.0'
 *
 * $args also can be object, then it's properties are retrieved
 * using get_object_vars().
 *
 * '%s' without argument name works fine too. Everything vsprintf() can do
 * is supported.
 *
 * @author Josef Kufner <jkufner(at)gmail.com>
 */
function vksprintf($str, $args)
{
    if (is_object($args)) {
        $args = get_object_vars($args);
    }
    $map = array_flip(array_keys($args));
    $new_str = preg_replace_callback('/(^|[^%])%([a-zA-Z0-9_-]+)\$/',
            function($m) use ($map) { return $m[1].'%'.($map[$m[2]] + 1).'$'; },
            $str);
    return vsprintf($new_str, $args);
}
?>
thomas att familie dash flori dot de 30-Oct-2012 11:46
Here is my example for named placeholders. It uses python like named placeholders except that it only allows /[a-z][a-zA-Z0-9_]/ for names.

<?php

/**
 * Returns a formatted string. Accepts named arguments.
 * @param string $format
 * @param array $args
 * @return string
 **/
function vsprintfn($format, $args) {
    // search format patterns
    preg_match_all('/((?:^|[^%])(?:%%)*)%(\([a-z][a-zA-Z0-9_]*\))?((\+|-)?(0| |\'.)?-?[0-9\.]*[bcdeEufFgGosxX])/', $format, $matches);
    // determine the order of the arguments
    $j = 0;
    $order = array();
    foreach ($matches[0] as $i => $match) {
        if ($matches[2][$i] == '') {
            $key = $j++;
        } else {
            $key = substr($matches[2][$i],1,-1);
        }
        $order[] = $key;
    }
    // prepare the data array for vsprintf in the given order
    $data = array();
    foreach ($order as $key) {
        if (isset($args[$key])) {
            $data[] = $args[$key];
        }
    }
    // replace named format patterns with default format patterns
    $format = preg_replace('/((?:^|[^%])(?:%%)*)%(\([a-z][a-zA-Z0-9_]*\))((\+|-)?(0| |\'.)?-?[0-9\.]*[bcdeEufFgGosxX])/', '$1%$3', $format);
    // return formatted string
    return vsprintf($format, $data);
}

$exampleData = array(0=>2.2314123123,'test'=>2.1234883);
echo vsprintfn('%%2.5f = %2.5f', $exampleData) . "\n";
echo vsprintfn('%%(test)09.5f = %(test)\'%9.5f', $exampleData) . "\n";

?>
strata_ranger at hotmail dot com 29-Jun-2010 11:15
Here's a simple variation on vsprintf() suitable for use with database queries where the results were retrieved as an associative array keyed by column names.

<?php

function dbsprintf($format, $fields, $row)
// $format - sprintf() compatible format string
// $row - Array containing key/value pairs of data
// $fields - Array containing key names (from $row) that are to be used as arguments
{
  // Loop through $fields and insert the corresponding values from $row
  foreach($fields as &$value)
  {
    $value = $row[$value];
  } unset($value);

  // Format the string and return
  return vsprintf($format, $fields);
}

// Some data
$row = Array('id' => '12', 'name' => 'World');

// Outputs "Hello World!"
echo dbsprintf('Hello, %s!', Array('name'), $row);
// Outputs "Hello 12!"
echo dbsprintf('Hello, %s!', Array('id'), $row);

?>
jeppe dot dyrby at gmail dot com 04-Mar-2009 04:52
Heres a new version of the vnsprintf function, i call it dsprintf, but that should matter.

<?php
function dsprintf() {
  $data = func_get_args(); // get all the arguments
  $string = array_shift($data); // the string is the first one
  if (is_array(func_get_arg(1))) { // if the second one is an array, use that
    $data = func_get_arg(1);
  }
  $used_keys = array();
  // get the matches, and feed them to our function
  $string = preg_replace('/\%\((.*?)\)(.)/e',
    'dsprintfMatch(\'$1\',\'$2\',\$data,$used_keys)',$string);
  $data = array_diff_key($data,$used_keys); // diff the data with the used_keys
  return vsprintf($string,$data); // yeah!
}

function dsprintfMatch($m1,$m2,&$data,&$used_keys) {
  if (isset($data[$m1])) { // if the key is there
    $str = $data[$m1];
    $used_keys[$m1] = $m1; // dont unset it, it can be used multiple times
    return sprintf("%".$m2,$str); // sprintf the string, so %s, or %d works like it should
  } else {
    return "%".$m2; // else, return a regular %s, or %d or whatever is used
  }
}
$str = "Hello, %(place)s, how is it hanning at %(place)s? %s works just as well";
$find = array(
  'place' => 'world',
  'sprintf',
  'not used'
);
echo dsprintf($str, $find);
// 'Hello, world, how is it hanning at world? sprintf works just as well'
?>
www dot wesley at gmail dot com 16-Jun-2008 01:56
vnsprintf is equal to vsprintf except for associative, signed or floating keys.

vnsprintf supports for example "%assocKey$05d", "%-2$'+10s" and "%3.2$05u", vsprintf doesn't

vnsprintf( '%2$d', $array) [2nd value] is equal to vsprintf( '%2$d', $array) [2nd value]
vnsprintf( '%+2$d', $array) [key = 2] is equal to vnsprintf( '%2.0$d', $array) [key = 2]
vnsprintf( '%+2$d', $array) [key = 2] is different of vsprintf( '%+2$d', $array) [unsupported]

When you use signed or floating keys, vnsprintf searchs for the signed truncated key of the original array

Note¹: vnsprintf does not support for example "%someKeyf" (floating number, key = someKey) or "%+03d" (signed decimal number, key = 3), you should use "%someKey$f" or "%+03$d" respectively.
Note²: "%+03d" (or "%1$+03d") will be interpreted as signed zero-padded decimal number

<?php
function vnsprintf( $format, array $data)
{
    preg_match_all( '/ (?<!%) % ( (?: [[:alpha:]_-][[:alnum:]_-]* | ([-+])? [0-9]+ (?(2) (?:\.[0-9]+)? | \.[0-9]+ ) ) ) \$ [-+]? \'? .? -? [0-9]* (\.[0-9]+)? \w/x', $format, $match, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
    $offset = 0;
    $keys = array_keys($data);
    foreach ( $match as &$value )
    {
        if ( ( $key = array_search( $value[1][0], $keys) ) !== FALSE || ( is_numeric( $value[1][0]) && ( $key = array_search( (int)$value[1][0], $keys) ) !== FALSE ) ) {
            $len = strlen( $value[1][0]);
            $format = substr_replace( $format, 1 + $key, $offset + $value[1][1], $len);
            $offset -= $len - strlen( $key);
        }
    }
    return vsprintf( $format, $data);
}

$examples = array(
    2.8=>'positiveFloat',    // key = 2 , 1st value
    -3=>'negativeInteger',    // key = -3 , 2nd value
    'my_name'=>'someString'    // key = my_name , 3rd value
);

echo vsprintf( "%%my_name\$s = '%my_name\$s'\n", $examples);    // [unsupported]
echo vnsprintf( "%%my_name\$s = '%my_name\$s'\n", $examples);    // output : "someString"

echo vsprintf( "%%2.5\$s = '%2.5\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%2.5\$s = '%2.5\$s'\n", $examples);        // output : "positiveFloat"

echo vsprintf( "%%+2.5\$s = '%+2.5\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%+2.5\$s = '%+2.5\$s'\n", $examples);        // output : "positiveFloat"

echo vsprintf( "%%-3.2\$s = '%-3.2\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%-3.2\$s = '%-3.2\$s'\n", $examples);        // output : "negativeInteger"

echo vsprintf( "%%2\$s = '%2\$s'\n", $examples);            // output : "negativeInteger"
echo vnsprintf( "%%2\$s = '%2\$s'\n", $examples);            // output : [= vsprintf]

echo vsprintf( "%%+2\$s = '%+2\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%+2\$s = '%+2\$s'\n", $examples);        // output : "positiveFloat"

echo vsprintf( "%%-3\$s = '%-3\$s'\n", $examples);        // [unsupported]
echo vnsprintf( "%%-3\$s = '%-3\$s'\n", $examples);        // output : "negativeInteger"
?>
Roadster 30-Sep-2006 07:44
Please note: The same functionality (sortof) can be attained between version 4.0.4 and 4.1.0 using call_user_func_array.

Example:

call_user_func_array("sprintf", $arg)

First element of $arg is the format. This rescued me in a situation where version 4.1.0 wasn't available.
jon at ardentcreative dot co dot uk 17-Feb-2006 03:56
This can be used for quick and dirty internationalization:

<?php
$GLOBALS['strings']['example'] = "There are %d people.";

// Loads a phrase from the translations list in lang/$lang/phrases.php
function t() {
    $args = func_get_args();
    $nArgs = func_num_args();

    $phrase = array_shift($args);
    $nArgs--;

    include_once("../lang/" . lang() . "/phrases.php");
    if (isset($GLOBALS['strings'][$phrase])) {
        return vsprintf($GLOBALS['strings'][$phrase], $args);
    } else {
        return '<span style="color: #ff0000">Untranslated string: ' . $phrase . '</span>';
    }
}
?>
toneee at g mail dot com 19-Dec-2005 09:27
I found this function to be useful for formatting sql queries.

I do something like this:

function sql_build($template, $params = array()) {
  global $sql_templates;
  if (isset($sql_templates[$template])) {
    $sql = vsprintf($sql_templates[$template], $params);
    return $sql;
  }
  return false;
}

// Fetch list of contacts, for a given section id
$sql_templates['contacts_by_section'] = <<<ENDSQL
select
  id,
  name,
  email,
  address,
  photo_id
from
  contacts
where
  section_id = %d
ENDSQL;

You also give yourself an added layer of security on the sql due to the sprintf formatting. For example, using %d will not allow any sql injection for that parameter.
tbS dot P dot A dot M at S dot U dot K dot Staylorbarstow dot com 01-Mar-2005 11:49
Simple but useful routine:

<?php
function vsprintf_iter($fmt,$data) {
    if (!is_array($data)) return false;
    $ret = '';
    foreach ($data as $d) {
        $ret .= vsprintf($fmt,$d);
    }
    return $ret;
}
?>
jed at NOSPAM dot jed dot bz 22-May-2004 06:48
vsprintf() accepts arrays with any keys, so the array_shift() technique is unnecessary when writing a printf-type function. Any parameters you require are easily unset from the array you retrieve with func_get_args():

<?php

function mysprintf($format) {
    $args = func_get_args();
    unset($args[0]); /* get rid of "$format" */
    return vsprintf($format, $args);
}

/* I use this technique in production code as follows: */
function logf($target, $string) {
    $args = func_get_args();
    unset($args[0], $args[1]);
    fprintf($GLOBALS['config']['logtargets'][$target],
        "[%s] %s\n", date('H:i'), wordwrap(vsprintf($string, $args), 75, '\n\r '));
}

/* e.g.:
    logf(DEBUG, "Oops! %s", mysql_error());
 */

?>

array_shift() and other costly array operations aren't required, as far as I know. I could be wrong.
samviseNOSPAM at hobbitonNOSPAM dot it 02-Jul-2002 06:55
i wrote a short function that make use of vsprintf. It is useful in first coding/debugging of php scripts, because it is called like a simple printf and it display in italic (you can change it of course ;-) ) every debug messages, making it easy to remove them when your code is ready.

here goes :

<?php
function printd() {
        $debug_array=func_get_args();
        $debug_numargs=func_num_args();
        $debug_fmt=$debug_array[0];
        for ( $i = 0 ; $i < $debug_numargs ; $i++ )
                $debug_array[$i] = $debug_array[$i+1];
        $debug_text=vsprintf($debug_fmt, $debug_array);
        printf("--> debug <i>%s</i>\n",
                $debug_text);
}
?>


Effectue la césure d'une chaîne

  • « vsprintf
  • Historique des modifications »
  • PHP Manual
  • Fonctions sur les chaînes de caractères
  • Effectue la césure d'une chaîne

wordwrap

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

wordwrap — Effectue la césure d'une chaîne

Description

wordwrap ( string $string , int $width = 75 , string $break = "\n" , bool $cut_long_words = false ) : string

Effectue la césure d'une chaîne.

Liste de paramètres

string

La chaîne d'entrée.

width

Le nombre de caractères à partir duquel la chaîne sera coupée.

break

La ligne est rompue en utilisant ce paramètre optionnel.

cut_long_words

Si le paramètre cut_long_words vaut true, la césure de la chaîne sera toujours à la taille width ou avant. Si vous avez un mot qui est plus long que la taille de césure, il sera coupé en morceaux : voir le second exemple. Lorsque vaut false, la fonction ne va pas couper le mot, même si le paramètre width est plus petit que la taille du mot.

Valeurs de retour

Retourne la chaîne fournie coupée à la longueur spécifiée.

Exemples

Exemple #1 Exemple avec wordwrap()

<?php
$text = "Portez ce vieux whisky au juge blond qui fume.";
$newtext = wordwrap($text, 20, "<br />\n");

echo $newtext;
?>

L'exemple ci-dessus va afficher :

Portez ce vieux<br />
whisky au juge<br />
blond qui fume.

Exemple #2 Exemple avec wordwrap()

<?php
$text = "Un mot très très loooooooooooooooooong.";
$newtext = wordwrap($text, 8, "\n", true);

echo "$newtext\n";
?>

L'exemple ci-dessus va afficher :

Un mot
très
très
looooooo
oooooooo
ooong.

Exemple #3 Exemple avec wordwrap()

<?php
$text = "A very long woooooooooooooooooord. and something";
$newtext = wordwrap($text, 8, "\n", false);

echo "$newtext\n";
?>

L'exemple ci-dessus va afficher :

A very
long
woooooooooooooooooord.
and
something

Voir aussi

  • nl2br() - Insère un retour à la ligne HTML à chaque nouvelle ligne
  • chunk_split() - Scinde une chaîne

User Contributed Notes

answers at clearcrescendo.com 12-Jul-2019 01:38
wordwrap() uses the break string as the line break detected, and the break inserted, so your text must be standardized to the line break you want in the wordwrap() output before using wordwrap, otherwise you will get line breaks inserted regardless of the location of existing line breaks in your text.

<?php
    $linebreak = '<br/>' . PHP_EOL;
    $width = 5;
    $standardized = preg_replace('/\r?\n/',$linebreak, "abc abc abc\nabc abc abc\r\nabc abc abc");
    echo 'Standardized EOL:', PHP_EOL, $standardized, PHP_EOL, PHP_EOL; // PHP_EOL for the command line, use '<br/>' for HTML.
    echo "Wrapped at $width:", PHP_EOL, wordwrap( $standardized, 7, $linebreak), PHP_EOL;
?>

$ php -f test.php
Standardized EOL:
abc abc abc<br/>
abc abc abc<br/>
abc abc abc

Wrapped at 5:
abc abc<br/>
abc<br/>
abc abc<br/>
abc<br/>
abc abc<br/>
abc
tuxedobob 22-May-2017 05:55
It should be noted that the behavior of the $break parameter is poorly explained.

If you specify the $break parameter, then *that string defines what the function considers a "newline"*.

Consider the following string:

$str = "Rumplestiltskin Schwartzmenikoff
1534 Gingerbread Lane
Black Forest, Germany";

You are trying to fit this address into a space that only allows for 22 characters, but you want it clear that you're continuing a previous line, so you want a space added. You might try this:

$str = wordwrap($str, 22, "\n>");

If you did that, you would end up with the following output:

"Rumplestiltskin
>Schwartzmenikoff
1534
>Gingerbread Lane
Black
>Forest, Germany"

This is because when you pass it a third parameter of "\n>", it assumes that entire string is a newline character. It's no longer using "\n". In your output, of course, \n is still a newline, so it appears to have extra lines.

If you're looking to wordwrap a multi-line string with something besides a newline character, make sure all existing linebreaks are already delineated with the string you pass to wordwrap().
simbiat at bk dot ru 08-Oct-2016 09:41
Some people use wordwrap as long text cutter. I have a slightly different approach for that. The function does not wrap the text, but returns the position where to cut. It preserves HTML tags (does not count them) and strips br tags and whitespaces at the end. I am looking into a way prevent HTML tags corruption which can happen at this time and also support BB tags like code and quote, so that they won't be counted as well. When I do, I'll post an updated version of the code.

<?php
function txtcut($string, $length) {
    $tag = false;
    $chars = 0;
    $position = 0;
    $split = str_split($string);
    foreach ($split as $char) {
        $position++;
        if ($char == "<") {
            $tag = true;
            continue;
        }
        if ($char == ">") {
            $tag = false;
            continue;
        }
        if ($tag == true) {
            continue;
        }
        $chars++;
        if ($chars >= $length) {
            if ($char == " " || $char == "\r" || $char == "\n") {
                $position--;
                break;
            }
        }
    }
    if ($position == strlen($string)) {
        return strlen($string);
    } else {
        $string = substr($string, 0, $position);
        if (substr($string, -4, 4) == "<br>") {
            $string = rtrim(substr($string, 0, -4));
        }
        return strlen($string);
    }
}
?>
kozimbek at mail dot ru 02-May-2015 01:17
After searching and being tired of many non-working mb_wordwrap functions at many places, I finally created a really simple and working solution

<?php
function mb_wordwrap($string, $limit)
{
    $string = strip_tags($string); //Strip HTML tags off the text
    $string = html_entity_decode($string); //Convert HTML special chars into normal text
    $string = str_replace(array("\r", "\n"), "", $string); //Also cut line breaks
    if(mb_strlen($string, "UTF-8") <= $limit) return $string; //If input string's length is no more than cut length, return untouched
    $last_space = mb_strrpos(mb_substr($string, 0, $limit, "UTF-8"), " ", 0, "UTF-8"); //Find the last space symbol position

    return mb_substr($string, 0, $last_space, "UTF-8").' ...'; //Return the string's length substracted till the last space and add three points
}
?>

The function simply searches the last space symbol in the range and returns the string cut till that position. No iterations, no regular expressions and no buffer overload. Tested with large Russian texts and works perfectly.
zac dot hester at gmail dot com 12-Mar-2015 02:28
I recently ran into the issue discussed by another contributor to this function (frans-jan at van-steenbeek dot R-E-M-O-V-E dot net).  The problem appeared to be how wordwrap() was treating white space.  Instead of writing my own version of wordwrap(), I discovered that the "break" parameter is not only used as the inserted string, but also used to detect the existing wrap delimiters (e.g. line endings).  If you can manage to "normalize" the wrap delimiters in your original string, you don't need to try to work-around the function wrapping at seemingly odd places (like immediately after one short word).  As one quick-and-dirty way to get wordwrap() to play nicely with most use-cases, I did this:

<?php
$break = strpos( $content, "\r" ) === false ? "\n" : "\r\n";
$content = wordwrap( $content, 78, $break );
?>

I also tend to normalize multi-line strings (if my OCD is acting up).  You would typically perform this conversion _before_ sending it off to wordwrap().

<?php
//quick and simple, but clobbers old-style Mac line-endings
$content = str_replace( "\r", '', $content );

//slower, but works with everything
$content = preg_replace( "/(\r\n|\r)/", "\n", $content );

//now, wordwrap() will behave exactly as expected
$content = wordwrap( $content, 78, "\n" );
?>
Alhadis 08-Jan-2015 12:30
For those interested in wrapping text to fit a width in *pixels* (instead of characters), you might find the following function useful; particularly for line-wrapping text over dynamically-generated images.

If a word is too long to squeeze into the available space, it'll hyphenate it as needed so it fits the container. This operates recursively, so ridiculously long words or names (e.g., URLs or this guy's signature - http://en.wikipedia.org/wiki/Wolfe+585,_Senior) will still keep getting broken off after they've passed the fourth or fifth lines, or whatever.

<?php

    /**
     * Wraps a string to a given number of pixels.
     *
     * This function operates in a similar fashion as PHP's native wordwrap function; however,
     * it calculates wrapping based on font and point-size, rather than character count. This
     * can generate more even wrapping for sentences with a consider number of thin characters.
     *
     * @static $mult;
     * @param string $text - Input string.
     * @param float $width - Width, in pixels, of the text's wrapping area.
     * @param float $size - Size of the font, expressed in pixels.
     * @param string $font - Path to the typeface to measure the text with.
     * @return string The original string with line-breaks manually inserted at detected wrapping points.
     */
    function pixel_word_wrap($text, $width, $size, $font){

        #    Passed a blank value? Bail early.
        if(!$text) return $text;

        #    Check if imagettfbbox is expecting font-size to be declared in points or pixels.
        static $mult;
        $mult    =    $mult ?: version_compare(GD_VERSION, '2.0', '>=') ? .75 : 1;

        #    Text already fits the designated space without wrapping.
        $box    =    imagettfbbox($size * $mult, 0, $font, $text);
        if($box[2] - $box[0] / $mult < $width)    return $text;

        #    Start measuring each line of our input and inject line-breaks when overflow's detected.
        $output        =    '';
        $length        =    0;

        $words        =    preg_split('/\b(?=\S)|(?=\s)/', $text);
        $word_count    =    count($words);
        for($i = 0; $i < $word_count; ++$i){

            #    Newline
            if(PHP_EOL === $words[$i])
                $length    =    0;

            #    Strip any leading tabs.
            if(!$length) $words[$i]    =    preg_replace('/^\t+/', '', $words[$i]);

            $box    =    imagettfbbox($size * $mult, 0, $font, $words[$i]);
            $m        =    $box[2] - $box[0] / $mult;

            #    This is one honkin' long word, so try to hyphenate it.
            if(($diff = $width - $m) <= 0){
                $diff    =    abs($diff);

                #    Figure out which end of the word to start measuring from. Saves a few extra cycles in an already heavy-duty function.
                if($diff - $width <= 0)    for($s = strlen($words[$i]); $s; --$s){
                    $box    =    imagettfbbox($size * $mult, 0, $font, substr($words[$i], 0, $s) . '-');
                    if($width > ($box[2] - $box[0] / $mult) + $size){
                        $breakpoint    =    $s;
                        break;
                    }
                }

                else{
                    $word_length    =    strlen($words[$i]);
                    for($s = 0; $s < $word_length; ++$s){
                        $box    =    imagettfbbox($size * $mult, 0, $font, substr($words[$i], 0, $s+1) . '-');
                        if($width < ($box[2] - $box[0] / $mult) + $size){
                            $breakpoint    =    $s;
                            break;
                        }
                    }
                }

                if($breakpoint){
                    $w_l    =    substr($words[$i], 0, $s+1) . '-';
                    $w_r    =    substr($words[$i],     $s+1);

                    $words[$i]    =    $w_l;
                    array_splice($words, $i+1, 0, $w_r);
                    ++$word_count;
                    $box    =    imagettfbbox($size * $mult, 0, $font, $w_l);
                    $m        =    $box[2] - $box[0] / $mult;
                }
            }

            #    If there's no more room on the current line to fit the next word, start a new line.
            if($length > 0 && $length + $m >= $width){
                $output    .=    PHP_EOL;
                $length    =    0;

                #    If the current word is just a space, don't bother. Skip (saves a weird-looking gap in the text).
                if(' ' === $words[$i]) continue;
            }

            #    Write another word and increase the total length of the current line.
            $output    .=    $words[$i];
            $length +=    $m;
        }

        return $output;
    };

?>
phil_marmotte at yahoo dot fr 13-Jun-2014 01:13
Another Word wrap from left or right :

public static function myWordWrap ($string, $length=3, $wrap=',', $from='left') {
        if ($from=='left') $txt=wordwrap($string, $length, $wrap, true);
            if ($from=='right') {
                $m = strlen($string)%$length;
                if ($m < strlen($string))
                    $txt = substr($string,0,$m).$wrap.wordwrap(substr($string,$m),$length, $wrap, true);
                else
                    $txt = $string;
            }

            return $txt;
       }
maikuolan at gmail dot com 11-Apr-2013 06:23
(Re: kouber at php dot net).

Testing out your function, I can confirm that it works, and it works very well.

However, others that intend to use your function need to be aware that if they use it in conjunction with unverified data (such as raw user input from $_POST, $_GET, etcetera), they are creating potential attack vectors that can be exploited by hackers via script requests containing malicious code. This is because your function is using the preg_replace function in conjunction with the "e" flag (in order to allow the chunk_split bit to execute), which can allow execution of arbitrary code.

Solution: If there is any possibility that $str may contain unverified data (such as raw user input), ensure that the contents of $str is sanitized (such as by using htmlentities/htmlspecialchars/etc) prior to sending it to wrap($str,...).

Not a criticism; I intend to use your function, because I like it. However, just posting this as a note to other users that may not be aware of the importance of data sanitation.
ju1ius 18-Feb-2012 03:58
Another solution to utf-8 safe wordwrap, unsing regular expressions.
Pretty good performance and works in linear time.

<?php
function utf8_wordwrap($string, $width=75, $break="\n", $cut=false)
{
  if($cut) {
    // Match anything 1 to $width chars long followed by whitespace or EOS,
    // otherwise match anything $width chars long
    $search = '/(.{1,'.$width.'})(?:\s|$)|(.{'.$width.'})/uS';
    $replace = '$1$2'.$break;
  } else {
    // Anchor the beginning of the pattern with a lookahead
    // to avoid crazy backtracking when words are longer than $width
    $pattern = '/(?=\s)(.{1,'.$width.'})(?:\s|$)/uS';
    $replace = '$1'.$break;
  }
  return preg_replace($search, $replace, $string);
}
?>
Of course don't forget to use preg_quote on the $width and $break parameters if they come from untrusted input.
info at hsdn dot org 08-Jul-2011 08:41
Wordwrap with UTF-8 supports, returns as array.

<?php

function mb_wordwrap_array($string, $width)
{
    if (($len = mb_strlen($string, 'UTF-8')) <= $width)
    {
        return array($string);
    }

    $return = array();
    $last_space = FALSE;
    $i = 0;

    do
    {
        if (mb_substr($string, $i, 1, 'UTF-8') == ' ')
        {
            $last_space = $i;
        }

        if ($i > $width)
        {
            $last_space = ($last_space == 0) ? $width : $last_space;

            $return[] = trim(mb_substr($string, 0, $last_space, 'UTF-8'));
            $string = mb_substr($string, $last_space, $len, 'UTF-8');
            $len = mb_strlen($string, 'UTF-8');
            $i = 0;
        }

        $i++;
    }
    while ($i < $len);

    $return[] = trim($string);

    return $return;
}

?>
altin_bardhi at yahoo dot co dot uk 27-Jan-2011 04:03
Here I have come out with a possibly very useful wordwrap code snippet.

Apparently what this piece of code does is: it takes the entered text and looks for words longer than the defined ‘$chunk_length’ if it finds any, it splits the long words and then it concatenates the whole string back to a new string with longer words separated by a dash character in this case.

After it has accomplished this task it then inserts an HTML line break after a specified ‘$line_length’ (Depending on your containers width requirements)

<?php

//Start function explode_ wrap
function explode_wrap($text, $chunk_length, $line_length){

//Explode all the words separated by spaces in a string
$string_chunks = explode(' ', $text);

// Get each split word from the array $sring_chunks_array => key => value
foreach ($string_chunks as $chunk => $value) {

if(strlen($value) >= $chunk_length){

//Split the chunks/words which are longer than $chunk_length
$new_string_chunks[$chunk] = chunk_split($value, $chunk_length, ' - ');

}else {

//Do not split the normal length words
$new_string_chunks[$chunk] = $value;

}

}//End foreach loop

//Concatenate back the all the words
$new_text=implode(' ', $new_string_chunks);

return wordwrap($new_text, $line_length, '<br />');

}//End function

?>
nbenitezl[arroba]gmail[dot]com 02-Dec-2010 04:56
Hi, this function is like wordwrap but it ignores html tags, it works like wordwrap when called with fourth parameter as true. It's based on a function I find here but improved to closer match the output of wordwrap (i.e. removed spaces at start of line) and also to improve performance.

Hope it can be useful for you :-)
<?php
function htmlwrap(&$str, $maxLength, $char='<br />'){
    $count = 0;
    $newStr = '';
    $openTag = false;
    $lenstr = strlen($str);
    for($i=0; $i<$lenstr; $i++){
        $newStr .= $str{$i};
        if($str{$i} == '<'){
            $openTag = true;
            continue;
        }
        if(($openTag) && ($str{$i} == '>')){
            $openTag = false;
            continue;
        }
        if(!$openTag){
            if($str{$i} == ' '){
                if ($count == 0) {
                    $newStr = substr($newStr,0, -1);
                    continue;
                } else {
                    $lastspace = $count + 1;
                }
            }
            $count++;
            if($count==$maxLength){
                if ($str{$i+1} != ' ' && $lastspace && ($lastspace < $count)) {
                    $tmp = ($count - $lastspace)* -1;
                    $newStr = substr($newStr,0, $tmp) . $char . substr($newStr,$tmp);
                    $count = $tmp * -1;
                } else {
                    $newStr .= $char;
                    $count = 0;
                }
                $lastspace = 0;
            }
        }
    }

    return $newStr;
}
?>
ojs-hp at web dot de 30-Oct-2009 10:06
After I got some problems with my function to convert a BB-text into HTML. Long words didn't really fit into the layout and only wordwarp() also added breaks to words which would fit into the layout or destroy the other HTML-tags....
So this is my solution. Only words with strlen() >= 40 are edited with wordwarp().

<?php
function bb2html($bb) {
        $words= explode(' ', $bb); // string to array
    foreach ($words as $word) {
        $break = 0;
        for ($i = 0; $i < strlen($word); $i++) {
            if ($break >= 40) {
                $word= wordwrap($word, 40, '-<br>', true); //add <br> every 40 chars
                $break = 0;
            }
            $break++;

        }
        $newText[] = $word; //add word to array
    }
    $bb = implode(' ', $newText); //array to string
    return $bb;
}
?>
Marcin Dobruk [zuku3000 at yahoo dot co dot uk] 15-Jun-2009 02:21
Word wrap from left to right (standard) and from right to left.

<?php
function myWordWrap ($string, $length=3, $wrap=',', $from='left') {
    if ($from=='left') $txt=wordwrap($string, $length, $wrap, true);
    if ($from=='right') {
        // string to array
        $arr_l=array();
        for ($a=0;strlen($string)>$a;$a++) $arr_l[$a]=$string{$a};
        // reverse array
        $arr_r=array_reverse($arr_l);
        // array to string
        $string_r='';
        foreach ($arr_r as $arr_line => $arr) $string_r.=$arr;
        // add wrap to reverse string
        $string_r=wordwrap($string_r, $length, $wrap, true);
        // reverse string to array
        $arr_r=array();
        for ($a=0;strlen($string_r)>$a;$a++) $arr_r[]=$string_r{$a};
        // reverse array again
        $arr_l=array_reverse($arr_r);
        // string with wrap
        $txt='';
        foreach ($arr_l as $arr_line => $arr) $txt.=$arr;
        }
    return $txt;
    }
?>
Matt at newbiewebdevelopment dot idk 04-Mar-2009 01:53
My version of multibyte wordwrap

<?php
function mb_wordwrap($string, $width=75, $break="\n", $cut = false) {
    if (!$cut) {
        $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){'.$width.',}\b#U';
    } else {
        $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){'.$width.'}#';
    }
    $string_length = mb_strlen($string,'UTF-8');
    $cut_length = ceil($string_length / $width);
    $i = 1;
    $return = '';
    while ($i < $cut_length) {
        preg_match($regexp, $string,$matches);
        $new_string = $matches[0];
        $return .= $new_string.$break;
        $string = substr($string, strlen($new_string));
        $i++;
    }
    return $return.$string;
}

$mb_string = "?????";//Hello in Japanese
$cut_mb_string = mb_wordwrap($mb_string,1," ",true); //? ? ? ? ?
print($cut_mb_string);
?>
php at maranelda dot org 16-Sep-2008 04:17
Anyone attempting to write a text email client should be aware of the following:

<?php

$a = "some text that must wrap nice";

$a = wordwrap($a, 9);

echo $a;

//  some text
//  that must
//  wrap nice

$a = wordwrap($a, 9);

echo $a;

//  some text
//  that
//  must
//  wrap
//  nice

?>

Subsequent uses of wordwrap() on already wrapped text will take the end-of-line characters into account when working out line length, thus reading each line that just fit nicely the first time around as being one character too long the second. This can be a problem when preparing a text email that contains (eg.) a forwarded email which has already been word-wrapped.

Solutions below which explode() the text on end-of-lines and wordwrap() the resulting strings separately take care of this nicely.
$del=' at '; 'sanneschaap' dot $del dot 'gmail dot com' 17-Apr-2008 01:41
These functions let you wrap strings comparing to their actual displaying width of proportional font. In this case Arial, 11px. Very handy in some cases since CSS3 is not yet completely supported. 100 strings = ~5 ms

My old sheep word wrap function (posted at the bottom of this page, is kinda old dated and this one is faster and more accurate).

<?php
//the width of the biggest char @
$fontwidth = 11;

//each chargroup has char-ords that have the same proportional displaying width
$chargroup[0] = array(64);
$chargroup[1] = array(37,87,119);
$chargroup[2] = array(65,71,77,79,81,86,89,109);
$chargroup[3] = array(38,66,67,68,72,75,78,82,83,85,88,90);
$chargroup[4] = array(35,36,43,48,49,50,51,52,53,54,55,56,57,60,61,62,63, 69,70,76,80,84,95,97,98,99,100,101,103,104,110,111,112, 113,115,117,118,120,121,122,126);
$chargroup[5] = array(74,94,107);
$chargroup[6] = array(34,40,41,42,45,96,102,114,123,125);
$chargroup[7] = array(44,46,47,58,59,91,92,93,116);
$chargroup[8] = array(33,39,73,105,106,108,124);

//how the displaying width are compared to the biggest char width
$chargroup_relwidth[0] = 1; //is char @
$chargroup_relwidth[1] = 0.909413854;
$chargroup_relwidth[2] = 0.728241563;
$chargroup_relwidth[3] = 0.637655417;
$chargroup_relwidth[4] = 0.547069272;
$chargroup_relwidth[5] = 0.456483126;
$chargroup_relwidth[6] = 0.36589698;
$chargroup_relwidth[7] = 0.275310835;
$chargroup_relwidth[8] = 0.184724689;

//build fast array
$char_relwidth = null;
for ($i=0;$i<count($chargroup);$i++){
    for ($j=0;$j<count($chargroup[$i]);$j++){
        $char_relwidth[$chargroup[$i][$j]] = $chargroup_relwidth[$i];
    }
}

//get the display width (in pixels) of a string
function get_str_width($str){
    global $fontwidth,$char_relwidth;
    $result = 0;
    for ($i=0;$i<strlen($str);$i++){
        $result += $char_relwidth[ord($str[$i])];
    }
    $result = $result * $fontwidth;
    return $result;
}

//truncates a string at a certain displaying pixel width
function truncate_str_at_width($str, $width, $trunstr='...'){
    global $fontwidth,$char_relwidth;
    $trunstr_width = get_str_width($trunstr);
    $width -= $trunstr_width;
    $width = $width/$fontwidth;
    $w = 0;
    for ($i=0;$i<strlen($str);$i++){
        $w += $char_relwidth[ord($str[$i])];
        if ($w > $width)
            break;
    }
    $result = substr($str,0,$i).$trunstr;
    return $result;
    // texas is the reason rules at 10am :)
}
?>
joachim 16-Apr-2008 02:42
There seems to be a difference between php 5.1 and 5.2 in how wordwrap counts characters (all on Mac OSX 10.5.2):

/Applications/MAMP/bin/php5/bin/php --version
PHP 5.1.6 (cli) (built: Sep  8 2006 10:25:04)

/Applications/MAMP/bin/php5/bin/php -r 'echo wordwrap("In aller Freundschaft (50)_UT", 20) . "\n";'
In aller
Freundschaft
(50)_UT

php --version
PHP 5.2.5 (cli) (built: Feb 20 2008 12:30:47)

php -r 'echo wordwrap("In aller Freundschaft (50)_UT", 20) . "\n";'
In aller
Freundschaft (50)_UT
Peter 19-Dec-2006 05:00
The main concern when you have a text in a cell is for long words that drags the cell margins. This function will break words in a text that have more then $nr characters using the "-" char.

<?php
function processtext($text,$nr=10)
    {
        $mytext=explode(" ",trim($text));
        $newtext=array();
        foreach($mytext as $k=>$txt)
        {
            if (strlen($txt)>$nr)
            {
                $txt=wordwrap($txt, $nr, "-", 1);
            }
            $newtext[]=$txt;
        }
        return implode(" ",$newtext);
    }
?>
Dave Lozier - dave at fusionbb.com 30-Nov-2005 12:48
If you'd like to break long strings of text but avoid breaking html you may find this useful. It seems to be working for me, hope it works for you. Enjoy. :)

<?php
    function textWrap($text) {
        $new_text = '';
        $text_1 = explode('>',$text);
        $sizeof = sizeof($text_1);
        for ($i=0; $i<$sizeof; ++$i) {
            $text_2 = explode('<',$text_1[$i]);
            if (!empty($text_2[0])) {
                $new_text .= preg_replace('#([^\n\r .]{25})#i', '\\1  ', $text_2[0]);
            }
            if (!empty($text_2[1])) {
                $new_text .= '<' . $text_2[1] . '>';
            }
        }
        return $new_text;
    }
?>
frans-jan at van-steenbeek dot R-E-M-O-V-E dot net 16-Nov-2005 06:17
Using wordwrap is usefull for formatting email-messages, but it has a disadvantage: line-breaks are often treated as whitespaces, resulting in odd behaviour including lines wrapped after just one word.

To work around it I use this:

<?php
 function linewrap($string, $width, $break, $cut) {
  $array = explode("\n", $string);
  $string = "";
  foreach($array as $key => $val) {
   $string .= wordwrap($val, $width, $break, $cut);
   $string .= "\n";
  }
  return $string;
 }
?>

I then use linewrap() instead of wordwrap()

hope this helps someone
bruceboughton @ google mail 04-May-2005 03:08
I found that wordwrap deletes the spaces it wraps on. If you want to break up a string which doesn't consist of words, you may find this behaviour undesirable, as I did when trying to wordwrap a Regular Expression to 80 characters (for display along with test string, matches, etc.).

To preserve the spaces and still achieve a consistent cut length, you need to replace spaces with a suitable one-character replacement. I chose the ASCII non-printing character SUB (ASCII #26; some old telephone code meaning substitute):

<?php
$regex= str_replace(' ', chr(26), $regex);
$regex= wordwrap($regex, 80, '<br />', TRUE);
$regex= str_replace(chr(26), ' ', $regex);
?>

(Of course, you need to replace 80 with your column length and '<br />' with your break string)


Historique des modifications

Les modifications suivantes ont été apportées aux classes/fonctions/méthodes de cette extension.

Version | Function | Description
8.0.0 | convert_uuencode | Antérieur à cette version, tenter de convertir une chaîne vide retournait false pour aucune raison particulière.
 | count_chars | Antérieur à cette version, la fonction retournait false en cas d'échec.
 | crypt | Le salt n'est plus optionnel.
 | html_entity_decode | encoding est désormais nullable.
 | htmlentities | encoding est désormais nullable.
 | implode | Passer le separator après array n'est plus supporté.
 | levenshtein | Antérieur à cette version, levenshtein devait être appelée avec soit deux soit cinq arguments.
 | metaphone | Cette fonction retournait false en cas d'échec.
 | number_format | Antérieur à cette version, number_format acceptée un, deux, ou quatre paramètres (mais pas trois).
 | parse_str | result n'est plus optionnel.
 | soundex | Antérieur à cette version, appeler la fonction avec une chaîne vide retournait false pour aucune raison particulière.
 | sprintf | Cette fonction ne retourne plus false en cas d'échec.
 | str_word_count | characters est désormais nullable.
 | strcspn | length est désormais nullable.
 | strip_tags | allowed_tags est désormais nullable.
 | stripos | Passing an entier as needle is no longer supported.
 | stristr | Passing an entier as needle is no longer supported.
 | strpos | Passing an entier as needle is no longer supported.
 | strrchr | Passing an entier as needle is no longer supported.
 | strripos | Passing an entier as needle is no longer supported.
 | strrpos | Passing an entier as needle is no longer supported.
 | strspn | length est désormais nullable.
 | strstr | Passing an entier as needle is no longer supported.
 | substr | length est désormais nullable.
 | substr | Cette fonction retourne une chaîne vide où auparavant elle retournait false
 | substr_compare | length est désormais nullable.
 | substr_count | length est désormais nullable.
 | substr_replace | length est désormais nullable.
 | vsprintf | Cette fonction ne retourne plus false en cas d'échec.
7.4.0 | chr | Cette fonction n'accepte plus silencieusement les codepoints non supporté, et casts ces valeurs à 0.
 | implode | Passer separator après les array (i.e. utilisant la signature antérieure) a été rendu obsolète.
 | money_format | Cette fonction est obsolète. Utiliser NumberFormatter::formatCurrency à la place.
 | str_getcsv | Le paramètre escape interprète désormais une chaîne vide en tant que signal de désactiver le mécanisme d'échappement propriétaire. Auparavant, une chaîne vide était traité comme la valeur par défaut du paramètre.
 | strip_tags | allowed_tags accepte désormais un tableau.
7.3.0 | stripos | Passer un entier comme before_needle a été rendu obsolète.
 | stristr | Passer un entier comme before_needle a été rendu obsolète.
 | strpos | Passer un entier comme before_needle a été rendu obsolète.
 | strrchr | Passer un entier comme before_needle a été rendu obsolète.
 | strripos | Passer un entier comme before_needle a été rendu obsolète.
 | strrpos | Passer un entier comme before_needle a été rendu obsolète.
 | strstr | Passer un entier comme before_needle a été rendu obsolète.
7.2.18, 7.3.5 | substr_compare | offset peut désormais être égal à la taille de haystack.
7.2.0 | number_format | number_format a été modifié pour ne plus permettre de retourner -0, précédemment -0 pouvait être retourné pour des cas où num valait -0.01.
 | parse_str | L'utilisation de parse_str sans le second argument émet une note E_DEPRECATED.
7.1.0 | str_shuffle | L'algorithme de randomisation a été modifié pour utiliser le Générateur de Nombre Aléatoire Mersenne Twister à la place de la fonction rand de libc.
 | stripos | Ajout du support des nombres négatifs pour le paramètre offset.
 | strpos | Ajout du support des nombres négatifs pour le paramètre offset.
 | substr_count | Ajout du support des nombres négatifs pour offset et length. length peut aussi être 0 maintenant.

User Contributed Notes

There are no user contributed notes for this page.


Extensions relatives aux variables et aux types

  • Les tableaux
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Tri des tableaux
    • Fonctions sur les tableaux
  • Classes/Objets — Les Classes/Objets
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Exemples
    • Fonctions Classes/Objets
  • Classkit
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Fonctions Classkit
  • ctype — Vérification des types de caractères
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Fonctions Ctype
  • Filter — Filtrage des données
    • Introduction
    • Installation/Configuration
    • Types de filtres
    • Constantes pré-définies
    • Exemples
    • Filter Fonctions
  • Gestion des fonctions
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Fonctions sur la gestion des fonctions
  • Quickhash
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Exemples
    • QuickHashIntSet — La classe QuickHashIntSet
    • QuickHashIntHash — La classe QuickHashIntHash
    • QuickHashStringIntHash — The QuickHashStringIntHash class
    • QuickHashIntStringHash — The QuickHashIntStringHash class
  • Réflection
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Exemples
    • Étendre la classe
    • Reflection — La classe Reflection
    • ReflectionClass — La classe ReflectionClass
    • ReflectionClassConstant — La classe ReflectionClassConstant
    • ReflectionZendExtension — La classe ReflectionZendExtension
    • ReflectionExtension — La classe ReflectionExtension
    • ReflectionFunction — La classe ReflectionFunction
    • ReflectionFunctionAbstract — La classe ReflectionFunctionAbstract
    • ReflectionMethod — La classe ReflectionMethod
    • ReflectionNamedType — La classe ReflectionNamedType
    • ReflectionObject — La classe ReflectionObject
    • ReflectionParameter — La classe ReflectionParameter
    • ReflectionProperty — La classe ReflectionProperty
    • ReflectionType — La classe ReflectionType
    • ReflectionUnionType — The ReflectionUnionType class
    • ReflectionGenerator — La classe ReflectionGenerator
    • ReflectionReference — The ReflectionReference class
    • Reflector — L'interface Reflector
    • ReflectionException — La classe ReflectionException
  • Gestion des variables
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Fonctions de gestion des variables

User Contributed Notes

There are no user contributed notes for this page.


Les tableaux

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Tri des tableaux
  • Fonctions sur les tableaux
    • array_change_key_case — Change la casse de toutes les clés d'un tableau
    • array_chunk — Sépare un tableau en tableaux de taille inférieure
    • array_column — Retourne les valeurs d'une colonne d'un tableau d'entrée
    • array_combine — Crée un tableau à partir de deux autres tableaux
    • array_count_values — Compte le nombre de valeurs d'un tableau
    • array_diff_assoc — Calcule la différence de deux tableaux, en prenant aussi en compte les clés
    • array_diff_key — Calcule la différence de deux tableaux en utilisant les clés pour comparaison
    • array_diff_uassoc — Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel
    • array_diff_ukey — Calcule la différence entre deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison
    • array_diff — Calcule la différence entre des tableaux
    • array_fill_keys — Remplit un tableau avec des valeurs, en spécifiant les clés
    • array_fill — Remplit un tableau avec une même valeur
    • array_filter — Filtre les éléments d'un tableau grâce à une fonction de rappel
    • array_flip — Remplace les clés par les valeurs, et les valeurs par les clés
    • array_intersect_assoc — Calcule l'intersection de deux tableaux avec des tests sur les index
    • array_intersect_key — Calcule l'intersection de deux tableaux en utilisant les clés pour comparaison
    • array_intersect_uassoc — Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
    • array_intersect_ukey — Calcule l'intersection de deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison
    • array_intersect — Calcule l'intersection de tableaux
    • array_key_exists — Vérifie si une clé existe dans un tableau
    • array_key_first — Récupère la première clé d'un tableau
    • array_key_last — Récupère la dernière clé d'un tableau
    • array_keys — Retourne toutes les clés ou un ensemble des clés d'un tableau
    • array_map — Applique une fonction sur les éléments d'un tableau
    • array_merge_recursive — Combine un ou plusieurs tableaux ensemble, récursivement
    • array_merge — Fusionne plusieurs tableaux en un seul
    • array_multisort — Trie les tableaux multidimensionnels
    • array_pad — Complète un tableau avec une valeur jusqu'à la longueur spécifiée
    • array_pop — Dépile un élément de la fin d'un tableau
    • array_product — Calcule le produit des valeurs du tableau
    • array_push — Empile un ou plusieurs éléments à la fin d'un tableau
    • array_rand — Prend une ou plusieurs clés, au hasard dans un tableau
    • array_reduce — Réduit itérativement un tableau
    • array_replace_recursive — Remplace récursivement dans le premier tableau les éléments des autres tableaux fournis
    • array_replace — Remplace les éléments d'un tableau par ceux d'autres tableaux
    • array_reverse — Inverse l'ordre des éléments d'un tableau
    • array_search — Recherche dans un tableau la clé associée à la première valeur
    • array_shift — Dépile un élément au début d'un tableau
    • array_slice — Extrait une portion de tableau
    • array_splice — Efface et remplace une portion de tableau
    • array_sum — Calcule la somme des valeurs du tableau
    • array_udiff_assoc — Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
    • array_udiff_uassoc — Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
    • array_udiff — Calcule la différence entre deux tableaux en utilisant une fonction rappel
    • array_uintersect_assoc — Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel
    • array_uintersect_uassoc — Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée
    • array_uintersect — Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel
    • array_unique — Dédoublonne un tableau
    • array_unshift — Empile un ou plusieurs éléments au début d'un tableau
    • array_values — Retourne toutes les valeurs d'un tableau
    • array_walk_recursive — Applique une fonction de rappel récursivement à chaque membre d'un tableau
    • array_walk — Exécute une fonction fournie par l'utilisateur sur chacun des éléments d'un tableau
    • array — Crée un tableau
    • arsort — Trie un tableau en ordre inverse et conserve l'association des index
    • asort — Trie un tableau et conserve l'association des index
    • compact — Crée un tableau à partir de variables et de leur valeur
    • count — Compte tous les éléments d'un tableau ou quelque chose d'un objet
    • current — Retourne l'élément courant du tableau
    • each — Retourne chaque paire clé/valeur d'un tableau
    • end — Positionne le pointeur de tableau en fin de tableau
    • extract — Importe les variables dans la table des symboles
    • in_array — Indique si une valeur appartient à un tableau
    • key_exists — Alias de array_key_exists
    • key — Retourne une clé d'un tableau associatif
    • krsort — Trie un tableau en sens inverse et suivant les clés
    • ksort — Trie un tableau suivant les clés
    • list — Assigne des variables comme si elles étaient un tableau
    • natcasesort — Trie un tableau avec l'algorithme à "ordre naturel" insensible à la casse
    • natsort — Trie un tableau avec l'algorithme à "ordre naturel"
    • next — Avance le pointeur interne d'un tableau
    • pos — Alias de current
    • prev — Recule le pointeur courant de tableau
    • range — Crée un tableau contenant un intervalle d'éléments
    • reset — Remet le pointeur interne de tableau au début
    • rsort — Trie un tableau en ordre inverse
    • shuffle — Mélange les éléments d'un tableau
    • sizeof — Alias de count
    • sort — Trie un tableau
    • uasort — Trie un tableau en utilisant une fonction de rappel
    • uksort — Trie un tableau par ses clés en utilisant une fonction de rappel
    • usort — Trie un tableau en utilisant une fonction de comparaison

User Contributed Notes

justin at jmfrazier dot com 12-Feb-2020 08:34
Using null as the key when setting an array value is NOT the same as using empty [].
<?php
  $null = null;
  $testArray = [];
  $testArray[$null] = 1;
  $testArray[$null] = 2;
  $testArray[$null] = 3;
  $testArray[$null] = 4;
  var_dump($testArray);
?>
Output:
array(1) {
  '' =>
  int(4)
}

<?php
  $testArray = [];
  $testArray[null] = 1;
  $testArray[null] = 2;
  $testArray[null] = 3;
  $testArray[null] = 4;
  var_dump($testArray);
?>
Output:
array(1) {
  '' =>
  int(4)
}

<?php
  $testArray = [];
  $testArray[] = 1;
  $testArray[] = 2;
  $testArray[] = 3;
  $testArray[] = 4;
  var_dump($testArray);
?>
Output:
array(4) {
  [0] =>
  int(1)
  [1] =>
  int(2)
  [2] =>
  int(3)
  [3] =>
  int(4)
}
web at houhejie dot cn 06-Dec-2017 02:16
string2array($str):

$arr=json_decode('["fileno",["uid","uname"],"topingid",["touid",[1,2,[3,4]],"touname"]]');
print_r($arr);

output:
Array ( [0] => fileno [1] => Array ( [0] => uid [1] => uname ) [2] => topingid [3] => Array ( [0] => touid [1] => Array ( [0] => 1 [1] => 2 [2] => Array ( [0] => 3 [1] => 4 ) ) [2] => touname ) )

when I hope a function string2array($str), "spam2"  suggest this. and It works well~~~hope this helps us,  and add to the Array function list
gratcypalma at gmail dot com 09-Sep-2013 09:57
<?php
function foo() {
    return array('name' => 'palma', 'old' => 23, 'language' => 'PHP');
}
/* 1. PHP < 5.4.0 */
$a = foo();
var_dump($a['name']);

/* 2. Works ini PHP >= 5.4.0 */

var_dump(foo()['name']);

/*
When i run second method on PHP 5.3.8 i will be show error message "PHP Fatal error:  Can't use method return value in write context"

http://www.php.net/manual/en/migration54.new-features.php
*/
spereversev at envionsoftware dot com 10-Jul-2012 10:29
<?php
function array_mask(array $array, array $keys) {
    return array_intersect_key( $array, array_fill_keys( $keys, 0 ) );
}
?>

Might be helpful to take a part of associative array containing given keys, for example, from a $_REQUEST array

array_mask($_REQUEST, array('name', 'email'));
info at curtinsNOSPAMcreations dot com 05-Nov-2010 07:49
Another way to create a multidimensional array that looks a lot cleaner is to use json_decode.  (Note that this probably adds a touch of overhead, but it sure does look nicer.)  You can of course add as many levels and as much formatting as you'd like to the string you then decode.  Don't forget that json requires " around values, not '!!  (So, you can't enclose the json string with " and use ' inside the string.)

As an example:

<?php
    $myarray['blah'] = json_decode('[
        {"label":"foo","name":"baz"},
        {"label":"boop","name":"beep"}
    ]',true);

print_r($myarray)
?>
returns:

Array
(
    [blah] => Array
        (
            [0] => Array
                (
                    [label] => foo
                    [name] => baz
                )

            [1] => Array
                (
                    [label] => boop
                    [name] => beep
                )
        )
)
dragos dot rusu at NOSPAM dot bytex dot ro 07-Mar-2010 06:15
If an array item is declared with key as NULL, array key will automatically be converted to empty string '', as follows:

<?php
$a = array(
    NULL => 'zero',
    1    => 'one',
    2    => 'two');

// This will show empty string for key associated with "zero" value
var_dump(array_keys($a));

// Array elements are shown
reset($a);
while( key($a) !== NULL )
{
  echo key($a) . ": ".current($a) . "<br>";// PHP_EOL
  next($a);
}

// Array elements are not shown
reset($a);
while( key($a) != NULL ) // '' == null   => no iteration will be executed
{
  echo key($a) . ": ".current($a) . "<br>";// PHP_EOL
  next($a);
}
John Marc 15-Feb-2010 01:30
Be careful when adding elements to a numeric array.
I wanted to store some info about some items from a database and decided to use the record id as a key.

<?php
$key=3000000000;
$DATA[$key]=true;
?>

This will create an array of 30 million elements and chances are, you will use up all memory with these 2 lines

<?php
$key=3000000000;
$DATA["$key"]=true;
?>

This on the other hand will force the array to be an associative array and will only create the one element
sunear at gmail dot com 04-Aug-2009 10:45
Made this function to delete elements in an array;

<?php

function array_del_elm($input_array, $del_indexes) {
    if (is_array($del_indexes)) {
        $indexes = $del_indexes;
    } elseif(is_string($del_indexes)) {
        $indexes = explode($del_indexes, " ");
    } elseif(is_numeric($del_indexes)) {
        $indexes[0] = (integer)$del_indexes;
    } else return;
    $del_indexes = null;

    $cur_index = 0;
    if (sort($indexes)) for($i=0; $i<count($input_array); $i++) {
        if ($i == $indexes[$cur_index]) {
            $cur_index++;
            if ($cur_index == count($indexes)) return $output_array;
            continue;
        }
        $output_array[] = $input_array[$i];
    }
    return $output_array;
}

?>

but then i saw the methods of doing the same by Tyler Bannister & Paul, could see that theirs were faster, but had floors regarding deleting multiple elements thus support of several ways of giving parameters. I combined the two methods to this to this:

<?php

function array_del_elm($target_array, $del_indexes) {
    if (is_array($del_indexes)) {
        $indexes = $del_indexes;
    } elseif(is_string($del_indexes)) {
        $indexes = explode($del_indexes, " ");
    } elseif(is_numeric($del_indexes)) {
        $indexes[0] = (integer)$del_indexes;
    } else return;
    unset($del_indexes);

    for($i=0; $i<count($indexes); $i++) {
        unset($target_array[$indexes[$i]]);
    }
    return $target_array;
}

?>

Fast, compliant and functional ;)
Tyler Bannister 11-Jun-2009 06:59
To delete an individual array element use the unset function

For example:

<?PHP
    $arr = array( "A", "B", "C" );
    unset( $arr[1] );
    // now $arr = array( "A", "C" );
?>

Unlink is for deleting files.
thomasdecaux at ebuildy dot com 15-May-2009 01:14
To browse a simple array:

<?php

foreach ($myArray AS $myItem)
{

}

?>

To browse an associative array:

<?php

foreach ($myArray AS $key=>$value)
{

}

?>

http://www.ebuildy.com
macnimble at gmail dot com 27-Mar-2009 06:59
Converting a linear array (like a mysql record set) into a tree, or multi-dimensional array can be a real bugbear. Capitalizing on references in PHP, we can 'stack' an array in one pass, using one loop, like this:

<?php
# array_stack()
# Original idea from:
# http://www.ideashower.com/our_solutions/
#   create-a-parent-child-array-structure-in-one-pass/
function array_stack (&$a, $p = '@parent', $c = '@children')
{
  $l = $t = array();
  foreach ($a AS $key => $val):
    if (!$val[$p]) $t[$key] =& $l[$key];
    else $l[$val[$p]][$c][$key] =& $l[$key];
    $l[$key] = (array)$l[$key] + $val;
  endforeach;
  return $a = array('tree' => $t, 'leaf' => $l);
}

# Example:
$node = array();
$node[1] = array('@parent' => 0, 'title' => 'I am node 1.');
#     ^-----------------------v Link @parent value to key.
$node[2] = array('@parent' => 1, 'title' => 'I am node 2.');
$node[3] = array('@parent' => 2, 'title' => 'I am node 3.');
$node[4] = array('@parent' => 1, 'title' => 'I am node 4.');
$node[5] = array('@parent' => 4, 'title' => 'I am node 5.');

array_stack($node);

$node['leaf'][1]['title'] = 'I am node one.';
$node['leaf'][2]['title'] = 'I am node two.';
$node['leaf'][3]['title'] = 'I am node three.';
$node['leaf'][4]['title'] = 'I am node four.';
$node['leaf'][5]['title'] = 'I am node five.';

echo '<pre>',print_r($node['tree'],TRUE),'</pre>';
?>

Note that there's no parameter checking on the array value, but this is only to keep the function size small. One could easily a quick check in there to make sure the $a parameter was in fact an array.

Hope you find it useful. Huge thanks to Nate Weiner of IdeaShower.com for providing the original function I built on.
andyd273 at gmail dot com 24-Feb-2009 01:12
A small correction to Endel Dreyer's PHP array to javascript array function. I just changed it to show keys correctly:

            function array2js($array,$show_keys)
            {
                $dimensoes = array();
                $valores = array();

                $total = count ($array)-1;
                $i=0;
                foreach($array as $key=>$value){
                    if (is_array($value)) {
                        $dimensoes[$i] = array2js($value,$show_keys);
                        if ($show_keys) $dimensoes[$i] = '"'.$key.'":'.$dimensoes[$i];
                    } else {
                        $dimensoes[$i] = '"'.addslashes($value).'"';
                        if ($show_keys) $dimensoes[$i] = '"'.$key.'":'.$dimensoes[$i];
                    }
                    if ($i==0) $dimensoes[$i] = '{'.$dimensoes[$i];
                    if ($i==$total) $dimensoes[$i].= '}';
                    $i++;
                }
                return implode(',',$dimensoes);
            }
Anonymous 26-Nov-2008 10:36
@jorge at andrade dot cl
This variant is faster:
<?php
function array_avg($array,$precision=2){
    if(!is_array($array))
        return 'ERROR in function array_avg(): this is a not array';

    foreach($array as $value)
        if(!is_numeric($value))
            return 'ERROR in function array_avg(): the array contains one or more non-numeric values';

    $cuantos=count($array);
  return round(array_sum($array)/$cuantos,$precision);
}
?>
webmaster at infoproducts dot x10hosting dot com 10-Oct-2008 07:13
New value can also be added to the array as shown below.
$theVariable["google"] = "http//google.com";
or
$theVariable["1"] = "http//google.com";
Jack A 07-Oct-2008 08:14
Note that arrays are not allowed in class constants and trying to do so will throw a fatal error.
contact at greyphoenix dot biz 30-Jun-2008 09:36
<?php
//Creating a multidimensional array

$theVariable = array("Search Engines" =>
array (
    0=> "http//google.com",
    1=> "http//yahoo.com",
    2=> "http//msn.com/"),

"Social Networking Sites" =>
array (
    0 => "http//www.facebook.com",
    1 => "http//www.myspace.com",
    2 => "http//vkontakte.ru",)
);

echo "The first array value is " . $theVariable['Search Engines'][0];
?>

-- Output--
The first array value is http://google.com
applegrew at rediffmail dot com 28-May-2008 08:23
For newbies like me.

Creating new arrays:-
//Creates a blank array.
$theVariable = array();

//Creates an array with elements.
$theVariable = array("A", "B", "C");

//Creating Associaive array.
$theVariable = array(1 => "http//google.com", 2=> "http://yahoo.com");

//Creating Associaive array with named keys
$theVariable = array("google" => "http//google.com", "yahoo"=> "http://yahoo.com");

Note:
New value can be added to the array as shown below.
$theVariable[] = "D";
$theVariable[] = "E";


Introduction

Ces fonctions vous permettent de travailler et de manipuler les tableaux de plusieurs façons. Les tableaux sont essentiels pour le stockage, la gestion et les opérations sur des jeux de variables.

Les tableaux simples et multidimensionnels sont supportés, et peuvent être créés soit par l'utilisateur, soit par une fonction. Il existe des fonctions spécifiques aux bases de données permettant de remplir des tableaux depuis des requêtes à la base de données, mais aussi des fonctions retournant des tableaux.

Référez-vous à la section sur les tableaux de ce manuel pour une explication détaillée sur la façon dont les tableaux sont implémentés et utilisés en PHP. Lisez également les opérateurs sur les tableaux afin de voir d'autres façons de manipuler les tableaux.

User Contributed Notes

There are no user contributed notes for this page.


Constantes pré-définies

Les constantes listées ici sont toujours disponibles dans PHP.

CASE_LOWER (entier)
CASE_LOWER est utilisée avec array_change_key_case() et sert à convertir tous les index d'un tableau en minuscules. C'est aussi le comportement par défaut de array_change_key_case().
CASE_UPPER (entier)
CASE_UPPER est utilisée avec array_change_key_case() et sert à convertir tous les index d'un tableau en majuscules.

Constantes d'ordre de tri :

SORT_ASC (entier)
SORT_ASC est utilisée avec array_multisort() pour trier en ordre ascendant.
SORT_DESC (entier)
SORT_DESC est utilisée avec array_multisort() pour trier en ordre descendant.

Autres constantes d'ordre de tri :

SORT_REGULAR (entier)
SORT_REGULAR compare normalement les valeurs d'un tri.
SORT_NUMERIC (entier)
SORT_NUMERIC compare numériquement les valeurs d'un tri.
SORT_STRING (entier)
SORT_STRING compare alphabétiquement les valeurs d'un tri.
SORT_LOCALE_STRING (entier)
SORT_LOCALE_STRING est utilisé pour comparer alphabétiquement les valeurs d'un tri, en utilisant la locale courante. Ajoutée en PHP 5.0.2.
SORT_NATURAL (entier)
SORT_NATURAL est utilisé pour comparer les éléments comme des chaînes, en utilisant un "ordre naturel" comme le fait la fonction natsort(). Ajouté en PHP 5.4.0.
SORT_FLAG_CASE (entier)
SORT_FLAG_CASE peut être combiné (avec l'opérateur bit OU) avec SORT_STRING ou SORT_NATURAL pour trier les chaînes en ne tenant pas compte de la casse. Ajouté en PHP 5.4.0.

Drapeaux de filtre :

ARRAY_FILTER_USE_KEY (entier)
ARRAY_FILTER_USE_KEY est utilisé avec array_filter() pour passer chaque clé comme premier argument à la fonction de rappel fournie. Ajouté en PHP 5.6.0.
ARRAY_FILTER_USE_BOTH (entier)
ARRAY_FILTER_USE_BOTH est utilisé avec array_filter() pour passer la valeur et la clé à la fonction de rappel fournie. Ajouté en PHP 5.6.0.

COUNT_NORMAL (entier)
COUNT_RECURSIVE (entier)
EXTR_OVERWRITE (entier)
EXTR_SKIP (entier)
EXTR_PREFIX_SAME (entier)
EXTR_PREFIX_ALL (entier)
EXTR_PREFIX_INVALID (entier)
EXTR_PREFIX_IF_EXISTS (entier)
EXTR_IF_EXISTS (entier)
EXTR_REFS (entier)

User Contributed Notes

There are no user contributed notes for this page.


Tri des tableaux

PHP dispose de nombreuses fonctions pour trier les tableaux, et cette section du manuel va vous aider à vous y retrouver.

Les différences principales sont :

  • Certains des tris de tableau sont basés sur les clés, tandis que les autres sont basés sur les valeurs : $array['cle'] = 'valeur';
  • Certains tris maintiennent la corrélation entre les clés et les valeurs, et d'autres non, ce qui signifie que les clés sont généralement réaffectées numériquement (0,1,2 ...)
  • L'ordre du tri peut être : alphabétique, croissant, décroissant, numérique, naturel, aléatoire ou personnalisé.
  • Note : toutes ces fonctions de tris travaillent sur le tableau lui-même, contrairement à la pratique normale qui serait de retourner le tableau trié.
  • Si une de ces fonctions de tri évalue 2 membres comme égaux, alors l'ordre est indéfini (le tri n'est pas stable).

Attributs de fonctions de tri
Nom de la fonction | Tri par | Association clé-valeur | Ordre de tri | Fonctions associée
array_multisort() | valeur | associatif oui, numérique non | premier tableau, ou bien options de tri | array_walk()
asort() | valeur | oui | croissant | arsort()
arsort() | valeur | oui | décroissant | asort()
krsort() | clé | oui | décroissant | ksort()
ksort() | clé | oui | croissant | asort()
natcasesort() | valeur | oui | naturel, insensible à la casse | natsort()
natsort() | valeur | oui | naturel | natcasesort()
rsort() | valeur | non | décroissant | sort()
shuffle() | valeur | non | aléatoire | array_rand()
sort() | valeur | non | croissant | rsort()
uasort() | valeur | oui | Défini par une fonction utilisateur | uksort()
uksort() | clé | oui | Défini par une fonction utilisateur | uasort()
usort() | valeur | non | Défini par une fonction utilisateur | uasort()

User Contributed Notes

Hayley Watson 24-Sep-2016 10:55
Stabilizing the sort functions (in this case, usort).

<?php
function stable_usort(&$array, $cmp)
{
    $i = 0;
    $array = array_map(function($elt)use(&$i)
    {
        return [$i++, $elt];
    }, $array);
    usort($array, function($a, $b)use($cmp)
    {
        return $cmp($a[1], $b[1]) ?: ($a[0] - $b[0]);
    });
    $array = array_column($array, 1);
}
?>

Tags each array element with its original position in the array so that when the comparison function returns 0 the tie can be broken to put the earlier element first.
&#34;Matthew Rice&#34; 17-May-2013 08:28
While this may seem obvious, user-defined array sorting functions ( uksort(), uasort(), usort() ) will *not* be called if the array does not have *at least two values in it*.

The following code:

<?php

function usortTest($a, $b) {
    var_dump($a);
    var_dump($b);
    return -1;
}

$test = array('val1');
usort($test, "usortTest");

$test2 = array('val2', 'val3');
usort($test2, "usortTest");

?>

Will output:

string(4) "val3"
string(4) "val2"

The first array doesn't get sent to the function.

Please, under no circumstance, place any logic that modifies values, or applies non-sorting business logic in these functions as they will not always be executed.
oculiz at gmail dot com 12-Mar-2011 09:57
Another way to do a case case-insensitive sort by key would simply be:

<?php
uksort($array, 'strcasecmp');
?>

Since strcasecmp is already predefined in php it saves you the trouble to actually write the comparison function yourself.


Fonctions sur les tableaux

Voir aussi

Voir aussi
is_array(),
explode(),
implode(),
split(),
preg_split() et
unset().

Sommaire

  • array_change_key_case — Change la casse de toutes les clés d'un tableau
  • array_chunk — Sépare un tableau en tableaux de taille inférieure
  • array_column — Retourne les valeurs d'une colonne d'un tableau d'entrée
  • array_combine — Crée un tableau à partir de deux autres tableaux
  • array_count_values — Compte le nombre de valeurs d'un tableau
  • array_diff_assoc — Calcule la différence de deux tableaux, en prenant aussi en compte les clés
  • array_diff_key — Calcule la différence de deux tableaux en utilisant les clés pour comparaison
  • array_diff_uassoc — Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel
  • array_diff_ukey — Calcule la différence entre deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison
  • array_diff — Calcule la différence entre des tableaux
  • array_fill_keys — Remplit un tableau avec des valeurs, en spécifiant les clés
  • array_fill — Remplit un tableau avec une même valeur
  • array_filter — Filtre les éléments d'un tableau grâce à une fonction de rappel
  • array_flip — Remplace les clés par les valeurs, et les valeurs par les clés
  • array_intersect_assoc — Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_intersect_key — Calcule l'intersection de deux tableaux en utilisant les clés pour comparaison
  • array_intersect_uassoc — Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
  • array_intersect_ukey — Calcule l'intersection de deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison
  • array_intersect — Calcule l'intersection de tableaux
  • array_key_exists — Vérifie si une clé existe dans un tableau
  • array_key_first — Récupère la première clé d'un tableau
  • array_key_last — Récupère la dernière clé d'un tableau
  • array_keys — Retourne toutes les clés ou un ensemble des clés d'un tableau
  • array_map — Applique une fonction sur les éléments d'un tableau
  • array_merge_recursive — Combine un ou plusieurs tableaux ensemble, récursivement
  • array_merge — Fusionne plusieurs tableaux en un seul
  • array_multisort — Trie les tableaux multidimensionnels
  • array_pad — Complète un tableau avec une valeur jusqu'à la longueur spécifiée
  • array_pop — Dépile un élément de la fin d'un tableau
  • array_product — Calcule le produit des valeurs du tableau
  • array_push — Empile un ou plusieurs éléments à la fin d'un tableau
  • array_rand — Prend une ou plusieurs clés, au hasard dans un tableau
  • array_reduce — Réduit itérativement un tableau
  • array_replace_recursive — Remplace récursivement dans le premier tableau les éléments des autres tableaux fournis
  • array_replace — Remplace les éléments d'un tableau par ceux d'autres tableaux
  • array_reverse — Inverse l'ordre des éléments d'un tableau
  • array_search — Recherche dans un tableau la clé associée à la première valeur
  • array_shift — Dépile un élément au début d'un tableau
  • array_slice — Extrait une portion de tableau
  • array_splice — Efface et remplace une portion de tableau
  • array_sum — Calcule la somme des valeurs du tableau
  • array_udiff_assoc — Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
  • array_udiff_uassoc — Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
  • array_udiff — Calcule la différence entre deux tableaux en utilisant une fonction rappel
  • array_uintersect_assoc — Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel
  • array_uintersect_uassoc — Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée
  • array_uintersect — Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel
  • array_unique — Dédoublonne un tableau
  • array_unshift — Empile un ou plusieurs éléments au début d'un tableau
  • array_values — Retourne toutes les valeurs d'un tableau
  • array_walk_recursive — Applique une fonction de rappel récursivement à chaque membre d'un tableau
  • array_walk — Exécute une fonction fournie par l'utilisateur sur chacun des éléments d'un tableau
  • array — Crée un tableau
  • arsort — Trie un tableau en ordre inverse et conserve l'association des index
  • asort — Trie un tableau et conserve l'association des index
  • compact — Crée un tableau à partir de variables et de leur valeur
  • count — Compte tous les éléments d'un tableau ou quelque chose d'un objet
  • current — Retourne l'élément courant du tableau
  • each — Retourne chaque paire clé/valeur d'un tableau
  • end — Positionne le pointeur de tableau en fin de tableau
  • extract — Importe les variables dans la table des symboles
  • in_array — Indique si une valeur appartient à un tableau
  • key_exists — Alias de array_key_exists
  • key — Retourne une clé d'un tableau associatif
  • krsort — Trie un tableau en sens inverse et suivant les clés
  • ksort — Trie un tableau suivant les clés
  • list — Assigne des variables comme si elles étaient un tableau
  • natcasesort — Trie un tableau avec l'algorithme à "ordre naturel" insensible à la casse
  • natsort — Trie un tableau avec l'algorithme à "ordre naturel"
  • next — Avance le pointeur interne d'un tableau
  • pos — Alias de current
  • prev — Recule le pointeur courant de tableau
  • range — Crée un tableau contenant un intervalle d'éléments
  • reset — Remet le pointeur interne de tableau au début
  • rsort — Trie un tableau en ordre inverse
  • shuffle — Mélange les éléments d'un tableau
  • sizeof — Alias de count
  • sort — Trie un tableau
  • uasort — Trie un tableau en utilisant une fonction de rappel
  • uksort — Trie un tableau par ses clés en utilisant une fonction de rappel
  • usort — Trie un tableau en utilisant une fonction de comparaison

User Contributed Notes

info at hotkey404 dot com 02-Nov-2020 08:32
Updated code of 'indioeuropeo' with option to input string-based keys.

INPUT:
array(4) {
  ["a"]=>
  string(5) "Apple"
  ["b"]=>
  string(6) "Banana"
  ["c"]=>
  string(3) "Cat"
  ["d"]=>
  string(3) "Dog"
}

OUTPUT:
array(4) {
  ["a"]=>
  string(5) "Apple"
  ["d"]=>
  string(3) "Dog"
  ["b"]=>
  string(6) "Banana"
  ["c"]=>
  string(3) "Cat"
}

FUNCTION:
<?php
function array_move_elem($array, $from, $to){
// return if non-numeric couldn't be found or from=to
    if(!is_numeric($from)){
        if(array_search($from, array_keys($array))!==FALSE){
            $from = array_search($from, array_keys($array));
        }else{
            return $array;
        }
    }
    $array_numeric_keys = array();
    foreach($array as $k => $v){
        $array_numeric_keys[] = $k;
    }
    if ($from == $to) { return $array; }
    $c = count($array_numeric_keys);
    if (($c > $from) and ($c > $to)) {
        if ($from < $to) {
            $f = $array_numeric_keys[$from];
            for ($i = $from; $i < $to; $i++) {
                $array_numeric_keys[$i] = $array_numeric_keys[$i+1];
            }
            $array_numeric_keys[$to] = $f;
        } else {
            $f = $array_numeric_keys[$from];
            for ($i = $from; $i > $to; $i--) {
                $array_numeric_keys[$i] = $array_numeric_keys[$i-1];
            }
            $array_numeric_keys[$to] = $f;
        }

    }
    $array_new = array();
    foreach($array_numeric_keys as $v){
        $array_new[$v] = $array[$v];
    }
    return $array_new;
}
?>
indioeuropeo at driverop dot com 27-May-2019 02:27
I need to take an element from the Array and change its position within the Array by moving the rest of the elements as required.
This is the function that does it. The first parameter is the working Array. The second is the position of the element to move and the third is the position where to move the element.
The function returns the modified Array.
<?php
function array_move_elem($array, $from, $to) {
    if ($from == $to) { return $array; }
    $c = count($array);
    if (($c > $from) and ($c > $to)) {
        if ($from < $to) {
            $f = $array[$from];
            for ($i = $from; $i < $to; $i++) {
                $array[$i] = $array[$i+1];
            }
            $array[$to] = $f;
        } else {
            $f = $array[$from];
            for ($i = $from; $i > $to; $i--) {
                $array[$i] = $array[$i-1];
            }
            $array[$to] = $f;
        }

    }
    return $array;
}

?>
Examples:
<?php
$array = array('Cero','Uno','Dos','Tres','Cuatro','Cinco','Seis','Siete','Ocho','Nueve','Diez');
$array = array_move_elem($array, 3, 5); // Move element in position 3 to position 5...
print_r($array);

$array = array_move_elem($array, 5, 3); // Move element in position 5 to position 3, leaving array as it was... ;)
print_r($array);

?>
Return:
<?php
Array ( [0] => Cero [1] => Uno [2] => Dos [3] => Cuatro [4] => Cinco [5] => Tres [6] => Seis [7] => Siete [8] => Ocho [9] => Nueve [10] => Diez )
Array ( [0] => Cero [1] => Uno [2] => Dos [3] => Tres [4] => Cuatro [5] => Cinco [6] => Seis [7] => Siete [8] => Ocho [9] => Nueve [10] => Diez )
?>
permanovd at gmail dot com 21-Jun-2018 10:18
A simple trick that can help you to guess what diff/intersect or sort function does by name.

[suffix] assoc - additional index check. Compares both value and index.

Example: array_diff_assoc, array_intersect_assoc.

[suffix] key - index only check. Ignores value of array, compares only indexes.

Example: array_diff_key, array_intersect_key.

[suffix] **empty** - no "key" or "assoc" word in suffix. Compares values only. Ignores indexes of array.

Example: array_diff, array_intersect.

[prefix] u - will do comparison with user defined function. Letter u can be used twice in some functions (like array_udiff_uassoc), this means that you have to use 2 functions (one for value, one for index).

Example: array_udiff_uassoc, array_uintersect_assoc.

This also works with array sort functions:

[prefix] a - associative. Will preserve keys.

Example: arsort, asort.

[prefix] k - key sort. Will sort array by keys.

Example: uksort, ksort.

[prefix] r - reverse. Will sort array in reverse order.

Example: rsort, krsort.

[prefix] u - sort by user defined function (same as for diff/intersect).

Example: usort, uasort.
DamianKaelGreen at gmail dot com 06-May-2017 04:42
While there are a lot of array functions in the PHP libs, there also seem to be a lot of rudimentary ones missing.

I went ahead and created several of my own functions for handling multiple non-associative (na) arrays including:

na_array_merge
na_array_intersect
na_array_diff
na_array_xnor
na_array_xor

If you are using Venn diagrams to think about your arrays, then these functions might be for you.

I have made them available and posted documentation for them here: https://www.greendingle.com/some-useful-non-associative-array-functions/
Ewan 28-Feb-2017 10:49
I was looking for an array aggregation function here and ended up writing this one.

Note: This implementation assumes that none of the fields you're aggregating on contain The '@' symbol.

<?php
  function array_group_by($flds, $arr) {
    $groups = array();
    foreach ($arr as $rec) {
      $keys = array_map(function($f) use($rec) { return $rec[$f]; }, $flds);
      $k = implode('@', $keys);
      if (isset($groups[$k])) {
        $groups[$k][] = $rec;
      } else {
        $groups[$k] = array($rec);
      }
    }
    return $groups;
  }

?>
nicoolasens at gmail dot com 06-Nov-2015 10:15
/*to change an index without rewriting the whole table and leave at the same place.
*/
<?php
function change_index(&$tableau, $old_key, $new_key) {
    $changed = FALSE;
    $temp = 0;
    foreach ($tableau as $key => $value) {
        switch ($changed) {
            case FALSE :
                //creates the new key and deletes the old
                if ($key == $old_key) {
                    $tableau[$new_key] = $tableau[$old_key];
                    unset($tableau[$old_key]);
                    $changed = TRUE;
                }
                break;

            case TRUE :
                //moves following keys
                if ($key != $new_key){
                $temp= $tableau[$key];
                unset($tableau[$key]);
                $tableau[$key] = $temp;
                break;
                }
                else {$changed = FALSE;} //stop
        }
    }
    array_values($tableau); //free_memory
}

//Result :
$tableau = array(1, 2 , 3, 4,5, 6, 7, 8, 9, 10);
$res = print_r($tableau, TRUE);
$longueur = strlen($res) -1;
echo "Old array :\n" . substr($res, 8, $longueur) . "\n" ;

change_index ($tableau, 2, 'number 2');
$res = print_r($tableau, TRUE);
$longueur = strlen($res) -10;
echo "New array :\n" . substr($res, 8, $longueur) . "\n" ;

/*
Old array :
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
)

New array :
    [0] => 1
    [1] => 2
    [numéro 2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
*/
?>
callmeanaguma at gmail dot com 18-Jan-2013 11:30
If you need to flattern two-dismensional array with single values assoc subarrays, you could use this function:

<?php
function arrayFlatten($array) {
        $flattern = array();
        foreach ($array as $key => $value){
            $new_key = array_keys($value);
            $flattern[] = $value[$new_key[0]];
        }
        return $flattern;
}
?>
kolkabes at googlemail dot com 05-May-2012 12:31
Short function for making a recursive array copy while cloning objects on the way.

<?php
function arrayCopy( array $array ) {
        $result = array();
        foreach( $array as $key => $val ) {
            if( is_array( $val ) ) {
                $result[$key] = arrayCopy( $val );
            } elseif ( is_object( $val ) ) {
                $result[$key] = clone $val;
            } else {
                $result[$key] = $val;
            }
        }
        return $result;
}
?>
dave at davidhbrown dot us 24-Sep-2011 11:57
While PHP has well over three-score array functions, array_rotate is strangely missing as of PHP 5.3. Searching online offered several solutions, but the ones I found have defects such as inefficiently looping through the array or ignoring keys.

The following array_rotate() function uses array_merge and array_shift to reliably rotate an array forwards or backwards, preserving keys. If you know you can trust your $array to be an array and $shift to be between 0 and the length of your array, you can skip the function definition and use just the return expression in your code.

<?php
function array_rotate($array, $shift) {
    if(!is_array($array) || !is_numeric($shift)) {
        if(!is_array($array)) error_log(__FUNCTION__.' expects first argument to be array; '.gettype($array).' received.');
        if(!is_numeric($shift)) error_log(__FUNCTION__.' expects second argument to be numeric; '.gettype($shift)." `$shift` received.");
        return $array;
    }
    $shift %= count($array); //we won't try to shift more than one array length
    if($shift < 0) $shift += count($array);//handle negative shifts as positive
    return array_merge(array_slice($array, $shift, NULL, true), array_slice($array, 0, $shift, true));
}
?>
A few simple tests:
<?php
$array=array("foo"=>1,"bar"=>2,"baz"=>3,4,5);

print_r(array_rotate($array, 2));
print_r(array_rotate($array, -2));
print_r(array_rotate($array, count($array)));
print_r(array_rotate($array, "4"));
print_r(array_rotate($array, -9));
?>
oliverSPAMMENOT at e-geek dot com dot au 22-Mar-2010 07:28
Function to pretty print arrays and objects. Detects object recursion and allows setting a maximum depth. Based on arraytostring and u_print_r from the print_r function notes. Should be called like so:

<?php
egvaluetostring($value)   //no max depth, or
egvaluetostring($value, $max_depth)   //max depth set

function egvaluetostring($value, $max_depth, $key = NULL, $depth = 0, $refChain = array()) {
  if($depth > 0)
    $tab = str_repeat("\t", $depth);
  $text .= $tab . ($key !== NULL ? $key . " => " : "");

  if (is_array($value) || is_object($value)) {
    $recursion = FALSE;
    if (is_object($value)) {
      foreach ($refChain as $refVal) {
        if ($refVal === $value) {
          $recursion = TRUE;
          break;
        }
      }
      array_push($refChain, $value);
    }

    $text .= (is_array($value) ? "array" : "object") . " ( ";

    if ($recursion) {
      $text .= "*RECURSION* ";
    }
    elseif (isset($max_depth) && $depth >= $max_depth) {
      $text .= "*MAX DEPTH REACHED* ";
    }
    else {
      if (!empty($value)) {
        $text .= "\n";
        foreach ($value as $child_key => $child_value) {
          $text .= egvaluetostring($child_value, $max_depth, (is_array($value) ? "[" : "") . $child_key . (is_array($value) ? "]" : ""), $depth+1, $refChain) . ",\n";
        }
        $text .= "\n" . $tab;
      }
    }

    $text .= ")";

    if (is_object($value)) {
      array_pop($refChain);
    }
  }
  else {
    $text .= "$value";
  }

  return $text;
}
?>
renatonascto at gmail dot com 17-Sep-2008 11:11
Big arrays use a lot of memory possibly resulting in memory limit errors. You can reduce memory usage on your script by destroying them as soon as you´re done with them. I was able to get over a few megabytes of memory by simply destroying some variables I didn´t use anymore.
You can view the memory usage/gain by using the funcion memory_get_usage(). Hope this helps!
cyberchrist at futura dot net 15-Oct-2007 06:33
Lately, dealing with databases, I've been finding myself needing to know if one array, $a, is a proper subset of $b.

Mathematically, this is asking (in set theory) [excuse the use of u and n instead of proper Unicode):

( A u B ) n ( ~ B )

What this does is it first limits to known values, then looks for anything outside of B but in the union of A and B (which would be those things in A which are not also in B).

If any value exists in this set, then A is NOT a proper subset of B, because a value exists in A but not in B.  For A to be a proper subset, all values in A must be in B.

I'm sure this could easily be done any number of ways but this seems to work for me.  It's not got a lot of error detection such as sterilizing inputs or checking input types.

// bool array_subset( array, array )
// Returns true if $a is a proper subset of $b, returns false otherwise.

function array_subset( $a, $b )
{
    if( count( array_diff( array_merge($a,$b), $b)) == 0 )
        return true;
    else
        return false;
}
mo dot longman at gmail dot com 30-Jul-2007 11:27
to 2g4wx3:
i think better way for this is using JSON, if you have such module in your PHP. See json.org.

to convert JS array to JSON string: arr.toJSONString();
to convert JSON string to PHP array: json_decode($jsonString);

You can also stringify objects, numbers, etc.
ob at babcom dot biz 28-Aug-2006 04:23
Here is a function to find out the maximum depth of a multidimensional array.

<?php
// return depth of given array
// if Array is a string ArrayDepth() will return 0
// usage: int ArrayDepth(array Array)

function ArrayDepth($Array,$DepthCount=-1,$DepthArray=array()) {
  $DepthCount++;
  if (is_array($Array))
    foreach ($Array as $Key => $Value)
      $DepthArray[]=ArrayDepth($Value,$DepthCount);
  else
    return $DepthCount;
  foreach($DepthArray as $Value)
    $Depth=$Value>$Depth?$Value:$Depth;
  return $Depth;
}
?>


Change la casse de toutes les clés d'un tableau

  • « Fonctions sur les tableaux
  • array_chunk »
  • PHP Manual
  • Fonctions sur les tableaux
  • Change la casse de toutes les clés d'un tableau

array_change_key_case

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

array_change_key_case — Change la casse de toutes les clés d'un tableau

Description

array_change_key_case ( array $array , int $case = CASE_LOWER ) : array

Modifie les clés du tableau array et force leur casse. Cette fonction laissera les clés numériques inchangées.

Liste de paramètres

array

Le tableau à traiter

case

Soit CASE_UPPER (majuscules), soit CASE_LOWER (minuscules, valeur par défaut)

Valeurs de retour

Retourne un tableau dont les clés ont été transformées en majuscule ou en minuscule, ou null si array n'est pas un tableau.

Erreurs / Exceptions

Lance une alerte de niveau E_WARNING si array n'est pas un tableau.

Exemples

Exemple #1 Exemple avec array_change_key_case()

<?php
$input_array = array("FirSt" => 1, "SecOnd" => 4);
print_r(array_change_key_case($input_array, CASE_UPPER));
?>

L'exemple ci-dessus va afficher :

Array
(
    [FIRST] => 1
    [SECOND] => 4
)

Notes

Note:

Si un tableau possède des clés qui seront identiques lors de l'exécution de cette fonction (e.g. "clé" et "CLé"), la dernière valeur dans le tableau écrasera les précédentes.

User Contributed Notes

msegit post pl 08-Jan-2021 07:54
Improved multidimensional unicode func (after qeremy):
<?php
function array_change_key_case_unicode_recurs($arr, $c = CASE_LOWER) {
    foreach ($arr as $k => $v) {
        $ret[mb_convert_case($k, (($c === CASE_LOWER) ? MB_CASE_LOWER : MB_CASE_UPPER), "UTF-8")] = (is_array($v) ? array_change_key_case_unicode_recurs($v, $c) : $v );
    }
    return $ret;
}

$arr = array("FirSt" => 1, "ZazóLc geSla jaZn" => array("yag" => "Oil", "sekER" => "sugar") );
print_r(array_change_key_case($arr, CASE_UPPER));
print_r(array_change_key_case_unicode_recurs($arr, CASE_UPPER));
?>

Array
(
    [FIRST] => 1
    [ZAzóLc GeSLa JAZn] => Array
        (
            [yag] => Oil
            [sekER] => sugar
        )
)
Array
(
    [FIRST] => 1
    [ZAZÓLC GESLA JAZN] => Array
        (
            [YAG] => Oil
            [SEKER] => sugar
        )
)
zhangxuejiang 10-Oct-2019 03:30
I improve the array_change_key_case_recursive function ,let it can lowercase or uppercase keys

function array_change_key_case_recursive($arr, $case = CASE_LOWER)
{
    return array_map(function($item) use($case) {
        if(is_array($item))
            $item = array_change_key_case_recursive($item, $case);
        return $item;
    },array_change_key_case($arr, $case));
}
shaman_master at list dot ru 12-Sep-2019 10:10
<?php
/**
 * Convert keys in an array.
 *
 * @param array $array Source data
 * @param callable $callback Function name (strtolower, strtoupper, ucfirst, lcfirst, ucwords)
 * @return array
 */
function array_convert_key_case(array $array, callable $callback = 'strtolower')
{
    return array_combine(
        array_map($callback, array_keys($array)),
        array_values($array)
    );
}
?>
ahmadz 25-Oct-2016 05:49
function convert_to_key_case($data, $case){

        $condition = ($case == 'lowercase')? 'lowercase' : 'uppercase';
        $test = [];
        foreach($data as  $key => $value) {
            if ($condition == 'lowercase') {
                $test[strtolower($key)] = $value;
            } else {
                $test[strtoupper($key)] = $value;
            }
        }
    return $test;
}

$input = ['test1'=>1, 'Test2' => 2, 'TeSt3' => 3];

print_r(convert_to_key_case($input, 'uppercase'));
print_r(convert_to_key_case($input, 'lowercase'));

OUTPUT

Array
(
 [TEST1] => 1
 [TEST2] => 2
 [TEST3] => 3
)

Array (
 [test1] => 1
 [test2] => 2
 [test3] => 3
 )
oulala at yandex dot com 10-Feb-2016 02:12
Recursive LowerCase First Letter in array key

if(!function_exists("mb_lcfirstKeys")) {
    function mb_lcfirstKeys($data) {
        $res = [];
        foreach ($data as $key => $value) {
            $newKey = mb_lcfirst($key);
            $res[$newKey] = is_array($value) ? mb_lcfirstKeys($value) : $value;
        }
        return $res;
    }
}
xsaero00 25-Apr-2014 05:33
Here is the most compact way to lower case keys in a multidimensional array

function array_change_key_case_recursive($arr)
{
    return array_map(function($item){
        if(is_array($item))
            $item = array_change_key_case_recursive($item);
        return $item;
    },array_change_key_case($arr));
}
NetPanther 22-Sep-2012 01:27
Use this to capitalize first letter of all array keys:

<?php

function ucfirstKeys(&$data)
{
  foreach ($data as $key => $value)
  {
    // Convert key
    $newKey = ucfirst($key);

    // Change key if needed
    if ($newKey != $key)
    {
      unset($data[$key]);
      $data[$newKey] = $value;
    }

    // Handle nested arrays
    if (is_array($value))
    {
      ucfirstKeys($data[$key]);
    }
  }
}

$test = array('foo' => 'bar', 'moreFoo' => array('more' => 'foo'));
ucfirstKeys($test);
print_r($test);

?>

Result:
Array ( [MoreFoo] => Array ( [More] => foo ) [Foo] => bar )
qeremy [atta] gmail [dotta] com 28-Feb-2012 05:15
Unicode example;

<?php
function array_change_key_case_unicode($arr, $c = CASE_LOWER) {
    $c = ($c == CASE_LOWER) ? MB_CASE_LOWER : MB_CASE_UPPER;
    foreach ($arr as $k => $v) {
        $ret[mb_convert_case($k, $c, "UTF-8")] = $v;
    }
    return $ret;
}

$arr = array("FirSt" => 1, "yag" => "Oil", "sekER" => "sugar");
print_r(array_change_key_case($arr, CASE_UPPER));
print_r(array_change_key_case_unicode($arr, CASE_UPPER));
?>

Array
(
    [FIRST] => 1
    [YAg] => Oil
    [sEKER] => sugar
)
Array
(
    [FIRST] => 1
    [YAG] => Oil
    [SEKER] => sugar
)
JOE 19-Oct-2011 11:13
Script to change case of sub-arrays keys to lower . It works well for me. hope it helps.

<?php
$array=array("First"=>"val1","SecoNd"=>"val2",
"third"=>array("third-INner1"=>"val3.1"),
"fourth"=>array("FouthINNer1"=>"val4.1","FourthINNER2"=>"val4.2"));
print_r($array);
$key=array_keys($array);
foreach($key as $ki)
{
    $klower=strtolower($ki);
    $val=$array[$ki];
    if(is_array($val))
    {
        foreach($val as $kinner=>$vinner)
        {

            $tl=strtolower($kinner);
            unset($val[$kinner]);
            $val[$tl]=$vinner;
        }
    }
    unset($array[$ki]);
    $array[$klower]=$val;
}
echo "<br> After Changing Key to-LowerCase : <br>";
print_r($array);

?>
Lus Henrique Pessoa 24-Sep-2010 09:03
<?php

// improving the previous script
function ack_r3(&$array, $case=CASE_LOWER, $flag_rec=false)
    {
      $array = array_change_key_case($array, $case);
      if ( $flag_rec ) {
        foreach ($array as $key => $value) {
            if ( is_array($value) ) {
                ack_r3($array[$key], $case, true);
            }
        }
      }
    }

// same of array_change_key_case
$arr = array('ID' => 1, 'NAME'=> 'Luis', 'Contact' => array('PHONE' => '3010-7148', 'E-MAIL' => 'luis@net.com') );
    ack_r3($arr, CASE_LOWER,false);
    var_dump($arr);

    $arr = array('ID' => 1, 'NAME'=> 'Luis', 'Contact' => array('PHONE' => '3010-7148', 'E-MAIL' => 'luis@net.com') );
    ack_r3($arr, CASE_LOWER,true);
    var_dump($arr);

?>

outputs:

array(3) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(4) "Luis"
  ["contact"]=>
  array(2) {
    ["PHONE"]=>
    string(9) "3010-7148"
    ["E-MAIL"]=>
    string(12) "luis@net.com"
  }
}
array(3) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(4) "Luis"
  ["contact"]=>
  array(2) {
    ["phone"]=>
    string(9) "3010-7148"
    ["e-mail"]=>
    string(12) "luis@net.com"
  }
}
Luis Henrique Pessoa 23-Sep-2010 09:25
Script to change case of sub-arrays keys:

<?php

    function arrKey2Lower(&$arrVals) {
        foreach( $arrVals as $key => $item ) {
            $key2 = strtolower($key);
            if ( $key2 != $key) {
                unset($arrVals[$key]);
                $arrVals[$key2]=$item;
                $key=$key2;
            }

            if ( is_array($item) ) { arrKey2Lower($arrValores[$key]); }
        }
    }

    $arr = array('ID' => 1, 'NAME'=> 'Luis', 'Contact' => array('PHONE' => '3010-7148', 'E-MAIL' => 'luis@net.com') );
    arrKey2Lower($arr);
    var_dump($arr);

?>

outputs:

array(3) {
  ["id"]=>
  int(1)
  ["name"]=>
  string(4) "Luis"
  ["contact"]=>
  array(2) {
    ["phone"]=>
    string(9) "3010-7148"
    ["e-mail"]=>
    string(12) "luis@net.com"
  }
}
info at microweb dot lt 29-Nov-2009 02:07
Simple function to change multidimensional array's all values to uppercase. If you would like to change to lowercase then change "mb_strtoupper" to  "mb_strtolower". It works perfect for me ;)

<?php
function change_case_recursive($arr){
    foreach ($arr as $key=>$val){
        if (!is_array($arr[$key])){
            $arr[$key]=mb_strtoupper($arr[$key]);
        }else{
            $arr[$key]=change_case_recursive($arr[$key]);
        }
    }
    return $arr;
}
?>
david at ramaboo dot com 02-Feb-2009 03:22
Same as array_change_key_case only with the values. This should really be part of PHP!

<?php
/**
 * @brief Returns an array with all values lowercased or uppercased.
 * @return array Returns an array with all values lowercased or uppercased.
 * @param object $input The array to work on
 * @param int $case [optional] Either \c CASE_UPPER or \c CASE_LOWER (default).
 */
function array_change_value_case(array $input, $case = CASE_LOWER) {
    switch ($case) {
        case CASE_LOWER:
            return array_map('strtolower', $input);
            break;
        case CASE_UPPER:
            return array_map('strtoupper', $input);
            break;
        default:
            trigger_error('Case is not valid, CASE_LOWER or CASE_UPPER only', E_USER_ERROR);
            return false;
    }
}
?>
charles 12-Jan-2009 11:38
<?php
$input_array = array("FirSt" => 1, "SecOnd" => 4);
print_r(array_change_key_case($input_array, CASE_UPPER));
?>
anon at ymous dot com 02-Dec-2008 03:19
Below is a recursive version of this function.

<?php
    /**
     * A recursive array_change_key_case function.
     * @param array $input
     * @param integer $case
     */
    function array_change_key_case_recursive($input, $case = null){
        if(!is_array($input)){
            trigger_error("Invalid input array '{$array}'",E_USER_NOTICE); exit;
        }
        // CASE_UPPER|CASE_LOWER
        if(null === $case){
            $case = CASE_LOWER;
        }
        if(!in_array($case, array(CASE_UPPER, CASE_LOWER))){
            trigger_error("Case parameter '{$case}' is invalid.", E_USER_NOTICE); exit;
        }
        $input = array_change_key_case($input, $case);
        foreach($input as $key=>$array){
            if(is_array($array)){
                $input[$key] = array_change_key_case_recursive($array, $case);
            }
        }
        return $input;
    }
?>
andreas dot schuhmacher87 at googlemail dot com 14-Apr-2008 06:01
multibyte and multi-dimensional-array support, have fun!

<?php
    define('ARRAY_KEY_FC_LOWERCASE', 25); //FOO => fOO
    define('ARRAY_KEY_FC_UPPERCASE', 20); //foo => Foo
    define('ARRAY_KEY_UPPERCASE', 15); //foo => FOO
    define('ARRAY_KEY_LOWERCASE', 10); //FOO => foo
    define('ARRAY_KEY_USE_MULTIBYTE', true); //use mutlibyte functions

    /**
    * change the case of array-keys
    *
    * use: array_change_key_case_ext(array('foo' => 1, 'bar' => 2), ARRAY_KEY_UPPERCASE);
    * result: array('FOO' => 1, 'BAR' => 2)
    *
    * @param    array
    * @param    int
    * @return     array
    */
    function array_change_key_case_ext(array $array, $case = 10, $useMB = false, $mbEnc = 'UTF-8') {
        $newArray = array();

        //for more speed define the runtime created functions in the global namespace

        //get function
        if($useMB === false) {
            $function = 'strToUpper'; //default
            switch($case) {
                //first-char-to-lowercase
                case 25:
                    //maybee lcfirst is not callable
                    if(!function_exists('lcfirst'))
                        $function = create_function('$input', '
                            return strToLower($input[0]) . substr($input, 1, (strLen($input) - 1));
                        ');
                    else $function = 'lcfirst';
                    break;

                //first-char-to-uppercase
                case 20:
                    $function = 'ucfirst';
                    break;

                //lowercase
                case 10:
                    $function = 'strToLower';
            }
        } else {
            //create functions for multibyte support
            switch($case) {
                //first-char-to-lowercase
                case 25:
                    $function = create_function('$input', '
                        return mb_strToLower(mb_substr($input, 0, 1, \'' . $mbEnc . '\')) .
                            mb_substr($input, 1, (mb_strlen($input, \'' . $mbEnc . '\') - 1), \'' . $mbEnc . '\');
                    ');

                    break;

                //first-char-to-uppercase
                case 20:
                    $function = create_function('$input', '
                        return mb_strToUpper(mb_substr($input, 0, 1, \'' . $mbEnc . '\')) .
                            mb_substr($input, 1, (mb_strlen($input, \'' . $mbEnc . '\') - 1), \'' . $mbEnc . '\');
                    ');

                    break;

                //uppercase
                case 15:
                    $function = create_function('$input', '
                        return mb_strToUpper($input, \'' . $mbEnc . '\');
                    ');
                    break;

                //lowercase
                default: //case 10:
                    $function = create_function('$input', '
                        return mb_strToLower($input, \'' . $mbEnc . '\');
                    ');
            }
        }

        //loop array
        foreach($array as $key => $value) {
            if(is_array($value)) //$value is an array, handle keys too
                $newArray[$function($key)] = array_change_key_case_ex($value, $case, $useMB);
            elseif(is_string($key))
                $newArray[$function($key)] = $value;
            else $newArray[$key] = $value; //$key is not a string
        } //end loop

        return $newArray;
    }
?>
john at doe dot com 26-Sep-2007 12:04
<?php
function array_change_value_case($input, $case = CASE_LOWER)
{
    $aRet = array();

    if (!is_array($input))
    {
        return $aRet;
    }

    foreach ($input as $key => $value)
    {
        if (is_array($value))
        {
            $aRet[$key] = array_change_value_case($value, $case);
            continue;
        }

        $aRet[$key] = ($case == CASE_UPPER ? strtoupper($value) : strtolower($value));
    }

    return $aRet;
}
?>
cm at gameswelt dot de 10-Aug-2007 04:11
I just changed the code a little bit so you havent got a code that repeats itself.

<?php

function array_change_key_case_secure($array = array(), $case = CASE_UPPER){
    $secure = array();
    $functionWrap = array(CASE_UPPER => 'strtoupper',
                            CASE_LOWER => 'strtolower');

    foreach($array as $key => $val){
        if(isset($functionWrap[$key])){
            $key = $functionWrap[$case]($key);
            $secure[$key][] = $val;
        } else {
            die('Not a known Type');
        }
    }

    foreach($secure as $key => $val){
        if(count($secure[$key]) == 1){
            $secure[$key] = $val[0];
        }
    }

    return $secure;
}

$myArray = array('A' => 'Hello',
                    'B' => 'World',
                    'a' => 'how are you?');

print_r($myArray);
$myArray = array_change_key_case_secure($myArray);
print_r($myArray);

/*
Array
(
    [A] => Hello
    [B] => World
    [a] => how are you?
)
Array
(
    [A] => Array
        (
            [0] => Hello
            [1] => how are you?
        )

    [B] => World
)
*/


Sépare un tableau en tableaux de taille inférieure

  • « array_change_key_case
  • array_column »
  • PHP Manual
  • Fonctions sur les tableaux
  • Sépare un tableau en tableaux de taille inférieure

array_chunk

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

array_chunk — Sépare un tableau en tableaux de taille inférieure

Description

array_chunk ( array $array , int $length , bool $preserve_keys = false ) : array

Sépare le tableau array en plusieurs tableaux comptant length éléments. Il est aussi possible que le dernier tableau contienne moins de valeurs.

Liste de paramètres

array

Le tableau à traiter

length

La taille de chaque tableau

preserve_keys

Lorsque définit à true, les clés seront préservées. Par défaut, vaut false ce qui réindexera le tableau résultant numériquement

Valeurs de retour

Retourne un tableau multidimensionnel indexé numériquement, commençant à zéro, dont chaque dimension contient length éléments.

Erreurs / Exceptions

Si length est inférieur à 1, une alerte de niveau E_WARNING sera émise et null retournée.

Exemples

Exemple #1 Exemple avec array_chunk()

<?php
$input_array = array('a', 'b', 'c', 'd', 'e');
print_r(array_chunk($input_array, 2));
print_r(array_chunk($input_array, 2, true));
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [0] => c
            [1] => d
        )

    [2] => Array
        (
            [0] => e
        )

)
Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [2] => c
            [3] => d
        )

    [2] => Array
        (
            [4] => e
        )

)

Voir aussi

  • array_slice() - Extrait une portion de tableau

User Contributed Notes

Anonymous 28-Dec-2020 04:21
Most easy way split array to parts

<?php

$arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

print_r(array_chunk($arr, ceil(count($arr) / 2)));
// return: [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]

print_r(array_chunk($arr, ceil(count($arr) / 3)));
// return: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]

?>
Andrew Martin 03-Jul-2018 03:43
To reverse an array_chunk, use array_merge, passing the chunks as a variadic:

<?php
$array = [1, 2, 3, 4, 5, 6, 7, 8, 9];

$chunks = array_chunk($array, 3);
// $chunks = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

$de_chunked = array_merge(…$chunks);
// $de_chunked = [1, 2, 3, 4, 5, 6, 7, 8, 9]
?>
suisuiruyi at aliyun dot com 03-Jun-2016 09:02
chunk array vertically

$arr    = range(1, 19);
function array_chunk_vertical($arr, $percolnum){
    $n = count($arr);
    $mod    = $n % $percolnum;
    $cols   = floor($n / $percolnum);
    $mod ? $cols++ : null ;
    $re     = array();
    for($col = 0; $col < $cols; $col++){
        for($row = 0; $row < $percolnum; $row++){
            if($arr){
                $re[$row][]   = array_shift($arr);
            }
        }
    }
    return $re;
}
$result = array_chunk_vertical($arr, 6);
foreach($result  as $row){
    foreach($row as $val){
        echo '['.$val.']';
    }
    echo '<br/>';
}
/*
[1][7][13][19]
[2][8][14]
[3][9][15]
[4][10][16]
[5][11][17]
[6][12][18]
 */
normiridium at gmail dot com 17-Apr-2016 10:55
A breakdown by groups with excess:

function array_chunk_greedy($arr, $count){
    $arr = array_chunk($arr, $count);
    if(($k = count($arr)-1) > 0){
        if(count($arr[$k]) < $count){
            $arr[$k-1] = array_merge($arr[$k-1], $arr[$k]);
            unset($arr[$k]);
        }
    }
    return $arr;
}

$arr = range(1, 13);
$arr = array_chunk_greedy($arr, 4);

print_r($arr);

[1,2,3,4,5,6,7,8,9,10,11,12,13] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13]

More examples:

[1,2,3,4,5,6,7,8,9,10,11,12] —> [1,2,3,4] [5,6,7,8] [9,10,11,12]
[1,2,3,4,5,6,7,8,9,10,11,12,13] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13,14]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] —> [1,2,3,4] [5,6,7,8] [9,10,11,12,13,14,15]
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] —> [1,2,3,4] [5,6,7,8] [9,10,11,12] [13,14,15,16]

Example report:

$arr = range(1, 45);
$arr = array_chunk_lazy($arr, 10);

$arr = array_map(function($sub_value) {
            return implode('<br>', $sub_value);
        }, $arr);

$title = '<h2>title</h2>';
$arr = $title.implode($title, $arr).$title;

echo $arr;
dustin at fivetechnology dot com 10-Mar-2016 06:22
Had need to chunk an object which implemented ArrayAccess Iterator Countable.  array_chunk wouldn't do it.  Should work for any list of things

<?php
   $listOfThings = array(1,2,3,4,5,6,7,8,9,10,11,12,13);
   print_r(chunk_iterable($listOfThings, 4);

  function chunk_iterable($listOfThings, $size) {
      $chunk = 0;
      $chunks = array_fill(0, ceil(count($listOfThings) / $size) - 1, array());
      $index = 0;
      foreach($listOfThings as $thing) {
        if ($index && $index % $size == 0) $chunk++;
        $chunks[$chunk][] = $thing;
        $index++;
      }
      return $chunks;
  }
?>
siddharthundare at gmail dot com 28-Sep-2015 09:00
<table>
<tr>
<?php

$array_chunkdata = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25);
$chunk  = array_chunk($array_chunkdata,5);
$rev_counter = 2;

function for_chunk($chunk_data){

    echo "<td><table>";

      foreach($chunk_data as $key => $chunk_value)
      {
        echo "<tr><td>";
        echo $chunk_value;
        echo "</td></tr>";
      }
      echo "</table></td>";

}

foreach($chunk as $key => $chunk_data)
{
    if($rev_counter%2==0)
    {
      for_chunk($chunk_data);
    }
    else
    {
      $chunk_data =  array_reverse($chunk_data);

      for_chunk($chunk_data);

    }
  $rev_counter++;
}
?>
</tr>
</table>
/*
Output:
1
2
3
4
5

10
9
8
7
6

11
12
13
14
15

20
19
18
17
16

21
22
23
24
25
*/
Anonymous 20-May-2014 10:51
Couldn't get the array_chunk_values() working, so ended up with this implementation:

<?php
function array_chunk_columns($data, $num_columns) {
  $n = count($data);
  $per_column = floor($n / $num_columns);
  $rest = $n % $num_columns;

  $columns = array();
  $index = 0;
  for ($i = 0; $i < $num_columns; $i++) {
    // Add an extra item to each column while the column number is less than the
    // remainder.
    $add_rest = ($rest && ($i < $rest)) ? 1 : 0;
    $number = $per_column + $add_rest;
    $columns[] = array_slice($data, $index, $number);
    $index += $number;
  }

  return $columns;
}

?>
stratboy 16-Sep-2013 10:22
Hi, I've made  a function to split an array into chunks based on columns wanted. For example:

<?php $a = array(1,2,3,4,5,6,7,8); ?>

goal (say, for 3 columns):

<?php
array(
   array(1,2,3),
   array(4,5,6),
   array(7,8)
);
?>

<?php
function get_array_columns($array, $columns){

        $columns_map = array();
        for($i=0; $i<$columns; $i++){ $columns_map[] = 0; }//init columns

        //create map
        $count = count($array);
        $position = 0;
        while($count > 0){
            $columns_map[$position]++;
            $position = ($position < $columns-1) ? ++$position : 0;
            $count--;
        }

        //chunk the array based on map
        $chunked = array();
        foreach($columns_map as $map){
            $chunked[] = array_splice($array,0,$map);
        }

        return $chunked;
    }//end get_array_columns
?>
nate at ruggfamily dot com 19-Jul-2010 09:00
If you just want to grab one chunk from an array, you should use array_slice().
dead dot screamer at seznam dot cz 27-Jan-2009 02:28
This function can be used to reverse effect of <?php array_Chunk()?>.
<?php
function array_Unchunk($array)
{
    return call_User_Func_Array('array_Merge',$array);
}

header('Content-Type: text/plain');
$array=array(
    array(
            'Black Canyon City',
            'Chandler',
            'Flagstaff',
            'Gilbert',
            'Glendale',
            'Globe',
    ),
    array(
            'Mesa',
            'Miami',
            'Phoenix',
            'Peoria',
            'Prescott',
            'Scottsdale',
    ),
    array(
            'Sun City',
            'Surprise',
            'Tempe',
            'Tucson',
            'Wickenburg',
    ),
);
var_Dump(array_Unchunk($array));
?>

Output:
array(17) {
  [0]=>
  string(17) "Black Canyon City"
  [1]=>
  string(8) "Chandler"
  [2]=>
  string(9) "Flagstaff"
  [3]=>
  string(7) "Gilbert"
  [4]=>
  string(8) "Glendale"
  [5]=>
  string(5) "Globe"
  [6]=>
  string(4) "Mesa"
  [7]=>
  string(5) "Miami"
  [8]=>
  string(7) "Phoenix"
  [9]=>
  string(6) "Peoria"
  [10]=>
  string(8) "Prescott"
  [11]=>
  string(10) "Scottsdale"
  [12]=>
  string(8) "Sun City"
  [13]=>
  string(8) "Surprise"
  [14]=>
  string(5) "Tempe"
  [15]=>
  string(6) "Tucson"
  [16]=>
  string(10) "Wickenburg"
}
Rasmus Schultz (http://mindplay.dk) 23-Jan-2009 01:59
Unfortunately, this function only accepts real arrays, not iterable objects... For that, you need this function:

<?php

function break_array($array, $page_size) {

  $arrays = array();
  $i = 0;

  foreach ($array as $index => $item) {
    if ($i++ % $page_size == 0) {
      $arrays[] = array();
      $current = & $arrays[count($arrays)-1];
    }
    $current[] = $item;
  }

  return $arrays;

}

?>
OIS 10-Jun-2008 05:31
Response to azspot at gmail dot com function partition.

$columns = 3;
$citylist = array('Black Canyon City', 'Chandler', 'Flagstaff', 'Gilbert', 'Glendale', 'Globe', 'Mesa', 'Miami', 'Phoenix', 'Peoria', 'Prescott', 'Scottsdale', 'Sun City', 'Surprise', 'Tempe', 'Tucson', 'Wickenburg');
print_r(array_chunk($citylist, ceil(count($citylist) / $columns)));

Output:
Array
(
    [0] => Array
        (
            [0] => Black Canyon City
            [1] => Chandler
            [2] => Flagstaff
            [3] => Gilbert
            [4] => Glendale
            [5] => Globe
        )

    [1] => Array
        (
            [0] => Mesa
            [1] => Miami
            [2] => Phoenix
            [3] => Peoria
            [4] => Prescott
            [5] => Scottsdale
        )

    [2] => Array
        (
            [0] => Sun City
            [1] => Surprise
            [2] => Tempe
            [3] => Tucson
            [4] => Wickenburg
        )

)
azspot at gmail dot com 08-May-2007 04:53
Tried to use an example below (#56022) for array_chunk_fixed that would "partition" or divide an array into a desired number of split lists -- a useful procedure for "chunking" up objects or text items into columns, or partitioning any type of data resource. However, there seems to be a flaw with array_chunk_fixed — for instance, try it with a nine item list and with four partitions. It results in 3 entries with 3 items, then a blank array.

So, here is the output of my own dabbling on the matter:

<?php

function partition( $list, $p ) {
    $listlen = count( $list );
    $partlen = floor( $listlen / $p );
    $partrem = $listlen % $p;
    $partition = array();
    $mark = 0;
    for ($px = 0; $px < $p; $px++) {
        $incr = ($px < $partrem) ? $partlen + 1 : $partlen;
        $partition[$px] = array_slice( $list, $mark, $incr );
        $mark += $incr;
    }
    return $partition;
}

$citylist = array( "Black Canyon City", "Chandler", "Flagstaff", "Gilbert", "Glendale", "Globe", "Mesa", "Miami",
                   "Phoenix", "Peoria", "Prescott", "Scottsdale", "Sun City", "Surprise", "Tempe", "Tucson", "Wickenburg" );
print_r( partition( $citylist, 3 ) );

?>

Array
(
    [0] => Array
        (
            [0] => Black Canyon City
            [1] => Chandler
            [2] => Flagstaff
            [3] => Gilbert
            [4] => Glendale
            [5] => Globe
        )

    [1] => Array
        (
            [0] => Mesa
            [1] => Miami
            [2] => Phoenix
            [3] => Peoria
            [4] => Prescott
            [5] => Scottsdale
        )

    [2] => Array
        (
            [0] => Sun City
            [1] => Surprise
            [2] => Tempe
            [3] => Tucson
            [4] => Wickenburg
        )

)
21-Mar-2006 04:19
Here my array_chunk_values( ) with values distributed by lines (columns are balanced as much as possible) :

<?php
    function array_chunk_vertical($data, $columns) {
        $n = count($data) ;
        $per_column = floor($n / $columns) ;
        $rest = $n % $columns ;

        // The map
        $per_columns = array( ) ;
        for ( $i = 0 ; $i < $columns ; $i++ ) {
            $per_columns[$i] = $per_column + ($i < $rest ? 1 : 0) ;
        }

        $tabular = array( ) ;
        foreach ( $per_columns as $rows ) {
            for ( $i = 0 ; $i < $rows ; $i++ ) {
                $tabular[$i][ ] = array_shift($data) ;
            }
        }

        return $tabular ;
    }

    header('Content-Type: text/plain') ;

    $data = array_chunk_vertical(range(1, 31), 7) ;
    foreach ( $data as $row ) {
        foreach ( $row as $value ) {
            printf('[%2s]', $value) ;
        }
        echo "\r\n" ;
    }

    /*
        Output :

        [ 1][ 6][11][16][20][24][28]
        [ 2][ 7][12][17][21][25][29]
        [ 3][ 8][13][18][22][26][30]
        [ 4][ 9][14][19][23][27][31]
        [ 5][10][15]
    */
?>
magick dit crow ot gmail dit com 16-Oct-2005 09:50
Mistake key did not do what I thought. A patch.

function array_bucket($array,$bucket_size)// bucket filter
{
    if (!is_array($array)) return false;
    $buckets=array_chunk($array,$bucket_size);// chop up array into bucket size units
    $I=0;
    foreach ($buckets as $bucket)
    {
        $new_array[$I++]=array_sum($bucket)/count($bucket);
    }
    return $new_array;// return new array
}
magick dit crow ot gmail dit com 15-Oct-2005 10:58
This function takes each few elements of an array and averages them together. It then places the averages in a new array. It is used to smooth out data. For example lets say you have a years worth of hit data to a site and you want to graph it by the week. Then use a bucket of 7 and graph the functions output.

function array_bucket($array, $bucket_size)  // bucket filter
{
    if (!is_array($array)) return false; // no empty arrays
    $buckets=array_chunk($array,$bucket_size);  // chop up array into bucket size units
    foreach ($buckets as $bucket) $new_array[key($buckets])=array_sum($bucket)/count($bucket);
    return $new_array;  // return new smooth array
}
webmaster at cafe-clope dot net 20-Aug-2005 04:27
based on the same syntax, useful about making columns :

<?php
function array_chunk_fixed($input, $num, $preserve_keys = FALSE) {
    $count = count($input) ;
    if($count)
        $input = array_chunk($input, ceil($count/$num), $preserve_keys) ;
    $input = array_pad($input, $num, array()) ;
    return $input ;
}

$array = array(1, 2, 3, 4, 5) ;
print_r(array_chunk($array, 2)) ;
print_r(array_chunk_fixed($array, 2)) ;
?>

---- array_chunk : fixed number of sub-items ----
Array(
    [0] => Array(
            [0] => 1
            [1] => 2
        )
    [1] => Array(
            [0] => 3
            [1] => 4
        )

    [2] => Array(
            [0] => 5
        )
)

---- array_chunk : fixed number of columns ----
Array(
    [0] => Array(
            [0] => 1
            [1] => 2
            [2] => 3
        )
    [1] => Array(
            [0] => 4
            [1] => 5
        )
)
phpm at nreynolds dot me dot uk 17-Dec-2004 04:21
array_chunk() is helpful when constructing tables with a known number of columns but an unknown number of values, such as a calendar month. Example:

<?php

$values = range(1, 31);
$rows = array_chunk($values, 7);

print "<table>\n";
foreach ($rows as $row) {
    print "<tr>\n";
    foreach ($row as $value) {
        print "<td>" . $value . "</td>\n";
    }
    print "</tr>\n";
}
print "</table>\n";

?>

Outputs:

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

The other direction is possible too, with the aid of a function included at the bottom of this note. Changing this line:
  $rows = array_chunk($values, 7);

To this:
  $rows = array_chunk_vertical($values, 7);

Produces a vertical calendar with seven columns:

1 6  11 16 21 26 31
2 7  12 17 22 27
3 8  13 18 23 28
4 9  14 19 24 29
5 10 15 20 25 30

You can also specify that $size refers to the number of rows, not columns:
  $rows = array_chunk_vertical($values, 7, false, false);

Producing this:

1 8  15 22 29
2 9  16 23 30
3 10 17 24 31
4 11 18 25
5 12 19 26
6 13 20 27
7 14 21 28

The function:

<?php

function array_chunk_vertical($input, $size, $preserve_keys = false, $size_is_horizontal = true)
{
    $chunks = array();

    if ($size_is_horizontal) {
        $chunk_count = ceil(count($input) / $size);
    } else {
        $chunk_count = $size;
    }

    for ($chunk_index = 0; $chunk_index < $chunk_count; $chunk_index++) {
        $chunks[] = array();
    }

    $chunk_index = 0;
    foreach ($input as $key => $value)
    {
        if ($preserve_keys) {
            $chunks[$chunk_index][$key] = $value;
        } else {
            $chunks[$chunk_index][] = $value;
        }

        if (++$chunk_index == $chunk_count) {
            $chunk_index = 0;
        }
    }

    return $chunks;
}

?>
mick at vandermostvanspijk dot nl 07-Apr-2004 03:02
[Editors note: This function was based on a previous function by gphemsley at nospam users dot sourceforge.net]

For those of you that need array_chunk() for PHP < 4.2.0, this function should do the trick:

<?php
if (!function_exists('array_chunk')) {
    function array_chunk( $input, $size, $preserve_keys = false) {
        @reset( $input );

        $i = $j = 0;

        while( @list( $key, $value ) = @each( $input ) ) {
            if( !( isset( $chunks[$i] ) ) ) {
               $chunks[$i] = array();
            }

            if( count( $chunks[$i] ) < $size ) {
                if( $preserve_keys ) {
                    $chunks[$i][$key] = $value;
                    $j++;
                } else {
                    $chunks[$i][] = $value;
                }
            } else {
                $i++;

                if( $preserve_keys ) {
                    $chunks[$i][$key] = $value;
                    $j++;
                } else {
                    $j = 0;
                    $chunks[$i][$j] = $value;
                }
            }
        }

        return $chunks;
    }
}
?>


Retourne les valeurs d'une colonne d'un tableau d'entrée

  • « array_chunk
  • array_combine »
  • PHP Manual
  • Fonctions sur les tableaux
  • Retourne les valeurs d'une colonne d'un tableau d'entrée

array_column

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

array_column — Retourne les valeurs d'une colonne d'un tableau d'entrée

Description

array_column ( array $array , int|string|null $column_key , int|string|null $index_key = null ) : array

array_column() retourne les valeurs d'une colonne de array, identifiée par la clé column_key. Optionnellement, vous pouvez fournir un paramètre index_key pour indexer les valeurs dans le tableau retourné par les valeurs de la colonne index_key du tableau d'entrée.

Liste de paramètres

array

Un tableau multi-dimensionnel ou un tableau d'objets à partir duquel on extrait une colonne de valeur. Si un tableau d'objets est fourni, alors les propriétés publiques peuvent être directement extraites. Pour que les propriétés protected ou private soient extraites, la classe doit implémenter les deux méthodes magiques __get() et __isset().

column_key

La colonne de valeurs à retourner. Cette valeur peut être la clé entière de la colonne que vous souhaitez récupérer, ou bien le nom de la clé pour un tableau associatif ou le nom de la propriété. Il peut aussi valoir null pour retourner le tableau complet ou des objets (ceci peut être utile en conjonction du paramètre index_key pour ré-indexer le tableau).

index_key

La colonne à utiliser comme index/clé pour le tableau retourné. Cette valeur peut être la clé entière de la colonne, ou le nom de la clé. La valeur est cast comme d'habitude pour les clés du tableau (cependant, les objects qui supportent une conversion en chaîne de caractère sont aussi autorisé).

Valeurs de retour

Retourne un tableau de valeurs représentant une seule colonne depuis le tableau d'entrée.

Historique

Version | Description
7.0.0 | Ajout de la possibilité pour les array paramètres d'être un tableau ou un objet.

Exemples

Exemple #1 Récupère la colonne des prénoms

<?php
// Tableau représentant un jeu d'enregistrements issu d'une base de données
$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    )
);

$first_names = array_column($records, 'first_name');
print_r($first_names);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

Exemple #2 Récupère la colonne des noms, indexé par la colonne "id"

<?php
// En utilisant le tableau de l'exemple #1
$last_names = array_column($records, 'last_name', 'id');
print_r($last_names);
?>

L'exemple ci-dessus va afficher :

Array
(
    [2135] => Doe
    [3245] => Smith
    [5342] => Jones
    [5623] => Doe
)

Exemple #3 Récupère la colonne des username depuis la propriété publique "username" d'un objet

<?php

class User
{
    public $username;

    public function __construct(string $username)
    {
        $this->username = $username;
    }
}

$users = [
    new User('user 1'),
    new User('user 2'),
    new User('user 3'),
];

print_r(array_column($users, 'username'));
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => user 1
    [1] => user 2
    [2] => user 3
)

Exemple #4 Récupère la colonne nom depuis la propriété privée "name" d'un objet en utilisant la méthode magique __get().

<?php

class Person
{
    private $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }

    public function __get($prop)
    {
        return $this->$prop;
    }

    public function __isset($prop) : bool
    {
        return isset($this->$prop);
    }
}

$people = [
    new Person('Fred'),
    new Person('Jane'),
    new Person('John'),
];

print_r(array_column($people, 'name'));
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => Fred
    [1] => Jane
    [2] => John
)
Si __isset() est non défini, alors un tableau vide sera retourné.

Voir aussi

  • » Implémentation dans l'espace utilisateur recommandée pour PHP inférieur à 5.5

User Contributed Notes

yangmeishu at live dot com 11-Jul-2020 02:19
Please note that if you use array_column to reset the index, when the index value is null, there will be different results in different PHP versions, examples
<?php

$array = [
    [
        'name' =>'Bob',
        'house' =>'big',
    ],
    [
        'name' =>'Alice',
        'house' =>'small',
    ],
    [
        'name' =>'Jack',
        'house' => null,
    ],
];
var_dump(array_column($array,null,'house'));

On 5.6.30, 7.0.0, 7.2.0 (not limited to) get the following results
array(3) {
  ["big"]=>
  array(2) {
    ["name"]=>
    string(3) "Bob"
    ["house"]=>
    string(3) "big"
  }
  ["small"]=>
  array(2) {
    ["name"]=>
    string(5) "Alice"
    ["house"]=>
    string(5) "small"
  }
  [0]=>
  array(2) {
    ["name"]=>
    string(4) "Jack"
    ["house"]=>
    NULL
  }
}

The new index, null will be converted to int, and can be incremented according to the previous index, that is, if Alice "house" is also null, then Alice's new index is "0", Jack's new index is "1"

On 7.1.21, 7.2.18, 7.4.8 (not limited to) will get the following results
array(3) {
  ["Big"]=>
  array(2) {
    ["name"]=>
    string(3) "Bob"
    ["house"]=>
    string(3) "Big"
  }
  ["small"]=>
  array(2) {
    ["name"]=>
    string(5) "Alice"
    ["house"]=>
    string(5) "small"
  }
  [""]=>
  array(2) {
    ["name"]=>
    string(4) "Jack"
    ["house"]=>
    NULL
  }
}

The new index null will be converted to an empty string
ff2 AT hotmail DOT co DOT uk 17-Aug-2018 07:40
Because the function was not available in my version of PHP, I wrote my own version and extended it a little based on my needs.

When you give an $indexkey value of -1 it preserves the associated array key values.

EXAMPLE:

$sample = array(
    'test1' => array(
        'val1' = 10,
        'val2' = 100
    ),
    'test2' => array(
        'val1' = 20,
        'val2' = 200
    ),
    'test3' => array(
        'val1' = 30,
        'val2' = 300
    )
);

print_r(array_column_ext($sample,'val1'));

OUTPUT:

Array
(
    [0] => 10
    [1] => 20
    [2] => 30
)

print_r(array_column_ext($sample,'val1',-1));

OUTPUT:

Array
(
    ['test1'] => 10
    ['test2'] => 20
    ['test3'] => 30
)

print_r(array_column_ext($sample,'val1','val2'));

OUTPUT:

Array
(
    [100] => 10
    [200] => 20
    [300] => 30
)

<?php
function array_column_ext($array, $columnkey, $indexkey = null) {
    $result = array();
    foreach ($array as $subarray => $value) {
        if (array_key_exists($columnkey,$value)) { $val = $array[$subarray][$columnkey]; }
        else if ($columnkey === null) { $val = $value; }
        else { continue; }

        if ($indexkey === null) { $result[] = $val; }
        elseif ($indexkey == -1 || array_key_exists($indexkey,$value)) {
            $result[($indexkey == -1)?$subarray:$array[$subarray][$indexkey]] = $val;
        }
    }
    return $result;
}
?>
balbuf 16-May-2018 02:54
This function does not preserve the original keys of the array (when not providing an index_key).

You can work around that like so:

<?php
// instead of
array_column($array, 'column');

// to preserve keys
array_combine(array_keys($array), array_column($array, 'column'));
?>
Dominik59 17-Aug-2017 02:26
Presented function is good when You want to flatten nested array base on only one column, but if You want to flatten whole array You can use this method:

/**
     * Method that transforms nested array into the flat one in below showed way:
     * [
     *      [
     *          [0]=>'today',
     *      ],
     *      [
     *          [0]=>'is',
     *          [1]=>'very',
     *          [2]=>   [
     *                      [0]=>'warm'
     *                  ],
     *      ],
     * ]
     *
     * Into:
     *
     * ['today','is','very','warm']
     *
     * @param $input
     * @return array
     */
    private function transformNestedArrayToFlatArray($input)
    {
        $output_array = [];
        if (is_array($input)) {
            foreach ($input as $value) {
                if (is_array($value)) {
                    $output_array = array_merge($output_array, $this->transformNestedArrayToFlatArray($value));
                } else {
                    array_push($output_array, $value);
                }
            }
        } else {
            array_push($output_array, $input);
        }

        return $output_array;
    }
robsonvnasc at gmail dot com 10-Aug-2017 05:11
Retrieve multiple columns from an array:

$columns_wanted = array('foo','bar');
$array = array('foo'=>1,'bar'=>2,'foobar'=>3);

$filtered_array = array_intersect_key(array_fill_keys($columns_wanted,''));

//filtered_array
// array('foo'=>1,'bar'=>2);
1184427175 at qq dot com 21-Jul-2017 02:52
//php < 5.5
if(function_exists('array_column'))
{
    function array_column($arr_data, $col)
    {
        $result = array_map(function($arr){return $arr[$col]}, $arr_data);
        return $result;
    }
}
katrinaelaine6 at gmail dot com 28-Feb-2017 07:13
array_column() will return duplicate values.

Instead of having to use array_unique(), use the $index_key as a hack.

**Caution: This may get messy when setting the $column_key and/or $index_key as integers.**

<?php

$records = [
        [ 'id' => 2135, 'first_name' => 'John' ],
    [ 'id' => 3245, 'first_name' => 'Sally' ],
    [ 'id' => 5342, 'first_name' => 'Jane' ],
    [ 'id' => 5623, 'first_name' => 'Peter' ],
        [ 'id' => 6982, 'first_name' => 'Sally' ]
];

print_r(array_unique(array_column($records, 'first_name')));

// Force uniqueness by making the key the value.
print_r(array_column($records, 'first_name', 'first_name'));
print_r(array_column($records, 'id', 'first_name'));

// Returns
/*

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

Array
(
    [John] => John
    [Sally] => Sally
    [Jane] => Jane
    [Peter] => Peter
)

Array
(
    [John] => 2135
    [Sally] => 6982
    [Jane] => 5342
    [Peter] => 5623
)

*/

?>
Carlos Granados 30-Sep-2016 03:41
Here's a neat little snippet for filtering a set of records based on a the value of a column:

<?php

function dictionaryFilterList(array $source, array $data, string $column) : array
{
    $new     = array_column($data, $column);
    $keep     = array_diff($new, $source);

    return array_intersect_key($data, $keep);
 }

// Usage:

$users = [
    ['first_name' => 'Jed', 'last_name' => 'Lopez'],
    ['first_name' => 'Carlos', 'last_name' => 'Granados'],
    ['first_name' => 'Dirty', 'last_name' => 'Diana'],
    ['first_name' => 'John', 'last_name' => 'Williams'],
    ['first_name' => 'Betty', 'last_name' => 'Boop'],
    ['first_name' => 'Dan', 'last_name' => 'Daniels'],
    ['first_name' => 'Britt', 'last_name' => 'Anderson'],
    ['first_name' => 'Will', 'last_name' => 'Smith'],
    ['first_name' => 'Magic', 'last_name' => 'Johnson'],
];

var_dump(dictionaryFilterList(['Dirty', 'Dan'], $users, 'first_name'));

// Outputs:
[
    ['first_name' => 'Jed', 'last_name' => 'Lopez'],
    ['first_name' => 'Carlos', 'last_name' => 'Granados'],
    ['first_name' => 'John', 'last_name' => 'Williams'],
    ['first_name' => 'Betty', 'last_name' => 'Boop'],
    ['first_name' => 'Britt', 'last_name' => 'Anderson'],
    ['first_name' => 'Will', 'last_name' => 'Smith'],
    ['first_name' => 'Magic', 'last_name' => 'Johnson']
]

?>
nino at recgr dot com 26-Sep-2016 08:21
array_column implementation that works on multidimensional arrays (not just 2-dimensional):

<?php
function array_column_recursive(array $haystack, $needle) {
    $found = [];
    array_walk_recursive($haystack, function($value, $key) use (&$found, $needle) {
        if ($key == $needle)
            $found[] = $value;
    });
    return $found;
}

Taken from https://github.com/NinoSkopac/array_column_recursive
miguelfzarth at gmail dot com 18-Aug-2016 02:02
<?php
# for PHP < 5.5
# AND it works with arrayObject AND array of objects

if (!function_exists('array_column')) {
    function array_column($array, $columnKey, $indexKey = null)
    {
        $result = array();
        foreach ($array as $subArray) {
            if (is_null($indexKey) && array_key_exists($columnKey, $subArray)) {
                $result[] = is_object($subArray)?$subArray->$columnKey: $subArray[$columnKey];
            } elseif (array_key_exists($indexKey, $subArray)) {
                if (is_null($columnKey)) {
                    $index = is_object($subArray)?$subArray->$indexKey: $subArray[$indexKey];
                    $result[$index] = $subArray;
                } elseif (array_key_exists($columnKey, $subArray)) {
                    $index = is_object($subArray)?$subArray->$indexKey: $subArray[$indexKey];
                    $result[$index] = is_object($subArray)?$subArray->$columnKey: $subArray[$columnKey];
                }
            }
        }
        return $result;
    }
}
?>
greensea 06-Jul-2016 02:42
<?php
if (!function_exists('array_column')) {
    function array_column($input, $column_key, $index_key = NULL) {
        if (!is_array($input)) {
            trigger_error(__FUNCTION__ . '() expects parameter 1 to be array, ' . gettype($input) . ' given', E_USER_WARNING);
            return FALSE;
        }

        $ret = array();
        foreach ($input as $k => $v) {
            $value = NULL;
            if ($column_key === NULL) {
                $value = $v;
            }
            else {
                $value = $v[$column_key];
            }

            if ($index_key === NULL || !isset($v[$index_key])) {
                $ret[] = $value;
            }
            else {
                $ret[$v[$index_key]] = $value;
            }
        }

        return $ret;
    }
}
?>
benjam 25-Mar-2016 05:20
Note that this function will return the last entry when possible keys are duplicated.

<?php

$array = array(
    array(
        '1-1',
        'one',
        'one',
    ),
    array(
        '1-2',
        'two',
        'one',
    ),
);

var_dump(array_column($array, $value = 0, $index = 1));
var_dump(array_column($array, $value = 0, $index = 2));

// returns:
/*

array (size=2)
  'one' => string '1-1' (length=3)
  'two' => string '1-2' (length=3)

array (size=1)
  'one' => string '1-2' (length=3)

*/
?>
Nolan chou 26-Feb-2016 05:21
if (!function_exists('array_column'))
{
    function array_column($input, $column_key=null, $index_key=null)
    {
        $result = array();
        $i = 0;
        foreach ($input as $v)
        {
            $k = $index_key === null || !isset($v[$index_key]) ? $i++ : $v[$index_key];
            $result[$k] = $column_key === null ? $v : (isset($v[$column_key]) ? $v[$column_key] : null);
        }
        return $result;
    }
}
Anonymous 12-Feb-2016 04:45
I added a little more functionality to the more popular answers here to support the $index_key parameter for PHP < 5.5

<?php
// for php < 5.5
if (!function_exists('array_column')) {
    function array_column($input, $column_key, $index_key = null) {
        $arr = array_map(function($d) use ($column_key, $index_key) {
            if (!isset($d[$column_key])) {
                return null;
            }
            if ($index_key !== null) {
                return array($d[$index_key] => $d[$column_key]);
            }
            return $d[$column_key];
        }, $input);

        if ($index_key !== null) {
            $tmp = array();
            foreach ($arr as $ar) {
                $tmp[key($ar)] = current($ar);
            }
            $arr = $tmp;
        }
        return $arr;
    }
}
?>
kaspar dot wilbuer at web dot de 01-Feb-2016 10:59
If you need to extract more than one column from an array, you can use array_intersect_key on each element, like so:

function array_column_multi(array $input, array $column_keys) {
    $result = array();
    $column_keys = array_flip($column_keys);
    foreach($input as $key => $el) {
        $result[$key] = array_intersect_key($el, $column_keys);
    }
    return $result;
}
antonfedonjuk at gmail dot com 21-Jul-2015 06:26
My version is closer to the original than http://github.com/ramsey/array_column
<?php
/**
 * Provides functionality for array_column() to projects using PHP earlier than
 * version 5.5.
 * @copyright (c) 2015 WinterSilence (http://github.com/WinterSilence)
 * @license MIT
 */
if (!function_exists('array_column')) {
    /**
     * Returns an array of values representing a single column from the input
     * array.
     * @param array $array A multi-dimensional array from which to pull a
     *     column of values.
     * @param mixed $columnKey The column of values to return. This value may
     *     be the integer key of the column you wish to retrieve, or it may be
     *     the string key name for an associative array. It may also be NULL to
     *     return complete arrays (useful together with index_key to reindex
     *     the array).
     * @param mixed $indexKey The column to use as the index/keys for the
     *     returned array. This value may be the integer key of the column, or
     *     it may be the string key name.
     * @return array
     */
    function array_column(array $array, $columnKey, $indexKey = null)
    {
        $result = array();
        foreach ($array as $subArray) {
            if (!is_array($subArray)) {
                continue;
            } elseif (is_null($indexKey) && array_key_exists($columnKey, $subArray)) {
                $result[] = $subArray[$columnKey];
            } elseif (array_key_exists($indexKey, $subArray)) {
                if (is_null($columnKey)) {
                    $result[$subArray[$indexKey]] = $subArray;
                } elseif (array_key_exists($columnKey, $subArray)) {
                    $result[$subArray[$indexKey]] = $subArray[$columnKey];
                }
            }
        }
        return $result;
    }
}
?>
till at etill dot net 28-May-2015 03:32
Some remarks not included in the official documentation.

1) array_column does not support 1D arrays, in which case an empty array is returned.

2) The $column_key is zero-based.

3) If $column_key extends the valid index range an empty array is returned.
marianbucur17 at yahoo dot com 18-May-2015 06:19
If array_column is not available you can use the following function, which also has the $index_key parameter:

if (!function_exists('array_column')) {
    function array_column($array, $column_key, $index_key = null)
    {
        return array_reduce($array, function ($result, $item) use ($column_key, $index_key)
        {
            if (null === $index_key) {
                $result[] = $item[$column_key];
            } else {
                $result[$item[$index_key]] = $item[$column_key];
            }

            return $result;
        }, []);
    }
}
mohanrajnr at gmail dot com 06-May-2015 07:50
if array_column does not exist the below solution will work.

if(!function_exists("array_column"))
{

    function array_column($array,$column_name)
    {

        return array_map(function($element) use($column_name){return $element[$column_name];}, $array);

    }

}
robbieaverill[at]gmail.com 23-Mar-2015 07:51
Another option for older PHP versions (pre 5.5.0) is to use array_walk():

<?php
$array = array(
  array('some' => 'var', 'foo' => 'bar'),
  array('some' => 'var', 'foo' => 'bar'),
  array('some' => 'var', 'foo' => 'bar')
);

array_walk($array, function(&$value, $key, $return) {
  $value = $value[$return];
}, 'foo');

print_r($array);

// Array
// (
//     [0] => bar
//     [1] => bar
//     [2] => bar
// )

?>
kiler129 @ nowhere 10-Jan-2015 02:31
Please note this function accepts 2D-arrays ONLY, and silently returns empty array when non-array argument is provided.

Code:
class testObject {
    public $a = 123;
}
$testArray = [new testObject(), new testObject(), new testObject()];
$result = array_column($testArray, 'a')); //array(0) { }
hypxm at qq dot com 09-Dec-2014 06:36
a simple solution:

function arrayColumn(array $array, $column_key, $index_key=null){
        if(function_exists('array_column ')){
            return array_column($array, $column_key, $index_key);
        }
        $result = [];
        foreach($array as $arr){
            if(!is_array($arr)) continue;

            if(is_null($column_key)){
                $value = $arr;
            }else{
                $value = $arr[$column_key];
            }

            if(!is_null($index_key)){
                $key = $arr[$index_key];
                $result[$key] = $value;
            }else{
                $result[] = $value;
            }

        }

        return $result;
    }
coviex 30-Nov-2014 04:53
Value for existing key in the resulting array is rewritten with new value if it exists in another source sub-array.
myles at smyl dot es 23-Nov-2014 02:52
This didn't work for me recursively and needed to come up with a solution.

Here's my solution to the function:

if ( ! function_exists( 'array_column_recursive' ) ) {
    /**
     * Returns the values recursively from columns of the input array, identified by
     * the $columnKey.
     *
     * Optionally, you may provide an $indexKey to index the values in the returned
     * array by the values from the $indexKey column in the input array.
     *
     * @param array $input     A multi-dimensional array (record set) from which to pull
     *                         a column of values.
     * @param mixed $columnKey The column of values to return. This value may be the
     *                         integer key of the column you wish to retrieve, or it
     *                         may be the string key name for an associative array.
     * @param mixed $indexKey  (Optional.) The column to use as the index/keys for
     *                         the returned array. This value may be the integer key
     *                         of the column, or it may be the string key name.
     *
     * @return array
     */
    function array_column_recursive( $input = NULL, $columnKey = NULL, $indexKey = NULL ) {

        // Using func_get_args() in order to check for proper number of
        // parameters and trigger errors exactly as the built-in array_column()
        // does in PHP 5.5.
        $argc   = func_num_args();
        $params = func_get_args();
        if ( $argc < 2 ) {
            trigger_error( "array_column_recursive() expects at least 2 parameters, {$argc} given", E_USER_WARNING );

            return NULL;
        }
        if ( ! is_array( $params[ 0 ] ) ) {
            // Because we call back to this function, check if call was made by self to
            // prevent debug/error output for recursiveness :)
            $callers = debug_backtrace();
            if ( $callers[ 1 ][ 'function' ] != 'array_column_recursive' ){
                trigger_error( 'array_column_recursive() expects parameter 1 to be array, ' . gettype( $params[ 0 ] ) . ' given', E_USER_WARNING );
            }

            return NULL;
        }
        if ( ! is_int( $params[ 1 ] )
             && ! is_float( $params[ 1 ] )
             && ! is_string( $params[ 1 ] )
             && $params[ 1 ] !== NULL
             && ! ( is_object( $params[ 1 ] ) && method_exists( $params[ 1 ], '__toString' ) )
        ) {
            trigger_error( 'array_column_recursive(): The column key should be either a string or an integer', E_USER_WARNING );

            return FALSE;
        }
        if ( isset( $params[ 2 ] )
             && ! is_int( $params[ 2 ] )
             && ! is_float( $params[ 2 ] )
             && ! is_string( $params[ 2 ] )
             && ! ( is_object( $params[ 2 ] ) && method_exists( $params[ 2 ], '__toString' ) )
        ) {
            trigger_error( 'array_column_recursive(): The index key should be either a string or an integer', E_USER_WARNING );

            return FALSE;
        }
        $paramsInput     = $params[ 0 ];
        $paramsColumnKey = ( $params[ 1 ] !== NULL ) ? (string) $params[ 1 ] : NULL;
        $paramsIndexKey  = NULL;
        if ( isset( $params[ 2 ] ) ) {
            if ( is_float( $params[ 2 ] ) || is_int( $params[ 2 ] ) ) {
                $paramsIndexKey = (int) $params[ 2 ];
            } else {
                $paramsIndexKey = (string) $params[ 2 ];
            }
        }
        $resultArray = array();
        foreach ( $paramsInput as $row ) {
            $key    = $value = NULL;
            $keySet = $valueSet = FALSE;
            if ( $paramsIndexKey !== NULL && array_key_exists( $paramsIndexKey, $row ) ) {
                $keySet = TRUE;
                $key    = (string) $row[ $paramsIndexKey ];
            }
            if ( $paramsColumnKey === NULL ) {
                $valueSet = TRUE;
                $value    = $row;
            } elseif ( is_array( $row ) && array_key_exists( $paramsColumnKey, $row ) ) {
                $valueSet = TRUE;
                $value    = $row[ $paramsColumnKey ];
            }

            $possibleValue = array_column_recursive( $row, $paramsColumnKey, $paramsIndexKey );
            if ( $possibleValue ) {
                $resultArray = array_merge( $possibleValue, $resultArray );
            }

            if ( $valueSet ) {
                if ( $keySet ) {
                    $resultArray[ $key ] = $value;
                } else {
                    $resultArray[ ] = $value;
                }
            }
        }

        return $resultArray;
    }
}
WARrior 03-Oct-2013 12:25
You can also use array_map fucntion if you haven't array_column().

example:

$a = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    )
);

array_column($a, 'last_name');

becomes

array_map(function($element){return $element['last_name'];}, $a);


Crée un tableau à partir de deux autres tableaux

  • « array_column
  • array_count_values »
  • PHP Manual
  • Fonctions sur les tableaux
  • Crée un tableau à partir de deux autres tableaux

array_combine

(PHP 5, PHP 7, PHP 8)

array_combine — Crée un tableau à partir de deux autres tableaux

Description

array_combine ( array $keys , array $values ) : array

Crée un tableau, dont les clés sont les valeurs de keys, et les valeurs sont les valeurs de values.

Liste de paramètres

keys

Tableau de clés à utiliser. Les valeurs illégales pour les clés seront converties en chaîne de caractères.

values

Tableau de valeurs à utiliser

Valeurs de retour

Retourne le tableau combiné ou false si le nombre d'éléments de chaque tableau n'est pas identique.

Erreurs / Exceptions

Lance une alerte de niveau E_WARNING si le nombre d'éléments de keys et de values ne correspondent pas.

Exemples

Exemple #1 Exemple avec array_combine()

<?php
$a = array('green', 'red', 'yellow');
$b = array('avocado', 'apple', 'banana');
$c = array_combine($a, $b);

print_r($c);
?>

L'exemple ci-dessus va afficher :

Array
(
    [green]  => avocado
    [red]    => apple
    [yellow] => banana
)

Voir aussi

  • array_merge() - Fusionne plusieurs tableaux en un seul
  • array_walk() - Exécute une fonction fournie par l'utilisateur sur chacun des éléments d'un tableau
  • array_values() - Retourne toutes les valeurs d'un tableau

User Contributed Notes

douglasrich9215 at gmail dot com 21-Mar-2018 09:18
I had an epiphany when try to handle NON-ASSOCIATIVE array forms in my controller. This little one liner can pretty much edit ANY kind of non-associative array. For example this one just returns an array of values inputed by a new user.

The $data value is the the json_decoded() value of a register form.
Here is used str_replace, you could definitely do a number of things like preg matches and other things.

$readyToProcessForUser = array_combine(str_replace("new_user_", "", array_keys($data)), $data);

You could also do the same for the values.

$readyToProcessForUser = array_combine(array_keys($data), str_replace("-", "", $data));

Or BOTH!
Use full if you don't want to walk an entire array and the keys through the same callback.

$readyToProcessForUser = array_combine(array_walk('trim', array_keys($data)), array_walk('custom_callback', array_values($data)));
PHPNewbie 22-Jul-2017 06:18
This will seem obvious to some, but if you need to preserve a duplicate key, being you have unique vars, you can switch the array_combine around, to where the vars are the keys, and this will output correctly.

This [default] formula auto-removes the duplicate keys.

$i=0;
foreach (array_combine($keys, $vars) as $key => $var)
{
$i=$i;
echo($key);
echo " ";
echo($var);
}

This formula accomplishes the same thing, in the same order, but the duplicate "keys" (which are now  vars) are kept.

$i=0;
foreach (array_combine($vars, $keys) as $var => $key)
{
$i=$i;
echo($key);
echo " ";
echo($var);
}

I know, I'm a newbie, but perhaps someone else will need this eventually. I couldn't find another solution anywhere.
elite1228 at 163 dot com 03-Jun-2016 09:57
$item = array();
array_map(
    function($element) use($column_name,$key,&$item){
        $item[$element[$key]] = $element[$column_name];
    },
    $data
);
welcome at el hyphen mustafa 29-Nov-2015 09:46
Further to loreiorg's script
in order to preserve duplicate keys when combining arrays.

I have modified the script to use a closure instead of create_function

Reason: see security issue flagged up in the documentation concerning create_function

<?php

function array_combine_($keys, $values){
    $result = array();

    foreach ($keys as $i => $k) {
     $result[$k][] = $values[$i];
     }

    array_walk($result, function(&$v){
     $v = (count($v) == 1) ? array_pop($v): $v;
     });

    return $result;
}

?>
info at maisuma dot jp 04-Mar-2015 01:00
array_combine() returns NULL instrad of FALSE, when non-array parameters are given (issuing warning).

<?php
  //NULL
  var_dump(array_combine('string',array(42)));
?>
ilanfir at gmail dot com 15-Feb-2015 10:58
I recently had to flip an array and group the elements by value, this snippet will do that:
<?php
function flipAndGroup($input) {
    $outArr = array();
    array_walk($input, function($value, $key) use (&$outArr) {
        if(!isset($outArr[$value]) || !is_array($outArr[$value])) {
            $outArr[$value] = [];
        }
        $outArr[$value][] = $key;
    });
    return $outArr;
}
?>

Example:
<?php
$users_countries = array(
    'username1' => 'US',
    'user2' => 'US',
    'newuser' => 'GB'
);
print_r(flipAndGroup($users_countries));
?>

Returns:
Array
(
    [US] => Array
        (
            [0] => username1
            [1] => user2
        )

    [GB] => Array
        (
            [0] => newuser
        )
)
ismorodin at hotmail dot com 04-Jun-2014 03:48
Function eliminates the error Throws E_WARNING if the number of elements in keys and values ??does not match.

function arrCombine($arr1 = array(),$arr2 = array()){
            if(is_array($arr1) && is_array($arr2)):
                $cntArr1 = count($arr1);
                $cntArr2 = count($arr2);
                $difference = max($cntArr1,$cntArr2) - min($cntArr1,$cntArr2);
                if($cntArr1 > $cntArr2):
                    for ($i=1;$i<=$difference;$i++){
                        $arr2[$cntArr2+$i] = $cntArr2 + 1;
                    }
                    return array_combine($arr1,$arr2);
                elseif($cntArr1 < $cntArr2):
                    for ($i=1;$i<=$difference;$i++){
                        $arr1[$cntArr1+$i] = count($arr1) + 1;
                    }
                    return array_combine($arr1,$arr2);
                else:
                    return array_combine($arr1,$arr2);
                endif;
            endif;
    }
$array = [1,4,5,6,7,8];
$array2 = ['john','smith'];

var_dump( arrCombine($array,$array2 ));

array (size=6)
  1 => string 'john' (length=4)
  4 => string 'smith' (length=5)
  5 => int 3
  6 => int 3
  7 => int 3
  8 => int 3

var_dump( arrCombine($array2,$array) );

array (size=6)
  'john' => int 1
  'smith' => int 4
  3 => int 5
  4 => int 6
  5 => int 7
  6 => int 8
loureirorg at gmail dot com 14-Mar-2013 10:48
If two keys are the same, the second one prevails.

Example:
<?php
print_r(array_combine(Array('a','a','b'), Array(1,2,3)));
?>
Returns:
Array
(
    [a] => 2
    [b] => 3
)

But if you need to keep all values, you can use the function below:

<?php
function array_combine_($keys, $values)
{
    $result = array();
    foreach ($keys as $i => $k) {
        $result[$k][] = $values[$i];
    }
    array_walk($result, create_function('&$v', '$v = (count($v) == 1)? array_pop($v): $v;'));
    return    $result;
}

print_r(array_combine_(Array('a','a','b'), Array(1,2,3)));
?>
Returns:
Array
(
    [a] => Array
        (
            [0] => 1
            [1] => 2
        )

    [b] => 3
)
aaron at aaronholmes dot net 22-Jan-2013 04:54
You can create an array hashset from a flat array, storing both keys and values, with array_combine(). This works with duplicate values in the array too.

<?php
$flat_array = array(
        'one',
        'two',
        'three',
        'three',
        'four',
        'one'
);

$set = array_combine($flat_array, $flat_array);

var_dump($set);
?>

This outputs the following:

array(4) {
    ["one"]=>
        string(3) "one"
    ["two"]=>
        string(3) "two"
    ["three"]=>
        string(5) "three"
    ["four"]=>
        string(4) "four"
}
g.REMOVETHIS.vincendon AT vithemis.com 18-Jul-2012 09:41
I was looking for a function that could combine an array to multiple one, for my MySQL GROUP_CONCAT() query, so I made this function.

<?php
    function array_combine_array(array $keys)
    {
        $arrays = func_get_args();
        $keys = array_shift($arrays);

        /* Checking if arrays are on the same model (array('INDEX'=> array()) or array()) */
        $check = count(array_unique(array_map('is_array',array_map('current',$arrays)))) === 1;
        if (!$check) { trigger_error('Function array_combine_array() expects all parameters to be same type array or array of array',E_USER_NOTICE); return array(); }

        /* Checking the model of arrays, array('INDEX' => array()) or Array() */
        $assocArray = is_array(array_shift(array_map('current',$arrays)));

        /* If empty $Keys is given, we fill an empty array */
        if (empty($keys)) $keys = array_keys(array_fill(0,max(($assocArray) ? array_map('count',array_map('current',$arrays)) : array_map('count',$arrays)),'foo'));

        /* Init */
        $ret=array();$i=0;
        /* Cycling on each keys values, making an offset for each */
        foreach($keys as $v)
        {
            /* Cycling on arrays */
            foreach ($arrays as $k)
            {
                if ($assocArray)
                {
                    /* Getting the index of the element */
                    $key = key($k);
                    /* If the offset exists, we place it */
                    $ret[$v][$key] = isset($k[$key][$i]) ? $k[$key][$i]:false;
                }
                /* Making the array with auto-made index */
                else
                    $ret[$v][] = isset($k[$i]) ? $k[$i]: false;
            }
            /* Getting the next offset */
            $i++;
        }
        return $ret;
    }

    /* Examples */
    $r = array(1,2,4,10);

    $a1 = array('one','two','four','ten');
    $a2 = array('un','deux','quatre','dix');
    $a3 = array('uno','dos','quatro','diez');

     print_r(array_combine_array($r,array('english' => $a1),array('french' => $a2),array('spanish' => $a3))); /* Associative index, associative subarray indexes */
     print_r(array_combine_array($r,$a1,array('french' => $a2),array('spanish' => $a3))); /* Ouputs Error */
     print_r(array_combine_array($r,$a1,$a2,$a3)); /* Associative index, auto-made subarray indexes */
     print_r(array_combine_array(array(),array('english' => $a1),array('french' => $a2),array('spanish' => $a3))); /* Auto-made index, associative subarray indexes */
?>
dejiakala at gmail dot com 27-Oct-2011 03:32
I needed to read CSV files into associative arrays with column headers as keys. Then I ran into a problem when you have empty columns at the end of a row because array_combine returns false if both arrays don't have the same number of elements. This function based on quecoder at gmail's combine_arr() below allowed me to pad either array or not when parsing my CSVs to arrays.
$a is the array of header columns and $b is an array of the current row retrieved with fgetcsv()

<?php

function array_combine_special($a, $b, $pad = TRUE) {
    $acount = count($a);
    $bcount = count($b);
    // more elements in $a than $b but we don't want to pad either
    if (!$pad) {
        $size = ($acount > $bcount) ? $bcount : $acount;
        $a = array_slice($a, 0, $size);
        $b = array_slice($b, 0, $size);
    } else {
        // more headers than row fields
        if ($acount > $bcount) {
            $more = $acount - $bcount;
            // how many fields are we missing at the end of the second array?
            // Add empty strings to ensure arrays $a and $b have same number of elements
            $more = $acount - $bcount;
            for($i = 0; $i < $more; $i++) {
                $b[] = "";
            }
        // more fields than headers
        } else if ($acount < $bcount) {
            $more = $bcount - $acount;
            // fewer elements in the first array, add extra keys
            for($i = 0; $i < $more; $i++) {
                $key = 'extra_field_0' . $i;
                $a[] = $key;
            }

        }
    }

    return array_combine($a, $b);
}
?>
Dan LaManna 17-Sep-2011 08:12
I needed a function that truncated extra values, and only went as far as keys without throwing a warning as array_combine does.

<?php
function safeArrayCombine($keys, $values) {
    $combinedArray = array();

    for ($i=0, $keyCount = count($keys); $i < $keyCount; $i++) {
         $combinedArray[$keys[$i]] = $values[$i];
    }

    return $combinedArray;
}
?>
zequez at gmail dot com 27-Mar-2011 03:51
If two keys are the same, the second one prevails.
Example:
<?php
print_r(array_combine(Array('a','a','b'), Array(1,2,3)));
?>
Returns:
Array
(
    [a] => 2
    [b] => 3
)
claude dot pache at gmail dot com 12-May-2010 10:04
array_combine() has a strange bug/misfeature (as of PHP 5.3.2): There is no logical reason for <? array_combine(array(), array()) ?> throwing a warning and returning FALSE, instead of returning <? array() ?> (see http://bugs.php.net/bug.php?id=34857). Here is a quick workaround:
<?php
function array_real_combine($a, $b)
{
    return $a===array() && $b===array() ? array() : array_combine($a, $b);
}
?>
bradentkeith at dot dontspam dot gmail dot com 01-Apr-2010 12:20
I needed a function that would take keys from one unequal array and combine them with the values of another. Real life application:
Select 4 product types.
Each product has a serial.
There are 4 sets of products.

    <?php
        function array_combine2($arr1, $arr2) {
            $count1 = count($arr1);
            $count2 = count($arr2);
            $numofloops = $count2/$count1;

            $i = 0;
            while($i < $numofloops){
                $arr3 = array_slice($arr2, $count1*$i, $count1);
                $arr4[] = array_combine($arr1,$arr3);
                $i++;
            }

            return $arr4;
        }
    ?>

Input:
Array
(
    [0] => SMART Board
    [1] => Projector
    [2] => Speakers
    [3] => Splitter
)
, Array
(
    [0] => serial to smart board1
    [1] => serial to projector 1
    [2] => serial to speakers 1
    [3] => serials to splitter 1
    [4] => serials to smart board 2
    [5] => serials to projector 2
    [6] => serials to speakers 2
    [7] => serials to splitter 2
)

Array
(
    [0] => Array
        (
            [SMART Board] => serial to smart board1
            [Projector] => serial to projector 1
            [Speakers] => serial to speakers 1
            [Splitter] => serials to splitter 1
        )

    [1] => Array
        (
            [SMART Board] => serials to smart board 2
            [Projector] => serials to projector 2
            [Speakers] => serials to speakers 2
            [Splitter] => serials to splitter 2
        )

)
xavier at api-meal dot eu 23-Sep-2009 03:37
<?php
/**
 * Return alternatives defined by values of each parameters.
 *
 * Exemple :
 *
 * array_alternatives(array('foo','bar'), array('baz', 'qux'));
 * array(
 *     array('foo', 'baz'),
 *     array('bar', 'baz'),
 *     array('foo', 'qux'),
 *     array('bar', 'qux'),
 * );
 *
 * array_alternatives(array('a'), array('simple-minded'), array('solution'));
 * array(
 *     array('a', 'simple-minded', 'solution')
 * );
 *
 * array_alternatives(array('a'), array('red', 'blue'), array('car'));
 * array(
 *     array('a', 'red',  'car'),
 *     array('a', 'blue', 'car'),
 * );
 *
 * @param array $first_element
 * @param array $second_element
 * @return array
 * @author Xavier Barbosa
 */
function array_alternatives(array $first_element, array $second_element)
{
    $lists = func_get_args();
    $total_lists = func_num_args();

    for($i=0; $i<$total_lists; $i++)
    {
        $list =& $lists[$i];
        if (is_array($list) === FALSE)
            throw new Exception("Parameter $i is not an array.");
        if (count($list) === 0)
            throw new Exception("Parameter $i has no element.");
        unset($list);
    }

    // Initialize our alternatives
    $alternatives = array();
    foreach($lists[0] as &$value)
    {
        array_push($alternatives, array($value));
        unset($value);
    }
    unset($lists[0]);

    // Process alternatives
    for($i=1; $i<$total_lists; $i++)
    {
        $list =& $lists[$i];

        $new_alternatives = array();
        foreach($list as &$value)
        {
            foreach($alternatives as $_)
            {
                array_push($_, $value);
                array_push($new_alternatives, $_);
            }
        }

        // Rotate references, it's cheaper than copy array like `$alternatives = $new_alternatives;`
        $alternatives =& $new_alternatives;
        unset($new_alternatives, $list, $lists[$i]);
    }

    return $alternatives;
}
?>
quecoder at gmail 26-Aug-2008 12:00
<?php
// If they are not of same size, here is solution:

$abbreviations = array("AL", "AK", "AZ", "AR", "TX", "CA");
$states = array("Alabama", "Alaska", "Arizona", "Arkansas");
function combine_arr($a, $b)
{
    $acount = count($a);
    $bcount = count($b);
    $size = ($acount > $bcount) ? $bcount : $acount;
    $a = array_slice($a, 0, $size);
    $b = array_slice($b, 0, $size);
    return array_combine($a, $b);
}
$combined = combine_arr($abbreviations, $states);
print_r($combined);

//  Output
//  Array ( [AL] => Alabama [AK] => Alaska [AZ] => Arizona
//  [AR] => Arkansas )
?>
J.D.D. 09-Aug-2008 01:31
This may be obvious, but I don't see anything about it on the manual page, so a friendly warning...  The array you are using as keys must have all unique values.  If not, array elements get dropped.

<?php
$arr_notUnique = array('one' , 'one' , 'two');
$arr_b = array('red' , 'green' , 'blue');

$arr_combo = array_combine($arr_notUnique, $arr_b);
?>

Results:  Array ( [one] => green [two] => blue )

NOT:  Array ( [one] => red [one] => green [two] => blue )
Mike Jean 18-Mar-2008 09:59
Khaly's PHP4 code below does not work correctly in all cases. Consider when your array consists of floats:

<?php

$okay = array(0, 10, 20, 30);
$not_okay = array(0, 0.5, 1, 1.5);

$foo = array_combine($okay, $okay);
$bar = array_combine($not_okay, $not_okay);

/*

Results:

$foo = {
  [0]=> int(0)
  [10]=> int(10)
  [20]=> int(20)
  [30]=> int(30)
}

$bar = {
  [0]=> float(0.5)
  [1]=> float(1.5)
}

*/

?>

What can you do? In my case, I was just zipping up some select-box options, so I converted everything in my floats to strings.
Khaly 04-Oct-2007 02:11
This is the function for PHP4 :

<?php

function array_combine($arr1,$arr2) {
   $out = array();
   foreach($arr1 as $key1 => $value1)    {
    $out[$value1] = $arr2[$key1];
   }
   return $out
}

?>
neoyahuu at yahoo dot com 19-Mar-2007 08:36
Some tips for merging same values in an array

<?php
$array1 = array(1,2,3,4,5,6,7,8,9,10,11,12);
$array2 = array(1,2,3,13);

$merged = array_merge($array1,$array2);

// output normal array_merge
echo '<pre>After array_merge :
';
print_r($merged);
echo '</pre>';

// do double flip for merging values in an array
$merged = array_flip($merged);
$merged = array_flip($merged);

// Output after
echo '<pre>After Double Flip :
';
print_r($merged);
echo '</pre>';
?>

Output ::

After array_merge :
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
    [10] => 11
    [11] => 12
    [12] => 1
    [13] => 2
    [14] => 3
    [15] => 13
)

After Double Flip :
Array
(
    [12] => 1
    [13] => 2
    [14] => 3
    [3] => 4
    [4] => 5
    [5] => 6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 10
    [10] => 11
    [11] => 12
    [15] => 13
)


Compte le nombre de valeurs d'un tableau

  • « array_combine
  • array_diff_assoc »
  • PHP Manual
  • Fonctions sur les tableaux
  • Compte le nombre de valeurs d'un tableau

array_count_values

(PHP 4, PHP 5, PHP 7, PHP 8)

array_count_values — Compte le nombre de valeurs d'un tableau

Description

array_count_values ( array $array ) : array

Retourne un tableau contenant les valeurs du tableau array comme clés et leur fréquence comme valeurs.

Liste de paramètres

array

Le tableau de valeurs à compter

Valeurs de retour

Retourne un tableau associatif de valeurs ayant les clés correspondant à array et leurs nombres comme valeurs.

Erreurs / Exceptions

Lance une alerte de niveau E_WARNING pour chaque élément qui n'est pas une chaîne de caractères ou un entier.

Exemples

Exemple #1 Exemple avec array_count_values()

<?php
$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values($array));
?>

L'exemple ci-dessus va afficher :

Array
(
    [1] => 2
    [hello] => 2
    [world] => 1
)

Voir aussi

  • count() - Compte tous les éléments d'un tableau ou quelque chose d'un objet
  • array_unique() - Dédoublonne un tableau
  • array_values() - Retourne toutes les valeurs d'un tableau
  • count_chars() - Retourne des statistiques sur les caractères utilisés dans une chaîne

User Contributed Notes

anvil_sa at NOSPAMNO dot hotmail dot com 15-May-2020 02:15
Based on sergolucky96 suggestion
Simple way to find number of items with specific *boolean* values in multidimensional array:

<?php

$list = [
  ['id' => 1, 'result' => true],
  ['id' => 2, 'result' => true],
  ['id' => 3, 'result' => false],
];
$result = true;

echo array_count_values(array_map(function($v) {return $v?'true':'false';},array_column($list, 'result')))[$result]
// outputs: 2

?>
sergolucky96 at gmail dot com 29-Nov-2017 01:52
Simple way to find number of items with specific values in multidimensional array:

<?php

$list = [
  ['id' => 1, 'userId' => 5],
  ['id' => 2, 'userId' => 5],
  ['id' => 3, 'userId' => 6],
];
$userId = 5;

echo array_count_values(array_column($list, 'userId'))[$userId]; // outputs: 2
?>
jekkilekki at gmail dot com 16-Jan-2017 11:36
Simple example to count the values of a $key in an associative array:

/**
 * Associative Array Count Values
 *
 * Returns an array containing the number of values for a given $key in a given associative $array
 *
 * @param array $array The associative array to count values for
 * @param String $key The key to count values for
 * @return array A new array containing the counted values for the key in the original associative array
 */
function assc_array_count_values( $array, $key ) {
     foreach( $array as $row ) {
          $new_array[] = $row[$key];
     }
     return array_count_values( $new_array );
}
dhairya lakhera 17-Feb-2016 09:33
$array = array(1, true, 1, true, false,NULL);
var_dump(array_count_values($array));

//Warning: array_count_values(): Can only count STRING and INTEGER values!
jakubplus at gmail dot com 07-Apr-2014 11:36
In order to apply array_map with callback checking for localised values like city name, country name, you have to provide some sort of comparison array.

Here's an example of array_count_values for Polish city names. Just switch array_keys / array_values in order to obtain lowercase / uppercase.

$arr = array('Warsaw', 'Warsaw', 'Wroclaw', 'Poznan', 'KrakÓw', 'waRsaw', 'Gdansk', 'poznan', 'WROCLAW', 'kraków', 'GDANSK');
$lowertoupperpolish = array(
    'a' => 'A',
    'c' => 'C',
    'e' => 'E',
    'l' => 'L',
    'n' => 'N',
    'ó' => 'Ó',
    's' => 'S',
    'z' => 'Z',
    'z' => 'Z',
);
function lowers($n) {
    global $lowertoupperpolish;
    return strtolower(str_replace(array_values($lowertoupperpolish), array_keys($lowertoupperpolish), $n));
}
$result = array_count_values(array_map('lowers', $arr));

print_r($result); ...prints:

Array ( [warsaw] => 3 [wroclaw] => 2 [poznan] => 2 [kraków] => 2 [gdansk] => 2 )
Dominic Vonk 13-Dec-2013 04:11
The case-insensitive version:

<?php
function array_count_values_ci($array) {
    $newArray = array();
    foreach ($array as $values) {
        if (!array_key_exists(strtolower($values), $newArray)) {
            $newArray[strtolower($values)] = 0;
        }
        $newArray[strtolower($values)] += 1;
    }
    return $newArray;
}
?>
szczepan.krolgmail.c0m 17-Jan-2010 11:21
Here is a Version with one or more arrays, which have similar values in it:
Use $lower=true/false to ignore/set case Sensitiv.

<?php

$ar1[] = array("red","green","yellow","blue");
$ar1[] = array("green","yellow","brown","red","white","yellow");
$ar1[] = array("red","green","brown","blue","black","yellow");
#$ar1= array("red","green","brown","blue","black","red","green"); // Possible with one or multiple Array

$res = array_icount_values ($ar1);
print_r($res);

function array_icount_values($arr,$lower=true) {
     $arr2=array();
     if(!is_array($arr['0'])){$arr=array($arr);}
     foreach($arr as $k=> $v){
      foreach($v as $v2){
      if($lower==true) {$v2=strtolower($v2);}
      if(!isset($arr2[$v2])){
          $arr2[$v2]=1;
      }else{
           $arr2[$v2]++;
           }
    }
    }
    return $arr2;
}
/*
Will print:
Array
(
    [red] => 3
    [green] => 3
    [yellow] => 4
    [blue] => 2
    [brown] => 2
    [white] => 1
    [black] => 1
)
*/
?>
bluej100@gmail 25-Mar-2008 01:37
byron at byronrode dot co dot za, here are some benchmarks.

<?php
$haystack = Array();
for ($i = 0; $i < 1000000; $i++) {
  $haystack[] = rand(1, 2000);
}

$needle = rand(1, 2000);

echo "__array_count_values()__\n";
$start = microtime(true);
$startmem = memory_get_usage();
$counts = array_count_values($haystack);
$mem = memory_get_usage()-$startmem;
echo 'Count:'.$counts[$needle]."\n";
echo 'Time:'.(microtime(true) - $start)."\n";
echo 'Memory:'.$mem."\n\n";

echo "__array_keys()__\n";
$start = microtime(true);
$startmem = memory_get_usage();
$keys = array_keys($haystack, $needle);
$mem = memory_get_usage()-$startmem;
echo 'Count:'.count($keys)."\n";
echo 'Time:'.(microtime(true) - $start)."\n";
echo 'Memory:'.$mem."\n\n";

echo '__$needle_array[]__'."\n";
$start = microtime(true);
$startmem = memory_get_usage();
$x = count($haystack);
for($i = 0; $i < $x; $i++){
  if($haystack[$i] == $needle){
    $needle_array[] = $haystack[$i];
  }
}
$mem = memory_get_usage()-$startmem;
$number_of_instances = count($needle_array);
echo 'Count:'.$number_of_instances."\n";
echo 'Time:'.(microtime(true) - $start)."\n";
echo 'Memory:'.$mem."\n\n";

echo '__$number_of_instances++__'."\n";
$start = microtime(true);
$startmem = memory_get_usage();
$x = count($haystack);
$number_of_instances = 0;
for($i = 0; $i < $x; $i++){
  if($haystack[$i] == $needle){
    $number_of_instances++;
  }
}
$mem = memory_get_usage()-$startmem;
echo 'Count:'.$number_of_instances."\n";
echo 'Time:'.(microtime(true) - $start)."\n";
echo 'Memory:'.$mem."\n\n";
?>

[www]mytemp$ php array_count_test.php
__array_count_values()__
Count:515
Time:0.0607650279999
Memory:120328

__array_keys()__
Count:515
Time:0.0869138240814
Memory:33016

__$needle_array[]__
Count:515
Time:0.259949922562
Memory:24792

__$number_of_instances++__
Count:515
Time:0.258481025696
Memory:0

However, when you use an array of strings by calling md5(rand(1, 2000)), the performance boosts become less significant:

__array_count_values()__
Count:499
Time:0.491794109344
Memory:184328

__array_keys()__
Count:499
Time:0.36399102211
Memory:30072

__$needle_array[]__
Count:499
Time:0.568728923798
Memory:22104

__$number_of_instances++__
Count:499
Time:0.574353933334
Memory:0

Results are similar for string->string haystacks with foreach traversal.
Hayley Watson 13-Mar-2008 11:37
Yet Another case-insensitive version of array_count_values()

<?php
$ar = array('J. Karjalainen', 'J. Karjalainen', 60, '60', 'J. Karjalainen', 'j. karjalainen', 'Fastway', 'FASTWAY', 'Fastway', 'fastway', 'YUP');

$ar = array_count_values(array_map('strtolower', $ar));
?>
majerm at gmail dot com 18-Jun-2007 07:50
<?
function array_icount_values($array) {
    $ret_array = array();
    foreach($array as $value) $ret_array[strtolower($value)]++;
    return $ret_array;
}

$ar = array('J. Karjalainen', 'J. Karjalainen', 60, '60', 'J. Karjalainen', 'j. karjalainen', 'Fastway', 'FASTWAY', 'Fastway', 'fastway', 'YUP');
$ar = array_icount_values($ar);
?>

this prints:

Array
(
    [j. karjalainen] => 4
    [60] => 2
    [fastway] => 4
    [yup] => 1
)
rabies dot dostojevski at gmail dot com 21-Feb-2007 01:40
I couldn't find a function for counting the values with case-insensitive matching, so I wrote a quick and dirty solution myself:

<pre><?php
function array_icount_values($array) {
    $ret_array = array();
    foreach($array as $value) {
        foreach($ret_array as $key2 => $value2) {
            if(strtolower($key2) == strtolower($value)) {
                $ret_array[$key2]++;
                continue 2;
            }
        }
        $ret_array[$value] = 1;
    }
    return $ret_array;
}

$ar = array('J. Karjalainen', 'J. Karjalainen', 60, '60', 'J. Karjalainen', 'j. karjalainen', 'Fastway', 'FASTWAY', 'Fastway', 'fastway', 'YUP');
$ar2 = array_count_values($ar); // Normal matching
$ar = array_icount_values($ar); // Case-insensitive matching
print_r($ar2);
print_r($ar);
?></pre>

This prints:

Array
(
    [J. Karjalainen] => 3
    [60] => 2
    [j. karjalainen] => 1
    [Fastway] => 2
    [FASTWAY] => 1
    [fastway] => 1
    [YUP] => 1
)
Array
(
    [J. Karjalainen] => 4
    [60] => 2
    [Fastway] => 4
    [YUP] => 1
)

I don't know how efficient it is, but it seems to work. Needed this function in one of my scripts and thought I would share it.
coda at bobandgeorge dot com 14-Oct-2005 05:52
alwaysdrunk's comment only works if you can trust the client web browser. Using this function doesn't validate that every necessary field exists -- only that every field that was submitted has a value in it. Thus if an attacker wished to force a null value into one of the fields, he could (rather easily) construct a modified form without the field and submit THAT.

Besides, you really ought to be validating each field anyway if you're taking user input.
[Mr.A] 06-Mar-2005 02:59
I find a very simple solution to count values in multidimentional arrays (example for 2 levels) :

foreach ($array as $a) {
  foreach ($a as $b) {
    $count_values[$b]++;
  }
}
pmarcIatIgeneticsImedIharvardIedu 29-Jan-2003 05:42
array_count_values function does not work on multidimentional arrays.
If $score[][] is a bidimentional array, the command
"array_count_values ($score)" return the error message "Warning: Can only count STRING and INTEGER values!".
manuzhai (AT) php (DOT) net 16-Nov-2002 06:45
You might use serialize() to serialize your objects before analyzing their frequency. :)


Calcule la différence de deux tableaux, en prenant aussi en compte les clés

  • « array_count_values
  • array_diff_key »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule la différence de deux tableaux, en prenant aussi en compte les clés

array_diff_assoc

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

array_diff_assoc — Calcule la différence de deux tableaux, en prenant aussi en compte les clés

Description

array_diff_assoc ( array $array , array ...$arrays ) : array

Compare array avec les tableaux arrays et retourne la différence. Contrairement à la fonction array_diff(), les clés du tableau sont également utilisées dans la comparaison.

Liste de paramètres

array

Le tableau à comparer

arrays

Tableaux à comparer contre

Valeurs de retour

Retourne un tableau contenant toutes les valeurs du tableau array qui ne sont pas présentes dans les autres tableaux.

Exemples

Exemple #1 Exemple avec array_diff_assoc()

Dans cet exemple, vous pouvez voir que la paire "a" => "vert" est présente dans les deux tableaux, et donc, n'est pas présente dans le résultat de la fonction. Au contraire, la paire 0 => "rouge" est présente dans le résultat, car le second argument "rouge" possède une clé qui est 1.

<?php
$array1 = array("a" => "vert", "b" => "marron", "c" => "bleu", "rouge");
$array2 = array("a" => "vert", "jaune", "rouge");
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>

L'exemple ci-dessus va afficher :

Array
(
    [b] => marron
    [c] => bleu
    [0] => rouge
)

Exemple #2 Exemple avec array_diff_assoc()

Deux valeurs des paires clé => valeur sont considérées comme égales uniquement si (string) $elem1 === (string) $elem2 . En d'autres termes, une vérification stricte est effectuée sur la représentation en chaînes de caractères.

<?php
$array1 = array(0, 1, 2);
$array2 = array("00", "01", "2");
$result = array_diff_assoc($array1, $array2);
print_r($result);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => 0
    [1] => 1
    )

Notes

Note: Notez bien que cette fonction ne travaille que sur une dimension de tableau. Bien sur, vous pouvez utiliser des sous dimensions de tableau comme ceci : array_diff_assoc($array1[0], $array2[0]);.

Note: Assurez-vous de passer les arguments dans le bon ordre lors de la comparaison de tableaux similaires avec plus de clés. Le nouveau tableau doit être le premier de la liste.

Voir aussi

  • array_diff() - Calcule la différence entre des tableaux
  • array_diff_uassoc() - Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel
  • array_udiff_assoc() - Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
  • array_udiff_uassoc() - Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index

User Contributed Notes

spark dot crz at gmail dot com 02-Apr-2018 04:56
Recursive implementation accepting multiple n-level-arrays as parameters:

<?php
function recursiveDiff() {
    $arrs = func_get_args();
    $first = array_shift($arrs);
    $diff = [];

    foreach($first as $key => $value) {
        $values = array_map(function($arr) use($key){
            if (is_array($arr) && !array_key_exists($key, $arr))
                return null;

            return $arr[$key];
        }, $arrs);

        if (in_array($value, $values))
            continue;

        if (is_array($value)) {
            array_unshift($values, $value);
            $diff[$key] = call_user_func_array(__FUNCTION__, $values);
            continue;
        }

        $diff[$key] = $first[$key];
    }

    return $diff;
}
?>

The other attempt was cleaner but didn't work for all cases.
spark dot crz at gmail dot com 02-Apr-2018 03:29
Yet another recursive implementation, without if-else hell and with multiple parameters just like the original.

<?php
function recursiveDiff() {
    $arrs = func_get_args();
    $diff = call_user_func_array('array_diff_assoc', $arrs);

    foreach($diff as $key => $value) {
        if (!is_array($value))
            continue;

        $children = array_map(function($arr) use($key){
            return $arr[$key];
        }, $arrs);

        $diff[$key] = call_user_func_array(__FUNCTION__, $children);
    }

    return $diff;
}
tero dot lahtinen at iki dot fi 10-Oct-2017 03:23
array_diff_assoc will fail, if a value is something that can not be converted to a string.
francois-php at ceonizme dot fr 28-Aug-2014 06:27
to chinello at gmail dot com
I've had to use your function but it showed that the use of isset can't differentiate the NULL values from not setted values.

Here's a version that takes care of this subtility.

<?php
function array_diff_assoc_recursive($array1, $array2)
{
    $difference = NULL;
    foreach($array1 as $key => $value)
    {
        if(is_array($value))
        {
            if(!array_key_exists($key, $array2))
            {
                $difference[$key] = $value;
            }
            elseif(!is_array($array2[$key]))
            {
                $difference[$key] = $value;
            }
            else
            {
                $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                if($new_diff != FALSE)
                {
                    $difference[$key] = $new_diff;
                }
            }
        }
        elseif(!array_key_exists($key, $array2) || $array2[$key] != $value)
        {
            $difference[$key] = $value;
        }
    }
    return !isset($difference) ? 0 : $difference;
}
?>

Hope that helps
François
shadow_games at abv dot bg 11-Jun-2014 03:45
there is a functiont that i searched long enough now i have created it so someone else to find it if he need it ;]
<?php
    function compare_two_object_recursive($object_1, $object_2, $object_1_Identifier = false, $object_2_Identifier = false){
        $object1 = (array)$object_1;
        $object2 = (array)$object_2;
        $object3 = array();

        $o1i = $object_1_Identifier ? $object_1_Identifier : 1;
        $o2i = $object_2_Identifier ? $object_2_Identifier : 2;

        foreach($object1 as $key => $value){
            if(is_object($object1[$key])){
                $object1[$key] = (array)$object1[$key];
                $object2[$key] = (array)$object2[$key];
                $object3[$key] = (object)compare_two_object_recursive($object1[$key], $object2[$key], $o1i, $o2i);
            }elseif(is_array($object1[$key])){
                $object3[$key] = compare_two_object_recursive($object1[$key], $object2[$key], $o1i, $o2i);
            }else{
                if($object1[$key] == $object2[$key]){
                    $object3[$key]['comparison_status'] = "SAME";
                }else{
                    $object3[$key]['comparison_status'] = "NOT THE SAME";
                    $object3[$key][$o1i] = $object1[$key];
                    $object3[$key][$o2i] = $object2[$key];
                }
            }
        }
        return $object3;
    }
?>
dev5er6 at gmail dot com 13-Apr-2014 04:01
Works more like the original function:

<?php

function array_diff_assoc_recursive ( )
{
    $args = func_get_args ( );
    $diff = array ( );
    foreach ( array_shift ( $args ) as $key => $val )
    {
        for ( $i = 0, $j = 0, $tmp = array ( $val ) , $count = count ( $args ); $i < $count; $i++ )
            if ( is_array ( $val ) )
                if ( !isset ( $args[$i][$key] ) || !is_array ( $args[$i][$key] ) || empty( $args[$i][$key] ) )
                    $j++;
                else
                    $tmp[] = $args[$i][$key];
            elseif ( ! array_key_exists ( $key, $args[$i] ) || $args[$i][$key] !== $val )
                $j++;
        if ( is_array ( $val ) )
        {
            $tmp = call_user_func_array ( __FUNCTION__, $tmp );
            if ( ! empty ( $tmp ) ) $diff[$key] = $tmp;
            elseif ( $j == $count ) $diff[$key] = $val;
        }
        elseif ( $j == $count && $count ) $diff[$key] = $val;
    }

    return $diff;
}

?>
telefoontoestel at hotmail dot com 04-Feb-2014 09:11
an earlier post for recursive array_diff_assoc failed because isset returned false on an array element containing a null value. I updated the code so it compares null values too.

<?php
function array_diff_assoc_recursive($array1, $array2)
{
    foreach($array1 as $key => $value)
    {
        if(is_array($value))
        {
              if(!isset($array2[$key]))
              {
                  $difference[$key] = $value;
              }
              elseif(!is_array($array2[$key]))
              {
                  $difference[$key] = $value;
              }
              else
              {
                  $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                  if($new_diff != FALSE)
                  {
                        $difference[$key] = $new_diff;
                  }
              }
          }
          elseif(!array_key_exists($key, $array2) || $array2[$key] != $value)
          {
              $difference[$key] = $value;
          }
    }
    return !isset($difference) ? 0 : $difference;
}
?>
Michael Richey 04-May-2013 01:43
If you're looking for a true array_diff_assoc, comparing arrays to determine the difference between two, finding missing values from both, you can use this along with array_merge.

$a = array('a'=>1,'b'=>2,'c'=>3);
$b = array('a'=>1,'b'=>2,'d'=>4);
print_r(array_diff_assoc($a,$b));
// returns:
array
(
    [c] => 3
)

print_r(array_diff_assoc($b,$a));
// returns
array
(
    [d] => 4
)

print_r(array_merge(array_diff_assoc($a,$b),array_diff_assoc($b,$a)));
// returns
array
(
    [c] => 3
    [d] => 4
)
Giosh 15-Mar-2013 11:15
The array_diff_assoc_array from "chinello at gmail dot com" (and others) will not work for arrays with null values. That's because !isset is true when an array key doesn't exists or is set to null.

(sorry for the changed indent-style)
<?php
function array_diff_assoc_recursive($array1, $array2) {
    $difference=array();
    foreach($array1 as $key => $value) {
        if( is_array($value) ) {
            if( !isset($array2[$key]) || !is_array($array2[$key]) ) {
                $difference[$key] = $value;
            } else {
                $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                if( !empty($new_diff) )
                    $difference[$key] = $new_diff;
            }
        } else if( !array_key_exists($key,$array2) || $array2[$key] !== $value ) {
            $difference[$key] = $value;
        }
    }
    return $difference;
}
?>

And here an example (note index 'b' in the output):
<?php
$a1=array( 'a' => 0, 'b' => null, 'c' => array( 'd' => null ) );
$a2=array( 'a' => 0, 'b' => null );

var_dump( array_diff_assoc_recursive( $a1, $a2 ) );
var_dump( chinello_array_diff_assoc_recursive( $a1, $a2 ) );
?>
array(1) {
  ["c"]=>
  array(1) {
    ["d"]=>
    NULL
  }
}

array(2) {
  ["b"]=>
  NULL
  ["c"]=>
  array(1) {
    ["d"]=>
    NULL
  }
}
news_yodpeirs at thoftware dot de 12-Jul-2011 04:25
A quite simple (yet not very efficient) way to compare the first level of arrays which have values that are not strings:
array_map('unserialize',array_diff_assoc(array_map('serialize',$arr1),array_map('serialize',$arr2)))
Might be useful for debugging (that's what I use it for).
jrajpu10 at gmail dot com 25-Oct-2008 12:57
array_diff_assoc can also be used to find the duplicates in an array

<?php
$arr = array('1','2','3','4','3','2','5');
$uniques = array_unique($arr);
// array_diff will not work here, array_diff_assoc works as it takes the key // in account.
$dups = array_diff_assoc($arr, $uniques);

print_r($dups);
?>

Note: The index of the $dups is not in strict sequential order as expected by C programmer.
cedric at daneel dot net 21-May-2007 06:01
To diff between n-dimensional array, juste use this :

<?php
function array_diff_values($tab1, $tab2)
    {
    $result = array();
    foreach($tab1 as $values) if(! in_array($values, $tab2)) $result[] = $values;
    return $result;
    }
?>
contact at pascalopitz dot com 11-Apr-2007 04:14
The direction of the arguments does actually make a difference:

<?php
$a = array(
    'x' => 'x',
    'y' => 'y',
    'z' => 'z',
    't' => 't',
);

$b = array(
    'x' => 'x',
    'y' => 'y',
    'z' => 'z',
    't' => 't',
    'g' => 'g',
);

print_r(array_diff_assoc($a, $b));
print_r(array_diff_assoc($b, $a));
?>

echoes:

Array
(
)
Array
(
    [g] => g
)
chinello at gmail dot com 18-Mar-2007 10:33
The following will recursively do an array_diff_assoc, which will calculate differences on a multi-dimensional level.  This not display any notices if a key don't exist and if error_reporting is set to E_ALL:

<?php
function array_diff_assoc_recursive($array1, $array2)
{
    foreach($array1 as $key => $value)
    {
        if(is_array($value))
        {
              if(!isset($array2[$key]))
              {
                  $difference[$key] = $value;
              }
              elseif(!is_array($array2[$key]))
              {
                  $difference[$key] = $value;
              }
              else
              {
                  $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                  if($new_diff != FALSE)
                  {
                        $difference[$key] = $new_diff;
                  }
              }
          }
          elseif(!isset($array2[$key]) || $array2[$key] != $value)
          {
              $difference[$key] = $value;
          }
    }
    return !isset($difference) ? 0 : $difference;
}
?>

[NOTE BY danbrown AT php DOT net: This is a combination of efforts from previous notes deleted.  Contributors included (Michael Johnson), (jochem AT iamjochem DAWT com), (sc1n AT yahoo DOT com), and (anders DOT carlsson AT mds DOT mdh DOT se).]
Alexander Podgorny 30-May-2006 02:30
NOTE: the diff_array also removes all the duplicate values that match to the values in the second array:

<?php
    $array1 = array("a","b","c","a","a");
    $array2 = array("a");

    $diff = array_diff($array1,$array2);

    // yields: array("b","c") the duplicate "a" values are removed
?>
benjamin at moonfactory dot co dot jp 11-Jan-2005 09:56
Hi all,
For php versions < 4.3...

<?php
/**
 * array_diff_assoc for version < 4.3
 **/
if (!function_exists('array_diff_assoc'))
{
    function array_diff_assoc($a1, $a2)
    {
        foreach($a1 as $key => $value)
        {
            if(isset($a2[$key]))
            {
                if((string) $value !== (string) $a2[$key])
                {
                     $r[$key] = $value;
                }
            }else
            {
                $r[$key] = $value;
            }
        }
        return $r ;
    }
}

?>
carl at thep dot lu dot se 09-May-2003 02:55
To unset elements in an array if you know the keys but not the values, you can do:

<?php
$a = array("foo", "bar", "baz", "quux");
$b = array(1, 3); // Elements to get rid of

foreach($b as $e)
  unset($a[$e]);
?>

Of course this makes most sense if $b has many elements or is dynamically generated.


Calcule la différence de deux tableaux en utilisant les clés pour comparaison

  • « array_diff_assoc
  • array_diff_uassoc »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule la différence de deux tableaux en utilisant les clés pour comparaison

array_diff_key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_diff_key — Calcule la différence de deux tableaux en utilisant les clés pour comparaison

Description

array_diff_key ( array $array , array ...$arrays ) : array

Compare les clés du tableau array avec les clés des tableaux arrays et retourne la différence. Cette fonction est identique à la fonction array_diff(), excepté sur le fait que la comparaison est faite sur les clés, plutôt que sur les valeurs.

Liste de paramètres

array

Le tableau à comparer

arrays

Tableaux à comparer contre

Valeurs de retour

Retourne un tableau contenant toutes les entrées du tableau array dont les clés sont absentes dans tous les autres tableaux.

Exemples

Exemple #1 Exemple avec array_diff_key()

Les deux clés depuis les paires clé => valeur sont considérées comme égales uniquement si (string) $cle1 === (string) $cle2 . En d'autres termes, une analyse de type stricte est exécutée, donc, le type doit être exactement le même.

<?php
$array1 = array('blue' => 1, 'red' => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'yellow' => 7, 'cyan' => 8);

var_dump(array_diff_key($array1, $array2));
?>

L'exemple ci-dessus va afficher :

array(3) {
  ["blue"]=>
  int(1)
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}
<?php
$array1 = array('blue' => 1, 'red'  => 2, 'green' => 3, 'purple' => 4);
$array2 = array('green' => 5, 'yellow' => 7, 'cyan' => 8);
$array3 = array('blue' => 6, 'yellow' => 7, 'mauve' => 8);

var_dump(array_diff_key($array1, $array2, $array3));
?>

L'exemple ci-dessus va afficher :

array(2) {
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}

Notes

Note:

Notez que cette fonction vérifie uniquement une dimension d'un tableau possédant n dimensions. Bien sûr, vous pouvez vérifier une dimension plus profonde en utilisant, par exemple, array_diff_key($array1[0], $array2[0]);.

Voir aussi

  • array_diff() - Calcule la différence entre des tableaux
  • array_udiff() - Calcule la différence entre deux tableaux en utilisant une fonction rappel
  • array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés
  • array_diff_uassoc() - Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel
  • array_udiff_assoc() - Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
  • array_udiff_uassoc() - Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
  • array_diff_ukey() - Calcule la différence entre deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison
  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_intersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
  • array_intersect_key() - Calcule l'intersection de deux tableaux en utilisant les clés pour comparaison
  • array_intersect_ukey() - Calcule l'intersection de deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison

User Contributed Notes

rhallsey at yahoo dot com 13-Sep-2014 12:45
Here's a simple function that returns true if all keys in the first array are found in the second array, and false if they aren't.

function same_keys ($a1, $a2) {
    $same = false;
    if (!array_diff_key($a1, $a2)) {
        $same = true;
        foreach ($a1 as $k => $v) {
            if (is_array($v) && !same_keys($v, $a2[$k])) {
                $same = false;
                break;
            }
        }
    }
    return $same;
}

To check if two arrays have the same structure, ignoring values, execute the function twice, the second time with the arguments reversed.
gk at anuary dot com 29-Jun-2013 03:40
Improved recursive version.

<?php
/**
 * @author Gajus Kuizinas <gk@anuary.com>
 * @version 1.0.0 (2013 03 19)
 */
function array_diff_key_recursive (array $arr1, array $arr2) {
    $diff = array_diff_key($arr1, $arr2);
    $intersect = array_intersect_key($arr1, $arr2);

    foreach ($intersect as $k => $v) {
        if (is_array($arr1[$k]) && is_array($arr2[$k])) {
            $d = array_diff_key_recursive($arr1[$k], $arr2[$k]);

            if ($d) {
                $diff[$k] = $d;
            }
        }
    }

    return $diff;
}
?>

An up to date version is maintained at https://github.com/gajus/flow/blob/master/flow.inc.php#L337.
division-par-zero at zilon dot net 03-Oct-2008 07:02
you can use this function for return the difference of two array !

<?php
function array_unique_diff_key ($array1, $array2)
{
  if (is_array($array1) && is_array($array2))
    return array_diff_key($array1, $array2) + array_diff_key($array2, $array1);
  else if (is_array($array1)) return $array1;
  else if (is_array($array2)) return $array2;
  else return array();
}
?>
Ashton 02-Apr-2008 01:33
To return the unique elements (those with a key that exists only once in either array but not in both) try:
function array_unique_diff ($array1, $array2)
{
  array_merge(array_diff_key($array1, $array2), array_diff_key($array2, $array1));
}

Example:
$array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);

  array_diff_key($array1, $array2)

returns

  array ( 'red' => 2, 'purple' => 4 )

  array_diff_key($array2, $array1)

returns

  array ( 'yellow' => 7, 'cyan' => 8, )

  array_unique_diff($array1, $array2);

returns

  array ( 'red' => 2, 'purple' => 4, 'yellow' => 7, 'cyan' => 8, )
sjungwirth at matrix-consultants dot com 28-Feb-2008 12:08
I needed something a little different where maybe even the keys in multidimensional arrays don't match up. Setting $assoc to false will cause only to check for missing keys, otherwise it compares values as well. This was also based on '2ge at 2ge dot us' function

<?php

function n_array_diff_assoc ($a1, $a2, $assoc=true) {
    $r = array();
    if(is_array(current($a1))):
        foreach($a1 as $k => $v):
            if(isset($a2[$k])):
                $diff = n_array_diff($a1[$k], $a2[$k], $assoc);
                if (!empty($diff)):
                    $r[$k] = $diff;
                endif;
            else:
                $r[$k] = $v;
            endif;
        endforeach;
    else:
        $r = $assoc ? array_diff_assoc($a1, $a2) : array_diff_key($a1, $a2);
    endif;
    return $r;
}
?>
coder at gs dot com 16-Feb-2008 02:00
The PHP4 version below works only unidirectionally. If you switch the arrays around i.e. (ar2, ar1) you get different results than (ar1, ar2).
AiFiLTr0 [at host] invyl [dot] ath.cx 29-Nov-2007 05:56
The recursive function suggested by '2ge at 2ge dot us' will provide you with empty arrays if there's no diff.
This variant of the function cleans up empty arrays and fixes a bug in the first suggested version. It works 100%
.
<?php
function array_diff_key_recursive ($a1, $a2) {
        foreach($a1 as $k => $v) {
            //$r[$k] = is_array($v) ? $this->array_diff_key_recursive($a1[$k], $a2[$k]) : array_diff_key($a1, $a2);
        if (is_array($v))
            {
            $r[$k]=$this->array_diff_key_recursive($a1[$k], $a2[$k]);
            }else
            {
            $r=array_diff_key($a1, $a2);
            }

        if (is_array($r[$k]) && count($r[$k])==0)
            {
            unset($r[$k]);
            }
        }
        return $r;
    }
?>
2ge at 2ge dot us 07-Mar-2006 11:28
Hello, if you need diff key of n-dimensional arrays here is nice solution:
<?php
function n_array_diff ($a1, $a2) {
        foreach($a1 as $k => $v) {
            $r[$k] = is_array($v) ? n_array_diff($a1[$k], $a2[$k]) : array_diff_key($a1, $a2);
        }
        return $r;
}
?>
it will print everything, what is missing in $a2.
vlad_mustafin at ukr dot net 13-Jan-2006 07:39
One more alternative variant :)
<?
if (!function_exists('array_diff_key')) {
    function array_diff_key() {
        $argCount   = func_num_args();
        $diff_arg_prefix = 'diffArg';
        $diff_arg_names = array();
        for ($i=0; $i < $argCount; $i++) {
            $diff_arg_names[$i] = 'diffArg'.$i;
            $$diff_arg_names[$i] = array_keys((array)func_get_arg($i));
        }
        $diffArrString = '';
        if (!empty($diff_arg_names)) $diffArrString =  '$'.implode(', $', $diff_arg_names);
        eval("\$result = array_diff(".$diffArrString.");");
        return $result;
    }
}
?>
ampf at egp dot up dot pt 25-Nov-2005 12:55
Well, you could implement in the code something more powerfull:

http://www.php.net/manual/en/function.array-diff.php#31364
maxence at pontapreta dot net 27-May-2005 10:38
Seems to be a great function, especially for n-dimensions arrays. The only problem is that I cannot find it in php 5.0.3 and 5.0.4. Does it really exist ?! :(

[20:27:05][maxence@conurb] ~/test2/php-5.0.4$ grep PHP_FUNCTION * -r | grep -i array_diff_key
[20:27:09][maxence@conurb] ~/test2/php-5.0.4$


Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel

  • « array_diff_key
  • array_diff_ukey »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel

array_diff_uassoc

(PHP 5, PHP 7, PHP 8)

array_diff_uassoc — Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel

Description

array_diff_uassoc ( array $array , array ...$arrays , callable $key_compare_func ) : array

Compare le tableau array avec les tableaux arrays et retourne la différence. Contrairement à la fonction array_diff(), les clés du tableau sont utilisées dans la comparaison.

Contrairement à la fonction array_diff_assoc(), un utilisateur fournit une fonction de rappel utilisée pour la comparaison des indices, et non une fonction interne.

Liste de paramètres

array

Le tableau à comparer

arrays

Tableaux à comparer contre

key_compare_func

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

callback ( mixed $a, mixed $b ) : int

Valeurs de retour

Retourne un tableau contenant toutes les entrées du tableau array1 qui ne sont présentes dans aucun autre tableau.

Exemples

Exemple #1 Exemple avec array_diff_uassoc()

Dans cet exemple, vous voyez que la paire "a" => "vert" est présente dans les deux tableaux et donc ne figure pas dans le résultat de la fonction. Contrairement à cela, la paire 0 => "rouge" est dans le résultat car dans le second argument, la clé de "rouge" est 1.

<?php
function key_compare_func($a, $b)
{
    if ($a === $b) {
        return 0;
    }
    return ($a > $b)? 1:-1;
}

$array1 = array("a" => "vert", "b" => "marron", "c" => "bleu", "rouge");
$array2 = array("a" => "vert", "jaune", "rouge");
$result = array_diff_uassoc($array1, $array2, "key_compare_func");
print_r($result);
?>

L'exemple ci-dessus va afficher :

Array
(
    [b] => marron
    [c] => bleu
    [0] => rouge
)

L'égalité de deux indices est vérifiée par la fonction utilisateur.

Notes

Note:

Notez que cette fonction ne vérifie qu'une seule dimension d'un tableau multidimensionnel. Vous pouvez, bien sûr, tester une dimension particulière en utilisant par exemple, array_diff_uassoc($array1[1], $array2[1], "key_compare_func"); .

Voir aussi

  • array_diff() - Calcule la différence entre des tableaux
  • array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés
  • array_udiff() - Calcule la différence entre deux tableaux en utilisant une fonction rappel
  • array_udiff_assoc() - Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
  • array_udiff_uassoc() - Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_uintersect() - Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel
  • array_uintersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel
  • array_uintersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée

User Contributed Notes

MD. ABU SAYEM 11-Mar-2014 06:12
//array_diff_uassoc for multidimenssional array
$color_1=array('a'=>'white','b'=>'red','c'=>array('a'=>'green','b'=>'blue','c'=>'yellow'));
$color_2=array('a'=>'white','b'=>'red','c'=>array('a'=>'white','b'=>'red','c'=>'yellow'));

function key_compare($a,$b){
    if($a===$b)        return 0;
    return($a>$b)?1:-1;
}
print_r(array_diff_uassoc($color_1['c'], $color_2['c'],"key_compare"));

//Output
 Array
(
    [a] => green
    [b] => blue
)


Calcule la différence entre deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison

  • « array_diff_uassoc
  • array_diff »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule la différence entre deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison

array_diff_ukey

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_diff_ukey — Calcule la différence entre deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison

Description

array_diff_ukey ( array $array , array ...$arrays , callable $key_compare_func ) : array

Compare les clés du tableau array avec celles des tableaux arrays et retourne la différence. Cette fonction est identique à la fonction array_diff(), excepté le fait que la comparaison est effectuée sur les clés, plutôt que sur les valeurs.

Contrairement à la fonction array_diff_key(), une fonction utilisateur est fournie pour la comparaison des indices, et non une fonction interne.

Liste de paramètres

array

Le tableau à comparer

arrays

Tableaux à comparer contre

key_compare_func

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

callback ( mixed $a, mixed $b ) : int

Valeurs de retour

Retourne un tableau contenant toutes les entrées du tableau array qui ne sont présentes dans aucun autre tableau.

Exemples

Exemple #1 Exemple avec array_diff_ukey()

<?php
function key_compare_func($key1, $key2)
{
    if ($key1 == $key2)
        return 0;
    else if ($key1 > $key2)
        return 1;
    else
        return -1;
}

$array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);

var_dump(array_diff_ukey($array1, $array2, 'key_compare_func'));
?>

L'exemple ci-dessus va afficher :

array(2) {
  ["red"]=>
  int(2)
  ["purple"]=>
  int(4)
}

Notes

Note:

Notez que cette fonction vérifie uniquement une dimension d'un tableau possédant n dimensions. Bien sûr, vous pouvez vérifier une dimension plus profonde en utilisant, par exemple, array_diff_ukey($array1[0], $array2[0], 'callback_func');.

Voir aussi

  • array_diff() - Calcule la différence entre des tableaux
  • array_udiff() - Calcule la différence entre deux tableaux en utilisant une fonction rappel
  • array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés
  • array_diff_uassoc() - Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel
  • array_udiff_assoc() - Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
  • array_udiff_uassoc() - Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
  • array_diff_key() - Calcule la différence de deux tableaux en utilisant les clés pour comparaison
  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_intersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
  • array_intersect_key() - Calcule l'intersection de deux tableaux en utilisant les clés pour comparaison
  • array_intersect_ukey() - Calcule l'intersection de deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison

User Contributed Notes

There are no user contributed notes for this page.


Calcule la différence entre des tableaux

  • « array_diff_ukey
  • array_fill_keys »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule la différence entre des tableaux

array_diff

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

array_diff — Calcule la différence entre des tableaux

Description

array_diff ( array $array , array ...$arrays ) : array

array_diff() compare le tableau array avec un ou plusieurs tableaux et retourne les valeurs du tableau array1 qui ne sont pas présentes dans les autres tableaux.

Liste de paramètres

array

Le tableau depuis lequel comparer

arrays

Tableaux à comparer contre

Valeurs de retour

Retourne un tableau contenant toutes les entités du tableau array qui ne sont présentes dans aucun des autres tableaux. Les clés du tableau array sont préservées.

Exemples

Exemple #1 Exemple avec array_diff()

<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

print_r($result);
?>

Les valeurs multiples dans array1 seront toutes traitées de la même façon. Ce qui affichera :

Array
(
    [1] => blue
)

Exemple #2 Exemple avec la fonction array_diff() avec des types qui ne correspondent pas

Deux éléments sont considérés comme égaux si et seulement si (string) $elem1 === (string) $elem2 ; en somme, lorsque la représentation de la chaînes de caractères est la même.

<?php
// Ceci va générer une notice car un tableau ne peut pas être transformé en chaîne de caractères.
$source = [1, 2, 3, 4];
$filter = [3, 4, [5], 6];
$result = array_diff($source, $filter);

// Alors que ceci est bien, depuis que les objets peuvent être transformés en chaîne de caractères.
class S {
  private $v;

  public function __construct(string $v) {
    $this->v = $v;
  }

  public function __toString() {
    return $this->v;
  }
}

$source = [new S('a'), new S('b'), new S('c')];
$filter = [new S('b'), new S('c'), new S('d')];

$result = array_diff($source, $filter);

// $result contient désormais une instance de S('a');
?>

Pour utiliser une fonction de comparaison alternative, repportez vous à la fonction array_udiff().

Notes

Note:

Notez que cette fonction ne vérifie qu'une seule dimension d'un tableau à plusieurs dimensions. Bien sûr, vous pouvez vérifier des dimensions plus profondes en utilisant array_diff($array1[0], $array2[0]);.

Voir aussi

  • array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés
  • array_udiff() - Calcule la différence entre deux tableaux en utilisant une fonction rappel
  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index

User Contributed Notes

Al Amin Chayan (mail at chayan dot me) 21-Sep-2020 04:17
<?php
/**
   * Check If An Array Is A Subset Of Another Array
   *
   * @param  array $subset
   * @param  array $set
   * @return bool
   */
function is_subset(array $subset, array $set): bool {
     return (bool)!array_diff($subset, $set);
}

$u = [1, 5, 6, 8, 10];
$a = [1, 5];
$b = [6, 7];

var_dump(is_subset($a, $u)); // true
var_dump(is_subset($b, $u)); // false
Prakashgun 11-Dec-2017 12:04
If duplicate value comes in the first array, that will be also included. See in the output "blue" comes twice.

<?php

$array1 = array("a" => "green", "red", "blue", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

print_r($result);

//Output
//Array ( [1] => blue [3] => blue )
wes dot melton at gmail dot com 20-Jun-2017 09:11
It's important to note that array_diff() is NOT a fast or memory-efficient function on larger arrays.

In my experience, when I find myself running array_diff() on larger arrays (50+ k/v/pairs) I almost always realize that I'm working the problem from the wrong angle.

Typically, when reworking the problem to not require array_diff(), especially on bigger datasets, I find significant performance improvements and optimizations.
james dot PLZNOSPAM at bush dot cc 16-Mar-2017 01:58
If you want a simple way to show values that are in either array, but not both, you can use this:

<?php
function arrayDiff($A, $B) {
    $intersect = array_intersect($A, $B);
    return array_merge(array_diff($A, $intersect), array_diff($B, $intersect));
}
?>

If you want to account for keys, use array_diff_assoc() instead; and if you want to remove empty values, use array_filter().
emeka dot echeruo at gmail dot com 10-May-2016 03:49
Resubmitting... the update for takes into account comparison issues
Computes the difference of all the arrays
<?php

/**
 * array_diffs â€” Computes the difference of all the arrays
 *
 * @param array
 *
 *    array1 - The array to compare from and against
 *    array2 - The array to compare from and against
 *    array(n) - More arrays to compare from and against
 *
 * @return array Returns all the arrays that do contains entries that cannot be matched in any of the arrays.
 */

function array_diffs() {
    $count = func_num_args();
    if($count < 2) {
        trigger_error('Must provide at least 2 arrays for comparison.');
    }
    $check = array();
    $out = array();
     //resolve comparison issue
    $func = function($a, $b) {
        $dbl = function($i, $d) {
            $e = 0.00001;
            if(abs($i-$d) < $e) {
                return true;
            }
            return false;
        };
        if((gettype($a) == 'integer' && gettype($b['value']) == 'double') || (gettype($a) == 'double' && gettype($b['value']) == 'integer')) {
            if((gettype($a) == 'integer' && $dbl((double) $a, $b['value'])) || (gettype($b['value']) == 'integer' && $dbl((double) $b['value'], $a))) {
                return true;
            }
        } elseif((gettype($a) == 'double') && (gettype($b['value']) == 'double')) {
            return $dbl($a,$b['value']);
        } elseif($a == $b['value']) {
            return true;
        }
        return false;
    };
    for($i = 0; $i < $count; $i++) {
        if(!is_array(func_get_arg($i))) {
            trigger_error('Parameters must be passed as arrays.');
        }
        foreach(func_get_arg($i) as $key => $value) {
            if(is_numeric($key) && is_string($value)) {
                if(array_key_exists($value, $check) && $func($value, $check[$value])) {
                    $check[$value]['count'] = $check[$value]['count'] + 1;
                } else {
                    $check[$value]['value'] = $value;
                    $check[$value]['count'] = 1;
                }
            } elseif(is_numeric($key) && (is_bool($value) || is_null($value) || is_numeric($value) || is_object($value) || is_resource($value))) {
                $update = false;
                foreach($check as $check_key => $check_value) {
                    if(is_numeric($key) && (is_bool($check_value['value']) || is_null($check_value['value']) || is_numeric($check_value['value']) || is_object($check_value['value']) || is_resource($check_value['value'])) && $func($value, $check_value)) {
                        $update = true;
                        $check[$check_key]['count'] = $check[$check_key]['count'] + 1;
                    }
                }
                if(!$update) {
                    $check[] = array('value' => $value, 'count' => 1);
                }
            } else {
                if(array_key_exists($key, $check) && $func($value, $check[$key])) {
                    $check[$key]['count'] = $check[$key]['count'] + 1;
                } else {
                    $check[$key]['value'] = $value;
                    $check[$key]['count'] = 1;
                }
            }
        }
    }
    foreach($check as $check_key => $check_value) {
        if($check_value['count'] == 1) {
           for ($i = 0; $i < $count; $i++) {
                foreach(func_get_arg($i) as $key => $value) {
                    if(is_numeric($key) && is_string($value) && ($value == (string) $check_key)) {
                        $out[$i][$key] = $value;
                    } elseif(is_numeric($key) && ($check_value['value'] == $value)) {
                        $out[$i][$key] = $value;
                    } elseif(is_string($key) && ($check_value['value'] == $value)) {
                        $out[$i][$key] = $value;
                    }
                }
            }
        }
    }
    return $out;
}

?>
emeka at echeruo at gmail dot com 30-Apr-2016 11:10
Resubmitting... the update for takes into account comparison issues

Computes the difference of all the arrays

<?php

/**
 * array_diffs — Computes the difference of all the arrays
 *
 * @param array
 *
 *    array1 - The array to compare from and against
 *    array2 - The array to compare from and against
 *    array(n) - More arrays to compare from and against
 *
 * @return array Returns all the arrays that do contains entries that cannot be matched in any of the arrays.
 */

function array_diffs() {
    $count = func_num_args();
    if($count < 2) {
        trigger_error('Must provide at least 2 arrays for comparison.');
    }
    $check = array();
    $out = array();
     //resolve comparison issues in PHP
    $func = function($a, $b) {
        if(gettype($a) == 'integer' && gettype($b['value']) == 'double' || gettype($a) == 'double' && gettype($b['value']) == 'integer') {
            if(gettype($a) == 'integer') {
                if((double) $a == $b['value']) {
                    return true;
                }
            } else {
                if((double) $b['value'] == $a) {
                    return true;
                }
            }
        } elseif(gettype($a) == 'double' && gettype($b['value']) == 'double') {
            $epsilon = 0.00001;
            if(abs($a - $b['value']) < $epsilon) {
                return true;
            }
        } else {
            if($a == $b['value']) {
                return true;
            }
        }
        return false;
    };
    for ($i = 0; $i < $count; $i++) {
        if(!is_array(func_get_arg($i))) {
            trigger_error('Parameters must be passed as arrays.');
        }
        foreach(func_get_arg($i) as $key => $value) {
            if(is_numeric($key) && is_string($value)) {
                if(array_key_exists($value, $check) && $func($value, $check[$value])) {
                    $check[$value]['count'] = $check[$value]['count'] + 1;
                } else {
                    $check[$value]['value'] = $value;
                    $check[$value]['count'] = 1;
                }
            } elseif(is_numeric($key) && (is_bool($value) || is_null($value) || is_numeric($value) || is_object($value) || is_resource($value))) {
                $update = false;
                foreach($check as $check_key => $check_value) {
                    if(is_numeric($key) && (is_bool($check_value['value']) || is_null($check_value['value']) || is_numeric($check_value['value']) || is_object($check_value['value']) || is_resource($check_value['value']))) {
                        if($func($value, $check_value)) {
                            $update = true;
                            $check[$check_key]['count'] = $check[$check_key]['count'] + 1;
                        }
                    }
                }
                if(!$update) {
                    $check[] = array('value' => $value, 'count' => 1);
                }
            } else {
                if(array_key_exists($key, $check) && $func($value, $check[$key])) {
                    $check[$key]['count'] = $check[$key]['count'] + 1;
                } else {
                    $check[$key]['value'] = $value;
                    $check[$key]['count'] = 1;
                }
            }
        }
    }
    foreach($check as $check_key => $check_value) {
        if($check_value['count'] == 1) {
            for ($i = 0; $i < $count; $i++) {
                foreach(func_get_arg($i) as $key => $value) {
                    if(is_numeric($key) && is_string($value)) {
                        if($value == (string) $check_key) {
                            $out[$i][$key] = $value;
                        }
                    } elseif(is_numeric($key) && (is_bool($value) || is_null($value) || is_numeric($value) || is_object($value) || is_resource($value))) {
                        if(is_numeric($key) && (is_bool($check_value['value']) || is_null($check_value['value']) || is_numeric($check_value['value']) || is_object($check_value['value']) || is_resource($check_value['value']))) {
                            if($check_value['value'] == $value) {
                                $out[$i][$key] = $value;
                            }
                        }
                    } else {
                        if($key == $check_key) {
                            $out[$i][$key] = $value;
                        }
                    }
                }
            }
        }
    }
    return $out;
}

?>
Anonymous 05-May-2015 06:50
I always wanted something like this to avoid listing all the files and folders you want to exclude in a project directory.

function array_preg_diff($a, $p) {
    foreach ($a as $i => $v)
        if (preg_match($p, $v))
            unset($a[$i]);
    return $a;
}

$relevantFiles = array_preg_diff(scandir('somedir'), '/^\./');

instead of

$relevantFiles = array_diff(scandir('somedir'), array('.', '..', '.idea', '.project));
Anonymous 28-Jan-2015 04:00
If you're not getting a count(array_diff($a1,$a2))>0 with something similar to the following arrays should use the php.net/array_diff_assoc function instead.

$a1 = Array
(
    [0] => id
    [1] => id_1
    [2] => id_2
)

$a2 = Array
(
    [0] => id
    [1] => id_2
    [2] => id_1
)
wrey75 at gmail dot com 03-Dec-2014 10:27
The difference is made only on the first level. If you want compare 2 arrays, you can use the code available at https://gist.github.com/wrey75/c631f6fe9c975354aec7 (including a class with an function to patch the array)

Here the basic function:

function my_array_diff($arr1, $arr2) {
        $diff = array();

        // Check the similarities
        foreach( $arr1 as $k1=>$v1 ){
            if( isset( $arr2[$k1]) ){
                $v2 = $arr2[$k1];
                if( is_array($v1) && is_array($v2) ){
                    // 2 arrays: just go further...
                    // .. and explain it's an update!
                    $changes = self::diff($v1, $v2);
                    if( count($changes) > 0 ){
                        // If we have no change, simply ignore
                        $diff[$k1] = array('upd' => $changes);
                    }
                    unset($arr2[$k1]); // don't forget
                }
                else if( $v2 === $v1 ){
                    // unset the value on the second array
                    // for the "surplus"
                    unset( $arr2[$k1] );
                }
                else {
                    // Don't mind if arrays or not.
                    $diff[$k1] = array( 'old' => $v1, 'new'=>$v2 );
                    unset( $arr2[$k1] );
                }
            }
            else {
                // remove information
                $diff[$k1] = array( 'old' => $v1 );
            }
        }

        // Now, check for new stuff in $arr2
        reset( $arr2 ); // Don't argue it's unnecessary (even I believe you)
        foreach( $arr2 as $k=>$v ){
            // OK, it is quite stupid my friend
            $diff[$k] = array( 'new' => $v );
        }
        return $diff;
    }
Jeppe Utzon 08-Nov-2012 02:28
If you just need to know if two arrays' values are exactly the same (regardless of keys and order), then instead of using array_diff, this is a simple method:

<?php

function identical_values( $arrayA , $arrayB ) {

    sort( $arrayA );
    sort( $arrayB );

    return $arrayA == $arrayB;
}

// Examples:

$array1 = array( "red" , "green" , "blue" );
$array2 = array( "green" , "red" , "blue" );
$array3 = array( "red" , "green" , "blue" , "yellow" );
$array4 = array( "red" , "yellow" , "blue" );
$array5 = array( "x" => "red" , "y" =>  "green" , "z" => "blue" );

identical_values( $array1 , $array2 );  // true
identical_values( $array1 , $array3 );  // false
identical_values( $array1 , $array4 );  // false
identical_values( $array1 , $array5 );  // true

?>

The function returns true only if the two arrays contain the same number of values and each value in one array has an exact duplicate in the other array. Everything else will return false.

my alternative method for evaluating if two arrays contain (all) identical values:

<?php

sort($a); $sort(b); return $a == $b;

?>

may be slightly faster (10-20%) than this array_diff method:

<?php

return ( count( $a ) == count( $b ) && !array_diff( $a , $b ) ? true : false );

?>

but only when the two arrays contain the same number of values and then only in some cases. Otherwise the latter method will be radically faster due to the use of a count() test before the array_diff().

Also, if the two arrays contain a different number of values, then which method is faster will depend on whether both arrays need to be sorted or not. Two times sort() is a bit slower than one time array_diff(), but if one of the arrays have already been sorted, then you only have to sort the other array and this will be almost twice as fast as array_diff().

Basically: 2 x sort() is slower than 1 x array_diff() is slower than 1 x sort().
merlyn dot tgz at gmail dot com 15-Mar-2012 10:08
There is more fast implementation of array_diff, but with some limitations. If you need compare two arrays of integers or strings you can use such function:

    public static function arrayDiffEmulation($arrayFrom, $arrayAgainst)
    {
        $arrayAgainst = array_flip($arrayAgainst);

        foreach ($arrayFrom as $key => $value) {
            if(isset($arrayAgainst[$value])) {
                unset($arrayFrom[$key]);
            }
        }

        return $arrayFrom;
    }

It is ~10x faster than array_diff

php > $t = microtime(true);$a = range(0,25000); $b = range(15000,500000); $c = array_diff($a, $b);echo microtime(true) - $t;
4.4335179328918
php > $t = microtime(true);$a = range(0,25000); $b = range(15000,500000); $c = arrayDiffEmulation($a, $b);echo microtime(true) - $t;
0.37219095230103
eugeny dot yakimovitch at gmail dot com 30-Dec-2010 03:17
Note that array_diff is not equivalent to

<?php
function fullArrayDiff($left, $right)
{
    return array_diff(array_merge($left, $right), array_intersect($left, $right));
}
?>

since it is a set-theoretical complement as in

http://en.wikipedia.org/wiki/Complement_(set_theory)
javierchinapequeno at yahoo dot es 21-Dec-2010 11:21
Hi, I´d like to give a piece of advice to all who need to use this function to compare two arrays that have a great quantity of elements. You should sort both arrays first before comparing, it will work faster.
Thanks
vojtech dot hordejcuk at gmail dot com 03-Nov-2009 07:15
Based on one lad's code, I created following function for creating something like HTML diff. I hope it will be useful.

<?php
private function diff ($old, $new)
{
  $old = preg_replace ('/ +/', ' ', $old);
  $new = preg_replace ('/ +/', ' ', $new);

  $lo = explode ("\n", trim ($old) . "\n");
  $ln = explode ("\n", trim ($new) . "\n");
  $size = max (count ($lo), count ($ln));

  $equ = array_intersect ($lo, $ln);
  $ins = array_diff ($ln, $lo);
  $del = array_diff ($lo, $ln);

  $out = '';

  for ($i = 0; $i < $size; $i++)
  {
    if (isset ($del [$i]))
    {
      $out .= '<p><del>' . $del [$i] . '</del></p>';
    }

    if (isset ($equ [$i]))
    {
      $out .= '<p>' . $equ [$i] . '</p>';
    }

    if (isset ($ins [$i]))
    {
      $out .= '<p><ins>' . $ins [$i] . '</ins></p>';
    }
  }

  return $out;
}
?>
Anonymous 15-Oct-2009 11:55
Hi!
I tried hard to find a solution to a problem I'm going to explain here, and after have read all the array functions and possibilities, I had to create what I think should exist on next PHP releases.

What I needed, it's some kind of Difference, but working with two arrays and modifying them at time, not returning an array as a result with the diference itself.

So, as an example:

A = 1,2,3
B = 2,3,4

should NOT be:

C = 1,4

but:

A = 1
B = 4

so basically, I wanted to delete coincidences on both arrays.

Now, I've some actions to do, and I know wich one I've to do with the values from one array or another.
With the normal DIFF I can't, because if I've an array like C=1,4, I dont know if I've to do the Action_A with 1 or with 4, but I really know that everything in A, will go to the Action_A and everithing in B, will go to Action_B. So same happens with 4, don't know wich action to apply...

So I created this:

<?php
function array_diff_ORG_NEW(&$org, &$new, $type='VALUES'){
    switch($type){
        case 'VALUES':
            $int = array_values(array_intersect($org, $new)); //C = A ^ B
            $org = array_values(array_diff($org, $int)); //A' = A - C
            $new= array_values(array_diff($new, $int)); //B' = B - C
            break;
        case 'KEYS':
            $int = array_values(array_intersect_key($org, $new)); //C = A ^ B
            $org = array_values(array_diff_key($org, $int)); //A' = A - C
            $new= array_values(array_diff_key($new, $int)); //B' = B - C
            break;
    }
}
?>

This cute, works by reference, and modifies the arrays deleting coincidences on both, and leaving intact the non coincidences.

So a call to this will be somethin' like:

<?php
$original = array(1,2,3);
$new = array(2,3,4);

array_diff_ORG_NEW($original, $new, 'VALUES');
?>

And HERE, I'll have my arrays as I wanted:

$original = 1
$new = 4

Now, why I use it precisely?

Imagine you've some "Events" and some users you select when create the event, can "see" this event you create. So you "share" the event with some users. Ok?

Imagine you created and Event_A, and shared with users 1,2,3.

Now you want to modify the event, and you decide to modify the users to share it. Imagine you change it to users 2,3,4.

(numbers are users ID).

So you can manage when you are going to modify, to have an array with the IDs in DDBB ($original), and then, have another array with ID's corresponding to the users to share after modifying ($new). Wich ones you've to DELETE from DDBB, and wich ones do you've to INSERT?

If you do a simple difference or somehow, you get somethin' like C=1,4.
You have no clue on wich one you've to insert or delete.

But on this way, you can know it, and that's why:

- What keeps on $original, it's somethin not existing in $new at the beggining. So you know that all what you've inside $original, have to be deleted from DDBB because what you did in the modifying process, it's to unselect those users keeping in $original.
- What keeps on $new, it's something not existing in $original at the beggining. Wich means that in the modifying process you added some new users. And those have to be inserted in DDBB. So, everything keeping inside $new, have to be inserted in the DDBB.

Conclusion:

- Remaining in $original --> delete from DB.
- Remaining in $new --> insert into DB.

And that's all!

I hope you find it useful, and I encourage PHP "makers", to add in a not distant future, somethin' like this one natively, because I'm shure that I'm not the first one needing something like this.

Best regards all,

Light.
firegun at terra dot com dot br 24-Jun-2009 10:52
Hello guys,

I´ve been looking for a array_diff that works with recursive arrays, I´ve tried the ottodenn at gmail dot com function but to my case it doesn´t worked as expected, so I made my own. I´ve haven´t tested this extensively, but I´ll explain my scenario, and this works great at that case :D

We got 2 arrays like these:

<?php
$aArray1['marcie'] = array('banana' => 1, 'orange' => 1, 'pasta' => 1);
$aArray1['kenji'] = array('apple' => 1, 'pie' => 1, 'pasta' => 1);

$aArray2['marcie'] = array('banana' => 1, 'orange' => 1);
?>

As array_diff, this function returns all the items that is in aArray1 and IS NOT at aArray2, so the result we should expect is:

<?php
$aDiff['marcie'] = array('pasta' => 1);
$aDiff['kenji'] = array('apple' => 1, 'pie' => 1, 'pasta' => 1);
?>

Ok, now some comments about this function:
 - Different from the PHP array_diff, this function DON´T uses the === operator, but the ==, so 0 is equal to '0' or false, but this can be changed with no impacts.
 - This function checks the keys of the arrays, array_diff only compares the values.

I realy hopes that this could help some1 as I´ve been helped a lot with some users experiences. (Just please double check if it would work for your case, as I sad I just tested to a scenario like the one I exposed)

<?php
function arrayRecursiveDiff($aArray1, $aArray2) {
    $aReturn = array();

    foreach ($aArray1 as $mKey => $mValue) {
        if (array_key_exists($mKey, $aArray2)) {
            if (is_array($mValue)) {
                $aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]);
                if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; }
            } else {
                if ($mValue != $aArray2[$mKey]) {
                    $aReturn[$mKey] = $mValue;
                }
            }
        } else {
            $aReturn[$mKey] = $mValue;
        }
    }

    return $aReturn;
}
?>
Tim Trefren 04-Apr-2008 08:05
Here's a little wrapper for array_diff - I found myself needing to iterate through the edited array, and I didn't need to original keys for anything.

<?php
function arrayDiff($array1, $array2){
    # This wrapper for array_diff rekeys the array returned
    $valid_array = array_diff($array1,$array2);

    # reinstantiate $array1 variable
    $array1 = array();

    # loop through the validated array and move elements to $array1
    # this is necessary because the array_diff function returns arrays that retain their original keys
    foreach ($valid_array as $valid){
        $array1[] = $valid;
        }
    return $array1;
    }
?>
merlinyoda at dorproject dot net 28-Mar-2008 10:11
As touched on in kitchin's comment of 19-Jun-2007 03:49 and nilsandre at gmx dot de's comment of 17-Jul-2007 10:45, array_diff's behavior may be counter-intuitive if you aren't thinking in terms of set theory.

array_diff() returns a *mathematical* difference (a.k.a. subtraction) of elements in array A that are in array B and *not* what elements are different between the arrays (i.e. those that elements that are in either A or B but aren't in both A and B).

Drawing one of those Ven diagrams or Euler diagrams may help with visualization...

As far as a function for returning what you may be expecting, here's one:

<?php
function array_xor ($array_a, $array_b) {
    $union_array = array_merge($array_a, $array_b);
    $intersect_array = array_intersect($array_a, $array_b);
    return array_diff($union_array, $intersect_array)
}
?>
nilsandre at gmx dot de 17-Jul-2007 09:45
Again, the function's description is misleading right now. I sought a function, which (mathematically) computes A - B, or, written differently, A \ B. Or, again in other words, suppose

A := {a1, ..., an} and B:= {a1, b1, ... , bm}

=> array_diff(A,B) = {a2, ..., an}

array_diff(A,B) returns all elements from A, which are not elements of B (= A without B).

You should include this in the documentation more precisely, I think.
gilthans at NOgmailSPAM dot com 13-Jun-2007 10:11
I needed a function to only remove the element the amount of times he appears in the second array. In other words, if you have Array(1, 1, 2) and Array(1), the return value should be Array(1, 2).
So I built this function right here:

<?php
function array_diff_once(){
    if(($args = func_num_args()) < 2)
        return false;
    $arr1 = func_get_arg(0);
    $arr2 = func_get_arg(1);
    if(!is_array($arr1) || !is_array($arr2))
        return false;
    foreach($arr2 as $remove){
        foreach($arr1 as $k=>$v){
            if((string)$v === (string)$remove){ //NOTE: if you need the diff to be STRICT, remove both the '(string)'s
                unset($arr1[$k]);
                break; //That's pretty much the only difference from the real array_diff :P
            }
        }
    }
    //Handle more than 2 arguments
    $c = $args;
    while($c > 2){
        $c--;
        $arr1 = array_diff_once($arr1, func_get_arg($args-$c+1));
    }
    return $arr1;
}
$arr1 = Array("blue", "four"=>4, "color"=>"red", "blue", "green", "green", "name"=>"jon", "green");
$arr2 = Array("4", "red", "blue", "green");
print_r(array_diff_once($arr1, $arr2));
?>
This prints:
Array ( [1] => blue [3] => green [name] => jon [4] => green )

Note that it removes the elements left to right, opposite to what you might expect; in my case the order of elements had no importance. Fixing that would require a small variation.
03-Aug-2006 12:30
array_diff provides a handy way of deleting array elements by their value, without having to unset it by key, through a lengthy foreach loop and then having to rekey the array.

<?php

//pass value you wish to delete and the array to delete from
function array_delete( $value, $array)
{
    $array = array_diff( $array, array($value) );
    return $array;
}
?>
Simon Riget at paragi.dk 21-Jan-2006 05:27
A simple multidimentional key aware array_diff function.

<?php
function arr_diff($a1,$a2){
  foreach($a1 as $k=>$v){
    unset($dv);
    if(is_int($k)){
      // Compare values
      if(array_search($v,$a2)===false) $dv=$v;
      else if(is_array($v)) $dv=arr_diff($v,$a2[$k]);
      if($dv) $diff[]=$dv;
    }else{
      // Compare noninteger keys
      if(!$a2[$k]) $dv=$v;
      else if(is_array($v)) $dv=arr_diff($v,$a2[$k]);
      if($dv) $diff[$k]=$dv;
    }
  }
  return $diff;
}
?>

This function meets my immidiate needs but I'm shure it can be improved.
Viking Coder 03-Jan-2006 09:07
To anybody wanting a double-sided array_diff - mentioned by rudigier at noxx dot at. Remember, array_diff gives you everything in the first array that isn't in the subsequent arrays.

$array1=array('blue','red','green');
$array2=array('blue','yellow','green');

array_merge(array_diff($array1, $array2),array_diff($array2, $array1));

Result
------
Array
(
    [0] => red
    [1] => yellow
)
j dot j dot d dot mol at ewi dot tudelft dot nl 31-Dec-2004 12:34
Here is some code to take the difference of two arrays. It allows custom modifications like prefixing with a certain string (as shown) or custom compare functions.

<?php
 // returns all elements in $all which are not in $used in O(n log n) time.
  // elements from $all are prefixed with $prefix_all.
  // elements from $used are prefixed with $prefix_used.
  function filter_unused( $all, $used, $prefix_all = "", $prefix_used = "" ) {
      $unused = array();

      // prefixes are not needed for sorting
      sort( $all );
      sort( $used );

      $a = 0;
      $u = 0;

      $maxa = sizeof($all)-1;
      $maxu = sizeof($used)-1;

      while( true ) {
          if( $a > $maxa ) {
              // done; rest of $used isn't in $all
              break;
          }
          if( $u > $maxu ) {
              // rest of $all is unused
              for( ; $a <= $maxa; $a++ ) {
                  $unused[] = $all[$a];
              }
              break;
          }

          if( $prefix_all.$all[$a] > $prefix_used.$used[$u] ) {
              // $used[$u] isn't in $all?
              $u++;
              continue;
          }

          if( $prefix_all.$all[$a] == $prefix_used.$used[$u] ) {
              // $all[$a] is used
              $a++;
              $u++;
              continue;
          }

          $unused[] = $all[$a];

          $a++;
      }

      return $unused;
  }
?>
18-Nov-2003 04:54
From the page:
Note:  Please note that this function only checks one dimension of a n-dimensional array. Of course you can check deeper dimensions by using array_diff($array1[0], $array2[0]);

I've found a way to bypass that. I had 2 arrays made of arrays.
I wanted to extract from the first array all the arrays not found in the second array. So I used the serialize() function:

<?php
function my_serialize(&$arr,$pos){
  $arr = serialize($arr);
}

function my_unserialize(&$arr,$pos){
  $arr = unserialize($arr);
}

 //make a copy
$first_array_s = $first_array;
$second_array_s = $second_array;

// serialize all sub-arrays
array_walk($first_array_s,'my_serialize');
array_walk($second_array_s,'my_serialize');

// array_diff the serialized versions
$diff = array_diff($first_array_s,$second_array_s);

// unserialize the result
array_walk($diff,'my_unserialize');

// you've got it!
print_r($diff);
?>
ds2u at the hotmail dot com 23-Feb-2003 04:22
Yes you can get rid of gaps/missing keys by using:

<?php
$result = array_values(array_diff($array1,$array2));
?>

But to drop the storage of void spaces (actually a line feed) which are irritatingly indexed when reading from files - just use difference:

<?php
$array = array ();
$array[0] = "\n";
$result = array_diff($result,$array);
?>

dst
SeanECoates at !donotspam!yahoo dot ca 16-Oct-2001 10:43
I just came upon a really good use for array_diff(). When reading a dir(opendir;readdir), I _rarely_ want "." or ".." to be in the array of files I'm creating. Here's a simple way to remove them:

<?php
 $someFiles = array();
 $dp = opendir("/some/dir");
 while($someFiles[] = readdir($dp));
 closedir($dp);

 $removeDirs = array(".","..");
 $someFiles = array_diff($someFiles, $removeDirs);

 foreach($someFiles AS $thisFile) echo $thisFile."\n";
?>

S


Remplit un tableau avec des valeurs, en spécifiant les clés

  • « array_diff
  • array_fill »
  • PHP Manual
  • Fonctions sur les tableaux
  • Remplit un tableau avec des valeurs, en spécifiant les clés

array_fill_keys

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

array_fill_keys — Remplit un tableau avec des valeurs, en spécifiant les clés

Description

array_fill_keys ( array $keys , mixed $value ) : array

Remplit un tableau avec la valeur du paramètre value, et en utilisant les valeurs du tableau keys comme clés.

Liste de paramètres

keys

Tableau de valeurs qui sera utilisé comme clés. Les valeurs illégales pour les clés seront converties en chaînes de caractères.

value

Valeur à utiliser pour remplir le tableau.

Valeurs de retour

Retourne le tableau rempli.

Exemples

Exemple #1 Exemple avec array_fill_keys()

<?php
$keys = array('foo', 5, 10, 'bar');
$a = array_fill_keys($keys, 'banana');
print_r($a);
?>

L'exemple ci-dessus va afficher :

Array
(
    [foo] => banana
    [5] => banana
    [10] => banana
    [bar] => banana
)

Voir aussi

  • array_fill() - Remplit un tableau avec une même valeur
  • array_combine() - Crée un tableau à partir de deux autres tableaux

User Contributed Notes

ntd at entidi dot it 23-Oct-2015 07:04
To remove arbitrary keys from an associative array:

<?php

function nuke_keys($keys, $array) {
    return array_diff_key($array, array_fill_keys($keys, 0));
}

$array = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$keys  = array('red', 'purple');

print_r(nuke_keys($keys, $array));
?>

The above snippet will return:

Array
(
    [blue] => 1
    [green] => 3
)
taylanaktepe at yahoo dot com 21-Jul-2014 09:46
$keys = array(1, 2, 3);

// Fill it with value.
$keys = array_fill_keys($keys, 'banana');
print_r($keys);

// Fill it different value.
$apples = array_fill_keys(array_keys($keys), 'apple');
print_r($apples);

// Output:
Array (
 [1] => banana
 [2] => banana
 [3] => banana
)
Array (
 [1] => apple
 [2] => apple
 [3] => apple
)
atul dot kr_singh at hotmail dot com 04-Jan-2013 11:39
If an associative array is used as the second parameter of array_fill_keys, then the associative array will be appended in all the values of the first array.
e.g.
<?php
$array1 = array(
    "a" => "first",
    "b" => "second",
    "c" => "something",
    "red"
);

$array2 = array(
    "a" => "first",
    "b" => "something",
    "letsc"
);

print_r(array_fill_keys($array1, $array2));
?>

The output will be
Array(
    [first] => Array(
        [a] => first,
        [b] => something,
        [0] => letsc
    ),
    [second] => Array(
        [a] => first,
        [b] => something,
        [0] => letsc
    ),
    [something] => Array(
        [a] => first,
        [b] => something,
        [0] => letsc
    ),
    [red] => Array(
        [a] => first,
        [b] => something,
        [0] => letsc
    )
)
sergli at nigma dot ru 25-May-2012 11:53
<?php
$a = array("1");

var_dump(array_fill_keys($a, "test"));
?>

array(1) {
  [1]=>
  string(4) "test"
}

now string key "1" become an integer value 1, be careful.
matrebatre 20-Jun-2008 07:28
This function does the same as:
<?php
$array = array_combine($keys,array_fill(0,count($keys),$value));
?>
phydeaux 14-May-2008 10:26
Scratchy's version still doesn't work like the definition describes.  Here's one that can take a mixed variable as the second parameter, defaulting to an empty string if it's not specified.  Don't know if this is exactly how the function works in later versions but it's at least a lot closer.

function array_fill_keys($target, $value = '') {
    if(is_array($target)) {
        foreach($target as $key => $val) {
            $filledArray[$val] = is_array($value) ? $value[$key] : $value;
        }
    }
    return $filledArray;
}

This works for either strings or numerics, so if we have

$arr1 = array(0 => 'abc', 1 => 'def');
$arr2 = array(0 => 452, 1 => 128);
$arr3 = array(0 => 'foo', 1 => 'bar');

then

array_fill_keys($arr1,$arr2)
returns: [abc] => 452, [def] => 128

array_fill_keys($arr1,0)
returns: [abc] => 0, [def] => 0

array_fill_keys($arr2,$arr3)
returns: [452] => foo, [128] => bar

array_fill_keys($arr3,'BLAH')
returns: [foo] => BLAH, [bar] => BLAH

and array_fill_keys($arr1)
returns: [abc] =>, [def] =>
Scratchy 02-May-2008 02:18
RE: bananasims at hotmail dot com

I also needed a work around to not having a new version of PHP and wanting my own keys. bananasims code doesn't like having an array as the second parameter...

Here's a slightly modified version than can handle 2 arrays as inputs:

//we want these values to be keys
$arr1 = (0 => "abc", 1 => "def");
/we want these values to be values
$arr2 = (0 => 452, 1 => 128);

function array_fill_keys($keyArray, $valueArray) {
    if(is_array($keyArray)) {
        foreach($keyArray as $key => $value) {
            $filledArray[$value] = $valueArray[$key];
        }
    }
    return $filledArray;
}

array_fill_keys($arr1, $arr2);

returns:
abc => 452, def =>128
bananasims at hotmail dot com 19-Dec-2006 05:03
Some of the versions do not have this function.
I try to write it myself.
You may refer to my script below

function array_fill_keys($array, $values) {
    if(is_array($array)) {
        foreach($array as $key => $value) {
            $arraydisplay[$array[$key]] = $values;
        }
    }
    return $arraydisplay;
}


Remplit un tableau avec une même valeur

  • « array_fill_keys
  • array_filter »
  • PHP Manual
  • Fonctions sur les tableaux
  • Remplit un tableau avec une même valeur

array_fill

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

array_fill — Remplit un tableau avec une même valeur

Description

array_fill ( int $start_index , int $count , mixed $value ) : array

Crée un tableau avec count entrées, toutes de valeur value. Les index commencent à la valeur start_index.

Liste de paramètres

start_index

Le premier index du tableau retourné.

Si start_index est négatif, le premier index du tableau retourné sera start_index, suivi par des indices commençant à zéro (voir l'exemple).

count

Nombre d'éléments à insérer. Doit être supérieur ou égal à zéro.

value

Valeur à utiliser pour remplir le tableau

Valeurs de retour

Retourne le tableau rempli.

Erreurs / Exceptions

Lance une alerte de niveau E_WARNING si count est inférieur à 0.

Historique

Version | Description
5.6.0 | count peut maintenant être 0. Précédemment, count devait être supérieur à 0.

Exemples

Exemple #1 Exemple avec array_fill()

<?php
$a = array_fill(5, 6, 'banana');
$b = array_fill(-2, 4, 'pear');
print_r($a);
print_r($b);
?>

L'exemple ci-dessus va afficher :

Array
(
    [5]  => banana
    [6]  => banana
    [7]  => banana
    [8]  => banana
    [9]  => banana
    [10] => banana
)
Array
(
    [-2] => pear
    [0] => pear
    [1] => pear
    [2] => pear
)

Notes

Voir aussi la section du manuel sur les tableaux pour plus d'informations sur les clés négatives.

Voir aussi

  • array_fill_keys() - Remplit un tableau avec des valeurs, en spécifiant les clés
  • str_repeat() - Répète une chaîne
  • range() - Crée un tableau contenant un intervalle d'éléments

User Contributed Notes

Hayley Watson 13-Jan-2018 11:57
Fill missing keys in a (numerically-indexed) array with a default value

<?php

function fill_missing_keys($array, $default = null, $atleast = 0)
{
    return $array + array_fill(0, max($atleast, max(array_keys($array))), $default);
}

?>
anatoliy at ukhvanovy dot name 16-Jun-2014 10:00
If you need negative indices:
<?php
$b = array_fill(-2, 4, 'pear');//this is not what we want
$c = array_fill_keys(range(-2,1),'pear');//these are negative indices
print_r($b);
print_r($c);
?>
Here is result of the code above:
Array
(
    [-2] => pear
    [0] => pear
    [1] => pear
    [2] => pear
)
Array
(
    [-2] => pear
    [-1] => pear
    [0] => pear
    [1] => pear
)
mchljnk at NOSPAM dot gmail dot com 10-Nov-2013 03:07
Using objects with array_fill may cause unexpected results. Consider the following:

<?php
class Foo {
   public $bar = "banana";
}

//fill an array with objects
$array = array_fill(0, 2, new Foo());

var_dump($array);
/*
array(2) {
  [0]=>
  object(Foo)#1 (1) {
    ["bar"]=>
    string(6) "banana"
  }
  [1]=>
  object(Foo)#1 (1) {
    ["bar"]=>
    string(6) "banana"
  }
} */

//now we change the attribute of the object stored in index 0
//this actually changes the attribute for EACH object in the ENTIRE array
$array[0]->bar = "apple";

var_dump($array);
/*
array(2) {
  [0]=>
  object(Foo)#1 (1) {
    ["bar"]=>
    string(5) "apple"
  }
  [1]=>
  object(Foo)#1 (1) {
    ["bar"]=>
    string(5) "apple"
  }
}
 */
?>

Objects are filled in the array BY REFERENCE. They are not copied for each element in the array.
miguelxpain at gmail dot com 24-Feb-2012 06:04
I made this function named "array_getMax" that returns te maximum value and index, from array:

<?php
//using array_search_all by helenadeus at gmail dot com

function array_search_all($needle, $haystack)
{#array_search_match($needle, $haystack) returns all the keys of the values that match $needle in $haystack

    foreach ($haystack as $k=>$v) {

        if($haystack[$k]==$needle){

           $array[] = $k;
        }
    }
    return ($array);

}

function array_getMax($array){

    $conteo=array_count_values($array);

    if( count($conteo)==1 ){//returns full array when all values are the same.
        return  $array;
    }

    arsort($array);

    //$antValue=null;
    $maxValue=null;
    $keyValue=null;
    foreach($array as $key=>$value){
        if($maxValue==null){
            $maxValue=$value;
            $keyValue=$key;
            break;
        }
    }

    $resultSearch=array_search_all($maxValue, $array);

   return  array_fill_keys($resultSearch, $maxValue);

}

//example
  $arreglo=array('e1'=>99,'e2'=>'99','e3'=>1,'e4'=>1,'e5'=>98);

    var_dump(array_getMax($arreglo));

//output
/*
array(2) {
  ["e1"]=>
  int(99)
  ["e2"]=>
  int(99)
}
*/
?>

I hope some one find this usefull
csst0266 at cs dot uoi dot gr 11-Aug-2004 10:32
This is what I recently did to quickly create a two dimensional array (10x10), initialized to 0:

<?php
  $a = array_fill(0, 10, array_fill(0, 10, 0));
?>

This should work for as many dimensions as you want, each time passing to array_fill() (as the 3rd argument) another array_fill() function.
25-Aug-2002 01:59
array_fill() cannot be used to setup only missing keys in an array. This  may be necessary for example before using implode()  on a sparse filled array.
The solution is to use this function:

<?php
function array_setkeys(&$array, $fill = NULL) {
  $indexmax = -1;
  for (end($array); $key = key($array); prev($array)) {
    if ($key > $indexmax)
      $indexmax = $key;
  }
  for ($i = 0; $i <= $indexmax; $i++) {
    if (!isset($array[$i]))
      $array[$i] = $fill;
  }
  ksort($array);
}
?>

This is usefull in some situations where you don't know which key index was filled and you want to preserve the association between a positioned field in an imploded array and the key index when exploding it.


Filtre les éléments d'un tableau grâce à une fonction de rappel

  • « array_fill
  • array_flip »
  • PHP Manual
  • Fonctions sur les tableaux
  • Filtre les éléments d'un tableau grâce à une fonction de rappel

array_filter

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

array_filter — Filtre les éléments d'un tableau grâce à une fonction de rappel

Description

array_filter ( array $array , callable|null $callback = null , int $mode = 0 ) : array

Évalue chaque valeur du tableau array en les passant à la fonction de rappel callback. Si la fonction de rappel callback retourne true, la valeur courante du tableau array est retournée dans le tableau résultant.

Les clés du tableau sont préservées, et peut entrainer des anomalies si le tableau array était indexé. Le tableau résultant peut être ré-indexé en utilisant la fonction array_values().

Liste de paramètres

array

Le tableau à parcourir

callback

La fonction de rappel à utiliser

Si aucune fonction de rappel callback n'est fournie, toutes les entrées vides du tableau array seront supprimées. Voir la fonction empty() pour comprendre la façon dont PHP gère le vide dans ce cas.

mode

Drapeau indiquant quels sont les arguments à envoyer à la fonction de rappel callback :

  • ARRAY_FILTER_USE_KEY - passer la clé comme seul argument à callback au lieu de la valeur.
  • ARRAY_FILTER_USE_BOTH - passer à la fois la valeur et la clé comme arguments de callback au lieu de la valeur.
Par défaut 0 par défaut qui passera la valeur comme seul argument de callback.

Valeurs de retour

Retourne le tableau filtré.

Historique

Version | Description
8.0.0 | callback est désormais nullable.
5.6.0 | Ajout du paramètre optionnel mode et des constantes ARRAY_FILTER_USE_KEY et ARRAY_FILTER_USE_BOTH

Exemples

Exemple #1 Exemple avec array_filter()

<?php
function odd($var)
{
    // retourne si l'entier en entrée est impair
    return $var & 1;
}

function even($var)
{
    // retourne si l'entier en entrée est pair
    return !($var & 1);
}

$array1 = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5];
$array2 = [6, 7, 8, 9, 10, 11, 12];

echo "Impair :\n";
print_r(array_filter($array1, "odd"));
echo "Pair :\n";
print_r(array_filter($array2, "even"));
?>

L'exemple ci-dessus va afficher :

Impair :
Array
(
    [a] => 1
    [c] => 3
    [e] => 5
)
Pair :
Array
(
    [0] => 6
    [2] => 8
    [4] => 10
    [6] => 12
)

Exemple #2 Exemple avec array_filter() callback

<?php

$entry = [
    0 => 'foo',
    1 => false,
    2 => -1,
    3 => null,
    4 => '',
    5 => '0',
    6 => 0,
];

print_r(array_filter($entry));
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => foo
    [2] => -1
)

Exemple #3 Exemple avec array_filter() et mode

<?php

$arr = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];

var_dump(array_filter($arr, function($k) {
    return $k == 'b';
}, ARRAY_FILTER_USE_KEY));

var_dump(array_filter($arr, function($v, $k) {
    return $k == 'b' || $v == 4;
}, ARRAY_FILTER_USE_BOTH));
?>

L'exemple ci-dessus va afficher :

array(1) {
  ["b"]=>
  int(2)
}
array(2) {
  ["b"]=>
  int(2)
  ["d"]=>
  int(4)
}

Notes

Attention

Si le tableau est modifié depuis la fonction de rappel (par exemple des éléments sont ajoutés, effacés ou détruit), le comportement de cette fonction est indéfini.

Voir aussi

  • array_map() - Applique une fonction sur les éléments d'un tableau
  • array_reduce() - Réduit itérativement un tableau
  • array_walk() - Exécute une fonction fournie par l'utilisateur sur chacun des éléments d'un tableau

User Contributed Notes

stef at gigamedium dot com 09-Dec-2020 12:00
To filter out empty arrays, put the arrays you need filtering in an array and pass through array_filter.

$array1 = [5, 6];
$array2 = [];
$array3 = [7,9];

$array = array_filter(array($array1, $array2, $array3));

print_r($array)

Results in:
Array (
  [5,6] , [7,9]
}
Al Amin Chayan (mail at chayan dot me) 22-Sep-2020 05:43
/**
   * Remove key from multidimensional array
   *
   * @param array $request
   * @param array $keys
   *
   * @return array
   */
function request_filter(array $request, array $keys) {
    array_walk($request, function (&$value, $key) use ($keys) {
        if(is_array($value)) {
            $value = request_filter($value, $keys);
        }
    });

    return array_filter ($request, function ($value, $key) use ($keys) {
        return ! in_array($key, $keys);
    }, ARRAY_FILTER_USE_BOTH);
}

$data = [
  'a' => 'A',
  'password' => 123,
  'data' => [
      'b' => 'B',
      'data2' => [
           'c' => 'C',
            'password' => 545,
    ],
    'password' => 321,
  ]
];

print_r(request_filter($data, ['password']));

Output will be:
Array
(
    [a] => A
    [data] => Array
        (
            [b] => B
            [data2] => Array
                (
                    [c] => C
                )

        )

)
nicolaj dot knudsen at gmail dot com 05-Apr-2017 12:05
If you like me have some trouble understanding example #1 due to the bitwise operator (&) used, here is an explanation.

The part in question is this callback function:

<?php
function odd($var)
{
    // returns whether the input integer is odd
    return($var & 1);
}
?>

If given an integer this function returns the integer 1 if $var is odd and the integer 0 if $var is even.
The single ampersand, &, is the bitwise AND operator. The way it works is that it takes the binary representation of the two arguments and compare them bit for bit using AND. If $var = 45, then since 45 in binary is 101101 the operation looks like this:

45 in binary: 101101
1 in binary:  000001
              ------
result:       000001

Only if the last bit in the binary representation of $var is changed to zero (meaning that the value is even) will the result change to 000000, which is the representation of zero.
njt1982 at yahoo dot com 30-Apr-2015 01:18
If you have an array of KV pairs and you want all the items where a value is X, you dont need to make a callback for array_filter. You can use array_intersect:

<?php
print_r(array_intersect(
  array(
    'a' => 1,
    'b' => 1,
    'c' => 1,
    'd' => 2,
    'e' => 2,
    'f' => 2,
  ),
  array(1)
));

Array
(
    [a] => 1
    [b] => 1
    [c] => 1
)
?>

The advantage of this approach is you can pass variables into the second array without needing to worry about variable scope and function parameters for array_filter.
iancudanielc () gmail ! com 09-Jan-2015 08:56
If you want to pass the key to the callback function before PHP 5.6.0 (when the flag parameter wasn't implemented):

<?php

$result = array_filter(array_keys($array), 'is_int');

?>
manwe at inversion dot pl 21-Sep-2014 12:33
array_filter remove also FALSE and 0. To remove only NULL's use:

$af = [1, 0, 2, null, 3, 6, 7];

function is_not_null($val){
    return !is_null($val);
}
$af = array_filter($af, 'is_not_null');
marc dot gray at gmail dot com 29-Apr-2014 10:44
My favourite use of this function is converting a string to an array, trimming each line and removing empty lines:

<?php
$array = array_filter(array_map('trim', explode("\n", $string)), 'strlen');
?>

Although it states clearly that array keys are preserved, it's important to note this includes numerically indexed arrays. You can't use a for loop on $array above without processing it through array_values() first.
avl 04-Nov-2013 12:25
nice trick:

$array_out = array_filter($array_in, function($var) use($array_other) {
            return in_array($var, $array_other) ? true : false;
});
g dot kuizinas at anuary dot com 26-Mar-2013 11:10
<?php
function array_filter_recursive ($data) {
    $original = $data;

    $data = array_filter($data);

    $data = array_map(function ($e) {
        return is_array($e) ? array_filter_recursive($e) : $e;
    }, $data);

    return $original === $data ? $data : array_filter_recursive($data);
}

$data = ['a' => 0, 'b' => [], 'c' => [[]], 'd' => [[[[]]]], 'e' => 'foo', 'f' => [[['a']]], [true], [[],['a'], [true, false]]];

$data = array_filter_recursive($data);
?>
Anonymous 13-Jan-2013 05:52
If you want a quick way to remove NULL, FALSE and Empty Strings (""), but leave values of 0 (zero), you can use the standard php function strlen as the callback function:
eg:
<?php

// removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values
$result = array_filter( $array, 'strlen' );

?>
jtreminio at gmail dot com 04-Oct-2012 07:11
You can use array_filter from within a class to access a protected method from that same class:

<?php

class Bar {
    public function foo()
    {
        $array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);

        print_r(array_filter($array1, array($this, 'naz')));
    }

    protected function baz($var)
    {
        return($var & 1);
    }
}

$bar = new Bar();
$bar->foo();
?>
John Erck: erck0006 at junkyo dot gmail dot com 04-Apr-2012 08:09
<?php
// ARRAY FILTER RECURSIVE USING CLASS, STATIC METHOD, AND ANONYMOUS CALLBACK FUNCTION
// NOTE THAT THE CALLBACK HAS ACCESS TO BOTH THE KEY AND VALUE

// THE CLASS (FOR YOU TO COPY)
class ArrayUtil
{
    public static function FilterRecursive(Array $source, $fn)
    {
        $result = array();
        foreach ($source as $key => $value)
        {
            if (is_array($value))
            {
                $result[$key] = self::FilterRecursive($value, $fn);
                continue;
            }
            if ($fn($key, $value))
            {
                $result[$key] = $value; // KEEP
                continue;
            }
        }
        return $result;
    }
}

// EXAMPLE ANONYMOUS CALLBACK FUNCTION
$fn = function ($key, $value)
{
    if (strpos($key, 'drop') !== FALSE)
    {
        return FALSE; // DROP
    }
    return TRUE; // KEEP
};

// EXAMPLE PRE FILTER TEST DATA
$preFilter = array(
    'a' => 'one',
    'b' => array(
        'example_drop' => 'filter me out',
        'example_keep' => 'keep me',
    ),
    'c' => 'three',
);

// EXAMPLE USAGE CODE
echo '// print_r($preFilter);' . "\n";
print_r($preFilter);
$postFilter = ArrayUtil::FilterRecursive($preFilter, $fn);
echo "\n";
echo '// print_r($postFilter);' . "\n";
print_r($postFilter);

/* OUTPUT OPEN
// print_r($preFilter);
Array
(
    [a] => one
    [b] => Array
        (
            [example_drop] => filter me out
            [example_keep] => keep me
        )

    [c] => three
)

// print_r($postFilter);
Array
(
    [a] => one
    [b] => Array
        (
            [example_keep] => keep me
        )

    [c] => three
)
OUTPUT CLOSE */
lisachenko dot it at HUMAN dot gmail dot com 22-Jul-2011 12:54
You can access the current key of array by passing a reference to array into callback function and call key() and next() method in the callback function:
<?php
$data = array('first' => 1, 'second' => 2, 'third' => 3);
$data = array_filter($data, function ($item) use (&$data) {
    echo "Filtering key ", key($data), '<br>', PHP_EOL;
    next($data);
    return false;
});
?>

However be careful with array internal pointer or use reset() method before calling array_filter().
Peter Robinett 12-Aug-2010 08:09
Because array_filter() preserves keys, you should consider the resulting array to be an associative array even if the original array had integer keys for there may be holes in your sequence of keys. This means that, for example, json_encode() will convert your result array into an object instead of an array. Call array_values() on the result array to guarantee json_encode() gives you an array.
webdesign at blackbyrd dot biz 08-Oct-2009 01:00
Here's a function that will filter a multi-demensional array. This filter will return only those items that match the $value given

<?php
    /*
     * filtering an array
     */
    function filter_by_value ($array, $index, $value){
        if(is_array($array) && count($array)>0)
        {
            foreach(array_keys($array) as $key){
                $temp[$key] = $array[$key][$index];

                if ($temp[$key] == $value){
                    $newarray[$key] = $array[$key];
                }
            }
          }
      return $newarray;
    }
?>

Example:

<?php
$results = array(
   0 => array('key1' => '1', 'key2' => 2, 'key3' => 3),
   1 => array('key1' => '12', 'key2' => 22, 'key3' => 32)
);

$nResults = filter_by_value($results, 'key2', '2');
?>

Output :

array(
    0 => array('key1' => '1', 'key2' => 2, 'key3' => 3)
);
chrisstocktonaz at gmail dot com 30-Apr-2009 09:34
I use the following to see if a array consist of scalar values or null, but of course you could mix it up using any of the is_ functions.

<?php
if(count($data) !== count(array_filter($data, 'is_scalar') + array_filter($data, 'is_null'))) {
  throw new Exception('Array did not consist of scalar and null values');
}
?>
niehztog 30-Dec-2008 01:27
In case you are interested (like me) in filtering out elements with certain key-names, array_filter won't help you. Instead you can use the following:

<?php
$arr = array( 'element1' => 1, 'element2' => 2, 'element3' => 3, 'element4' => 4 );
$filterOutKeys = array( 'element1', 'element4' );

$filteredArr = array_diff_key( $arr, array_flip( $filterOutKeys ) )
?>

Result will be something like this:
['element2'] => 2
['element3'] => 3
romain dot lamarche at gmail dot com 11-Dec-2008 06:39
This function filters an array and remove all null values recursively.

<?php
  function array_filter_recursive($input)
  {
    foreach ($input as &$value)
    {
      if (is_array($value))
      {
        $value = array_filter_recursive($value);
      }
    }

    return array_filter($input);
  }
?>

Or with callback parameter (not tested) :

<?php
  function array_filter_recursive($input, $callback = null)
  {
    foreach ($input as &$value)
    {
      if (is_array($value))
      {
        $value = array_filter_recursive($value, $callback);
      }
    }

    return array_filter($input, $callback);
  }
?>
darren at dazwin dot com 08-Oct-2008 11:44
Regarding comment about trimming empty strings, the code posted will get into an infinite loop if the array is reduced to zero elements. The following might be better:

<?php
function array_trim($array) {
    while (!empty($array) and strlen(reset($array)) === 0) {
        array_shift($array);
    }
    while (!empty($array) and strlen(end($array)) === 0) {
        array_pop($array);
    }
    return $array;
}
?>
Martin 04-Sep-2007 10:56
This function trims empty strings from the beginning and end of an array.
It's useful when outputing plaintext files on a page and you want to skip empty lines at the beginning and end, but not within the text.

<?php
function array_trim($array) {
    while (strlen(reset($array)) === 0) {
        array_shift($array);
    }
    while (strlen(end($array)) === 0) {
        array_pop($array);
    }
    return $array;
}
?>

You might want to trim each element too.
marc dot vanwoerkom at fernuni-hagen dot de 05-Jul-2004 08:09
Some of PHP's array functions play a prominent role in so called functional programming languages, where they show up under a slightly different name:

<?php
  array_filter() -> filter(),
  array_map() -> map(),
  array_reduce() -> foldl() ("fold left")
?>

Functional programming is a paradigm which centers around the side-effect free evaluation of functions. A program execution is a call of a function, which in turn might be defined by many other functions. One idea is to use functions to create special purpose functions from other functions.

The array functions mentioned above allow you compose new functions on arrays.

E.g. array_sum = array_map("sum", $arr).

This leads to a style of programming that looks much like algebra, e.g. the Bird/Meertens formalism.

E.g. a mathematician might state

  map(f o g) = map(f) o map(g)

the so called "loop fusion" law.

Many functions on arrays can be created by the use of the foldr() function (which works like foldl, but eating up array elements from the right).

I can't get into detail here, I just wanted to provide a hint about where this stuff also shows up and the theory behind it.
Maxwel Leite 11-May-2004 08:17
For any type of array. Basead in redshift code.

<?php
function array_clean ($array, $todelete = false, $caseSensitive = false) {
    foreach($array as $key => $value) {
        if(is_array($value)) {
            $array[$key] = array_clean($array[$key], $todelete, $caseSensitive);
        }
        else {
            if($todelete) {
                if($caseSensitive) {
                    if(strstr($value ,$todelete) !== false)
                        unset($array[$key]);
                }
                else {
                    if(stristr($value, $todelete) !== false)
                        unset($array[$key]);
                }
            }
            elseif (empty($value)) {
                unset($array[$key]);
            }
        }
    }
    return $array;
}
?>
ajohnson at speakeasy dot org 27-Sep-2002 12:42
be careful with the above function "array_delete"'s use of the stristr function, it could be slightly misleading. consider the following:

<?php
function array_delete($array, $filterforsubstring){
    $thisarray = array ();
    foreach($array as $value)
        if(stristr($value, $filterforsubstring)===false && strlen($value)>0)
            $thisarray[] = $value;
    return $thisarray;
}

function array_delete2($array, $filterforstring, $removeblanksflag=0){
    $thisarray = array ();
    foreach($array as $value)
        if(!(stristr($value, $filterforstring) && strlen($value)==strlen($filterforstring))
                && !(strlen($value)==0 && $removeblanksflag))
            $thisarray[] = $value;
    return $thisarray;
}

function array_delete3($array, $filterfor, $substringflag=0, $removeblanksflag=0){
    $thisarray = array ();
    foreach($array as $value)
        if(
            !(stristr($value, $filterfor)
                && ($substringflag || strlen($value)==strlen($filterfor))
            )
            && !(strlen($value)==0 && $removeblanksflag)
        )
            $thisarray[] = $value;
    return $thisarray;
}

$array1 = array ('the OtHeR thang','this', 'that', 'OtHer','', 9, 101, 'fifty', ' oTher', 'otHer ','','other','Other','','other blank things');

echo "<pre>array :\n";
print_r($array1);

$array2=array_delete($array1, "Other");

echo "array_delete(\$array1, \"Other\"):\n";
print_r($array2);

$array2=array_delete2($array1, "Other");

echo "array_delete2(\$array1, \"Other\"):\n";
print_r($array2);

$array2=array_delete2($array1, "Other",1);

echo "array_delete2(\$array1, \"Other\",1):\n";
print_r($array2);

$array2=array_delete3($array1, "Other",1);

echo "array_delete3(\$array1, \"Other\",1):\n";
print_r($array2);

$array2=array_delete3($array1, "Other",0,1);

echo "array_delete3(\$array1, \"Other\",0,1):\n";
print_r($array2);
 ?>
ajohnson at speakeasy dot org 17-Aug-2002 01:04
I was looking for a function to delete values from an array and thought I had found it in array_filter(), however, I *didn't* want the keys to be preserved *and* I needed blank values cleaned out of the array as well. I came up with the following (with help from many of the above examples):

<?php
function array_delete($array, $filterfor){
  $thisarray = array ();
  foreach($array as $value)
    if(stristr($value, $filterfor)===false && strlen($value)>0)
      $thisarray[] = $value;
  return $thisarray;
}

$array1 = array ('OtHeR','this', 'that', 'Other','', 9, 101, 'fifty', 'other','','');

echo "<pre>array :\n";
print_r($array1);

$array2=array_delete($array1, "Other");

echo "filtered:\n";
print_r($array2);
?>


Remplace les clés par les valeurs, et les valeurs par les clés

  • « array_filter
  • array_intersect_assoc »
  • PHP Manual
  • Fonctions sur les tableaux
  • Remplace les clés par les valeurs, et les valeurs par les clés

array_flip

(PHP 4, PHP 5, PHP 7, PHP 8)

array_flip — Remplace les clés par les valeurs, et les valeurs par les clés

Description

array_flip ( array $array ) : array

array_flip() retourne un tableau dont les clés sont les valeurs du précédent tableau array, et les valeurs sont les clés.

Notez bien que les valeurs de array doivent être des clés valides, c'est-à-dire qu'elles doivent être des entier ou des chaîne de caractères. Une alerte sera émise si une valeur est d'un type qui ne convient pas et la paire en question ne sera pas incluse dans le résultat.

Si une valeur n'est pas unique, seule la dernière clé sera utilisée comme valeur, et toutes les autres seront perdues.

Liste de paramètres

array

Un tableau de paire clés/valeurs à inverser.

Valeurs de retour

Retourne un tableau inversé en cas de succès, null si une erreur survient.

Exemples

Exemple #1 Exemple avec array_flip()

<?php
$input = array("oranges", "apples", "pears");
$flipped = array_flip($input);

print_r($flipped);
?>

L'exemple ci-dessus va afficher :

Array
(
    [oranges] => 0
    [apples] => 1
    [pears] => 2
)

Exemple #2 Exemple avec array_flip() : collision

<?php
$input = array("a" => 1, "b" => 1, "c" => 2);
$flipped = array_flip($input);

print_r($flipped);
?>

L'exemple ci-dessus va afficher :

Array
(
    [1] => b
    [2] => c
)

Voir aussi

  • array_values() - Retourne toutes les valeurs d'un tableau
  • array_keys() - Retourne toutes les clés ou un ensemble des clés d'un tableau
  • array_reverse() - Inverse l'ordre des éléments d'un tableau

User Contributed Notes

Ahammar Yassine 11-Oct-2018 06:03
<?php

$arr = array('one' => ['four' => 4], 'two' => '2', 'three' => '3');
var_dump($arr);

$arr2 = array_flip($arr);
var_dump($arr2);

?>

The above example will output:

array(3) {
  ["one"]=>
  array(1) {
    ["four"]=>
    int(4)
  }
  ["two"]=>
  string(1) "2"
  ["three"]=>
  string(1) "3"
}

Warning: array_flip(): Can only flip STRING and INTEGER values! in /root/test.php on line 4
array(2) {
  [2]=>
  string(3) "two"
  [3]=>
  string(5) "three"
}
dash 08-Oct-2018 03:27
Notice : array_flip can turn string into integer
Hayley Watson 30-Oct-2017 03:19
Don't use this function for filtering or searching an array - PHP already has functions for exactly those purposes. If nothing else, array_flip will trash the array's elements if they're anything other than integers or non-decimal-integer strings.
Bob Ray 03-Mar-2017 04:22
array_flip will remove duplicate values in the original array when you flip either an associative or numeric array. As you might expect it's the earlier of two duplicates that is lost:

<?php
    $a = array('one', 'two', 'one');
    print_r($a);

    $b = array_flip($a);
    print_r($b);
?>

Result:

array(3) {
  [0]  => string(3) "one"
  [1]  =>  string(3) "two"
  [2]  =>  string(3) "one"
}

array(2) {
  'one' => int(2)
  'two' => int(1)
}

This may be good or bad, depending on what you want, but no error is thrown.
info at sabastore dot net 27-Apr-2016 08:57
note :: array_flip is a changer for key and value and a auto unique like array_unique :

<?php
/*
sabastore
 */
$intArray1 = array(-4,1,1,3);
print_r($intArray1);
$intArray1 = array_flip($intArray1);
print_r($intArray1);
?>
Prabhas Gupte 27-Jan-2015 06:48
array_flip() does not retain the data type of values, when converting them into keys. :(

<?php
$arr = array('one' => '1', 'two' => '2', 'three' => '3');
var_dump($arr);
$arr2 = array_flip($arr);
var_dump($arr2);
?>

This code outputs this:
array(3) {
  ["one"]=>
  string(1) "1"
  ["two"]=>
  string(1) "2"
  ["three"]=>
  string(1) "3"
}
array(3) {
  [1]=>
  string(3) "one"
  [2]=>
  string(3) "two"
  [3]=>
  string(5) "three"
}

It is valid expectation that string values "1", "2" and "3" would become string keys "1", "2" and "3".
grimdestripador at hotmail dot com 25-Feb-2014 12:06
<?php
function array_flip_into_subarray($input){
$output = array();
foreach ($input as $key=>$values){
    foreach ($values as $value){
        $output[$value][] = $key;
    }
}
return $output;
}
Tony H 29-Apr-2013 02:59
This function is useful when parsing a CSV file with a heading column, but the columns might vary in order or presence:

<?php

$f = fopen("file.csv", "r");

/* Take the first line (the header) into an array, then flip it
so that the keys are the column name, and values are the
column index. */
$cols = array_flip(fgetcsv($f));

while ($line = fgetcsv($f))
{
    // Now we can reference CSV columns like so:
    $status = $line[$cols['OrderStatus']];
}

?>

I find this better than referencing the numerical array index.
Anonymous 05-Apr-2012 10:17
Similarly, if you want the last value without affecting the pointer, you can do:

<?php

$array = array("one","two","three");

echo next($array); // "two"

$last = array_pop(array_keys(array_flip($array)));

echo $last;  // "three"

echo current($array); // "two"

?>
kjensen at iaff106 dot com 06-Jan-2012 10:23
I needed a way to flip a multidimensional array and came up with this function to accomplish the task.  I hope it helps someone else.

<?php
function multi_array_flip($arrayIn, $DesiredKey, $DesiredKey2=false, $OrigKeyName=false) {
$ArrayOut=array();
foreach ($arrayIn as $Key=>$Value)
    {
        // If there is an original key that need to be preserved as data in the new array then do that if requested ($OrigKeyName=true)
        if ($OrigKeyName) $Value[$OrigKeyName]=$Key;
        // Require a string value in the data part of the array that is keyed to $DesiredKey
        if (!is_string($Value[$DesiredKey])) return false;

        // If $DesiredKey2 was specified then assume a multidimensional array is desired and build it
        if (is_string($DesiredKey2))
        {
            // Require a string value in the data part of the array that is keyed to $DesiredKey2
            if (!is_string($Value[$DesiredKey2])) return false;

            // Build NEW multidimensional array
            $ArrayOut[$Value[$DesiredKey]][$Value[$DesiredKey2]]=$Value;
        }

            // Build NEW single dimention array
        else $ArrayOut[$Value[$DesiredKey]][]=$Value;
    }
return $ArrayOut;
}//end multi_array_flip
?>
Final 16-Dec-2011 04:16
I find this function vey useful when you have a big array and you want to know if a given value is in the array. in_array in fact becomes quite slow in such a case, but you can flip the big array and then use isset to obtain the same result in a much faster way.
h3x 12-Sep-2010 01:11
this function can be used to remove null elements form an array:

<?php
$ar = array(null,'1','2',null,'3',null);
print_r($ar);
/*
result:
Array
(
    [0] =>
    [1] => 1
    [2] => 2
    [3] =>
    [4] => 3
    [5] =>
)
*/

print_r(array_flip(array_flip($ar)));
/*
result:
Array
(
    [1] => 1
    [2] => 2
    [4] => 3
)
*/
?>
Hayley Watson 20-Mar-2009 02:22
Finding the longest string in an array?

<?php
function longest_string_in_array($array)
{
    $mapping = array_combine($array, array_map('strlen', $array));
    return array_keys($mapping, max($mapping));
}
?>

Differences are obvious: returns an array of [i]all[/i] of the longest strings, instead of just picking one arbitrarily. Doesn't do the stripslashing or magic stuff because that's another job for for another function.
dan at aoindustries dot com 07-Mar-2009 12:48
From an algorithmic efficiency standpoint, building an entire array of lengths to then sort to only retrieve the longest value is unnecessary work.  The following should be O(n) instead of O(n log n).  It could also be:

<?php
function get_longest_value($array) {
    // Some don't like to initialize, I do
    $longest = NULL;
    $longestLen = -1;
    foreach ($array $value) {
        $len = strlen($value);
        if($len>$longestLen) {
            $longest = $value;
            $longestLen = $len;
        }
    }
    $longest = str_replace("\r\n", "\n", $longest);
    if (get_magic_quotes_gpc()) { return stripslashes($longest); }
    return $longest;
}
?>
corz at corz dot org 08-Dec-2008 01:36
<?php
/*
    Fun function to return the longest physical *value* from an array.

    Culled from a small script designed to capture the longest $_POST variable,
    usually the textarea, which would then be dumped to a "emergency post dump file".

    corz at corz dot org
*/

$array = array("input" => "submit", "textarea" => "Some long spiel of text\r\na textarea, probably",
                        "another-input" => "make me longer", "and" => "another", "etc" => "etc.");

echo '<!DOCTYPE HTML SYSTEM><html><head><title>long</title></head><body><pre>Longest value: ',
                                            get_longest_value($array),'</pre></body></html>';

function get_longest_value($array) {
    foreach ($array as $key => $value) {
        $lengths[$key] = strlen($value);
    }
    asort($lengths);
    $lengths = array_flip($lengths);
    $longest = str_replace("\r\n", "\n", $array[array_pop($lengths)]);
    if (get_magic_quotes_gpc()) { return stripslashes($longest); }
    return $longest;
}
?>
pinkgothic at gmail dot com 26-Apr-2007 01:37
In case anyone is wondering how array_flip() treats empty arrays:

<?php
print_r(array_flip(array()));
?>

results in:

Array
(
)

I wanted to know if it would return false and/or even chuck out an error if there were no key-value pairs to flip, despite being non-intuitive if that were the case. But (of course) everything works as expected. Just a head's up for the paranoid.
snaury at narod dot ru 23-Nov-2004 11:21
When you do array_flip, it takes the last key accurence for each value, but be aware that keys order in flipped array will be in the order, values were first seen in original array. For example, array:

    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 3
    [5] => 2
    [6] => 1
    [7] => 1
    [8] => 3
    [9] => 3

After flipping will become:
(first seen value -> first key)

    [1] => 7
    [2] => 5
    [3] => 9

And not anything like this:
(last seen value -> last key)

    [2] => 5
    [1] => 7
    [3] => 9

In my application I needed to find five most recently commented entries. I had a sorted comment-id => entry-id array, and what popped in my mind is just do array_flip($array), and I thought I now would have last five entries in the array as most recently commented entry => comment pairs. In fact it wasn't (see above, as it is the order of values used). To achieve what I need I came up with the following (in case someone will need to do something like that):

First, we need a way to flip an array, taking the first encountered key for each of values in array. You can do it with:

  $array = array_flip(array_unique($array));

Well, and to achieve that "last comments" effect, just do:

  $array = array_reverse($array, true);
  $array = array_flip(array_unique($array));
  $array = array_reverse($array, true);

In the example from the very beginning array will become:

    [2] => 5
    [1] => 7
    [3] => 9

Just what I (and maybe you?) need. =^_^=
znailz at yahoo dot com 05-Aug-2003 02:42
I know a lot of people want a function to remove a key by value from an array. I saw solutions that iterate(!) though the whole array comparing value by value and then unsetting that value's key. PHP has a built-in function for pretty much everything (heard it will even cook you breakfast), so if you think "wouldn't it be cool if PHP had a function to do that...", odds are it already has. Check out this example. It takes a value, gets all keys for that value if it has duplicates, unsets them all, and returns a reindexed array.

<?php
$arr = array(11,12,13,12);        // sample array
$arr = array_flip($arr);
unset($arr[12]);
$arr = array(array_keys($arr));
?>

$arr contains:

Array
(
    [0] => Array
        (
            [0] => 11
            [1] => 13
        )
?>

)


Calcule l'intersection de deux tableaux avec des tests sur les index

  • « array_flip
  • array_intersect_key »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule l'intersection de deux tableaux avec des tests sur les index

array_intersect_assoc

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

array_intersect_assoc — Calcule l'intersection de deux tableaux avec des tests sur les index

Description

array_intersect_assoc ( array $array , array ...$arrays ) : array

array_intersect_assoc() retourne un tableau contenant toutes les valeurs de array qui sont aussi présentes dans tous les autres arguments. Notez que les clés sont aussi utilisées durant la comparaison, contrairement à array_intersect().

Liste de paramètres

array

Le tableau avec les valeurs maîtres à vérifier.

arrays

Tableaux à comparer contre

Valeurs de retour

Retourne un tableau associatif contenant toutes les valeurs du tableau array qui sont présentes dans tous les arguments.

Exemples

Exemple #1 Exemple avec array_intersect_assoc()

<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "b" => "yellow", "blue", "red");
$result_array = array_intersect_assoc($array1, $array2);
print_r($result_array);
?>

L'exemple ci-dessus va afficher :

Array
(
    [a] => green
)

Dans notre exemple, vous pouvez voir que la paire "a" => "green" est présente dans les deux tableaux, et donc placée dans le dernier tableau. La valeur red n'est pas retournée car dans $array1 son index est 0 tandis que dans le tableau $array2, son index est 1, et la clé "b" n'est pas retourné, car sa valeur est différente dans chaque tableau.

Les deux valeurs de la paire clé => valeur sont considérées égales uniquement si (string) $elem1 === (string) $elem2. En d'autres termes, une comparaison stricte est faite sur les représentations des index, avec le type chaîne.

Voir aussi

  • array_intersect() - Calcule l'intersection de tableaux
  • array_uintersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel
  • array_intersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
  • array_uintersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée
  • array_diff() - Calcule la différence entre des tableaux
  • array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés

User Contributed Notes

Jim Yaghi 23-May-2017 06:25
Remember, null values will be interpreted as, "key does not exist." eg,

$a = ['apples' => 1, 'oranges' => 2, 'turtles' => null, 'bananas'=>4];
$b = ['apples'=>10, 'turtles' => 11, 'eggs'=>12];
$c = array_intersect_assoc($b,$a);

You might have expected $c to contain:

['oranges' => 10, 'turtles' => 11]

In fact, 'turtles' has a null value in the $a array, therefore the $c array contains only:

['oranges' => 10]

Something to keep in mind if using array_intersect_assoc to filter valid entries, eg in a mySQL insertion pre-processing or nerdy API that doesn't like extra params.
Whitend 04-Aug-2012 08:08
One of the ways to get intersection of two arrays is as follows:

<?php
function arrayIntersect( $primary_array, $secondary_array ) {

    if ( !is_array( $primary_array ) || !is_array( $secondary_array ) ) {
        return false;
    }

    if ( !empty( $primary_array ) ) {

        foreach( $primary_array as $key => $value ) {

            if ( !isset( $secondary_array[$key] ) ) {
                unset( $primary_array[$key] );
            } else {
                if ( serialize( $secondary_array[$key] ) != serialize( $value ) ) {
                    unset( $primary_array[$key] );
                }
            }

        }

        return $primary_array;

    } else {
        return array();
    }

}
?>

It would pay attention to both keys and values even if values would be arrays as well. One important note is that if value of $primary_array is yet another array, its order of key & value pairs becomes important for matching.
StR: str at strgt dot cjb dot net 13-Oct-2005 05:34
To find the keys that are in 2 arrays, without caring of the values:

This is a function i needed, and it also returns the values of the first array

<?php
function array_key_intersect(&$a, &$b) {
  $array = array();
  while (list($key,$value) = each($a)) {
    if (isset($b[$key]))
      $array[$key] = $value;
  }
  return $array;
}
?>
vandor at progressive dot hu 14-Dec-2004 11:26
# ket tomb kulcs alapu metszetet szamitja ki, az erteken is ellenorzest vegez
#
# calculating (key base) intersection of arrays (value are checked)
# use: $result_array = array_intersect_assoc($a1, $a2, $a3,..);
#
##
# original code by [jochem at iamjochem dawt com] : array_diff_keys()

<?php
function array_intersect_assoc() {

    $args = func_get_args();
    $res = $args[0];

    for ($i=1;$i<count($args);$i++) {
        if (!is_array($args[$i])) {continue;}

        foreach ($res as $key => $data) {
            if ( (!array_key_exists($key, $args[$i])) || ( (isset($args[$i][$key])) && ($args[$i][$key] !== $res[$key]) ) ) {
                unset($res[$key]);
            }
        }
    }

    return $res;
}

?>

<?php
$array1 = array("a"=>"green", "b"=>"brown", "c"=>"blue", "red");
$array2 = array("a"=>"green", "b"=>"yellow", "c"=>"yellow", "red");
$a = array('a'=>'green', 'b'=>'brown', 'c'=>'yellow');
$b = array('a'=>'green', 'b'=>'brown', 'c'=>'yellow', 'e'=>'yellow');

$result_array = array_intersect_assoc($a, $b, $array1, $array2);
?>

$args array will look like:

(
    0 =>
        (
            a => green
            b => brown
            c => yellow
        )

    1 =>
        (
            a => green
            b => brown
            c => yellow
            e => yellow
        )

    2 =>
        (
            a => green
            b => brown
            c => blue
            0 => red
        )

    3 =>
        (
            a => green
            b => yellow
            c => yellow
            0 => red
        )

)

$result_array will look like:

(
    a => green
)


Calcule l'intersection de deux tableaux en utilisant les clés pour comparaison

  • « array_intersect_assoc
  • array_intersect_uassoc »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule l'intersection de deux tableaux en utilisant les clés pour comparaison

array_intersect_key

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_intersect_key — Calcule l'intersection de deux tableaux en utilisant les clés pour comparaison

Description

array_intersect_key ( array $array , array ...$arrays ) : array

array_intersect_key() retourne un tableau contenant toutes les entrées du tableau array qui contiennent des clés présentes dans tous les tableaux passés en arguments.

Liste de paramètres

array

Le tableau contenant les clés maîtresses à vérifier.

arrays

Tableaux à comparer contre

Valeurs de retour

Retourne un tableau associatif contenant toutes les entrées du tableau array dont les clés sont présentes dans tous les arguments.

Exemples

Exemple #1 Exemple avec array_intersect_key()

<?php
$array1 = array('bleu'  => 1, 'rouge'  => 2, 'vert'  => 3, 'violet' => 4);
$array2 = array('vert' => 5, 'bleu' => 6, 'jaune' => 7, 'cyan'   => 8);

var_dump(array_intersect_key($array1, $array2));
?>

L'exemple ci-dessus va afficher :

array(2) {
  ["bleu"]=>
  int(1)
  ["vert"]=>
  int(3)
}

Dans cet exemple, vous pouvez voir que seules les clés 'bleu' et 'vert' sont présentes dans les deux tableaux et donc, elles sont retournées. Notez également que les valeurs pour les clés 'bleu' et 'vert' diffèrent entre les deux tableaux. Néanmoins, elles correspondent toujours car uniquement les clés sont vérifiées. Les valeurs retournées sont celles du tableau array1.

Les deux clés depuis les paires clé => valeur sont considérées comme égales uniquement si (string) $cle1 === (string) $cle2 . En d'autres mots, une analyse stricte du type est exécutée, donc la représentation sous forme de chaine doit être exactement la même.

Voir aussi

  • array_diff() - Calcule la différence entre des tableaux
  • array_udiff() - Calcule la différence entre deux tableaux en utilisant une fonction rappel
  • array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés
  • array_diff_uassoc() - Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel
  • array_udiff_assoc() - Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
  • array_udiff_uassoc() - Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
  • array_diff_key() - Calcule la différence de deux tableaux en utilisant les clés pour comparaison
  • array_diff_ukey() - Calcule la différence entre deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison
  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_intersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
  • array_intersect_ukey() - Calcule l'intersection de deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison

User Contributed Notes

Reed Silver 02-Mar-2015 11:38
If you want an array that has no key value pairs added from the second array:

$new = array_intersect_key($b, $a) + $a;
github.com/xmarcos 12-May-2014 05:47
[Editor's note: changed array_merge_recursive() to array_replace_recursive() to fix the script]

Here is a better way to merge settings using some defaults as a whitelist.

<?php

$defaults = [
    'id'            => 123456,
    'client_id'     => null,
    'client_secret' => null,
    'options'       => [
        'trusted' => false,
        'active'  => false
    ]
];

$options = [
    'client_id'       => 789,
    'client_secret'   => '5ebe2294ecd0e0f08eab7690d2a6ee69',
    'client_password' => '5f4dcc3b5aa765d61d8327deb882cf99', // ignored
    'client_name'     => 'IGNORED',                          // ignored
    'options'         => [
        'active' => true
    ]
];

var_dump(
    array_replace_recursive($defaults,
        array_intersect_key(
            $options, $defaults
        )
    )
);

?>

Output:

array (size=4)
    'id'            => int 123456
    'client_id'     => int 789
    'client_secret' => string '5ebe2294ecd0e0f08eab7690d2a6ee69' (length=32)
    'options'       =>
        array (size=2)
            'trusted' => boolean false
            'active'  => boolean true
pixelf3hler at visualize-me dot de 28-Sep-2013 08:08
in case you came here looking for a function that returns an array containing the values of `all` arrays with intersecting keys:
<?php
   function array_merge_on_key($key, $array1, $array2) {
      $arrays = array_slice(func_get_args(), 1);
      $r = array();
      foreach($arrays as &$a) {
         if(array_key_exists($key, $a)) {
            $r[] = $a[$key];
            continue;
         }
      }
      return $r;
   }
   // example:
   $array1 = array("id" => 12, "name" => "Karl");
   $array2 = array("id" => 4, "name" => "Franz");
   $array3 = array("id" => 9, "name" => "Helmut");
   $array4 = array("id" => 10, "name" => "Kurt");

   $result = array_merge_on_key("id", $array1, $array2, $array3, $array4);

   echo implode(",", $result); // => 12,4,9,10
?>
vladas dot dirzys at gmail dot com 13-Aug-2012 08:03
Simple key white-list filter:

<?php
$arr = array('a' => 123, 'b' => 213, 'c' => 321);
$allowed = array('b', 'c');

print_r(array_intersect_key($arr, array_flip($allowed)));
?>

Will return:
Array
(
    [b] => 213
    [c] => 321
)
pgl at yoyo dot org 18-Jul-2011 08:01
Note that the order of the keys in the returned array is the same as the order of the keys in the source array. eg:

<?php
$array = array(
    'two'   => 'a',
    'three' => 'b',
    'one'   => 'c',
    );

$keyswant = array(
    'one'       => '',
    'three'     => '',
    );

print_r(array_intersect_key($array, $keyswant));

?>

Shows:

Array
(
    [three] => b
    [one] => c
)
chrisbloom7 at gmail dot com 11-Nov-2009 10:23
Regarding php at keithtylerdotcom solution to emulate

<?php
$z = someFuncReturningAnArray()['some_key'];
?>

His recommended solution will still return an array. To get the value of a single key in an array returned by a function, simply add implode() to the recipe:

<?php
function someFuncReturningAnArray() {
  return array(
    'a' => 'b',
    'c' => 'd',
    'e' => 'f',
    'g' => 'h',
    'i' => 'j'
  );
}

//traditional way
$temp = someFuncReturningAnArray();
$b = $temp['a'];
echo print_r($b, 1) . "\n----------\n";

//keithtylerdotcom one-line method
$b = array_intersect_key(someFuncReturningAnArray(), array('a'=>''));
echo print_r($b, 1) . "\n----------\n";

//better one line method
$b = implode('', array_intersect_key(someFuncReturningAnArray(), array('a'=>'')));
echo print_r($b, 1) . "\n----------\n";
?>
markus dot kappe at dix dot at 24-Sep-2009 04:43
<?php
    /**
     * calculates intersection of two arrays like array_intersect_key but recursive
     *
     * @param  array/mixed  master array
     * @param  array        array that has the keys which should be kept in the master array
     * @return array/mixed  cleand master array
     */
    function myIntersect($master, $mask) {
        if (!is_array($master)) { return $master; }
        foreach ($master as $k=>$v) {
            if (!isset($mask[$k])) { unset ($master[$k]); continue; } // remove value from $master if the key is not present in $mask
            if (is_array($mask[$k])) { $master[$k] = $this->myIntersect($master[$k], $mask[$k]); } // recurse when mask is an array
            // else simply keep value
        }
        return $master;
    }
?>
pdemaziere at gmail dot com 23-Feb-2009 07:52
Just a simple script if you want to use one array, which contains only zeros and ones, as mask for another one (both arrays must have the same size of course). $outcome is an array that contains only those values from $source where $mask is equal to 1.

<?php
$outcome = array_values(array_intersect_key( array_values($source), array_filter(array_values($mask)) ));
?>

PS: the array_values() function is necessary to ensure that both arrays have the same numbering/keys, otherwise your masking does not behave as you expect.

Enjoy!
CBWhiz at gmail dot com 04-Jan-2008 02:04
I have found the following helpful:
<?PHP
function array_merge_default($default, $data) {
        $intersect = array_intersect_key($data, $default); //Get data for which a default exists
        $diff = array_diff_key($default, $data); //Get defaults which are not present in data
        return $diff + $intersect; //Arrays have different keys, return the union of the two
}
?>
It's use is like both of the functions it uses, but keeps defaults and _only_ defaults. It's designed for key arrays, and i'm not sure how it will work on numeric indexed arrays.

Example:
<?PHP
$default = array(
 "one" => 1,
 "two" => 2
);
$untrusted = array(
 "one" => 42,
 "three" => 3
);
var_dump(array_merge_default($default, $untrusted));

array(2) {
  ["two"]=>
  int(2)
  ["one"]=>
  int(42)
}

?>
Anton Backer 30-Mar-2006 11:49
Jesse: no, array_intersect_key does not accomplish the same thing as what you posted:

array_flip (array_intersect (array_flip ($a), array_flip ($b)))

because when the array is flipped, values become keys. having duplicate values is not a problem, but having duplicate keys is. array_flip resolves it by keeping only one of the duplicates and discarding the rest. by the time you start intersecting, you've already lost information.


Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel

  • « array_intersect_key
  • array_intersect_ukey »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel

array_intersect_uassoc

(PHP 5, PHP 7, PHP 8)

array_intersect_uassoc — Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel

Description

array_intersect_uassoc ( array $array , array ...$arrays , callable $key_compare_func ) : array

array_intersect_uassoc() retourne un tableau contenant toutes les valeurs du tableau array qui sont présentes dans tous les arguments. Notez que les clés sont utilisées dans la comparaison par opposition à la fonction array_intersect().

Liste de paramètres

array

Tableau initial pour la comparaison des autres tableaux.

arrays

Tableaux à comparer contre

key_compare_func

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

callback ( mixed $a, mixed $b ) : int

Valeurs de retour

Retourne les valeurs du tableau array dont les valeurs existent dans tous les autres arguments.

Exemples

Exemple #1 Exemple avec array_intersect_uassoc()

<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "GREEN", "B" => "brown", "yellow", "red");

print_r(array_intersect_uassoc($array1, $array2, "strcasecmp"));
?>

L'exemple ci-dessus va afficher :

Array
(
    [b] => brown
)

Voir aussi

  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_uintersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel
  • array_uintersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée
  • array_intersect_key() - Calcule l'intersection de deux tableaux en utilisant les clés pour comparaison
  • array_intersect_ukey() - Calcule l'intersection de deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison

User Contributed Notes

There are no user contributed notes for this page.


Calcule l'intersection de deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison

  • « array_intersect_uassoc
  • array_intersect »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule l'intersection de deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison

array_intersect_ukey

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_intersect_ukey — Calcule l'intersection de deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison

Description

array_intersect_ukey ( array $array , array ...$arrays , callable $key_compare_func ) : array

array_intersect_ukey() retourne un tableau contenant toutes les valeurs du tableau array qui contiennent des clés présentes dans tous les arguments.

Liste de paramètres

array

Tableau initial pour la comparaison des tableaux.

arrays

Tableaux à comparer contre

key_compare_func

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

callback ( mixed $a, mixed $b ) : int

Valeurs de retour

Retourne les valeurs du tableau array dont les clés existent dans tous les arguments.

Exemples

Exemple #1 Exemple avec array_intersect_ukey()

<?php
function key_compare_func($key1, $key2)
{
    if ($key1 == $key2)
        return 0;
    else if ($key1 > $key2)
        return 1;
    else
        return -1;
}

$array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);

var_dump(array_intersect_ukey($array1, $array2, 'key_compare_func'));
?>

L'exemple ci-dessus va afficher :

array(2) {
  ["blue"]=>
  int(1)
  ["green"]=>
  int(3)
}

Dans cet exemple, vous pouvez voir que seules les clés 'bleu' et 'vert' sont présentes dans les deux tableaux et, donc, elles sont retournées. Notez également que les valeurs pour les clés 'bleu' et 'vert' diffèrent entre les deux tableaux. Néanmoins, elles correspondent toujours car uniquement les clés sont vérifiées. Les valeurs retournées sont celles du tableau array.

Voir aussi

  • array_diff() - Calcule la différence entre des tableaux
  • array_udiff() - Calcule la différence entre deux tableaux en utilisant une fonction rappel
  • array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés
  • array_diff_uassoc() - Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel
  • array_udiff_assoc() - Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
  • array_udiff_uassoc() - Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
  • array_diff_key() - Calcule la différence de deux tableaux en utilisant les clés pour comparaison
  • array_diff_ukey() - Calcule la différence entre deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison
  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_intersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
  • array_intersect_key() - Calcule l'intersection de deux tableaux en utilisant les clés pour comparaison

User Contributed Notes

gk at anuary dot com 30-Sep-2013 04:52
"array_intersect_ukey" will not work if $key_compare_func is using regular expression to perform comparison. "_array_intersect_ukey" fully implements the "array_intersect_ukey" interface and handles properly boolean comparison. However, the native implementation should be preferred for efficiency reasons.

<?php
$key_compare_func = function ($a, $b) {
    var_dump('a=' . $a. '; b=' . $b);

    if (strpos($b, '/') === 0) {
        return preg_match($b, $a) > 0 ? 0 : -1;
    }

    if ($a == $b) {
        $weight = 0;
    } else if ($a > $b) {
        $weight = 1;
    } else {
        $weight = -1;
    }

    var_dump('literal comparison: ' . $weight);

    return $weight;
};

$foo = ['aab' => '', 'bbb' => '', 'ccb' => '', 'abb' => ''];
$bar = ['/[a-z]b[a-z]/' => ''];
$buz = ['/c[a-z][a-z]/' => ''];

echo PHP_EOL . 'array_intersect_ukey' . PHP_EOL . PHP_EOL;

$subject = array_intersect_ukey ($foo, $bar, $buz, $key_compare_func);

echo PHP_EOL;

var_dump($subject);

echo PHP_EOL . '_array_intersect_ukey' . PHP_EOL . PHP_EOL;

$subject = _array_intersect_ukey($foo, $bar, $buz, $key_compare_func);

echo PHP_EOL;

var_dump($subject);

/**
 * @author Gajus Kuizinas <gk@anuary.com>
 * @version 1.0.0 (2013 09 30)
 * @url https://gist.github.com/gajus/271ad5f36337a32a184c
 */
function _array_intersect_ukey (array $arr1, array $arr2, $key_compare_func) {
    $arr_matched = [];
    $arr_unmatched = [];

    $args = func_get_args();

    $key_compare_func = end($args);

    foreach ($arr1 as $k1 => $v1) {
        foreach ($arr2 as $k2 => $v2) {
            $diff = $key_compare_func($k1, $k2);

            //var_dump('k1=' . $k1 . ', k2=' . $k2 . ', diff=' . $diff);

            if ($diff === 0) {
                $arr_matched[$k1] = $v1;
            } else {
                $arr_unmatched[$k1] = $v1;
            }
        }
    }

    if (count($args) <= 3) {
        return $arr_matched;
    }

    array_splice($args, 0, 2, [$arr_unmatched]);

    return array_merge($arr_matched, call_user_func_array('_array_intersect_ukey', $args));
}

/*
array_intersect_ukey

string(12) "a=bbb; b=aab"
string(21) "literal comparison: 1"
string(12) "a=bbb; b=ccb"
string(22) "literal comparison: -1"
string(12) "a=abb; b=bbb"
string(22) "literal comparison: -1"
string(12) "a=aab; b=abb"
string(22) "literal comparison: -1"
string(22) "a=aab; b=/[a-z]b[a-z]/"
string(22) "a=abb; b=/[a-z]b[a-z]/"
string(22) "a=abb; b=/c[a-z][a-z]/"

array(0) {
}

_array_intersect_ukey

string(22) "a=aab; b=/[a-z]b[a-z]/"
string(22) "a=bbb; b=/[a-z]b[a-z]/"
string(22) "a=ccb; b=/[a-z]b[a-z]/"
string(22) "a=abb; b=/[a-z]b[a-z]/"
string(22) "a=aab; b=/c[a-z][a-z]/"
string(22) "a=ccb; b=/c[a-z][a-z]/"

array(3) {
  ["bbb"]=>
  string(0) ""
  ["abb"]=>
  string(0) ""
  ["ccb"]=>
  string(0) ""
}*/
?>


Calcule l'intersection de tableaux

  • « array_intersect_ukey
  • array_key_exists »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule l'intersection de tableaux

array_intersect

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

array_intersect — Calcule l'intersection de tableaux

Description

array_intersect ( array $array , array ...$arrays ) : array

array_intersect() retourne un tableau contenant toutes les valeurs de array qui sont présentes dans tous les autres arguments. Notez que les clés sont préservées.

Liste de paramètres

array

Le tableau contenant les valeurs maîtres à vérifier.

arrays

Tableaux à comparer contre

Valeurs de retour

Retourne un tableau contenant toutes les valeurs du tableau array dont les valeurs existent dans tous les arguments.

Exemples

Exemple #1 Exemple avec array_intersect()

<?php
$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_intersect($array1, $array2);
print_r($result);
?>

L'exemple ci-dessus va afficher :

Array
(
    [a] => green
    [0] => red
)

Notes

Note: Deux éléments sont considérés comme égaux si et seulement si (string) $elem1 === (string) $elem2. En clair : lorsque la représentation en chaîne de caractères est identique.

Voir aussi

  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_diff() - Calcule la différence entre des tableaux
  • array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés

User Contributed Notes

Anonymous 25-Jan-2021 01:52
array_intersect             use Value, not callback
array_uintersect            use Value, callback receives Value
array_intersect_key         use Key, not callback
array_intersect_ukey        use Key, callback receives Key
array_intersect_assoc       use Both, not callback
array_intersect_uassoc      use Both, callback receives Key ONLY
array_uintersect_assoc      use Both, callback receives Value ONLY
array_uintersect_uassoc     use Both, One callback receives the Key, the other receives the Value.
Ehsan.Chavoshi.com 22-Jun-2019 05:15
I wrote this function to recursively replace array keys with array values (flip) and fill values with defined value. it can be used for recursive array intersect functions .

<?php
function array_values_to_keys_r($array, $fill_value = null)
{
    $flipped = [];
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            $flipped [$key] = array_values_to_keys_r($value);
        } else {
            $flipped [$value] = $fill_value;
        }
    }
    return $flipped;
}
?>
zoolyka at gmail dot com 06-Oct-2018 07:38
If you have to intersect arrays of unique values then using array_intersect_key is about 20 times faster, just have to flip the key value pairs of the arrays, then flip the result again.

<?php

$one = range(1, 250000);
$two = range(50000, 150000);

$start = microtime(true);

$intersection = array_intersect($one, $two);

echo "Did it in ".( microtime(true) - $start )." seconds.\n";

$start = microtime(true);

$intersection = array_flip(array_intersect_key(array_flip($one), array_flip($two)));

echo "Did it in ".( microtime(true) - $start )." seconds.\n";

?>

Did it in 0.89163708686829 seconds.
Did it in 0.038213968276978 seconds.
ram 23-Aug-2018 10:08
$x = array('ram@hb.in', 'ram', 'rams@hb.in');
    $y = array('1231231231');
    $result=array_intersect($x,$z);
    $res = array_intersect($y, $z);
jake 31-Jan-2017 08:42
Also note that, even without the availability of the strict mode switch, false does not match 0:

array_intersect([false], [0]) == [];

Even in PHP 7.1
matang dot dave at gmail dot com 17-Jun-2015 02:34
Take care of value types while using array_intersect function as there is no option for strict type check as in in_array function.

$array1 = array(true,2);
$array2 = array(1, 2, 3, 4, 5, 6);

var_dump(array_intersect($array1, $array2));

result is :
array(2) {
        [0] =>  bool(true)
        [1]  =>  int(2)
}
info at iridsystem dot it 21-May-2015 06:16
This function is able to sort an array based on another array that contains the order of occurrence. The values that are not present will be transferred into the end of the resultant.
Questa funzione permette di ordinare i valori di un array ($tosort) basandosi sui valori contenuti in un secondo array ($base), i valori non trovati verranno posizionati alla fine dell'ordinamento senza un'ordine specifico.

<?
$base= array('one', 'two', 'three');

$tosort= array('a'=>'two', 'b'=>'three', 'c'=>'five', 'd'=>'one', 'and'=>'four', 'f'=>'one');

uasort($tosort, function($key1, $key2) use ($base) {
  $a1=array_search($key1, $base);
  $a2=array_search($key2, $base);

  if ( $a1===false && $a2===false ) { return 0; }
  else if ( $a1===false && $a2 !== false) { return 1; }
  else if ( $a1!==false && $a2 === false) {return -1;}

  if( $a1 > $a2 ) { return 1; }
  else if ( $a1 < $a2 ) { return -1; }
  else if ( $a1 == $a2 ) { return 0; }
});
var_dump($tosort);
/*
the resulting of $tosort
array
  'd' => string 'one' (length=3)
  'f' => string 'one' (length=3)
  'a' => string 'two' (length=3)
  'b' => string 'three' (length=3)
  'c' => string 'five' (length=6)
  'e' => string 'four' (length=7)
*/
Gabriel
?>
yuval at visualdomains dot com 17-May-2015 01:17
Using isset to achieve this, is many times faster:

<?php

 $m = range(1,1000000);
  $s = [2,4,6,8,10];

// Use array_intersect to return all $m values that are also in $s
  $tstart = microtime(true);
  print_r (array_intersect($m,$s));
  $tend = microtime(true);
  $time = $tend - $tstart;
  echo "Took $time";

 // Use array_flip and isset to return all $m values that are also in $s
  $tstart = microtime(true);
  $f = array_flip($s);
/* $f now looks like this:
(
    [2] => 0
    [4] => 1
    [6] => 2
    [8] => 3
    [10] => 4
)
*/
// $u will hold the intersected values
  $u = [];
  foreach ($m as $v) {
    if (isset($f[$v])) $u[] = $v;
  }
  print_r ($u);
   $tend = microtime(true);
  $time = $tend - $tstart;
  echo "Took $time";
?>

Results:

Array
(
    [1] => 2
    [3] => 4
    [5] => 6
    [7] => 8
    [9] => 10
)
Took 4.7170009613037
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)
Took 0.056024074554443

array_intersect: 4.717
array_flip+isset: 0.056
meihao at 126 dot com 21-Nov-2013 08:56
<?php
$a=array(1,2,'3',4);
$b=array('1',2,3);

var_dump($a,$b);

result:
array (size=3)
  0 => int 1
  1 => int 2
  2 => string '3' (length=1)

?>
Mike Block 04-Mar-2013 09:27
I bench-marked some uses of array_intersect and can't believe how slow it is. This isn't as elaborate, but handles most cases and is much faster:

<?php
/**
examines two arrays and returns the intersected arrays with matching keys (ignores duplicate keys)
*/
function simple_array_intersect($a,$b) {
    $a_assoc = $a != array_values($a);
    $b_assoc = $b != array_values($b);
    $ak = $a_assoc ? array_keys($a) : $a;
    $bk = $b_assoc ? array_keys($b) : $b;
    $out = array();
    for ($i=0;$i<sizeof($ak);$i++) {
        if (in_array($ak[$i],$bk)) {
            if ($a_assoc) {
                $out[$ak[$i]] = $a[$ak[$i]];
            } else {
                $out[] = $ak[$i];
            }
        }
    }
    return $out;
}

?>

You can try this out with this:

<?php
// create a large array (simple)
$first = array();
for ($i=500;$i<500000;$i++) {
    $first[] = $i;
}
// create a smaller array (associative)
$second = array();
for ($i=499990;$i<500000;$i++) {
    $second[$i] = rand();
}
echo microtime(true)."\n";
// built-in function
print_r(array_intersect($first,$second));
echo microtime(true)."\n";
// favour simple array as match
print_r(simple_array_intersect($first,$second));
echo microtime(true)."\n";
// favour associative keys for match
print_r(simple_array_intersect($second,$first));
echo microtime(true)."\n";

?>
caffinated 10-Nov-2012 12:13
If you're looking for a relatively easy way to strictly intersect keys and values recursively without array key reordering, here's a simple recursive function:

<?php
function array_intersect_recursive($array1, $array2)
{
  foreach($array1 as $key => $value)
  {
    if (!isset($array2[$key]))
    {
      unset($array1[$key]);
    }
    else
    {
      if (is_array($array1[$key]))
      {
        $array1[$key] = array_intersect_recursive($array1[$key], $array2[$key]);
      }
      elseif ($array2[$key] !== $value)
      {
        unset($array1[$key]);
      }
    }
  }
  return $array1;
}
?>
dml at nm dot ru 20-May-2011 05:06
The built-in function returns wrong result when input arrays have duplicate values.
Here is a code that works correctly:

<?php
function array_intersect_fixed($array1, $array2) {
    $result = array();
    foreach ($array1 as $val) {
      if (($key = array_search($val, $array2, TRUE))!==false) {
         $result[] = $val;
         unset($array2[$key]);
      }
    }
    return $result;
}
?>
Yohann 12-Apr-2010 04:36
I used array_intersect in order to sort an array arbitrarly:

<?php
$a = array('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'height', 'nine', 'ten');
$b = array('four', 'one', 'height', 'five')
var_dump(array_intersect($a, $b);
?>

will output:

0 => 'one'
1 => 'four'
2 => 'five'
3 => 'height'

i hope this can help...
189780 at gmail dot com 02-Jan-2010 07:26
Actually array_intersect finds the dublicate values, here is my approach which is 5 times faster than built-in function array_intersect().. Give a try..

<?php
function my_array_intersect($a,$b)
{
        for($i=0;$i<sizeof($a);$i++)
        {
                $m[]=$a[$i];
        }
        for($i=0;$i<sizeof($a);$i++)
        {
                $m[]=$b[$i];
        }
        sort($m);
        $get=array();
        for($i=0;$i<sizeof($m);$i++)
        {
                if($m[$i]==$m[$i+1])
                $get[]=$m[$i];
        }
        return $get;
}
?>

Baris ÇUHADAR
189780@gmail.com
Shawn Pyle 13-Aug-2009 09:29
array_intersect handles duplicate items in arrays differently. If there are duplicates in the first array, all matching duplicates will be returned. If there are duplicates in any of the subsequent arrays they will not be returned.

<?php
array_intersect(array(1,2,2),array(1,2,3)); //=> array(1,2,2)
array_intersect(array(1,2,3),array(1,2,2)); //=> array(1,2)
?>
gary 21-Jun-2009 12:57
i wrote this one to get over the problem i found in getting strings intersected instead of arrays as there is no function in php.

<?php
function matched_main_numbers($string, $string2)
{
$string = "04 16 17 20 29";
$arr1 = explode(" ", $string);

$string2 = "45 34 04 29 16";
$arr2 = explode(" ", $string2);

$array = array_intersect($arr1, $arr2);
$comma_separated = implode($array);

$str = $comma_separated;

$balls = "$comma_separated";
$matched_balls = chunk_split($balls,2," ");
$matched_balls =" $matched_balls";

$number_of_matched_main_balls = strlen($str);
$number_of_matched_main_balls = ($number_of_matched_main_balls/2);
$numbers = "You matched $number_of_matched_main_balls main balls";

return $numbers;

}
?>
Oto Brglez 10-Mar-2009 07:02
If you wish to create intersection with arrays that are empty. Than the result of intersection is empty array.

If you wish to change this. I sugest that you do this.
It simply "ignores" empty arrays. Before loop use 1st array.

<?php

$a = array();
$a[] = 1;
$a[] = 2;
$a[] = 3;

$b = array();
$b[] = 4;
$b[] = 5;
$b[] = 1;

$c = array();
$c[] = 1;
$c[] = 5;
$d = array();

$kb=array('a','b','c','d');

$out = $a;
foreach($kb as $k){
    if(!empty(${$k})) $out = array_intersect($out,${$k});
};
print_r($out);
// The result is array

// The result is empty array
print_r(array_intersect($a,$b,$c,$d));

?>
karl at libsyn dot com 30-Jan-2009 09:58
Given a multidimensional array that represents AND/OR relationships (example below), you can use a recursive function with array_intersect() to see if another array matches that set of relationships.

For example: array( array( 'red' ), array( 'white', 'blue' ) ) represents "red OR ( white AND blue )".  array( 'red', array( 'white', 'blue' ) ) would work, too, BTW.

If I have array( 'red' ) and I want to see if it matches the AND/OR array, I use the following function.  It returns the matched array,
but can just return a boolean if that's all you need:

<?php
$needle = array( array( 'red' ), array( 'white', 'blue' ) );
$haystack = array( 'red' );

function findMatchingArray( $needle, $haystack ) {
    foreach( $needle as $element ) {
        $test_element = (array) $element;
        if( count( $test_element ) == count( array_intersect( $test_element, $haystack ) ) ) {
            return $element;
        }

    }
    return false;
}
?>

Pretty tough to describe what I needed it to do, but it worked.  I don't know if anyone else out there needs something like this, but hope this helps.
Esfandiar -- e.bandari at gmail dot com 10-Aug-2008 12:44
Regarding array union:  Here is a faster version array_union($a, $b)

But it is not needed!  See below.

<?php
                                        //  $a = 1 2 3 4
    $union =                            //  $b =   2   4 5 6
        array_merge(
            $a,
            array_diff($b, $a)          //               5 6
        );                              //  $u = 1 2 3 4 5 6
?>

You get the same result with $a + $b.

N.B. for associative array the results of $a+$b and $b+$a are different, I think array_diff_key is used.

Cheers, E
stuart at horuskol dot co dot uk 07-Jul-2008 03:57
A clearer example of the key preservation of this function:

<?php

$array1 = array(2, 4, 6, 8, 10, 12);
$array2 = array(1, 2, 3, 4, 5, 6);

var_dump(array_intersect($array1, $array2));
var_dump(array_intersect($array2, $array1));

?>

yields the following:

array(3) {
  [0]=> int(2)
  [1]=> int(4)
  [2]=> int(6)
}

array(3) {
  [1]=> int(2)
  [3]=> int(4)
  [5]=> int(6)
}

This makes it important to remember which way round you passed the arrays to the function if these keys are relied on later in the script.
Malte 10-Feb-2008 10:34
Extending the posting by Terry from 07-Feb-2006 04:42:

If you want to use this function with arrays which have sometimes the same value several times, it won't be checked if they're existing in the second array as much as in the first.
So I delete the value in the second array, if it's found there:

<?php
$firstarray = array(1, 1, 2, 3, 4, 1);
$secondarray = array(4, 1, 6, 5, 4, 1);

//array_intersect($firstarray, $secondarray): 1, 1, 1, 4

foreach ($firstarray as $key=>$value){
    if (!in_array($value,$secondarray)){
        unset($firstarray[$key]);
    }else{
        unset($secondarray[array_search($value,$secondarray)]);
    }
}

//$firstarray: 1, 1, 4

?>
Niels 19-Sep-2006 04:53
Here is a array_union($a, $b):

<?php
                                        //  $a = 1 2 3 4
    $union =                            //  $b =   2   4 5 6
        array_merge(
            array_intersect($a, $b),    //         2   4
            array_diff($a, $b),         //       1   3
            array_diff($b, $a)          //               5 6
        );                              //  $u = 1 2 3 4 5 6
?>
nthitz at gmail dot com 08-Jun-2006 09:09
I did some trials and if you know the approximate size of the arrays then it would seem to be a lot faster to do this <?php array_intersect($smallerArray, $largerArray); ?> Where $smallerArray is the array with lesser items. I only tested this with long strings but I would imagine that it is somewhat universal.
terry(-at-)shuttleworths(-dot-)net 07-Feb-2006 07:42
I couldn't get array_intersect to work with two arrays of identical objects, so I just did this:

foreach ($firstarray as $key=>$value){
    if (!in_array($value,$secondarray)){
        unset($firstarray[$key]);
    }
}

This leaves $firstarray as the intersection.

Seems to work fine & reasonably quickly.
tom p 04-Nov-2005 06:54
If you store a string of keys in a database field and want to match them to a static array of values, this is a quick way to do it without loops:

<?

$vals = array("Blue","Green","Pink","Yellow");
$db_field = "0,2,3";

echo implode(", ", array_flip(array_intersect(array_flip($vals), explode(",", $db_field))));

// will output "Blue, Pink, Yellow"

?>
sapenov at gmail dot com 10-Jun-2005 01:11
If you need to supply arbitrary number of arguments
to array_intersect() or other array function,
use following function:

$full=call_user_func_array('array_intersect', $any_number_of_arrays_here);
blu at dotgeek dot org 14-Oct-2004 05:34
Note that array_intersect and array_unique doesnt work well with multidimensional arrays.
If you have, for example,

<?php

$orders_today[0] = array('John Doe', 'PHP Book');
$orders_today[1] = array('Jack Smith', 'Coke');

$orders_yesterday[0] = array('Miranda Jones', 'Digital Watch');
$orders_yesterday[1] = array('John Doe', 'PHP Book');
$orders_yesterday[2] = array('Z? da Silva', 'BMW Car');

?>

and wants to know if the same person bought the same thing today and yesterday and use array_intersect($orders_today, $orders_yesterday) you'll get as result:

<?php

Array
(
    [0] => Array
        (
            [0] => John Doe
            [1] => PHP Book
        )

    [1] => Array
        (
            [0] => Jack Smith
            [1] => Coke
        )

)

?>

but we can get around that by serializing the inner arrays:
<?php

$orders_today[0] = serialize(array('John Doe', 'PHP Book'));
$orders_today[1] = serialize(array('Jack Smith', 'Coke'));

$orders_yesterday[0] = serialize(array('Miranda Jones', 'Digital Watch'));
$orders_yesterday[1] = serialize(array('John Doe', 'PHP Book'));
$orders_yesterday[2] = serialize(array('Z? da Silva', 'Uncle Tungsten'));

?>

so that array_map("unserialize", array_intersect($orders_today, $orders_yesterday)) will return:

<?php

Array
(
    [0] => Array
        (
            [0] => John Doe
            [1] => PHP Book
        )

)

?>

showing us who bought the same thing today and yesterday =)

[]s
t dot wiltzius at insightbb dot com 23-Jun-2004 09:33
I needed to compare an array with associative keys to an array that contained some of the keys to the associative array. Basically, I just wanted to return only a few of the entries in the original array, and the keys to the entries I wanted were stored in another array. This is pretty straightforward (although complicated to explain), but I couldn't find a good function for comparing values to keys. So I wrote this relatively straightforward one:

<?php

function key_values_intersect($values,$keys) {
   foreach($keys AS $key) {
      $key_val_int[$key] = $values[$key];
      }
   return $key_val_int;
   }

$big = array("first"=>2,"second"=>7,"third"=>3,"fourth"=>5);
$subset = array("first","third");

print_r(key_values_intersect($big,$subset));

?>

This will return:

Array ( [first] => 2 [third] => 3 )
anbolb at boltblue dot com 09-Jan-2004 01:11
This is also handy for testing an array for one of a series of acceptable elements. As a simple example, if you're expecting the query string to contain one of, say, user_id, order_id or item_id, to find out which one it is you could do this:

<?php
    $valid_ids = array ('user_id', 'item_id', 'order_id');
    if ($id = current (array_intersect ($valid_ids, array_keys ($_GET))))
    {
        // do some stuff with it
    }
    else
        // error - invalid id passed, or none at all
?>

...which could be useful for constructing an SQL query, or some other situation where testing for them one by one might be too clumsy.
ben at kazez dot com 09-Dec-2003 10:49
To check whether an array $a is a subset of array $b, do the following:

<?php
if(array_unique($b + $a) === $b)
//...
?>

Actually, PHP ought to have a function that does this for you. But the above example works.
Alessandro Ranellucci alex at primafila dot net 16-Jul-2003 06:35
array_intersect($array1, $array2);
returns the same as:
array_diff($array1, array_diff($array1, $array2));
david at audiogalaxy dot com 09-Apr-2001 04:54
Note that array_intersect() considers the type of the array elements when it compares them.

If array_intersect() doesn't appear to be working, check your inputs using var_dump() to make sure you're not trying to intersect an array of integers with an array of strings.


Vérifie si une clé existe dans un tableau

  • « array_intersect
  • array_key_first »
  • PHP Manual
  • Fonctions sur les tableaux
  • Vérifie si une clé existe dans un tableau

array_key_exists

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

array_key_exists — Vérifie si une clé existe dans un tableau

Description

array_key_exists ( string|int $key , array $array ) : bool

array_key_exists() retourne true s'il existe une clé du nom de key dans le tableau array. key peut être n'importe quelle valeur valide d'index de tableau.

Liste de paramètres

key

Valeur à vérifier.

array

Un tableau contenant les clés à vérifier.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Note:

array_key_exists() va rechercher, uniquement, dans les clés de la première dimension. Les clés imbriquées dans les tableaux multi-dimensionnels ne seront pas trouvées

Exemples

Exemple #1 Exemple avec array_key_exists()

<?php
$search_array = array('premier' => 1, 'second' => 4);
if (array_key_exists('premier', $search_array)) {
    echo "L'élément 'premier' existe dans le tableau";
}
?>

Exemple #2 array_key_exists() et isset()

isset() ne retourne pas true pour les clés de tableaux qui correspondent à une valeur null alors que c'est le cas pour array_key_exists().

<?php
$search_array = array('first' => null, 'second' => 4);

// retourne false
isset($search_array['first']);

// retourne true
array_key_exists('first', $search_array);
?>

Notes

Note:

En raison de compatibilité ascendante, la fonction array_key_exists() peut aussi retourner true si key est une propriété définie dans un object, fourni comme paramètre array. Ce comportement est obsolète à partir de PHP 7.4.0, et a été retiré à partir de PHP 8.0.0.

Pour vérifier si une propriété existe dans un objet, property_exists() devrait être utilisé.

Voir aussi

  • isset() - Détermine si une variable est déclarée et est différente de null
  • array_keys() - Retourne toutes les clés ou un ensemble des clés d'un tableau
  • in_array() - Indique si une valeur appartient à un tableau
  • property_exists() - Vérifie si un objet ou une classe possède une propriété

User Contributed Notes

alarido at almadialetica dot com dot br 13-Oct-2020 07:42
/// it works like array_key_exists that can go deeper

function in_array_deeply($keys, $multi)
{
    $depths = array();
    $fun = null;
    // inner, recursive function
    function in_fun($level, $arr_keys, $subject, &$depths) {
        // only if array
        if (is_array($subject)) {
            // if key exists
            if (array_key_exists($arr_keys[$level], $subject)) {
                // record depth and go deeper
                $depths[] = $arr_keys[$level];
                in_fun($level+1, $arr_keys, $subject[$arr_keys[$level]], $depths);
            }
        }
    };
    //
    in_fun(0, $keys, $multi, $depths);
    $srchd = implode('.',$keys);
    $found = implode('.',$depths);
    //
    return ($srchd==$found);
}

/// example usage

$mapa = array('quadrada','comprida','amarela');

$cidade = array(
    'redonda' => array(
        'curta' => 'o seu filme'
    ),
    'quadrada' => array(
        'longa' => array(
            'azul' => array('logo',2,'mais',2,'são',4),
            'amarela' => array('então',3,'vezes',2,'são',6),
            'verde' => array('senão',100,'dividido por',2,'é',50)
        ),
        'extravagante' => array(
            'vermelha' => 'chama atenção',
            'vinho' => 'cor de uva',
            'ocre' => 1255
        ),
        'comprida' => array(
            'amarela' => 'brasilia dos mamonas',
            'branca' => 'bandeira da paz',
            'preta e branca' => 'peças do xadrez'
        )
    ),
    'oval' => array(
        'conde' => 'lobo'
    ),
    'plana' => array(
        'curta' => array(
            'azul' => array('e',2,'mais',2,'são',4),
            'amarela' => array('sim',3,'vezes',2,'são',6),
            'verde' => array('verdade',100,'dividido por',2,'é',50)
        )
    )
);

$encontrou = in_array_deeply($mapa, $cidade);

echo $encontrou;

/// if the tree you search for exists, it will print out 'true'
php at vxvr dot de 31-Aug-2020 03:22
While Nik Tang's remark about the performance increase when using isset() first for PHP <= 7.3 is true, it is no longer valid for 7.4 and 8.0.
array_key_exists() is now as fast as isset() and the use of both is now slower for cases where the key is zero or actually does not exist.
Md. Abutaleb 20-Feb-2020 05:51
Extending from here : https://www.php.net/manual/en/function.array-key-exists.php#90687

<?php

# Working for null check
# Warning for boolean check
# Warning for float check

$a = array(null => 1, false => 2, true => 3, 4.6 => 4, "08" => 5, "8" => 6);

var_dump(array_key_exists(null, $a)); // true
var_dump(array_key_exists(false, $a)); // warning and false
var_dump(array_key_exists(true, $a)); // warning and false
var_dump(array_key_exists(4.6, $a)); // warning and false
(array_key_exists("08", $a)); // true
var_dump(array_key_exists(8, $a)); // true

?>
Matej 05-Sep-2018 07:07
Beware that if the array passed to array_key_exists is NULL, the return value will also be NULL.

This is undocumented behaviour, moreover the documentation (and return typehint) suggest that the array_key_exists function only returns boolean value. But that's not the case.
venimus at gmail dot com 27-Apr-2018 11:35
Be warned that before checking the key existence with isset() it will be typecasted to integer if it is not a string or integer!

See Example #2 in http://php.net/manual/en/language.types.array.php

I.e.

$a = ['test']; // 'test' will have key 0
$key = false;

var_dump(isset($a[$key]) ); // true
pierreantoine dot guillaume at gmail dot com 27-Apr-2018 09:08
if you ever face a case in which your array_key_exists returns null, that might be because the second parameter you gave it is not an array.

For instance :

    var_dump(array_key_exists($my_key,$my_array));
    //bool(true);

    var_dump(array_key_exists($my_array, $my_key));
    //NULL
Ellert van Koperen 01-Mar-2018 02:21
Rudi's multidimensional array_key_exists function was not working for me, so i built one that is.
Enjoy.

function array_multi_key_exists( $arrNeedles, $arrHaystack){
    $Needle = array_shift($arrNeedles);
    if(count($arrNeedles) == 0){
        return(array_key_exists($Needle, $arrHaystack));
    }else{
        if(!array_key_exists($Needle, $arrHaystack)){
            return false;
        }else{
            return array_multi_key_exists($arrNeedles, $arrHaystack[$Needle]);
        }
    }
}
falundir at gmail dot com 01-Sep-2017 10:58
This function will return NULL when second argument is not an array. So it will bite you when using it like that:

<?php
$not_an_array = null;
if (array_key_exists($key, $not_an_array) === false) {
    // the array doesn't have the key
    return;
}

// happily proceed - surely the array does have the key (BUT IT DOESN'T!)
?>

That's because the condition null === false fails.

Instead you should use:

<?php
if (array_key_exists($key, $not_an_array) == false) {
    return;
}

// or

if (!array_key_exists($key, $not_an_array)) {
    return;
}

// or

if (is_array($not_an_array) === false || array_key_exists($key, $not_an_array) === false) {
    return;
}
?>
zildo 04-Oct-2016 02:49
This function will look for a key in multidimensional arrays, and return the paths to all the results found, or return false if none have been found.

<?php

function array_multi_key_exists($key, $array, $first=true, &$return=array()){

if($first){

while($ret = array_multi_key_exists($key, &$array, false)){
$r[]=$ret;
}

if(empty($r[0])){
return $r[0]=array();
}else{
return $r;
}

}

foreach($array as $k => $v){

if($k === $key && !(is_array($v))){

unset($array[$k]);
array_unshift($return, $k);
return $return;

}elseif($k === $key && is_array($v)){

if(empty($v)){
unset($array[$k]);
}else{

if(array_multi_key_exists($key, &$array[$k], false, $return)){

array_unshift($return, $k);
return $return;

}

}

array_unshift($return, $k);
unset($array[$k]);
return $return;

}else{

if(is_array($v)){

if(array_multi_key_exists($key, &$array[$k], false, $return)){

array_unshift($return, $k);
return $return;

}

}

}

}

return false;

}

?>

The next function takes the array of paths returned by array_multi_key_exists as parameter and returns the corresponding values.

<?php

function array_multi_values($paths, $array){

$return = array();

foreach($paths as $n => $path){
$val = $array;
foreach($path as $dim => $key){

$val = $val[$key];

}

$return[$n] = $val;
unset($val);

}

return $return;

}

?>

This next function takes the paths array returned by array_multi_key_exists, and unsets the corresponding values of the original array, returning the clipped array.

<?php

function array_multi_clip($paths, $array, $key=0, $path=false){

while($path==false){

foreach($paths as $path){
array_multi_clip($paths, &$array, 0, $path);
}
return $array;
}

$n = count($path);

if($key == $n-1){
unset($array[$path[$key]]);
return $array;
}else{

array_multi_clip($paths, &$array[$path[$key]], ++$key, $path);
}

}

?>

Examples:

<?php

$array = array(

'colours' => array(

'red' => array(

'veg' => 'tomato',
'fruit' => 'strawberry',
'green' => 'colourblind',

),

'green' => array(

'green' => 'envy',
'unripe' => 'veggies',

),

'blue' => 'smurfs',

),

);

$key = 'green';

$paths = array_multi_key_exists($key, $array);
print_r($paths);

?>

The result will be an array of paths:

Array
(
    [0] => Array
        (
            [0] => colours
            [1] => red
            [2] => green
        )

    [1] => Array
        (
            [0] => colours
            [1] => green
            [2] => green
        )

    [2] => Array
        (
            [0] => colours
            [1] => green
        )

)

As it can be seen, if one of the results is an array which again contains the key searched, both will show up in the results.

Example of array_multi_values:

<?php

$values = array_multi_values($paths, $array);
print_r($values);

?>

Result:

<?php

Array
(
    [0] => colourblind
    [1] => envy
    [2] => Array
        (
            [green] => envy
            [unripe] => veggies
        )

)

?>

Example of array_multi_clip():

<?php

$clipped = array_multi_clip($paths, $array);
print_r($clipped);

?>

Result:

<?php
Array
(
    [colours] => Array
        (
            [red] => Array
                (
                    [veg] => tomato
                    [fruit] => strawberry
                )

            [blue] => smurfs
        )

)

?>
Venkata Subbaraju 03-Nov-2015 05:42
array_key_exists perfect for $_GET .

As there will be browser level restriction on length of URL , number of keys in $_GET global variable will be very limited . So array_key_exists will not cause any performance overhead in this context . isset function can be conveniently ignored while handling $_GET variable.

But for $_POST , the max array size has to be configure in server PHP configuration . So cannot rely on array_key_exists for $_POST if max array size is not optimized .

Here is an example with array_key_exists switching between content-types :

if(array_key_exists('format',$_GET))
{
              if($_GET['format']=="json")
              {
                      header('Content-Type: application/json');
              }
              else{
                     //handle any other format whitelisted for the application
              }
}
else {
               error_log("format parameter missing . using default html format");
               header('Content-Type: text/html');
}
p dot allgeier at web dot de 19-Aug-2015 10:36
If u want to check if a key exists either in the array or in any subarray try the following:

<?php

function requireKey($needle, array $array)
    {
        foreach ($array as $key => $value) {
            if ($key === $needle) return $value;
            if (is_array($value)) {
                if ($x = $this->requireKey($key, $value)) return $x;
            }
        }
        return false;
    }

?>

(( return $value for recursive array search, return true for recursive array key exists ))
ellert at vankoperen dot nl 13-Oct-2014 07:49
While working with large JSON datastructures I encountered an increasing need to check the presence of certain data all over the place.
This led to the function below that lets you simply access the data, and returns it if available, null if not.
Note that it uses a variable number of parameters, you can go as deep into a nested structure as you want.

<?php
function safe_array_access($ar){
    $numargs = func_num_args();
    $arg_list = func_get_args();
    $aritterator = $ar;
    for($i = 1; $i < $numargs; $i++){
        if (isset($aritterator[$arg_list[$i]]) || array_key_exists($arg_list[$i], $aritterator)){
            $aritterator = $aritterator[$arg_list[$i]];
        }else{
            return(false);
        }
    }
    return($aritterator);
}
?>
Usage:
Instead of  $a['b']['c'] use safe_array_access($a, 'b', 'c');
mc dot watras at gmail dot com 25-Jul-2014 08:12
array_key_exists doesn't work with objects implementing ArrayAccess interface. It also ignores possible __get() method in such objects, despite the fact it accepts object as a second parameter. It works only with 'real' properties.

<?php
class A implements ArrayAccess {
    public $data;
    public function offsetExists($offset) {
        return isset($this->data[$offset]);
    }
    public function __get($property) {
        return $this->data[$property];
    }
}

$a = new A();
$a->data['somekey'] = 1;
var_dump(array_key_exists('somekey', $a)); // returns false
var_dump(array_key_exists('data', $a));  // returns true
?>
Sandro Alves Peres 19-Jun-2013 11:30
<?php
/*
    It also works on objects
    ***************************************
*/

class PHP
{

    private $compiler;
    protected $architecture;
    public $version;
    public $system = "Linux";

}

$php = new PHP();

$a = array_key_exists('compiler', $php);     # false
$b = array_key_exists('architecture', $php); # false
$c = array_key_exists('version', $php);      # true
$d = array_key_exists('system', $php);       # true

var_dump( $a, $b, $c, $d );

?>
imaginary at friend dot com 09-Apr-2012 04:37
An even simpler case-insensitive alternative to array_key_exists():

<?php

array_key_exists(strtolower($key), array_change_key_case($search));
Nik Tang 05-Mar-2012 01:22
If you want to take the performance advantage of isset() while keeping the NULL element correctly detected, use this:

if (isset(..) || array_key_exists(...))
{
...
}

Benchmark (100000 runs):
array_key_exists() : 205 ms
is_set() : 35ms
isset() || array_key_exists() : 48ms

Note:
The code for this check is very fast, so you shouldn't warp the code into a single function like below, because the overhead of calling a function dominates the overall performance.

function array_check(...)
{
    return (isset(..) || array_key_exists(...))
}
Rudi 10-Nov-2011 02:10
I've got a new take on the multi key function I would like to share.

<?php
function array_multi_key_exists(array $arrNeedles, array $arrHaystack, $blnMatchAll=true){
    $blnFound = array_key_exists(array_shift($arrNeedles), $arrHaystack);

    if($blnFound && (count($arrNeedles) == 0 || !$blnMatchAll))
        return true;

    if(!$blnFound && count($arrNeedles) == 0 || $blnMatchAll)
        return false;

    return array_multi_key_exists($arrNeedles, $arrHaystack, $blnMatchAll);
}
?>

Hope you'll find it usefull.
glitch dot mr at gmail dot com 01-Oct-2011 04:15
As you might know, isset() is actually working like @$variable===NULL. As the result, it doesn't actually catch variables set to NULL. If you want to check if variable is set (even to NULL), you can use array_key_exists on $GLOBALS, like there.

<?php
   $me = null;
   $se = 1;
   unset($se);
// $he is not set

if(array_key_exists('me', $GLOBALS)) echo "\$me exists\n";
if(array_key_exists('se', $GLOBALS)) echo "\$se exists\n";
if(array_key_exists('he', $GLOBALS)) echo "\$he exists\n";

?>

In this case, only $me will be detected as $se was removed when code was running and $he was never set.
Anonymous 16-Jun-2011 01:07
I just want to note that array_key_exists() can be extremely slow for large (>200 keys) arrays.  Use isset($array($key)) instead!  My program ran in 3 minutes instead of 2 hours after switching to isset()!
manhon824 at gmail dot com 18-May-2011 09:29
I took hours for me to debug, and I finally recognized that,

You have to reset the $array before using array_key_exists
reset($array);
array_key_exists($needle,$array);

Or you will get no reply.
tech at signhere envy dot de 18-Jan-2011 02:23
Hey, this function is able to rename a key inside an array.

If the key to be replaced doesn't exist inside the array, or the new key already exists in the array, the function will return FALSE.
Otherwise, the array with the renamed key will be returned.

Hope this will be useful for someone.
<?php
function array_rename_key($array, $key, $newkey){
    if( ! array_key_exists($key, $array) || array_key_exists($newkey, $array)) return FALSE;
    $uid = uniqid(''); //To clearly identify the Element.
    $preserve_value = $array[$key]; //Keep the Value
    $array[$key] = $uid; //Overwrite Value with ID
    $array = array_flip($array); //Flip the Array keys and values
    $array[$uid] = $newkey; //Set Value of the ID with new Key.
    $array = array_flip($array); //Everything back in Place.
    $array[$newkey] = $preserve_value;
    return $array;
}
?>
jens dot hoevenaars at gmail dot com 06-Nov-2010 03:21
I created this function that uses array key exist to compare a form and a table to see if something has changed.

This can be very helpfull if you need to update a table record from a form but you do not want to display all table fields.

<?php
function($data_from_db, $form_data) {
 $data = $data_from_db;
 $keys = array_keys($data);

    for($i = 0; $i < count($data); $i++) {
        if(!array_key_exists($keys[$i], $form_data)) {
            $dbobject->$keys[$i] = $data[$keys[$i]];
        } else {
            $dbobject->$keys[$i] = $form_data[$keys[$i]];
        }
    }
    return $dbobject;
}
?>

you can then use the dbobject to update the table.
moandsimon at btinternet dot com 26-Apr-2010 01:56
This uses array_key_exists.

You have a multidimensional array of the form:

$rowsoriginal[] = array('field_wrkvolmin_value' => 216, 'field_wrkvolmax_value' => 1000);
$rowsoriginal[] = array('field_wrkvolmin_value' => 27, 'field_wrkvolmax_value' => 216);

Using print_r this will look like:

Array ( [0] => Array ( [field_wrkvolmin_value] => 216 [field_wrkvolmax_value] => 1000 ) [1] => Array ( [field_wrkvolmin_value] => 27 [field_wrkvolmax_value] => 216 ) )

This can be used to create a table by iterating over the rows that looks like this:

field_wrkvolmin_value          field_wrkvolmax_value
           216                                      1000
            27                                       216

when $rowsoriginal contain a fixed but unknown amount of values.

If you want to process this in an automatic way without knowing the keys etc, into a multidimensional array of the form:

$rowstemp = array('field_wrkvolmin_value' => array(216, 27), 'field_wrkvolmax_value' => array(1000, 216));

Using print_r this will look like:

Array ( [field_wrkvolmin_value] => Array ( [0] => 216 [1] => 27 ) [field_wrkvolmax_value] => Array ( [0] => 1000 [1] => 216 ) )

This can be used to iterate over the rows of a table to create a table in the form of:

field_wrkvolmin_value            216            27
field_wrkvolmax_value           1000           216

To do this you can use the following looping and conditional structure, using array_key_exists():

<?php
$rowstemp = array();
foreach ($rowsoriginal as $row) {
    foreach ($row as $key => $value) {
        if (array_key_exists($key, $rowstemp)) {
            $rowstemp[$key][] = $value;
        }
        else {
            $valuestemp = array($value);
            $rowstemp[$key] = $valuestemp;
        }
    }
}
?>
gmdebby at gmail dot com 14-Jan-2010 05:44
A little function which take an array as keys

<?php
//note the s in the function name (keys)
function array_keys_exists($array,$keys) {
    foreach($keys as $k) {
        if(!isset($array[$k])) {
        return false;
        }
    }
    return true;
}
?>
//useful to validate a form for example
<form>
    <input type="text" name="field1" /><br />
    <input type="text" name="field2" /><br />
    <input type="text" name="field3" /><br />
    <input type="text" name="field4" /><br />
    <input type="text" name="field5" /><br />
</form>
<?php
if(!array_keys_exists($_POST,
array("field1","field2","field3","field4","field5")
)) {
    //some fields are missing, dont do anything (maybe hacking)
} else {
    //code ...
}
?>
PHPEric 05-Aug-2009 06:51
Very simple case-insensitive array_key_exists:

bool (in_array(strtolower($needle), array_map('strtolower', array_keys($haystack))))
tom at edgedesigns dot org 21-Jul-2009 05:10
The multi_array_key_exists() function posted by alishahnovin at hotmail dot com [which has since been removed] does not always return the expected result.

This modified version does.

<?php
/**
 * multi_array_key_exists function.
 *
 * @param mixed $needle The key you want to check for
 * @param mixed $haystack The array you want to search
 * @return bool
 */
function multi_array_key_exists( $needle, $haystack ) {

    foreach ( $haystack as $key => $value ) :

        if ( $needle == $key )
            return true;

        if ( is_array( $value ) ) :
             if ( multi_array_key_exists( $needle, $value ) == true )
                return true;
             else
                 continue;
        endif;

    endforeach;

    return false;
}

?>
webmaster at oehoeboeroe dot nl 04-May-2009 01:09
The way array_key_exists handles null, float, boolean, and 'integer-representing string' keys is inconsistent in itself and, in the case of bool and float, with the way these are converted when used as array offset.

<?php
$array = array(null => 1, false => 2, true => 3, 4.6 => 4, "08" => 5, "8" => 6);
var_export($array);

echo "\nnull is " . (array_key_exists(null, $array) ? '' : 'not ') . "a key.\n";
echo 'false is ' . (array_key_exists(false, $array) ? '' : 'not ') . "a key.\n";
echo 'true is ' . (array_key_exists(true, $array) ? '' : 'not ') . "a key.\n";
echo '4.6 is ' . (array_key_exists(4.6, $array) ? '' : 'not ') . "a key.\n";
echo '"08" is ' . (array_key_exists("08", $array) ? '' : 'not ') . "a key.\n";
echo '"8" is ' . (array_key_exists("8", $array) ? '' : 'not ') . "a key.\n";
?>

Output:

array (
  '' => 1,
  0 => 2,
  1 => 3,
  4 => 4,
  '08' => 5,
  8 => 6,
)
null is a key.
false is not a key.
true is not a key.
4.6 is not a key.
"08" is a key.
"8" is a key.

Well, and you get this warning three times (on the bools and the float, but not on the null):

Warning:  array_key_exists() [function.array-key-exists]: The first argument should be either a string or an integer in /var/www/php/test.php on line 6
John 18-Jan-2009 09:27
Here is a little function for case sensitivity to elaborate on what was said by MarkL from ##php (Freenode) and mmanning at mdanderson dot org from this page:

<?php
// Case sensitive version of array_key_exists() using preg_match()
function array_ikey_exists($key,$arr)
{
    if(preg_match("/".$key."/i", join(",", array_keys($arr))))
        return true;
    else
        return false;
}
?>

Not that anyone else couldn't have written this, but a concept like this strengthens reusability.  :)

Also, I've been running into issues with escaping for Regex, so I decided to give something like this a shot:

<?php
function array_ikey_exists($key,$arr)
{
    $e = 0; //$key = addslashes($key);
    if(is_array($arr) && $arr !==array())
    {
        foreach($arr as $k => $v)
        {
            if(strtolower($k) == strtolower($key))
                $e++;
        }
        if($e>0)
            return true;
        else
            return false;
    }
    else
        return false;
}
?>

You could addslashes() to escape; it's just another approach.
Karim Ratib 19-Aug-2008 05:09
Here's a function to return a reference to the first array element that has a given key. The code works for multidimensional arrays:

<?php
function &array_find_element_by_key($key, &$form) {
  if (array_key_exists($key, $form)) {
    $ret =& $form[$key];
    return $ret;
  }
  foreach ($form as $k => $v) {
    if (is_array($v)) {
      $ret =& array_find_element_by_key($key, $form[$k]);
      if ($ret) {
        return $ret;
      }
    }
  }
  return FALSE;
}
?>
jacobsingh at gmail dot com 17-Jun-2008 03:54
I saw some examples above for array_keys_exist() or functions to see if multiple keys exist in a given array and return false if any of them don't.

Here is a simpler way to do this:

<?php

function array_keys_exist($keys,$array) {
    if (count (array_intersect($keys,array_keys($array))) == count($keys)) {
        return true;
    }
}

$array = array ('filename' => 'myfile', 'filesize' => 1234, 'filepath' => '/tmp/myfile');
$keys = array('filename','filesize','filepath');

echo array_keys_exist($keys,$array);
//returns true

$keys[] = "somethingelse";

echo array_keys_exist($keys,$array);
//Returns false

?>
mankyd at gmail dot com 28-May-2008 10:29
You'll notice several notes on this page stating that isset() is significantly faster than array_key_exists(). This may be true except for one small hitch. isset() will return false for arrays keys that have there value set to NULL, which is therefore not entirely accurate.

Example:

<?php
$foo = array();
$foo['bar'] = NULL;

var_dump(isset($foo['bar']));
var_dump(array_key_exists('bar', $foo));
?>

will output:
bool(false)
bool(true)

Be aware of this!
tmont 29-Apr-2008 02:54
The argument of array_key_exists() vs. isset() came up in the workplace today, so I conducted a little benchmark to see which is faster:

<?php
    // one-dimensional arrays
    $array = array_fill(0,50000,'tommy is the best!');
    $arraykeyexists_result = array();

    $start = microtime(true);
    for ($i = 0; $i < 100000; $i++) {
        if (array_key_exists($i,$array)) {
            $arraykeyexists_result[] = 1;
        }
        else {
            $arraykeyexists_result[] = 0;
        }
    }
    $arrtime = round(microtime(true)-$start,3);

    $start = microtime(true);
    for ($i = 0; $i < 100000; $i++) {
        if (isset($array[$i])) {
            $arraykeyexists_result[] = 1;
        }
        else {
            $arraykeyexists_result[] = 0;
        }
    }
    $istime = round(microtime(true)-$start,3);

    $totaltime = $arrtime+$istime;
    $arrpercentage = round(100*$arrtime/$totaltime,3);
    $ispercentage = round(100*$istime/$totaltime,3);

    echo "array_key_exists(): $arrtime [$arrpercentage%] seconds\n";
    echo "isset():            $istime [$ispercentage%] seconds\n";

?>

On Windows, the output is similar to

array_key_exists(): 0.504 [82.895%] seconds
isset():            0.104 [17.105%] seconds

On Mac or Linux, isset() is faster but only by a factor of approximately 1.5.
wolf550e at gmail dot com 27-Sep-2007 12:51
array_key_exists(), at least in 5.2.4, passes the array by value. I conclude this from seeing performance worsen as the array to search got bigger. isset() doesn't have this problem.
diogoshaw at gmail dot com 15-Sep-2007 11:58
this function very good to use if you need to verify many variables:

<?php
function array_key_exists_r($keys, $search_r) {
    $keys_r = split('\|',$keys);
    foreach($keys_r as $key)
    if(!array_key_exists($key,$search_r))
    return false;
    return true;
}
?>

e.g.

<?php
if(array_key_exists_r('login|user|passwd',$_GET)) {
// login
} else {
// other
}
?>

works for me, enjoy.
dg shaw.
Lucknut dot xbl at googlemail dot com 18-Jul-2007 10:44
I found this function very good to use if your want your urls like index.php?login or index.php?register
e.g.
<?php
if( array_key_exists( 'home',$_GET ) ) {
    echo "Home - its where the heart is.";
} else if( array_key_exists( 'login',$_GET ) ) {
    echo "Login code here!";
} else if( array_key_exists( 'register',$_GET ) ) {
    echo "Register code here!";
} else {
    echo "Home - its where the heart is.";
}
?>
david at madole dot net 05-Jul-2007 08:11
Regarding performance differences between isset() and array_key_exists(), the differences may be there, but the function are not always interchangable.

Note that when $a[1] = null then isset($a[1]) == false but array_key_exists(1, $a) == true
inker2576 at yahoo dot com 06-Mar-2007 08:01
Further research on this has turned up that the performance problems are a known, confirmed bug in PHP 5.1.x, and have been fixed in PHP builds after September 2006.  You can find the bug report here:  http://bugs.php.net/bug.php?id=38812

However, just because it's a fixed bug doesn't really change the conclusion.  If you're writing a script and there's any chance it could be used on a PHP 5.1.x server, you should still avoid this function and use isset() or some other kind of test if you want it to run efficiently.
Matt 01-Dec-2006 01:50
mikael dot knutsson at gmail dot com:
I don't think it does, at least in PHP5?

For example, this outputs bool(false):

$ar = array ( 'outter' => array ( 'inner' => 1 ) );
var_dump(array_key_exists('inner', $ar));

So it doesn't actually check the inner array for the key 'inner'.


Récupère la première clé d'un tableau

  • « array_key_exists
  • array_key_last »
  • PHP Manual
  • Fonctions sur les tableaux
  • Récupère la première clé d'un tableau

array_key_first

(PHP 7 >= 7.3.0, PHP 8)

array_key_first — Récupère la première clé d'un tableau

Description

array_key_first ( array $array ) : int|string|null

Récupère la première clé du tableau array donné sans affecter le pointeur interne du tableau.

Liste de paramètres

array

Un tableau.

Valeurs de retour

Retourne la première clé de array si le tableau n'est pas vide ; null sinon.

Exemples

Exemple #1 Usage simple de array_key_first()

<?php
$array = ['a' => 1, 'b' => 2, 'c' => 3];

$firstKey = array_key_first($array);

var_dump($firstKey);
?>

L'exemple ci-dessus va afficher :

string(1) "a"

Notes

Astuce

Il y a plusieurs façon de fournir cette fonctionnalité pour les versions antérieur à PHP 7.3.0. Il est possible d'utiliser array_keys(), mais ceci est plutôt inefficace. Il est aussi possible d'utiliser reset() et key(), mais ceci peut changer le pointeur interne du tableau. Une solution efficace, qui ne modifie pas le pointeur interne du tableau, écrit comme un polyfill :

<?php
if (!function_exists('array_key_first')) {
    function array_key_first(array $arr) {
        foreach($arr as $key => $unused) {
            return $key;
        }
        return NULL;
    }
}
?>

Voir aussi

  • array_key_last() - Récupère la dernière clé d'un tableau
  • reset() - Remet le pointeur interne de tableau au début

User Contributed Notes

github.com / ahsankhatri 23-Jan-2021 12:06
One-liner polyfill (php version < 7.3.0)

<?php
function array_key_first(array $array)
{
    return key(array_slice($array, 0, 1));
}
Vee W. 22-Jan-2021 02:10
Another way to get first array key with PHP older than 7.3.

<?php

$array = ['one', 'two', 'three'];
$array2 = ['one' => 'Number one', 'two' => 'Number two'];

reset($array);// go to first array
echo key($array);// get its key (first array)
// expect 0.

reset($array2);
echo key($array2);
// expect one.


Récupère la dernière clé d'un tableau

  • « array_key_first
  • array_keys »
  • PHP Manual
  • Fonctions sur les tableaux
  • Récupère la dernière clé d'un tableau

array_key_last

(PHP 7 >= 7.3.0, PHP 8)

array_key_last — Récupère la dernière clé d'un tableau

Description

array_key_last ( array $array ) : int|string|null

Récupère la dernière clé du tableau array donné sans affecter le pointeur interne du tableau.

Liste de paramètres

array

Un tableau.

Valeurs de retour

Retourne la dernière clé de array si le tableau n'est pas vide ; null sinon.

Voir aussi

  • array_key_first() - Récupère la première clé d'un tableau
  • end() - Positionne le pointeur de tableau en fin de tableau

User Contributed Notes

donaldinou at gmail dot com 02-Sep-2020 12:58
Here come my benchmark, and

return key(array_slice($array, -1));

is the my best answer for a polyfill.

<?php

function array_key_last_1(array $array) {
    // assert(!empty($array));
    return key(array_slice($array, -1));
}

function array_key_last_2(array $array) {
    return key(array_slice($array, -1, 1, true));
}

function array_key_last_3(array $array) {
    return key(array_reverse($array));
}

function array_key_last_4(array $array) {
    return array_keys($array)[count($array) - 1] ?? null;
}

function array_key_last_5(array $array) {
    return array_keys($array)[count($array) - 1] ?? null;
}

function array_key_last_6(array $array) {
    $copy = array_keys($array);
    return end($copy);
}

$result = array();
$array = range(0, 1000000);

for($i=1; $i < 7;$i++) {
  $callback = 'array_key_last_' . $i;
  $before = microtime(true);
  call_user_func_array($callback, array($array));
  $after = microtime(true);
  $time = ($after-$before);
  $result[$callback] = $time;
}

asort($result);
foreach ($result as $key => $value) {
    echo '[' . $key . ']' . $value . " sec" . PHP_EOL;
}
rnealxp at yahoo dot com 12-Apr-2020 03:18
Now that we have this function, where we once used...
<?php
$idxLast = count($arr) - 1;
?>
we can now optimize code speed by using...
<?php
$idxLast = (array_key_last($arr) ?? 0);
?>
Use-cases include lots of looping and control-structures.
If you do not know ahead of time that the array is numerically indexed, and that it could possibly be associative...safer/faster to stick with count().
williamdes at wdes dot fr 29-Mar-2020 09:43
https://www.php.net/manual/fr/function.array-key-last.php#123950

did return the first key of my array only:
"array_keys($array)[count($array) - 1] ?? null" works

I hope the example is fine for everyone else.

My array is:
[
            new NameExpression('d', 0),
            new NameExpression('f', 0),
            new NameExpression('g', 0),
]
webmaster at redinfo dot co dot kr 16-Oct-2019 06:09
// if : php ver < 7
// array_key_last

$arr = array('1'=>'bear1','2'=>array('22'=>'bear22'),'3'=>'bear3');
echo end(array_keys($arr));

// result : 3
contact at duzun dot me 03-Jul-2019 07:17
Try to beat this polyfill in terms of performance!

<?php
if( !function_exists('array_key_last') ) {
    function array_key_last(array $array) {
        if( !empty($array) ) return key(array_slice($array, -1, 1, true));
    }
}

// Bonus
if (!function_exists('array_key_first')) {
    function array_key_first(array $arr) {
        foreach($arr as $key => $unused) return $key;
    }
}
?>
ccb_bc at hotmail dot com 28-Jun-2019 04:15
<?php
    // PHP >= 7
    function _array_key_last(array $array){
        return (!empty($array)) ? array_keys($array)[count($array)-1] : null;
    }
    var_dump(_array_key_last(['PHP', 'Javascript', 'Python'])); // 2
 ?>
github / k-gun 18-Jun-2019 04:41
For those who loves tested candies;

<?php
function array_key_last(array $array) {
    // 100000 iters: ~0.068 secs
    return key(array_slice($array, -1));
    // 100000 iters: ~0.070 secs
    return key(array_reverse($array));
    // 100000 iters: ~0.088 secs
    return array_keys($array)[count($array) - 1] ?? null;
}
?>
rotexdegba007-github at yahoo dot ca 16-Jun-2019 04:54
This polyfill works for PHP 5.6+.
It is a slight modification of "wes at nospam dot example dot org"'s example:

<?php

    if( !function_exists('array_key_first') ) {

        function array_key_first(array $array) {

            if( $array === [] ) { return NULL; }

            foreach($array as $key => $_) { return $key; }
        }
    }

    if( !function_exists('array_key_last') ) {

        function array_key_last(array $array) {

            if( $array === [] ) { return null; }

            // the last 2 args to array_slice are crucial
            return array_key_first(array_slice($array, -1, null, true));
        }
    }
wes at nospam dot example dot org 09-May-2019 09:37
Correct polyfill (one that doesn't make copies of arrays, and that doesn't make use of the IAP) is:

<?php

if(!function_exists('array_key_first')){
    function array_key_first(array $array){
        if($array === []){
            return NULL;
        }
        foreach($array as $key => $_) return $key;
    }
}

if(!function_exists('array_key_last')){
    function array_key_last(array $array){
        if($array === []){
            return NULL;
        }
        return array_key_first(array_slice($array, -1));
    }
}

?>
@manzoorwanijk 27-Oct-2018 09:41
For PHP < 7.3.0 :

Will work for any type of array

<?php
if ( ! function_exists( 'array_key_last' ) ) {
    /**
     * Polyfill for array_key_last() function added in PHP 7.3.
     *
     * Get the last key of the given array without affecting
     * the internal array pointer.
     *
     * @param array $array An array
     *
     * @return mixed The last key of array if the array is not empty; NULL otherwise.
     */
    function array_key_last( $array ) {
        $key = NULL;

        if ( is_array( $array ) ) {

            end( $array );
            $key = key( $array );
        }

        return $key;
    }
}
?>
Anyvie at devlibre dot fr 08-Aug-2018 10:21
For PHP <= 7.3.0 :

if (! function_exists("array_key_last")) {
    function array_key_last($array) {
        if (!is_array($array) || empty($array)) {
            return NULL;
        }

        return array_keys($array)[count($array)-1];
    }
}


Retourne toutes les clés ou un ensemble des clés d'un tableau

  • « array_key_last
  • array_map »
  • PHP Manual
  • Fonctions sur les tableaux
  • Retourne toutes les clés ou un ensemble des clés d'un tableau

array_keys

(PHP 4, PHP 5, PHP 7, PHP 8)

array_keys — Retourne toutes les clés ou un ensemble des clés d'un tableau

Description

array_keys ( array $array , mixed $search_value , bool $strict = false ) : array

array_keys() retourne les clés numériques et littérales du tableau array.

Si une valeur de recherche search_value est spécifiée, seules les clés ayant cette valeur seront retournées. Sinon, toutes les clés de array sont retournées.

Liste de paramètres

array

Un tableau contenant les clés à retourner.

search_value

Si spécifié, alors seulement les clés contenant ces valeurs seront retournées.

strict

Le paramètre strict force la comparaison en mode strict, incluant le type, avec l'opérateur ===.

Valeurs de retour

Retourne un tableau de toutes les clés dans array.

Exemples

Exemple #1 Exemple avec array_keys()

<?php
$array = array(0 => 100, "color" => "red");
print_r(array_keys($array));

$array = array("blue", "red", "green", "blue", "blue");
print_r(array_keys($array, "blue"));

$array = array("color" => array("blue", "red", "green"),
               "size"  => array("small", "medium", "large"));
print_r(array_keys($array));
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => 0
    [1] => color
)
Array
(
    [0] => 0
    [1] => 3
    [2] => 4
)
Array
(
    [0] => color
    [1] => size
)

Voir aussi

  • array_values() - Retourne toutes les valeurs d'un tableau
  • array_combine() - Crée un tableau à partir de deux autres tableaux
  • array_key_exists() - Vérifie si une clé existe dans un tableau
  • array_search() - Recherche dans un tableau la clé associée à la première valeur

User Contributed Notes

Md. Abutaleb 20-Feb-2020 06:19
<?php
# array_keys() also return the key if it's boolean but the boolean will return as 1 or 0. It will return empty if get NULL value as key. Consider the following array:

$a = array(
      "first_index" => "This is the first element",
      true => 3,
      false => 2,
      4.5 => 'Something',
      "08" => 5,
      "8" => 6,
      NULL => 'Null key'
    );

print_r(array_keys($a));

Array
(
    [0] => first_index
    [1] => 1
    [2] => 0
    [3] => 4
    [4] => 08
    [5] => 8
    [6] =>
)

?>
enrique dot balleste at gmail dot com 01-Mar-2017 09:33
A nice little trick to get all of the keys who have some type of value:

$keys = array_keys($array, !null);
ayyappan dot ashok at gmail dot com 19-Apr-2016 06:18
Post By  Sven (59892) has to be changed

$array = array('first'=>'111', 'second'=>'222', 'third'=>'333');

$rarray = array_keys($array);

print array_shift($rarray); // first

print array_pop($rarray); //thrid

print array_shift($rarray); //second

print array_pop($rarray); // no result

Code below is not valid from 5.4.0

print array_shift(array_keys($array)); Throws Strict Standards Error

Sven code works fine till 5.3.29. From 5.4.0  the standards have been changed and results too differ.

Note :
Strict Standards :  Only variables should be passed by reference

Please have look of the code in different versions

http://sandbox.onlinephpfunctions.com/code/24b5fddf14b635f1e37db69a7edffc2cbbed55e1

http://sandbox.onlinephpfunctions.com/code/f695e8f81e906b4f062b66cf9b3b83b6b620464c
Robert C. 12-Feb-2016 02:22
Keys from multi dimensional array to simple array

Want to traverse an multi dimensional array and get the keys back in a single dimensional array? This will do the trick:

<?php

    public function array_walk_keys($array, $parentKey = null, &$flattened_array = null)
    {
        if(!is_array($array))
            return $array;

        foreach( $array as $key => $val ) {
            $flattenedKeysArray[] = $key;

            if(is_array($val))
                array_walk_keys($val, $key, $flattenedKeysArray);
        }

        return $flattenedKeysArray;
    }
Paul Hirsch 30-Mar-2015 04:31
It is worth noting that array_keys does not maintain the data-type of the keys when mapping them to a new array.  This created an issue with in_array and doing  a lookup on characters from a string.  NOTE:  my lookup $array has a full map of numbers and characters - upper and lower - to do an simple faux encryption with.

<?php
$array = array(
     'e' => 'ieio'
    ,'1' => 'one'
    ,'2' => 'two'
    ,'0' => 'zero'
);
var_dump($array);
$keys = array_keys($array);
var_dump($keys);

$string = '1e0';
for ($i = 0; $i < strlen($string); $i++) {
    if (in_array($string[$i],$keys,'strict')) echo 'dude ';
    else echo 'sweet ';
}
?>

Outputs:
array (size=4)
  'e' => string 'ieio' (length=4)
  1 => string 'one' (length=3)
  2 => string 'two' (length=3)
  0 => string 'zero' (length=4)

array (size=4)
  0 => string 'e' (length=1)
  1 => int 1
  2 => int 2
  3 => int 0

sweet dude sweet

----
expected to see:
dude dude dude
Ian (maxianos at hotmail dot com) 09-Mar-2014 03:41
There's a lot of multidimensional array_keys function out there, but each of them only merges all the keys in one flat array.

Here's a way to find all the keys from a multidimensional  array while keeping the array structure. An optional MAXIMUM DEPTH parameter can be set for testing purpose in case of very large arrays.

NOTE: If the sub element isn't an array, it will be ignore.

<?php
function array_keys_recursive($myArray, $MAXDEPTH = INF, $depth = 0, $arrayKeys = array()){
       if($depth < $MAXDEPTH){
            $depth++;
            $keys = array_keys($myArray);
            foreach($keys as $key){
                if(is_array($myArray[$key])){
                    $arrayKeys[$key] = array_keys_recursive($myArray[$key], $MAXDEPTH, $depth);
                }
            }
        }

        return $arrayKeys;
    }
?>

EXAMPLE:
input:
array(
    'Player' => array(
        'id' => '4',
        'state' => 'active',
    ),
    'LevelSimulation' => array(
        'id' => '1',
        'simulation_id' => '1',
        'level_id' => '1',
        'Level' => array(
            'id' => '1',
            'city_id' => '8',
            'City' => array(
                'id' => '8',
                'class' => 'home',
            )
        )
    ),
    'User' => array(
        'id' => '48',
        'gender' => 'M',
        'group' => 'user',
        'username' => 'Hello'
    )
)

output:
array(
    'Player' => array(),
    'LevelSimulation' => array(
        'Level' => array(
            'City' => array()
        )
    ),
    'User' => array()
)
zammit dot andrew at gmail dot com 16-Nov-2013 04:06
If an array is empty (but defined), or the $search_value is not found in the array, an empty array is returned (not false, null, or -1). This may seem intuitive, especially given the documentation says an array is returned, but I needed to sanity test to be sure:

<?php

$emptyArray = array();
var_dump(array_keys($emptyArray,99)); // array (size=0) \ empty

$filledArray = array(11,22,33,42);
var_dump(array_keys($filledArray,99)); // array (size=0) \ empty

?>
phpnet at holodyn dot com 24-Oct-2013 05:17
Since 5.4 STRICT standards dictate that you cannot wrap array_keys in a function like array_shift that attempts to reference the array.

Invalid:
echo array_shift( array_keys( array('a' => 'apple') ) );

Valid:
$keys = array_keys( array('a' => 'apple') );
echo array_shift( $keys );

But Wait! Since PHP (currently) allows you to break a reference by wrapping a variable in parentheses, you can currently use:

echo array_shift( ( array_keys( array('a' => 'apple') ) ) );

However I would expect in time the PHP team will modify the rules of parentheses.
anthony at berglas dot org 03-Apr-2012 05:32
It should be noted that the inverse function to keys (which converts keys to values) is array_count_values (which converts values to keys).  This is needed to use things like array_intersect_key.  Could go in several places.  Took me a while to figure it out.
Na&#39;ven Enigma 10-Mar-2012 07:41
I was trying to figure out how to normalize an array with numerical keys.  Since I was doing for() for a lot of things, but only replacing it if the conditions were right, I wound up with off ball arrays I couldn't access.  That being said, I looked for a method of normalizing the array and couldn't find one, so I built my own.  I'm not sure how to go about making it recursive, but I didn't need that feature for my own, so I just went without recursion.

//This will take array([5] => "test1", [4] => "test2", [9] => "test3") into array([0] => "test1", [1] => "test2", [2] => "test3") so you can access it easier.
        function normalize_array($array){
          $newarray = array();
          $array_keys = array_keys($array);
          $i=0;
          foreach($array_keys as $key){
           $newarray[$i] = $array[$key];

          $i++;
          }
          return $newarray;
        }
qeremy [atta] gmail [dotta] com 05-Mar-2012 05:50
Simple ways to prefixing arrays;

<?php
function array_keys_prefix($arr, $pref = "") {
    $rarr = array();
    foreach ($arr as $key => $val) {
        $rarr[$pref.$key] = $val;
    }
    return $rarr;
}

function array_keys_prefix_multi($arr, $pref = "") {
    $rarr = array();
    foreach ($arr as $key => $val) {
        $rarr[] = array_keys_prefix($val, $pref);
    }
    return $rarr;
}

// $a = array("foo" => "FOO", "bar" => "BAR", "baz" => "BAZ"); // or
$a = array("foo" => "FOO", "bar" => "BAR", "baz" => array(1,2,3));
print_r(array_keys_prefix($a, "my_"));

// db fetch...
$products = array(
    array("id" => 1, "name" => "Foo"),
    array("id" => 2, "name" => "Bar")
);
print_r(array_keys_prefix_multi($products, "product_"));
?>

Array
(
    [my_foo] => FOO
    [my_bar] => BAR
    [my_baz] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

)
Array
(
    [0] => Array
        (
            [product_id] => 1
            [product_name] => Foo
        )

    [1] => Array
        (
            [product_id] => 2
            [product_name] => Bar
        )

)
izzecold at live dot de 10-Jan-2012 09:21
<?php

/* A Function created by myself for checking multiple array keys
For Example u got an Array like $_SESSION and u wanna know if the keys 'user','pass','email' and 'type' exists.

*/

function mKeyChecker($arr,$keys=array()) {
    if(count($keys) > 1) {
        $valid_keys = 0;
        foreach($keys as $key) {
            if(array_key_exists($key,$arr)) $valid_keys++;
        }
        if($valid_keys == count($keys)) {
            return true;
        } else {
            return false;
        }
    } else if(count($keys) == 1) {
        if(array_key_exists($key[0],$arr)) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

// Execution Example

if(mKeyChecker($_SESSION,array('id','user','email','type'))) {
    echo "is!";
} else {
    echo "not!";
}

?>
craig1231 at hotmail dot com 22-Dec-2011 03:41
A needed a function to find the keys which contain part of a string, not equalling a string...

<?php
function array_keys_contain($input, $search_value, $strict = false)
    {
        $tmpkeys = array();

        $keys = array_keys($input);

        foreach ($keys as $k)
        {
            if ($strict && strpos($k, $search_value) !== FALSE)
                $tmpkeys[] = $k;
            elseif (!$strict && stripos($k, $search_value) !== FALSE)
                $tmpkeys[] = $k;
        }

        return $tmpkeys;
    }
?>
el dot quick at gmail dot com 23-Sep-2011 08:23
Sorry for my english...

I wrote a function to get keys of arrays recursivelly...

<?php
    function recursive_keys($input, $search_value = null){

        $output = ($search_value !== null ? array_keys($input, $search_value) : array_keys($input)) ;
        foreach($input as $sub){
            if(is_array($sub)){
                $output = ($search_value !== null ? array_merge($output, recursive_keys($sub, $search_value)) : array_merge($output, recursive_keys($sub))) ;
            }
        }
        return $output ;
    }
?>

I hope it will be usefull

Regards
pat dot leblanc at gmail dot com 29-Aug-2011 02:05
It's worth noting that if you have keys that are long integer, such as '329462291595', they will be considered as such on a 64bits system, but will be of type string on a 32 bits system.

for example:
<?php

$importantKeys = array('329462291595' =>null, 'ZZ291595' => null);

foreach(array_keys($importantKeys) as $key){
    echo gettype($key)."\n";
}

?>

will return on a 64 bits system:
<?php
    integer
    string
?>

but on a 32 bits system:
<?php
    string
    string
?>

I hope it will save someone the huge headache I had :)
ferrerna at gmail dot com 23-Jan-2009 09:14
Here's a function I needed to collapse an array, in my case from a database query.  It takes an array that contains key-value pairs and returns an array where they are actually the key and value.

<?php

function array_collapse($arr, $x, $y) {
    $carr = array();
    while ($el = current($arr)) {
        $carr[ $el[$x] ] = $el[$y];
        next($arr);
    }
    return $carr;
}

?>

Example usage (pseudo-database code):

<?php

$query = db_query('SELECT name, value FROM properties');

$result = db_returnAll($query);

/* This will return an array like so:

[
   ['name' -> 'color', 'value' -> 'blue'],
   ['name' -> 'style', 'value' -> 'wide-format'],
   ['name' -> 'weight', 'value' -> 3.6],
   ['name' -> 'name', 'value' -> 'Waerdthing']
]

*/

$propArr = array_collapse($result, 'name', 'value');

/* Now this array looks like:

[
   ['color' -> 'blue'],
   ['style' -> 'wide-format'],
   ['weight' -> 3.6],
   ['name' -> 'Waerdthing'],

*/

?>

I found this handy for using with json_encode and am using it for my project http://squidby.com
nodarinodo at mail dot ru 03-Dec-2008 11:35
<?php
    //It's a way to get keys from values )
    $es = array("is My FullName"=>"nodar chkuaselidze (nodarinodo)", "You Are" => "I don't know", "Is My Friend" => "ruxadze");
    foreach(array_values($es) as $ess){
        echo $ess." =>";

    for($i =0; $i < count(array_keys($es, $ess)); $i++){
            echo reset(array_keys($es, $ess))."<BR>";
        } }
?>
neil at 11 out of 10 24-Jul-2008 12:10
<?php

/*
 * This function will return the keys of elements in the
 * haystack where the value is found in array needle
 */

function array_value_intersect_keys( $array_haystack, $array_needle ){
    $intersected = array_intersect( $array_haystack, $array_needle );
    return array_keys( $intersected );
}

// usage

$array_haystack = array( 1 => 2, 2 => 5, 'red' => 8, 9 => 14 );

$array_needle = array( 2, 8 );

$array_keys_of_intersecting_values = array_value_intersect_keys( $array_haystack, $array_needle );

print_r( $array_keys_of_intersecting_values );
?>

returns
Array
(
    [0] => 1
    [1] => red
)
Hayley Watson 04-Oct-2007 06:43
An alternative to RQuadling at GMail dot com's array_remove() function:

<?php
function array_remove(array $array, $value, $strict=false)
{
    return array_diff_key($array, array_flip(array_keys($array, $value, $strict)));
}
?>
creator at mindcreations dot com 20-Mar-2007 02:12
This function will extract keys from a multidimensional array

<?php
function multiarray_keys($ar) {

    foreach($ar as $k => $v) {
        $keys[] = $k;
        if (is_array($ar[$k]))
            $keys = array_merge($keys, multiarray_keys($ar[$k]));
    }
    return $keys;
}
?>

Example code:

<?php
$array = array("color" => array("1stcolor" => "blue", "2ndcolor" => "red", "3rdcolor" => "green"),
               "size"  => array("small", "medium", "large"));

echo "<pre>";
print_r($array);
echo "</pre>";

echo "<pre>";
print_r(multiarray_keys($array));
echo "</pre>";
?>

Example output:

Array
(
    [color] => Array
        (
            [1stcolor] => blue
            [2ndcolor] => red
            [3rdcolor] => green
        )

    [size] => Array
        (
            [0] => small
            [1] => medium
            [2] => large
        )

)

Array
(
    [0] => color
    [1] => 1stcolor
    [2] => 2ndcolor
    [3] => 3rdcolor
    [4] => size
    [5] => 0
    [6] => 1
    [7] => 2
)
jochem 17-Feb-2006 04:13
might be worth noting in the docs that not all associative (string) keys are a like, output of the follow bit of code demonstrates - might be a handy introduction to automatic typecasting in php for some people (and save a few headaches):

<?php
$r = array("0"=>"0","1"=>"1","" =>"2"," "=>"3");
echo 'how php sees this array: array("0"=>"0","1"=>"1","" =>"2"," "=>"3")',"\n-----------\n";
var_dump($r); print_r($r); var_export($r);
echo "\n-----------\n",'var_dump("0","1",""," ") = ',"\n-----------\n";
var_dump("0","1",""," ");
?>

OUTPUTS:

how php sees this array: array("0"=>"0","1"=>"1","" =>"2"," "=>"3")
-----------
array(4) {
  [0]=>
  string(1) "0"
  [1]=>
  string(1) "1"
  [""]=>
  string(1) "2"
  [" "]=>
  string(1) "3"
}
Array
(
    [0] => 0
    [1] => 1
    [] => 2
    [ ] => 3
)
array (
  0 => '0',
  1 => '1',
  '' => '2',
  ' ' => '3',
)
-----------
var_dump("0","1",""," ") =
-----------
string(1) "0"
string(1) "1"
string(0) ""
string(1) " "
Sven (bitcetera.com) 19-Dec-2005 06:43
Here's how to get the first key, the last key, the first value or the last value of a (hash) array without explicitly copying nor altering the original array:

<?php
  $array = array('first'=>'111', 'second'=>'222', 'third'=>'333');

  // get the first key: returns 'first'
  print array_shift(array_keys($array));

  // get the last key: returns 'third'
  print array_pop(array_keys($array));

  // get the first value: returns '111'
  print array_shift(array_values($array));

  // get the last value: returns '333'
  print array_pop(array_values($array));
?>
vesely at tana dot it 09-Dec-2005 01:56
The position of an element.

One can apply array_keys twice to get the position of an element from its key. (This is the reverse of the function by cristianDOTzuddas.) E.g., the following may output "yes, we have bananas at position 0".

<?php
$a = array("banana" => "yellow", "apple" = "red");
$k = get_some_fruit();
if (isset($a[$k]))
{
   list($pos) = array_keys(array_keys($a), $k);
   print "yes, we have {$k}s at position $pos\n";
}
?>

Not amazingly efficient, but I see no better alternative.
ru dot dy at gmx dot net 14-Aug-2005 09:20
I was looking for a function that simply unset a variable amout of values from a one-dimensional array by key. I ended up with this (returns the array itself if no further parameter than the array is given, false with no params - does not change the source array)

usage: array_remove(array $input [, mixed key ...])

<?php

  function array_remove() {
    if ($stack = func_get_args()) {
      $input = array_shift($stack);
      foreach ($stack as $key) {
        unset($input[$key]);
      }
      return $input;
    }
    return false;
  }

?>

Test:

<?php
  $a = array('a'=>'fun', 'b'=>3.14, 'sub'=> array('1', '2', '3'), 'd'=>'what', 'e' => 'xample', 5 => 'x');
  print_r($a);
  print_r(array_remove($a, 'd', 'b', 5, 'sub'));
?>

Output:

Array
(
    [a] => fun
    [b] => 3.14
    [sub] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [d] => what
    [e] => xample
    [5] => x
)
Array
(
    [a] => fun
    [e] => xample
)

Hope this helps someone.
webmaster [at] baz-x [dot] at 29-Jul-2005 03:43
I was looking for a function that deletes either integer keys or string keys (needed for my caching).
As I didn't find a function I came up with my own solution.
I didn't find the propiest function to post to so I will post it here, hope you find it useful.

<?php

function array_extract($array, $extract_type = 1)
{
    foreach ( $array as $key => $value )
    {
        if ( $extract_type == 1 && is_string($key) )
        {
            // delete string keys
            unset($array[$key]);
        }
        elseif ( $extract_type == 2 && is_int($key) )
        {
            // delete integer keys
            unset($array[$key]);
        }
    }

    return $array;
}

?>

You can of course define constants to have a nicer look, I have chosen these: EXTR_INT = 1; EXTR_STRING = 2
EXTR_INT will return an array where keys are only integer while
EXTR_STRING will return an array where keys are only string

Have fun with it.
sip at email dot ee 22-Aug-2003 05:33
Note, that using array_key_exists() is rather inefficient. The overhead associated with calling a function makes it slower, than using isset($array[$key]), instead of array_key_exists($key, $array)
using isset() is usually about 1.3 times faster, according to my tests.
rodrigo at NOSPAM dot dhweb dot com dot br 04-Feb-2003 04:39
[Editor's note: For a complete solution to the printing of complex structures or hashes, see the PEAR::Var_Dump package: http://pear.php.net/package-info.php?pacid=103 , use "pear install Var_Dump" to get it]

This function will print all the keys of a multidimensional array in html tables.
It will help to debug when you don?t have control of depths.

<?php
function show_keys($ar){

   echo "<table width='100%' border='1' bordercolor='#6699CC' cellspacing='0' cellpadding='5'><tr valign='top'>";

      foreach ($ar as $k => $v ) {

         echo "<td align='center' bgcolor='#EEEEEE'>
           <table border='2' cellpadding='3'><tr><td bgcolor='#FFFFFF'><font face='verdana' size='1'>
              " . $k . "
           </font></td></tr></table>";

           if (is_array($ar[$k])) {
              show_keys ($ar[$k]);
         }

         echo "</td>";

      }

   echo "</tr></table>";

}

// Multidimensional array ->
$arvore = array();
$arvore['1'] = array();
$arvore['1']['1.1'] = array('1.1.1', '1.1.2', '1.1.3');
$arvore['1']['1.2'] = array('1.2.1', '1.2.2', '1.2.3');
$arvore['1']['1.3'] = array('1.3.1', '1.3.2', '1.3.3');
$arvore['2'] = array();
$arvore['2']['2.1'] = array('2.1.1', '2.1.2', '2.1.3');
$arvore['2']['2.2'] = array('2.2.1', '2.2.2', '2.2.3');
$arvore['2']['2.3'] = array('2.3.1', '2.3.2', '2.3.3');
$arvore['3'] = array();
$arvore['3']['3.1'] = array('3.1.1', '3.1.2', '3.1.3');
$arvore['3']['3.2'] = array('3.2.1', '3.2.2', '3.2.3');
$arvore['3']['3.3'] = array('3.3.1', '3.3.2'=>array('3.3.2.1', '3.3.2.2'), '3.3.3');
// <-

show_keys($arvore);
?>
glennh at webadept dot net 13-Nov-2002 04:03
All the cool notes are gone from the site.

Here's an example of how to get all the variables passed to your program using the method on this page. This prints them out so you can see what you are doing.

<?php
while (list($key, $value) = each
(${"HTTP_".$REQUEST_METHOD."_VARS"}))
{
        echo $key." = ".$value." ";
}
?>


Applique une fonction sur les éléments d'un tableau

  • « array_keys
  • array_merge_recursive »
  • PHP Manual
  • Fonctions sur les tableaux
  • Applique une fonction sur les éléments d'un tableau

array_map

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

array_map — Applique une fonction sur les éléments d'un tableau

Description

array_map ( callable|null $callback , array $array , array ...$arrays ) : array

array_map() retourne un tableau contenant les résultats de l'application de la fonction de rappel callback à l'index correspondant de array (et arrays si plus de tableaux sont fourni) utilisé en tant qu'arguments pour la fonction de rappel. Le nombre de paramètres que la fonction de rappel callback accepte devrait correspondre au nombre de tableaux passé à array_map().

Liste de paramètres

callback

La fonction de rappel de type callable à exécuter pour chaque élément de chaque tableau.

null peut être passé comme valeur à callback pour executer une opération zip sur plusieurs tableaux. Si seulement array est fourni, array_map() retournera le tableau d'entré.

array

Un tableau à exécuter via la fonction de rappel callback.

arrays

Liste variable d'arguments tableaux supplémentaires à exécuter via la fonction de rappel callback.

Valeurs de retour

Retourne un tableau contenant les résultats de l'application de la fonction de rappel callback à l'index correspondant de array (et arrays si plus de tableaux sont fourni) utilisé en tant qu'arguments pour la fonction de rappel.

Le tableau retourné conservera les clés du tableau passé en argument, si et seulement si, un seul tableau est passé. Si plusieurs tableaux sont passés comme argument, le tableau retourné aura des clés séquentielle sous la forme d'entier.

Exemples

Exemple #1 Exemple avec array_map()

<?php
function cube($n)
{
    return ($n * $n * $n);
}

$a = [1, 2, 3, 4, 5];
$b = array_map('cube', $a);
print_r($b);
?>

Le contenu de la variable $b sera :

Array
(
    [0] => 1
    [1] => 8
    [2] => 27
    [3] => 64
    [4] => 125
)

Exemple #2 array_map() : utilisation d'une fonction quelconque (depuis PHP 5.3.0)

<?php

$func = function($value) {
    return $value * 2;
};

print_r(array_map($func, range(1, 5)));

?>
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)

Exemple #3 array_map() : utilisation de plusieurs tableaux

<?php
function show_Spanish($n, $m)
{
    return "Le nombre {$n} se dit {$m} en Espagnol";
}

function map_Spanish($n, $m)
{
    return [$n => $m];
}

$a = [1, 2, 3, 4, 5];
$b = ['uno', 'dos', 'tres', 'cuatro', 'cinco'];

$c = array_map('show_Spanish', $a, $b);
print_r($c);

$d = array_map('map_Spanish', $a , $b);
print_r($d);
?>

L'exemple ci-dessus va afficher :

// Contenu de $c
Array
(
    [0] => Le nombre 1 se dit uno en Espagnol
    [1] => Le nombre 2 se dit dos en Espagnol
    [2] => Le nombre 3 se dit tres en Espagnol
    [3] => Le nombre 4 se dit cuatro en Espagnol
    [4] => Le nombre 5 se dit cinco en Espagnol
)

// Contenu de $d
Array
(
    [0] => Array
        (
            [1] => uno
        )

    [1] => Array
        (
            [2] => dos
        )

    [2] => Array
        (
            [3] => tres
        )

    [3] => Array
        (
            [4] => cuatro
        )

    [4] => Array
        (
            [5] => cinco
        )

)

Généralement, lors de l'utilisation de plusieurs tableaux, ils doivent être d'égale longueur, car la fonction de rappel est appliquée de manière similaire à tous les tableaux. Si les tableaux sont de tailles inégales, les plus petits seront complétés avec des éléments vides pour atteindre la taille du plus grand.

Une utilisation intéressante de cette fonction est la construction de tableaux de tableaux, facilement réalisée en passant la valeur null comme nom de fonction de rappel.

Exemple #4 Exécution d'une opération zip de tableaux

<?php
$a = [1, 2, 3, 4, 5];
$b = ['one', 'two', 'three', 'four', 'five'];
$c = ['uno', 'dos', 'tres', 'cuatro', 'cinco'];

$d = array_map(null, $a, $b, $c);
print_r($d);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => one
            [2] => uno
        )

    [1] => Array
        (
            [0] => 2
            [1] => two
            [2] => dos
        )

    [2] => Array
        (
            [0] => 3
            [1] => three
            [2] => tres
        )

    [3] => Array
        (
            [0] => 4
            [1] => four
            [2] => cuatro
        )

    [4] => Array
        (
            [0] => 5
            [1] => five
            [2] => cinco
        )

)

Exemple #5 null callback avec seulement array

<?php
$array = [1, 2, 3];
var_dump(array_map(null, $array));
?>

L'exemple ci-dessus va afficher :

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

Exemple #6 array_map() - avec des clés sous la forme de chaîne de caractères

<?php
$arr = ['stringkey' => 'value'];
function cb1($a) {
    return [$a];
}
function cb2($a, $b) {
    return [$a, $b];
}
var_dump(array_map('cb1', $arr));
var_dump(array_map('cb2', $arr, $arr));
var_dump(array_map(null,  $arr));
var_dump(array_map(null, $arr, $arr));
?>

L'exemple ci-dessus va afficher :

array(1) {
  ["stringkey"]=>
  array(1) {
    [0]=>
    string(5) "value"
  }
}
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "value"
    [1]=>
    string(5) "value"
  }
}
array(1) {
  ["stringkey"]=>
  string(5) "value"
}
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(5) "value"
    [1]=>
    string(5) "value"
  }
}

Voir aussi

  • array_filter() - Filtre les éléments d'un tableau grâce à une fonction de rappel
  • array_reduce() - Réduit itérativement un tableau
  • array_walk() - Exécute une fonction fournie par l'utilisateur sur chacun des éléments d'un tableau

User Contributed Notes

niemans at pbsolo dot nl 07-Feb-2021 01:11
A simple one-liner to add line numbers to a text:

$i = 1; join(" \n", array_map(function($a) use(&$i) { return $i++ . ': '. $a; }, explode(“\n", $text)));
mail at markuszeller dot com 12-Jun-2020 03:27
Thanks to the new lambda function shorthand, you can compact the first example calculating cubic values, which is much nicer to read.

You do not have to declare a function.

$a = [1, 2, 3, 4, 5];
$b = array_map(fn($n) => $n * $n * $n, $a);
print_r($b);
luis at lpdeveloper dot com dot br 28-Apr-2020 12:57
ExampleArrow function php >= 7.4
Short closures, also called arrow functions, are a way of writing shorter functions in PHP. This notation is useful when passing closures to functions like array_map or array_filter

<?php
$request = [
  ['value'=>1],
  ['value'=>2],
  ['value'=>3],
];

print_r(
       array_map(fn(array $value)=>$value['value'],$request)
);
?>

Output:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)
shaman_master at list dot ru 25-Dec-2019 01:37
Short-hands to "array_map", fill parameter arrays:
<?php
/**
 * Applies the callback to the values of the given list. Mix `array_map()` and `iterator_apply()`.
 *
 * @param callable $callback Callback function to run for each value in list.
 * @param array $parameters Callback parameters, contain the keys "values" and "keys"(optional, auto fill).
 * @return array
 */
function arr_map(?callable $callback, array $parameters): array
{
    if (empty($parameters['values'])) {
        throw new \InvalidArgumentException('Parameters must contain the key "values"');
    }
    if (! \is_iterable($parameters['values'])) {
        throw new \InvalidArgumentException('Parameter "values" must be iterable');
    }

    if (\is_object($parameters['values'])) {
        $parameters['values'] = \iterator_to_array($parameters['values']);
    }
    $keys = \array_keys($parameters['values']);
    \array_walk(
        $parameters,
        function (&$value, $key) use ($keys) {
            if ($key == 'keys') {
                $value = $keys;
            } elseif ($key != 'values') {
                $value = \array_fill_keys($keys, $value);
            }
        }
    );
    return \array_map($callback, ...\array_values($parameters));
}
?>
Usage, add prefix to values:
<?php
$array = range('a', 'z');
$result = arr_map('sprintf', ['prefix_%s', 'value' => $array]));
$iterator = new ArrayIterator($array);
$result2 = arr_map('sprintf', ['prefix_%s', 'values' => $iterator]);
?>
amolocaleb at gmail dot com 15-Apr-2019 06:11
Simple obvious thing to keep in mind:
the number of arrays passed as arguments to an array_map() function should correspond to the number of parameters defined in the callback otherwise,say if you write a function with n parameters and supply m arrays to the array_map  such that m>n,array_map() ignores params at n+1 onwards. but no error or notice is issued. Of course supplying fewer arguments than declared in the function declaration throws an
ArgumentCountError
lewiscowles at me dot com 25-Jan-2017 11:37
The words "is an immutable implementation" are missing...

Essentially the collection you send in can be sent to the same var you operate after map has completed, thus explicitly overwriting, but importantly the input array is not modified, so the method is (as it should be) immutable. This means if you send in `$array1` and assign result to `$array2`, you'll still have `$array1` as it was prior to the map function call.

This is entirely separate from foreach modification semantics where mostly I've seen a mix of immutable (assigning to a new object) and mutable (using key and array to update in-place `$arrayinput[$key] = doSomethingWith($value)`.

This is not a comment on the internal workings but has been tested on 5.4, 5.6, 7.0 and 7.1
mcmurphy510 at gmail dot com 19-May-2016 03:43
If you are using Namespaces, the array_map callback expects the Fully Qualified NameSpace to be used.

For example, this won't work:
<?php
namespace Test;
function mapping_function($var)  {
    ...
}
array_map('mapping_function', $array);  //won't find 'mapping_function' here.
?>

This, however, will work:
<?php
namespace Test;
function mapping_function($var)  {
    ...
}
array_map('Test\mapping_function', $array);  //using FQNS.
?>
Mahn 20-Oct-2015 05:10
You may be looking for a method to extract values of a multidimensional array on a conditional basis (i.e. a mixture between array_map and array_filter) other than a for/foreach loop. If so, you can take advantage of the fact that 1) the callback method on array_map returns null if no explicit return value is specified (as with everything else) and 2) array_filter with no arguments removes falsy values.

So for example, provided you have:

<?php
$data = [
    [
        "name" => "John",
        "smoker" => false
    ],
    [
        "name" => "Mary",
        "smoker" => true
    ],
    [
        "name" => "Peter",
        "smoker" => false
    ],
    [
        "name" => "Tony",
        "smoker" => true
    ]
];
?>

You can extract the names of all the non-smokers with the following one-liner:

<?php
$names = array_filter(array_map(function($n) { if(!$n['smoker']) return $n['name']; }, $data));
?>

It's not necessarily better than a for/foreach loop, but the occasional one-liner for trivial tasks can help keep your code cleaner.
CertaiN 24-Mar-2015 05:15
Simplest array_map_recursive() implemention.

<?php
function array_map_recursive(callable $func, array $array) {
    return filter_var($array, \FILTER_CALLBACK, ['options' => $func]);
}
?>
mark at grooveshark dot com 20-Jan-2015 04:44
If you're looking for a way to get a specific set of key values (ala "pluck") you can just use array_column([['id' => 1]], 'id').
wapinet at mail dot ru 15-Jul-2014 01:54
PHP 5.5.14
<?php
$columns = range(1, 100000);
$time = microtime(true);

/*
0.067003011703491 sec
24903680 byte
 */
array_map(function ($value) {
    return 'p.' . $value;
}, $columns);

/*
0.042001962661743 sec
19398656 byte
 */
foreach ($columns as $key => $column) {
    $columns[$key] = 'p.' . $column;
}

/*
0.05500316619873 sec
10747904 byte
 */
array_walk($columns, function (&$value, $key) {
    $value = 'p.' . $value;
});

/*
0.0260009765625 sec
10747904 byte
 */
foreach ($columns as &$column) {
    $column = 'p.' . $column;
}

echo microtime(true) - $time . "\n" . memory_get_peak_usage(true) . "\n";
elfe1021 at gmail dot com 13-Dec-2013 02:44
Find an interesting thing that in array_map's callable function, late static binding does not work:
<?php
class A {
    public static function foo($name) {
        return 'In A: '.$name;
    }

    public static function test($names) {
        return array_map(function($n) {return static::foo($n);}, $names);
    }
}

class B extends A{
    public static function foo($name) {
        return 'In B: '.$name;
    }
}

$result = B::test(['alice', 'bob']);
var_dump($result);
?>

the result is:
array (size=2)
  0 => string 'In A: alice' (length=11)
  1 => string 'In A: bob' (length=9)

if I change A::test to
<?php
    public static function test($names) {
        return array_map([get_called_class(), 'foo'], $names);
    }
?>

Then the result is as expected:
array (size=2)
  0 => string 'In B: alice' (length=11)
  1 => string 'In B: bob' (length=9)
lukasz dot mordawski at gmail dot com 03-Dec-2013 10:55
Let's assume we have following situation:

<?php
class MyFilterClass {
    public function filter(array $arr) {
        return array_map(function($value) {
            return $this->privateFilterMethod($value);
        });
    }

    private function privateFilterMethod($value) {
        if (is_numeric($value)) $value++;
        else $value .= '.';
    }
}
?>

This will work, because $this inside anonymous function (unlike for example javascript) is the instance of MyFilterClass inside which we called it.
I hope this would be useful for anyone.
CertaiN 22-Aug-2013 08:52
The most memory-efficient array_map_recursive().

<?php
function array_map_recursive(callable $func, array $arr) {
    array_walk_recursive($arr, function(&$v) use ($func) {
        $v = $func($v);
    });
    return $arr;
}
?>
contato at williamsantana dot com dot br 30-Jul-2013 12:42
In case of you need to recursively bypass a function over the itens of an array, you can use it

<?php
    function array_map_recursive($callback, $array) {
        foreach ($array as $key => $value) {
            if (is_array($array[$key])) {
                $array[$key] = array_map_recursive($callback, $array[$key]);
            }
            else {
                $array[$key] = call_user_func($callback, $array[$key]);
            }
        }
        return $array;
    }
?>

-----------------------------------------------------------------------

<?php
    $strings = array(
        'The',
        array(
            'quick',
            'fox',
            array(
                'brown',
                'jumps',
                array(
                    'over',
                    array(
                        'the',
                        array(
                            'lazy',
                            array(
                                'dog'
                            )
                        )
                    )
                )
            )
        )
    );

    print_r($strings);
    $hashedString = array_map_recursive('md5', $strings);
    print_r($hashedString);
?>

------------------------------------------------------------------------
Testing it, you'll obtain

<?php

/* Original array */

array (
  0 => 'The',
  1 =>
  array (
    0 => 'quick',
    1 => 'fox',
    2 =>
    array (
      0 => 'brown',
      1 => 'jumps',
      2 =>
      array (
        0 => 'over',
        1 =>
        array (
          0 => 'the',
          1 =>
          array (
            0 => 'lazy',
            1 =>
            array (
              0 => 'dog',
            ),
          ),
        ),
      ),
    ),
  ),
);

/* Recursived array */
array (
  0 => 'a4704fd35f0308287f2937ba3eccf5fe',
  1 =>
  array (
    0 => '1df3746a4728276afdc24f828186f73a',
    1 => '2b95d1f09b8b66c5c43622a4d9ec9a04',
    2 =>
    array (
      0 => '6ff47afa5dc7daa42cc705a03fca8a9b',
      1 => '55947829059f255e4ba2f536a2ae99fe',
      2 =>
      array (
        0 => '3b759a9ca80234563d87672350659b2b',
        1 =>
        array (
          0 => '8fc42c6ddf9966db3b09e84365034357',
          1 =>
          array (
            0 => '0ffe34b4e04c2b282c5a388b1ad8aa7a',
            1 =>
            array (
              0 => '06d80eb0c50b49a509b49f2424e8c805',
            ),
          ),
        ),
      ),
    ),
  ),
);

?>

Hope it helps you.

Cheers.
jessiedeer at hotmail dot com 16-Jul-2013 10:34
array_map becomes interesting and faster than foreach when used with existing PHP functions.

Example:

$arr1 = array(1, 2, 3, 4);
$arr2 = array(4, 3, 2, 1);

// array with min values for each key
print_r(array_map("min", $arr1, $arr2));

Result: Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 1 )

// array with max values for each key
print_r(array_map("max", $arr1, $arr2));

Result: Array ( [0] => 4 [1] => 3 [2] => 3 [3] => 4 )
jessiedeer at hotmail dot com 16-Jul-2013 10:27
array_map becomes interesting and faster than foreach when used with existing PHP functions.

Example:

$arr1 = array(1, 2, 3, 4);
$arr2 = array(4, 3, 2, 1);

// array with min values for each key
print_r(array_map("min", $arr1, $arr2));

Result: Array ( [0] => 1 [1] => 2 [2] => 2 [3] => 1 )

// array with max values for each key
print_r(array_map("max", $arr1, $arr2));

Result: Array ( [0] => 4 [1] => 3 [2] => 3 [3] => 4 )
shakespeare32 at gmail dot com 19-Feb-2013 07:01
Why not an array of callbacks?

<?php
function array_maps($callbacks, $array) {
    if (!$callbacks) { return $array; }

    if (!is_array($callbacks) && is_string($callbacks) && function_exists($callbacks)) {
        return array_map($callbacks, $array);
    }

    foreach($callbacks as $callback) {
        if (function_exists($callback)) {
        $array = array_map($callback, $array);
        }
    }

    return $array;
}
?>
qeremy 07-Mar-2012 10:35
An alternative for recursive mapping;

<?php
function array_map_recursive($fn, $arr) {
    $rarr = array();
    foreach ($arr as $k => $v) {
        $rarr[$k] = is_array($v)
            ? array_map_recursive($fn, $v)
            : $fn($v); // or call_user_func($fn, $v)
    }
    return $rarr;
}

function sqr($x) {
    return "$x ^ 2 = ". ($x * $x);
}

$a = array(1, 2, 3, array(4, array(5)));
$b = array_map_recursive("sqr", $a);
print_r($b);
?>

Array
(
    [0] => 1 ^ 2 = 1
    [1] => 2 ^ 2 = 4
    [2] => 3 ^ 2 = 9
    [3] => Array
        (
            [0] => 4 ^ 2 = 16
            [1] => Array
                (
                    [0] => 5 ^ 2 = 25
                )

        )

)
gmail.com@mspreij 26-Feb-2012 10:48
Hope I'm not late to the party, here's my function to apply array_map to the *keys* of an array.
Extra array arguments will be used for the callback function's parameters just like with array_map, with the difference that a string is also allowed: it will just be used to create an array of appropriate length with as each value that string. Arrays are left alone (and will be padded with nulls by array_map as needed).

<?php

//_________________________________________________
// array_map_keys($callback, $array, [$args, ..]) /
function array_map_keys($callback, $array /* [, $args ..] */) {
  $args = func_get_args();
  if (! is_callable($callback)) trigger_error("first argument (callback) is not a valid function", E_USER_ERROR);
  if (! is_array($array)) trigger_error("second argument must be an array", E_USER_ERROR);
  $args[1] = array_keys($array);
  // If any additional arguments are not arrays, assume that value is wanted for every $array item.
  // array_map() will pad shorter arrays with Null values
  for ($i=2; $i < count($args); $i++) {
    if (! is_array($args[$i])) {
      $args[$i] = array_fill(0, count($array), $args[$i]);
    }
  }
  return array_combine(call_user_func_array('array_map', $args), $array);
}

// Some examples:

$arr = array('foo'=>123, 'bar'=>456);

// simply uppercase keys:
var_dump(array_map_keys('strtoupper', $arr));
// or..
var_dump(array_map_keys(function($input) {return strtoupper($input);}, $arr));
// >> array(2) { ["FOO"]=>int(123) , ["BAR"]=> int(456) }

// Add a prefix 'myvar_':
var_dump(array_map_keys(function($input, $prefix) {return $prefix.$input;}, $arr, 'myvar_'));
// >> array(2) { ["myvar_foo"]=>int(123) , ["myvar_bar"]=>int(456) }

// Apart from the (static string) prefix, we also number them:
$arr = array('foo'=>123, 'bar'=>456, 'bazz'=>789, 'yadda'=>'0AB');
var_dump(array_map_keys(function($input, $middle, $number) {return $number.':'.$middle.$input;}, $arr, 'myvar_', range(1, count($arr))));
// >> array(4) { ["1:myvar_foo"]=>int(123) , ["2:myvar_bar"]=>int(456) , ["3:myvar_bazz"]=>int(789) , ["4:myvar_yadda"]=>string(3) "0AB" }

?>
php/hotblocks/nl 28-Nov-2011 05:00
Note that the $arr argument has to be an array, not just a Traversable/Iterator.

For instance this won't work:

<?php

$documents = $mongo->db->collection->find();
// $documents is Traversable by foreach

$ids = array_map(function($document) {
  return $document['_id'];
}, $objects);
// $ids will now be NULL, because $documents wasn't an Array

?>

A solution is to first use iterator_to_array():

<?php

$ids = array_map(function($document) {
  return $document['_id'];
}, iterator_to_array($objects));
// $ids will now be an array of ['_id']s

?>

But this is not very efficient: two cycles instead of one. Another solution is to use foreach: one cycle and a lot of freedom (and in the same scope).
virtual dot greg at gmail dot com 05-Mar-2010 03:07
PHP 5.3 enables us to use inline anonymous functions with array_map, cleaning up the syntax slightly.

<?php
$data = array(
        array('id' => 1, 'name' => 'Bob', 'position' => 'Clerk'),
        array('id' => 2, 'name' => 'Alan', 'position' => 'Manager'),
        array('id' => 3, 'name' => 'James', 'position' => 'Director')
);

$names = array_map(
        function($person) { return $person['name']; },
        $data
);

print_r($names);
?>

This was possible (although not recommended) in prior versions of PHP 5, via create_function().

<?php
$names = array_map(
        create_function('$person', 'return $person["name"];'),
        $data
);
?>

You're less likely to catch errors in the latter version because the code is passed as string arguments.

These are alternatives to using a foreach:

<?php
$names = array();

foreach ($data as $row) {
        $names[] = $row['name'];
}
?>
onassar at gmail dot com 13-Oct-2009 07:06
Fixed a bug with array recursion.

<?php
        /**
         * arrayMap function. Customized array_map function which preserves keys/associate array indexes. Note that this costs a descent amount more memory (eg. 1.5k per call)
         *
         * @access public
         * @param callback $callback Callback function to run for each element in each array.
         * @param mixed $arr1 An array to run through the callback function.
         * @param array $array Variable list of array arugments to run through the callback function.
         * @return array Array containing all the elements of $arr1 after applying the callback function to each one, recursively, maintain keys.
         */
        function arrayMap($callback,$arr1) {
            $results       =    array();
            $args          =    array();
            if(func_num_args()>2)
                $args          =    (array) array_shift(array_slice(func_get_args(),2));
            foreach($arr1 as $key=>$value) {
                $temp    =    $args;
                array_unshift($temp,$value);
                if(is_array($value)) {
                    array_unshift($temp,$callback);
                    $results[$key]    =    call_user_func_array(array('self','arrayMap'),$temp);
                } else {
                    $results[$key]    =    call_user_func_array($callback,$temp);
                }
            }
            return $results;
        }
?>
galenjr at gmail dot com 14-Jun-2009 11:19
Another way to array_map htmlentities with a specific quote style is to create a function that does it and map that function

<?php

function map_entities( $str ) {
    return htmlentities( $str, ENT_QUOTES );
}
$good_array = array_map ( 'map_entities', $bad_array );

?>
radist-hack at yandex dot ru 01-Nov-2008 01:37
To transpose rectangular two-dimension array, use the following code:

array_unshift($array, null);
$array = call_user_func_array("array_map", $array);

If you need to rotate rectangular two-dimension array on 90 degree, add the following line before or after (depending on the rotation direction you need) the code above:
$array = array_reverse($array);

Here is example:

<?php
$a = array(
  array(1, 2, 3),
  array(4, 5, 6));
array_unshift($a, null);
$a = call_user_func_array("array_map", $a);
print_r($a);
?>

Output:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 4
        )

    [1] => Array
        (
            [0] => 2
            [1] => 5
        )

    [2] => Array
        (
            [0] => 3
            [1] => 6
        )

)
stijnleenknegt at gmail dot com 22-Jul-2008 04:17
If you want to pass an argument like ENT_QUOTES to htmlentities, you can do the follow.

<?php
$array = array_map( 'htmlentities' , $array, array_fill(0 , count($array) , ENT_QUOTES) );
?>

The third argument creates an equal sized array of $array filled with the parameter you want to give with your callback function.
chreekat 12-Mar-2008 03:48
I was miffed that array_map didn't have a way to pass values *and* keys to the callback, but then I realized I could do this:

function callback($k, $v) { ... }

array_map( "callback", array_keys($array), $array);
loaded67 at hotmail dot com 08-Feb-2008 02:59
this function is really nice for recursion in php!!!

example in a class:

<?php
class test{

    //private $container = array();

    final public function add($key, $value){
         /* recursion */
         if(is_array($value)){
               array_map(array($this, __FUNCTION__), array_keys($value), array_values($value));
         }
         /* procedural */
         else{
             echo $key.' => '.$value.'<br/>'.PHP_EOL;
             // do stuff...
             // if(!isset($this->container[$key])){
             //       $this->container[$key] = $value;
             // }
             //else{  // trigger_error() xor throw new Exception?
             //         echo 'allready exists!<br/>'.PHP_EOL;
             //}
         }
    }
}
//
$array = array (
                               'one'   => 'value1',
                               'two'   => 'value2',
                               'three' => 'value3'
                            );

$t = new test;
$t->add($array);
?>

you could easiely do this without a class too offcourse!
used in php 5.2.5
pmf 22-Jan-2008 07:02
This function behaves exactly like array_map but additionally does not reject non-array arguments. Instead, it transforms them with the array_fill function to a constant valued array of required length according to the other array arguments (if any) and executes the original array_map function.

<?php

function array_map2() {
    $args = func_get_args();

    $callback = array_shift($args);

    $args = array_map(
            create_function('$a,$max','return is_array($a)? $a: array_fill(0,$max,$a);'),
            $args,array_fill(0,count($args),array_reduce($args,
            create_function('$v,$w','return max($v,is_array($w)? count($w): 1);'))));

    array_unshift($args,$callback);

    return call_user_func_array("array_map",$args);
}

?>

Example:

<?php

$get = "first=value1&second=value2&third=value3";

print_r(array_map2("explode","=",explode("&",$get)));

?>

would print out:

<?php

Array
(
    [0] => Array
        (
            [0] => first
            [1] => value1
        )

    [1] => Array
        (
            [0] => second
            [1] => value2
        )

    [2] => Array
        (
            [0] => third
            [1] => value3
        )
)

?>

/pmf
stephen at mu dot com dot au 06-Jan-2003 10:02
A note when doing something allong the lines of:

<?php
class foo {
  var $var;
  function bar() {
     array_map(array($this, "baz"), array(1,2,3));
  }

  function baz($arg) {
    $this->var = $this->var + $arg;
  }
}
?>

This will *not* work as expected. You need to pass $this by reference as with:

array_map(array(&$this, "baz"), array(1,2,3));

or you'll be making a copy of the object each time, changing a value, then throwing the result away.


Combine un ou plusieurs tableaux ensemble, récursivement

  • « array_map
  • array_merge »
  • PHP Manual
  • Fonctions sur les tableaux
  • Combine un ou plusieurs tableaux ensemble, récursivement

array_merge_recursive

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

array_merge_recursive — Combine un ou plusieurs tableaux ensemble, récursivement

Description

array_merge_recursive ( array ...$arrays ) : array

array_merge_recursive() rassemble les éléments de deux ou plusieurs tableaux ensemble, en ajoutant les éléments de l'un à la suite des éléments du précédent.

Si les tableaux passés en arguments ont les mêmes clés (chaînes de caractères), les valeurs sont alors rassemblées dans un tableau, de manière récursive, de façon à ce que, si l'une de ces valeurs est un tableau elle-même, la fonction la rassemblera avec les valeurs de l'entrée courante. Cependant, si deux tableaux ont la même clé numérique, la dernière valeur n'écrasera pas la précédente, mais sera ajoutée à la fin du tableau.

Liste de paramètres

arrays

Liste variable de tableaux à rassembler récursivement.

Valeurs de retour

Un tableau de valeurs résultantes de la fusion des arguments. Si appellé sans arguments, retourne un tableau vide.

Historique

Version | Description
7.4.0 | Cette fonction peut désormais être appelée sans paramètres. Auparavant, au moins un paramètre était requis.

Exemples

Exemple #1 Exemple avec array_merge_recursive()

<?php
$ar1 = array("color" => array("favorite" => "red"), 5);
$ar2 = array(10, "color" => array("favorite" => "green", "blue"));
$result = array_merge_recursive($ar1, $ar2);
print_r($result);
?>

L'exemple ci-dessus va afficher :

Array
(
    [color] => Array
        (
            [favorite] => Array
                (
                    [0] => red
                    [1] => green
                )

            [0] => blue
        )

    [0] => 5
    [1] => 10
)

Voir aussi

  • array_merge() - Fusionne plusieurs tableaux en un seul
  • array_replace_recursive() - Remplace récursivement dans le premier tableau les éléments des autres tableaux fournis

User Contributed Notes

andrew at indigo - sphere dot co dot uk 04-Sep-2020 11:27
An alternative solution where this function does not produce the desired output: Pass a custom recursive function to array_reduce():

For example (Using PHP 7 capabilities to create recursive anonymous function):

<?php
function array_merge_recursive(...$arrays): ?array {
   return array_reduce($arrays, new class {
        public function __invoke($carry, $item) {
            if (is_array($carry) && is_array($item) {
                return $this($carry, $item);
            }
            return $item ?: $carry;
        }
    }
}
?>
In this case truthy values will overwrite the value in the previous array.
Of course this is presented as a simple example only, and is not a general solution.
hailongzh at hotmail dot com 10-Sep-2019 04:17
Sharing my code to reserve the numeric keys:

    function revise_keys($source)
    {
        if (!is_array($source)) {
            return $source;
        }

        $target = [];

        foreach ($source as $key => $value) {
            $target['S' . $key] = revise_keys($value);
        }

        return $target;
    }

    function revert_keys($source)
    {
        if (!is_array($source)) {
            return $source;
        }

        $target = [];

        foreach ($source as $key => $value) {
            $target[substr($key, 1 - strlen($key))] = revert_keys($value);
        }

        return $target;
    }

    function enhanced_array_merge_recursive(...$candidates)
    {
        $merged = [];

        foreach ($candidates as $candidate) {
            if (!is_array($candidate)) {
                continue;
            }

            $merged = array_merge_recursive($merged, revise_keys($candidate));
        }

        return revert_keys($merged);
    }
gullevek at gullevek dot org 29-Aug-2019 08:06
walfs version is pretty good, but it always assumes we want numeric keys as numeric keys. There are possibilities where a numeric key is actually a string '123'

For that I modified the function so that the last argument is a true switch to turn keys can be numeric on. Default is that keys are all string.

<?php
function array_merge_recursive_simple()
{
    // croak on not enough arguemnts (we need at least two)
    if (func_num_args() < 2) {
        trigger_error(__FUNCTION__ .' needs two or more array arguments', E_USER_WARNING);
        return;
    }
    // default key is not string
    $key_is_string = false;
    $arrays = func_get_args();
    // if last is not array, then assume it is trigger for key is always string
    if (!is_array(end($arrays))) {
        if (array_pop($arrays)) {
            $key_is_string = true;
        }
    }
    // check that arrays count is at least two, else we don't have enough
    if (count($arrays) < 2) {
        trigger_error(__FUNCTION__.' needs two or more array arguments', E_USER_WARNING);
        return;
    }
    $merged = array();
    while ($arrays) {
        $array = array_shift($arrays);
        if (!is_array($array)) {
            trigger_error(__FUNCTION__ .' encountered a non array argument', E_USER_WARNING);
            return;
        }
        if (!$array) {
            continue;
        }
        foreach ($array as $key => $value) {
            if (is_string($key) || $key_is_string === false) {
                if (is_array($value) && array_key_exists($key, $merged) && is_array($merged[$key])) {
                    $merged[$key] = call_user_func(__FUNCTION__, $merged[$key], $value, $key_is_string);
                } else {
                    $merged[$key] = $value;
                }
            } else {
                $merged[] = $value;
            }
        }
    }
    return $merged;
}
?>
zubkov dot rabota at gmail dot com 12-Jul-2017 10:58
This recursive array merge function doesn't renumber integer keys and appends new values to existing ones OR adds a new [key => value] pair if the pair doesn't exist.

function array_merge_recursive_adv(array &$array1, $array2) {
        if(!empty($array2) && is_array($array2))
            foreach ($array2 as $key => $value) {
                    if(array_key_exists($key,$array1)) {
                        if(is_array($value)){
                            array_merge_recursive_adv($array1[$key], $value);
                        } else {
                             if(!empty($array1[$key])) {
                                if(is_array($array1[$key])){
                                    array_push($array1[$key], $value);
                                } else {
                                    $array1[$key] = [$array1[$key]];
                                    $array1[$key][] = $value;
                                }
                             } else if(empty($array1[$key])) {
                                $array1[$key] = $value;
                             }
                        }
                    } else {
                        $array1[$key] = $value;
                    }
            }
            return $array1;
    }
zubkov dot rabota at gmail dot com 12-Jul-2017 10:57
This recursive array merge function doesn't renumber integer keys and appends new values to existing ones OR adds a new [key => value] pair if the pair doesn't exist.

function array_merge_recursive_adv(array &$array1, $array2) {
        if(!empty($array2) && is_array($array2))
            foreach ($array2 as $key => $value) {
                    if(array_key_exists($key,$array1)) {
                        if(is_array($value)){
                            array_merge_recursive_adv($array1[$key], $value);
                        } else {
                             if(!empty($array1[$key])) {
                                if(is_array($array1[$key])){
                                    array_push($array1[$key], $value);
                                } else {
                                    $array1[$key] = [$array1[$key]];
                                    $array1[$key][] = $value;
                                }
                             } else if(empty($array1[$key])) {
                                $array1[$key] = $value;
                             }
                        }
                    } else {
                        $array1[$key] = $value;
                    }
            }
            return $array1;
    }
karl (dot) hepler (at) gmail (dot) com 07-Oct-2016 08:24
I ran into a fairly unique situation where array_merge_recursive ALMOST did what I wanted, but NOT QUITE. I read through all of the comments, and I didn't find anything that really helped me. I saw a lot of functions submitted that were just trying to recreate array_replace_recursive. This is not that.

Take a look at the code and try it out. Hopefully it helps someone in need!

class Arr
{
    /**
     * Merge multiple arrays.
     *
     * This is similar to, but slightly different than array_merge_recursive.
     * The main difference is that it will merge like keys in subarrays,
     * instead of simply pushing them into the output array.
     *
     * @param  array ...$array
     *
     * @return array
     */
    public static function merge()
    {
        /** Initialize the output array */
        $merged = [];

        /** Go through each argument */
        foreach (func_get_args() as $array) {
            /** Go through each key/value of this array */
            foreach ($array as $key => $value) {
                /**
                 * If this key isn't set on merged,
                 * then it needs to be set for the first time
                 */
                if (! isset($merged[$key])) {
                    /**
                     * Before we can set it, we must make sure
                     * to dive into this value if it is an array,
                     * so that all of its children will be processed.
                     */
                    if (is_array($value)) {
                        $value = static::merge($value);
                    }

                    /**
                     * Now that we're happy with this value,
                     * and we're sure that, if it is an array,
                     * all of its children have been processed,
                     * let's go ahead and set it.
                     */
                    $merged[$key] = $value;

                    /** We can skip the rest of the loop */
                    continue;
                }

                /**
                 * We're here because we want to set a key
                 * that is already set on merged. We don't want
                 * to overwrite anything - we want to add to it.
                 * So, we need to make sure that we're working with an array.
                 */
                if (! is_array($merged[$key])) {
                    $merged[$key] = [$merged[$key]];
                }

                /**
                 * Before we push the value onto the array,
                 * we need to check to see if it is an array itself.
                 * If it is, then we need to make sure all of its children
                 * are processed. We do this by merging all of the children
                 * together. This is where it differs from array_merge_recursive,
                 * which would simply push the children onto the end of the array.
                 */
                if (is_array($value)) {
                    $value = forward_static_call_array([Arr::class, 'merge'], $value);
                }

                /** Now we're ready to push the value into merged */
                $merged[$key][] = $value;
            }
        }

        /** Return the merged array */
        return $merged;
    }
}
fantomx1 at gmail dot com 26-Jan-2016 11:35
I little bit improved daniel's and gabriel's contribution to behave more like original array_merge function to append numeric keys instead of overwriting them and added usefull option of specifying which elements to merge as you more often than not need to merge only specific part of array tree, and some parts of array just need  to let overwrite previous. By specifying helper element mergeWithParent=true, that section of array  will be merged, otherwise latter array part will override former. First level of array behave as classic array_merge.

        function array_merge_recursive_distinct ( array &$array1, array &$array2 )
    {
        static $level=0;
        $merged = [];
        if (!empty($array2["mergeWithParent"]) || $level == 0) {
            $merged = $array1;
        }

        foreach ( $array2 as $key => &$value )
        {
            if (is_numeric($key)) {
                $merged [] = $value;
            } else {
                $merged[$key] = $value;
            }

            if ( is_array ( $value ) && isset ( $array1 [$key] ) && is_array ( $array1 [$key] )
            ) {
                $level++;
                $merged [$key] = array_merge_recursive_distinct($array1 [$key], $value);
                $level--;
            }
        }
        unset($merged["mergeWithParent"]);
        return $merged;
    }
Anonymous 30-Nov-2015 09:45
Proper simplistic example:

<?php

$Array1 = [1, 2];
$Array2 = [3, 4];

echo implode("<br>", array_merge_recursive($Array1, $Array2));

?>

Output:
1
2
3
4
Orhan POLAT 18-Jun-2015 02:24
Merging arrays recursively some problem about existing keys, so that i wrote the function above like this:

function merge($array0, $array1) {
  // Result
  $merged = array();

  foreach (func_get_args() as $array) {
   // Check incoming argument is array
   if (is_array($array)) {
    foreach ($array as $key => $value) {
     // Check there is an array with the key: $key
     if (isset($merged[$key])) {
      // Check the value is array
      if (is_array($value)) {
       // So we must merge current value with the existing array
       $merged[$key] = call_user_func_array(__FUNCTION__, $merged[$key], $value);
      } else {
       if (!is_array($merged[$key])) {
        // If the existing array with the key: $key not an array
        // We make it an array
        $merged[$key] = array($merged[$key]);
       }

       // And add the current value
       $merged[$key][] = $value;
      }
     } else {
      // If not exists make the array
      $merged[$key] = $value;
     }
    }
   }
  }

  return $merged;
 }
Anonymous 17-Mar-2015 05:00
Attention.
(used PHP 5.4. XAMPP)

Values with numeric keys are always appended.   The index of the merge array is determined by the startindex of the first array. Value4s with numeric keys seems always appended.
If a key looks like an integer, array_merge_recursive will interpret the string as an number.

In the example  $arr['farbe']['22'] = 'grün' wil be found after array_merge_recursive in $res['farbe'][33]

$ar1 = array("farbe" => array (31 => 'holla', "rot", "favorit" => "gelb2"), "favorit" => "gelb1", 5);
$ar2 = array(10, "farbe" => array ('22' => "grün",  "favorit" => 2, "blau"));
$result = array_merge_recursive ($ar1, $ar2);
var_dump($result);
echo('<hr>');

// var_dump
array(4) {
  ["farbe"]=>
  array(5) {
    [31]=>
    string(5) "holla"
    [32]=>
    string(3) "rot"
    ["favorit"]=>
    array(2) {
      [0]=>
      string(5) "gelb2"
      [1]=>
      int(2)
    }
    [33]=>
    string(5) "grün"
    [34]=>
    string(4) "blau"
  }
  ["favorit"]=>
  string(5) "gelb1"
  [0]=>
  int(5)
  [1]=>
  int(10)
}
php at metehanarslan dot com 12-Jun-2014 10:52
Sometimes you need to modify an array with another one here is my approach to replace an array's content recursively with delete opiton. Here i used "::delete::" as reserved word to delete items.

<?php
$person= array(
    "name" => "Metehan",
    "surname"=>"Arslan",
    "age"=>27,
    "mail"=>"hidden",
    "favs" => array(
        "language"=>"php",
        "planet"=>"mercury",
        "city"=>"istanbul")
);

$newdata = array(
    "age"=>28,
    "mail"=>"::delete::",
    "favs" => array(
        "language"=>"js",
        "planet"=>"mercury",
        "city"=>"shanghai")
);

print_r(array_overlay($person,$newdata));
// result: Array ( [name] => Metehan [surname] => Arslan [age] => 28 [favs] => Array ( [language] => js [planet] => mercury [city] => shanghai ) )

function array_overlay($a1,$a2)
{
    foreach($a1 as $k => $v) {
        if ($a2[$k]=="::delete::"){
            unset($a1[$k]);
            continue;
        };
        if(!array_key_exists($k,$a2)) continue;
        if(is_array($v) && is_array($a2[$k])){
            $a1[$k] = array_overlay($v,$a2[$k]);
        }else{
            $a1[$k] = $a2[$k];
        }

    }
    return $a1;
}
?>
cezarion at cezarion dot net 09-Apr-2014 12:22
An updated version of  array_merge_recursive without overwriting numeric keys from martyniuk :
function array_merge_recursive_new()
 {
    $arrays = func_get_args();
        $base = array_shift($arrays);

        foreach ($arrays as $array) {
            reset($base); //important
            while (list($key, $value) = @each($array)) {
                if (is_array($value) && @is_array($base[$key])) {
                    $base[$key] = array_merge_recursive_new($base[$key], $value);
                } else {
                    if(isset($base[$key]) && is_int($key)) {
                      $key++;
                    }
                    $base[$key] = $value;
                }
            }
        }

    return $base;
  }
robert dot schlak at alcatel-lucent dot com 02-Jul-2012 04:39
The presence of NULLs; here is an example of the issue and a fix. Although it may not be apparent, if using array_merge_recursive in a loop to combine results from a database query or some other function, you can corrupt your result when NULLs are present in the data. I discovered this when migrating from an Oracle DB to a MySQL DB. I had to match the array structure returned from the PHP function calling the DB and got bit. The array_walk call fixed this for me.
This is a simple example that lacks any DB calls and looping. Assume your array had the DB column names (first, last, and age) and you needed to combine the data in a multi-dimensional array in which the column name is an array key with all rows beneath it. The corruption occurs in $a3. If using element position 2, one could create the fictitious 'pete johnson' because of the collapsing of elements.

<?php
print "<pre>Show corruption\\n";
$a1 = array('first'=>'bob', 'last'=>'jones', 'age'=>'48');
$a2 = array('first'=>'sam', 'last'=>'smith', 'age'=>'41');
$a3 = array('first'=>'pete', 'last'=>null, 'age'=>'3');
$a4 = array('first'=>'joe', 'last'=>'johnson', 'age'=>'33');
$a5 = array_merge_recursive($a1,$a2,$a3,$a4);
print_r($a5);

print "Show Fix\\n";
$a1 = array('first'=>'bob', 'last'=>'jones', 'age'=>'48');
$a2 = array('first'=>'sam', 'last'=>'smith', 'age'=>'41');
$a3 = array('first'=>'pete', 'last'=>null, 'age'=>'3');
array_walk($a3, 'null_to_empty');
$a4 = array('first'=>'joe', 'last'=>'johnson', 'age'=>'33');
$a5 = array_merge_recursive($a1,$a2,$a3,$a4);
print_r($a5);
print "</pre>\\n";

function null_to_empty(&$item) {

  $item = is_null($item) ? '' : $item;
}
?>
martyniuk dot vasyl at gmail dot com 24-Dec-2011 09:10
This is my version of array_merge_recursive without overwriting numeric keys:
<?php
function array_merge_recursive_new() {

        $arrays = func_get_args();
        $base = array_shift($arrays);

        foreach ($arrays as $array) {
            reset($base); //important
            while (list($key, $value) = @each($array)) {
                if (is_array($value) && @is_array($base[$key])) {
                    $base[$key] = array_merge_recursive_new($base[$key], $value);
                } else {
                    $base[$key] = $value;
                }
            }
        }

        return $base;
    }
?>
walf 25-May-2011 10:23
There are a lot of examples here for recursion that are meant to behave more like array_merge() but they don't get it quite right or are fairly customised. I think this version is most similar, takes more than 2 arguments and can be renamed in one place:

<?php

function array_merge_recursive_simple() {

    if (func_num_args() < 2) {
        trigger_error(__FUNCTION__ .' needs two or more array arguments', E_USER_WARNING);
        return;
    }
    $arrays = func_get_args();
    $merged = array();
    while ($arrays) {
        $array = array_shift($arrays);
        if (!is_array($array)) {
            trigger_error(__FUNCTION__ .' encountered a non array argument', E_USER_WARNING);
            return;
        }
        if (!$array)
            continue;
        foreach ($array as $key => $value)
            if (is_string($key))
                if (is_array($value) && array_key_exists($key, $merged) && is_array($merged[$key]))
                    $merged[$key] = call_user_func(__FUNCTION__, $merged[$key], $value);
                else
                    $merged[$key] = $value;
            else
                $merged[] = $value;
    }
    return $merged;
}

$a1 = array(
    88 => 1,
    'foo' => 2,
    'bar' => array(4),
    'x' => 5,
    'z' => array(
        6,
        'm' => 'hi',
    ),
);
$a2 = array(
    99 => 7,
    'foo' => array(8),
    'bar' => 9,
    'y' => 10,
    'z' => array(
        'm' => 'bye',
        11,
    ),
);
$a3 = array(
    'z' => array(
        'm' => 'ciao',
    ),
);
var_dump(array_merge($a1, $a2, $a3));
var_dump(array_merge_recursive_simple($a1, $a2, $a3));
var_dump(array_merge_recursive($a1, $a2, $a3));
?>

gives:

array(7) {              array(7) {              array(7) {
  int(1)                  int(1)                  int(1)
  ["foo"]=>               ["foo"]=>               ["foo"]=>
  array(1) {              array(1) {              array(2) {
    [0]=>                   [0]=>                   [0]=>
    int(8)                  int(8)                  int(2)
  }                       }                         [1]=>
  ["bar"]=>               ["bar"]=>                 int(8)
  int(9)                  int(9)                  }
  ["x"]=>                 ["x"]=>                 ["bar"]=>
  int(5)                  int(5)                  array(2) {
  ["z"]=>                 ["z"]=>                   [0]=>
  array(1) {              array(3) {                int(4)
    ["m"]=>                 [0]=>                   [1]=>
    string(4) "ciao"        int(6)                  int(9)
  }                         ["m"]=>               }
  [1]=>                     string(4) "ciao"      ["x"]=>
  int(7)                    [1]=>                 int(5)
  ["y"]=>                   int(11)               ["z"]=>
  int(10)                 }                       array(3) {
}                         [1]=>                     [0]=>
                          int(7)                    int(6)
                          ["y"]=>                   ["m"]=>
                          int(10)                   array(3) {
                        }                             [0]=>
                                                      string(2) "hi"
                                                      [1]=>
                                                      string(3) "bye"
                                                      [2]=>
                                                      string(4) "ciao"
                                                    }
                                                    [1]=>
                                                    int(11)
                                                  }
                                                  [1]=>
                                                  int(7)
                                                  ["y"]=>
                                                  int(10)
                                                }
andyidol at gmail dot com 10-Feb-2011 07:14
Here's my function to recursively merge two arrays with overwrites. Nice for merging configurations.

<?php

function MergeArrays($Arr1, $Arr2)
{
  foreach($Arr2 as $key => $Value)
  {
    if(array_key_exists($key, $Arr1) && is_array($Value))
      $Arr1[$key] = MergeArrays($Arr1[$key], $Arr2[$key]);

    else
      $Arr1[$key] = $Value;

  }

  return $Arr1;

}

?>
lsiq at papotam com 01-Oct-2010 01:17
<?php

//  this function merges an array with the $_SESSION
//  if you omit second parameter it merges to the root
//  if you give one 'path' array it is merged deeply

function arr2sess($arr, $path=array()){
   if (!is_array($arr)) return false;
   foreach($arr as $k => $v){
      if(is_array($arr[$k])) {
          $path[] = $k;
          arr2sess($arr[$k], $path);
      }else{
          $ref = &$_SESSION;
          if($path){
              foreach($path as $val){
                  if(!$ref[$val]) $ref[$val] = array();
                  $ref = &$ref[$val];
              }
          }
          $ref[$k] = $v;
      }
   }
}

session_start();
$x = array(k1=>12, k2=>array(kxx=>'forget me', kyy=>'I was allways here'));     // do you have any of this on $_SESSION
$rpl = array(k2=>array(kxx=>'I am a replaced value',kzz=>'I am a new value'));
arr2sess($x, array('deep','deep','in_session'));                                // you can use this way
arr2sess($x);                                                                   // or this
arr2sess($rpl);                                                                 // to merge parts with the $_SESSION

$w = array(120, q=>array(199,100));                                             // works the same way on numeric keys
arr2sess($w, array('one','two'));
arr2sess($w);

echo '<pre>';
print_r($_SESSION);

?>
mark dot roduner at gmail dot com 13-Feb-2010 11:34
<?php
/**
 * Merges any number of arrays / parameters recursively, replacing
 * entries with string keys with values from latter arrays.
 * If the entry or the next value to be assigned is an array, then it
 * automagically treats both arguments as an array.
 * Numeric entries are appended, not replaced, but only if they are
 * unique
 *
 * calling: result = array_merge_recursive_distinct(a1, a2, ... aN)
**/

function array_merge_recursive_distinct () {
  $arrays = func_get_args();
  $base = array_shift($arrays);
  if(!is_array($base)) $base = empty($base) ? array() : array($base);
  foreach($arrays as $append) {
    if(!is_array($append)) $append = array($append);
    foreach($append as $key => $value) {
      if(!array_key_exists($key, $base) and !is_numeric($key)) {
        $base[$key] = $append[$key];
        continue;
      }
      if(is_array($value) or is_array($base[$key])) {
        $base[$key] = array_merge_recursive_distinct($base[$key], $append[$key]);
      } else if(is_numeric($key)) {
        if(!in_array($value, $base)) $base[] = $value;
      } else {
        $base[$key] = $value;
      }
    }
  }
  return $base;
}
?>
drvali at hotmail dot com 05-Oct-2009 09:31
<?php
/**
 * Merges any number of arrays of any dimensions, the later overwriting
 * previous keys, unless the key is numeric, in whitch case, duplicated
 * values will not be added.
 *
 * The arrays to be merged are passed as arguments to the function.
 *
 * @access public
 * @return array Resulting array, once all have been merged
 */
function array_merge_replace_recursive() {
    // Holds all the arrays passed
    $params = & func_get_args ();

    // First array is used as the base, everything else overwrites on it
    $return = array_shift ( $params );

    // Merge all arrays on the first array
    foreach ( $params as $array ) {
        foreach ( $array as $key => $value ) {
            // Numeric keyed values are added (unless already there)
            if (is_numeric ( $key ) && (! in_array ( $value, $return ))) {
                if (is_array ( $value )) {
                    $return [] = $this->array_merge_replace_recursive ( $return [$$key], $value );
                } else {
                    $return [] = $value;
                }

            // String keyed values are replaced
            } else {
                if (isset ( $return [$key] ) && is_array ( $value ) && is_array ( $return [$key] )) {
                    $return [$key] = $this->array_merge_replace_recursive ( $return [$$key], $value );
                } else {
                    $return [$key] = $value;
                }
            }
        }
    }

    return $return;
}

$a = array (
    "a" => 1,
    "b" => 2,
    'foo',
    'bar'
);
$b = array (
    "a" => 2,
    "c" => 3,
    'foo'
);

$c = array_merge_replace_recursive ( $a, $b );
print_r ( $a );
print_r ( $b );
print_r ( $c );
?>

Output:
Array
(
    [a] => 1
    [b] => 2
    [0] => foo
    [1] => bar
)
Array
(
    [a] => 2
    [c] => 3
    [0] => foo
)
Array
(
    [a] => 2
    [b] => 2
    [0] => foo
    [1] => bar
    [c] => 3
)
gabriel dot sobrinho at gmail dot com 13-Jul-2009 07:56
I refactored the Daniel's function and I got it:

<?php
/**
 * array_merge_recursive does indeed merge arrays, but it converts values with duplicate
 * keys to arrays rather than overwriting the value in the first array with the duplicate
 * value in the second array, as array_merge does. I.e., with array_merge_recursive,
 * this happens (documented behavior):
 *
 * array_merge_recursive(array('key' => 'org value'), array('key' => 'new value'));
 *     => array('key' => array('org value', 'new value'));
 *
 * array_merge_recursive_distinct does not change the datatypes of the values in the arrays.
 * Matching keys' values in the second array overwrite those in the first array, as is the
 * case with array_merge, i.e.:
 *
 * array_merge_recursive_distinct(array('key' => 'org value'), array('key' => 'new value'));
 *     => array('key' => array('new value'));
 *
 * Parameters are passed by reference, though only for performance reasons. They're not
 * altered by this function.
 *
 * @param array $array1
 * @param array $array2
 * @return array
 * @author Daniel <daniel (at) danielsmedegaardbuus (dot) dk>
 * @author Gabriel Sobrinho <gabriel (dot) sobrinho (at) gmail (dot) com>
 */
function array_merge_recursive_distinct ( array &$array1, array &$array2 )
{
  $merged = $array1;

  foreach ( $array2 as $key => &$value )
  {
    if ( is_array ( $value ) && isset ( $merged [$key] ) && is_array ( $merged [$key] ) )
    {
      $merged [$key] = array_merge_recursive_distinct ( $merged [$key], $value );
    }
    else
    {
      $merged [$key] = $value;
    }
  }

  return $merged;
}
?>

This fix the E_NOTICE when the the first array doesn't have the key and the second array have a value which is a array.
jonnybergstrom at googles mail domain dot comm 27-Jun-2009 08:30
This function didn't work for me - or it didn't do what I thought it would. So I wrote the below function, which merges two arrays, and returns the resulting array. The base array is the left one ($a1), and if a key is set in both arrays, the right value has precedence. If a value in the left one is an array and also an array in the right one, the function calls itself (recursion). If the left one is an array and the right one exists but is not an array, then the right non-array-value will be used.

*Any key only appearing in the right one will be ignored*
 - as I didn't need values appearing only in the right in my implementation, but if you want that you could make some fast fix.

function array_merge_recursive_leftsource(&$a1, &$a2) {
    $newArray = array();
    foreach ($a1 as $key => $v) {
        if (!isset($a2[$key])) {
            $newArray[$key] = $v;
            continue;
        }

        if (is_array($v)) {
            if (!is_array($a2[$key])) {
                $newArray[$key] = $a2[$key];
                continue;
            }
            $newArray[$key] = array_merge_recursive_leftsource($a1[$key], $a2[$key]);
            continue;
        }

        $newArray[$key] = $a2[$key];
    }
    return $newArray;
}
michiel at synetic dot nl 22-May-2009 01:54
A small improvement upon the previously posted array_merge_recursive_distinct functions (based on daniel's version). This implementation preserves the parameter input from the original, you can pass an infinite amount of array's to merge.

<?php
function &array_merge_recursive_distinct()
{
    $aArrays = func_get_args();
    $aMerged = $aArrays[0];

    for($i = 1; $i < count($aArrays); $i++)
    {
        if (is_array($aArrays[$i]))
        {
            foreach ($aArrays[$i] as $key => $val)
            {
                if (is_array($aArrays[$i][$key]))
                {
                    $aMerged[$key] = is_array($aMerged[$key]) ? PR::array_merge_recursive_distinct($aMerged[$key], $aArrays[$i][$key]) : $aArrays[$i][$key];
                }
                else
                {
                    $aMerged[$key] = $val;
                }
            }
        }
    }

    return $aMerged;
}
?>
daniel at danielsmedegaardbuus dot dk 19-Mar-2009 02:18
<?php
/**
 * array_merge_recursive does indeed merge arrays, but it converts values with duplicate
 * keys to arrays rather than overwriting the value in the first array with the duplicate
 * value in the second array, as array_merge does. I.e., with array_merge_recursive,
 * this happens (documented behavior):
 *
 * array_merge_recursive(array('key' => 'org value'), array('key' => 'new value'));
 *     => array('key' => array('org value', 'new value'));
 *
 * array_merge_recursive_distinct does not change the datatypes of the values in the arrays.
 * Matching keys' values in the second array overwrite those in the first array, as is the
 * case with array_merge, i.e.:
 *
 * array_merge_recursive_distinct(array('key' => 'org value'), array('key' => 'new value'));
 *     => array('key' => array('new value'));
 *
 * Parameters are passed by reference, though only for performance reasons. They're not
 * altered by this function.
 *
 * @param array $array1
 * @param mixed $array2
 * @return array
 * @author daniel@danielsmedegaardbuus.dk
 */
function &array_merge_recursive_distinct(array &$array1, &$array2 = null)
{
  $merged = $array1;

  if (is_array($array2))
    foreach ($array2 as $key => $val)
      if (is_array($array2[$key]))
        $merged[$key] = is_array($merged[$key]) ? array_merge_recursive_distinct($merged[$key], $array2[$key]) : $array2[$key];
      else
        $merged[$key] = $val;

  return $merged;
}
?>
miniscalope at gmail dot com 04-Feb-2009 03:56
I would merge 2 arrays but keep the values unique in the result array.
I hope this will help...
<?php

function array_merge_recursive_unique($array1, $array2) {

    foreach($array2 AS $k => $v) {
        if(!isset($array1[$k]))
        {
            $array1[$k] = $v;
        }
        else
        {
            if(!is_array($v)){
                if(is_array($array1[$k]))
                {
                    if(!in_array($v,$array1[$k]))
                    {
                        $array1[$k][] = $v;
                    }
                }
                else
                {
                    if($array1[$k] != $v)
                        $array1[$k] = array($array1[$k], $v);
                 }
            }
            else
            {
                $array1[$k] =    array_merge_recursive_unique($array1,$array2[$k]);
            }

        }

    }
      unset($k, $v);
      return $array1;
}

?>
remy dot damour at -please-no-spam-laposte dot net 21-Jan-2009 06:28
If what you want is merge all values of your array that are arrays themselves to get a resulting array of depth one, then you're more looking for array_flatten function.

Unfortunately I did not find such native function in php, here is the one I wrote:

<?php
/**
 * Flatten an array so that resulting array is of depth 1.
 * If any value is an array itself, it is merged by parent array, and so on.
 *
 * @param array $array
 * @param bool $preserver_keys OPTIONAL When true, keys are preserved when mergin nested arrays (=> values with same key get overwritten)
 * @return array
 */
function array_flatten($array, $preserve_keys = false)
{
    if (!$preserve_keys) {
        // ensure keys are numeric values to avoid overwritting when array_merge gets called
        $array = array_values($array);
    }

    $flattened_array = array();
    foreach ($array as $k => $v) {
        if (is_array($v)) {
            $flattened_array = array_merge($flattened_array, call_user_func(__FUNCTION__, $v, $preserve_keys));
        } elseif ($preserve_keys) {
            $flattened_array[$k] = $v;
        } else {
            $flattened_array[] = $v;
        }
    }
    return $flattened_array;
}

// example
$a = array ('k1' => 'a', 'k2' => array('k1' => 'b', 'k4' => array('k3' => 'c')));
var_export(array_flatten($a)); // output: array(0 => 'a', 1 => 'b', 2 => 'c')
var_export(array_flatten($a, true)); // output: array('k1' => 'b', 'k3' => 'c') // first 'k1' value gets overwritten by nested 'k1' value
?>
phil dot kemmeter at gmail dot com 08-Dec-2008 10:45
I've edit this version even a little bit more, so that the function does not override any values, but inserts them at a free key in the array:

function my_array_merge ($arr,$ins) {
    if(is_array($arr))
    {
        if(is_array($ins)) foreach($ins as $k=>$v)
        {
            if(isset($arr[$k])&&is_array($v)&&is_array($arr[$k]))
            {
                $arr[$k] = my_array_merge($arr[$k],$v);
            }
            else {
                // This is the new loop :)
                while (isset($arr[$k]))
                    $k++;
                $arr[$k] = $v;
            }
        }
    }
    elseif(!is_array($arr)&&(strlen($arr)==0||$arr==0))
    {
        $arr=$ins;
    }
    return($arr);
}

Example:

$array1 = array(
    100 => array(30),
    200 => array(20, 30)
);

$array2 = array(
    100 => array(40),
    201 => array(60, 30)
);

print_r(my_array_merge($array1,$array2));

Output with array_merge_recursive:
Array
(
    [0] => Array
        (
            [0] => 30
        )

    [1] => Array
        (
            [0] => 20
            [1] => 30
        )

    [2] => Array
        (
            [0] => 40
        )

)
This is not the result, I expect from a MERGE-Routine...

Output with the current function:

Array
(
    [100] => Array
        (
            [0] => 30
            [1] => 40
        )

    [200] => Array
        (
            [0] => 20
            [1] => 30
        )

)

This is what I want :)
scott dot clark at vizioninteractive dot com 28-Aug-2008 01:55
Needed some way to fuse two arrays together and found a function here (below from thomas) and decided to update it even further to be a little more smart.

<?php
function my_array_merge ($arr,$ins)
    {
        if(is_array($arr))
            {
                if(is_array($ins)) foreach($ins as $k=>$v)
                    {
                        if(isset($arr[$k])&&is_array($v)&&is_array($arr[$k]))
                            {
                                $arr[$k] = my_array_merge($arr[$k],$v);
                            }
                        else $arr[$k] = $v;
                    }
            }
        elseif(!is_array($arr)&&(strlen($arr)==0||$arr==0))
            {
                $arr=$ins;
            }
        return($arr);
    }
?>
thomas at n-o-s-p-a-m dot thoftware dot de 04-May-2008 06:50
This is a simple, three line approach.

Short description: If one of the Arguments isn't an Array, first Argument is returned. If an Element is an Array in both Arrays, Arrays are merged recursively, otherwise the element in $ins will overwrite the element in $arr (regardless if key is numeric or not). This also applys to Arrays in $arr, if the Element is scalar in $ins (in difference to the previous approach).

  function array_insert($arr,$ins) {
    # Loop through all Elements in $ins:
    if (is_array($arr) && is_array($ins)) foreach ($ins as $k => $v) {
      # Key exists in $arr and both Elemente are Arrays: Merge recursively.
      if (isset($arr[$k]) && is_array($v) && is_array($arr[$k])) $arr[$k] = array_insert($arr[$k],$v);
      # Place more Conditions here (see below)
      # ...
      # Otherwise replace Element in $arr with Element in $ins:
      else $arr[$k] = $v;
    }
    # Return merged Arrays:
    return($arr);
  }

In Addition to felix dot ospald at gmx dot de in my opinion there is no need to compare keys with type-casting, as a key always is changed into an integer if it could be an integer. Just try

$a = array('1'=>'1');
echo gettype(key($a));

It will echo 'integer'. So for having Integer-Keys simply appended instead of replaced, add the Line:

  elseif (is_int($k)) $arr[] = $v;

A Condition I used is:

  elseif (is_null($v)) unset($arr[$k]);

So a NULL-Value in $ins will unset the correspondig Element in $arr (which is different to setting it to NULL!). This may be another Addition to felix dot ospald at gmx dot de: The absolute correct way to check for a Key existing in an Array is using array_key_exists() (not needed in the current context, as isset() is combined with is_array()). array_key_exists() will return TRUE even if the Value of the Element is NULL.

And the last one: If you want to use this approach for more than 2 Arrays, simply use this:

  function array_insert_mult($arr) {
    # More than 1 Argument: Append all Arguments.
    if (func_num_args() > 1) foreach (array_slice(func_get_args(),1) as $ins) $arr = array_insert($arr,$ins);
    # Return merged Arrays:
    return($arr);
  }

And if you worry about maintaining References: Simply use $ins[$k] instead of $v when assigning a Value/using a Value as Argument.
felix dot ospald at gmx dot de 26-Feb-2008 11:23
If you desire correct and performant behaviour (in contrast to the other postings) use this code. It works as documented above.
If you want that keys are always perserved and not appended or renumbered if they are numeric comment out the "if (((string) $key) === ((string) intval($key)))" case.
@spambegone at cratemedia dot com: using empty is not right way to check if an item is in the array use isset!

<?php

function array_merge_recursive2($array1, $array2)
{
    $arrays = func_get_args();
    $narrays = count($arrays);

    // check arguments
    // comment out if more performance is necessary (in this case the foreach loop will trigger a warning if the argument is not an array)
    for ($i = 0; $i < $narrays; $i ++) {
        if (!is_array($arrays[$i])) {
            // also array_merge_recursive returns nothing in this case
            trigger_error('Argument #' . ($i+1) . ' is not an array - trying to merge array with scalar! Returning null!', E_USER_WARNING);
            return;
        }
    }

    // the first array is in the output set in every case
    $ret = $arrays[0];

    // merege $ret with the remaining arrays
    for ($i = 1; $i < $narrays; $i ++) {
        foreach ($arrays[$i] as $key => $value) {
            if (((string) $key) === ((string) intval($key))) { // integer or string as integer key - append
                $ret[] = $value;
            }
            else { // string key - megre
                if (is_array($value) && isset($ret[$key])) {
                    // if $ret[$key] is not an array you try to merge an scalar value with an array - the result is not defined (incompatible arrays)
                    // in this case the call will trigger an E_USER_WARNING and the $ret[$key] will be null.
                    $ret[$key] = array_merge_recursive2($ret[$key], $value);
                }
                else {
                    $ret[$key] = $value;
                }
            }
        }
    }

    return $ret;
}

// Examples:

print_r(array_merge_recursive2(array('A','B','C' => array(1,2,3)), array('D','C' => array(1,4))));
/*
Array
(
    [0] => A
    [1] => B
    [C] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 1
            [4] => 4
        )
    [2] => D
)*/

print_r(array_merge_recursive2(array('A','B','0' => array(1,2,3)), array('D','0' => array(1,array(4)))));
/*
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
    [1] => B
    [2] => Array
        (
            [0] => 1
            [1] => Array
                (
                    [0] => 4
                )
        )
)*/

print_r(array_merge_recursive2(array('A' => array('A' => 1)), array('A' => array('A' => array(2)))));
/*
Warning: Argument #1 is not an array - trying to merge array with scalar! Returning null! in ... on line ...
*/

var_dump(array_merge_recursive2(array('A' => array('A' => 2)), array('A' => array('A' => null))));
/*
array(1) { ["A"]=>  array(1) { ["A"]=>  NULL } }
*/

?>
spambegone at cratemedia dot com 12-Feb-2008 02:06
I've tried these array_merge_recursive functions without much success. Maybe it's just me but they don't seem to actually go more than one level deep? As with all things, its usually easier to write your own, which I did and it seems to work just the way I wanted. Anyways, my function hasn't been tested extensively, but it's a simple function, so in hopes that this might be useful to someone else I'm sharing.

Also, the PHP function array_merge_recursive() didn't work for my purposes because it didn't overwrite the values like I needed it to. You know how it works, it just turns it into an array with multiple values... not helpful if your code is expecting one string.

function array_merge_recursive_unique($array1, $array2) {

    // STRATEGY
    /*
    Merge array1 and array2, overwriting 1st array values with 2nd array
    values where they overlap. Use array1 as the base array and then add
    in values from array2 as they exist.

    Walk through each value in array2 and see if a value corresponds
    in array1. If it does, overwrite with second array value. If it's an
    array, recursively execute this function and return the value. If it's
    a string, overwrite the value from array1 with the value from array2.

    If a value exists in array2 that is not found in array1, add it to array1.
    */

    // LOOP THROUGH $array2
    foreach($array2 AS $k => $v) {

        // CHECK IF VALUE EXISTS IN $array1
        if(!empty($array1[$k])) {
            // IF VALUE EXISTS CHECK IF IT'S AN ARRAY OR A STRING
            if(!is_array($array2[$k])) {
                // OVERWRITE IF IT'S A STRING
                $array1[$k]=$array2[$k];
            } else {
                // RECURSE IF IT'S AN ARRAY
                $array1[$k] = array_merge_recursive_unique($array1[$k], $array2[$k]);
            }
        } else {
            // IF VALUE DOESN'T EXIST IN $array1 USE $array2 VALUE
            $array1[$k]=$v;
        }
    }
    unset($k, $v);

    return $array1;
}
paha at paha dot hu 12-Mar-2007 12:02
In this version the values are overwritten only if they are not an array.  If the value is an array, its elements will be merged/overwritten:

// array_merge_recursive which override value with next value.
// based on: http://www.php.net/manual/hu/function.array-merge-recursive.php 09-Dec-2006 03:38
function array_merge_recursive_unique($array0, $array1)
{
    $arrays = func_get_args();
    $remains = $arrays;

    // We walk through each arrays and put value in the results (without
    // considering previous value).
    $result = array();

    // loop available array
    foreach($arrays as $array) {

        // The first remaining array is $array. We are processing it. So
        // we remove it from remaing arrays.
        array_shift($remains);

        // We don't care non array param, like array_merge since PHP 5.0.
        if(is_array($array)) {
            // Loop values
            foreach($array as $key => $value) {
                if(is_array($value)) {
                    // we gather all remaining arrays that have such key available
                    $args = array();
                    foreach($remains as $remain) {
                        if(array_key_exists($key, $remain)) {
                            array_push($args, $remain[$key]);
                        }
                    }

                    if(count($args) > 2) {
                        // put the recursion
                        $result[$key] = call_user_func_array(__FUNCTION__, $args);
                    } else {
                        foreach($value as $vkey => $vval) {
                            $result[$key][$vkey] = $vval;
                        }
                    }
                } else {
                    // simply put the value
                    $result[$key] = $value;
                }
            }
        }
    }
    return $result;
}
randallgirard at hotmail dot com 26-Nov-2006 01:18
I wrote the following for merging arrays, in my project mainly for configuration... Thought someone else might find it usefull.

function array_merge_recursive_keys( $first, $second, $greedy=false) {
   $inter = array_intersect_assoc(array_keys($first), array_keys($second)); # shaired keys
# the idea next, is to strip and append from $second into $first
   foreach ( $inter as $key ) {
   # recursion if both are arrays
      if ( is_array($first[$key]) && is_array($second[$key]) ) {
         $first[$key] = array_merge_recursive_keys($first[$key], $second[$key]);
      }
   # non-greedy array merging:
      else if ( is_array($first[$key] && !$greedy ) ) {
         $first[$key][] = $second[$key];
      }
      else if ( is_array($second[$key]) && !$greedy ) {
         $second[$key][] = $first[$key];
         $first[$key] = $second[$key];
      }
   # overwrite...
      else {
         $first[$key] = $second[$key];
      }
      unset($second[$key]);
   }
# merge the unmatching keys onto first
   return array_merge($first, $second);
}
thiago dot mata at yahoo dot com dot br 30-Sep-2006 12:25
<?php
    function array_merge_recursive_keep_keys( $arrElement1 , $arrElement2 , $intCount = 0 )
    {

        $arrNew = array();

        $arrElement1Keys = array_keys( $arrElement1 );
        $arrElement2Keys = array_keys( $arrElement2 );

        $arrDifKeys1 = array_diff( $arrElement1Keys, $arrElement2Keys );
        $arrDifKeys2 = array_diff( $arrElement2Keys, $arrElement1Keys );
        $arrInter     = array_intersect( $arrElement1Keys , $arrElement2Keys );

        foreach( $arrDifKeys1 as $strKey1)
        {
            $arrNew[ $strKey1 ] = $arrElement1[ $strKey1 ];
        }
        foreach( $arrDifKeys2 as $strKey2)
        {
            $arrNew[ $strKey2 ] = $arrElement2[ $strKey2 ];
        }
        foreach( $arrInter as $strInterKey )
        {
            if( is_array( $arrElement1[ $strInterKey ] ) && is_array( $arrElement2[ $strInterKey ] ) )
            {
                $intCount++;
                $arrNew[ $strInterKey ] = array_merge_recursive_keep_keys( $arrElement1[ $strInterKey ] , $arrElement2[ $strInterKey ] , $intCount );
            }
            elseif( is_array( $arrElement1[ $strInterKey ] ) || is_array( $arrElement2[ $strInterKey ] ) )
            {
                $arrNew[ $strInterKey ][]    =  $arrElement1[ $strInterKey ];
                $arrNew[ $strInterKey ][]    =  $arrElement2[ $strInterKey ];
            }
            else
            {
                $arrNew[ $strInterKey ] = array();
                $arrNew[ $strInterKey ][] = $arrElement1[ $strInterKey ];
                $arrNew[ $strInterKey ][] = $arrElement2[ $strInterKey ];
            }
        }
        return $arrNew;
    }
?>
smilingrasta 07-Jul-2006 10:04
This function tends to reindex arrays, which is not  mentioned in the function description.

I just tried to run that function on a three dimensional array, containing errormessages.
The first dim. contains the severity of the error ('warn', 'crit') the second dim the linenumber (numerical) and the third one consists of errormessages

<?php
# Array printout:
Array
 (
   [warn] => Array  // severity (associative)
    (
      [2] => Array  // linenumber (numerical)
       (
         [0] => "Category does not exist"
         [1] => "Manufacturer does not exist"
       )
    )
 )

?>

If i now merge two or more of those arrays using array_merge_recursive(), the linenumbers are not conserved. Instead of, they are all renumbered, starting with 0.

Just thought anyone may want to know about that. :)
regards, smilingrasta
manicdepressive at mindless dot com 22-Jun-2004 07:30
Please be aware that under circumstances where you have
both the key and value common between the two arrays at a given node,
array_merge_recursive() will behave differently if that value is NULL,
as opposed to a non-null value.

i.e., I expected the results of the first two sections below to
have the same structure, but they don't.
If this might apply to you, please see for yourself.

<pre><?php

$a1 = array('a'=>'b');
$a2 = array('a'=>'b');
$a3 = array_merge_recursive($a1,$a2);
var_export($a3);
echo "\n\n";

$a1 = array('a'=>NULL);
$a2 = array('a'=>NULL);
$a3 = array_merge_recursive($a1,$a2);
var_export($a3);
echo "\n\n";

$a1 = array('a'=>'b');
$a2 = array('a'=>NULL);
$a3 = array_merge_recursive($a1,$a2);
var_export($a3);
echo "\n\n";

?></pre>

This behavior also occurs if the value is the empty array.
In fact, in the above example, interchanging the empty array with
any and all occurences of NULL will yield the same result.

    code till dawn!  -mark
brian at vermonster dot com 25-May-2004 02:44
Here is a fairly simple function that replaces while recursing.

<?php
/**
 * array_merge_recursive2()
 *
 * Similar to array_merge_recursive but keyed-valued are always overwritten.
 * Priority goes to the 2nd array.
 *
 * @static yes
 * @public yes
 * @param $paArray1 array
 * @param $paArray2 array
 * @return array
 */
function array_merge_recursive2($paArray1, $paArray2)
{
    if (!is_array($paArray1) or !is_array($paArray2)) { return $paArray2; }
    foreach ($paArray2 AS $sKey2 => $sValue2)
    {
        $paArray1[$sKey2] = array_merge_recursive2(@$paArray1[$sKey2], $sValue2);
    }
    return $paArray1;
}

?>

Examples:
<?php

$array1 = array(
    'liquids' => array(
        'water' => array('cold', 'fizzy', 'clean')
        ,'beer' => 'warm'
    )
);

$array2 = array(
    'liquids' => array(
        'water' => 'hot'
        ,'milk' => 'wet'
    )
);

$result1 = array_merge_recursive2($array1, $array2);
$result2 = array_merge_recursive2($array2, $array1);
?>

Result 1 is:
Array
(
    [liquids] => Array
        (
            [water] => hot
            [beer] => warm
            [milk] => wet
        )
)

Result 2 is:
Array
(
    [liquids] => Array
        (
            [water] => Array
                (
                    [0] => cold
                    [1] => fizzy
                    [2] => clean
                )

            [milk] => wet
            [beer] => warm
        )
)
paska at kios dot sk 04-Mar-2004 02:18
This emulates replace of $_REQUEST according to variable_order=GPC.
<?
    function array_merge_replace($array, $newValues) {
        foreach ($newValues as $key => $value ) {
            if (is_array($value)) {
                if (!isset($array[$key])) {
                    $array[$key] = array();
                }
                $array[$key] = array_merge_replace($array[$key], $value);
            } else {
                $array[$key] = $value;
            }
        }
        return $array;
    }

    $_REQUEST = array_merge_replace($_REQUEST, $_GET);
    $_REQUEST = array_merge_replace($_REQUEST, $_POST);
    $_REQUEST = array_merge_replace($_REQUEST, $_COOKIE);
?>

Useful with stripping backslashes at beginning of main include file:
<?
if (get_magic_quotes_gpc() == 1) {

    function stripMagicSlashes($element) {
        if (is_array($element)) {
            return array_map("stripMagicSlashes", $element);
        } else {
            return stripslashes($element);
        }
    }

    function array_merge_replace($array, $newValues) {
        foreach ($newValues as $key => $value ) {
            if (is_array($value)) {
                if (!isset($array[$key])) {
                    $array[$key] = array();
                }
                $array[$key] = array_merge_replace($array[$key], $value);
            } else {
                $array[$key] = $value;
            }
        }
        return $array;
    }

    $_GET    = array_map("stripMagicSlashes", $_GET);
    $_POST   = array_map("stripMagicSlashes", $_POST);
    $_COOKIE = array_map("stripMagicSlashes", $_COOKIE);

    $_REQUEST = array_merge_replace($_REQUEST, $_GET);
    $_REQUEST = array_merge_replace($_REQUEST, $_POST);
    $_REQUEST = array_merge_replace($_REQUEST, $_COOKIE);

}

$GLOBALS['stripped'] = true;
?>

Based on examples from users from this site.


Fusionne plusieurs tableaux en un seul

  • « array_merge_recursive
  • array_multisort »
  • PHP Manual
  • Fonctions sur les tableaux
  • Fusionne plusieurs tableaux en un seul

array_merge

(PHP 4, PHP 5, PHP 7, PHP 8)

array_merge — Fusionne plusieurs tableaux en un seul

Description

array_merge ( array ...$arrays ) : array

array_merge() rassemble les éléments d'un ou de plusieurs tableaux en ajoutant les valeurs de l'un à la fin de l'autre. Le résultat est un tableau.

Si les tableaux d'entrées ont des clés en commun, alors, la valeur finale pour cette clé écrasera la précédente. Cependant, si les tableaux contiennent des clés numériques, la valeur finale n'écrasera pas la valeur originale, mais sera ajoutée.

Les clés numériques des tableaux d'entrées seront renumérotées en clés incrémentées partant de zéro dans le tableau fusionné.

Liste de paramètres

arrays

Liste de tableaux variable à fusionner.

Valeurs de retour

Retourne le tableau résultant. Si appellé sans arguments, retourne un tableau vide.

Historique

Version | Description
7.4.0 | Cette fonction peut désormais être appelée sans paramètres. Auparavant, au moins un paramètre était requis.

Exemples

Exemple #1 Exemple avec array_merge()

<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
?>

L'exemple ci-dessus va afficher :

Array
(
    [color] => green
    [0] => 2
    [1] => 4
    [2] => a
    [3] => b
    [shape] => trapezoid
    [4] => 4
)

Exemple #2 Exemple simple avec array_merge()

<?php
$array1 = array();
$array2 = array(1 => "data");
$result = array_merge($array1, $array2);
?>

N'oubliez pas que les index numériques seront réindexés !

Array
(
    [0] => data
)

Si vous voulez ajouter des éléments du second tableau au premier sans pour autant écraser ou ré-indexer les éléments du premier, utilisez l'opérateur d'union + :

<?php
$array1 = array(0 => 'zero_a', 2 => 'two_a', 3 => 'three_a');
$array2 = array(1 => 'one_b', 3 => 'three_b', 4 => 'four_b');
$result = $array1 + $array2;
var_dump($result);
?>

Les clés du premier tableau sont préservées. Si une clé existe dans les 2 tableaux, alors l'élément du premier sera utilisé et la clé correspondante du second sera ignorée.

array(5) {
  [0]=>
  string(6) "zero_a"
  [2]=>
  string(5) "two_a"
  [3]=>
  string(7) "three_a"
  [1]=>
  string(5) "one_b"
  [4]=>
  string(6) "four_b"
}

Exemple #3 Exemple avec array_merge() avec des types non-tableaux

<?php
$beginning = 'foo';
$end = array(1 => 'bar');
$result = array_merge((array)$beginning, (array)$end);
print_r($result);
?>

L'exemple ci-dessus va afficher :

    Array
    (
        [0] => foo
        [1] => bar
    )

Voir aussi

  • array_merge_recursive() - Combine un ou plusieurs tableaux ensemble, récursivement
  • array_replace() - Remplace les éléments d'un tableau par ceux d'autres tableaux
  • array_combine() - Crée un tableau à partir de deux autres tableaux
  • les opérateurs de tableau

User Contributed Notes

fsb at thefsb dot org 12-Mar-2020 11:36
We no longer need array_merge() as of PHP 7.4.

    [...$a, ...$b]

does the same as

    array_merge($a, $b)

and can be faster too.

https://wiki.php.net/rfc/spread_operator_for_array#advantages_over_array_merge
Md. Abutaleb 24-Feb-2020 06:05
<?php
/* Please note that, the array_merge() function replaces the first key by the second key if both arrays contain the same key. But consider the following code where key '3' is string not integer. In that case ('3') is consider as numeric and generating new numeric key instead of replacing by second one to first one
*/

$array1 = array(0 => 'zero_a', 2 => 'two_a', '3' => 'three_a', 'name' => 'First Name');
$array2 = array(1 => 'one_b', 2 => 'Two b', '3' => 'three_b', 'name' => 'Second Name');

$output = array_merge($array1, $array2);

print_r($output);
Array
(
    [0] => zero_a
    [1] => two_a
    [2] => three_a
    [name] => Second Name
    [3] => one_b
    [4] => Two b
    [5] => three_b
)

//Hope it will helpful.
?>
souzacomprog at gmail dot com 18-Dec-2019 11:42
Sometimes we need to traverse an array and group / merge the indexes so that it is easier to extract them so that they are related in the iteration.

<?php

$people = [
    ['id' => 1, 'name' => 'Hayley'],
    ['id' => 2, 'name' => 'Jack', 'dad' => 1],
    ['id' => 3, 'name' => 'Linus', 'dad' => 4],
    ['id' => 4, 'name' => 'Peter'],
    ['id' => 5, 'name' => 'Tom', 'dad' => 4],
];

// We set up an array with just the children
function children($dad, $people)
{
    $children = [];
    foreach ($people as $p) {
        if (!empty($p["dad"]) && $p["dad"] == $dad["id"]) {
            $children[] = $p;
        }
    }

    return $children;
}

$family = [];

// We merge each child with its respective parent
foreach ($people as $p) {
    $children = children($p, $people);
    if ($children != []) {
        $family[] = array_merge($p, ["children" => $children]);
    }
}

print_r($family);

?>

//OUTPUT

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Hayley
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [name] => Jack
                            [dad] => 1
                        )

                )

        )

    [1] => Array
        (
            [id] => 4
            [name] => Peter
            [children] => Array
                (
                    [0] => Array
                        (
                            [id] => 3
                            [name] => Linus
                            [dad] => 4
                        )

                    [1] => Array
                        (
                            [id] => 5
                            [name] => Tom
                            [dad] => 4
                        )

                )

        )

)
ousseni dot work at gmail dot com 09-Dec-2019 01:55
A good function to merge by keys

/**
* @param $array1....$arrayn
*/
public function array_merge_keys(){
     $args = func_get_args();
     $result = array();
     foreach($args as $array)
     {
            foreach($array as $key=>$value)
            {
                $result[$key] = $value;
            }
        }
     return $result;
}
makjoybd [at] gmail [dot] com 22-Jul-2019 08:25
$a = array(1,2,3);    // an array
$b = 5;  // anything but not an array

$c = array_merge($a, $b); // shows a PHP warning: Argument #2 is not an array

var_dump($c); // output as NULL

// now merge in reverse order
$d = array_merge($b, $a); // shows a PHP warning: Argument #1 is not an array

var_dump($d); // output as NULL

NOTE: For any operation that relies on the previous array merge operation it is highly necessary to check the arguments as well as the result of the merge are arrays before continuing  as the warning would not stop the operation and this might result in data loss and what not... and this should also be stated in the .documentation. Example #3 somewhat started to demonstrate this but used type casting which made this irrelevant to this matter.
pike-common at kw dot nl 08-Oct-2018 01:49
When mixing string keys and numeric keys, numeric keys are still renumbered after merge.

<?php
        $test1= array("foo"=>"rfoo1",2=>"r21","bar"=>"rbar1");
        $test2= array("foo"=>"rfoo2",2=>"r22","bar"=>"rbar2");
        var_dump(array_merge($test1,$test2));
?>
  array(4) {
    ["foo"]=>
    string(5) "rfoo2"
    [0]=>
    string(3) "r21"
    ["bar"]=>
    string(5) "rbar2"
    [1]=>
    string(3) "r22"
 }

adding arrays doesn't:

<?php
        var_dump($test2+$test1);
?>
  array(3) {
    ["foo"]=>
    string(5) "rfoo2"
    [2]=>
    string(3) "r22"
    ["bar"]=>
    string(5) "rbar2"
  }
withtvpeter at gmail dot com 21-Apr-2018 09:42
Suffice to add, array_merge() creates a new array from the supplied array(s) and does not modify the supplied array(s). Example:

$array1 = ["a" => "one", "b"=>"two"];
$array2 = [ "c" => "three", "d" => "four"];

$mergedArray = array_merge($array1, $array2);

print_r($mergedArray); // => ["a"=> "one", "b"=> "two", "c"=>"three", "d"=>"four"];
print_r($array1);  //=> ["a"=>"one", "b"=>"two"];
matias dot r dot ventura at gmail dot com 06-Apr-2018 06:44
Note that if you want to append one array to another, using a foreach in conjuction with array_push is A LOT faster:

<?php

$array = array("one", "two", "three", "four");
$test1 = array();
$test2 = array();
$mctime = microtime(true);

for($i = 0; $i < 10000; $i++){
    $test1 = array_merge($test1, $array);
}

echo("Test 1: ". (microtime(true) - $mctime) ."s     ");
$mctime = microtime(true);

for($i = 0; $i < 10000; $i++){
    foreach($array as $value){
        array_push($test2, $value);
    }
}

echo("Test 2: ". (microtime(true) - $mctime) ."s     ");
?>

This in my case resolves to:

Test 1: 2.7962880134583s
Test 2: 0.0039298534393311s
ian_channing at hotmail dot com 12-Oct-2017 05:36
array_merge is the equivalent of concat in other languages. I tried to submit a bug that array_concat should be created as an alias to this but it was rejected on the basis they didn't want to polute the namespace and that the documentation should be updated instead. So here's what I put in the bug #73576:

There is no documented array concatenation function. This is a very common function, e.g. Javascript and Ruby have the `concat` function, Python has `+` and Haskell has `++`.

The `array_merge` function is what has be used if you want to concatenate arrays. However it is not mentioned in the documentation (not even in the comments) of that method that that is what should be used.

I propose that `array_concat` be created as an alias of `array_merge`. The concatenation of an associative array is also consistent with trying to merge the hash maps. For example there is a Stack Overflow question on 'concatenating two dictionaries' that is marked as a duplicate of the function 'How to merge two Python dictionaries'. That is, it is consistent that hash map concatenation is the same as hash map merging.

So I believe that `array_concat` is a perfect alias for `array_merge` in terms of numeric arrays and a valid (albeit unnecessary) alias for associative arrays.

This will help almost all developers coming to PHP from other dynamic languages.
titum at lavache dot com 01-Aug-2017 11:56
foreach loop is faster than array_merge to append values to an existing array, so choose the loop instead if you want to add an array to the end of another.

<?php
// Create an array of arrays
$chars = [];
for ($i = 0; $i < 15000; $i++) {
    $chars[] = array_fill(0, 10, 'a');
}

// test array_merge
$new = [];
$start = microtime(TRUE);
foreach ($chars as $splitArray) {
    $new = array_merge($new, $splitArray);
}
echo microtime(true) - $start; // => 14.61776 sec

// test foreach
$new = [];
$start = microtime(TRUE);
foreach ($chars as $splitArray) {
    foreach ($splitArray as $value) {
        $new[] = $value;
    }
}
echo microtime(true) - $start; // => 0.00900101 sec
// ==> 1600 times faster
?>
woodongwong at gmail dot com 26-Apr-2017 09:35
As PHP 5.6 you can use array_merge + "splat" operator to reduce a bidimensonal array to a simple array:

<?php
$data = [[1, 2], [3], [4, 5]];
    print_r(array_merge(... $data)); // [1, 2, 3, 4, 5];
?>

PHP < 5.6:

<?php
$data = [[1, 2], [3], [4, 5]];
print_r(array_reduce($data, 'array_merge', []));   // [1, 2, 3, 4, 5];

?>
padina 10-Apr-2017 08:10
Static functions of Classes  with Namespace are callables too.

namespace Vendor\Extension\Service;

class SvgFormationService implements \TYPO3\CMS\Core\SingletonInterface
{

    public static function doubleQuote($value) {
        return '"'.$value.'"';
    }

    public static function otherFunc ($value) {
        $tagAttributes = array_map('\Vendor\Extension\Service\SvgFormationService::doubleQuote',$tagAttributes);
    }
}
rameezsoomro dot pk at live dot com 17-Jan-2017 05:17
Array merge will return null if any parameter not an array
<?php
$DB_user_result=  DB::select()->where()->get(); // return null if not found.
$DB_exists_user_info = ['name'=>'Rameez Soomro','Location'=>'Karachi, Sindh, Pakistan'];
print_r(array_merge($DB_user_result, $DB_exists_user_info));  //NULL
?>
Here is function for solution of array_merge
function copied from  http://sdtuts.com/php-array_merge-function-issue/
<?php
function merge_arrays_obj(){
  $func_info = debug_backtrace();
  $func_args = $func_info[0]['args'];
  $return_array_data = array();
  foreach($func_args as $args_index=>$args_data){
    if(is_array($args_data) || is_object($args_data)){
    $return_array_data = array_merge($return_array_data,$args_data);
    }
  }
  return $return_array_data;
}
?>

Code example how to use it
<?php
$array = array('abc'=>'abcparam');
$null_array = null;
$new_arraydata = array('username'=>'Rameez Soomro','usersite'=>'http://sdtuts.com');
$new_arrayOBJ = array ( (object) array('obj_DATA' => 'ABC_OBJ','obj_next_index '=>'ABC_OBJ_NEXT_INDEX') );
$new_array_data = merge_arrays_obj($array,$null_array,$new_arraydata,$new_arrayOBJ);
print_r($new_array_data);
?>
jcmarchi at gmail dot comfive 20-May-2016 04:06
It is not officially documented but it is summarily important information for everyone to know: neither array_merge or array_merge_recursive functions will function correctly if non-array objects  are used as parameters.

You would probably expect these functions to ignore non-array elements, right? However, if one parameter is null it PHP will not only return null for the entire function but will also (not always) raise an error, such as :

    [ Warning: array_merge(): Argument #x is not an array... ]

This error message won't appear if the defective variable is an empty array (an empty array is still an array), but it will result in an undesirable incomplete Array.

There are several solutions for this problem by validating the Arrays before use them in these functions, but the most efficient way is to enforce the element as an array directly in the function itself. I.e.:

$merged = array_merge( (array)$first_array, (array)$second_array );
arifulin at gmail dot com 15-Mar-2016 09:10
public function mergeArrays($arrays, $field)
    {
        //take array in arrays for retrive structure after merging
        $clean_array = current($arrays);
        foreach ($clean_array as $i => $value) {
            $clean_array[$i]='';
        }

        $merged_array = [];
        $name = '';
        foreach ($arrays as $array){
            $array = array_filter($array); //clean array from empty values
            if ($name == $array[$field]) {
                $merged_array[$name] = array_merge($merged_array[$name], $array);
                $name = $array[$field];
            } else {
                $name = $array[$field];
                $merged_array[$name] = $array;
            }
        }
        //have to be cleaned from array 'field' signs to return original structure of arrays
        foreach ($merged_array as $array){
            $ready_array[] = array_merge($clean_array, $array);
        }

        return $ready_array;
    }
kristopolous at yahoo dot com 26-Feb-2016 10:46
I constantly forget the direction of array_merge so this is partially for me and partially for people like me.

array_merge is a non-referential non-inplace right-reduction. For different ctrl-f typers, it's reduce-right, side-effect free, idempotent, and non in-place.

ex:

$a = array_merge(['k' => 'a'], ['k' => 'b']) => ['k' => 'b']
array_merge(['z' => 1], $a) => does not modify $a but returns ['k' => 'b', 'z' => 1];

Hopefully this helps people that constant look this up such as myself.
info at eastghost dot com 05-Sep-2015 01:37
We noticed array_merge is relatively slower than manually extending an array:

given:
$arr_one[ 'x' => 1, 'y' => 2 ];
$arr_two[ 'a' => 10, 'b' => 20 ];

the statement:
$arr_three = array_merge( $arr_one, $arr_two );
is routinely 200usec slower than:

$arr_three = $arr_one;
foreach( $arr_two as $k => $v ) { $arr_three[ $k ] = $v; }

200usec didn't matter...until we started combining huge arrays.

PHP 5.6.x
Anonymous 29-Jun-2015 09:48
As PHP 5.6 you can use array_merge + "splat" operator to reduce a bidimensonal array to a simple array:

<?php
$data = [[1, 2], [3], [4, 5]];
print_r(array_merge(... $data)); // [1, 2, 3, 4, 5];
?>
gj@php 01-Jul-2014 02:59
i did a small benchmark (on  PHP 5.3.3) comparing:
* using array_merge on numerically indexed arrays
* using a basic double loop to merge multiple arrays

the performance difference is huge:

<?php

require_once("./lib/Timer.php");

function method1($mat){
    $all=array();
    foreach($mat as $arr){
        $all=array_merge($all,$arr);
    }
    return $all;
}

function method2($mat){
    $all=array();
    foreach($mat as $arr){
        foreach($arr as $el){
            $all[]=$el;
        }
    }
    return $all;
}

function tryme(){
    $y=250; //#arrays
    $x=200; //size per array
    $mat=array();
    //build big matrix
    for($i=0;$i<$y;$i++){
        for($j=0;$j<$x;$j++){
            $mat[$i][$j]=rand(0,1000);
        }
    }

    $t=new Timer();
    method1($mat);
    $t->displayTimer();

    $t=new Timer();
    method2($mat);
    $t->displayTimer();

/*
output:
Script runtime: 2.36782 secs. Script runtime: 0.02137 sec.
*/

}

tryme();

?>

So that's more than a factor 100!!!!!
Angel I 12-Jun-2014 01:57
An addition to what Julian Egelstaff above wrote - the array union operation (+) is not doing an array_unique - it will just not use the keys that are already defined in the left array.  The difference between union and merge can be seen in an example like this:

<?php
$arr1['one'] = 'one';
$arr1['two'] = 'two';

$arr2['zero'] = 'zero';
$arr2['one'] = 'three';
$arr2['two'] = 'four';

$arr3 = $arr1 + $arr2;
var_export( $arr3 );
# array ( 'one' => 'one', 'two' => 'two', 'zero' => 'zero', )

$arr4 = array_merge( $arr1, $arr2 );
var_export( $arr4 );
# array ( 'one' => 'three', 'two' => 'four', 'zero' => 'zero', )
?>
php at metehanarslan dot com 10-Jun-2014 10:49
Sometimes you need to modify an array with another one here is my approach to replace an array's content recursively with delete opiton. Here i used "::delete::" as reserved word to delete items.

<?php
$person= array(
    "name" => "Metehan",
    "surname"=>"Arslan",
    "age"=>27,
    "mail"=>"hidden",
    "favs" => array(
        "language"=>"php",
        "planet"=>"mercury",
        "city"=>"istanbul")
);

$newdata = array(
    "age"=>28,
    "mail"=>"::delete::",
    "favs" => array(
        "language"=>"js",
        "planet"=>"mercury",
        "city"=>"shanghai")
);

print_r(array_overlay($person,$newdata));
// result: Array ( [name] => Metehan [surname] => Arslan [age] => 28 [favs] => Array ( [language] => js [planet] => mercury [city] => shanghai ) )

function array_overlay($a1,$a2)
{
    foreach($a1 as $k => $v) {
        if ($a2[$k]=="::delete::"){
            unset($a1[$k]);
            continue;
        };
        if(!array_key_exists($k,$a2)) continue;
        if(is_array($v) && is_array($a2[$k])){
            $a1[$k] = array_overlay($v,$a2[$k]);
        }else{
            $a1[$k] = $a2[$k];
        }

    }
    return $a1;
}
?>
rajaimranqamer at gmail dot com 28-May-2014 08:26
to get unique value from multi dimensional array use this instead of array_unique(), because array_unique() does not work on multidimensional:
array_map("unserialize", array_unique(array_map("serialize", $array)));
Hope this will help someone;
Example
$a=array(array('1'),array('2'),array('3'),array('4));
$b=array(array('2'),array('4'),array('6'),array('8));
$c=array_merge($a,$b);
then write this line to get unique values
$c=array_map("unserialize", array_unique(array_map("serialize", $c)));
print_r($c);
vladas dot dirzys at gmail dot com 21-Aug-2013 09:11
To combine several results (arrays):

<?php
$results = array(
    array(
        array('foo1'),
        array('foo2'),
    ),
    array(
        array('bar1'),
        array('bar2'),
    ),
);

$rows = call_user_func_array('array_merge', $results);
print_r($rows);
?>

The above example will output:

Array
(
    [0] => Array
        (
            [0] => foo1
        )

    [1] => Array
        (
            [0] => foo2
        )

    [2] => Array
        (
            [0] => bar1
        )

    [3] => Array
        (
            [0] => bar2
        )

)

However, example below helps to preserve numeric keys:

<?php
$results = array(
    array(
        123 => array('foo1'),
        456 => array('foo2'),
    ),
    array(
        321 => array('bar1'),
        654 => array('bar2'),
    ),
);

$rows = array();
foreach ($results as &$result) {
    $rows = $rows + $result; // preserves keys
}
print_r($rows);
?>

The above example will output:
Array
(
    [123] => Array
        (
            [0] => foo1
        )

    [456] => Array
        (
            [0] => foo2
        )

    [321] => Array
        (
            [0] => bar1
        )

    [654] => Array
        (
            [0] => bar2
        )
)
Gemorroj 14-May-2012 08:37
The function behaves differently with numbers more than PHP_INT_MAX
<?php
$arr1 = array('1234567898765432123456789' => 'dd');
$arr2 = array('123456789876543212345678' => 'ddd', '35' => 'xxx');
var_dump(array_merge($arr1, $arr2));
//
$arr1 = array('1234' => 'dd');
$arr2 = array('12345' => 'ddd', '35' => 'xxx');
var_dump(array_merge($arr1, $arr2));
?>
result:
array(3) {
  ["1234567898765432123456789"]=>
  string(2) "dd"
  ["123456789876543212345678"]=>
  string(3) "ddd"
  [0]=>
  string(3) "xxx"
}
array(3) {
  [0]=>
  string(2) "dd"
  [1]=>
  string(3) "ddd"
  [2]=>
  string(3) "xxx"
}
alejandro dot anv at gmail dot com 20-Feb-2012 11:26
WARNING: numeric subindexes are lost when merging arrays.

Check this example:

$a=array('abc'=>'abc','def'=>'def','123'=>'123','xyz'=>'xyz');
echo "a=";print_r($a);
$b=array('xxx'=>'xxx');
echo "b=";print_r($b);
$c=array_merge($a,$b);
echo "c=";print_r($c);

The result is this:

c=Array
(
    [abc] => abc
    [def] => def
    [0] => 123
    [xyz] => xyz
    [xxx] => xxx
)
w_barath at hotmail dot com 04-Oct-2011 04:42
I keep seeing posts for people looking for a function to replace numeric keys.

No function is required for this, it is default behavior if the + operator:

<?php
$a=array(1=>"one", "two"=>2);
$b=array(1=>"two", "two"=>1, 3=>"three", "four"=>4);

print_r($a+$b);
?>

Array
(
    [1] => one
    [two] => 2
    [3] => three
    [four] => 4
)

How this works:

The + operator only adds unique keys to the resulting array.  By making the replacements the first argument, they naturally always replace the keys from the second argument, numeric or not! =)
craig ala craigatx.com 26-Oct-2010 10:25
Reiterating the notes about casting to arrays, be sure to cast if one of the arrays might be null:

<?php
header("Content-type:text/plain");
$a = array('zzzz', 'xxxx');
$b = array('mmmm','nnnn');

echo "1 ==============\r\n";
print_r(array_merge($a, $b));

echo "2 ==============\r\n";
$b = array();
print_r(array_merge($a, $b));

echo "3 ==============\r\n";
$b = null;
print_r(array_merge($a, $b));

echo "4 ==============\r\n";
$b = null;
print_r(array_merge($a, (array)$b));

echo "5 ==============\r\n";
echo is_null(array_merge($a, $b)) ? 'Result is null' : 'Result is not null';
?>

Produces:

1 ==============
Array
(
    [0] => zzzz
    [1] => xxxx
    [2] => mmmm
    [3] => nnnn
)
2 ==============
Array
(
    [0] => zzzz
    [1] => xxxx
)
3 ==============
4 ==============
Array
(
    [0] => zzzz
    [1] => xxxx
)
5 ==============
Result is null
zagadka at evorg dot dk 20-Aug-2010 05:54
Note that if you use + to merge array in order to preserve keys, that in case of duplicates the values from the left array in the addition is used.
Tudor 27-Sep-2009 01:10
array_merge will merge numeric keys in array iteration order, not in increasing numeric order. For example:

<?php
$a = array(0=>10, 1=>20);  // same as array(10, 20);
$b = array(0=>30, 2=>50, 1=>40);
?>

array_merge($a, $b) will be array(10, 20, 30, 50, 40) and not array(10, 20, 30, 40, 50).
Julian Egelstaff 30-Jul-2009 11:48
In some situations, the union operator ( + ) might be more useful to you than array_merge.  The array_merge function does not preserve numeric key values.  If you need to preserve the numeric keys, then using + will do that.

ie:

<?php

$array1[0] = "zero";
$array1[1] = "one";

$array2[1] = "one";
$array2[2] = "two";
$array2[3] = "three";

$array3 = $array1 + $array2;

//This will result in::

$array3 = array(0=>"zero", 1=>"one", 2=>"two", 3=>"three");

?>

Note the implicit "array_unique" that gets applied as well.  In some situations where your numeric keys matter, this behaviour could be useful, and better than array_merge.

--Julian
enaeseth at gmail dot com 20-Jul-2009 02:27
In both PHP 4 and 5, array_merge preserves references in array values. For example:

<?php
$foo = 12;
$array = array("foo" => &$foo);
$merged_array = array_merge($array, array("bar" => "baz"));
$merged_array["foo"] = 24;
assert($foo === 24); // works just fine
?>
carrox at inbox dot lv 31-Aug-2008 04:41
Usage of operand '+' for merging arrays:

<?php

$a=array(
'a'=>'a1',
'b'=>'a2',
'a3',
'a4',
'a5');

$b=array('b1',
'b2',
'a'=>'b3',
'b4');

$a+=$b;

print_r($a);

?>

output:
Array
(
    [a] => a1
    [b] => a2
    [0] => a3
    [1] => a4
    [2] => a5
    [3] => b5
)

numeric keys of elements of array B what not presented in array A was added.

<?php

$a=array('a'=>'a1','b'=>'a2','a3','a4','a5');
$b=array(100=>'b1','b2','a'=>'b3','b4');

$a+=$b;

print_r($a);

?>

output:

   [a] => a1
    [b] => a2
    [0] => a3
    [1] => a4
    [2] => a5
    [100] => b1
    [101] => b2
    [102] => b4

autoindex for array B started from 100, these keys not present in array A, so this elements was added to array A
ron at ronfolio dot com 11-Aug-2008 06:44
I needed a function similar to ian at fuzzygroove's array_interlace, but I need to pass more than two arrays.

Here's my version, You can pass any number of arrays and it will interlace and key them properly.

<?php
function array_interlace() {
    $args = func_get_args();
    $total = count($args);

    if($total < 2) {
        return FALSE;
    }

    $i = 0;
    $j = 0;
    $arr = array();

    foreach($args as $arg) {
        foreach($arg as $v) {
            $arr[$j] = $v;
            $j += $total;
        }

        $i++;
        $j = $i;
    }

    ksort($arr);
    return array_values($arr);
}
?>

Example usage:
<?php
$a = array('a', 'b', 'c', 'd');
$b = array('e', 'f', 'g');
$c = array('h', 'i', 'j');
$d = array('k', 'l', 'm', 'n', 'o');

print_r(array_interlace($a, $b, $c, $d));
?>

result:

Array
(
    [0] => a
    [1] => e
    [2] => h
    [3] => k
    [4] => b
    [5] => f
    [6] => i
    [7] => l
    [8] => c
    [9] => g
    [10] => j
    [11] => m
    [12] => d
    [13] => n
    [14] => o
)

Let me know if you improve on it.
bishop 04-Apr-2008 02:02
The documentation is a touch misleading when it says: "If only one array is given and the array is numerically indexed, the keys get reindexed in a continuous way."  Even with two arrays, the resulting array is re-indexed:

[bishop@predator staging]$ cat array_merge.php
<?php
$a = array (23 => 'Hello', '42' => 'World');
$a = array_merge(array (0 => 'I say, '), $a);
var_dump($a);
?>
[bishop@predator staging]$ php-5.2.5 array_merge.php
array(3) {
  [0]=>
  string(7) "I say, "
  [1]=>
  string(5) "Hello"
  [2]=>
  string(5) "World"
}
[bishop@predator staging]$ php-4.4.7 array_merge.php
array(3) {
  [0]=>
  string(7) "I say, "
  [1]=>
  string(5) "Hello"
  [2]=>
  string(5) "World"
}
Hayley Watson 04-Nov-2007 12:38
As has already been noted before, reindexing arrays is most cleanly performed by the array_values() function.
clancyhood at gmail dot com 21-Jul-2007 04:52
Similar to Jo I had a problem merging arrays (thanks for that Jo you kicked me out of my debugging slumber) - array_merge does NOT act like array_push, as I had anticipated

<?php

$array = array('1', 'hello');
array_push($array, 'world');

var_dump($array);

// gives '1', 'hello', 'world'

$array = array('1', 'hello');
array_merge($array, array('world'));

// gives '1', 'hello'

$array = array('1', 'hello');
$array = array_merge($array, array('world'));

// gives '1', 'hello', 'world'

?>

hope this helps someone
Joe at neosource dot com dot au 03-Jun-2007 11:51
I found the "simple" method of adding arrays behaves differently as described in the documentation in PHP v5.2.0-10.

$array1 + $array2 will only combine entries for keys that don't already exist.

Take the following example:

$ar1 = array('a', 'b');
$ar2 = array('c', 'd');
$ar3 = ($ar1 + $ar2);
print_r($ar3);

Result:

Array
(
    [0] => a
    [1] => b
)

Where as:

$ar1 = array('a', 'b');
$ar2 = array('c', 'd');
$ar3 = array_merge($ar1, $ar2);
print_r($ar3);

Result:

Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
)

Hope this helps someone.
RQuadling at GMail dot com 21-May-2007 05:05
For asteddy at tin dot it and others who are trying to merge arrays and keep the keys, don't forget the simple + operator.

Using the array_merge_keys() function (with a small mod to deal with multiple arguments), provides no difference in output as compared to +.

<?php
$a = array(-1 => 'minus 1');
$b = array(0 => 'nought');
$c = array(0 => 'nought');
var_export(array_merge_keys($a,$b));
var_export($a + $b);
var_export(array_merge_keys($a,$b,$c));
var_export($a + $b + $c);
?>

results in ...

array (  -1 => 'minus 1',  0 => 'nought',)
array (  -1 => 'minus 1',  0 => 'nought',)
array (  -1 => 'minus 1',  0 => 'nought',)
array (  -1 => 'minus 1',  0 => 'nought',)
BigueNique at yahoo dot ca 28-Sep-2006 07:10
Needed an quick array_merge clone that preserves the keys:

<?php
// function array_join
// merges 2 arrays preserving the keys,
// even if they are numeric (unlike array_merge)
// if 2 keys are identical, the last one overwites
// the existing one, just like array_merge
// merges up to 10 arrays, minimum 2.
function array_join($a1, $a2, $a3=null, $a4=null, $a5=null, $a6=null, $a7=null, $a8=null, $a9=null, $a10=null) {
    $a=array();
    foreach($a1 as $key=>$value) $a[$key]=$value;
    foreach($a2 as $key=>$value) $a[$key]=$value;
    if (is_array($a3)) $a=array_join($a,$a3,$a4,$a5,$a6,$a7,$a8,$a9,$a10);
    return $a;
}
?>
kaigillmann at gmxpro dot net 02-Nov-2005 03:56
If you need to merge two arrays without having multiple entries, try this:

<?php
function array_fusion($ArrayOne, $ArrayTwo)
{
    return array_unique(array_merge($ArrayOne, $ArrayTwo));
}
?>
ntpt at centrum dot cz 14-Jul-2005 06:44
Old behavior of array_merge can be restored by simple  variable type casting like this

array_merge((array)$foo,(array)$bar);

works good in php 5.1.0 Beta 1, not tested in other versions

seems that empty or not set variables are casted to empty arrays
Alec Solway 20-Jan-2005 10:05
Note that if you put a number as a key in an array, it is eventually converted to an int even if you cast it to a string or put it in quotes.

That is:

$arr["0"] = "Test";
var_dump( key($arr) );

will output int(0).

This is important to note when merging because array_merge will append values with a clashing int-based index instead of replacing them. This kept me tied up for hours.
Frederick.Lemasson{AT}kik-it.com 23-Dec-2004 02:57
if you generate form select from an array, you probably want to keep your array keys and order intact,
if so you can use ArrayMergeKeepKeys(), works just like array_merge :

array ArrayMergeKeepKeys ( array array1 [, array array2 [, array ...]])

but keeps the keys even if of numeric kind.
enjoy

<?

$Default[0]='Select Something please';

$Data[147]='potato';
$Data[258]='banana';
$Data[54]='tomato';

$A=array_merge($Default,$Data);

$B=ArrayMergeKeepKeys($Default,$Data);

echo '<pre>';
print_r($A);
print_r($B);
echo '</pre>';

Function ArrayMergeKeepKeys() {
      $arg_list = func_get_args();
      foreach((array)$arg_list as $arg){
          foreach((array)$arg as $K => $V){
              $Zoo[$K]=$V;
          }
      }
    return $Zoo;
}

//will output :

Array
(
    [0] => Select Something please
    [1] => potato
    [2] => banana
    [3] => tomato
)
Array
(
    [0] => Select Something please
    [147] => potato
    [258] => banana
    [54] => tomato
)

?>
bcraigie at bigfoot dot com 24-Aug-2004 12:37
It would seem that array_merge doesn't do anything when one array is empty (unset):

<?php //$a is unset
$b = array("1" => "x");

$a = array_merge($a, $b});

//$a is still unset.
?>

to fix this omit $a if it is unset:-

<?php
if(!IsSet($a)) {
    $a = array_merge($b);
} else {
  $a = array_merge($a, $b);
}
?>

I don't know if there's a better way.
frankb at fbis dot net 25-Feb-2004 04:02
to merge arrays and preserve the key i found the following working with php 4.3.1:

<?php
$array1 = array(1 => "Test1", 2 => "Test2");
$array2 = array(3 => "Test3", 4 => "Test4");

$array1 += $array2;
?>

dont know if this is working with other php versions but it is a simple and fast way to solve that problem.
loner at psknet dot !NOSPAM!com 29-Sep-2003 03:00
I got tripped up for a few days when I tried to merge a (previously serialized) array into a object. If it doesn't make sense, think about it... To someone fairly new, it could... Anyway, here is what I did:
(It's obviously not recursive, but easy to make that way)
<?php
function array_object_merge(&$object, $array) {
    foreach ($array as $key => $value)
        $object->{$key} = $value;
}
?>

Simple problem, but concevibly easy to get stuck on.
03-Sep-2003 03:10
For those who are getting duplicate entries when using this function, there is a very easy solution:

wrap array_unique() around array_merge()

cheers,

k.
tobias_mik at hotmail dot com 25-Jul-2003 05:14
This function merges any number of arrays and maintains the keys:

<?php
function array_kmerge ($array) {
 reset($array);
 while ($tmp = each($array))
 {
  if(count($tmp['value']) > 0)
  {
   $k[$tmp['key']] = array_keys($tmp['value']);
   $v[$tmp['key']] = array_values($tmp['value']);
  }
 }
 while($tmp = each($k))
 {
  for ($i = $start; $i < $start+count($tmp['value']); $i ++)$r[$tmp['value'][$i-$start]] = $v[$tmp['key']][$i-$start];
  $start = count($tmp['value']);
 }
 return $r;
}
?>


Trie les tableaux multidimensionnels

  • « array_merge
  • array_pad »
  • PHP Manual
  • Fonctions sur les tableaux
  • Trie les tableaux multidimensionnels

array_multisort

(PHP 4, PHP 5, PHP 7, PHP 8)

array_multisort — Trie les tableaux multidimensionnels

Description

array_multisort ( array &$array1 , mixed $array1_sort_order = SORT_ASC , mixed $array1_sort_flags = SORT_REGULAR , mixed ...$rest ) : bool

array_multisort() sert à trier simultanément plusieurs tableaux, ou bien à trier un tableau multidimensionnel, suivant l'une ou l'autre de ses dimensions.

Les clés associatives (chaîne de caractères) seront maintenues, mais les clés numériques seront réindexées.

Note:

Si deux membres se comparent comme égaux, leur ordre relatif dans le tableau trié n'est pas défini.

Liste de paramètres

array1

Un tableau à trier.

array1_sort_order

L'ordre utilisé pour trier le précédent argument array. Soit la constante SORT_ASC pour trier de façon croissant, soit la constante SORT_DESC pour trier de façon décroissant.

Cet argument peut être associé avec le paramètre array1_sort_flags ou simplement omis, auquel cas, la constante SORT_ASC sera utilisée.

array1_sort_flags

Options de tri du précédent argument array :

Type d'options de tri :

  • SORT_REGULAR - compare les éléments normalement (pas de changement de type)
  • SORT_NUMERIC - compare les éléments numériquement
  • SORT_STRING - compare les éléments sous forme de chaînes de caractères
  • SORT_LOCALE_STRING - compare les éléments sous forme de chaînes de caractères, en se basant sur la locale courante. La fonction utilise les locales, et elles peuvent être modifiées en utilisant la fonction setlocale()
  • SORT_NATURAL - compre les éléments sous forme de chaînes de caractères, en utilisant le "tri naturel", comme le fait la fonction natsort()
  • SORT_FLAG_CASE - peut être combiné (avec le mot clé OR) avec SORT_STRING ou SORT_NATURAL pour trier les chaînes sans tenir compte de la casse

Cet argument peut être associé avec le paramètre array1_sort_order ou simplement omis, auquel cas, la constante SORT_REGULAR sera utilisée.

rest

Plus d'arguments, optionnellement suivis par des façons de trier et des drapeaux. Seuls les éléments équivalents dans les tableaux précédents sont comparés. En d'autres termes, le tri est lexicographique.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Trier plusieurs tableaux

<?php
$ar1 = array(10, 100, 100, 0);
$ar2 = array(1, 3, 2, 4);
array_multisort($ar1, $ar2);

var_dump($ar1);
var_dump($ar2);
?>

Dans cet exemple, après le tri, le premier tableau contient 0, 10, 100, 100. Le deuxième tableau contient 4, 1, 2, 3. Les entrées du second tableau correspondant aux valeurs jumelles du premier tableau (100 et 100), sont aussi triées.

array(4) {
  [0]=> int(0)
  [1]=> int(10)
  [2]=> int(100)
  [3]=> int(100)
}
array(4) {
  [0]=> int(4)
  [1]=> int(1)
  [2]=> int(2)
  [3]=> int(3)
}

Exemple #2 Trier un tableau multidimensionnel

<?php
$ar = array(
       array("10", 11, 100, 100, "a"),
       array(   1,  2, "2",   3,   1)
      );
array_multisort($ar[0], SORT_ASC, SORT_STRING,
                $ar[1], SORT_NUMERIC, SORT_DESC);
var_dump($ar);
?>

Dans cet exemple, après le tri, le premier tableau contient "10", 100, 100, 11, "a" (tri alphabétique, ordre croissant); Le deuxième tableau contient 1, 3, "2", 2, 1 (tri numérique, ordre décroissant).

array(2) {
  [0]=> array(5) {
    [0]=> string(2) "10"
    [1]=> int(100)
    [2]=> int(100)
    [3]=> int(11)
    [4]=> string(1) "a"
  }
  [1]=> array(5) {
    [0]=> int(1)
    [1]=> int(3)
    [2]=> string(1) "2"
    [3]=> int(2)
    [4]=> int(1)
  }
}

Exemple #3 Classer les résultats d'une base de données

Dans cet exemple, chaque élément du tableau data représente une ligne de la table. Ce type de données est typique d'un enregistrement de base de données.

Exemple de données :

volume | edition
-------+--------
    67 |       2
    86 |       1
    85 |       6
    98 |       2
    86 |       6
    67 |       7

Les données sont sous forme de tableau, appelé data. Cela est généralement le résultat, par exemple, de la fonction mysqli_fetch_assoc().

<?php
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
?>

Dans cet exemple, nous allons trier la colonne volume par ordre décroissant, et la colonne edition par ordre croissant.

Nous avons un tableau de lignes, mais array_multisort() nécessite un tableau de colonnes, donc nous utilisons le code suivant pour obtenir les colonnes et ainsi effectuer le tri.

<?php
// Obtient une liste de colonnes
foreach ($data as $key => $row) {
    $volume[$key]  = $row['volume'];
    $edition[$key] = $row['edition'];
}

// a partir de PHP 5.5.0 vous pouvez utiliser array_column() au lieu du code ci-dessus
$volume  = array_column($data, 'volume');
$edition = array_column($data, 'edition');

// Trie les données par volume décroissant, edition croissant
// Ajoute $data en tant que dernier paramètre, pour trier par la clé commune
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?>

Le jeu d'enregistrement est maintenant trié et ressemble à cela :

volume | edition
-------+--------
    98 |       2
    86 |       1
    86 |       6
    85 |       6
    67 |       2
    67 |       7

Exemple #4 Tri non sensible à la casse

SORT_STRING et SORT_REGULAR sont sensibles à la casse, les chaînes de caractères commençant avec une lettre en majuscule viendront avant les chaînes de caractères commençant par une lettre en minuscule.

Pour effectuer un tri insensible à la casse, effectuez le tri sur une copie minuscule des colonnes du tableau original.

<?php
$array = array('Alpha', 'atomic', 'Beta', 'bank');
$array_lowercase = array_map('strtolower', $array);

array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $array);

print_r($array);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => Alpha
    [1] => atomic
    [2] => bank
    [3] => Beta
)

Voir aussi

  • usort() - Trie un tableau en utilisant une fonction de comparaison
  • Les fonctions de tri des tableaux

User Contributed Notes

dwalter at seznam dot cz 31-Oct-2019 08:45
My solution for multidimensional asociative array in my language, which respect all characters of alphabet
<?php
  setlocale(LC_COLLATE, 'cs_CZ.utf-8');
  $prijmeni_zamestnancu = array_column($DBzamestnanci, 'prijmeni');
  array_multisort($prijmeni_zamestnancu, SORT_ASC, SORT_LOCALE_STRING, $DBzamestnanci);
?>
qasastechnology at gmail dot com 13-Feb-2019 09:48
Case insensitive sorting
To perform a case insensitive sort

$array = [
     [
       'name' => 'b',
       'label' => 'ball'
    ],
     [
       'name' => 'a',
       'label' => 'apple'
    ],
     [
       'name' => 'l',
       'label' => 'Lighting'
    ],
     [
       'name' => 'w',
       'label' => 'With'
    ]

];

public function sortArray($array) {

        if (count($array)) {
            array_multisort(array_map(function($element) {
                return strtolower($element['label']);
            }, $array), SORT_ASC, $array);
        }

        return $array;
    }
Hayley Watson 09-Jul-2018 01:12
Thin wrapper around array_multisort() so that, when sorting an array of associative arrays, you can specify the columns to sort on by their name, instead of having to pull them out as explicit arrays. Note that you can sort on numerically-indexed columns too, provided you cast the index to a string first (otherwise they'll get confused with the SORT_* constants).

<?php
function array_multisort_by_column(&$array, ...$spec)
{
    return array_multisort($array, ...array_map(function($s)use($array)
    {
        return is_string($s) ? array_column($array, $s) : $s;
    }, $spec));
}
?>
ArkieGuy 10-Jan-2018 04:02
<?php

/**
 *  array_multisort wrapper function -- Sorts Data array on array of Keys
 *
 *  $data : This is the multidiminsional array to sort
 *  $keys : An array of arrays holding "Key" field names and optional Order / flags
 *
 *  Example:  $keys[2] = [ 'Animal', SORT_DESC, SORT_REGULAR | SORT_FLAG_CASE ];
 *            $keys[1] = [ 'Name' ];
 *
 *  Syntax:   if( multiSort( $data, $keys ) ) print_r( $data );
 *
 *  Returns TRUE on success or FALSE on failure.
 */
function multiSort( &$data, $keys ) {

  // Sort the Keys - this allows for passing in the key array out of order
  ksort( $keys );

  //  Walk Keys array building arguments to pass to call_user_function
  //  (must be indexed 0-n with n being the data to sort)
  foreach( $keys as $key ) {
    //  Walk through the list of key parameters
    foreach( $key as $element => $value )
        if( $element == 0 )
            //  Add an array containing the column values for the named $data column
            $args[] = array_column( $data, $value );
        else
            //  Add the inetger value passed in for the order / flags
            //  NOTE: if you try to send a string value (like from an INI) to
            //        array_multisort for sort_order or sort_flags, you get
            //        "Argument #x is expected to be an array or a sort flag".
            //        Casting to int solves this issue
            $args[] = (int)$value;
  }

  //  Add the array to be sorted to the arg list
  $args[] = &$data;

  //  Call array_multisort to sort the array in keys order
  return( call_user_func_array( 'array_multisort', $args ) );
}

/* Example */

echo "<PRE>";

//  Data array (can be associative array or you can use column number)
$data = [
  ['Name' => 'Brown', 'Animal' => 'Dog'],
  ['Name' => 'Smith', 'Animal' => 'Cat'],
  ['Name' => 'Jones', 'Animal' => 'Dog'],
  ['Name' => 'Jones', 'Animal' => 'Pig'],
  ['Name' => 'Bennett', 'Animal' => 'Cat'],
  ['Name' => 'Astor', 'Animal' => 'Cat'],
  ['Name' => 'Jones', 'Animal' => 'Cat'],
];

//  Array containing "keys" - each key is the name of the column and
//    optionally a sort order and / or  sort flags
//  Will sort by Name and then Animal because the keys array is key sorted
//    before it's used.
$keys[2] = [ 'Animal', SORT_DESC, SORT_REGULAR | SORT_FLAG_CASE ];
$keys[1] = [ 'Name' ];

//call the wrapper function
if( ! multiSort( $data, $keys ) )
    die( 'Sort Failed' );

print_r( $data );
?>
walterquez at gmail dot com 03-Jan-2018 06:11
To sort a simple multi dimensional array, use the array itself as the modifier. This will sort based on the first column. No need to write a custom function.

$data = array(
    array('volume' => 67, 'edition' => 2),
    array('volume' => 86, 'edition' => 1),
    array('volume' => 85, 'edition' => 6),
    array('volume' => 98, 'edition' => 2),
    array('volume' => 86, 'edition' => 6),
    array('volume' => 67, 'edition' => 7)
)

array_multisort($data, $data);
faugeron dot loic at gmail dot com 17-May-2016 07:14
Improving Example #3 (Sorting database results): using <?php array_column ?> (PHP >= 5.5) and <?php call_user_func_array ?> it becomes possible to build your sortings (sorting by one or many fields):

<?php

$data = [
    [
        'id' => '168ac7f8-c918-4e99-90ee-5d7590fe61ce',
        'name' => 'Arthur Dent',
    ],
    [
        'id' => 'e3ad45ee-7cae-4cca-bd7b-2eb6b57b6457',
        'name' => 'Ford Prefect',
    ],
    [
        'id' => 'a426aef2-19e2-412a-8339-5458cf6ae416',
        'name' => 'Trillian Astra',
    ],
];
$sortings = [
    [
        'field' => 'id',
        'direction' => SORT_DESC,
    ],
];

$args = [];
$key = 0;
foreach ($sortings as $sorting) {
    $args[$key] = array_column($data, $sorting['field']);
    $args[$key + 1] = $sorting['direction'];
    $key += 2;
}
$args[] = $data;
call_user_func_array('array_multisort', $args);

// $data is now sorted by ID in descending order.
?>
matt at bosc dot io 05-May-2016 09:02
One-liner function to sort multidimensionnal array by key, thank's to array_column

<?php

array_multisort (array_column($array, 'key'), SORT_DESC, $array);

?>
nospam at nospam dot com 23-Oct-2015 10:30
Super easy and simple way to sort a keyed multiarray while maintaining all associative keys, including numeric!

Preserves the original multiarray order if the sorting values are equal.

<?php
// sorts multiarray by a subarray value while preserving all keys, also preserves original order when the sorting values match
function maSort($ma = '', $sortkey = '', $sortorder = 1) { // sortorder: 1=asc, 2=desc
  if ($ma && is_array($ma) && $sortkey) { // confirm inputs
    foreach ($ma as $k=>$a) $temp["$a[$sortkey]"][$k] = $a; // temp ma with sort value, quotes convert key to string in case numeric float
    if ($sortorder == 2) { // descending
      krsort($temp);
    } else { // ascending
      ksort($temp);
    }
    $newma = array(); // blank output multiarray to add to
    foreach ($temp as $sma) $newma += $sma; // add sorted arrays to output array
    unset($ma, $sma, $temp); // release memory
    return $newma;
  }
}
?>
matt at wennersten dot org 29-Jul-2015 09:09
Many users have contributed nifty wrapper functions for generalizing array_multisort. However, some of us may just want a simple example that illustrates how to sort an arbitrary multi-dimensional array, such as a database result set, on a named field.

Consider an array of voice recordings (Clip objects) that are stored on a file system, and referenced via a database table:

    $fetchClipQuery = "SELECT * from voiceclips";
    if ( !$result = $this->db->query($fetchClipQuery) ) {
            $errormessage = $this->db->errno;
            $errormessage .= $this->db->error;
        } else {
            while($row = $result->fetch_assoc()){
                $clip = new Clip();
                $clip->populate($row['clipURL']);
                $clips[] = array("speaker"=>$row['speaker'],"duration"=>$row['duration'],"clip"=>$clip);
            }

//we now have an array called clips[] that looks like this:

array("speaker"=>"Obama","duration"=>"22:00","clip"=>...<some arbitrary object>...);

        //suppose we want to sort the array by speaker
        $sortkeyname = "speaker";
        //do the sort
        $sortkeyarray = array();
        foreach ($clips as $key => $row){
            $sortkeyarray[$key] = $row[$sortkeyname];
        }
        array_multisort($sortkeyarray, SORT_DESC, $clips);

           //suppose we want to sort the array by duration
        $sortkeyname = "duration";
        //do the sort
        $sortkeyarray = array();
        foreach ($clips as $key => $row){
            $sortkeyarray[$key] = $row[$sortkeyname];
        }
        array_multisort($sortkeyarray, SORT_DESC, $clips);

...etc.
jcharpentier at darkmira dot fr 23-Feb-2014 05:11
There is a lack of precision for the second example :

Example #2 Sorting multi-dimensional array

The explanation is :
"In this example, [...] The second will contain 1, 3, "2", 2, 1 (sorted as numbers, in descending order). "
This could be misunderstood cause a sort as numbers in descending order will be 1, 1, "2", 2, 3.

My proposal is as follows (in a best english should be great ^^) :
"In this example, [...] The second will contain 1, 3, "2", 2, 1 (sorted as well as first one, except for values 3 and "2" sorted as numbers, in descending order).  Because they are corresponding to the identical entries in the first array (100 and 100) which couldn't be sorted at first time."
Robert C 09-Jan-2014 12:11
Hi,

I would like to see the next code snippet to be added to http://nl3.php.net/array_multisort

Purpose: Sort a 2-dimensional array on some key(s)

Advantage of function:
- uses PHP's array_multisort function for sorting;
- it prepares the arrays (needed by array_multisort) for you;
- allows the sort criteria be passed as a separate array (It is possible to use sort order and flags.);
- easy to set/overwrite the way strings are sorted (case insensitive instead of case sensitive, which is PHP's default way of sorting);
- performs excellent

function MultiSort($data, $sortCriteria, $caseInSensitive = true)
{
  if( !is_array($data) || !is_array($sortCriteria))
    return false;
  $args = array();
  $i = 0;
  foreach($sortCriteria as $sortColumn => $sortAttributes)
  {
    $colList = array();
    foreach ($data as $key => $row)
    {
      $convertToLower = $caseInSensitive && (in_array(SORT_STRING, $sortAttributes) || in_array(SORT_REGULAR, $sortAttributes));
      $rowData = $convertToLower ? strtolower($row[$sortColumn]) : $row[$sortColumn];
      $colLists[$sortColumn][$key] = $rowData;
    }
    $args[] = &$colLists[$sortColumn];

    foreach($sortAttributes as $sortAttribute)
    {
      $tmp[$i] = $sortAttribute;
      $args[] = &$tmp[$i];
      $i++;
     }
  }
  $args[] = &$data;
  call_user_func_array('array_multisort', $args);
  return end($args);
}

Usage:

//Fill an array with random test data
define('MAX_ITEMS', 15);
define('MAX_VAL', 20);
for($i=0; $i < MAX_ITEMS; $i++)
  $data[] = array('field1' => rand(1, MAX_VAL), 'field2' => rand(1, MAX_VAL), 'field3' => rand(1, MAX_VAL) );

//Set the sort criteria (add as many fields as you want)
$sortCriteria =
  array('field1' => array(SORT_DESC, SORT_NUMERIC),
       'field3' => array(SORT_DESC, SORT_NUMERIC)
  );

//Call it like this:
$sortedData = MultiSort($data, $sortCriteria, true);
Patrick Adrichem 17-Oct-2013 08:08
If you do not have PHP 5.4 installed yet and you cannot use SORT_NATURAL. This function sorts arrays natural multi-dimensional based on key value

this function can be used for arrays as

array ( name => array( key => value ) )
and

array( name => value ).

arrays as array( name => array( key => value), name => value) are not supported.

<?php
        static function natcasesortRecursive(&$aArray)
        {
            $bHasArrays = false;
            foreach ($aArray as $sKey => &$mValue)
            {
                if (true === is_array($mValue))
                {
                    self::natcasesortRecursive($mValue);
                    $bHasArrays = true;
                }
            }
            if (true === $bHasArrays)
            {
                uksort($aArray, 'strnatcasecmp');
            }
            else
            {
                natcasesort($aArray);
            }
        }
?>
Magento-User 11-Oct-2013 03:25
When sorting an array of (complex) objects, this function can give you a "Fatal error:  Nesting level too deep" since it directly compares elements in later arrays if the elements in earlier ones compare equal. This can be worked around with the Flag-Parameter:
<?php
$sortKeys = array_map($extractKey, $lotsOfComplexObjects);
array_multisort($sortKeys, $lotsOfComplexObjects, SORT_ASC, SORT_NUMERIC);
?>
I'm replacing an 'uasort()'-call which is significantly slower since it leads to a lot of calls to the comparison-function but most of the objects involved are recursive.

If this 'trick' gives a wrong order,  you need a better key.
plugboard at web dot de 04-Sep-2012 02:56
multisort an Array of Objects:

example object [$object with array of objects]: (class: test)
----------------------------------

test Object (
  [Artikel] => Array (
      [0] => test Object (
            [id] => 1
            [title] => CCCC
         )
      [1] => test Object (
            [id] => 2
            [title] => AAAA
         )
      [2] => test Object (
            [id] => 3
            [title] => DDDD
         )
      [3] => test Object (
            [id] => 4
            [title] => BBBB
         )
   )
)

----------------------------------

Simple PHP function: sort_arr_of_obj()

<?php
// --------------------------------------

/*
* -------- function arguments --------
*   $array ........ array of objects
*   $sortby ....... the object-key to sort by
*   $direction ... 'asc' = ascending
* --------
*/

function sort_arr_of_obj($array, $sortby, $direction='asc') {

    $sortedArr = array();
    $tmp_Array = array();

    foreach($array as $k => $v) {
        $tmp_Array[] = strtolower($v->$sortby);
    }

    if($direction=='asc'){
        asort($tmp_Array);
    }else{
        arsort($tmp_Array);
    }

    foreach($tmp_Array as $k=>$tmp){
        $sortedArr[] = $array[$k];
    }

    return $sortedArr;

}

// --------------------------------------
?>

example call:
----------------------------------

<?php

$sorted->Artikel = sort_arr_of_obj($object->Artikel,'title','asc');

?>

example result: $sorted (class: test)
----------------------------------

test Object (
  [Artikel] => Array (
      [0] => test Object (
            [id] => 2
            [title] => AAAA
         )
      [1] => test Object (
            [id] => 4
            [title] => BBBB
         )
      [2] => test Object (
            [id] => 1
            [title] => CCCC
         )
      [3] => test Object (
            [id] => 3
            [title] => DDDD
         )

   )
)

-------------------------

:)
rnacken at gmail dot com 11-Feb-2012 11:59
When I was working on a search engine, that had to order the results in PHP by multiple arguments, I got stuck on the issue of multisort erasing your (numeral) indexes for a while. Sometimes, it is important to keep these indexes intact. In my case, the indexes were IDs and the values were a percentage of how relevant the object was, considering an earlier query.
e.g: $searchResult = (23 => 0.3,
                    102 => 0.5,
                    11 => 0.5,
                    340 => 0.5,
                    10 => 0.9);

I wanted to use array_multisort to first sort DESC on the IDs, and then on the values DESC. i.e. I wanted to show the highest values first, but in case of two (or more) objects with the same value, the higher ID would be shown first.
e.g: $searchResult = (10 => 0.9,
                   340 => 0.5,
                   102 => 0.5,
                   11 => 0.5,
                   23 => 0.3);

The easiest way to do this, I think, is:
<?php
    // create a 2-deep array with the values and keys of $searchResult
    $array = array(
               $searchResult,
               array_keys($searchResult)
    );
    // use multisort, first on the values, then on the keys. This will erase the indexes in the $searchResult array
    array_multisort($array[0], SORT_DESC,  $array[1], SORT_DESC);
    // get the ordered keys back in the $searchResult array
    $searchResult = array_combine($array[1], $array[0]);
    unset($array); //clear some memory
?>
nick ([AT]) nickyost ([DOT]) com 15-Sep-2011 03:36
USort function can be used to sort multidimensional arrays with almost no work whatsoever by using the individual values within the custom sort function.

This function passes the entire child element even if it is not a string. If it is an array, as would be the case in multidimensional arrays, it will pass the whole child array as one parameter.

Therefore, do something elegant like this:

<?php
     // Sort the multidimensional array
     usort($results, "custom_sort");
     // Define the custom sort function
     function custom_sort($a,$b) {
          return $a['some_sub_var']>$b['some_sub_var'];
     }
?>

This does in 4 lines what other functions took 40 to 50 lines to do. This does not require you to create temporary arrays or anything. This is, for me, a highly preferred solution over this function.

Hope it helps!
info at ichier dot de 28-Jul-2011 08:59
if you want to sort an array by columns, this is the function to do it.

<?php
function array_csort() {        //coded by Ichier2003
    $args = func_get_args();
    $marray = array_shift($args);
    $msortline = 'return(array_multisort(';
    foreach ($args as $arg) {
        $i++;
        if (is_string($arg)) {
            foreach ($marray as $row) {
                $sortarr[$i][] = $row[$arg];
            }
        } else {
            $sortarr[$i] = $arg;
        }
        $msortline .= '$sortarr['.$i.'],';
    }
    $msortline .= '$marray));';
    eval($msortline);
    return $marray;
}
?>
thierryzo at hotmail dot fr 29-Jun-2011 02:27
//A very simple way to sort arrays with this kind of structure.

<?php
    $myArray =array(
        array("NUMCIE" => "001","REF" => "RXL","COLOR" => "RED","L1" => 4),
        array("NUMCIE" => "001","REF" => "RXL","COLOR" => "BLUE","L1" => 6),
        array("NUMCIE" => "001","REF" => "RHQ","COLOR" => "RED","L1" => 4),
        array("NUMCIE" => "002","REF" => "RXL","COLOR" => "YELLOW","L1" => 8));

    foreach($myArray as $c=>$key) {
        $sort_numcie[] = $key['NUMCIE'];
        $sort_ref[] = $key['REF'];
        $sort_color[] = $key['COLOR'];
    }

    array_multisort($sort_numcie, SORT_ASC, $sort_ref, SORT_STRING, $myArray);
    print_r($myArray);

?>

//Result array

Array
(
    [0] => Array
        (
            [NUMCIE] => 001
            [REF] => RHQ
            [COLOR] => RED
            [L1] => 4
        )

    [1] => Array
        (
            [NUMCIE] => 001
            [REF] => RXL
            [COLOR] => BLUE
            [L1] => 6
        )

    [2] => Array
        (
            [NUMCIE] => 001
            [REF] => RXL
            [COLOR] => RED
            [L1] => 4
        )

    [3] => Array
        (
            [NUMCIE] => 002
            [REF] => RXL
            [COLOR] => YELLOW
            [L1] => 8
        )

)
Jaak Tamre 22-Mar-2011 06:42
I had a problem with sorting SimpleXMLElement list. I found a nice short solution.

I have an array of ticket objects: $ticketList = $xml->Tickets;

<?php
// Sort by ValidOnDate
$tickets = array();
$valid = array();
foreach ($ticketList as $row) {
    $tickets[] = $row;
    $valid[] = DateHandler::parseDate($row->ValidOnDate);
}
array_multisort($valid, SORT_DESC, $tickets);
?>

Just make an array of object items you want to sort by and a new array for the same objects which will be reordered like the first array.

Ps: my own parseDate(date) returns unix timestamp for different date formats.
jimpoz at jimpoz dot com 21-Oct-2010 02:26
I came up with an easy way to sort database-style results. This does what example 3 does, except it takes care of creating those intermediate arrays for you before passing control on to array_multisort().

<?php
function array_orderby()
{
    $args = func_get_args();
    $data = array_shift($args);
    foreach ($args as $n => $field) {
        if (is_string($field)) {
            $tmp = array();
            foreach ($data as $key => $row)
                $tmp[$key] = $row[$field];
            $args[$n] = $tmp;
            }
    }
    $args[] = &$data;
    call_user_func_array('array_multisort', $args);
    return array_pop($args);
}
?>

The sorted array is now in the return value of the function instead of being passed by reference.

<?php
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);

// Pass the array, followed by the column names and sort flags
$sorted = array_orderby($data, 'volume', SORT_DESC, 'edition', SORT_ASC);
?>
zequez at gmail dot com 06-May-2010 03:19
Easiest way I find out to sort an entire multidimensional array by one element of it:

<?php
$multiArray = Array(
    Array("id" => 1, "name" => "Defg"),
    Array("id" => 2, "name" => "Abcd"),
    Array("id" => 3, "name" => "Bcde"),
    Array("id" => 4, "name" => "Cdef"));
$tmp = Array();
foreach($multiArray as &$ma)
    $tmp[] = &$ma["name"];
array_multisort($tmp, $multiArray);
foreach($multiArray as &$ma)
    echo $ma["name"]."<br/>";

/* Outputs
    Abcd
    Bcde
    Cdef
    Defg
*/
?>

^-^
alexander dot v at zend dot com 20-Jan-2010 03:42
array_multisort works normally in php 5.3, but it forces arguments to be references.

It doesn't make differences for common array_multisort() usage, but makes "problems" for sorting variable number of arrays where call_user_func_array() function is involved.

So all sorting arrays have to be collected into new one as a references to array variables:

<?php
$sortArgs = array();

for (...) {
    ...
    $sortArgs[] = &$valuesArray;
    ...
}

call_user_func_array('array_multisort', $sortArgs);
?>

This (requiring arguments to be a reference) is not actually a problem since source array will not be sorted otherwise.

Important note!
Don't forget to destroy $valuesArray variable if you use it over each array_multisort() argument processing iteration.
If you don't do it, all array_multisort() arguments will contain the same array:

<?php
for (...) {
    ...
    $sortArgs[] = &$valuesArray;
    unset($valuesArray);
    ...
}
?>

And the last important thing :)
Collect sorting arrays somewhere. PHP 5.3 will transfer reference into value (when $valuesArray is destroyed) and you will get "Parameter 1 to array_multisort() expected to be a reference, value given" warning again otherwise.

Final code should look like this:

<?php
$sortArgs = array();
$sortFieldValues = array();

for (...) {
    ...
    $sortFieldValues[] = &$valuesArray;
    $sortArgs[] = &$valuesArray;
    unset($valuesArray);
    ...
}

call_user_func_array('array_multisort', $sortArgs);
?>
cagret at gmail dot com 20-Jun-2009 12:16
A more inuitive way of sorting multidimensional arrays using array_msort() in just one line, you don't have to divide the original array into per-column-arrays:

<?php

$arr1 = array(
    array('id'=>1,'name'=>'aA','cat'=>'cc'),
    array('id'=>2,'name'=>'aa','cat'=>'dd'),
    array('id'=>3,'name'=>'bb','cat'=>'cc'),
    array('id'=>4,'name'=>'bb','cat'=>'dd')
);

$arr2 = array_msort($arr1, array('name'=>SORT_DESC, 'cat'=>SORT_ASC));

debug($arr1, $arr2);

arr1:
    0:
        id: 1 (int)
        name: aA (string:2)
        cat: cc (string:2)
    1:
        id: 2 (int)
        name: aa (string:2)
        cat: dd (string:2)
    2:
        id: 3 (int)
        name: bb (string:2)
        cat: cc (string:2)
    3:
        id: 4 (int)
        name: bb (string:2)
        cat: dd (string:2)
arr2:
    2:
        id: 3 (int)
        name: bb (string:2)
        cat: cc (string:2)
    3:
        id: 4 (int)
        name: bb (string:2)
        cat: dd (string:2)
    0:
        id: 1 (int)
        name: aA (string:2)
        cat: cc (string:2)
    1:
        id: 2 (int)
        name: aa (string:2)
        cat: dd (string:2)

function array_msort($array, $cols)
{
    $colarr = array();
    foreach ($cols as $col => $order) {
        $colarr[$col] = array();
        foreach ($array as $k => $row) { $colarr[$col]['_'.$k] = strtolower($row[$col]); }
    }
    $eval = 'array_multisort(';
    foreach ($cols as $col => $order) {
        $eval .= '$colarr[\''.$col.'\'],'.$order.',';
    }
    $eval = substr($eval,0,-1).');';
    eval($eval);
    $ret = array();
    foreach ($colarr as $col => $arr) {
        foreach ($arr as $k => $v) {
            $k = substr($k,1);
            if (!isset($ret[$k])) $ret[$k] = $array[$k];
            $ret[$k][$col] = $array[$k][$col];
        }
    }
    return $ret;

}

?>
m dot michalczyk at gmail dot com 16-May-2009 03:45
Here is useful example based on za at byza dot it solution to sort multidimensional objects by any dimension.
za at byza dot it
<?php
/* Example structure */
class person{
    function __construct($firstName, $lastName, $title, $position){
        $this->firstName = $firstName;
        $this->lastName = $lastName;
        $this->title = new title($title);
        $this->position = new position($position);
    }
}
class title{
    function __construct($name){
        $this->name = $name;
    }

}
class position{
    function __construct($name){
        $this->name = $name;
    }

}

$array[] = new person('Piotr', 'Sobiepanek', 'b', 'b');
$array[] = new person('Piotr', 'Kowalski', 'b', 'a');
$array[] = new person('Piotr', 'Michalski', 'a', 'a');
$array[] = new person('Jozef', 'Smietana', 'a', 'b');
$array[] = new person('Jozef', 'Cmietana', 'a', 'b');
$array[] = new person('Marcin', 'Kondraciuk', 'c', 'b');
$array[] = new person('Maksym', 'Kondraciuk', 'c', 'd');
$array[] = new person('Ambrozy', 'Kondraciuk', 'c', 'd');
$array[] = new person('Alojzy', 'Kondraciuk', 'c', 'd');

array_sort($array, 'title->name', 'position->name', 'lastName');
print_r($array);

/* Source */

function hod(&$base, $path){
    $keys = explode("->", $path);
    $keys[0] = str_replace('$', '', $keys[0]);
    $expression = '$ret = ';
    $expression.= '$';
    foreach ($keys as $key){
        if (++$licz == 1){
            $expression.= 'base->';
        } else {
            $expression.= $key.'->';
        }
    }
    $expression = substr($expression, 0, -2);
    $expression.= ';';
    eval($expression);
    return $ret;
}

function array_sort_func($a,$b=NULL) {
   static $keys;
   if($b===NULL) return $keys=$a;
   foreach($keys as $k) {
      if($k[0]=='!') {
         $k=substr($k,1);
         if(hod($a, '$a->'.$k)!==hod($b, '$b->'.$k)) {
            return strcmp(hod($b, '$b->'.$k),hod($a, '$a->'.$k));
         }
      }
      else if(hod($a, '$a->'.$k)!==hod($b, '$b->'.$k)) {
         return strcmp(hod($a, '$a->'.$k),hod($b, '$b->'.$k));
      }
   }
   return 0;
}

function array_sort(&$array) {
   if(!$array) return $keys;
   $keys=func_get_args();
   array_shift($keys);
   array_sort_func($keys);
   usort($array,"array_sort_func");
}
?>
mech.cx 28-Mar-2009 12:04
I was (as near everyone here :-) looking to sort 2-dimensional arrays by certain fields in the associative sub-arrays.
What I didn't like about the documentation examples is that you need to loop through the input array to create sub arrays first, then use those in the function call.

"php a-t-the-r-a-t-e chir.ag" (http://www.php.net/manual/en/function.array-multisort.php#60401) wrote a quite cunning wrapper function, I rewrote it slightly, changing variable names and adding comments (for my sanity :-) mostly.
One snag I found: the input array is passed to array_multisort as last argument, but the changed array is not the one that is returned. Passing it by reference fixed that. This seems to be caused by the whole thing sitting inside the call_user_func_array, as shown below.

<?php

$points = array(1, 5, 2, 2);
$names  = array('peter', 'mike', 'john Zoo', 'john Ab');

$source = array (
  array ( 'points' => 1, 'name' => 'Peter'),
  array ( 'points' => 5, 'name' => 'Mike'),
  array ( 'points' => 2, 'name' => 'John Zoo'),
  array ( 'points' => 2, 'name' => 'John Ab')
);

call_user_func_array('array_multisort', array($points, SORT_DESC, SORT_NUMERIC, $names, SORT_ASC, SORT_STRING, $source)); // doesn't work
print_r($source);
call_user_func_array('array_multisort', array($points, SORT_DESC, SORT_NUMERIC, $names, SORT_ASC, SORT_STRING, &$source)); // works!
print_r($source);

// Call like arrayColumnSort('points', SORT_DESC, SORT_NUMERIC, 'name', SORT_ASC, SORT_STRING, $source);

// Slightly adapted from http://www.php.net/manual/en/function.array-multisort.php#60401

// arrayColumnSort(string $field, [options, ], string $field2, [options, ], .... , $array) /

//____________________
// arrayColumnSort() /
function arrayColumnSort() {
  $args  = func_get_args();
  $array = array_pop($args);
  if (! is_array($array)) return false;
  // Here we'll sift out the values from the columns we want to sort on, and put them in numbered 'subar' ("sub-array") arrays.
  //   (So when sorting by two fields with two modifiers (sort options) each, this will create $subar0 and $subar3)
  foreach($array as $key => $row) // loop through source array
    foreach($args as $akey => $val) // loop through args (fields and modifiers)
      if(is_string($val))             // if the arg's a field, add its value from the source array to a sub-array
        ${"subar$akey"}[$key] = $row[$val];
  // $multisort_args contains the arguments that would (/will) go into array_multisort(): sub-arrays, modifiers and the source array
  $multisort_args = array();
  foreach($args as $key => $val)
    $multisort_args[] = (is_string($val) ? ${"subar$key"} : $val);
  $multisort_args[] = &$array;   // finally add the source array, by reference
  call_user_func_array("array_multisort", $multisort_args);
  return $array;
}

?>
frank at overdrunk dot net 14-Jan-2009 02:38
I had a function to make a sort on a 2D array and I wanted to sort an array using a column that usualy contains numeric values but also strings.

Lets say we have this array :

Array (
  [0] => Array ( "name" = "12000" ),
  [1] => Array ( "name" = "113" ),
  [2] => Array ( "name" = "test 01" ),
  [3] => Array ( "name" = "15000 tests" ),
  [4] => Array ( "name" = "45" ),
  [5] => Array ( "name" = "350" ),
  [6] => Array ( "name" = "725" ),
  [7] => Array ( "name" = "hello" )
}

SORT_STRING whould have returned me this :

Array ( // Numeric values are not correctly sorted
  [0] => Array ( "name" = "113" ),
  [1] => Array ( "name" = "12000" ),
  [2] => Array ( "name" = "15000 tests" ),
  [3] => Array ( "name" = "350" ),
  [4] => Array ( "name" = "45" ),
  [5] => Array ( "name" = "725" ),
  [6] => Array ( "name" = "hello" ),
  [7] => Array ( "name" = "test 01" )
}

SORT_NUMERIC would have returned me this :

Array ( // String values are not sorted, just in the same order
  [0] => Array ( "name" = "test 01" ),
  [1] => Array ( "name" = "hello" ),
  [2] => Array ( "name" = "45" ),
  [3] => Array ( "name" = "113" ),
  [4] => Array ( "name" = "350" ),
  [5] => Array ( "name" = "725" ),
  [6] => Array ( "name" = "12000" ),
  [7] => Array ( "name" = "15000 tests" ),
}

So I've made this hybrid code which combines the best of both worlds by merging content sorted either way according to the first caracter of the string:

<?php
/**
 * Sorts an array according to a specified column
 * Params : array  $table
 *          string $colname
 *          bool   $numeric
 **/
function sort_col($table, $colname) {
  $tn = $ts = $temp_num = $temp_str = array();
  foreach ($table as $key => $row) {
    if(is_numeric(substr($row[$colname], 0, 1))) {
      $tn[$key] = $row[$colname];
      $temp_num[$key] = $row;
    }
    else {
      $ts[$key] = $row[$colname];
      $temp_str[$key] = $row;
    }
  }
  unset($table);

  array_multisort($tn, SORT_ASC, SORT_NUMERIC, $temp_num);
  array_multisort($ts, SORT_ASC, SORT_STRING, $temp_str);
  return array_merge($temp_num, $temp_str);
}
?>

It would return something like this :

Array (
  [2] => Array ( "name" = "45" ),
  [3] => Array ( "name" = "113" ),
  [4] => Array ( "name" = "350" ),
  [5] => Array ( "name" = "725" ),
  [6] => Array ( "name" = "12000" ),
  [7] => Array ( "name" = "15000 tests" ),
  [1] => Array ( "name" = "hello" ),
  [0] => Array ( "name" = "test 01" ),
}
Zbigniew Heintze http://bigweb.pl 26-Nov-2008 11:36
<?php
/**
 * Sort DB result
 *
 * @param array $data Result of sql query as associative array
 *
 * Rest of parameters are optional
 * [, string $name  [, mixed $name or $order  [, mixed $name or $mode]]]
 * $name string - column name i database table
 * $order integer - sorting direction ascending (SORT_ASC) or descending (SORT_DESC)
 * $mode integer - sorting mode (SORT_REGULAR, SORT_STRING, SORT_NUMERIC)
 *
 * <code>
 * <?php
 * // You can sort data by several columns e.g.
 * $data = array();
 * for ($i = 1; $i <= 10; $i++) {
 *     $data[] = array( 'id' => $i,
 *                      'first_name' => sprintf('first_name_%s', rand(1, 9)),
 *                      'last_name' => sprintf('last_name_%s', rand(1, 9)),
 *                      'date' => date('Y-m-d', rand(0, time()))
 *                  );
 * }
 * $data = sortDbResult($data, 'date', SORT_DESC, SORT_NUMERIC, 'id');
 * printf('<pre>%s</pre>', print_r($data, true));
 * $data = sortDbResult($data, 'last_name', SORT_ASC, SORT_STRING, 'first_name', SORT_ASC, SORT_STRING);
 * printf('<pre>%s</pre>', print_r($data, true));
 * ?>
 * </code>
 *
 * @return array $data - Sorted data
 */
function sortDbResult(array $data /*$name, $order, $mode*/) {
    $_argList = func_get_args();
    $_data = array_shift($_argList);
    if (empty($_data)) {
        return $_data;
    }
    $_max = count($_argList);
    $_params = array();
    $_cols = array();
    $_rules = array();
    for ($_i = 0; $_i < $_max; $_i += 3)
    {
        $_name = (string) $_argList[$_i];
        if (!in_array($_name, array_keys(current($_data)))) {
            continue;
        }
        if (!isset($_argList[($_i + 1)]) || is_string($_argList[($_i + 1)])) {
            $_order = SORT_ASC;
            $_mode = SORT_REGULAR;
            $_i -= 2;
        } else if (3 > $_argList[($_i + 1)]) {
            $_order = SORT_ASC;
            $_mode = $_argList[($_i + 1)];
            $_i--;
        } else {
            $_order = $_argList[($_i + 1)] == SORT_ASC ? SORT_ASC : SORT_DESC;
            if (!isset($_argList[($_i + 2)]) || is_string($_argList[($_i + 2)])) {
                $_mode = SORT_REGULAR;
                $_i--;
            } else {
                $_mode = $_argList[($_i + 2)];
            }
        }
        $_mode = $_mode != SORT_NUMERIC
                    ? $_argList[($_i + 2)] != SORT_STRING ? SORT_REGULAR : SORT_STRING
                    : SORT_NUMERIC;
        $_rules[] = array('name' => $_name, 'order' => $_order, 'mode' => $_mode);
    }
    foreach ($_data as $_k => $_row) {
        foreach ($_rules as $_rule) {
            if (!isset($_cols[$_rule['name']])) {
                $_cols[$_rule['name']] = array();
                $_params[] = &$_cols[$_rule['name']];
                $_params[] = $_rule['order'];
                $_params[] = $_rule['mode'];
            }
            $_cols[$_rule['name']][$_k] = $_row[$_rule['name']];
        }
    }
    $_params[] = &$_data;
    call_user_func_array('array_multisort', $_params);
    return $_data;
}
?>
matt at idizinc dot com 23-Oct-2008 11:47
I looked on some forms for an answer to this simple problem and couldn't find one so I came up with a solution that may help in some situations.

How do you sort an array by a field in that array and resolve numeric ties randomly?

Code:
<?php

foreach($list as $temp_list)
{
   $sort_aux[] = ($temp_list['column_to_sort_by']+(rand(1, 9)/10));
}
array_multisort($sort_aux, SORT_NUMERIC, $list);

?>

Example:

$list[]=array('name'=>'Tom', 'score'=>3);
$list[]=array('name'=>'Sam', 'score'=>3);
$list[]=array('name'=>'Joey', 'score'=>1);

Explanation:
I took an existing example found above that shows how to sort an array by one of it's columns/fields.
I just added: "+(rand(1,9)/10)" To randomly add .1 through .9 to their score to resolve the tie. (Obviously this specific example only works if you're sorting by an integer... so you may need to modify it to suit your needs.)

Hope this helps someone.
isp dot php at spspft dot de 19-Oct-2008 05:44
I would like to report a kind of confusion that arose with the message

Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of array_multisort(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file...

from a line like this:

array_multisort (&$keyarr, &$arr );// sort against this keys

This message is not easily switched off by changing the error reporting level because it's produced at parsinig time -- not execution time.

I think this message is misleading because the arguments are passed by reference ANYWAY in array_multisort.

Anybody encountering this message should know that nothing has to be done, except deleting the ampersands (&).
I was tricked by this message because of couse I wanted to have the *sorted* array back. And couldn't find the ini file nor the declaration of array_multisort.
I think in this description of array_multisort the call by reference should be listed in the definition.

Hope this helps someone
seiffs_at_centrum-dot-cz 18-Aug-2008 08:53
There have to be two corrections to the php_multisort($data,$keys)

    // Sort Expression
    $i=0;
    $sort='';  //here
    foreach ($keys as $k){
      if($i>0){$sort.=',';}
      $sort.='$cols[\''.$k['key'].'\']'; //and here
      if($k['sort']){$sort.=',SORT_'.strtoupper($k['sort']);}
      if($k['type']){$sort.=',SORT_'.strtoupper($k['type']);}
      $i++;
    }
Jon L. -- intel352 [AT] gmail [DOT] com 26-Feb-2007 08:27
This is my solution for a dynamic multisort, using POST values. This doesn't account for a need to sort by multiple columns at once, but could be modified for that purpose.

<?php
    /**
    * @desc You really should validate the posted sort direction against a list of valid possibilities.
    *         Options are SORT_ASC, SORT_DESC, etc, as shown in the documentation for array_multisort
    */
    $sort['direction'] = $_POST['sort_direction'] ? $_POST['sort_direction'] : 'SORT_ASC';
    $sort['field']       = $_POST['sort_field'] ? $_POST['sort_field'] : 'value';

    $array_to_sort = array();
    $array_to_sort['TestCase1'] = array('name'=>'Test1','value'=>'218');
    $array_to_sort['TestCase2'] = array('name'=>'Test2','value'=>'10');
    $array_to_sort['TestCase3'] = array('name'=>'Test3','value'=>'64');

    /**
    * @desc Build columns using the values, for sorting in php
    */
    $sort_arr = array();
    foreach($array_to_sort AS $uniqid => $row){
        foreach($row AS $key=>$value){
            $sort_arr[$key][$uniqid] = $value;
        }
    }

    print '<b>Before sorting</b>: <br> <pre>';
    print_r($array_to_sort);
    print '</pre>';

    if($sort['direction']){
        array_multisort($sort_arr[$sort['field']], constant($sort['direction']), $array_to_sort);
    }

    print '<b>After sorting</b>: <br> <pre>';
    print_r($array_to_sort);
    print '</pre>';

?>

This example prints out:

Before sorting:

Array
(
    [TestCase1] => Array
        (
            [name] => Test1
            [value] => 218
        )

    [TestCase2] => Array
        (
            [name] => Test2
            [value] => 10
        )

    [TestCase3] => Array
        (
            [name] => Test3
            [value] => 64
        )

)

After sorting:

Array
(
    [TestCase2] => Array
        (
            [name] => Test2
            [value] => 10
        )

    [TestCase3] => Array
        (
            [name] => Test3
            [value] => 64
        )

    [TestCase1] => Array
        (
            [name] => Test1
            [value] => 218
        )

)
brettz9 throu gh yah 14-Sep-2006 12:04
Often, one may have a group of arrays which have parallel data that need to be kept associated with each other (e.g., the various attribute values of a group of elements might be stored in their own arrays). Using array_multisort as is, by specifying additional fields, it is possible, as in the documentation example cited below, that this association will be lost.

To take this example set of data from the documentation:
<?php
$ar1 = array("10", 100, 100, "a");
$ar2 = array(1, 3, "2", 1);
?>

The example goes on to sort it this way:
<?php
array_multisort($ar1, $ar2);
?>

In this case, although the "10" remains associated with the first '1' after being sorted, the "2" and '3' are reversed from their original order.

In order to sort by one field only (yet still have the other array(s) being correspondingly sorted), one can use array_keys (which makes an array out of the keys) to ensure that no further sub-sorting is performed. This works because array_keys is making an array for which no duplicates can exist (since keys will be unique), and thus, the subsequent fields will have no relevance as far as subsorting.

So, using the above data, we can perform this sort instead:
<?php
$ar3 = array_keys($ar1);
array_multisort($ar1, $ar3, $ar2);
?>

which, when $ar1 and $ar2 are dumped gives:

array(4) {
  [0]=> string(2) "10"
  [1]=> string(1) "a"
  [2]=> int(100)
  [3]=> int(100)
}
array(4) {
  [0]=>  int(1)
  [1]=>  int(1)
  [2]=>  int(3)
  [3]=>  string(1) "2"
}
KES http://kes.net.ua 27-Jul-2006 05:30
<?
//sort by second column then first one
$orderBy=array('0'=>'desc', 'first'=>'asc');

function KES_cmp($a, $b) {
  global $orderBy;
  $result= 0;
  foreach( $orderBy as $key => $value ) {
    if( $a[$key] == $b[$key] ) continue;
    $result= ($a[$key] < $b[$key])? -1 : 1;
    if( $value=='desc' ) $result= -$result;
    break;
    }
  return $result;
  }

$result= array();
$result[]= array( 'first'=>6, 2);
$result[]= array( 'first'=>3, 2);
$result[]= array( 'first'=>1, 3);
$result[]= array( 'first'=>1, 2);
$result[]= array( 'first'=>6, 1);

print "<b>Source</b>";
print_r($result);

usort($result, 'KES_cmp');
print "<b>Result</b>";
print_r($result);
?>
scott - evolove - net - work it out 22-Mar-2006 07:51
A very simple way to sort an array of associative arrays by some value is to use usort.

I needed to sort an array of 20 data structures by their 'distance' value:

Array
(
    [0] => Array
        (
            [blahblah] => blahblah
            [distance] => 6
        )

    [1] => Array
        (
          you get the idea....

Here's the code:

--------------------
usort($results, "distributor_compare");

/**
 * usort callback
 */
function distributor_compare($a, $b) {
    $adist = intval($a['distance']);
    $bdist = intval($b['distance']);

    if ($adist == $bdist) {
     return 0;
     }
     return ($adist < $bdist) ? -1 : 1;
}
--------------------
php a-t-the-r-a-t-e chir.ag 05-Jan-2006 02:10
Re: phu at kungphu, 19-Dec-2005 11:36

asort($test) will not let me specify which columns to sort ASC/DESC, NUMERIC/STRING etc.

I have data similar to what you specified. Now I want to sort $test by points DESC and name ASC. Here's my function that does it, based on suggestions on this page. It uses array_multisort (and hence acts just like it: preserving string-keys etc.)

<?php

  function arrayColumnSort()
  {
    $n = func_num_args();
    $ar = func_get_arg($n-1);
    if(!is_array($ar))
      return false;

    for($i = 0; $i < $n-1; $i++)
      $col[$i] = func_get_arg($i);

    foreach($ar as $key => $val)
      foreach($col as $kkey => $vval)
        if(is_string($vval))
          ${"subar$kkey"}[$key] = $val[$vval];

    $arv = array();
    foreach($col as $key => $val)
      $arv[] = (is_string($val) ? ${"subar$key"} : $val);
    $arv[] = $ar;

    call_user_func_array("array_multisort", $arv);
    return $ar;
  }

  $test["pete"]['points']=1;
  $test["pete"]['name']='Peter';

  $test["mike"]['points']=5;
  $test["mike"]['name']='Mike';

  $test["zoo"]['points']=2;
  $test["zoo"]['name']='John Zoo';

  $test["ab"]['points']=2;
  $test["ab"]['name']='John Ab';

  $test1 = $test;

  asort($test1);

  $test2 = arrayColumnSort("points", SORT_DESC, SORT_NUMERIC, "name", SORT_ASC, SORT_STRING, $test);

  print_r($test1); // asort
  print_r($test2); // arrayColumnSort

?>

Output from asort:

Array
(
    [pete] => Array
        (
            [points] => 1
            [name] => Peter
        )

    [ab] => Array
        (
            [points] => 2
            [name] => John Ab
        )

    [zoo] => Array
        (
            [points] => 2
            [name] => John Zoo
        )

    [mike] => Array
        (
            [points] => 5
            [name] => Mike
        )

)

Output from arrayColumnSort:

Array
(
    [mike] => Array
        (
            [points] => 5
            [name] => Mike
        )

    [ab] => Array
        (
            [points] => 2
            [name] => John Ab
        )

    [zoo] => Array
        (
            [points] => 2
            [name] => John Zoo
        )

    [pete] => Array
        (
            [points] => 1
            [name] => Peter
        )

)
RWC 25-Sep-2005 01:45
This is the simpler version of the function by AlberT.

A lot of times you have got an array like this:

$test[0]['name']='Peter';
$test[0]['points']=1;

$test[1]['name']='Mike';
$test[1]['points']=5;

$test[2]['name']='John';
$test[2]['points']=2;

You just want to sort on the index in the second dimension, ie. on points in the above example.

You can use the function below and call it like this:

$test = multi_sort($test, $key = 'points');

function multi_sort($array, $akey)
{
  function compare($a, $b)
  {
     global $key;
     return strcmp($a[$key], $b[$key]);
  }
  usort($array, "compare");
  return $array;
}

Note: to be able to use $key in the compare function, it can not simply be passed as a parameter. It has to be declared global and set somewhere outside of compare().
joao at intrasystems dot com dot br 07-Apr-2005 12:27
Exemple of sorting multi-dimensional arrays by one of it's fields:

$result[0]['nome']='Joao';
$result[0]['order']=5;
$result[1]['nome']='Pedro';
$result[1]['order']=1;
$result[2]['nome']='Marcelo';
$result[2]['order']=3;

foreach($result as $res)
     $sortAux[] = $res['order'];

array_multisort($sortAux, SORT_ASC, $result);

print_r($result);

produces:

Array
(
    [0] => Array
        (
            [nome] => Pedro
            [order] => 1
        )

    [1] => Array
        (
            [nome] => Marcelo
            [order] => 3
        )

    [2] => Array
        (
            [nome] => Joao
            [order] => 5
        )

)
meddle at dzygn.com 05-Oct-2004 07:40
If you want to sort a multidomensional array by key name you cannot use array_multisort. ie: for an array named $archivos that prints like this:

Array
(
    [0] => Array
        (
            [index] => 0
            [name] => test
        )

    [1] => Array
        (
            [index] => 0
            [name] => watertaxi.jpg
        )

    [2] => Array
        (
            [index] => 0
            [name] => 2_0003.JPG
        )

    [3] => Array
        (
            [index] => 0
            [name] => 24A_0025.JPG
        )

    [4] => Array
        (
            [index] => 1
            [name] => _CIMG3501.JPG
        )

)

If I wanted to order by "name" I'd use:

function comparar($a, $b) {
        return strnatcasecmp($a["name"], $b["name"]);
}
usort($archivos, "comparar");

This function performs a case insensitive string comparison using a "natural order" algorithm (strnatcasecmp), resulting in:

Array
(
    [0] => Array
        (
            [index] => 0
            [name] => 2_0003.JPG
        )

    [1] => Array
        (
            [index] => 0
            [name] => 24A_0025.JPG
        )

    [2] => Array
        (
            [index] => 0
            [name] => test
        )

    [3] => Array
        (
            [index] => 0
            [name] => watertaxi.jpg
        )

    [4] => Array
        (
            [index] => 1
            [name] => _CIMG3501.JPG
        )

)


Complète un tableau avec une valeur jusqu'à la longueur spécifiée

  • « array_multisort
  • array_pop »
  • PHP Manual
  • Fonctions sur les tableaux
  • Complète un tableau avec une valeur jusqu'à la longueur spécifiée

array_pad

(PHP 4, PHP 5, PHP 7, PHP 8)

array_pad — Complète un tableau avec une valeur jusqu'à la longueur spécifiée

Description

array_pad ( array $array , int $length , mixed $value ) : array

array_pad() retourne une copie du tableau array complétée jusqu'à la taille de length avec la valeur value. Si length est positif, alors le tableau est complété à droite, s'il est négatif, il est complété à gauche. Si la valeur absolue de length est plus petite que la taille du tableau array, alors le tableau n'est pas complété. Il est possible d'ajouter au maximum 1048576 éléments d'un seul coup.

Liste de paramètres

array

Tableau initial de valeurs à compléter.

length

Nouvelle taille du tableau.

value

Valeur à insérer si l'argument array est plus petit que l'argument length.

Valeurs de retour

Retourne une copie du tableau array complétée jusqu'à la taille de length avec la valeur value. Si length est positif, alors le tableau est complété à droite, s'il est négatif, il est complété à gauche. Si la valeur absolue de length est plus petite que la taille du tableau array, alors le tableau n'est pas complété.

Exemples

Exemple #1 Exemple avec array_pad()

<?php
$input = array(12, 10, 9);

$result = array_pad($input, 5, 0);
// Le résultat est : array(12, 10, 9, 0, 0)

$result = array_pad($input, -7, -1);
// Le résultat est : array(-1, -1, -1, -1, 12, 10, 9)

$result = array_pad($input, 2, "noop");
// pas complété
?>

Voir aussi

  • array_fill() - Remplit un tableau avec une même valeur
  • range() - Crée un tableau contenant un intervalle d'éléments

User Contributed Notes

slava-san at mail dot ru 06-Jul-2013 10:58
// insert element to array
function array_insert(&$arr, $pos, $new_el=null) {
    $arraypad = array_pad($arr, count($arr)+1, 0);
    for ($i=count($arr)-1; $i>=$pos; $i--) {
        $arr[$i+1] = $arr[$i];
        if ($i == $pos) {
            $arr[$i] = $new_el;
        }
    }
}

$digits = array();
$digits[0] = 0;
$digits[1] = 1;
$digits[2] = 2;
$digits[3] = 3;
$digits[4] = 4;
$digits[5] = 5;
echo "was: "; var_dump($digits);

array_insert($digits, 3, 100);
echo "new: "; var_dump($digits);
sonu50imedbvu at gmail dot com(Sonu Jaiswal) 12-Jan-2011 12:53
Just an info about the value of "$pad_size" ,

If we set the value of "$pad_size" from -3 to 3,

It will produce the output like:

<?php
$result = array_pad($input, -3, "noop");
//result is array(12, 10, 9)

$result = array_pad($input, 3, "noop");
//result is array(12, 10, 9)
?>

means array will remain the same.
tugla 18-Dec-2008 09:23
Beware, if you try to pad an associative array using numeric keys, your keys will be re-numbered.

<?php
$a = array('size'=>'large', 'number'=>20, 'color'=>'red');
print_r($a);
print_r(array_pad($a, 5, 'foo'));

// use timestamps as keys
$b = array(1229600459=>'large', 1229604787=>20, 1229609459=>'red');
print_r($b);
print_r(array_pad($b, 5, 'foo'));
?>

yields this:
------------------
Array
(
    [size] => large
    [number] => 20
    [color] => red
)
Array
(
    [size] => large
    [number] => 20
    [color] => red
    [0] => foo
    [1] => foo
)
Array
(
    [1229600459] => large
    [1229604787] => 20
    [1229609459] => red
)
Array
(
    [0] => large
    [1] => 20
    [2] => red
    [3] => foo
    [4] => foo
)
hk, StrApp Bussiness Solutions 08-Jan-2007 02:15
A simple example for array_pad()

the syntax is as follows: array_pad(array(), (+/-)int, value)

where "array" is the array to which the value is to be added,

"(+/-) int" is a value that decides the length of the array(it should be greater than the length of the array.
if its a negative number then the value will be added at the left of the array else it will be added to the right.

"values" denotes the value to be added to the array

lets try an example:

<?php

$digits = array();
$digits[0] = 1;
$digits[1] = 2;
$digits[2] = 3;
$arraypad = array_pad($digits, -4, "0");
print_r($arraypad);

?>

output:

Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 )
oaev at mail dot ru 21-Oct-2004 11:48
Easy way to get an array contains 5 random numbers from 0 to 9:

$rand_arr = array_rand( array_pad( array(), 10, 1 ), 5 );
28-Feb-2004 09:00
One way to initialize a 20x20 multidimensional array.

<?php
$a = array();
$b = array();
$b = array_pad($b,20,0);
$a = array_pad($a,20,$b);
?>
mwwaygoo at hotmail dot com 16-Jan-2004 08:02
little older, a little wiser.

ksort() will order the array back into its normal order again
so:

<?php
$myArr = array(2 => 'two', 4 => 'four');

$newArr = array_pad(array(), 6, 'FILLED');
$newArr =$myArr+$newArr;
ksort($newArr);
?>

Will give :
Array ( [0] => FILLED [1] => FILLED [2] => two [3] => FILLED [4] => four [5] => FILLED )
goffrie at sympatico dot ca 23-Mar-2003 05:06
To daarius - you mean you have...

[2]=>"two"
[3]=>"three"

and you want...

[0]=>"FILLED"
[1]=>"FILLED"
[2]=>"two"
[3]=>"three"
[4]=>"FILLED"
[5]=>"FILLED"

If so, then the following code...

<?php
$array = array(2 => "two", 3 => "three");
$array = array_pad($array, count($array)+2, "FILLED");
$num = -(count($array)+2);
$array = array_pad($array, $num, "FILLED");
print_r($array);
?>

will return:
Array ( [0] => FILLED [1] => FILLED [2] => two [3] => three [4] => FILLED [5] => FILLED )
The ordering should be okay,...
mwwaygoo at hotmail dot com 19-Sep-2002 09:39
OR you could do this

<?php
$myArr = array(2 => 'three', 3 => 'four');

$newArr = array_pad(array(), 4, 'FILLED');
$newArr =$myArr+$newArr;
?>

This gives your desired result BUT the ordering is a little wierd, because of the order they were added. Indexes are okay though and that is what you wanted.

print_r($newArr) outputs
Array ( [2] => three [3] => four [0] => FILLED [1] => FILLED )

hope this helps
daarius at hotmail dot com 23-Jul-2002 07:36
yes that is true. But, if the index of the array is 2=two, 3=three

and i want 4 more keys to be filled. But, not just filled anywhere, but i want to maintain the key index.

so, i would like to have 0=FILLED, 1=FILLED ... 4=FILLED, 5=FILLED

now i got 4 more keys padded with my string.

We can do this "if" we know the missing keys, but if we dont, then it would be nice for array_pad() or perhaps some new function to do this?

obviously we can achive this by looping through the array using array_key_exists(), and if you dont find the key, simply create + fill it.
regards,
Daarius...
scott*hurring.com 19-Jul-2002 04:20
to the previous commenter -- if you read the manual entry, you'd see that a negative pad_size will put the pad values at the front of the array.


Dépile un élément de la fin d'un tableau

  • « array_pad
  • array_product »
  • PHP Manual
  • Fonctions sur les tableaux
  • Dépile un élément de la fin d'un tableau

array_pop

(PHP 4, PHP 5, PHP 7, PHP 8)

array_pop — Dépile un élément de la fin d'un tableau

Description

array_pop ( array &$array ) : mixed

array_pop() dépile et retourne la valeur du dernier élément du tableau array, le raccourcissant d'un élément.

Note: Cette fonction remet le pointeur au début du tableau d'entrée (équivalent de reset()).

Liste de paramètres

array

Le tableau duquel on récupère la valeur.

Valeurs de retour

Retourne la valeur du dernier élément du tableau array. Si array est vide (ou n'est pas un tableau), null sera retourné.

Erreurs / Exceptions

Cette fonction émettra une erreur de niveau E_WARNING quand utilisée sur une variable qui n'est pas un tableau.

Exemples

Exemple #1 Exemple avec array_pop()

<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_pop($stack);
print_r($stack);
?>

Après cela, $stack n'aura plus que 3 éléments :

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
)

et raspberry sera assigné à $fruit.

Voir aussi

  • array_push() - Empile un ou plusieurs éléments à la fin d'un tableau
  • array_shift() - Dépile un élément au début d'un tableau
  • array_unshift() - Empile un ou plusieurs éléments au début d'un tableau

User Contributed Notes

Anonymous 06-Nov-2015 04:02
Let's "do stuff" with array_pop()

<?php

$dependecyInjection = ['globalState' => 'isHorrible'];

$workQueue = array_reverse($workQueue); // O(n)
// While we have stuff to do..... = [[ {function}, $params.... ], [], []...]
while (!empty($workQueue)) {

  // O(1) : And resize array. (maybe also memory size ?)
  $work = array_pop($workQueue);

  // If not `muted`, invoke the worker function....
  if (isset($work[0])) {
    $processor = array_shift($work);
    if ($moreWork = $processor->__invoke($work, $dependecyInjection)) { // <== Do stuff.
      // O(n) : add new stuff to the END of array ! (FIFO)
      $outputCommands += array_reverse($moreWork);
    }
  }
}
Anonymous 28-Feb-2014 08:21
Strict Standards will be thrown out if you put exploded array in array_pop:
<?php
$a = array_pop(explode(",", "a,b,c"));
echo $a;
?>

You will see:
PHP Strict Standards:  Only variables should be passed by reference in - on line 2

Strict Standards: Only variables should be passed by reference in - on line 2
c

Notice that, you should assign a variable for function explode, then pass the variable reference into array_pop to avoid the Strict Standard warning.
elad dot yosifon at gmail dot com 10-Aug-2013 06:45
Notice:
the complexity of array_pop() is O(1).
the complexity of array_shift() is O(n).
array_shift() requires a re-index process on the array, so it has to run over all the elements and index them.
qeremy 07-Mar-2012 11:26
For the sake of array_unshift()
:)

<?php
function array_unpop(&$arr) {
    $args = func_get_args(); unset($args[0]);
    $tarr = array();
    foreach ($args as $arg) {
        $tarr[] = $arg;
    }
    $arr = array_merge($arr, $tarr);
}

$queue = array("orange", "banana");
array_unpop($queue, "apple", "raspberry");
print_r($queue);
?>

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
    [3] => raspberry
)
Igor Feghali 04-Feb-2009 09:18
Beware that array_pop() returns a copy of the element (even if the array element is a reference). That means you will get different results on PHP 4 and 5 when dealing with objects.

<?php
$a = new stdClass();
$a->foo = 'bar';

$arr = array(&$a);
$b = array_pop($arr);

$b->foo = 'baz';

var_dump($a);
?>

Output of PHP 5.2.8:
object(stdClass)#1 (1) {
  ["foo"]=>
  string(3) "baz"
}

Output of PHP 4.4.9:
object(stdClass)(1) {
  ["foo"]=>
  string(3) "bar"
}

For more information please refer to:
http://br2.php.net/manual/en/language.oop5.references.php
mcgroovin at gmail dot com 23-Oct-2008 12:13
I wrote a simple function to perform an intersect on multiple (unlimited) arrays.

Pass an array containing all the arrays you want to compare, along with what key to match by.

<?php
function multipleArrayIntersect($arrayOfArrays, $matchKey)
{
    $compareArray = array_pop($arrayOfArrays);

    foreach($compareArray AS $key => $valueArray){
        foreach($arrayOfArrays AS $subArray => $contents){
            if (!in_array($compareArray[$key][$matchKey], $contents)){
                unset($compareArray[$key]);
            }
        }
    }

    return $compareArray;
}
?>
sonetti at hotmail dot com 05-Feb-2008 01:15
@smp_info
I think you are still tired. What would be wrong with:

<?php
$array = array('one', 'two', 'three', 'four');

//pop the last element off
array_pop($array);

//$array == array('one', 'two', 'three');
?>

As the documentation clearly notes, array_pop() not only returns the last element, but actually removes it from the array wich is passed by reference. Calling array_diff is a waste of resources.
Orsi 10-Jan-2008 07:05
Hi,

Here is a simple function which delete one element from the array (with value):
<?php
/*
* This function deletes the given element from a one-dimension array
* Parameters: $array:    the array (in/out)
*             $deleteIt: the value which we would like to delete
*             $useOldKeys: if it is false then the function will re-index the array (from 0, 1, ...)
*                          if it is true: the function will keep the old keys
* Returns true, if this value was in the array, otherwise false (in this case the array is same as before)
*/
function deleteFromArray(&$array, $deleteIt, $useOldKeys = FALSE)
{
    $tmpArray = array();
    $found = FALSE;
    foreach($array as $key => $value)
    {
        if($value !== $deleteIt)
        {
            if(FALSE === $useOldKeys)
            {
                $tmpArray[] = $value;
            }
            else
            {
                $tmpArray[$key] = $value;
            }
        }
        else
        {
            $found = TRUE;
        }
    }

    $array = $tmpArray;

    return $found;
}
?>

Maybe it will help somebody...
doyley3731 at gmail dot com 31-Oct-2007 04:37
I had a problem when using this function because my array was made up entirley of numbers, so I have made my own function.  Hopefully it will be useful to somebody.

function array_trim_end($array){

$num=count($array);
$num=$num-1;
unset($array[$num]);

return $array;
}
rmondragon at gmail dot com 07-Jun-2005 02:03
In a previous example ...
<?php
function array_trim ( $array, $index ) {
   if ( is_array ( $array ) ) {
     unset ( $array[$index] );
     array_unshift ( $array, array_shift ( $array ) );
     return $array;
     }
   else {
     return false;
     }
   }
?>

This have a problem. if u unset the last value and then use
<?
array_unshift ( $array, array_shift ( $array ) );
?>

will return a :  Array ( [0] => )
so u can fix it using...

<?php
if (count($array) > 0) array_unshift ( $values, array_shift ( $values ) );
?>

good luck ;)
15-Dec-2004 08:29
strrchr is a lot more useful than the other example using array_pop for finding the extension of a file. For example:

<?php
$ext = strrchr($filename, ".");
?>

$ext will contain the extension of the file, including a ".", if the file has an extension, and FALSE if the file has no extension. If the file has multiple extensions, such as "filename.tar.gz", then this construction will just return the last extension.
eddie at metafoundry dot com 25-Nov-2004 08:35
Quick way to get the extension from a file name using array_pop:

$ext = array_pop(explode(".",$filename));
30-Mar-2004 01:55
A function to delete an array value that recalculates the index ( its very short and easy to understand ).
Hope this might help someone...

<?php
/* Usage:
    $array : Array
    $indey : Integer

    The value of $array at the index $index will be
    deleted by the function.
*/
function array_trim ( $array, $index ) {
   if ( is_array ( $array ) ) {
      unset ( $array[$index] );
      array_unshift ( $array, array_shift ( $array ) );
      return $array;
      }
   else {
      return false;
      }
   }
?>
ryan8613(at)hotmail(dot)com 08-Jun-2003 06:10
A function that may help some out, considering it's pretty much the one mentioned previously...

<?php
function array_trim($arr, $indice) {
        if(!isset($indice)) {
                $indice = count($arr)-1;
        }
        unset($arr[$indice]);
        array_shift($arr);
        return $arr;
}
?>

It cuts the given index value off of the array, but without the shift, if  the 'index' value isn't given, it cuts off the end value.
28-Feb-2003 05:16
alex.chacon@terra.com
Hi
Here there is a function that delete a elemente from a array and re calculate indexes

<?php
function eliminarElementoArreglo ($array, $indice)
{
    if (array_key_exists($indice, $array))
    {
        $temp = $array[0];
        $array[0] = $array[$indice];
        $array[$indice] = $temp;
        array_shift($array);

        //reacomodamos ?ndices
        for ($i = 0 ; $i < $indice ; $i++)
        {
            $dummy = $array[$i];
            $array[$i] = $temp;
            $temp = $dummy;
        }
    }
    return $array;
}
?>


Calcule le produit des valeurs du tableau

  • « array_pop
  • array_push »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule le produit des valeurs du tableau

array_product

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

array_product — Calcule le produit des valeurs du tableau

Description

array_product ( array $array ) : int|float

array_product() retourne le produit des valeurs du tableau array.

Liste de paramètres

array

Le tableau.

Valeurs de retour

Retourne le produit, sous la forme d'un entier ou d'un nombre décimal.

Exemples

Exemple #1 Exemple avec array_product()

<?php

$a = array(2, 4, 6, 8);
echo "produit(a) = " . array_product($a) . "\n";
echo "product(array()) = " . array_product(array()) . "\n";

?>

L'exemple ci-dessus va afficher :

produit(a) = 384
product(array()) = 1

User Contributed Notes

bsr dot anwar at gmail dot com 05-Jun-2017 06:04
Here's how you can find a factorial of a any given number with help of range and array_product functions.

function factorial($num) {
    return array_product(range(1, $num));
}

printf("%d", factorial(5)); //120
Jimmy PHP 29-Apr-2014 07:55
array_product() can be used to implement a simple boolean AND search

<?php
$args = array('first_name'=>'Bill','last_name'=>'Buzzard');
$values[] = array('first_name'=>'Brenda','last_name'=>'Buzzard');
$values[] = array('first_name'=>'Victor','last_name'=>'Vulture');
$values[] = array('first_name'=>'Bill','last_name'=>'Blue Jay');
$values[] = array('first_name'=>'Bill','last_name'=>'Buzzard');

$result = search_for($values,$args);
var_dump($result);exit;

function search_for($array,$args) {
    $results = array();
    foreach ($array as $row) {
        $found = false;
        $hits = array();
        foreach ($row as $k => $v) {
            if (array_key_exists($k,$args)) $hits[$k] = ($args[$k] == $v);
        }

        $found = array_product($hits);
        if (!in_array($row,$results) && true == $found) $results[] = $row;
    }

    return $results;
}
?>

Output:

array (size=1)
  0 =>
    array (size=2)
      'first_name' => string 'Bill' (length=4)
      'last_name' => string 'Buzzard' (length=7)
Marcel G 28-Sep-2010 08:36
You can use array_product to calculate the factorial of n:
<?php
function factorial( $n )
{
  if( $n < 1 ) $n = 1;
  return array_product( range( 1, $n ));
}
?>

If you need the factorial without having array_product available, here is one:
<?php
function factorial( $n )
{
  if( $n < 1 ) $n = 1;
  for( $p++; $n; ) $p *= $n--;
  return $p;
}
?>
pqpqpq at wanadoo dot nl 17-Jan-2007 04:32
An observation about the _use_ of array_product with primes:

$a=$arrayOfSomePrimes=(2,3,11);
              // 2 being the first prime (these days)

$codeNum=array_product($a); // gives 66 (== 2*3*11)

echo "unique product(\$a) = " . array_product($a) . "\n";

The 66 can (only) be split into its original primes,
which can be transformed into their place in the row of primes (2,3,5,7,11,13,17,19...)  giving (1,2,3,4,5,6,7,8...)

The 66 gives the places {1,2,5} in the row of primes. The number "66" is unique as a code for {1,2,5}

So you can define the combination of table-columns {1,2,5} in "66". The bigger the combination, the more efficient in memory/transmission, the less in calculation.
Andre D 07-Aug-2006 01:56
This function can be used to test if all values in an array of booleans are TRUE.

Consider:

<?php

function outbool($test)
{
    return (bool) $test;
}

$check[] = outbool(TRUE);
$check[] = outbool(1);
$check[] = outbool(FALSE);
$check[] = outbool(0);

$result = (bool) array_product($check);
// $result is set to FALSE because only two of the four values evaluated to TRUE

?>

The above is equivalent to:

<?php

$check1 = outbool(TRUE);
$check2 = outbool(1);
$check3 = outbool(FALSE);
$check4 = outbool(0);

$result = ($check1 && $check2 && $check3 && $check4);

?>

This use of array_product is especially useful when testing an indefinite number of booleans and is easy to construct in a loop.


Empile un ou plusieurs éléments à la fin d'un tableau

  • « array_product
  • array_rand »
  • PHP Manual
  • Fonctions sur les tableaux
  • Empile un ou plusieurs éléments à la fin d'un tableau

array_push

(PHP 4, PHP 5, PHP 7, PHP 8)

array_push — Empile un ou plusieurs éléments à la fin d'un tableau

Description

array_push ( array &$array , mixed ...$values ) : int

array_push() considère array comme une pile, et empile les variables var, ... à la fin de array. La longueur du tableau array augmente d'autant. Cela a le même effet que :

<?php
$array[] = $var;
?>
répété pour chaque valeur.

Note: Si vous utilisez la fonction array_push() pour ajouter un élément à un tableau, il est préférable de la remplacer par l'opérateur $array[] = qui évite le passage par une fonction.

Note: array_push() émettra une alerte si le premier argument n'est pas un tableau. Ceci diffère du comportement de $var[] où un nouveau tableau était créé, antérieur à PHP 7.1.0.

Liste de paramètres

array

Le tableau d'entrée.

values

La valeur à insérer à la fin du tableau array.

Valeurs de retour

Retourne le nouveau nombre d'éléments dans le tableau.

Historique

Version | Description
7.3.0 | Cette fonction peut désormais être appelée avec un seul paramètre. Auparavant, au moins deux paramètres étaient requis.

Exemples

Exemple #1 Exemple avec array_push()

<?php
$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");
print_r($stack);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => orange
    [1] => banana
    [2] => apple
    [3] => raspberry
)

Voir aussi

  • array_pop() - Dépile un élément de la fin d'un tableau
  • array_shift() - Dépile un élément au début d'un tableau
  • array_unshift() - Empile un ou plusieurs éléments au début d'un tableau

User Contributed Notes

David Spector 20-Feb-2021 12:18
After using array_push you may wish to read the top (last) array element one or more times before using array_pop. To read the top array element efficiently, use the 'current' function.
David Spector 21-Nov-2020 07:05
A common operation when pushing a value onto a stack is to address the value at the top of the stack.

This can be done easily using the 'end' function:

<?php
$top=end($stack);
?>

Note: See the 'end' function for details about its side effect on the seldom used internal array pointer.
siqueiramoises14 at gmail dot com 02-Oct-2019 01:07
if you need to push a multidimensional numeric array into another, array push will push the hole array into a key of the first array, for example, let's imagine you have two arrays:

<?php
$array1 = [
    0 => [
        "key1" => "value1",
        "key2" => "value2"
    ]
];

$array2 = [
    0 => [
        "key1" => "value1",
        "key2" => "value2"
    ]
];

$array1[] = $array2;

//after that array1 will look like this:

[
    0 => [
        "key1" => "value1",
        "key2" => "value2"
    ],

    1 => [
        0 => [
            "key1" => "value2",
            "key2" => "value2"
        ]
]

// If you don't want that to happen here's a function to avoid that:

function array_push_indexes($array1, $array2){
    $lastKey = array_key_last($array1);
    for($i = 0; $i < count($array2); $i++){
        $KeyPosition = 1 + $i;
        $array1[$lastKey+$KeyPosition] = $array2[$i];
    }
    return $array1;
}

//Using the same example from before this function will return:

[
    0 => [
        "key1" => "value1",
        "key2" => "value2"
    ],

    1 => [
        "key1" => "value1",
        "key2" => "value2"
    ]
]

?>

P.S: the array_key_last function it's for PHP >= 7.3.0 see more here https://www.php.net/manual/en/function.array-key-last.php
P.A.Semi 13-Jun-2019 09:38
There is problem with pushing references to array, introduced in PHP 5.4 - did someone decide it is not needed?

In PHP 5.3 this could be used:

$A=array(); array_push($A,1); $c=2; array_push($A,&$c); print_r($A); $c=3; print_r($A);

Outputs correctly:

Array ( [0] => 1 [1] => 2 )
Array ( [0] => 1 [1] => 3 )

Think of Reference as a pointer in other languages...
This function is needed for example to push parameters for MySql query:

$params=array(); array_push($params,&$field1); array_push($params,&$field2); array_unshift($params,'ss');
call_user_func_array(array($Query,'bind_param'),$params);

This code causes fatal error in PHP 5.4 and depending on server configuration it may not even be reported why...

A workarround to allow pushing references to array is this:

$A=array(); $A[]=1; $c=2; $A[]=&$c; print_r($A); $c=3; print_r($A);

$params=array(); $params[]=&$field1; $params[]=&$field2; array_unshift($params,'ss');
call_user_func_array(array($Query,'bind_param'),$params);

(in actual code, the fields are specified dynamically and iterated in for-loop...)

This seems working both on PHP 5.3 and PHP 5.6 ...
Carlos Alberto B. Carucce 18-Jan-2019 04:34
This is how I add all the elements from one array to another:

<?php
$oneArray = ['d', 'e', 'f'];
$anotherArray = ['a', 'b', 'c'];

array_push($anotherArray, ...$oneArray);
//['a', 'b', 'c', 'd', 'e', 'f'];
yhusky at qq dot com 06-Jul-2018 05:52
There is a mistake in the note by egingell at sisna dot com 12 years ago. The tow dimensional array will output "d,e,f", not "a,b,c".

<?php
$stack = array('a', 'b', 'c');
array_push($stack, array('d', 'e', 'f'));
print_r($stack);
?>

The above will output this:
Array (
  [0] => a
  [1] => b
  [2] => c
  [3] => Array (
     [0] => d
     [1] => e
     [2] => f
  )
)
gfuente at garrahan dot gov dot ar 20-Jan-2017 07:33
If the element to be pushed onto the end of array is an array you will receive the following error message:

Unknown Error, value: [8] Array to string conversion

I tried both: (and works, but with the warning message)

            $aRol = array( $row[0], $row[1], $row[2] );
            $aRoles[] = $aRol;

and
            array_push( $aRoles, $aRol);

The correct way:

            $cUnRol = implode("(",array( $row[0], $row[1], $row[2] ) );
            array_push( $aRoles, $cUnRol );

thanks.
colecooper2005 at icloud dot com 06-Nov-2016 06:44
When developing a pocketmine plugin, a good way to add stuff to a YAML table is

$table=$this->config->get("Table");
array_push($table, "New Value for table");
$this->config->set("Table", $table);
raat1979 at gmail dot com 23-Apr-2016 02:39
Unfortunately array_push returns the new number of items in the array
It does not give you the key of the item you just added, in numeric arrays you could do -1, you do however need to be sure that no associative key exists as that would break the assumption

It would have been better if array_push would have returned the key of the item just added like the below function
(perhaps a native variant would be a good idea...)

<?php

if(!function_exists('array_add')){
    function array_add(array &$array,$value /*[, $...]*/){
        $values = func_get_args();     //get all values
        $values[0]= &$array;        //REFERENCE!
        $org=key($array);              //where are we?
        call_user_func_array('array_push',$values);
        end($array);                 // move to the last item
        $key = key($array);         //get the key of the last item
        if($org===null){
            //was at eof, added something, move to it
            return $key;
        }elseif($org<(count($array)/2)){ //somewhere in the middle +/- is fine
            reset($array);
            while (key($array) !== $org) next($List);
        }else{
            while (key($array) !== $org) prev($List);
        }
        return $key;
    }
}
echo "<pre>\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "Taken array;";
print_r($pr);

echo "\npush 1 returns ".array_push($pr,1)."\n";
echo "------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "\npush 2 returns ".array_push($pr,1,2)."\n";
echo "------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "\n add 1 returns ".array_add($pr,2)."\n\n";
echo "------------------------------------\n";
$pr = array('foo'=>'bar','bar'=>'foo');
echo "\n add 2 returns ".array_add($pr,1,2)."\n\n";
echo "<pre/>\n\n";
?>
Outputs:
Taken array;Array
(
    [foo] => bar
    [bar] => foo
)

push 1 returns 3
------------------------------------

push 2 returns 4
------------------------------------

 add 1 returns 0

------------------------------------

 add 2 returns 1
mrgreen dot webpost at gmail dot com 09-Mar-2016 02:11
Rodrigo de Aquino asserted that instead of using array_push to append to an associative array you can instead just do...

        $data[$key] = $value;

...but this is actually not true. Unlike array_push and even...

        $data[] = $value;

...Rodrigo's suggestion is NOT guaranteed to append the new element to the END of the array. For instance...

        $data['one'] = 1;
        $data['two'] = 2;
        $data['three'] = 3;
        $data['four'] = 4;

...might very well result in an array that looks like this...

       [ "four" => 4, "one" => 1, "three" => 3, "two" => 2 ]

I can only assume that PHP sorts the array as elements are added to make it easier for it to find a specified element by its key later. In many cases it won't matter if the array is not stored internally in the same order you added the elements, but if, for instance, you execute a foreach on the array later, the elements may not be processed in the order you need them to be.

If you want to add elements to the END of an associative array you should use the unary array union operator (+=) instead...

       $data['one'] = 1;
       $data += [ "two" => 2 ];
       $data += [ "three" => 3 ];
       $data += [ "four" => 4 ];

You can also, of course, append more than one element at once...

       $data['one'] = 1;
       $data += [ "two" => 2, "three" => 3 ];
       $data += [ "four" => 4 ];

Note that like array_push (but unlike $array[] =) the array must exist before the unary union, which means that if you are building an array in a loop you need to declare an empty array first...

       $data = [];
       for ( $i = 1; $i < 5; $i++ ) {
              $data += [ "element$i" => $i ];
       }

...which will result in an array that looks like this...

      [ "element1" => 1, "element2" => 2, "element3" => 3, "element4" => 4 ]
golddragon007 25-Mar-2015 10:51
I did a performance check, and I saw, if you push more than one value it can be faster the array push, that the normal $array[] version.

Case 1: $array[] = something;
Case 2: array_push($array, $value);
Case 3: array_push($array, $value1, $value2, $value3 [...]); $values are definied
Case 4: array_push($array, $value1, $value2, $value3 [...]); $values are definied, when $array is not empty
Case 5: Case1 + Case 3
Case 6: Result array contains some value (Case 4)
Case 7: Result array contains same value as the push array (Case 4)
-----------------------------------------------------------------------------------------------------------
~~~~~~~~~~~~ Case 1 ~~~~~~~~~~~~
Times: 0.0310 0.0300 0.0290 0.0340 0.0400 0.0440 0.0480 0.0550 0.0570 0.0570
Min: 0.0290
Max: 0.0570
Avg: 0.0425
~~~~~~~~~~~~ Case 2 ~~~~~~~~~~~~
Times: 0.3890 0.3850 0.3770 0.4110 0.4020 0.3980 0.4020 0.4060 0.4130 0.4200
Min: 0.3770
Max: 0.4200
Avg: 0.4003
~~~~~~~~~~~~ Case 3 ~~~~~~~~~~~~
Times: 0.0200 0.0220 0.0240 0.0340 0.0360 0.0410 0.0460 0.0500 0.0520 0.0520
Min: 0.0200
Max: 0.0520
Avg: 0.0377
~~~~~~~~~~~~ Case 4 ~~~~~~~~~~~~
Times: 0.0200 0.0250 0.0230 0.0260 0.0330 0.0390 0.0460 0.0510 0.0520 0.0520
Min: 0.0200
Max: 0.0520
Avg: 0.0367
~~~~~~~~~~~~ Case 5 ~~~~~~~~~~~~
Times: 0.0260 0.0250 0.0370 0.0360 0.0390 0.0440 0.0510 0.0520 0.0530 0.0560
Min: 0.0250
Max: 0.0560
Avg: 0.0419
~~~~~~~~~~~~ Case 6 ~~~~~~~~~~~~
Times: 0.0340 0.0280 0.0370 0.0410 0.0450 0.0480 0.0560 0.0580 0.0580 0.0570
Min: 0.0280
Max: 0.0580
Avg: 0.0462
~~~~~~~~~~~~ Case 7 ~~~~~~~~~~~~
Times: 0.0290 0.0270 0.0350 0.0410 0.0430 0.0470 0.0540 0.0540 0.0550 0.0550
Min: 0.0270
Max: 0.0550
Avg: 0.044

Tester code:
// Case 1
    $startTime = microtime(true);
    $array = array();
    for ($x = 1; $x <= 100000; $x++)
    {
        $array[] = $x;
    }
    $endTime = microtime(true);

// Case 2
    $startTime = microtime(true);
    $array = array();
    for ($x = 1; $x <= 100000; $x++)
    {
        array_push($array, $x);
    }
    $endTime = microtime(true);

// Case 3
    $result = array();
    $array2 = array(&$result)+$array;
    $startTime = microtime(true);
    call_user_func_array("array_push", $array2);
    $endTime = microtime(true);

// Case 4
    $result = array();
    for ($x = 1; $x <= 100000; $x++)
    {
        $result[] = $x;
    }
    $array2 = array(&$result)+$array;
    $startTime = microtime(true);
    call_user_func_array("array_push", $array2);
    $endTime = microtime(true);

// Case 5
    $result = array();
    $startTime = microtime(true);
    $array = array(&$result);
    for ($x = 1; $x <= 100000; $x++)
    {
        $array[] = $x;
    }
    $endTime = microtime(true);

// Case 6
    $result = array(1,2,3,4,5,6);
    $startTime = microtime(true);
    $array = array(&$result);
    for ($x = 1; $x <= 100000; $x++)
    {
        $array[] = $x;
    }
    $endTime = microtime(true);

// Case 7
    $result = array();
    for ($x = 1; $x <= 100000; $x++)
    {
        $result[] = $x;
    }
    $startTime = microtime(true);
    $array = array(&$result);
    for ($x = 1; $x <= 100000; $x++)
    {
        $array[] = $x;
    }
    $endTime = microtime(true);
flobee 20-Nov-2013 01:25
Be warned using $array "+=" array(1,2,3) or union operations (http://php.net/manual/en/language.operators.array.php)

I think it worked in the past or i havent test it good enough. :-/
(once it worked, once [] was faster than array_push, the past :-D ):

php -r '$a = array(1,2); $a += array(3,4); print_r($a);'
Array (
    [0] => 1
    [1] => 2
)
php -r '$a = array(1,2); $b = array(3,4);$c = $a + $b; print_r($c);'
Array (
    [0] => 1
    [1] => 2
)
php -r '$a = array(1,2); $b = array(2=>3,3=>4);$c = $a + $b; print_r($c);'
Array (
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)
Rodrigo de Aquino 30-Mar-2012 03:24
If you're going to use array_push() to insert a "$key" => "$value" pair into an array, it can be done using the following:

    $data[$key] = $value;

It is not necessary to use array_push.
Chicna 21-Mar-2012 10:14
I found a simple way to have an "array_push_array" function, without the references problem when we want to use call_user_func_array(), hope this help :

function array_push_array(array &$array)
{
    $numArgs = func_num_args();
    if(2 > $numArgs)
    {
      trigger_error(sprintf('%s: expects at least 2 parameters, %s given', __FUNCTION__, $numArgs), E_USER_WARNING);
      return false;
    }

    $values = func_get_args();
    array_shift($values);

    foreach($values as $v)
    {
      if(is_array($v))
      {
        if(count($v) > 0)
        {
          foreach($v as $w)
          {
            $array[] = $w;
          }
        }
      }
      else
      {
        $array[] = $v;
      }
    }

    return count($array);
}
yuri 30-Nov-2011 10:00
If you want to put an element to a specific position in an array, try this function.

<?php

function array_put_to_position(&$array, $object, $position, $name = null)
{
        $count = 0;
        $return = array();
        foreach ($array as $k => $v)
        {
                // insert new object
                if ($count == $position)
                {
                        if (!$name) $name = $count;
                        $return[$name] = $object;
                        $inserted = true;
                }
                // insert old object
                $return[$k] = $v;
                $count++;
        }
        if (!$name) $name = $count;
        if (!$inserted) $return[$name];
        $array = $return;
        return $array;
}
?>

Example :

<?php
$a = array(
 'a' => 'A',
 'b' => 'B',
 'c' => 'C',
);

print_r($a);
array_put_to_position($a, 'G', 2, 'g');
print_r($a);

/*
Array
(
    [a] => A
    [b] => B
    [c] => C
)
Array
(
    [a] => A
    [b] => B
    [g] => G
    [c] => C
)
*/
?>
aosojnik at gmail dot com 23-Nov-2009 02:56
If you want to preserve the keys in the array, use the following:

<?php
function array_pshift(&$array) {
    $keys = array_keys($array);
    $key = array_shift($keys);
    $element = $array[$key];
    unset($array[$key]);
    return $element;
}
?>
rarioj at gmail dot com 04-Oct-2009 06:44
This function "Returns the new number of elements in the array."

To find out the last index, use:

<?php
$count = array_push($array, $value);
$last_index = array_pop(array_keys($array));
?>
helpmepro1 at gmail dot com 13-Jan-2009 01:43
elegant php array combinations algorithm

<?

//by Shimon Dookin

function get_combinations(&$lists,&$result,$stack=array(),$pos=0)
{
 $list=$lists[$pos];
 if(is_array($list))
  foreach($list as $word)
  {
   array_push($stack,$word);
   if(count($lists)==count($stack))
    $result[]=$stack;
   else
    get_combinations($lists,$result,$stack,$pos+1);
   array_pop($stack);
  }
}

$wordlists= array( array("shimon","doodkin") , array("php programmer","sql programmer","mql metatrader programmer") );

get_combinations($wordlists,$combinations);

echo '<xmp>';
print_r($combinations);

?>
wesleys at opperschaap dot net 10-Oct-2008 12:58
A function which mimics push() from perl, perl lets you push an array to an array: push(@array, @array2, @array3). This function mimics that behaviour.

<?php

function array_push_array(&$arr) {
    $args = func_get_args();
    array_shift($args);

    if (!is_array($arr)) {
        trigger_error(sprintf("%s: Cannot perform push on something that isn't an array!", __FUNCTION__), E_USER_WARNING);
        return false;
    }

    foreach($args as $v) {
        if (is_array($v)) {
            if (count($v) > 0) {
                array_unshift($v, &$arr);
                call_user_func_array('array_push',  $v);
            }
        } else {
            $arr[] = $v;
        }
    }
    return count($arr);
}

$arr = array(0);
$arr2  = array(6,7,8);
printf("%s\n", array_push_array($arr, array(),array(1,2,3,4,5), $arr2));
print_r($arr);

# error..
$arr = "test";
printf("%s\n", array_push_array($arr, array(),array(1,2,3,4,5), $arr2));

?>
willdemaine at gmail dot com 07-Aug-2008 07:00
If you're adding multiple values to an array in a loop, it's faster to use array_push than repeated [] = statements that I see all the time:

<?php
class timer
{
        private $start;
        private $end;

        public function timer()
        {
                $this->start = microtime(true);
        }

        public function Finish()
        {
                $this->end = microtime(true);
        }

        private function GetStart()
        {
                if (isset($this->start))
                        return $this->start;
                else
                        return false;
        }

        private function GetEnd()
        {
                if (isset($this->end))
                        return $this->end;
                else
                        return false;
        }

        public function GetDiff()
        {
                return $this->GetEnd() - $this->GetStart();
        }

        public function Reset()
        {
                $this->start = microtime(true);
        }

}

echo "Adding 100k elements to array with []\n\n";
$ta = array();
$test = new Timer();
for ($i = 0; $i < 100000; $i++)
{
        $ta[] = $i;
}
$test->Finish();
echo $test->GetDiff();

echo "\n\nAdding 100k elements to array with array_push\n\n";
$test->Reset();
for ($i = 0; $i < 100000; $i++)
{
        array_push($ta,$i);
}
$test->Finish();
echo $test->GetDiff();

echo "\n\nAdding 100k elements to array with [] 10 per iteration\n\n";
$test->Reset();
for ($i = 0; $i < 10000; $i++)
{
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
        $ta[] = $i;
}
$test->Finish();
echo $test->GetDiff();

echo "\n\nAdding 100k elements to array with array_push 10 per iteration\n\n";
$test->Reset();
for ($i = 0; $i < 10000; $i++)
{
        array_push($ta,$i,$i,$i,$i,$i,$i,$i,$i,$i,$i);
}
$test->Finish();
echo $test->GetDiff();
?>

Output

$ php5 arraypush.php
X-Powered-By: PHP/5.2.5
Content-type: text/html

Adding 100k elements to array with []

0.044686794281006

Adding 100k elements to array with array_push

0.072616100311279

Adding 100k elements to array with [] 10 per iteration

0.034690141677856

Adding 100k elements to array with array_push 10 per iteration

0.023932933807373
bxi at apparoat dot nl 23-May-2008 04:29
I've done a small comparison between array_push() and the $array[] method and the $array[] seems to be a lot faster.

<?php
$array = array();
for ($x = 1; $x <= 100000; $x++)
{
    $array[] = $x;
}
?>
takes 0.0622200965881 seconds

and

<?php
$array = array();
for ($x = 1; $x <= 100000; $x++)
{
    array_push($array, $x);
}
?>
takes 1.63195490837 seconds

so if your not making use of the return value of array_push() its better to use the $array[] way.

Hope this helps someone.
alexander dot williamson at gmail dot com 26-Mar-2008 04:06
This will work to solve the associative array issues:

$aValues[$key] = $value;

Where $key is a unique identifier and $value is the value to be stored. Since the $key works off a string or number, if you already have a $key with the same value as an existing $key, the element will be overwritten.

e.g.

$aValues["one"] = "value of one";
$aValues["two"] = "different value of two!";

gives:
array([one] => "value of one", [two] => "value of two");

but will be overwritten when using the same key (one):

$aValues["one"] = "value of one";
$aValues["one"] = "different value of two!";

will give:

array([one] => "different value of two!");

3686
zbde00 at hotmail dot com 20-Jul-2007 05:59
A very good function to remove a element from array
function array_del($str,&$array)
{
    if (in_array($str,$array)==true)
    {

        foreach ($array as $key=>$value)
        {
            if ($value==$str) unset($array[$key]);
        }
    }
}
Marc Bernet 15-May-2006 09:18
A small and basic implementation of a stack without using an array.

class node
{
        var $elem;
        var    $next;
}
class stack
{
    var $next;
    function pop()
    {
        $aux=$this->next->elem;
        $this->next=$this->next->next;
        return $aux;
    }
    function push($obj)
    {
        $nod=new node;
        $nod->elem=$obj;
        $nod->next=$this->next;
        $this->next=$nod;
    }
    function stack()
    {
        $this->next=NULL;
    }
}
egingell at sisna dot com 28-Jan-2006 06:06
If you push an array onto the stack, PHP will add the whole array to the next element instead of adding the keys and values to the array. If this is not what you want, you're better off using array_merge() or traverse the array you're pushing on and add each element with $stack[$key] = $value.

<?php

$stack = array('a', 'b', 'c');
array_push($stack, array('d', 'e', 'f'));
print_r($stack);

?>
The above will output this:
Array (
  [0] => a
  [1] => b
  [2] => c
  [3] => Array (
     [0] => a
     [1] => b
     [2] => c
  )
)
steve at webthoughts d\ot ca 12-Nov-2005 04:02
Further Modification on the array_push_associative function
1.  removes seemingly useless array_unshift function that generates php warning
2.  adds support for non-array arguments

<?
// Append associative array elements
function array_push_associative(&$arr) {
   $args = func_get_args();
   foreach ($args as $arg) {
       if (is_array($arg)) {
           foreach ($arg as $key => $value) {
               $arr[$key] = $value;
               $ret++;
           }
       }else{
           $arr[$arg] = "";
       }
   }
   return $ret;
}

$items = array("here" => "now");
$moreitems = array("this" => "that");

$theArray = array("where" => "do we go", "here" => "we are today");
echo array_push_associative($theArray, $items, $moreitems, "five") . ' is the size of $theArray.<br />';

echo "<pre>";
print_r($theArray);
echo "</pre>";

?>

Yields:

4 is the size of $theArray.
Array
(
    [where] => do we go
    [here] => now
    [this] => that
    [five] =>
)
john 19-Oct-2005 01:33
A variation of kamprettos' associative array push:

// append associative array elements
function associative_push($arr, $tmp) {
  if (is_array($tmp)) {
    foreach ($tmp as $key => $value) {
      $arr[$key] = $value;
    }
    return $arr;
  }
  return false;
}

$theArray = array();
$theArray = associative_push($theArray, $items);
kamprettos at yahoo dot com Teguh Iskanto 19-Sep-2005 05:33
Looking for a way to push data into an associative array and frustrated to know that array_push() can't do the job ?

here's my Scenario :
-------------------
I need to relate system command output into an associative array like these :

[sge@digital_db work]$ /usr/local/apache/htdocs/work/qhost.sh -h t1 -F | awk '{if(NR>4) print $1}' | sed  's/hl://g'
arch=lx24-amd64
num_proc=2.000000
mem_total=3.808G
swap_total=3.907G
virtual_total=7.715G
load_avg=0.000000
load_short=0.000000
load_medium=0.000000
load_long=0.000000
mem_free=3.510G
swap_free=3.907G
virtual_free=7.417G
mem_used=305.242M
swap_used=0.000
virtual_used=305.242M
cpu=0.000000
np_load_avg=0.000000
np_load_short=0.000000
np_load_medium=0.000000
np_load_long=0.000000

how I did it :
<? php

# get into the system command output
$assoc_cmd =`$work_dir/qhost.sh -h $host_resource -F | awk '{if(NR>4) print $1}'| sed  's/hl://g' ` ;

# split the "\n" character
$assoc_row = explode("\n", chop($assoc_cmd));

# get the index row
$idx_row  = count($assoc_row) - 1 ;

# initialize the associative array
$host_res_array = array();

for ($i = 0 ; $i<= $idx_row ; $i++)
        {
                # get params & values
                list($host_param,$host_val) = explode("=",$assoc_row[$i]);

                # populate / push data to assoc array
                $host_res_array[$host_param]= $host_val ;
        }

echo "<pre> Architecture : </pre>\n" ;
echo $host_res_array['arch'] ;
echo "<pre> Mem Total    : </pre>\n" ;
echo $host_res_array['mem_tot'];

?>

Hope this helps ! :)
bk at quicknet dot nl 04-Sep-2005 01:51
Add elements to an array before or after a specific index or key:

<?php

/**
 * @return array
 * @param array $src
 * @param array $in
 * @param int|string $pos
*/
function array_push_before($src,$in,$pos){
    if(is_int($pos)) $R=array_merge(array_slice($src,0,$pos), $in, array_slice($src,$pos));
    else{
        foreach($src as $k=>$v){
            if($k==$pos)$R=array_merge($R,$in);
            $R[$k]=$v;
        }
    }return $R;
}

/**
 * @return array
 * @param array $src
 * @param array $in
 * @param int|string $pos
*/
function array_push_after($src,$in,$pos){
    if(is_int($pos)) $R=array_merge(array_slice($src,0,$pos+1), $in, array_slice($src,$pos+1));
    else{
        foreach($src as $k=>$v){
            $R[$k]=$v;
            if($k==$pos)$R=array_merge($R,$in);
        }
    }return $R;
}

// Examples:

$src=array("A","B","C");
$in=array("X","Y");

var_dump(array_push_before($src,$in,1));
/* array_push_before, no-key array
array(5) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "X"
  [2]=>
  string(1) "Y"
  [3]=>
  string(1) "B"
  [4]=>
  string(1) "C"
}*/

var_dump(array_push_after($src,$in,1));
/* array_push_after, no-key array
array(5) {
  [0]=>
  string(1) "A"
  [1]=>
  string(1) "B"
  [2]=>
  string(1) "X"
  [3]=>
  string(1) "Y"
  [4]=>
  string(1) "C"
}*/

$src=array('a'=>"A",'b'=>"B",'c'=>"C");
$in=array('x'=>"X",'y'=>"Y");

var_dump(array_push_before($src,$in,1));
/* array_push_before, key array, before index insert
array(5) {
  ["a"]=>
  string(1) "A"
  ["x"]=>
  string(1) "X"
  ["y"]=>
  string(1) "Y"
  ["b"]=>
  string(1) "B"
  ["c"]=>
  string(1) "C"
}*/

var_dump(array_push_before($src,$in,'b'));
/* array_push_before, key array, before key insert
array(5) {
  ["a"]=>
  string(1) "A"
  ["x"]=>
  string(1) "X"
  ["y"]=>
  string(1) "Y"
  ["b"]=>
  string(1) "B"
  ["c"]=>
  string(1) "C"
}*/

var_dump(array_push_after($src,$in,1));
/* array_push_after, key array, after index insert
array(5) {
  ["a"]=>
  string(1) "A"
  ["b"]=>
  string(1) "B"
  ["x"]=>
  string(1) "X"
  ["y"]=>
  string(1) "Y"
  ["c"]=>
  string(1) "C"
}*/

var_dump(array_push_after($src,$in,'b'));
/* array_push_after, key array, after key insert
array(5) {
  ["a"]=>
  string(1) "A"
  ["b"]=>
  string(1) "B"
  ["x"]=>
  string(1) "X"
  ["y"]=>
  string(1) "Y"
  ["c"]=>
  string(1) "C"
}*/

?>
ciprian dot amariei at gmail com 30-Aug-2005 02:47
regarding the speed of oneill's solution to insert a value into a non-associative array,  I've done some tests and I found that it behaves well if you have a small array and more insertions, but for a huge array and a little insersions I sugest  using this function:

function array_insert( &$array, $index, $value ) {
   $cnt = count($array);

   for( $i = $cnt-1; $i >= $index; --$i ) {
       $array[ $i + 1 ] = $array[ $i ];
   }
   $array[$index] = $value;
}

or if you are a speed adicted programmer (same situation: big array, few insertions) use this:

array_splice ( $array, $offset, 0, $item );

item may also be an array of values ;).
Phil Davies 18-Jul-2005 03:51
As someone pointed out the array_push() function returns the count of the array not the key of the new element. As it was the latter function i required i wrote this very simple replacement.

function array_push2(&$array,$object,$key=null){
    $keys = array_keys($array);
    rsort($keys);
    $newkey = ($key==null)?$keys[0]+1:$key;
    $array[$newkey] = $object;
    return $newkey;
}
oneill at c dot dk 03-Jun-2005 01:50
To insert a value into a non-associative array, I find this simple function does the trick:

function insert_in_array_pos($array, $pos, $value)
{
  $result = array_merge(array_slice($array, 0 , $pos), array($value), array_slice($array,  $pos));
  return $result;
}

Seems an awful lot simpler than the iterative solutions given above...
aaron dot hawley at uvm dot edu 27-May-2005 11:36
Skylifter notes on 20-Jan-2004 that the [] empty bracket notation does not return the array count as array_push does.  There's another difference between array_push and the recommended empty bracket notation.

Empy bracket doesn't check if a variable is an array first as array_push does.  If array_push finds that a variable isn't an array it prints a Warning message if E_ALL error reporting is on.

So array_push is safer than [], until further this is changed by the PHP developers.
andrew at cgipro dot com 02-Feb-2005 03:18
Need a real one-liner for adding an element onto a new array name?

$emp_list_bic = $emp_list + array(c=>"ANY CLIENT");

CONTEXT...
drewdeal: this turns out to be better and easier than array_push()
patelbhadresh: great!... so u discover new idea...
drewdeal: because you can't do:   $emp_list_bic = array_push($emp_list, c=>"ANY CLIENT");
drewdeal: array_push returns a count and affects current array.. and does not support set keys!
drewdeal: yeah. My one-liner makes a new array as a derivative of the prior array
bart at framers dot nl 27-Sep-2001 04:16
Array_push also works fine with multidimensional arrays. Just make sure the element is defined as an array first.

<?php
$array["element"][$element]["element"] = array();
array_push ($array["element"][$element]["element"], "banana");
?>


Prend une ou plusieurs clés, au hasard dans un tableau

  • « array_push
  • array_reduce »
  • PHP Manual
  • Fonctions sur les tableaux
  • Prend une ou plusieurs clés, au hasard dans un tableau

array_rand

(PHP 4, PHP 5, PHP 7, PHP 8)

array_rand — Prend une ou plusieurs clés, au hasard dans un tableau

Description

array_rand ( array $array , int $num = 1 ) : int|string|array

Sélectionne une ou plusieurs valeurs au hasard dans un tableau et retourne la ou les clés de ces valeurs. Cette fonction utilise un pseudo générateur de nombre aléatoire, ce qui ne convient pas pour de la cryptographie.

Liste de paramètres

array

Le tableau d'entrée.

num

Spécifie le nombre d'entrées que vous voulez récupérer.

Valeurs de retour

Lorsque vous ne récupérez qu'une seule entrée, la fonction array_rand() retourne la clé d'une entrée choisie aléatoirement. Sinon, un tableau de clés d'entrées aléatoires sera retourné. Cela vous permet de faire une sélection au hasard de clés, ou bien de valeurs. Si plusieurs clés sont retournées, alors elles le seront dans l'ordre qu'elles étaient dans le tableau d'origine Le fait de tenter de récupérer plus d'éléments qu'il n'y en a dans le tableau fera qu'une erreur de niveau E_WARNING sera émise, et NULL sera retourné.

Historique

Version | Description
7.1.0 | L'algorithme interne de génération aléatoire a été modifié pour utiliser le générateur aleatoire de nombre » Mersenne Twister au lieu de la fonction aléatoire libc

Exemples

Exemple #1 Exemple avec array_rand()

<?php
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . "\n";
echo $input[$rand_keys[1]] . "\n";
?>

Voir aussi

  • shuffle() - Mélange les éléments d'un tableau

User Contributed Notes

grzeniufication 03-Mar-2018 10:19
<?php

/**
 * Wraps array_rand call with additional checks
 *
 * TLDR; not so radom as you'd wish.
 *
 * NOTICE: the closer you get to the input arrays length, for the n parameter, the  output gets less random.
 * e.g.: array_random($a, count($a)) == $a will yield true
 * This, most certainly, has to do with the method used for making the array random (see other comments).
 *
 * @throws OutOfBoundsException – if n less than one or exceeds size of input array
 *
 * @param array $array – array to randomize
 * @param int $n – how many elements to return
 * @return array
 */
function array_random(array $array, int $n = 1): array
{
    if ($n < 1 || $n > count($array)) {
        throw new OutOfBoundsException();
    }

    return ($n !== 1)
        ? array_values(array_intersect_key($array, array_flip(array_rand($array, $n))))
        : array($array[array_rand($array)]);
}
grzeniufication 03-Mar-2018 09:22
<?php
// An example how to fetch multiple values from array_rand
$a = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ];
$n = 3;

// If you want to fetch multiple values you can try this:
print_r( array_intersect_key( $a, array_flip( array_rand( $a, $n ) ) ) );

// If you want to re-index keys wrap the call in 'array_values':
print_r( array_values( array_intersect_key( $a, array_flip( array_rand( $a, $n ) ) ) ) );
Anonymous 13-Jul-2012 02:42
It doesn't explicitly say it in the documentation, but PHP won't pick the same key twice in one call.
Anonymous 02-Oct-2009 01:04
If the array elements are unique, and are all integers or strings, here is a simple way to pick $n random *values* (not keys) from an array $array:

<?php array_rand(array_flip($array), $n); ?>


Réduit itérativement un tableau

  • « array_rand
  • array_replace_recursive »
  • PHP Manual
  • Fonctions sur les tableaux
  • Réduit itérativement un tableau

array_reduce

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

array_reduce — Réduit itérativement un tableau

Description

array_reduce ( array $array , callable $callback , mixed $initial = null ) : mixed

array_reduce() applique itérativement la fonction callback aux éléments du tableau array, de manière à réduire le tableau à une valeur simple.

Liste de paramètres

array

Le tableau d'entrée.

callback
callback ( mixed $carry , mixed $item ) : mixed
carry

Contient la valeur retournée de l'itération précédente ; dans le cas de la première itération, ce sera la valeur du paramètre initial.

item

Contient la valeur de l'itération courante.

initial

Si l'argument optionnel initial est disponible, il sera utilisé pour initialiser le processus, ou bien comme valeur finale si le tableau est vide.

Valeurs de retour

Retourne la valeur résultante.

Si le tableau est vide et le paramètre initial n'est pas passé, array_reduce() retourne null.

Exemples

Exemple #1 Exemple avec array_reduce()

<?php
function sum($carry, $item)
{
    $carry += $item;
    return $carry;
}

function product($carry, $item)
{
    $carry *= $item;
    return $carry;
}

$a = array(1, 2, 3, 4, 5);
$x = array();

var_dump(array_reduce($a, "sum")); // int(15)
var_dump(array_reduce($a, "product", 10)); // int(1200), car : 10*1*2*3*4*5
var_dump(array_reduce($x, "sum", "No data to reduce")); // string(17) "No data to reduce"
?>

Voir aussi

  • array_filter() - Filtre les éléments d'un tableau grâce à une fonction de rappel
  • array_map() - Applique une fonction sur les éléments d'un tableau
  • array_unique() - Dédoublonne un tableau
  • array_count_values() - Compte le nombre de valeurs d'un tableau

User Contributed Notes

souzacomprog at gmail dot com 06-Dec-2019 12:16
Sometimes we need to go through an array and group the indexes so that it is easier and easier to extract them in the iteration.

<?php

$people = [
    ['id' => 1, 'name' => 'Hayley'],
    ['id' => 2, 'name' => 'Jack', 'dad' => 1],
    ['id' => 3, 'name' => 'Linus', 'dad'=> 4],
    ['id' => 4, 'name' => 'Peter' ],
    ['id' => 5, 'name' => 'Tom', 'dad' => 4],
];

$family = array_reduce($people, function($accumulator, $item) {
    // if you don't have a dad you are probably a dad
    if (!isset($item['dad'])) {
        $id = $item['id'];
        $name = $item['name'];
        // take the children if you already have
        $children = $accumulator[$id]['children'] ?? [];
        // add dad
        $accumulator[$id] = ['id' => $id, 'name' => $name,'children' => $children];
        return $accumulator;
    }

    // add a new dad if you haven't already
    $dad = $item['dad'];
    if (!isset($accumulator[$dad])) {
        // how did you find the dad will first add only with children
        $accumulator[$dad] = ['children' => [$item]];
        return $accumulator;
    }

    //  add a son to his dad who has already been added
    //  by the first or second conditional "if"

    $accumulator[$dad]['children'][] = $item;
    return $accumulator;
}, []);

var_export(array_values($family));

?>

OUTPUT

array (
  0 =>
  array (
    'id' => 1,
    'name' => 'Hayley',
    'children' =>
    array (
      0 =>
      array (
        'id' => 2,
        'name' => 'Jack',
        'dad' => 1,
      ),
    ),
  ),
  1 =>
  array (
    'id' => 4,
    'name' => 'Peter',
    'children' =>
    array (
      0 =>
      array (
        'id' => 3,
        'name' => 'Linus',
        'dad' => 4,
      ),
      1 =>
      array (
        'id' => 5,
        'name' => 'Tom',
        'dad' => 4,
      ),
    ),
  ),
)

<?php
$array = [
  [
    "menu_id" => "1",
    "menu_name" => "Clients",
    "submenu_name" => "Add",
    "submenu_link" => "clients/add"
  ],
  [
    "menu_id" => "1",
    "menu_name" => "Clients",
    "submenu_name" => "List",
    "submenu_link" => "clients"
  ],
  [
    "menu_id" => "2",
    "menu_name" => "Products",
    "submenu_name" => "List",
    "submenu_link" => "products"
  ],
];

//Grouping submenus to their menus

$menu =  array_reduce($array, function($accumulator, $item){
  $index = $item['menu_name'];

  if (!isset($accumulator[$index])) {
    $accumulator[$index] = [
      'menu_id' => $item['menu_id'],
      'menu_name' => $item['menu_name'],
      'submenu' => []
    ];
  }

  $accumulator[$index]['submenu'][] = [
    'submenu_name' => $item['submenu_name'],
    'submenu_link' => $item['submenu_link']
  ];

  return $accumulator;
}, []);

var_export(array_values($menu));

?>

OUTPUT

array (
  0 =>
  array (
    'menu_id' => '1',
    'menu_name' => 'Clients',
    'submenu' =>
    array (
      0 =>
      array (
        'submenu_name' => 'Add',
        'submenu_link' => 'clients/add',
      ),
      1 =>
      array (
        'submenu_name' => 'List',
        'submenu_link' => 'clients',
      ),
    ),
  ),
  1 =>
  array (
    'menu_id' => '2',
    'menu_name' => 'Products',
    'submenu' =>
    array (
      0 =>
      array (
        'submenu_name' => 'List',
        'submenu_link' => 'products',
      ),
    ),
  ),
)
Julian Sawicki 02-Dec-2019 08:28
Array reduce offers a way to transform data.
Please look at the array below. The array has 4 nested array's.
The nested array's have the same keys. Only the value is different.

This code transforms the whole array. See below.

$array = array(
    0 => array('id' => '100', 'name' => 'Henk', 'age' => '30'),
    1 => array('id' => '101', 'name' => 'Piet', 'age' => '33'),
    2 => array('id' => '102', 'name' => 'Wim', 'age' => '43'),
    3 => array('id' => '103', 'name' => 'Jaap', 'age' => '53'),
);

$arr = array_reduce($array, function($carry, $item){

    $arr = array(
        'id' => $item['id'],
        'value' => $item['name'],
    );

    $id = $item['id'];
    $carry[$id] = $arr;

    return $carry;
}, array());

var_dump($arr);

// OUTPUT

array (size=4)
100 => array (size=2)
   'id' => string '100' (length=3)
   'value' => string 'Henk' (length=4)
101 => array (size=2)
   'id' => string '101' (length=3)
   'value' => string 'Piet' (length=4)
102 => array (size=2)
   'id' => string '102' (length=3)
   'value' => string 'Wim' (length=3)
103 => array (size=2)
   'id' => string '103' (length=3)
   'value' => string 'Jaap' (length=4)
849330489 at qq dot com 12-Oct-2019 01:33
The first parameter $array can be also be functions, which produces very interesting and powerful result, which can be used to make an union of middlewares.

<?php

$f1 = function($x, $f){
    echo 'middleware 1 begin.'.PHP_EOL;
    $x += 1;
    $x = $f($x);
    echo 'middleware 1 end.'.PHP_EOL;
    return $x;
};

$f2 = function($x, $f){
    echo 'middleware 2 begin: '.PHP_EOL;
    $x += 2;
    $x = $f($x);
    echo 'middleware 2 end.'.PHP_EOL;
    return $x;
};

$respond = function($x){
    echo 'Generate some response.'.PHP_EOL;
    return $x;
};

$middlewares = [$f1, $f2];
$initial = $respond;
$foo = array_reduce($middlewares, function($stack, $item){
    return function($request) use ($stack, $item){
        return $item($request, $stack);
    };
}, $initial);

$x = 1;
echo $foo($x);

?>

//output:
middleware 2 begin:
middleware 1 begin.
Generate some response.
middleware 1 end.
middleware 2 end.
4
galley dot meng at gmail dot com 15-Mar-2017 05:48
If your array has string keys, you can reduce a two-dimensional array into one-dimensional using array_reduce, array_merge and array_values. (PHP>=5.3.0)

<?php

$two_dimensional = array();

$two_dimensional['foo'] = array('a' => 1, 'b' => 2, 'c' => 3);
$two_dimensional['bar'] = array('a' => 4, 'b' => 5, 'c' =>6);

$one_dimensional = array_reduce($two_dimensional, 'array_merge', array());

$one_dimensional = array_reduce($two_dimensional, function ($one_dimensional, $value) {
    return array_merge($one_dimensional, array_values($value));
}, array());

# becomes array(1, 2, 3, 4, 5, 6)
directrix1 at gmail dot com 03-Nov-2015 04:39
So, if you were wondering how to use this where key and value are passed in to the function. I've had success with the following (this example generates formatted html attributes from an associative array of attribute => value pairs):

<?php

    // Attribute List
    $attribs = [
        'name' => 'first_name',
        'value' => 'Edward'
    ];

    // Attribute string formatted for use inside HTML element
    $formatted_attribs = array_reduce(
        array_keys($attribs),                       // We pass in the array_keys instead of the array here
        function ($carry, $key) use ($attribs) {    // ... then we 'use' the actual array here
            return $carry . ' ' . $key . '="' . htmlspecialchars( $attribs[$key] ) . '"';
        },
        ''
    );

echo $formatted_attribs;

?>

This will output:
 name="first_name" value="Edward"
cwu at nolo dot com 18-Sep-2015 07:34
The single value returned by array_reduce() can be an array -- as illustrated in the following example:
<?php
# calculate the average of an array
function calculate_sum_and_count($sum_and_count, $item)
{
  list($sum, $count) = $sum_and_count;
  $sum += $item;
  $count += 1;
  return [$sum, $count];
}

$a = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$initial_sum_and_count = [0, 0];
list($sum, $count) = array_reduce($a, "calculate_sum_and_count", $initial_sum_and_count);
echo $sum / $count;
?>
aiadfaris at yahoo dot de 29-May-2014 08:16
notice to function array_reduce()
I suppose the function rsum in the example 1 so it is not correct,
but
$ v + = $ w;
will output 15
aiadfaris at yahoo dot de 29-May-2014 08:14
notice to function array_reduce()
I suppose the function rsum in the example 1 so it is not correct,
but
$ v + = $ w;
will output 15
magnesium dot oxide dot play+php at gmail dot com 11-Apr-2014 05:27
You can reduce a two-dimensional array into one-dimensional using array_reduce and array_merge. (PHP>=5.3.0)

<?php

$two_dimensional = array();
$two_dimensional['foo'] = array(1, 2, 3);
$two_dimensional['bar'] = array(4, 5, 6);

$one_dimensional = array_reduce($two_dimensional, 'array_merge', array());
# becomes array(1, 2, 3, 4, 5, 6)
Altreus 26-Feb-2014 02:30
You can effectively ignore the fact $result is passed into the callback by reference. Only the return value of the callback is accounted for.

<?php

$arr = [1,2,3,4];

var_dump(array_reduce(
    $arr,
    function(&$res, $a) { $res += $a; },
    0
));

# NULL

?>

<?php

$arr = [1,2,3,4];

var_dump(array_reduce(
    $arr,
    function($res, $a) { return $res + $a;  },
    0
));

# int(10)
?>

Be warned, though, that you *can* accidentally change $res if it's not a simple scalar value, so despite the examples I'd recommend not writing to it at all.
kon 03-Dec-2012 01:12
Walking down related object's properties using array_reduce:

<?php
  $a=new stdClass;
  $a->b=new stdClass;
  $a->b->c="Hello World!\n";

  $reductionPath=array("b","c");

  print_r(
    array_reduce(
      $reductionPath,
      function($result, $item){
        return $result->$item;
      },
      $a
    )
  );
?>
ruslan dot zavackiy at gmail dot com 06-Jul-2012 08:29
If you want something elegant in your code, when dealing with reducing array, just unshift first element, and use it as initial, because if you do not do so, you will + first element with first element:

<?php
$arr = array(
    array('min' => 1.5456, 'max' => 2.28548, 'volume' => 23.152),
    array('min' => 1.5457, 'max' => 2.28549, 'volume' => 23.152),
    array('min' => 1.5458, 'max' => 2.28550, 'volume' => 23.152),
    array('min' => 1.5459, 'max' => 2.28551, 'volume' => 23.152),
    array('min' => 1.5460, 'max' => 2.28552, 'volume' => 23.152),
);

$initial = array_shift($arr);

$t = array_reduce($arr, function($result, $item) {
    $result['min'] = min($result['min'], $item['min']);
    $result['max'] = max($result['max'], $item['max']);
    $result['volume'] += $item['volume'];

    return $result;
}, $initial);
?>
php at keith tyler dot com 18-Apr-2010 03:30
If you do not provide $initial, the first value used in the iteration is NULL. This is not a problem for callback functions that treat NULL as an identity (e.g. addition), but is a problem for cases when NULL is not identity (such as boolean context).

Compare:

<?php
function andFunc($a, $b) {
  return $a && $b;
}
$foo = array(true, true, true);
var_dump(array_reduce($foo, "andFunc"));
?>

returns false! One would expect that it would return true because `true && true && true == true`!

Adding diagnostic output to andFunc() shows that the first call to andFunc is with the arguments (NULL, true). This resolves to false (as `(bool) null == false`) and thereby corrupts the whole reduction.

So in this case I have to set `$initial = true` so that the first call to andFunc() will be (true, true). Now, if I were doing, say, orFunc(), I would have to set `$initial = false`. Beware.

Note that the "rmul" case in the example sneakily hides this defect! They use an $initial of 10 to get `10*1*2*3*4*5 = 12000`. So you would assume that without an initial, you would get `1200/10 = 120 = 1*2*3*4*5`. Nope! You get big fat zero, because `int(null)==0`, and `0*1*2*3*4*5 = 0`!

I don't honestly see why array_reduce starts with a null argument. The first call to the callback should be with arguments ($initial[0],$initial[1]) [or whatever the first two array entries are], not (null,$initial[0]). That's what one would expect from the description.

Incidentally this also means that under the current implementation you will incur `count($input)` number of calls to the callback, not `count($input) - 1` as you might expect.
Hayley Watson 23-Oct-2007 02:49
To make it clearer about what the two parameters of the callback are for, and what "reduce to a single value" actually means (using associative and commutative operators as examples may obscure this).

The first parameter to the callback is an accumulator where the result-in-progress is effectively assembled. If you supply an $initial value the accumulator starts out with that value, otherwise it starts out null.
The second parameter is where each value of the array is passed during each step of the reduction.
The return value of the callback becomes the new value of the accumulator. When the array is exhausted, array_reduce() returns accumulated value.

If you carried out the reduction by hand, you'd get something like the following lines, every one of which therefore producing the same result:
<?php
array_reduce(array(1,2,3,4), 'f',         99             );
array_reduce(array(2,3,4),   'f',       f(99,1)          );
array_reduce(array(3,4),     'f',     f(f(99,1),2)       );
array_reduce(array(4),       'f',   f(f(f(99,1),2),3)    );
array_reduce(array(),        'f', f(f(f(f(99,1),2),3),4) );
f(f(f(f(99,1),2),3),4)
?>

If you made function f($v,$w){return "f($v,$w)";} the last line would be the literal result.

A PHP implementation might therefore look something like this (less details like error checking and so on):
<?php
function array_reduce($array, $callback, $initial=null)
{
    $acc = $initial;
    foreach($array as $a)
        $acc = $callback($acc, $a);
    return $acc;
}
?>
yuki [dot] kodama [at] gmail [dot] com 31-Jan-2007 08:56
This code will reduce array deeply.

<?php
function print_s($s) {
    return is_null($s) ? "NULL" : (is_array($s) ? "Array" : ($s ? "TRUE" : "FALSE"));
}
function r_and_dp($a, $b) {
    echo "phase1:" . print_s($a) . "," . print_s($b) . "<br>\n";
    if(is_array($a)) {
        $a = array_reduce($a, "r_and_dp");
    }
    if(is_array($b)) {
        $b = array_reduce($b, "r_and_dp");
    }
    echo "phase2:" . print_s($a) . "," . print_s($b) . "<br>\n";
    $a = is_null($a) ? TRUE : $a;
    $b = is_null($b) ? TRUE : $b;
    echo "phase3:" . print_s($a) . "," . print_s($b) . "<br>\n";
    return $a && $b;
}
$bools = array(TRUE, array(FALSE, TRUE), TRUE);
echo print_s(array_reduce($bools, "r_and_dp")) . "<br>\n";

// result: FALSE
?>

When using boolean, you have to carefully set an "initial" argument.

<?php
function r_or_dp($a, $b) {
    if(is_array($a)) {
        $a = array_reduce($a, "r_or_dp");
    }
    if(is_array($b)) {
        $b = array_reduce($b, "r_or_dp");
    }
    return (is_null($a) ? FALSE : $a) || (is_null($b) ? FALSE : $b);
}
?>
bdechka at yahoo dot ca 10-Jan-2007 12:57
The above code works better this way.

<?php
function reduceToTable($html, $p) {
   $html .= "<TR><TD><a href=\"$p.html\">$p</a></td></tr>\n";
   return $html;
}

$list = Array("page1", "page2", "page3");

$tab = array_reduce($list, "reduceToTable");
echo "<table>".$tab . "</table>\n";
?>
Seanj.jcink.com 04-Jan-2006 06:23
The code posted below by bishop to count the characters of an array is simply... erm... well useless to me...

$array=Array("abc","de","f");
strlen(implode("",$array)); //6

works; and is much smaller. Probably much faster too.


Remplace récursivement dans le premier tableau les éléments des autres tableaux fournis

  • « array_reduce
  • array_replace »
  • PHP Manual
  • Fonctions sur les tableaux
  • Remplace récursivement dans le premier tableau les éléments des autres tableaux fournis

array_replace_recursive

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

array_replace_recursive — Remplace récursivement dans le premier tableau les éléments des autres tableaux fournis

Description

array_replace_recursive ( array $array , array ...$replacements ) : array

array_replace_recursive() remplace les valeurs du tableau array avec les valeurs des mêmes clés issues des tableaux suivants. Si une clé du premier tableau existe dans un des tableaux suivants, sa valeur sera remplacée. Si la clé n'existe pas dans le premier tableau, elle sera créée. Si la clé n'existe que dans le premier tableau, elle sera laissée intacte. Si plusieurs tableaux sont passés comme arguments de remplacement, ils seront traités dans l'ordre.

array_replace_recursive() est récursive : si une valeur est un tableau, la même fonction de remplacement lui sera appliqué.

Si la valeur dans le premier tableau est scalaire, elle sera remplacée par la valeur du second tableau, que ce soit un scalaire ou un tableau. Si la valeur du premier et second tableau sont toutes les deux des tableaux, array_replace_recursive() remplacera les valeurs récursivement.

Liste de paramètres

array

Le tableau dans lequel les éléments sont remplacés.

replacements

Tableaux depuis lesquels les éléments peuvent être extraits.

Valeurs de retour

Retourne un tableau ou null si une erreur survient.

Exemples

Exemple #1 Exemple avec array_replace_recursive()

<?php
$base = array('citrus' => array( "orange") , 'berries' => array("blackberry", "raspberry"), );
$replacements = array('citrus' => array('pineapple'), 'berries' => array('blueberry'));

$basket = array_replace_recursive($base, $replacements);
print_r($basket);

$basket = array_replace($base, $replacements);
print_r($basket);
?>

L'exemple ci-dessus va afficher :

Array
(
    [citrus] => Array
        (
            [0] => pineapple
        )

    [berries] => Array
        (
            [0] => blueberry
            [1] => raspberry
        )

)
Array
(
    [citrus] => Array
        (
            [0] => pineapple
        )

    [berries] => Array
        (
            [0] => blueberry
        )

)

Exemple #2 Exemple avec array_replace_recursive() et la récursivité

<?php
$base = array('citrus' => array("orange") , 'berries' => array("blackberry", "raspberry"), 'others' => 'banana' );
$replacements = array('citrus' => 'pineapple', 'berries' => array('blueberry'), 'others' => array('litchis'));
$replacements2 = array('citrus' => array('pineapple'), 'berries' => array('blueberry'), 'others' => 'litchis');

$basket = array_replace_recursive($base, $replacements, $replacements2);
print_r($basket);

?>

L'exemple ci-dessus va afficher :

Array
(
    [citrus] => Array
        (
            [0] => pineapple
        )

    [berries] => Array
        (
            [0] => blueberry
            [1] => raspberry
        )

    [others] => litchis
)

Voir aussi

  • array_replace() - Remplace les éléments d'un tableau par ceux d'autres tableaux
  • array_merge_recursive() - Combine un ou plusieurs tableaux ensemble, récursivement

User Contributed Notes

David Spector 13-Oct-2020 12:18
It seemed to me that the first argument is passed by reference, so it will contain the results of this operation, but experiment shows that this is not true. The array value from the first argument is modified by each succeeding argument, and the result is returned to the caller. The array passed as the first argument is not modified.
Pau Prat Torrella 10-Feb-2020 05:14
Note that function will NOT replace a sub-tree from you $array1 if its value in $array2 is an empty array.
Even tho the key for this dimension is technically 'set'.

(I suppose it treats it as just another recursive level to dive in, finding no key to compare, backtracking while leaving this sub-tree alone)

For example:

$array1  = ['first' => ['second' => 'hello']];
$array2  = ['first' => []];
$result = array_replace_recursive($array1, $array2);

$result is still: ['first' => ['second' => 'hello']].
Uther 04-Jan-2019 06:06
Note that the use of the word "replace" in the function's description is a bit misleading... as none of the parameters are passed by reference, it does not actually replace anything... this simply describes from which parameter the resulting values come.
oliver dot coleman at gmail dot com 25-Nov-2014 08:20
If you came here looking for a function to recursively find and replace (scalar) values in an array (also recurses through objects):

<?php
define('RECURSIVE_REPLACE_MARKER', 'recursive_replace_r47yr74yr7623t74r3645236rtvghdcbnsgxbt67g5e21873891');
/**
 * Recursively replaces scalar values in objects and arrays. The passed array or object is altered in place.
 * @param mixed $data An object or array.
 * @param mixed $find The scalar value to find.
 * @param mixed $replace The value to replace with (need not be a scalar).
 */
function recursive_replace(&$data, $find, $replace){
  if(is_array($data)) {
    if (!isset($data[RECURSIVE_REPLACE_MARKER])) {
      $data[RECURSIVE_REPLACE_MARKER] = TRUE;
      foreach($data as $key=>$val) {
        if(is_array($data[$key]) || is_object($data[$key])) {
          recursive_replace($data[$key], $find, $replace);
        }
        else{
          if($data[$key] === $find) {
            $data[$key] = $replace;
          }
        }
      }
      unset($data[RECURSIVE_REPLACE_MARKER]);
    }
  }
  elseif (is_object($data)) {
    if (!isset($data->RECURSIVE_REPLACE_MARKER)) {
      $data->RECURSIVE_REPLACE_MARKER = TRUE;
      foreach($data as $key=>$val) {
        if(is_array($data->$key) || is_object($data->$key)){
          recursive_replace($data->$key, $find, $replace);
        }else{
          if($data->$key === $find) {
            $data->$key = $replace;
          }
        }
      }
      unset($data->RECURSIVE_REPLACE_MARKER);
    }
  }
}
?>
msahagian at dotink dot org 13-Jul-2012 11:33
This is a fairly concise version which does not rely on traditional recursion:

<?php
    function array_replace_recursive($base, $replacements)
    {
        foreach (array_slice(func_get_args(), 1) as $replacements) {
            $bref_stack = array(&$base);
            $head_stack = array($replacements);

            do {
                end($bref_stack);

                $bref = &$bref_stack[key($bref_stack)];
                $head = array_pop($head_stack);

                unset($bref_stack[key($bref_stack)]);

                foreach (array_keys($head) as $key) {
                    if (isset($key, $bref) && is_array($bref[$key]) && is_array($head[$key])) {
                        $bref_stack[] = &$bref[$key];
                        $head_stack[] = $head[$key];
                    } else {
                        $bref[$key] = $head[$key];
                    }
                }
            } while(count($head_stack));
        }

        return $base;
    }
?>
Gregor at der-meyer dot de 29-Jul-2009 06:13
Nice that this function finally found its was to the PHP core! If you want to use it also with older PHP versions before 5.3.0, you can define it this way:

<?php
if (!function_exists('array_replace_recursive'))
{
  function array_replace_recursive($array, $array1)
  {
    function recurse($array, $array1)
    {
      foreach ($array1 as $key => $value)
      {
        // create new key in $array, if it is empty or not an array
        if (!isset($array[$key]) || (isset($array[$key]) && !is_array($array[$key])))
        {
          $array[$key] = array();
        }

        // overwrite the value in the base array
        if (is_array($value))
        {
          $value = recurse($array[$key], $value);
        }
        $array[$key] = $value;
      }
      return $array;
    }

    // handle the arguments, merge one by one
    $args = func_get_args();
    $array = $args[0];
    if (!is_array($array))
    {
      return $array;
    }
    for ($i = 1; $i < count($args); $i++)
    {
      if (is_array($args[$i]))
      {
        $array = recurse($array, $args[$i]);
      }
    }
    return $array;
  }
}
?>

I called this function array_merge_recursive_overwrite() in my older projects, but array_replace_recursive() sounds quite better while they do the same.

If you implemented such a compatible function before and don't want to refactor all your code, you can update it with the following snippet to use the native (and hopefully faster) implementation of PHP 5.3.0, if available. Just start your function with these lines:

<?php
  // as of PHP 5.3.0 array_replace_recursive() does the work for us
  if (function_exists('array_replace_recursive'))
  {
    return call_user_func_array('array_replace_recursive', func_get_args());
  }
?>
kyle [dot] florence [@t] gmail [dot] com 14-Jul-2009 04:16
This might help out people who don't have 5.3 running:

<?php

// Joins two or more arrays together recursively; key/value pairs of the first
// array are replaced with key/value pairs from the subsequent arrays.  Any
// key/value pair not present in the first array is added to the final array
function array_join()
{
    // Get array arguments
    $arrays = func_get_args();

    // Define the original array
    $original = array_shift($arrays);

    // Loop through arrays
    foreach ($arrays as $array)
    {
        // Loop through array key/value pairs
        foreach ($array as $key => $value)
        {
            // Value is an array
            if (is_array($value))
            {
                // Traverse the array; replace or add result to original array
                $original[$key] = array_join($original[$key], $array[$key]);
            }

            // Value is not an array
            else
            {
                // Replace or add current value to original array
                $original[$key] = $value;
            }
        }
    }

    // Return the joined array
    return $original;
}

?>


Remplace les éléments d'un tableau par ceux d'autres tableaux

  • « array_replace_recursive
  • array_reverse »
  • PHP Manual
  • Fonctions sur les tableaux
  • Remplace les éléments d'un tableau par ceux d'autres tableaux

array_replace

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

array_replace — Remplace les éléments d'un tableau par ceux d'autres tableaux

Description

array_replace ( array $array , array ...$replacements ) : array

array_replace() remplace les valeurs du tableau array avec les valeurs ayant les mêmes clés dans les tableaux fournis. Si une clé du premier tableau existe dans un des tableaux suivants, sa valeur sera remplacée. Si la clé n'existe pas dans le premier tableau, elle sera créée. Si la clé n'existe que dans le premier tableau, elle sera laissée intacte. Si plusieurs tableaux sont passés comme arguments de remplacement, ils seront traités dans l'ordre.

array_replace() n'est pas récursif : il remplace les valeurs du premier tableau par la valeur des tableaux suivants, quel que soit leur type.

Liste de paramètres

array

Le tableau dans lequel les éléments sont remplacés.

replacements

Tableaux depuis lesquels les éléments seront extraits. Les valeurs des futurs tableaux écraseront les valeurs précédentes.

Valeurs de retour

Retourne un tableau ou null si une erreur survient.

Exemples

Exemple #1 Exemple avec array_replace()

<?php
$base = array("orange", "banana", "apple", "raspberry");
$replacements = array(0 => "pineapple", 4 => "cherry");
$replacements2 = array(0 => "grape");

$basket = array_replace($base, $replacements, $replacements2);
print_r($basket);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => grape
    [1] => banana
    [2] => apple
    [3] => raspberry
    [4] => cherry
)

Voir aussi

  • array_replace_recursive() - Remplace récursivement dans le premier tableau les éléments des autres tableaux fournis
  • array_merge() - Fusionne plusieurs tableaux en un seul

User Contributed Notes

ivijan dot stefan at gmail dot com 14-Nov-2016 09:16
If you work on some realy old server below PHP5 you can use array_merge like "necessary evil" to replace values in array:

Here is example how you can use this:

<?php
if(function_exists("array_replace") && version_compare(phpversion(), '5.3.0', '>='))
        $data = array_replace($array1, $array2); // (PHP 5 >= 5.3.0)
    else
        $data = array_merge($array1, $array2); // (PHP 5 < 5.3.0)
var_dump($data);
?>

This can also help someplugin developers to cover some old PHP versions.
ali dot sweden19 at yahoo dot com 25-Jan-2016 02:42
Here is a simple array_replace_keys function:

/**
     * This function replaces the keys of an associate array by those supplied in the keys array
     *
     * @param $array target associative array in which the keys are intended to be replaced
     * @param $keys associate array where search key => replace by key, for replacing respective keys
     * @return  array with replaced keys
     */
    private function array_replace_keys($array, $keys)
    {
        foreach ($keys as $search => $replace) {
            if ( isset($array[$search])) {
                $array[$replace] = $array[$search];
                unset($array[$search]);
            }
        }

        return $array;
    }

// Test Drive

print_r(array_replace_keys(['one'=>'apple', 'two'=>'orange'], ['one'=>'ett', 'two'=>'tvo']);
// Output
array(
'ett'=>'apple',
'tvo'=>'orange'
)
projacore at gmail dot com 26-Jul-2015 07:45
You can also use:

<?php
$myarray = [
"Orange",
"572" => "Banana",
"omg" => "Chili",
"nevermind" => "mango"
];

$myarray[0] = "NO-Orange";
$myarray["572"] = "BANANAPHONE!!!";
$myarray["omg"] = "NO-Chili";

print_r($myarray);

?>

RESULT:
Array
(
    [0] => NO-Orange
    [572] => BANANAPHONE!!!
    [omg] => NO-Chili
    [nevermind] => mango
)

with regards
Anonymous 08-May-2015 07:17
The documentation is wrongly phrased: "array_replace() replaces the values of array1"  No replacing is done. A new array is created which looks like the one that would have resulted from the described replacement.

If you want to augment the set of indices in an array, use
       array_to_be_modified += array_with_indices_to_add;
lm713 15-Oct-2014 01:40
If the arrays are associative (that is, their keys are strings), then I believe this function is identical to (the older) array_merge.
kyberprizrak 15-Jun-2014 01:08
if(!function_exists('array_replace'))
{
  function array_replace()
  {
    $args = func_get_args();
    $num_args = func_num_args();
    $res = array();
    for($i=0; $i<$num_args; $i++)
    {
      if(is_array($args[$i]))
      {
        foreach($args[$i] as $key => $val)
        {
          $res[$key] = $val;
        }
      }
      else
      {
        trigger_error(__FUNCTION__ .'(): Argument #'.($i+1).' is not an array', E_USER_WARNING);
        return NULL;
      }
    }
    return $res;
  }
}
marvin_elia at web dot de 18-Mar-2014 11:45
Simple function to replace array keys. Note you have to manually select wether existing keys will be overrided.

/**
  * @param array $array
  * @param array $replacements
  * @param boolean $override
  * @return array
  */
function array_replace_keys(array $array, array $replacements, $override = false) {
    foreach ($replacements as $old => $new) {
        if(is_int($new) || is_string($new)){
            if(array_key_exists($old, $array)){
                if(array_key_exists($new, $array) && $override === false){
                    continue;
                }
                $array[$new] = $array[$old];
                unset($array[$old]);
            }
        }
    }
    return $array;
}
gmastro77 at gmail dot com 10-Apr-2013 05:05
In some cases you might have a structured array from the database and one
of its nodes goes like this;

<?php
# a random node structure
$arr    = array(
    'name'  => 'some name',
    'key2'  => 'value2',
    'title' => 'some title',
    'key4'  => 4,
    'json'  => '[1,0,1,1,0]'
);

# capture these keys values into given order
$keys   = array( 'name', 'json', 'title' );
?>

Now consider that you want to capture $arr values from $keys.
Assuming that you have a limitation to display the content into given keys
order, i.e. use it with a vsprintf, you could use the following

<?php
# string to transform
$string = "<p>name: %s, json: %s, title: %s</p>";

# flip keys once, we will use this twice
$keys   = array_flip( $keys );

# get values from $arr
$test   = array_intersect_key( $arr, $keys );

# still not good enough
echo vsprintf( $string, $test );
// output --> name: some name, json: some title, title: [1,0,1,1,0]

# usage of array_replace to get exact order and save the day
$test   = array_replace( $keys, $test );

# exact output
echo vsprintf( $string, $test );
// output --> name: some name, json: [1,0,1,1,0], title: some title

?>

I hope that this will save someone's time.
steelpandrummer 14-Aug-2012 09:19
<?php
// we wanted the output of only selected array_keys from a big array from a csv-table
// with different order of keys, with optional suppressing of empty or unused values

$values = array
(
    'Article'=>'24497',
    'Type'=>'LED',
    'Socket'=>'E27',
    'Dimmable'=>'',
    'Wattage'=>'10W'
);

$keys = array_fill_keys(array('Article','Wattage','Dimmable','Type','Foobar'), ''); // wanted array with empty value

$allkeys = array_replace($keys, array_intersect_key($values, $keys));    // replace only the wanted keys

$notempty = array_filter($allkeys, 'strlen'); // strlen used as the callback-function with 0==false

print '<pre>';
print_r($allkeys);
print_r($notempty);

/*
Array
(
    [Article] => 24497
    [Wattage] => 10W
    [Dimmable] =>
    [Type] => LED
    [Foobar] =>
)
Array
(
    [Article] => 24497
    [Wattage] => 10W
    [Type] => LED
)
*/
?>
sun at drupal dot org 27-May-2011 11:42
Instead of calling this function, it's often faster and simpler to do this instead:

<?php
$array_replaced = $array2 + $array1;
?>

If you need references to stay intact:

<?php
$array2 += $array1;
?>
polecat at p0lecat dot com 29-Nov-2010 10:02
I got hit with a noob mistake. :)

When the function was called more than once, it threw a function redeclare error of course.  The enviroment I was coding in never called it more than once but I caught it in testing and here is the fully working revision.  A simple logical step was all that was needed.

With PHP 5.3 still unstable for Debian Lenny at this time and not knowing if array_replace would work with multi-dimensional arrays, I wrote my own.  Since this site has helped me so much, I felt the need to return the favor. :)

<?php
        // Polecat's Multi-dimensional array_replace function
        // Will take all data in second array and apply to first array leaving any non-corresponding values untouched and intact
        function polecat_array_replace( array &$array1, array &$array2 ) {
            // This sub function is the iterator that will loop back on itself ad infinitum till it runs out of array dimensions
            if(!function_exists('tier_parse')){
                function tier_parse(array &$t_array1, array&$t_array2) {
                    foreach ($t_array2 as $k2 => $v2) {
                        if (is_array($t_array2[$k2])) {
                            tier_parse($t_array1[$k2], $t_array2[$k2]);
                        } else {
                            $t_array1[$k2] = $t_array2[$k2];
                        }
                    }
                    return $t_array1;
                }
            }

            foreach ($array2 as $key => $val) {
                if (is_array($array2[$key])) {
                    tier_parse($array1[$key], $array2[$key]);
                } else {
                    $array1[$key] = $array2[$key];
                }
            }
            return $array1;
        }
?>

[I would also like to note] that if you want to add a single dimensional array to a multi, all you must do is pass the matching internal array key from the multi as the initial argument as such:

<?php
$array1 = array( "berries" => array( "strawberry" => array( "color" => "red", "food" => "desserts"), "dewberry" = array( "color" => "dark violet", "food" => "pies"), );

$array2 = array( "food" => "wine");

$array1["berries"]["dewberry"] = polecat_array_replace($array1["berries"]["dewberry"], $array2);
?>

This is will replace the value for "food" for "dewberry" with "wine".

The function will also do the reverse and add a multi to a single dimensional array or even a 2 tier array to a 5 tier as long as the heirarchy tree is identical.

I hope this helps atleast one person for all that I've gained from this site.
polecat at p0lecat dot com 29-Nov-2010 09:57
I would like to add to my previous note about my polecat_array_replace function that if you want to add a single dimensional array to a multi, all you must do is pass the matching internal array key from the multi as the initial argument as such:

$array1 = array( "berries" => array( "strawberry" => array( "color" => "red", "food" => "desserts"), "dewberry" = array( "color" => "dark violet", "food" => "pies"), );

$array2 = array( "food" => "wine");

$array1["berries"]["dewberry"] = polecat_array_replace($array1["berries"]["dewberry"], $array2);

This is will replace the value for "food" for "dewberry" with "wine".

The function will also do the reverse and add a multi to a single dimensional array or even a 2 tier array to a 5 tier as long as the heirarchy tree is identical.

I hope this helps atleast one person for all that I've gained from this site.
mail at romansklenar dot cz 10-Dec-2009 07:01
To get exactly same result like in PHP 5.3, the foreach loop in your code should look like:

<?php
...
$count = func_num_args();

for ($i = 1; $i < $count; $i++) {
   ...
}
...
?>

Check on this code:

<?php
$base = array('id' => NULL, 'login' => NULL, 'credit' => NULL);
$arr1 = array('id' => 2, 'login' => NULL, 'credit' => 5);
$arr2 = array('id' => NULL, 'login' => 'john.doe', 'credit' => 100);
$result = array_replace($base, $arr1, $arr2);

/*
correct output:

array(3) {
   "id" => NULL
   "login" => string(8) "john.doe"
   "credit" => int(100)
}

your output:

array(3) {
   "id" => int(2)
   "login" => NULL
   "credit" => int(5)
}
*/
?>

Function array_replace "replaces elements from passed arrays into the first array" -- this means replace from top-right to first, then from top-right - 1 to first, etc, etc...
tufan dot oezduman at googlemail dot com 06-Nov-2009 04:19
a little enhancement to dyer85 at gmail dot com's function below:
<?php
if (!function_exists('array_replace'))
{
  function array_replace( array &$array, array &$array1, $filterEmpty=false )
  {
    $args = func_get_args();
    $count = func_num_args()-1;

    for ($i = 0; $i < $count; ++$i) {
      if (is_array($args[$i])) {
        foreach ($args[$i] as $key => $val) {
            if ($filterEmpty && empty($val)) continue;
            $array[$key] = $val;
        }
      }
      else {
        trigger_error(
          __FUNCTION__ . '(): Argument #' . ($i+1) . ' is not an array',
          E_USER_WARNING
        );
        return NULL;
      }
    }

    return $array;
  }
}
?>

this will allow you to "tetris-like" merge arrays:

<?php

$a= array(
    0 => "foo",
    1 => "",
    2 => "baz"
);
$b= array(
    0 => "",
    1 => "bar",
    2 => ""
);

print_r(array_replace($a,$b, true));

?>
results in:
Array
(
    [0] => foo
    [1] => bar
    [2] => baz
)


Inverse l'ordre des éléments d'un tableau

  • « array_replace
  • array_search »
  • PHP Manual
  • Fonctions sur les tableaux
  • Inverse l'ordre des éléments d'un tableau

array_reverse

(PHP 4, PHP 5, PHP 7, PHP 8)

array_reverse — Inverse l'ordre des éléments d'un tableau

Description

array_reverse ( array $array , bool $preserve_keys = false ) : array

array_reverse() retourne un nouveau tableau qui contient les mêmes éléments que array, mais dans l'ordre inverse.

Liste de paramètres

array

Le tableau d'entrée.

preserve_keys

Si définit à true, les clés numériques seront préservées. Les clés non-numériques ne seront pas affectées par cette configuration, et seront toujours préservées.

Valeurs de retour

Retourne le tableau dans l'ordre inverse.

Exemples

Exemple #1 Exemple avec array_reverse()

<?php
$input  = array("php", 4.0, array("green", "red"));
$reversed = array_reverse($input);
$preserved = array_reverse($input, true);

print_r($input);
print_r($reversed);
print_r($preserved);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => php
    [1] => 4
    [2] => Array
        (
            [0] => green
            [1] => red
        )

)
Array
(
    [0] => Array
        (
            [0] => green
            [1] => red
        )

    [1] => 4
    [2] => php
)
Array
(
    [2] => Array
        (
            [0] => green
            [1] => red
        )

    [1] => 4
    [0] => php
)

Voir aussi

  • array_flip() - Remplace les clés par les valeurs, et les valeurs par les clés

User Contributed Notes

There are no user contributed notes for this page.


Recherche dans un tableau la clé associée à la première valeur

  • « array_reverse
  • array_shift »
  • PHP Manual
  • Fonctions sur les tableaux
  • Recherche dans un tableau la clé associée à la première valeur

array_search

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

array_search — Recherche dans un tableau la clé associée à la première valeur

Description

array_search ( mixed $needle , array $haystack , bool $strict = false ) : int|string|false

Recherche needle dans haystack.

Liste de paramètres

needle

La valeur à chercher.

Note:

Si needle est une chaîne de caractères, la comparaison est effectuée en respectant la casse.

haystack

Le tableau.

strict

Si le troisième paramètre strict vaut true, alors array_search() cherchera des éléments identiques dans haystack. Cela signifie que cette fonction va effectuer une comparaison stricte du type de needle dans haystack, et que les objets proviennent de la même instance.

Valeurs de retour

Retourne la clé pour needle si elle est trouvée dans le tableau, false sinon.

Si needle est trouvé plus d'une fois dans haystack, la première clé concordante est retournée. Pour trouver toutes les clés correspondantes, utilisez plutôt la fonction array_keys() avec le paramètre optionnel search_value.

Avertissement

Cette fonction peut retourner false, mais elle peut aussi retourner une valeur équivalent à false. Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour exacte de cette fonction.

Exemples

Exemple #1 Exemple avec array_search()

<?php
$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');

$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array);   // $key = 1;
?>

Voir aussi

  • array_keys() - Retourne toutes les clés ou un ensemble des clés d'un tableau
  • array_values() - Retourne toutes les valeurs d'un tableau
  • array_key_exists() - Vérifie si une clé existe dans un tableau
  • in_array() - Indique si une valeur appartient à un tableau

User Contributed Notes

trash-11 at mail dot ru 03-Feb-2021 12:22
array_search of null doesn't return FALSE, be careful
joe at white-fire dot co dot uk 18-May-2020 09:32
By extension of  `sunelbe at gmail dot com` solution to search for a specific array element with key value in a multidimensional array, this one also returns the parent.

<?php
function array_search_multi(
    $array,
    $key,
    $value,
    $parent = false
) {
    $results = array();

    if (is_array($array)) {
        if (isset($array[$key]) && $array[$key] == $value)
            $results[] = $array;

        foreach ($array as $id => $subarray) {
            $found = array_search_multi(
                $subarray, $key, $value
            );

            if(!empty($found)) {
                if($parent) {
                    $results[$id] =
                        $array[$id];
                } else {
                    $results = $found;
                }
            }
        }
    }

    return $results;
}

$array = array(
        'key1' => array(
            'ID' => 1,
            'key2' => array(
                'ID' => 2,
                'key3' => array(
                    'ID' => 3
                )
            )
        ),
        'key4' => 4,
        'key6' => array(
            'ID' => 5,
            'key7' => array(
                'ID' => 6,
                'key8' => array(
                    'ID' => 7,
                    'value' => 'test'
                )
            )
        )
);

array_search_multi($array, 'ID', 7, false);

[0] => Array
        (
            [ID] => 7
            [value] => test
        )

array_search_multi($array, 'ID', 7, true);

[key6] => Array
        (
            [ID] => 5
            [key7] => Array
                (
                    [ID] => 6
                    [key8] => Array
                        (
                            [ID] => 7
                            [value] => test
                        )

                )
nordseebaer at gmx dot de 08-May-2020 08:08
It's really important to check the return value is not false! I used array_search() to determine the index of an value to unset this value and then realized that $arr[false] === $arr[0] !

<?php
$arr = ['apple', 'banana'];

var_dump($arr[0] === 'apple'); // true
var_dump($arr[false] === $arr[0]); // true
var_dump($arr[false] === 'apple'); // true

unset($arr[array_search('banana', $arr)]); //index = 1
var_dump($arr);

// result
//   array(1) {
//     [0]=>
//     string(5) "apple"
//   }

unset($arr[array_search('peach', $arr)]); //not found, result is false
var_dump($arr);

// result
//   array(0) {
//   }
// because $arr[false] === $arr[0]
?>

So always check the return of array_search!
yasien dot dwieb at gmail dot com 28-Apr-2020 05:41
Beware when using array_search to a mix of string and integer where prefixes of keys may collide, as in my case I have encountered the following situation:

Assume you have the following array:
<?php
$arr = [
           1 => 'index 0',
           2 => 'index 1',
           3 => 'index 2',
           '3anothersuffix' => 'index 3'
];

$index1 = array_search('3', array_keys($arr)); // 2
$index2 = array_search('3anothersuffix', array_keys($arr)); //2
?>

$index1 and $index2 will be the same

after using strict type search:

<?php
$index1 = array_search('3', array_keys($arr), true); // false
$index2 = array_search('3anothersuffix', array_keys($arr), true);  //3
?>

it will not find $index1 at all while returning a correct value for $index2;
it2 dot mnr at gmail dot com 04-Apr-2020 06:54
About searcing in multi-dimentional arrays;
note on "xfoxawy at gmail dot com":

If you use your own keys in a multidimensional array, this will not work. Better use for this situation:

array_search($searchingValue, array_map(function($val){return $val['KEY_NAME'];}, $inputArray));
David Spector 10-Aug-2019 11:16
For data lookups that are fast in both directions (key to value, value to key), consider storing and updating both the array and its array_flip() version.
David Spector 10-Aug-2019 11:15
The fastest way to search for a cached value, to find if there is a cycle in your data, to see if a given program state has occurred before, to see whether a value is in a set and then adding it, and for so many similar tasks, is just to do an array dereference:

    $Key=$SomeStateString1.'|'.$SomeStateString2; // State can have multiple substates
    if (@$StateSet[$Key]) // or use isset()
        ; // The key already exists: do optional processing here
    else
        ; // The key does not yet exist: do optional processing here
    $StateSet[$Key]=1; // Store state existence (or store associated data values)
pvv at renam dot md 17-Jan-2019 08:12
About searcing in multi-dimentional arrays;
note on "xfoxawy at gmail dot com" and turabgarip at gmail dot com;

$xx = array_column($array, 'NAME', 'ID');
will produce an array like :
 $xx = [
[ID_val] => NAME_val
[ID_val] => NAME_val
        ]

so:

$yy = array_search('tesxt', array_column($array, 'NAME', 'ID'));
will output expected ID;
venkatesh dot ksnadar at gmail dot com 06-Nov-2018 11:49
you need to be careful if you are using array_search() with unset() for deleting a value in the searched indexed

// wrong way
$checked = ["1", "2", "3"]; // array with numbers in double quotes

unset($checked[array_search('on', $checked)]); // this deletes value at 0 index

// array_search returns mixed data type, which means any type of data will be returned
// in the above case it returned false and false is type casted to 0
// so it deletes the value at index zero

the point to say is never use array_search() with unset() while deleting a value in an array using index.
grayaahammed at gmail dot com 17-May-2018 12:47
this is for searching a value inside a multidimontionnal array, and then return the parent of the parent array that holds the value.

function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        $current_key=$key;
        if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value))) {
            return $haystack[$key];
        }
    }
    return false;
}
miguelserranocabeza at gmail dot com 18-Apr-2018 10:56
For multiarray values i got this solution ;)

$taxonomy = array(
    array('index' => array('AU200_AUD','CN50_USD')),
    array('mt' => array('XAG_GBP','XAG_HKD','XAU_GBP','XAU_HKD','XAU_JPY')),
    array('aud' => array('AUD_CAD','AUD_CHF','AUD_HKD','AUD_JPY','AUD_NZD','AUD_SGD','AUD_USD')),
    array('cad' => array('CAD_CHF','CAD_HKD','CAD_JPY','CAD_SGD','CHF_HKD','CHF_JPY','CHF_ZAR')),
    array('eur' => array('EUR_AUD','EUR_CAD','EUR_CHF','EUR_NOK','EUR_NZD','EUR_PLN','EUR_ZAR')),
    array('gbp' => array('GBP_AUD','GBP_CAD','GBP_CHF','GBP_USD','GBP_ZAR')),
    array('hkd' => array('HKD_JPY')),
    array('nzd' => array('NZD_CAD','NZD_CHF','NZD_HKD','NZD_JPY','NZD_SGD','NZD_USD')),
    array('sgd' => array('SGD_CHF','SGD_HKD','SGD_JPY')),
    array('try' => array('TRY_JPY')),
    array('usd' => array('USD_CAD','USD_CHF','USD_CNH','USD_SGD','USD_THB','USD_TRY','USD_ZAR')),
    array('zar' => array('ZAR_JPY')),
  );

  foreach ($taxonomies as $key => $tax) {
    foreach ($tax as $value) {
      if(array_search('SGD_HKD', $value)) $taxonomy = key($tax);
    }
  }
echo($taxonomy); // this print "sgd"
Xriuk 10-Feb-2018 11:52
Be careful when search for indexes from array_keys() if you have a mixed associative array it will return both strings and integers resulting in comparison errors

<?php
// This syntax is allowed by PHP
$arr = array(
  "nice",
  "car" => "fast",
  "none"
);

// Print the keys
var_dump(array_keys($arr));

/* The above prints this, as you can see we have mixed keys
array(3) {
  [0]=>
  int(0)
  [1]=>
  string(3) "car"
  [2]=>
  int(1)
}
*/

// Search for the index "car"
var_dump(array_search("car", array_keys($arr))); // Prints "int(0)" which is WRONG
?>

This happens because PHP, when comparing strings and integers, casts strings TO integers and this results in most of the cases in string becoming 0, so that's why when array_search() compares the first index (0) with the key "car" it gets true because apparently ("car" == 0) IS TRUE.
Setting array_search() to strict mode won't solve the problem because then array_search("0", array_keys($arr)) would return false even if an element with index 0 exists.
So my solution just converts all indexes from array_keys() to strings and then compares them correctly:

<?php
var_dump(array_search("car", array_map("strval", array_keys($arr)))); // Prints "int(1)" which is CORRECT
?>
thinbegin at gmail dot com 18-Jan-2018 10:18
Despite PHP's amazing assortment of array functions and juggling maneuvers, I found myself needing a way to get the FULL array key mapping to a specific value. This function does that, and returns an array of the appropriate keys to get to said (first) value occurrence.

function array_recursive_search_key_map($needle, $haystack) {
    foreach($haystack as $first_level_key=>$value) {
        if ($needle === $value) {
            return array($first_level_key);
        } elseif (is_array($value)) {
            $callback = array_recursive_search_key_map($needle, $value);
            if ($callback) {
                return array_merge(array($first_level_key), $callback);
            }
        }
    }
    return false;
}

usage example:
-------------------

$nested_array = $sample_array = array(
    'a' => array(
        'one' => array ('aaa' => 'apple', 'bbb' => 'berry', 'ccc' => 'cantalope'),
        'two' => array ('ddd' => 'dog', 'eee' => 'elephant', 'fff' => 'fox')
    ),
    'b' => array(
        'three' => array ('ggg' => 'glad', 'hhh' => 'happy', 'iii' => 'insane'),
        'four' => array ('jjj' => 'jim', 'kkk' => 'kim', 'lll' => 'liam')
    ),
    'c' => array(
        'five' => array ('mmm' => 'mow', 'nnn' => 'no', 'ooo' => 'ohh'),
        'six' => array ('ppp' => 'pidgeon', 'qqq' => 'quail', 'rrr' => 'rooster')
    )
);

$search_value = 'insane';

$array_keymap = array_recursive_search_key_map($search_value, $nested_array);

var_dump($array_keymap);
// Outputs:
// array(3) {
// [0]=>
//  string(1) "b"
//  [1]=>
//  string(5) "three"
//  [2]=>
//  string(3) "iii"
//}

----------------------------------------------

But again, with the above solution, PHP again falls short on how to dynamically access a specific element's value within the nested array. For that, I wrote a 2nd function to pull the value that was mapped above.

function array_get_nested_value($keymap, $array)
{
    $nest_depth = sizeof($keymap);
    $value = $array;
    for ($i = 0; $i < $nest_depth; $i++) {
        $value = $value[$keymap[$i]];
    }

    return $value;
}

usage example:
-------------------
echo array_get_nested_value($array_keymap, $nested_array);   // insane
t-fav 19-Oct-2017 01:20
Noted some interesting behaviour when using array_search to find the correct index in an array containing an index with a value of 0.

The following works as expected.

<?php

$dataSet = [];
$dataSet[] = ['name' => 'Row A', 'items' => ['ItemA' => 1, 'ItemB' => 2]];
$dataSet[] = ['name' => 'Row B', 'items' => ['ItemA' => 1, 'ItemB' => 2]];

$rows = [];
foreach ($dataSet as $dataRow) {
    $row = [
        $dataRow['name'],
        'ItemA',
        'ItemB'
    ];

    foreach ($dataRow['items'] as $key => $value) {
        $index = array_search($key, $row);
        $row[$index] = $value;
    }

    $rows[] = $row;
}

print_r($rows);

It returns:

Array
(
    [0] => Array
        (
            [0] => Row A
            [1] => 1
            [2] => 2
        )
    [1] => Array
        (
            [0] => Row B
            [1] => 1
            [2] => 2
        )
)

However, the following seems to totally ignore the index containing the value 0 and thus returns the wrong index.

<?php

$dataSet = [];
$dataSet[] = ['name' => 'Row A', 'items' => ['ItemA' => 1, 'ItemB' => 2]];
$dataSet[] = ['name' => 'Row B', 'items' => ['ItemA' => 0, 'ItemB' => 2]];

$rows = [];
foreach ($dataSet as $dataRow) {
    $row = [
        $dataRow['name'],
        'ItemA',
        'ItemB'
    ];

    foreach ($dataRow['items'] as $key => $value) {
        $index = array_search($key, $row);
        $row[$index] = $value;
    }

    $rows[] = $row;
}

print_r($rows);

It returns:

Array
(
    [0] => Array
        (
            [0] => Row A
            [1] => 1
            [2] => 2
        )
    [1] => Array
        (
            [0] => Row B
            [1] => 2
            [2] => ItemB
        )
)

However, setting ItemA's value on Row B to '' or false works fine. Also, passing in the third optional parameter [, bool $strict = true ] works correctly as well. Is this intentional behaviour?
justeme at sina dot com 25-Jul-2017 08:42
/*
Be careful!!!
when i in php7.1.5
below program return int 0
is it a bug?
*/
array_search(0,['a','b','c'])
mohamedn085 at gmail dot com 20-Jun-2017 04:59
Mohamed Nabil

hallo every body This function matches two arrays like
search an array like another or not  array_match which can match

function array_match($arr1,$arr2,$highlevel=false)
{

   $keys1=array_keys($arr1);
   $keys2=array_keys($arr2);

   $values1=array_values($arr1);
   $values2=array_values($arr2);

     if ($highlevel)
     {

     if ($keys1 === $keys2 && $values1 === $values2)
     {

         return true;

     }
       return false;
     }

     if ($keys1 == $keys2 && $values1 == $values2)
     {

         return true;

     }
       return false;

}
 var_dump(array_match(['id'=>'1','username'=>'2'],['id'=>'1','username'=>2]));
  //Output:true

 var_dump(array_match(['id'=>'1','username'=>'2'],['id'=>'1','username'=>2],true));
 //Output:false
turabgarip at gmail dot com 10-Mar-2017 03:04
About searcing in multi-dimentional arrays; two notes on "xfoxawy at gmail dot com";

It perfectly searches through multi-dimentional arrays combined with array_column() (min php 5.5.0) but it may not return the values you'd expect.

<?php array_search($needle, array_column($array, 'key')); ?>

Since array_column() will produce a resulting array; it won't preserve your multi-dimentional array's keys. So if you check against your keys, it will fail.

For example;

<?php
$people = array(
  2 => array(
    'name' => 'John',
    'fav_color' => 'green'
  ),
  5=> array(
    'name' => 'Samuel',
    'fav_color' => 'blue'
  )
);

$found_key = array_search('blue', array_column($people, 'fav_color'));
?>

Here, you could expect that the $found_key would be "5" but it's NOT. It will be 1. Since it's the second element of the produced array by the array_column() function.

Secondly, if your array is big, I would recommend you to first assign a new variable so that it wouldn't call array_column() for each element it searches. For a better performance, you could do;

<?php
$colors = array_column($people, 'fav_color');
$found_key = array_search('blue', $colors);
?>
maciej at speccode dot com 18-Aug-2015 05:58
FYI, remember that strict mode is something that might save you hours.

If you're searching for a string and you have a "true" boolean on the way - you will get it as result (first occurrence). Example below:

<?php

$arr = [
    'foo'    => 'bar',
    'abc'    => 'def',
    'bool'   => true,
    'target' => 'xyz'
];

var_dump( array_search( 'xyz', $arr ) ); //bool
var_dump( array_search( 'xyz', $arr, true ) ); //target

?>
xfoxawy at gmail dot com 02-Feb-2015 11:30
in (PHP 5 >= 5.5.0) you don't have to write your own function to search through a multi dimensional array

ex :

$userdb=Array
(
    (0) => Array
        (
            (uid) => '100',
            (name) => 'Sandra Shush',
            (url) => 'urlof100'
        ),

    (1) => Array
        (
            (uid) => '5465',
            (name) => 'Stefanie Mcmohn',
            (pic_square) => 'urlof100'
        ),

    (2) => Array
        (
            (uid) => '40489',
            (name) => 'Michael',
            (pic_square) => 'urlof40489'
        )
);

simply u can use this

$key = array_search(40489, array_column($userdb, 'uid'));
nan at designpromote dot co dot uk 16-Jan-2015 04:45
$array = ['a', 'b', 'c'];
$key = array_search('a', $array); //$key = 0
if ($key)
{
//even a element is found in array, but if (0) means false
//...
}

//the correct way
if (false !== $key)
{
//....
}

It's what the document stated "may also return a non-Boolean value which evaluates to FALSE."
dk at danilok dot com 21-Aug-2014 06:26
I needed a way to return the value of a single specific key, thus:

<?php

function recursive_return_array_value_by_key($needle, $haystack){
    $return = false;
    foreach($haystack as $key => $val){
        if(is_array($val)){
            $return = recursive_return_array_value_by_key($needle, $val);
        }
        else if($needle === $key){
            return "$val\n";
        }
    }
    return $return;
}

?>
sunelbe at gmail dot com 21-Sep-2012 12:19
hey i have a easy multidimensional array search function

<?php
function search($array, $key, $value)
{
    $results = array();

    if (is_array($array))
    {
        if (isset($array[$key]) && $array[$key] == $value)
            $results[] = $array;

        foreach ($array as $subarray)
            $results = array_merge($results, search($subarray, $key, $value));
    }

    return $results;
}
?>
sneskid at hotmail dot com 15-Mar-2012 08:50
I had an array of arrays and needed to find the key of an element by comparing actual reference.
Beware that even with strict equality (===) php will equate arrays via their elements recursively, not by a simple internal pointer check as with class objects. The === can be slow for massive arrays and also crash if they contain circular references.

This function performs reference sniffing in order to return the key for an element that is exactly a reference of needle.

<?php
function array_ref_search(&$v, array &$s)
{
    if(is_object($v)){ return array_search($v, $s, true); }
    foreach($s as $rK => &$rV)
    { // reference sniff
        $tV = $v;
        if( ($rV === ($v = 1)) && ($rV === ($v = 0)) ){
        $v = $tV; return $rK; }
        $v = $tV;
    }
    return false; // use null for php < 4.2.0
}

$list   = array();
$list['A'] = &$valA; $list['B'] = &$valB;

$valA = 1; $valB = 1;
echo 'array_ref_search: ', array_ref_search($valB, $list), '</br>'; // key 'B'
echo 'array_search:     ', array_search($valB, $list, true), '</br>'; // key 'A'

$valA = array(1,2,3); $valB = array(1,2,3);
echo 'array_ref_search: ', array_ref_search($valB, $list), '</br>'; // key 'B'
echo 'array_search:     ', array_search($valB, $list, true), '</br>'; // key 'A' because ($valA === $valB) is true by elements

$valB[] = &$valB; // circular reference
echo 'array_ref_search: ', array_ref_search($valB, $list), '</br>'; // key 'B'
echo 'array_search:     ', array_search($valB, $list, true), '</br>'; // crash because ($valB === $valB) causes infinite loop
?>
revoke 11-Oct-2011 04:12
Better solution of multidimensional searching.

<?php
function multidimensional_search($parents, $searched) {
  if (empty($searched) || empty($parents)) {
    return false;
  }

  foreach ($parents as $key => $value) {
    $exists = true;
    foreach ($searched as $skey => $svalue) {
      $exists = ($exists && IsSet($parents[$key][$skey]) && $parents[$key][$skey] == $svalue);
    }
    if($exists){ return $key; }
  }

  return false;
}

$parents = array();
$parents[] = array('date'=>1320883200, 'uid'=>3);
$parents[] = array('date'=>1320883200, 'uid'=>5);
$parents[] = array('date'=>1318204800, 'uid'=>5);

echo multidimensional_search($parents, array('date'=>1320883200, 'uid'=>5)); // 1
?>
stooshie at gmail dot com 06-Oct-2011 02:51
Example of a recursive binary search that returns the index rather than boolean.
<?php
// returns the index of needle in haystack
function binSearch($needle, $haystack)
{
    // n is only needed if counting depth of search
    global $n;
    $n++;
    // get the length of passed array
    $l = count($haystack);
    // if length is 0, problem
    if($l <= 0)
    {
        return -1;
    }
    // get the mid element
    $m = (($l+($l%2))/2);
    // if mid >= length (e.g. l=1)
    if($m >= $l)
    {
        $m = $m-1;
    }
    // get the indexed element to compare to the passed element and branch accordingly
    $compare = $haystack[$m];
    switch(true)
    {
        case($compare>$needle):
        {
            // recurse on the lower half
            $new_haystack = array_slice($haystack, 0, $m);
            $c = count($new_haystack);
            $r = binSearch($needle, $new_haystack);
            // return current index - (length of lower half - found index in lower half)
            return $m - ($c - $r);
            break;
        }
        case($compare<$needle):
        {
            // recurse on the upper half
            $new_haystack = array_slice($haystack, $m, ($l-$m));
            $c = count($new_haystack);
            $r = binSearch($needle, $new_haystack);
            // return current position + found index in upper half
            return $m + $r;
            break;
        }
        case($compare==$needle):
        {
            // found it, so return index
            return $m;
            break;
        }
    }
}
?>
stefano@takys dot it 14-Jan-2011 01:58
for searching case insensitive better this:

<?php
array_search(strtolower($element),array_map('strtolower',$array));
?>
codeslinger at compsalot dot com 02-Oct-2009 12:22
one thing to be very aware of is that array_search() will fail if the needle is a string and the array itself contains values that are mixture of numbers and strings.  (or even a string that looks like a number)

The problem is that unless you specify "strict" the match is done using ==    and in that case any string will match a numeric value of zero which is not what you want.

-----

also, php can lookup an index pretty darn fast.  for many scenarios, it is practical to maintain multiple arrays, one in which the index of the array is the search key and the normal array that contains the data.

<?php

  $normal[$index] = array('key'=>$key, 'data'=>'foo');
  $inverse[$key] = $index;

  //very fast lookup, this beats any other kind of search

  if (array_key_exists($key, $inverse))
  {
    $index = $inverse[$key];
    return $normal[$index];
  }

?>
buddel 08-Jun-2009 08:13
the recursive function by tony have a small bug. it failes when a key is 0

here is the corrected version of this helpful function:

<?php
function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        $current_key=$key;
        if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
            return $current_key;
        }
    }
    return false;
}
?>
tony dot peter at wanadoo dot fr 11-May-2009 12:53
A simple recursive array_search function :

<?php
function recursive_array_search($needle,$haystack) {
    foreach($haystack as $key=>$value) {
        $current_key=$key;
        if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value))) {
            return $current_key;
        }
    }
    return false;
}
?>
n-regen 05-May-2009 10:36
If you only know a part of a value in an array and want to know the complete value, you can use the following function:
<?php
function array_find($needle, $haystack)
{
   foreach ($haystack as $item)
   {
      if (strpos($item, $needle) !== FALSE)
      {
         return $item;
         break;
      }
   }
}
?>
The function returns the complete first value of $haystack that contains $needle.
helenadeus at gmail dot com 25-Jan-2009 01:05
I was trying to use array_search to retrieve all the values that match a given needle, but it turns out only the first match key is returned. I built this little function, which works just like array_search, but returns all the keys that match a given needle instead. The output is an array.

<?php

$haystack = array('a','b','a','b');

$needle = 'a';

print_r(array_search_all($needle, $haystack));

//Output will be
// Array
// (
//         [0]=>1
//         [1]=>3
// )

function array_search_all($needle, $haystack)
{#array_search_match($needle, $haystack) returns all the keys of the values that match $needle in $haystack

    foreach ($haystack as $k=>$v) {

        if($haystack[$k]==$needle){

           $array[] = $k;
        }
    }
    return ($array);

}

?>
azaozz, gmail 20-Dec-2008 05:23
Expanding on the comment by hansen{}cointel.de:

When searching for a string and the array contains 0 (zero), the string is casted to (int) by the type-casting which is always 0 (perhaps the opposite is the proper behaviour, the array value 0 should have been casted to string). That produces unexpected results if strict comparison is not used:

<?php
$a = array(0, "str1", "str2", "str3");
echo "
str1 = ".array_search("str1", $a).",
str2 = ".array_search("str2", $a).",
str3 = ".array_search("str3", $a).",

str1 strict = ".array_search("str1", $a, true).",
str2 strict = ".array_search("str2", $a, true).",
str3 strict = ".array_search("str3", $a, true);
?>

This will return:
str1 = 0, str2 = 0, str3 = 0, str1 strict = 1, str2 strict = 2, str3 strict = 3
dcez at land dot ru 30-Apr-2008 01:15
Simple way to get variable name by using array_search function:

<?php

function varname($var){

    return (isset($var))? array_search($var, $GLOBALS) : false;

}

$boogie = 'tonight';

echo varname($boogie);

?>
andreas dot damm at maxmachine dot de 03-Apr-2008 04:07
Combining syntax of array_search() and functionality of array_keys() to get all key=>value associations of an array with the given search-value:
<?php
function array_search_values( $m_needle, $a_haystack, $b_strict = false){
    return array_intersect_key( $a_haystack, array_flip( array_keys( $a_haystack, $m_needle, $b_strict)));
}
?>

Usage:
<?php
$array1 = array( 'pre'=>'2', 1, 2, 3, '1', '2', '3', 'post'=>2);
print_r( array_search_values( '2', $array1));
print_r( array_search_values( '2', $array1, true));
print_r( array_search_values( 2, $array1, true));
?>

Will return:
array(4) {
    ["pre"] =>
    string(1) "2"
    [1] =>
    int(2)
    [4] =>
    string(1) "2"
    ["post"] =>
    int(2)
}
array(2) {
    ["pre"] =>
    string(1) "2"
    [4] =>
    string(1) "2"
}
array(2) {
    [1] =>
    int(2)
    ["post"] =>
    int(2)
}
kermes [at] thesevens [dot] net 11-Sep-2007 03:09
A variation of previous searches that returns an array of keys that match the given value:

<?php
function array_ksearch($array, $str)
{
    $result = array();
    for($i = 0; $i < count($array); next($array), $i++)
        if(strtolower(current($array)) == strtolower($str))
            array_push($result, key($array);

    return $result;
}
?>

Usage would be as follows:
<?php
$testArray = array('one' => 'test1', 'two' => 'test2', 'three' => 'test1', 'four' => 'test2', 'five' => 'test1');
    print_r(array_ksearch($testArray, 'test1'));
?>
robertark at gmail dot com 01-Sep-2007 11:20
A better array_isearch would be to store all results in an array, then return the KEYS stored in $found, such as:

<?php
function array_isearch($str, $array){
  $found = array();
  foreach ($array as $k => $v)
      if (strtolower($v) == strtolower($str)) $found[] = $k;
  return $found;
}
?>

To use, simply have an array to search from then search it, for example:

<?php

function array_isearch($str, $array) {
  $found = array();
  foreach($array as $k => $v)
    if(strtolower($v) == strtolower($str)) $found[] = $k;
  return $found;
}

$stored = "these are an array";
$stored = explode(" ", $stored);

$compare = array("these", "are", "some", "results", "stored", "in", "an", "array");
foreach($stored as $store) {
  $results = array_isearch($store, $compare);
  foreach($results as $key => $result)
    echo "Key: ".$results[$key]."<br />Found: ".$compare[$result]."<br />";
}

?>

Hope this helps :-)

-Rob
mark dot php at mhudson dot net 11-Sep-2006 05:49
I was going to complain bitterly about array_search() using zero-based indexes, but then I realized I should be using in_array() instead.

// if ( isset( $_GET['table'] ) and array_search( $_GET['table'], $valid_tables) ) {  // BAD: fails on first[0] element
// if ( isset( $_GET['table'] ) and ( FALSE !== array_search( $_GET['table'], $valid_tables) ) ) { OK: but wasteful and convoluted
   if ( isset( $_GET['table'] ) and in_array( $_GET['table'], $valid_tables) ) { // BETTER

The essence is this: if you really want to know the location of an element in an array, then use array_search, else if you only want to know whether that element exists, then use in_array()
RichGC 20-Mar-2006 05:54
To expand on previous comments, here are some examples of
where using array_search within an IF statement can go
wrong when you want to use the array key thats returned.

Take the following two arrays you wish to search:

<?php
$fruit_array = array("apple", "pear", "orange");
$fruit_array = array("a" => "apple", "b" => "pear", "c" => "orange");

if ($i = array_search("apple", $fruit_array))
//PROBLEM: the first array returns a key of 0 and IF treats it as FALSE

if (is_numeric($i = array_search("apple", $fruit_array)))
//PROBLEM: works on numeric keys of the first array but fails on the second

if ($i = is_numeric(array_search("apple", $fruit_array)))
//PROBLEM: using the above in the wrong order causes $i to always equal 1

if ($i = array_search("apple", $fruit_array) !== FALSE)
//PROBLEM: explicit with no extra brackets causes $i to always equal 1

if (($i = array_search("apple", $fruit_array)) !== FALSE)
//YES: works on both arrays returning their keys
?>
22-Oct-2004 05:01
There is no function to count the occurences of needle in haystack, so I made my own one...

<?php
function array_match($needle, $haystack)
{
    if( !is_array($haystack) ) return false;

    $i = 0;
    while( (in_array( $needle, $haystack )) != FALSE )
    {
        $i++;
        $haystack[array_search($needle, $haystack)] = md5($needle);
        reset($haystack);
    }

    return $i;
}
?>

I know it's a bit crappy, but don't ask me too much, I'm still only 13... ;)
cue at openxbox dot com 09-Jun-2003 07:50
If you are using the result of array_search in a condition statement, make sure you use the === operator instead of == to test whether or not it found a match.  Otherwise, searching through an array with numeric indicies will result in index 0 always getting evaluated as false/null.  This nuance cost me a lot of time and sanity, so I hope this helps someone.  In case you don't know what I'm talking about, here's an example:

<?php
$code = array("a", "b", "a", "c", "a", "b", "b"); // infamous abacabb mortal kombat code :-P

// this is WRONG
while (($key = array_search("a", $code)) != NULL)
{
 // infinite loop, regardless of the unset
 unset($code[$key]);
}

// this is _RIGHT_
while (($key = array_search("a", $code)) !== NULL)
{
 // loop will terminate
 unset($code[$key]);
}
?>


Dépile un élément au début d'un tableau

  • « array_search
  • array_slice »
  • PHP Manual
  • Fonctions sur les tableaux
  • Dépile un élément au début d'un tableau

array_shift

(PHP 4, PHP 5, PHP 7, PHP 8)

array_shift — Dépile un élément au début d'un tableau

Description

array_shift ( array &$array ) : mixed

array_shift() extrait la première valeur du tableau array et la retourne, en raccourcissant array d'un élément, et en déplaçant tous les éléments vers le bas. Toutes les clés numériques seront modifiées pour commencer à zéro pendant que les clés litérales ne seront pas affectées.

Note: Cette fonction remet le pointeur au début du tableau d'entrée (équivalent de reset()).

Liste de paramètres

array

Le tableau d'entrée.

Valeurs de retour

Retourne la valeur dépilée, ou null si le tableau est vide ou si la valeur d'entrée n'est pas un tableau.

Exemples

Exemple #1 Exemple avec array_shift()

<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_shift($stack);
print_r($stack);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => banana
    [1] => apple
    [2] => raspberry
)

et orange a été placé dans $fruit.

Voir aussi

  • array_unshift() - Empile un ou plusieurs éléments au début d'un tableau
  • array_push() - Empile un ou plusieurs éléments à la fin d'un tableau
  • array_pop() - Dépile un élément de la fin d'un tableau

User Contributed Notes

Anonymous 29-Jun-2020 07:05
"$stack" in the example should be called "$queue".
hmztsc at gmail dot com 07-Feb-2020 07:58
// i wanted to remove first array inside to array
// but doesn't work for me : array_shift();

$cargo_file =
Array
(
    [0] => Array
        (
            [0] => Country
            [1] => CountryCode
            [2] => City
            [3] => CityOtherLanguage
            [4] => PostCode
            [5] => Days
        )

    [1] => Array
        (
            [0] => Turkey
            [1] => TR
            [2] => Istanbul
            [3] => Istanbul
            [4] => 34930
            [5] => 9
        )

)

$cargo_file = array_shift($cargo_file);

echo "<pre>";
print_r($cargo_file);
echo "</pre>";

// result after :

/*
Array
(
    [0] => Country
    [1] => CountryCode
    [2] => City
    [3] => CityOtherLanguage
    [4] => PostCode
    [5] => Days
)
*/

i developed a solution

function removeFirstArray($array){

    $new_array = [];
    foreach ($array as $key => $value) {
        if($key > 0){
            $new_array[] = $value;
        }
    }

    return $new_array;
}

$cargo_file= removeFirstArray($cargo_file);

echo "<pre>";
print_r($cargo_file);
echo "</pre>";

Array
(
    [0] => Array
        (
            [0] => Turkey
            [1] => TR
            [2] => Istanbul
            [3] => Istanbul
            [4] => 34930
            [5] => 9
        )

)
wheberson dot com dot br at gmail dot com 26-Sep-2019 01:35
// Ex. 1: signedShiftArray (['A', 'B', 'C', 'D'], 2)        ->        ['C', 'D', 'A', 'B']
// Ex. 2: signedShiftArray (['A', 'B', 'C', 'D'], -3)        ->        ['B', 'C', 'D', 'A']
// Ex. 3: signedShiftArray (['A', 'B', 'C', 'D'], -7)        ->        ['B', 'C', 'D', 'A']

function signedShiftArray ($aItems, $aOffset)

{
    if (empty ($aItems))
        return [];
    else if (empty ($aOffset))
        return $aItems;
    else {
        $t= count ($aItems);
        $n= $aOffset % $t;
        $m= $aOffset > 0 ? $n : $t + $aOffset;
        return array_merge (array_slice ($aItems, $n), array_slice ($aItems, 0, $m));
    }
}
vasiliauskas dot agnius at gmail dot com 07-Mar-2019 08:37
Sometimes instead of shuffling array you just need to rotate it. We can easily rotate left an array with such code:
<?php
$arr[] = array_shift($arr);
?>
biziclop at vipmail dot hu 17-Jan-2018 10:49
<?php

//Be careful when using array_pop/shift/push/unshift with irregularly indexed arrays:

$shifty = $poppy = array(
  2 => '(2)',
  1 => '(1)',
  0 => '(0)',
);                         print_r( $shifty );

array_shift( $shifty );    print_r( $shifty );
//     [0] => (1)
//     [1] => (0)

array_pop( $poppy );       print_r( $poppy );
//     [2] => (2)
//     [1] => (1)

$shifty = $poppy = array(
  'a' => 'A',
  'b' => 'B',
  '(0)',
  '(1)',
  'c' => 'C',
  'd' => 'D',
);                                     print_r( $shifty );

array_shift( $shifty );                print_r( $shifty );
//     [b] => B
//     [0] => (0)
//     [1] => (1)
//     [c] => C
//     [d] => D

array_unshift( $shifty, 'unshifted');  print_r( $shifty );
//     [0] => unshifted
//     [b] => B
//     [1] => (0)
//     [2] => (1)
//     [c] => C
//     [d] => D

array_pop( $poppy );                   print_r( $poppy );
//     [a] => A
//     [b] => B
//     [0] => (0)
//     [1] => (1)
//     [c] => C

array_push( $poppy, 'pushed');         print_r( $poppy );
//     [a] => A
//     [b] => B
//     [0] => (0)
//     [1] => (1)
//     [c] => C
//     [2] => pushed

?>
mah dot di at live dot com 07-Mar-2016 02:35
This removeAdd function, the first argument shift your array then unshif the second argument to your array. first argument is an array and second argument can be int or str.

<?php
function removeAdd ($arr, $newer){
    $a = array_shift($arr);
    $b = array_unshift($arr, $newer);
    foreach ($arr as $value){
        echo $value."<br />";
    }
}

$a = array(1,2,3,4,5,6);
foreach ($a as $current){
    echo $current."<br />";
}
echo "<hr />";
removeAdd($a, 0);
?>

OUTPUT:
1
2
3
4
5
6
_______

0
2
3
4
5
6
michaeljanikk at gmail dot com 14-May-2014 01:26
To remove an element from the MIDDLE of an array (similar to array_shift, only instead of removing the first element, we want to remove an element in the middle, and shift all keys that follow down one position)

Note that this only works on enumerated arrays.

<?php
$array = array('a', 'b', 'c', 'd', 'e', 'e');
/*
array(6) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
  [5]=>
  string(1) "e"
}
*/

$indexToRemove = 2;
unset($array[$indexToRemove]);
$array = array_slice($array, 0);

/*
array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "d"
  [3]=>
  string(1) "e"
  [4]=>
  string(1) "e"
}
*/
?>

I hope this helps someone!
drum_inc at yahoo dot com 23-Aug-2013 05:27
Assignment in line, does not remove the element.

$first = array_shift( $arr = array( 0 => '1st', 2 => '2nd', 3 => '3rd') );
print_r( $first );
print_r( $arr );

Output:
1st
Array
(
    [0] => 1st
    [2] => 2nd
    [3] => 3rd
)
elad dot yosifon at gmail dot com 10-Aug-2013 06:47
Notice:
the complexity of array_pop() is O(1).
the complexity of array_shift() is O(n).
array_shift() requires a re-index process on the array, so it has to run over all the elements and index them.
info at chihoang dot de 20-Apr-2011 09:46
This doesn't work with a 2 dimensional array. With 2 dimensional array I do this:

<?php
$backup = $arr;
$first = array_shift ( $backup );
?>
ar at xonix dot ch 14-Aug-2010 03:54
If you need the first or last entry of an array, then this could help you.

<?php
function array_last_entry($arr){
    if(!is_array($arr))
        return;

    if(empty($arr))
        return;

    return end($arr);
}

function array_first_entry($arr){
    if(!is_array($arr))
        return;

    if(empty($arr))
        return;

    reset($arr);
    return current($arr);
}

$arr = array( '5' => 'five', '3' => 'three', '8' => 'eight',);

echo 'last entry: '.array_last_entry($arr).'<br>';

echo 'first entry: '.array_first_entry($arr).'<br>';

echo 'alternative output:<br>';

echo 'last entry: '.$arr[count($arr)-1];

echo '<br>first entry: '.$arr[0];
?>

The output will look like:
last entry: eight
first entry: five
alternative output:
last entry:
first entry:

As you can see, if you have to handle arrays with non-continuous indexes, these functions may be very helpful.
patrick at pwfisher dot com 21-Aug-2009 08:23
Here's a utility function to parse command line arguments.

<?php
/**
 * CommandLine class
 *
 * @package             Framework
 */
/**
 * Command Line Interface (CLI) utility class.
 *
 * @author              Patrick Fisher <patrick@pwfisher.com>
 * @since               August 21, 2009
 * @package             Framework
 * @subpackage          Env
 */
class CommandLine {

    /**
     * PARSE ARGUMENTS
     *
     * [pfisher ~]$ echo "<?php
     * >     include('CommandLine.php');
     * >     \$args = CommandLine::parseArgs(\$_SERVER['argv']);
     * >     echo "\n", '\$out = '; var_dump(\$args); echo "\n";
     * > ?>" > test.php
     *
     * [pfisher ~]$ php test.php plain-arg --foo --bar=baz --funny="spam=eggs" --alsofunny=spam=eggs \
     * > 'plain arg 2' -abc -k=value "plain arg 3" --s="original" --s='overwrite' --s
     *
     * $out = array(12) {
     *   [0]                => string(9) "plain-arg"
     *   ["foo"]            => bool(true)
     *   ["bar"]            => string(3) "baz"
     *   ["funny"]          => string(9) "spam=eggs"
     *   ["alsofunny"]      => string(9) "spam=eggs"
     *   [1]                => string(11) "plain arg 2"
     *   ["a"]              => bool(true)
     *   ["b"]              => bool(true)
     *   ["c"]              => bool(true)
     *   ["k"]              => string(5) "value"
     *   [2]                => string(11) "plain arg 3"
     *   ["s"]              => string(9) "overwrite"
     * }
     *
     * @author              Patrick Fisher <patrick@pwfisher.com>
     * @since               August 21, 2009
     * @see                 http://www.php.net/manual/en/features.commandline.php
     *                      #81042 function arguments($argv) by technorati at gmail dot com, 12-Feb-2008
     *                      #78651 function getArgs($args) by B Crawford, 22-Oct-2007
     * @usage               $args = CommandLine::parseArgs($_SERVER['argv']);
     */
    public static function parseArgs($argv){

        array_shift($argv);
        $out                            = array();

        foreach ($argv as $arg){

            // --foo --bar=baz
            if (substr($arg,0,2) == '--'){
                $eqPos                  = strpos($arg,'=');

                // --foo
                if ($eqPos === false){
                    $key                = substr($arg,2);
                    $value              = isset($out[$key]) ? $out[$key] : true;
                    $out[$key]          = $value;
                }
                // --bar=baz
                else {
                    $key                = substr($arg,2,$eqPos-2);
                    $value              = substr($arg,$eqPos+1);
                    $out[$key]          = $value;
                }
            }
            // -k=value -abc
            else if (substr($arg,0,1) == '-'){

                // -k=value
                if (substr($arg,2,1) == '='){
                    $key                = substr($arg,1,1);
                    $value              = substr($arg,3);
                    $out[$key]          = $value;
                }
                // -abc
                else {
                    $chars              = str_split(substr($arg,1));
                    foreach ($chars as $char){
                        $key            = $char;
                        $value          = isset($out[$key]) ? $out[$key] : true;
                        $out[$key]      = $value;
                    }
                }
            }
            // plain-arg
            else {
                $value                  = $arg;
                $out[]                  = $value;
            }
        }
        return $out;
    }
}
?>
regs at voidship dot net 03-Nov-2008 12:50
Using array_shift over larger array was fairly slow.  It sped up as the array shrank, most likely as it has to reindex a smaller data set.

For my purpose, I used array_reverse, then array_pop, which doesn't need to reindex the array and will preserve keys if you want it to (didn't matter in my case).

Using direct index references, i.e., array_test[$i], was fast, but direct index referencing + unset for destructive operations was about the same speed as array_reverse and array_pop.  It also requires sequential numeric keys.
chris {at} w3style {dot} co {dot} uk 05-Oct-2008 06:06
As pointed out earlier, in PHP4, array_shift() modifies the input array by-reference, but it doesn't return the first element by reference.  This may seem like very unexpected behaviour.  If you're working with a collection of references (in my case XML Nodes) this should do the trick.

<?php

/**
 * This function exhibits the same behaviour is array_shift(), except
 * it returns a reference to the first element of the array instead of a copy.
 *
 * @param array &$array
 * @return mixed
 */
function &array_shift_reference(&$array)
{
  if (count($array) > 0)
  {
    $key = key($array);
    $first =& $array[$key];
  }
  else
  {
    $first = null;
  }
  array_shift($array);
  return $first;
}

class ArrayShiftReferenceTest extends UnitTestCase
{

  function testFunctionRemovesFirstElementOfNumericallyIndexedArray()
  {
    $input = array('foo', 'bar');
    array_shift_reference($input);
    $this->assertEqual(array('bar'), $input, '%s: The array should be shifted one element left');
  }

  function testFunctionRemovesFirstElementOfAssociativeArray()
  {
    $input = array('x' => 'foo', 'y' => 'bar');
    array_shift_reference($input);
    $this->assertEqual(array('y' => 'bar'), $input, '%s: The array should be shifted one element left');
  }

  function testFunctionReturnsReferenceToFirstElementOfNumericallyIndexedArray()
  {
    $foo = 'foo';
    $input = array(&$foo, 'bar');
    $first =& array_shift_reference($input);
    $this->assertReference($foo, $first, '%s: The return value should reference the first array element');
  }

  function testFunctionReturnsReferenceToFirstElementOfAssociativeArray()
  {
    $foo = 'foo';
    $input = array('x' => &$foo, 'y' => 'bar');
    $first =& array_shift_reference($input);
    $this->assertReference($foo, $first, '%s: The return value should reference the first array element');
  }

  function testFunctionReturnsNullIfEmptyArrayPassedAsInput()
  {
    $input = array();
    $first = array_shift_reference($input);
    $this->assertNull($first, '%s: Array has no first element so NULL should be returned');
  }

}

?>
sggoyal at gmail dot com 07-Sep-2008 10:08
// To Change order of Array by Saurabh Goyal
    function change_array_order($table,$order)
    {
       //init the new table
       $new_table = array();
       foreach($order as $colname)
       {
          $new_table[$colname] = $table[$colname];
       }
       return $new_table;
    }

if array value like:-
$row = array('usr_id'=>'23','usr_name'=>'Saurabh', 'usr_surname'=>'Goyal','usr_firstname'=>'Saurabh');

//you want change order & show only particular field
change_array_order($row,array('usr_name','usr_firstname',
                                            'usr_surname'));

Regard's

Saurabh Goyal
http://sggoyal.blogspot.com
nospam at dyce dot losethisbit dot com 02-Jul-2008 05:15
Just a useful version which returns a simple array with the first key and value. Porbably a better way of doing it, but it works for me ;-)

<?php

function array_kshift(&$arr)
{
  list($k) = array_keys($arr);
  $r  = array($k=>$arr[$k]);
  unset($arr[$k]);
  return $r;
}

// test it on a simple associative array
$arr = array('x'=>'ball','y'=>'hat','z'=>'apple');

print_r($arr);
print_r(array_kshift($arr));
print_r($arr);

?>

Output:

Array
(
    [x] => ball
    [y] => hat
    [z] => apple
)
Array
(
    [x] => ball
)
Array
(
    [y] => hat
    [z] => apple
)
Maikel 19-Feb-2008 09:43
In response to nando_f at nothingsimple dot com

The example is correct,  array_shift do an unset to first element  because the parameter is passed by reference
Ben 02-Oct-2007 09:17
baughmankr at appstate dot edu, I think this is more efficient.

<?php
function array_shorten($arr)
{
  list($k) = array_keys($arr);
  unset($arr[$k]);
  return $arr;
}
?>
baughmankr at appstate dot edu 18-Sep-2007 02:04
I needed to remove the first set of keys and values from an associative array.  Had to write this function:

function shortenArray($_arr)
{
    $i=1;
    $_shorter=array();
    foreach ($_arr as $k => $v)
    {
        if ($i != 1)
        {
            $_shorter[$k] = $v;
        }
        $i++;
    }
    return $_shorter;
}
dmhouse at gmail dot com 08-Aug-2007 01:54
If you want a version of array_shift() that works non-destructively (i.e., an easy function to grab the first element of the array without modifying the array), try reset().
Traps 09-Jul-2007 10:52
For those that may be trying to use array_shift() with an array containing references (e.g. working with linked node trees), beware that array_shift() may not work as you expect: it will return a *copy* of the first element of the array, and not the element itself, so your reference will be lost.

The solution is to reference the first element before removing it with array_shift():

<?php

// using only array_shift:
$a = 1;
$array = array(&$a);
$b =& array_shift($array);
$b = 2;
echo "a = $a, b = $b<br>"; // outputs a = 1, b = 2

// solution: referencing the first element first:
$a = 1;
$array = array(&$a);
$b =& $array[0];
array_shift($array);
$b = 2;
echo "a = $a, b = $b<br>"; // outputs a = 2, b = 2

?>
C_Prevost at myob 30-Apr-2007 04:52
no, it demonstrates quite well that it removes the first element in the original array, updating the keys, and that it also returns the original first element.
richard at happymango dot me dot uk 12-Apr-2007 06:09
If you want to loop through an array, removing its values one at a time using array_shift() but also want the key as well, try this.

<?php

while($key = key($array))
{
     $value = array_shift($array);
     //code goes here
}

?>

its like foreach but each time the value is removed from the array so it eventually ends up empty

<?php

//example below

$airports = array
(
    "LGW" => "London Gatwick",
    "LHR" => "London Heathrow",
    "STN" => "London Stanstead"
);

echo count($airports)." Airport in the array<br /><br />";

while($key = key($airports))
{
    $value = array_shift($airports);
    echo $key." is ".$value."<br />";
}

echo "<br />".count($airports)." Airport left in the array";

?>

Example Outputs:

3 Airport in the array

LGW is London Gatwick
LHR is London Heathrow
STN is London Stanstead

0 Airport left in the array
alreece45 at yahoo dot com 09-Aug-2006 08:13
I haven't really read into it, but if you're complaining about a change in PHP 5.0.5 that made it so you couldn't do:

<?php

$val = array_shift(preg_split());

?>

or

<?php

$val = array_shit(function_that_returns_array);

?>

Then you're not using this function correctly. This function's argument is supposed to be a pointer to a variable. It then modifies that variable and returns a value. When you specify a function, php CAN NOT modify the return value of that function. It should be common sense but apparently its not.

Also, on a efficiency note, you might want to consider using another function such as reset or perhaps making your own function such as below:

<?php

function first_element($array) {

return reset($array);

}

?>

Unless of course for some reason you need to save the microseconds this takes.

}
bmr at ediweb dot org 31-May-2006 07:27
If the array has non-numerical keys, array_shift extracts the first element, whichever is the key, and recompute the numerical keys, if there are any. Ie :

$array = array("c" => "ccc", 0 => "aaa", "d" => "ddd", 5 => "bbb");
$first = array_shift($array);
echo '$first = ' . $first . ', $array = ' . var_export($array, true);

will display :

$first = ccc, $array = array ( 0 => 'aaa', 'd' => 'ddd', 1 => 'bbb', )

It means that array_shift works with associative arrays too, and leaves the keys unchanged if they are non-numerical.
19-Sep-2005 07:57
<?php

//----------------------------------------------------------
// The combination of array_shift/array_unshift
// greatly simplified a function I created for
// generating relative paths. Before I found them
// the algorithm was really squirrely, with multiple
// if tests, length calculations, nested loops, etc.
// Great functions.
//----------------------------------------------------------

function create_relative_path($inSourcePath, $inRefPath)
{
    // break strings at slashes
    $s_parts            = explode('/', $inSourcePath);
    $r_parts            = explode('/', $inRefPath);

    // delete items up to the first non-equal part
    while ($s_parts[0] === $r_parts[0])
    {
        array_shift($s_parts);
        array_shift($r_parts);
    }

    // add wild card to r_parts for each remaining
    // item of s_parts
    while ($s_parts[0])
    {
        array_unshift($r_parts, '..');
        array_shift($s_parts);
    }

    return implode('/', $r_parts);
}

//----------------------------------------------------------
// Example:
//     Given a source path $sp generates the relative
//     location of $rp. $sp could be assigned using
//     $_SERVER['PHP_SELF'] but it's hardcoded for
//     the example.
//----------------------------------------------------------
$sp = '/WebServer/Documents/MyBigProject/php/project_script.php';
$rp = '/WebServer/Documents/MyLibraries/lib_script.php';

// plugging them into the function
$rel_path = create_relative_path($sp, $rp);

// yeilds
'../../../MyLibraries/lib_script.php'

// and it could be used like
include_once(create_relative_path($_SERVER['PHP_SELF'], $rp));
lukasz dot dywicki DEL at gmail dot com 27-Jul-2005 05:48
Im using this function to browse arrays from database. For example data:
<?php
$data = array(
      array('row 1-cell 1','row 1-cell 2'),
      array('row 2-cell 1','row 2-cell 2'),
      array('row 3-cell 1','row 3-cell 2'),
);

while($row=array_shift($data)) {
      echo $row[0];
}
?>
Output:
row 1-cell 1
row 2-cell 1
row 3-cell 1
arturo {dot} ronchi {at} gmail {dot} com 20-Apr-2005 06:24
Here is a little function if you would like to get the top element and rotate the array afterwards.

function array_rotate(&$arr)
{
  $elm = array_shift($arr);
  array_push($arr, $elm);
  return $elm;
}
09-Feb-2005 04:27
This function will save the key values of an array, and it will work in lower versions of PHP:

<?php

function array_shift2(&$array){
    reset($array);
    $key = key($array);
    $removed = $array[$key];
    unset($array[$key]);
    return $removed;
}

?>
James McGuigan 14-Dec-2004 11:26
while(array_shift()) can be used to process multiple arrays and/or database results in a single loop. The || short circuts and only evaluates the first statement until it runs out of data.

It can help to reduce duplicated code (the rule is code once and once only).

Note that each ($row = ) statement much be encased in ()'s otherwise you will get funny results. If you use two array_shift($array) statements and forget the ()'s, you will repeatedly get the first element of the first array for the for the count of the $array.

<?php

require_once('class.db.php');

$sql = "SELECT title FROM links";
$result = mysql_query($sql, $db->connection);

$defaults = array(
     array('title' => 'None'),
     array('title' => 'Unknown')
);

while ( ($row = mysql_fetch_assoc($result))
     || ($row = array_shift($defaults)))
{
  echo $row['title'] . "<br>";
}

?>

This will print out (depending on database contents):
Title1
Title2
Title3
...
None
Unknown


Extrait une portion de tableau

  • « array_shift
  • array_splice »
  • PHP Manual
  • Fonctions sur les tableaux
  • Extrait une portion de tableau

array_slice

(PHP 4, PHP 5, PHP 7, PHP 8)

array_slice — Extrait une portion de tableau

Description

array_slice ( array $array , int $offset , int|null $length = null , bool $preserve_keys = false ) : array

array_slice() retourne une série d'éléments du tableau array commençant à l'offset offset et représentant length éléments.

Liste de paramètres

array

Le tableau d'entrée.

offset

Si offset est non-négatif, la séquence commencera à cette position dans le tableau array.

Si offset est négatif, la séquence commencera à la position offset, mais en commençant à la fin du tableau array.

Note:

Le paramètre offset indique la position dans le tableau, pas la clé.

length

Si length est fourni et positif, alors la séquence aura jusqu'à autant d'éléments.

Si le tableau plus court que length, alors seuls les éléments du tableau disponible seront présents.

Si length est fourni et négatif, alors la séquence contiendra autant d'éléments de la fin du tableau.

Si il est omis, la séquence aura tout depuis la position offset jusqu'à la fin de array.

preserve_keys

Note:

Par défaut array_slice() réordonnera et réinitialisera les indices entier du tableau. Ce comportement peut être modifié en définissant le paramètre preserve_keys à true. Les clés sous forme de chaîne de caractères sont toujours conservées, indépendamment de ce paramètre.

Valeurs de retour

Retourne la portion du tableau. Si la position est plus grande que la taille du tableau, un tableau vide est retourné.

Exemples

Exemple #1 Exemple avec array_slice()

<?php
$input = array("a", "b", "c", "d", "e");

$output = array_slice($input, 2);         // retourne "c", "d", et "e"
$output = array_slice($input, -2, 1);     // retourne "d"
$output = array_slice($input, 0, 3);      // retourne "a", "b", et "c"

// notez les clés d'index différentes
print_r(array_slice($input, 2, -1));
print_r(array_slice($input, 2, -1, true));
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => c
    [1] => d
)
Array
(
    [2] => c
    [3] => d
)

Exemple #2 array_slice() et basé sur un tableau

<?php
$input = array(1 => "a", "b", "c", "d", "e");
print_r(array_slice($input, 1, 2));
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => b
    [1] => c
)

Exemple #3 array_slice() et tableau avec des clés mixtes

<?php
$ar = array('a'=>'apple', 'b'=>'banana', '42'=>'pear', 'd'=>'orange');
print_r(array_slice($ar, 0, 3));
print_r(array_slice($ar, 0, 3, true));
?>

L'exemple ci-dessus va afficher :

Array
(
    [a] => apple
    [b] => banana
    [0] => pear
)
Array
(
    [a] => apple
    [b] => banana
    [42] => pear
)

Voir aussi

  • array_chunk() - Sépare un tableau en tableaux de taille inférieure
  • array_splice() - Efface et remplace une portion de tableau
  • unset() - Détruit une variable

User Contributed Notes

nathan dot fiscaletti at gmail dot com 30-Dec-2017 01:46
If you want an associative version of this you can do the following:

function array_slice_assoc($array,$keys) {
    return array_intersect_key($array,array_flip($keys));
}

However, if you want an inverse associative version of this, just use array_diff_key instead of array_intersect_key.

function array_slice_assoc_inverse($array,$keys) {
    return array_diff_key($array,array_flip($keys));
}

Example:

$arr = [
    'name' => 'Nathan',
    'age' => 20,
    'height' => 6
];

array_slice_assoc($arr, ['name','age']);

will return

Array (
     'name' = 'Nathan',
     'age' = 20
)

Where as

array_slice_assoc_inverse($arr, ['name']);

will return

Array (
    'age' = 20,
    'height' = 6
)
SomeGuy 24-Jun-2016 09:17
Thank to taylorbarstow here the function with the unset feature.
<?php
function array_slice_assoc(&$array,$keys,$unset = true) {
    $return = array_intersect_key($array, array_flip($keys));
    if ($unset) {
        foreach ($keys as $value) {
            unset($array[$value]);
        }
    }
    return $return;
}
?>
kansey 12-Aug-2015 09:32
To save the sort order of a numeric index in the array. Version php =>5.5.26
/*
Example
*/

$arr = array( "1" =>2, "2" =>3 , "3" =>5 );

print_r(array_slice($arr,1,null,true));

/*
Result

Array
(
[2] => 3
[3] => 5
)
*/
Ray.Paseur often uses Gmail 06-Jun-2013 02:44
<?php
// CHOP $num ELEMENTS OFF THE FRONT OF AN ARRAY
// RETURN THE CHOP, SHORTENING THE SUBJECT ARRAY
function array_chop(&$arr, $num)
{
    $ret = array_slice($arr, 0, $num);
    $arr = array_slice($arr, $num);
    return $ret;
}
Nathan - thefiscster510 at gmail dot com 29-Mar-2011 10:38
If you want to remove a specified entry from an array i made this mwethod...

<?php
$array = array("Entry1","entry2","entry3");

$int = 3; //Number of entries in the array
$int2 = 0; //Starter array spot... it will begine its search at 0.
$del_num = 1; //Represents the second entry in the array... which is the one we will happen to remove this time... i.e. 0 = first entry, 1 = second entry, 2 = third...........

$newarray = array(); //Empty array that will be the new array minus the specified entry...
print_r($array) . "<br>";    //print original array contents
print_r($newarray). "<br>"; //print the new empty array

do
{
$user = $array[$int2];
$key = array_search($user, $array);
if ($key == $del_num)
{

}
else
{
$newarray[] = $array[$int2];
}

$int2 = $int2 + 1;
} while ($int2 < $int);

print_r($newarray). "<br>"; //print the new array

?>
delew 11-Feb-2011 01:17
just a little tip.
to preserve keys without providing length: use NULL

array_slice($array, $my_offset, NULL, true);
xananax at yelostudio dot com 02-Feb-2011 07:23
<?php
/**
 * Reorders an array by keys according to a list of values.
 * @param array $array the array to reorder. Passed by reference
 * @param array $list the list to reorder by
 * @param boolean $keepRest if set to FALSE, anything not in the $list array will be removed.
 * @param boolean $prepend if set to TRUE, will prepend the remaining values instead of appending them
 * @author xananax AT yelostudio DOT com
 */
function array_reorder(array &$array,array $list,$keepRest=TRUE,$prepend=FALSE,$preserveKeys=TRUE){
    $temp = array();
    foreach($list as $i){
        if(isset($array[$i])){
            $tempValue = array_slice(
                $array,
                array_search($i,array_keys($array)),
                1,
                $preserveKeys
            );
            $temp[$i] = array_shift($tempValue);
            unset($array[$i]);
        }
    }
    $array = $keepRest ?
        ($prepend?
            $array+$temp
            :$temp+$array
        )
        : $temp;
}

/** exemple ** /
$a = array(
    'a'    =>    'a',
    'b'    =>    'b',
    'c'    =>    'c',
    'd'    =>    'd',
    'e'    =>    'e'
);
$order = array('c','b','a');

array_reorder($a,$order,TRUE);
echo '<pre>';
print_r($a);
echo '</pre>';
/** exemple end **/
?>
jamon at clearsightdesign dot com 10-Apr-2009 05:46
I was trying to find a good way to find the previous several and next several results from an array created in a MySQL query. I found that most MySQL solutions to this problem were complex. Here is a simple function that returns the previous and next rows from the array.

<?php

/*
** function array_surround by Jamon Holmgren of ClearSight Design
** Version 1.0 - 4/10/2009
** Please direct comments and questions to my first name at symbol clearsightdesign.com
**
** Returns an array with only the $before and $after number of results
** This is set to work best with MySQL data results
** Use this to find the rows immediately before and after a particular row, as many as you want
**
** Example usage:
**   $mysql_ar is an array of results from a MySQL query and the current id is $cur_id
**   We want to get the row before this one and five rows afterward
**
** $near_rows = array_surround($mysql_ar, "id", $cur_id, 1, 5)
**
**   Previous row is now $near_rows[-1]
**   Current row is now $near_rows[0]
**   Next row is $near_rows[1] ... etc
**   If there is no previous row, $near_rows[-1] will not be set...test for it with is_array($near_rows[-1])
**
*/
function array_surround($src_array, $field, $value, $before = 1, $after = 1) {
    if(is_array($src_array)) {
        // reset all the keys to 0 through whatever in case they aren't sequential
        $new_array = array_values($src_array);
        // now loop through and find the key in array that matches the criteria in $field and $value
        foreach($new_array as $k => $s) {
            if($s[$field] == $value) {
                // Found the one we wanted
                $ck = $k; // put the key in the $ck (current key)
                break;
            }
        }
        if(isset($ck)) { // Found it!
            $result_start = $ck - $before; // Set the start key
            $result_length = $before + 1 + $after; // Set the number of keys to return
            if($result_start < 0) { // Oops, start key is before first result
                $result_length = $result_length + $result_start; // Reduce the number of keys to return
                $result_start = 0; // Set the start key to the first result
            }
            $result_temp = array_slice($new_array, $result_start, $result_length); // Slice out the results we want
            // Now we have an array, but we want array[-$before] to array[$after] not 0 to whatever.
            foreach($result_temp as $rk => $rt) { // set all the keys to -$before to +$after
                $result[$result_start - $ck + $rk] = $rt;
            }
            return $result;
        } else { // didn't find it!
            return false;
        }
    } else { // They didn't send an array
        return false;
    }
}

?>

I hope you find this useful! I welcome constructive criticism or comments or of course praise ;) -- just e-mail me.

- Jamon Holmgren
Mr. P 14-Nov-2008 02:11
Note that offset is not the same thing as key. Offset always starts at 0, while keys might be any number.

So this:

<?php print_r(array_slice(array(0 => 0, 5 => 5, 13 => 13),1)); ?>

will result in this:
Array
(
    [0] => 5
    [1] => 13
)
s0i0m at dreamevilconcepts dot com 12-Sep-2008 07:53
Using the varname function referenced from the array_search page, submitted by dcez at land dot ru. I created a multi-dimensional array splice function. It's usage is like so:

$array['admin'] = array('blah1', 'blah2');
$array['voice'] = array('blah3', 'blah4');
array_cut('blah4', $array);

...Would strip blah4 from the array, no matter where the position of it was in the array ^^ Returning this...

Array ( [admin] => Array ( [0] => blah1 [1] => blah2 ) [voice] => Array ( [0] => blah3 ) )

Here is the code...

<?php

  function varname ($var)
  {
    // varname function by dcez at land dot ru
    return (isset($var)) ? array_search($var, $GLOBALS) : false;
  }

  function array_cut($needle, $haystack)
  {
    foreach ($haystack as $k => $v)
    {
      for ($i=0; $i<count($v); $i++)
        if ($v[$i] === $needle)
        {
          return array_splice($GLOBALS[varname($haystack)][$k], $i, 1);
          break; break;
        }
    }

?>

Check out dreamevilconcept's forum for more innovative creations!
ted.devito at 9gmail9 dot 99com 02-May-2008 09:21
based on worldclimb's arem(), here is a recursive array value removal tool that can work with multidimensional arrays.

function remove_from_array($array,$value){
    $clear = true;
    $holding=array();

    foreach($array as $k => $v){
        if (is_array($v)) {
            $holding [$k] = remove_from_array ($v, $value);
            }
        elseif ($value == $v) {
            $clear = false;
            }
        elseif($value != $v){
            $holding[$k]=$v; // removes an item by combing through the array in order and saving the good stuff
        }
    }
    if ($clear) return $holding; // only pass back the holding array if we didn't find the value
}
worldclimb at 99gmail99 dot com 21-Mar-2008 12:51
array_slice can be used to remove elements from an array but it's pretty simple to use a custom function.

One day array_remove() might become part of PHP and will likely be a reserved function name, hence the unobvious choice for this function's names.

<?
function arem($array,$value){
    $holding=array();
    foreach($array as $k => $v){
        if($value!=$v){
            $holding[$k]=$v;
        }
    }
    return $holding;
}

function akrem($array,$key){
    $holding=array();
    foreach($array as $k => $v){
        if($key!=$k){
            $holding[$k]=$v;
        }
    }
    return $holding;
}

$lunch = array('sandwich' => 'cheese', 'cookie'=>'oatmeal','drink' => 'tea','fruit' => 'apple');
echo '<pre>';
print_r($lunch);
$lunch=arem($lunch,'apple');
print_r($lunch);
$lunch=akrem($lunch,'sandwich');
print_r($lunch);
echo '</pre>';
?>

(remove 9's in email)
aexchecker at yahoo dot com 04-Oct-2007 08:39
<?php
/**
 * @desc
 * Combines two arrays by inserting one into the other at a given position then
 * returns the result.
 *
 * @since   2007/10/04
 * @version v0.7 2007/10/04 18:47:52
 * @author  AexChecker <AexChecker@yahoo.com>
 * @param   array $source
 * @param   array $destination
 * @param   int [optional] $offset
 * @param   int [optional] $length
 * @return  array
 */
function array_insert($source, $destination, $offset = NULL, $length = NULL) {
    if (!is_array($source) || empty($source)) {
        if (is_array($destination) && !empty($destination)) {
            return $destination;
        }
        return array();
    }
    if (is_null($offset)) {
        return array_merge($destination, $source);
    }
    $offset = var2int($offset);
    if (is_null($length)) {
        if ($offset === 0) {
            return array_merge($source, array_slice($destination, 1));
        }
        if ($offset === -1) {
            return array_merge(array_slice($destination, 0, -1), $source);
        }
        return array_merge(
            array_slice($destination, 0, $offset),
            $source,
            array_slice($destination, ++$offset)
        );
    }
    if ($offset === 0) {
        return array_merge($source, array_slice($destination, $length));
    }
    $destination_count = count($destination);
    $length = var2int($length);
    if ($offset > 0) {
        if ($destination_count - $offset < 1) {
            return array_merge($destination, $source);
        }
    } else{
        if (($t = $destination_count + $offset) < 1) {
            return array_merge($source, $destination);
        }
        $offset = $t;
    }
    if ($length > 0) {
        $length+= $offset;
    } elseif ($length < 0 && !($length * -1 < $destination_count)) {
        return $source;
    } else {
        $length = $offset;
    }
    return array_merge(
        array_slice($destination, 0, $offset),
        $source,
        array_slice($destination, $length)
    );
}
?>
aflavio at gmail dot com 01-Mar-2007 01:43
/**
    * Remove a value from a array
    * @param string $val
    * @param array $arr
    * @return array $array_remval
    */
    function array_remval($val, &$arr)
    {
          $array_remval = $arr;
          for($x=0;$x<count($array_remval);$x++)
          {
              $i=array_search($val,$array_remval);
              if (is_numeric($i)) {
                  $array_temp  = array_slice($array_remval, 0, $i );
                $array_temp2 = array_slice($array_remval, $i+1, count($array_remval)-1 );
                $array_remval = array_merge($array_temp, $array_temp2);
              }
          }
          return $array_remval;
    }

$stack=Array('apple','banana','pear','apple', 'cherry', 'apple');
array_remval("apple", $stack);

//output: Array('banana','pear', 'cherry')
06-May-2006 12:21
If you specify the fourth argument (to not reassign the keys), then there appears to be no way to get the function to return all values to the end of the array. Assigning -0 or NULL or just putting two commas in a row won't return any results.
taylorbarstow at the google mail service 07-Apr-2006 02:01
Array slice function that works with associative arrays (keys):

function array_slice_assoc($array,$keys) {
    return array_intersect_key($array,array_flip($keys));
}
andreasblixt (at) msn (dot) com 06-Sep-2005 09:53
<?php
    // Combines two arrays by inserting one into the other at a given position then returns the result
    function array_insert($src, $dest, $pos) {
        if (!is_array($src) || !is_array($dest) || $pos <= 0) return FALSE;
        return array_merge(array_slice($dest, 0, $pos), $src, array_slice($dest, $pos));
    }
?>
bishop 08-Dec-2004 01:58
Sometimes you need to pick certain non-integer and/or non-sequential keys out of an array. Consider using the array_pick() implementation below to pull specific keys, in a specific order, out of a source array:

<?php

$a = array ('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
$b = array_pick($a, array ('d', 'b'));

// now:
// $a = array ('a' => 1, 'c' => '3');
// $b = array ('d' => 4, 'b' => '2');

function &array_pick(&$array, $keys)
{
    if (! is_array($array)) {
        trigger_error('First parameter must be an array', E_USER_ERROR);
        return false;
    }

    if (! (is_array($keys) || is_scalar($keys))) {
        trigger_error('Second parameter must be an array of keys or a scalar key', E_USER_ERROR);
        return false;
    }

    if (is_array($keys)) {
        // nothing to do
    } else if (is_scalar($keys)) {
        $keys = array ($keys);
    }

    $resultArray = array ();
    foreach ($keys as $key) {
        if (is_scalar($key)) {
            if (array_key_exists($key, $array)) {
                $resultArray[$key] = $array[$key];
                unset($array[$key]);
            }
        } else {
            trigger_error('Supplied key is not scalar', E_USER_ERROR);
            return false;
        }
    }

    return $resultArray;
}

?>
developer at i-space dot org 03-Feb-2002 08:22
remember that array_slice returns an array with the current element. you must use array_slice($array, $index+1) if you want to get the next elements.


Efface et remplace une portion de tableau

  • « array_slice
  • array_sum »
  • PHP Manual
  • Fonctions sur les tableaux
  • Efface et remplace une portion de tableau

array_splice

(PHP 4, PHP 5, PHP 7, PHP 8)

array_splice — Efface et remplace une portion de tableau

Description

array_splice ( array &$array , int $offset , int|null $length = null , mixed $replacement = [] ) : array

array_splice() supprime les éléments désignés par offset et length du tableau array et les remplacent par les éléments du tableau replacement, si ce dernier est fourni.

Note:

Les clés numériques dans array ne sont pas préservées.

Note: Si replacement n'est pas un tableau, il en deviendra un par transtypage (i.e. (array) $replacement). Cela peut produire des résultats inattendus lors de l'utilisation d'un objet ou null comme paramètre replacement.

Liste de paramètres

array

Le tableau d'entrée.

offset

Si offset est positif, le début de la section à supprimer sera à cette position en partant du début du tableau array.

Si offset est négatif, le début de la section à supprimer sera à cette position en partant de la fin du tableau array.

length

Si length est omis, tous les éléments du tableau depuis la position offset jusqu'à la fin du tableau seront supprimés.

Si length est fourni et positif, alors autant d'éléments seront supprimés.

Si length est fourni et négatif, alors autant d'éléments seront supprimés de la fin du tableau.

Si length est fourni et vaut zéro, alors aucun élément sera supprimé.

Astuce

Pour tout supprimer depuis la position offset jusqu'à la fin du tableau lorsque replacement est aussi fourni, utiliser count($input) pour length.

replacement

Si le tableau replacement est fourni, alors les éléments supprimés sont remplacés par les éléments de ce tableau.

Si l'offset et length sont tels que rien est supprimé, alors les éléments du tableau replacement sont insérés à la position offset.

Note:

Les clés du tableau replacement ne sont pas préservées.

Si replacement est seulement un élément il n'est pas nécessaire d'entourer l'élément avec array() ou des crochets, à moins que l'élément ne soit lui-même un tableau, un objet ou null.

Valeurs de retour

Retourne un tableau contenant les éléments extrait.

Historique

Version | Description
8.0.0 | length est désormais nullable.

Exemples

Exemple #1 Exemples avec array_splice()

<?php
$input = array("red", "green", "blue", "yellow");
array_splice($input, 2);
var_dump($input);

$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, -1);
var_dump($input);

$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, count($input), "orange");
var_dump($input);

$input = array("red", "green", "blue", "yellow");
array_splice($input, -1, 1, array("black", "maroon"));
var_dump($input);
?>

L'exemple ci-dessus va afficher :

array(2) {
  [0]=>
  string(3) "red"
  [1]=>
  string(5) "green"
}
array(2) {
  [0]=>
  string(3) "red"
  [1]=>
  string(6) "yellow"
}
array(2) {
  [0]=>
  string(3) "red"
  [1]=>
  string(6) "orange"
}
array(5) {
  [0]=>
  string(3) "red"
  [1]=>
  string(5) "green"
  [2]=>
  string(4) "blue"
  [3]=>
  string(5) "black"
  [4]=>
  string(6) "maroon"
}

Exemple #2 Déclaration équivalentes à des exemples de array_splice() divers

Les déclarations suivantes sont équivalentes :

<?php

// ajouter deux éléments à $input
array_push($input, $x, $y);
array_splice($input, count($input), 0, array($x, $y));

// supprimer le dernier élément à $input
array_pop($input);
array_splice($input, -1);

// supprimer le premier élément à $input
array_shift($input);
array_splice($input, 0, 1);

//insérer deux éléments au début de $input
array_unshift($input, $x, $y);
array_splice($input, 0, 0, array($x, $y));

// remplace la valeur dans $input à l'index $x
$input[$x] = $y; // pour les tableaux dont les clés sont égales à l'offset
array_splice($input, $x, 1, $y);

?>

Voir aussi

  • array_merge() - Fusionne plusieurs tableaux en un seul
  • array_slice() - Extrait une portion de tableau
  • unset() - Détruit une variable

User Contributed Notes

Hayley Watson 26-Sep-2017 12:31
For an analogous function that works on strings rather than arrays, see substr_replace.
gilberg_vrn 25-Apr-2016 02:45
array_splice with preserve keys

<?php
function array_splice_preserve_keys(&$array, $from, $length = null) {
    $result = array_slice($array, $from, $length, true);
    $array = array_slice($array, $from + $length, null, true);

    return $result;
}
?>

Example:

<?php
$array = [
    1 => 'a',
    2 => 'b',
    26 => 'z'
];

var_dump(array_splice_preserve_keys($array, 0, 1), $array);
/**
 * array(1) {
 *  [1]=>
 *   string(1) "a"
 *  }
 * array(2) {
 *  [2]=>
 *  string(1) "b"
 *  [26]=>
 *  string(1) "z"
 * }
 */
?>
vitospericolato at gmail dot com 08-Apr-2016 08:54
To remove elements from an array, based on array values:

<?php
$i_to_remove=array();

foreach($array_to_prune as $i=>$value){
  if(cond_to_delete($value)) $i_to_remove[]=$i;
}
foreach($i_to_remove as $j=>$i)
  array_splice($array_to_prune,$i-$j,1);

?>
StanE 22-Oct-2015 08:50
array_splice() does not preserve numeric keys. The function posted by "weikard at gmx dot de" won't do that either because array_merge() does not preserve numeric keys either.

Use following function instead:

<?php
function arrayInsert($array, $position, $insertArray)
{
    $ret = [];

    if ($position == count($array)) {
        $ret = $array + $insertArray;
    }
    else {
        $i = 0;
        foreach ($array as $key => $value) {
            if ($position == $i++) {
                $ret += $insertArray;
            }

            $ret[$key] = $value;
        }
    }

    return $ret;
}
?>

Example:
<?php
$a = [
    295 => "Hello",
    58 => "world",
];

$a = arrayInsert($a, 1, [123 => "little"]);

/*
Output:
Array
(
    [295] => Hello
    [123] => little
    [58] => world
)
*/
?>

It preserves numeric keys. Note that the function does not use a reference to the original array but returns a new array (I see absolutely no reason how the performance would be increased by using a reference when modifying an array through PHP script code).
guillaume dot lacourt at gmail dot com 20-Jun-2015 01:30
Using array_splice when you traverse array with internal pointer's function reset the array, eg:

<?php
end($arrOfData);
$last = key($arrOfData);
reset($arrOfData);
while (($data = current($arrOfData))) {
  if ($last === key($arrOfData)) {
    array_splice($arrOfData, $last, 1);
   // current($arrOfData) => first value of $arrOfData
  }
}
Anonymous 11-Sep-2014 01:07
<?php
function array_slice2( $array, $offset, $length = 0 )
{
  if( $offset < 0 )
    $offset = sizeof( $array ) + $offset;

  $length = ( !$length ? sizeof( $array ) : ( $length < 0 ? sizeof( $array ) - $length : $length + $offset ) );

  for( $i = $offset; $i < $length; $i++ )
    $tmp[] = $array[$i];

  return $tmp;
}
?>
antrik 09-Jul-2014 07:20
Prompted by dire need, and inspired by some of the existing notes, I came up with this:

/* Like array_splice(), but preserves the key(s) of the replacement array. */
function array_splice_assoc(&$input, $offset, $length = 0, $replacement = array()) {
  $tail = array_splice($input, $offset);
  $extracted = array_splice($tail, 0, $length);
  $input += $replacement + $tail;
  return $extracted;
};

Apart from preserving the keys, it behaves just like the regular array_splice() for all cases I could think of.

So for example the regular array_splice()

$input = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' =>6);
print_r(array_splice($input, -4, 3, array('foo1' => 'bar', 'foo2' => 'baz')));
print_r($input);

will give:

Array
(
    [c] => 3
    [d] => 4
    [e] => 5
)
Array
(
    [a] => 1
    [b] => 2
    [0] => bar
    [1] => baz
    [f] => 6
)

But with array_splice_assoc()

$input = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' =>6);
print_r(array_splice_assoc($input, -4, 3, array('foo1' => 'bar', 'foo2' => 'baz')));
print_r($input);

we get:

Array
(
    [c] => 3
    [d] => 4
    [e] => 5
)
Array
(
    [a] => 1
    [b] => 2
    [foo1] => bar
    [foo2] => baz
    [f] => 6
)

A typical use case would be replacing an element identified by a particular key, which we could achieve with:

$input = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5, 'f' =>6);
array_splice_assoc($input, array_search('d', array_keys($input)), 1, array('foo' => 'bar'));
print_r($input);

giving us:

Array
(
    [a] => 1
    [b] => 2
    [c] => 3
    [foo] => bar
    [e] => 5
    [f] => 6
)
thom 02-Jan-2014 02:31
Maybe it will help someone else: I was trying to strip off the last part of an array using this section, more or less as follows:

<?php array_splice($array, $offset); ?>

Now it could occur in my code that <?php $offset === 0 ?>, in which case the array is returned as-is and not, as you might expect, an empty array because everything is stripped off. Obviously it is not really useful anyway to "strip off everything", but I was reminded of that the hard way and this may spare someone some time, hopefully.
royanee at yahoo dot com 25-Jan-2013 05:03
When trying to splice an associative array into another, array_splice is missing two key ingredients:
  - a string key for identifying the offset
  - the ability to preserve keys in the replacement array

This is primarily useful when you want to replace an item in an array with another item, but want to maintain the ordering of the array without rebuilding the array one entry at a time.

<?php
function array_splice_assoc(&$input, $offset, $length, $replacement) {
        $replacement = (array) $replacement;
        $key_indices = array_flip(array_keys($input));
        if (isset($input[$offset]) && is_string($offset)) {
                $offset = $key_indices[$offset];
        }
        if (isset($input[$length]) && is_string($length)) {
                $length = $key_indices[$length] - $offset;
        }

        $input = array_slice($input, 0, $offset, TRUE)
                + $replacement
                + array_slice($input, $offset + $length, NULL, TRUE);
}

$fruit = array(
        'orange' => 'orange',
        'lemon' => 'yellow',
        'lime' => 'green',
        'grape' => 'purple',
        'cherry' => 'red',
);

// Replace lemon and lime with apple
array_splice_assoc($fruit, 'lemon', 'grape', array('apple' => 'red'));

// Replace cherry with strawberry
array_splice_assoc($fruit, 'cherry', 1, array('strawberry' => 'red'));
?>

Note: I have not tested this with negative offsets and lengths.
mrsohailkhan at gmail dot com 21-Oct-2011 12:34
array_splice, split an array into 2 arrays. The returned arrays is the 2nd argument actually and the used array e.g $input here contains the 1st argument of array, e.g

<?php
$input = array("red", "green", "blue", "yellow");
print_r(array_splice($input, 3)); // Array ( [0] => yellow )
print_r($input); //Array ( [0] => red [1] => green [2] => blue )
?>

if you want to replace any array value do simple like that,

first search the array index you want to replace

<?php $index = array_search('green', $input);// index = 1 ?>

and then use it as according to the definition

<?php
array_splice($input, $index, 1, array('mygreeen')); //Array ( [0] => red [1] => mygreeen [2] => blue [3] => yellow )
?>

so here green is replaced by mygreen.

here 1 in array_splice above represent the number of items to be replaced. so here start at index '1' and replaced only one item which is 'green'
news_yodpeirs at thoftware dot de 20-Jul-2011 08:20
Sometimes you may want to insert one array into another and just work on with the resulting array. array_splice() doesn't support this, as the resulting array isn't the returned value but the first argument, which is changed by reference.

Therefore you may use the following function, which inserts array $ins in array $src at position $pos. $rep can be used if $ins shouldn't be just inserted, but should replace some existing elements (the number of elements to be replaced is given in $rep).

<?php
function array_insert($src,$ins,$pos,$rep=0) {
  array_splice($src,$pos,$rep,$ins);
  return($src);
}
?>
charette dot s at gmail 21-Jul-2010 08:26
If you want to append null values wrap them in an array:

<?php

    $a = array('Hey', 'hey', 'my', 'my');
    array_splice($a, 1, 0, null);
    print_r($a);

?>
Array
(
    [0] => Hey
    [1] => hey
    [2] => my
    [3] => my
)

<?php

    $b = array('Hey', 'hey', 'my', 'my');
    array_splice($b, 1, 0, array(null));
    print_r($b);

?>
Array
(
    [0] => Hey
    [1] =>
    [2] => hey
    [3] => my
    [4] => my
)
news_yodpeirs at thoftware dot de 01-Apr-2010 01:32
Splicing with NULL as replacement may result in unexpected behavior too. Typecasting NULL into an array results in an empty array (as "(array)NULL" equals "array()"). That means, instead of creating an element with value NULL just no new element ist created (just as if there was no replacement specified).

If you want the splicing to create a new element with value NULL you have to use "array(NULL)" instead of NULL.

You should expect this if you read the explanation carefully, but just as objects are considered as a special case for replacement, NULL should be too.

The explanation of replacement better should read: "If replacement is just one element it is not necessary to put array() around it, unless the element is an array itself, an object or NULL."

And the note better should be: "If replacement is not an array, it will be typecast to one (i.e. (array) $parameter). This may result in unexpected behavior when using an object or NULL replacement."

jmtc
daniele centamore 02-Aug-2009 07:48
just useful functions to move an element using array_splice.

<?php

// info at danielecentamore dot com

// $input  (Array) - the array containing the element
// $index (int) - the index of the element you need to move

function moveUp($input,$index) {
      $new_array = $input;

       if((count($new_array)>$index) && ($index>0)){
                 array_splice($new_array, $index-1, 0, $input[$index]);
                 array_splice($new_array, $index+1, 1);
             }

       return $new_array;
}

function moveDown($input,$index) {
       $new_array = $input;

       if(count($new_array)>$index) {
                 array_splice($new_array, $index+2, 0, $input[$index]);
                 array_splice($new_array, $index, 1);
             }

       return $new_array;
 }

$input = array("red", "green", "blue", "yellow");

$newinput = moveUp($input, 2);
// $newinput is array("red", "blue", "green", "yellow")

$input = moveDown($newinput, 1);
// $input is array("red", "green", "blue", "yellow")

?>
strata_ranger at hotmail dot com 01-Jul-2009 11:53
Should you want a similar function for splicing strings together, here is a rough equivalent:

<?php
function str_splice($input, $offset, $length=null, $splice='')
{
  $input = (string)$input;
  $splice = (string)$splice;
  $count = strlen($input);

  // Offset handling (negative values measure from end of string)
  if ($offset<0) $offset = $count + $offset;

  // Length handling (positive values measure from $offset; negative, from end of string; omitted = end of string)
  if (is_null($length)) $length = $count;
  elseif ($length < 0)  $length = $count-$offset+$length;

  // Do the splice
  return substr($input, 0, $offset) . $splice . substr($input, $offset+$length);
}

$string = "The fox jumped over the lazy dog.";

// Outputs "The quick brown fox jumped over the lazy dog."
echo str_splice($string, 4, 0, "quick brown ");

?>

Obviously this is not for cases where all you need to do is a simple search-and-replace.
dead dot screamer at seznam dot cz 12-Feb-2009 05:28
I need <?php array_Splice()?> function, that use array keys instead of order (offset and length) because of associated arrays, and this is result:

<?php
/**
 *    first variation
 *
 *    $input is input array
 *    $start is index of slice begin
 *    $end is index of slice end, if this is null, $replacement will be inserted (in the same way as original array_Slice())
 *indexes of $replacement are preserved in both examples
 */
function array_KSplice1(&$input, $start, $end=null, $replacement=null)
{
    $keys=array_Keys($input);
    $values=array_Values($input);
    if($replacement!==null)
    {
        $replacement=(array)$replacement;
        $rKeys=array_Keys($replacement);
        $rValues=array_Values($replacement);
    }

    $start=array_Search($start,$keys,true);
    if($start===false)
        return false;
    if($end!==null)
    {
        $end=array_Search($end,$keys,true);
        // if $end not found, exit
        if($end===false)
            return false;
        // if $end is before $start, exit
        if($end<$start)
            return false;
        // index to length
        $end-=$start-1;
    }

    // optional arguments
    if($replacement!==null)
    {
        array_Splice($keys,$start,$end,$rKeys);
        array_Splice($values,$start,$end,$rValues);
    }
    else
    {
        array_Splice($keys,$start,$end);
        array_Splice($values,$start,$end);
    }

    $input=array_Combine($keys,$values);

    return $input;
}

/**
 *    second variation
 *
 *    $input is input array
 *    $start is index of slice begin
 *    $length is length of slice, what will be replaced, if is zero, $replacement will be inserted (in the same way as original array_Slice())
 */
function array_KSplice2(&$input, $start, $length=0, $replacement=null)
{
    $keys=array_Keys($input);
    $values=array_Values($input);
    if($replacement!==null)
    {
        $replacement=(array)$replacement;
        $rKeys=array_Keys($replacement);
        $rValues=array_Values($replacement);
    }

    $start=array_Search($start,$keys,true);
    if($start===false)
        return false;

    // optional arguments
    if($replacement!==null)
    {
        array_Splice($keys,$start,$length,$rKeys);
        array_Splice($values,$start,$length,$rValues);
    }
    else
    {
        array_Splice($keys,$start,$length);
        array_Splice($values,$start,$length);
    }

    $input=array_Combine($keys,$values);

    return $input;
}

$array=range(1,10);
var_Dump(array_KSplice1($array,3,3,array(100=>101,102,103,104)));

$array=range(1,10);
var_Dump(array_KSplice2($array,3,3,array(100=>101,102,103,104)));

?>

Both examples output:
array(11) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [100]=>
  int(101)
  [101]=>
  int(102)
  [102]=>
  int(103)
  [103]=>
  int(104)
  [6]=>
  int(7)
  [7]=>
  int(8)
  [8]=>
  int(9)
  [9]=>
  int(10)
}
madmax at max-worlds dot net 23-Sep-2008 06:23
Note:  If replacement is not an array, it will be typecast to one (i.e. (array) $parameter). This may result in unexpected behavior when using an object replacement .

Example :

<?php
class A()
{
    private $a;
    private $b;
    public function __construct()
    {
        $this->a = "foo";
        $this->b = "bar";
    }
}

$array = array();
array_splice($array, 0, 0, new A());
print_r($array);
?>

Outputs :

Array : Array
{
    [0] => foo
    [1] => bar
}

Solution : Enforce the array() on the object.

<?php
array_splice($array, 0, 0, array(new Object());
?>

Source : http://bugs.php.net/bug.php?id=44485
loushou - life dot 42 at gmail dot com 27-Jul-2008 04:39
i miss posted the actual function...
here is the real one lol

<?php

function q_sort(&$Info, $Index, $Left, $Right)
{
  echo "memory usage <b>".memory_get_usage()."</b><br/>\n";
  $L_hold = $Left;
  $R_hold = $Right;
  $Pivot = $Left;
  $PivotValue = $Info[$Left];
  while ($Left < $Right)
  {
    while (($Info[$Right][$Index] >= $PivotValue[$Index]) && ($Left < $Right))
      $Right--;
    if ($Left != $Right)
    {
      $Info[$Left] = $Info[$Right];
      $Left++;
    }
    while (($Info[$Left][$Index] <= $PivotValue[$Index]) && ($Left < $Right))
      $Left++;
    if ($Left != $Right)
    {
      $Info[$Right] = $Info[$Left];
      $Right--;
    }
  }
  $Info[$Left] = $PivotValue;
  $Pivot = $Left;
  $Left = $L_hold;
  $Right = $R_hold;
  if ($Left < $Pivot)
    q_sort($Info, $Index, $Left, $Pivot-1);
  if ($Right > $Pivot)
    q_sort($Info, $Index, $Pivot+1, $Right);
}

?>
Francis 27-Apr-2008 12:27
Do you need to sort a 2D array on just one of its variables while trying to preserve somewhat the original order?

<?php

function sort_2d_array($array, $position, $order = "ASC"){
  if (!is_array($array)) return $array;
  if (count($array) < 2) return $array;
  $new = array($array[0]);
  for ($cnt = 1; $cnt <= count($array) - 1; $cnt++){
    $stop = 0;
    $splice = 0;
    for ($newcnt = 0; $newcnt <= count($new) - 1; $newcnt++){
      if ($stop == 0){
        if ($order == "ASC")
        if ($array[$cnt][$position] < $new[$newcnt][$position]){
          $splice = $newcnt;
          $stop = 1;
        } // splice position for ASC
        if ($order == "DESC")
        if ($array[$cnt][$position] > $new[$newcnt][$position]){
          $splice = $newcnt;
          $stop = 1;
        } // splice position for DESC
      } // stop vying for position
    } // cycle through new array to find position
    if ($stop == 0){
      $new[] = $array[$cnt];
    } else {
      array_splice($new, $splice, 0, array($array[$cnt]));
    } // splice into new array while keeping somewhat the original order
  } // cycle through original array
  return $new;
} // sort_2d_array

?>

Application Example: In-House Search Engine
Here we are trying to find the word apple in the website by sort of the most recent occurances first, but the number of occurances first.

We've already sorted the mysql output by the date desc and have counted the no of occurances and have placed those in an array for the final query.

I've used this function to further sort the occurances but somewhat keep the original mysql sort order.

Key
[0] Record number
     [0] Record ID
     [1] Source Table
     [2] No of Occurances Pinged

  ---------------------------

[0]
     [0] 24530
     [1] Blogs
     [2] 1

[1]
     [0] 24400
     [1] Blogs
     [2] 1

[2]
     [0] 24240
     [1] Blogs
     [2] 4

[3]
     [0] 243422
     [1] Classifieds
     [2] 1

[4]
     [0] 243100
     [1] Classifieds
     [2] 1

After running...

<?php
sort_2d_array($array, 2, "DESC");
?>

We have...

[0]
     [0] 24240
     [1] Blogs
     [2] 4

[1]
     [0] 24530
     [1] Blogs
     [2] 1

[2]
     [0] 24400
     [1] Blogs
     [2] 1

[3]
     [0] 243422
     [1] Classifieds
     [2] 1

[4]
     [0] 243100
     [1] Classifieds
     [2] 1

Might be useful to someone...
pauljamescampbell at gmail dot com 06-Feb-2008 06:46
Here's my own take on an array slice method that preserves keys from an associative array.

<?php
/**
 * Array slice function that preserves associative keys
 *
 * @function associativeArraySlice
 *
 * @param  Array  $array  Array to slice
 * @param  Integer  $start
 * @param  Integer  $end
 *
 * @return  Array
 */
function associativeArraySlice($array, $start, $end) {
    // Method param restrictions
    if($start < 0) $start = 0;
    if($end > count($array)) $end = count($array);

    // Process vars
    $new = Array();
    $i = 0;

    // Loop
    foreach($array as $key => $value) {
        if($i >= $start && $i < $end) {
            $new[$key] = $value;
        }
        $i++;
    }
    return($new);
}
?>
mip at ycn dot com 08-Mar-2007 05:37
Ever wounder what array_splice is doing to your references, then try this little script and see the output.

<?php

$a = "a";
$b = "b";
$c = "c";
$d = "d";
$arr = array();
$arr[] =& $a;
$arr[] =& $b;
$arr[] =& $c;
array_splice($arr,1,0,array($d));
$sec_arr = array();
$sec_arr[] =& $d;
array_splice($arr,1,0,$sec_arr);

$arr[0] = "test"; // should be $a
$arr[3] = "test2"; // should be $b
$arr[1] = "this be d?"; // should be $d
$arr[2] = "or this be d?"; // should be $d
var_dump($arr);
var_dump($a);
var_dump($b);
var_dump($d);
?>

The output will be (PHP 4.3.3):

array(5) {
  [0]=>
  &string(4) "test"
  [1]=>
  &string(10) "this be d?"
  [2]=>
  string(13) "or this be d?"
  [3]=>
  &string(5) "test2"
  [4]=>
  &string(1) "c"
}
string(4) "test"
string(5) "test2"
string(10) "this be d?"

So array_splice is reference safe, but you have to be careful about the generation of the replacement array.

have fun, cheers!
ahigerd at stratitec dot com 24-Jan-2007 06:07
A comment on array_merge mentioned that array_splice is faster than array_merge for inserting values. This may be the case, but if your goal is instead to reindex a numeric array, array_values() is the function of choice. Performing the following functions in a 100,000-iteration loop gave me the following times: ($b is a 3-element array)

array_splice($b, count($b)) => 0.410652
$b = array_splice($b, 0) => 0.272513
array_splice($b, 3) => 0.26529
$b = array_merge($b) => 0.233582
$b = array_values($b) => 0.151298
bdjumakov at gmail dot com 31-Aug-2006 12:11
Someone might find this function usefull. It just takes a given element from the array and moves it before given element into the same array.

<?php
function array_move($which, $where, $array)
{
    $tmp  = array_splice($array, $which, 1);
    array_splice($array, $where, 0, $tmp);
    return $array;
}
?>
Paul 11-Feb-2006 10:06
In PHP 4.3.10, at least, it seems that elements that are inserted as part of the replacement array are inserted BY REFERENCE (that is, as though with the =& rather than = assignment operation). So if your replacement array contains elements that references to variables that you can also access via other variable name, then this will be true of the elements in the final array too.

In particular, this means that it is safe to use array_splice() on arrays of objects, as you won't be creating copies of the objects (as it is so easy to do in PHP 4).
weikard at gmx dot de 15-Sep-2005 05:53
You cannot insert with array_splice an array with your own key. array_splice will always insert it with the key "0".

<?php
// [DATA]
$test_array = array (
  row1 => array (col1 => 'foobar!', col2 => 'foobar!'),
  row2 => array (col1 => 'foobar!', col2 => 'foobar!'),
  row3 => array (col1 => 'foobar!', col2 => 'foobar!')
);

// [ACTION]
array_splice ($test_array, 2, 0, array ('rowX' => array ('colX' => 'foobar2')));
echo '<pre>'; print_r ($test_array); echo '</pre>';
?>

[RESULT]

Array (
    [row1] => Array (
            [col1] => foobar!
            [col2] => foobar!
        )

    [row2] => Array (
            [col1] => foobar!
            [col2] => foobar!
        )

    [0] => Array (
            [colX] => foobar2
        )

    [row3] => Array (
            [col1] => foobar!
            [col2] => foobar!
        )
)

But you can use the following function:

function array_insert (&$array, $position, $insert_array) {
  $first_array = array_splice ($array, 0, $position);
  $array = array_merge ($first_array, $insert_array, $array);
}

<?php
// [ACTION]

array_insert ($test_array, 2, array ('rowX' => array ('colX' => 'foobar2')));
echo '<pre>'; print_r ($test_array); echo '</pre>';
?>

[RESULT]

Array (
    [row1] => Array (
            [col1] => foobar!
            [col2] => foobar!
        )

    [row2] => Array (
            [col1] => foobar!
            [col2] => foobar!
        )

    [rowX] => Array (
            [colX] => foobar2
        )

    [row3] => Array (
            [col1] => foobar!
            [col2] => foobar!
        )
)

[NOTE]

The position "0" will insert the array in the first position (like array_shift). If you try a position higher than the langth of the array, you add it to the array like the function array_push.
csaba at alum dot mit dot edu 13-Aug-2005 02:31
Appending arrays
If you have an array $a2 whose values you would like to append to an array $a1 then four methods you could use are listed below in order of increasing time.  The last two methods took significantly more time than the first two.  The most surprising lesson is that using the & incurs a time hit.

<?php
foreach ($a2 as $elem) $a1[]=$elem;
foreach ($a2 as &$elem) $a1[]=$elem;
array_splice ($a1, count($a1), 0, $a2);
$a1 = array_merge($a1, $a2);
?>

Csaba Gabor from Vienna
randomdestination at gmail dot com 22-Jul-2005 01:52
To split an associative array based on it's keys, use this function:

<?php
function &array_split(&$in) {
    $keys = func_get_args();
    array_shift($keys);

    $out = array();
    foreach($keys as $key) {
        if(isset($in[$key]))
            $out[$key] = $in[$key];
        else
            $out[$key] = null;
        unset($in[$key]);
    }

    return $out;
}
?>

Example:
<?php
$testin = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
$testout =& array_split($testin, 'a', 'b', 'c');

print_r($testin);
print_r($testout);
?>

Will print:

Array
(
    [d] => 4
)
Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)

Hope this helps anyone!
gideon at i6developments dot com 17-Jul-2004 09:45
array_splice dynamically updates the total number of entries into the array. So for instance I had a case where I needed to insert a value into every 4th entry of the array from the back. The problem was when it added the first, because the total number was dynamically updated, it would only add after the 3rd then the 2nd and so one. The solution I found is to track the number of inserts which were done and account for them dynamically.

Code:
<?php
    $modarray = array_reverse($mili);
    $trig=1;
        foreach($modarray as $rubber => $glue) {
            if($rubber!="<BR>") {
            $i++;
            $b++;
            if ($i==4) {
                $trig++;
                if($trig<=2) {
                array_splice($modarray,$b,0,"<BR>");
                }elseif($trig>=3){
                array_splice($modarray,$b+($trig-2),0,"<BR>");
                }
                $i=0;
                };
                };
        };
    $fixarray = array_reverse($modarray);

?>
rolandfoxx at yahoo dot com 30-Mar-2004 12:16
Be careful, array_splice does not behave like you might expect should you try to pass it an object as the replacement argument.  Consider the following:

<?php
//Very truncated
class Tree {
  var $childNodes

  function addChild($offset, $node) {
    array_splice($this->childNodes, $offset, 0, $node);
    //...rest of function
  }

}

class Node {
  var $stuff
  ...
}

$tree = new Tree();
// ...set 2 nodes using other functions...
echo (count($tree->childNodes)); //Gives 2
$newNode = new Node();
// ...set node attributes here...
$tree->addChild(1, $newNode);
echo(count($tree->childNodes)); //Expect 3?  wrong!
?>

In this case, the array has a number of items added to it equal to the number of attributes in the new Node object and the values thereof  I.e, if your Node object has 2 attributes with values "foo" and "bar", count($tree->childNodes) will now return 4, with the items "foo" and "bar" added to it.  I'm not sure if this qualifies as a bug, or is just a byproduct of how PHP handles objects.

Here's a workaround for this problem:
function array_insertobj(&$array, $offset, $insert) {
  $firstPart = array_slice($array, 0, $offset);
  $secondPart = array_slice($array, $offset);
  $insertPart = array($insert);
  $array = array_merge($firstPart, $insertPart, $secondPart);
}

Note that this function makes no allowances for when $offset equals the first or last index in the array.  That's because array_unshift and array_push work just fine in those cases.  It's only array_splice that can trip you up.  Obviously, this is kinda tailor-made for arrays with numeric keys when you don't really care what said keys are, but i'm sure you could adapt it for associative arrays if you needed it.
kbrown at horizon dot sk dot ca 11-Aug-2003 12:40
[ Editor's Note: If you're not concerned with the indexes being contiguously numbered (such as for an associative array) then unset($ar[$ind]); will accomplish the same as the code below without requiring splice/splice/merge.  If contiguous numbering IS a concern (such as for indexed arrays), you can still save time by using: unset($ar[$ind]); $ar = array_values($ar); ]

Removing elements from arrays

This works better - much quicker

<?php
$ar = array("einstein", "bert", "colin", "descartes", "renoir");
$a = array_slice($ar, 0, $ind);
$b = array_slice($ar, $ind + 1);
$ar = array_merge($a, $b);
?>
plintus at smtp dot ru 14-Apr-2003 01:59
key-safe:

<?php
function array_kslice ($array, $offset, $length = 0) {
$k = array_slice (array_keys ($array), $offset, $length);
$v = array_slice (array_values ($array), $offset, $length);
for ($i = 0; $i < count ($k); $i ++) $r[$k[$i]] = $v[$i];
return $r;
}
?>

smth like this. hope you like it more than versions above :)
tsunaquake DOESNTLIKESPAM @ wp DOT pl 11-Nov-2002 10:56
It is possible to use a string instead of offset, eg if you want to deletre the entry $myArray['entry'] then you can simply do it like this:

<?php
array_splice($myArray, 'entry', 1);
?>

Note that you can use unset($myArray['entry']) as well but then, it doesn't enable you to remove more than one entry and it doesn't replace anything in the array, if that's what you intend to do.
18-Jun-2002 07:14
Please note that array_splice() 's second argument is an OFFSET and not an INDEX.

Lets say you want to
$array_of_items = array ('nothing','myitem','hisitem','heritem');
$sid = array_search('myitem',$array_of_items);
echo $sid; /* prints out 1, since index element 1 is "myitem" */

Now, lets say we want to remove that "myitem" from the array:

<?php
$array_of_items = array_splice($array_of_items,(1+$sid),1);
?>

Notice how you have to add a one to the $sid variable?  That is because offset item 1 is "nothing" and since $sid is currently 1 (the index of "myitem"), we add 1 more to it to find out
 its OFFSET.

DO NOT DO THIS:
 $array_of_items = array_splice($array_of_items,$sid,1);
paule at cs dot tamu dot edu 12-Jun-2002 09:59
to kokos@lac.lviv.ua:

Good point about the code not doing what you expected.

The failure to check for the insert case like you pointed out is not a bug, however. I didn't add code to handle that because the key of such an added index is more or less undefined in an unordered associative array. Put another way, if your array is associative and not auto-indexed, you most likely care enough about your keys to want to set them explicitly.
paule at cs dot tamu dot edu 06-Jun-2002 11:09
After reading KoKos' post above, I thought that the code I posted right before his should do what he wanted. However, my original post neglected to note the little "Tip" in the documentation above, about a single element replacement.

If one changes the lines in my code above that says:

<?php
                if(is_array($replacement))
                    foreach($replacement as $r_key=>$r_value)
                        $new_array[$r_key]=$r_value;
?>

to instead say:

<?php
                if(is_string($replacement))
                    $new_array[$key]=$replacement;
                elseif(is_array($replacement))
                    foreach($replacement as $r_key=>$r_value)
                        $new_array[$r_key]=$r_value;
?>

that will solve the problem.

Sorry for the omission.
kokos at lac dot lviv dot ua 06-Jun-2002 08:26
It may seem obvious from the above posts, but cost me a bit of
braindamage to figure this out...

Contrary to the equivalence noted on this page
$input[$x] = $y   <==>   array_splice ($input, $x, 1, $y)
array_splice() will not always work as expected,
even provided that you have only INTEGER keys!

The following code:
   $t=array('a','b','c','d','e');
   var_dump($t);

<?php
   unset($t[0],$t[1],$t[3]);
   $t[0]='f';
   var_dump($t);

   array_splice($t,0,1,'g');
   var_dump($t);
?>

Will produce:
array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
}
array(3) {
  [2]=>
  string(1) "c"
  [4]=>
  string(1) "e"
  [0]=>
  string(1) "f"
}
array(3) {
  [0]=>
  string(1) "g"
  [1]=>
  string(1) "e"
  [2]=>
  string(1) "f"
}

Note the position of $t[0] in the second call to var_dump().
And of course, array_splice() left it intact, changing $t[2] instead.
This is because it operates the _offset_, not the _index_.  :)
I think that "equivalence note" should be considered buggy.  ;)))

Best wishes.
KoKos.
jrhardytwothousandtwo at yahoo dot com 14-Feb-2002 11:54
A reference is made to INSERT'ing into an array here with array_splice, however its not explained very well.  I hope this example will help others find what took me days to research.

<?php
$original_array = array(1,2,3,4,5);
$insert_into_key_position = 3;
$item_to_insert = "blue";

$returned = array_splice($original_array, $insert_into_key_position, 0, $item_to_insert);

// $original_array will now show:

// 1,2,3,blue,4,5
?>

Remember that you are telling the array to insert the element into the KEY position.  Thus the elements start with key 0 and so on 0=>1, 1=>2, 2=>3, 3=>blue, 4=>4, 5=>5.  And walla, you've inserted.  I can't say if this is of any value for named keys, or multidimensional arrays.  However it does work for single dimensional arrays.

$returned should be an empty array as nothing was returned.  This would have substance if you were doing a replace instead.
leingang AT math DOT rutgers DOT edu 15-Jan-2002 07:32
array_splice resets the internal pointer of $input.  In fact, many array functions do this.  Caveat programmor!


Calcule la somme des valeurs du tableau

  • « array_splice
  • array_udiff_assoc »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule la somme des valeurs du tableau

array_sum

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

array_sum — Calcule la somme des valeurs du tableau

Description

array_sum ( array $array ) : int|float

array_sum() retourne la somme des valeurs du tableau array.

Liste de paramètres

array

Le tableau d'entrée.

Valeurs de retour

Retourne la somme des valeurs, sous la forme d'un entier ou d'un nombre décimal 0 si le array est vide.

Exemples

Exemple #1 Exemple avec array_sum()

<?php
$a = array(2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\n";

$b = array("a" => 1.2, "b" => 2.3, "c" => 3.4);
echo "sum(b) = " . array_sum($b) . "\n";
?>

L'exemple ci-dessus va afficher :

sum(a) = 20
sum(b) = 6.9

User Contributed Notes

There are no user contributed notes for this page.


Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel

  • « array_sum
  • array_udiff_uassoc »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel

array_udiff_assoc

(PHP 5, PHP 7, PHP 8)

array_udiff_assoc — Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel

Description

array_udiff_assoc ( array $array , array ...$arrays , callable $value_compare_func ) : array

Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel.

Note: Notez que cette fonction ne vérifie qu'une seule dimension d'un tableau multidimensionnel. Vous pouvez, bien sûr, tester une dimension particulière en utilisant par exemple, array_udiff_assoc($array1[1], $array2[1], "compare_func");.

Liste de paramètres

array

Le premier tableau.

arrays

Tableaux à comparer contre

value_compare_func

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

callback ( mixed $a, mixed $b ) : int

Valeurs de retour

array_udiff_assoc() retourne un tableau contenant toutes les valeurs de array qui ne sont présentes dans aucun des autre arguments. Notez que les clés sont utilisées dans les comparaisons contrairement à array_diff() et array_udiff(). La comparaison des données est effectuée en utilisant une fonction de rappel fournie par l'utilisateur, data_compare_func. Ce comportement est différent de celui de array_diff_assoc() qui utilise une fonction de comparaison interne.

Exemples

Exemple #1 Exemple avec array_udiff_assoc()

<?php
class cr {
    private $priv_member;
    function cr($val)
    {
        $this->priv_member = $val;
    }

    static function comp_func_cr($a, $b)
    {
        if ($a->priv_member === $b->priv_member) return 0;
        return ($a->priv_member > $b->priv_member)? 1:-1;
    }
}

$a = array("0.1" => new cr(9), "0.5" => new cr(12), 0 => new cr(23), 1=> new cr(4), 2 => new cr(-15),);
$b = array("0.2" => new cr(9), "0.5" => new cr(22), 0 => new cr(3), 1=> new cr(4), 2 => new cr(-15),);

$result = array_udiff_assoc($a, $b, array("cr", "comp_func_cr"));
print_r($result);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0.1] => cr Object
        (
            [priv_member:private] => 9
        )

    [0.5] => cr Object
        (
            [priv_member:private] => 12
        )

    [0] => cr Object
        (
            [priv_member:private] => 23
        )
)

Dans notre exemple, vous voyez que la paire "1" => new cr(4) est présente dans les deux tableaux et donc absente du tableau résultant.

Voir aussi

  • array_diff() - Calcule la différence entre des tableaux
  • array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés
  • array_diff_uassoc() - Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel
  • array_udiff() - Calcule la différence entre deux tableaux en utilisant une fonction rappel
  • array_udiff_uassoc() - Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_uintersect() - Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel
  • array_uintersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel
  • array_uintersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée

User Contributed Notes

m dot ario dot huq at gmail dot com 05-Mar-2018 06:28
The example #1 can be modified (PHP 7 or higher) by using Spaceship operator (<=>):

<?php
//…
static function comp_func_cr($a, $b)
{
    return $a->priv_member <=> $b->priv_member;
}
//…
?>
tmquang6805 at yahoo dot com 25-May-2014 09:54
Difference between array_udiff_assoc() and array_diff_assoc()

- array_udiff_assoc(): Compares the DATA with the user supplied callback function
- array_diff_assoc(): Compares the INDEX with the user supplied callback function


Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel

  • « array_udiff_assoc
  • array_udiff »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel

array_udiff_uassoc

(PHP 5, PHP 7, PHP 8)

array_udiff_uassoc — Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel

Description

array_udiff_uassoc ( array $array , array ...$arrays , callable $value_compare_func , callable $key_compare_func ) : array

Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel.

Notez que les clés sont utilisées dans les comparaisons contrairement à array_diff() et array_udiff().

Liste de paramètres

array

Le premier tableau.

arrays

Tableaux à comparer contre

value_compare_func

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

callback ( mixed $a, mixed $b ) : int
key_compare_func

La comparaison des clés (indices) est effectuée par la fonction de rappel key_compare_func. Ce comportement est différent de celui de array_udiff_assoc(), vu que cette dernière utilise une fonction interne pour comparer les indices.

Valeurs de retour

Retourne un tableau contenant toutes les valeurs du tableau array qui ne sont pas présentes dans aucun autre argument.

Exemples

Exemple #1 Exemple avec array_udiff_uassoc()

<?php
class cr {
    private $priv_member;
    function cr($val)
    {
        $this->priv_member = $val;
    }

    static function comp_func_cr($a, $b)
    {
        if ($a->priv_member === $b->priv_member) return 0;
        return ($a->priv_member > $b->priv_member)? 1:-1;
    }

    static function comp_func_key($a, $b)
    {
        if ($a === $b) return 0;
        return ($a > $b)? 1:-1;
    }
}
$a = array("0.1" => new cr(9), "0.5" => new cr(12), 0 => new cr(23), 1=> new cr(4), 2 => new cr(-15),);
$b = array("0.2" => new cr(9), "0.5" => new cr(22), 0 => new cr(3), 1=> new cr(4), 2 => new cr(-15),);

$result = array_udiff_uassoc($a, $b, array("cr", "comp_func_cr"), array("cr", "comp_func_key"));
print_r($result);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0.1] => cr Object
        (
            [priv_member:private] => 9
        )

    [0.5] => cr Object
        (
            [priv_member:private] => 12
        )

    [0] => cr Object
        (
            [priv_member:private] => 23
        )
)

Dans notre exemple, vous voyez que la paire "1" => new cr(4) est présente dans les deux tableaux et donc, absente du tableau résultant. Gardez en tête que vous devez fournir deux fonctions de rappel.

Notes

Note: Notez que cette fonction ne vérifie qu'une seule dimension d'un tableau multidimensionnel. Vous pouvez, bien sûr, tester une dimension particulière en utilisant par exemple array_udiff_uassoc($array1[0], $array2[0], "data_compare_func", "key_compare_func");.

Voir aussi

  • array_diff() - Calcule la différence entre des tableaux
  • array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés
  • array_udiff() - Calcule la différence entre deux tableaux en utilisant une fonction rappel
  • array_udiff_assoc() - Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_uintersect() - Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel
  • array_uintersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel
  • array_uintersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée

User Contributed Notes

There are no user contributed notes for this page.


Calcule la différence entre deux tableaux en utilisant une fonction rappel

  • « array_udiff_uassoc
  • array_uintersect_assoc »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule la différence entre deux tableaux en utilisant une fonction rappel

array_udiff

(PHP 5, PHP 7, PHP 8)

array_udiff — Calcule la différence entre deux tableaux en utilisant une fonction rappel

Description

array_udiff ( array $array , array ...$arrays , callable $value_compare_func ) : array

Calcule la différence entre deux tableaux en utilisant une fonction rappel. Cette fonctionne agit comme la fonction array_diff() qui utilise une fonction interne pour comparer les données.

Liste de paramètres

array

Le premier tableau.

arrays

Tableaux à comparer contre

value_compare_func

La fonction de comparaison.

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

callback ( mixed $a, mixed $b ) : int

Valeurs de retour

Retourne un tableau contenant toutes les valeurs du tableau array qui ne sont pas présentes dans aucun autre argument.

Exemples

Exemple #1 Exemple avec array_udiff() en utilisant les objets stdClass

<?php
// Arrays to compare
$array1 = array(new stdclass, new stdclass,
                new stdclass, new stdclass,
               );

$array2 = array(
                new stdclass, new stdclass,
               );

// Définit quelques propriétés pour chaque objet
$array1[0]->width = 11; $array1[0]->height = 3;
$array1[1]->width = 7;  $array1[1]->height = 1;
$array1[2]->width = 2;  $array1[2]->height = 9;
$array1[3]->width = 5;  $array1[3]->height = 7;

$array2[0]->width = 7;  $array2[0]->height = 5;
$array2[1]->width = 9;  $array2[1]->height = 2;

function compare_by_area($a, $b) {
    $areaA = $a->width * $a->height;
    $areaB = $b->width * $b->height;

    if ($areaA < $areaB) {
        return -1;
    } elseif ($areaA > $areaB) {
        return 1;
    } else {
        return 0;
    }
}

print_r(array_udiff($array1, $array2, 'compare_by_area'));
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => stdClass Object
        (
            [width] => 11
            [height] => 3
        )

    [1] => stdClass Object
        (
            [width] => 7
            [height] => 1
        )

)

Exemple #2 Exemple avec array_udiff() en utilisant des objets DateTime

<?php
class MyCalendar {
    public $free = array();
    public $booked = array();

    public function __construct($week = 'now') {
        $start = new DateTime($week);
        $start->modify('Monday this week midnight');
        $end = clone $start;
        $end->modify('Friday this week midnight');
        $interval = new DateInterval('P1D');
        foreach (new DatePeriod($start, $interval, $end) as $freeTime) {
            $this->free[] = $freeTime;
        }
    }

    public function bookAppointment(DateTime $date, $note) {
        $this->booked[] = array('date' => $date->modify('midnight'), 'note' => $note);
    }

    public function checkAvailability() {
        return array_udiff($this->free, $this->booked, array($this, 'customCompare'));
    }

    public function customCompare($free, $booked) {
        if (is_array($free)) $a = $free['date'];
        else $a = $free;
        if (is_array($booked)) $b = $booked['date'];
        else $b = $booked;
        if ($a == $b) {
            return 0;
        } elseif ($a > $b) {
            return 1;
        } else {
            return -1;
        }
    }
}

// Crée un calendrier pour les rendez-vous hébdomadaires
$myCalendar = new MyCalendar;

// Enregistre quelques rendez-vous pour cette semaine
$myCalendar->bookAppointment(new DateTime('Monday this week'), "Cleaning GoogleGuy's apartment.");
$myCalendar->bookAppointment(new DateTime('Wednesday this week'), "Going on a snowboarding trip.");
$myCalendar->bookAppointment(new DateTime('Friday this week'), "Fixing buggy code.");

// Vérifie la disponibilité en jours, en comparant les dates $booked avec les dates $free
echo "I'm available on the following days this week...\n\n";
foreach ($myCalendar->checkAvailability() as $free) {
    echo $free->format('l'), "\n";
}
echo "\n\n";
echo "I'm busy on the following days this week...\n\n";
foreach ($myCalendar->booked as $booked) {
    echo $booked['date']->format('l'), ": ", $booked['note'], "\n";
}
?>

L'exemple ci-dessus va afficher :

I'm available on the following days this week...

Tuesday
Thursday

I'm busy on the following days this week...

Monday: Cleaning GoogleGuy's apartment.
Wednesday: Going on a snowboarding trip.
Friday: Fixing buggy code.

Notes

Note: Notez que cette fonction ne vérifie qu'une seule dimension d'un tableau multidimensionnel. Vous pouvez, bien sûr, tester une dimension particulière en utilisant par exemple array_udiff($array1[0], $array2[0], "data_compare_func");.

Voir aussi

  • array_diff() - Calcule la différence entre des tableaux
  • array_diff_assoc() - Calcule la différence de deux tableaux, en prenant aussi en compte les clés
  • array_diff_uassoc() - Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel
  • array_udiff_assoc() - Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
  • array_udiff_uassoc() - Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_uintersect() - Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel
  • array_uintersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel
  • array_uintersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée

User Contributed Notes

Jorge Morales (morales2k) 20-Dec-2018 02:17
I find it that this is an ideal place to apply the spaceship operator, but it was not used in the examples.

Here is Example#1 using the spaceship operator in the comparison function.

    <?php
    // Arrays to compare
    $array1 = array(new stdclass, new stdclass,
                    new stdclass, new stdclass,
                   );

    $array2 = array(
                    new stdclass, new stdclass,
                   );

    // Set some properties for each object
    $array1[0]->width = 11; $array1[0]->height = 3;
    $array1[1]->width = 7;  $array1[1]->height = 1;
    $array1[2]->width = 2;  $array1[2]->height = 9;
    $array1[3]->width = 5;  $array1[3]->height = 7;

    $array2[0]->width = 7;  $array2[0]->height = 5;
    $array2[1]->width = 9;  $array2[1]->height = 2;

    function compare_by_area($a, $b) {
        $areaA = $a->width * $a->height;
        $areaB = $b->width * $b->height;

        return $areaA <=> $areaB;
    }

    print_r(array_udiff($array1, $array2, 'compare_by_area'));
    ?>

The output is:
    Array
    (
        [0] => stdClass Object
            (
                [width] => 11
                [height] => 3
            )

        [1] => stdClass Object
            (
                [width] => 7
                [height] => 1
            )

    )

I find it is pretty awesome you can substitute all of these lines:
    if ($areaA < $areaB) {
        return -1;
    } elseif ($areaA > $areaB) {
        return 1;
    } else {
        return 0;
    }

with just:

    return $areaA <=> $areaB;

Neat!
napcoder 27-Jul-2016 08:38
Note that the compare function is used also internally, to order the arrays and choose which element compare against in the next round.

If your compare function is not really comparing (ie. returns 0 if elements are equals, 1 otherwise), you will receive an unexpected result.
b4301775 at klzlk dot com 15-Jun-2011 11:09
Quick example for using array_udiff to do a multi-dimensional diff

Returns values of $arr1 that are not in $arr2

<?php
$arr1 = array( array('Bob', 42), array('Phil', 37), array('Frank', 39) );

$arr2 = array( array('Phil', 37), array('Mark', 45) );

$arr3 = array_udiff($arr1, $arr2, create_function(
    '$a,$b',
    'return strcmp( implode("", $a), implode("", $b) ); ')
    );

print_r($arr3);
?>

Output:

Array
(
    [0] => Array
        (
            [0] => Bob
            [1] => 42
        )

    [2] => Array
        (
            [0] => Frank
            [1] => 39
        )

)
1

Hope this helps someone
jared 07-Jul-2009 12:27
Note that php does the string conversion *before* sending the values to the callback function.
adam dot jorgensen dot za at gmail dot com 08-Oct-2008 06:51
It is not stated, by this function also diffs array1 to itself, removing any duplicate values...
grantwparks at gmail dot com 31-Dec-2007 07:15
Re: "convoluted"

I think the point being made is that array_udiff() can be used not only for comparisons between homogenous arrays, as in your example (and definitely the most common need), but it can be used to compare heterogeneous arrays, too.

Consider:

<?php
function compr_1($a, $b) {
    $aVal = is_array($a) ? $a['last_name'] : $a;
    $bVal = is_array($b) ? $b['last_name'] : $b;
    return strcasecmp($aVal, $bVal);
}

$aEmployees = array(
    array('last_name'  => 'Smith',
            'first_name' => 'Joe',
            'phone'      => '555-1000'),
    array('last_name'  => 'Doe',
            'first_name' => 'John',
            'phone'      => '555-2000'),
    array('last_name'  => 'Flagg',
            'first_name' => 'Randall',
            'phone'      => '666-1000')
    );

$aNames = array('Doe', 'Smith', 'Johnson');

$result = array_udiff($aEmployees, $aNames, "compr_1");

print_r($result);
?>

Allowing me to get the "employee" that's not in the name list:

Array ( [2] => Array ( [last_name] => Flagg [first_name] => Randall [phone] => 666-1000 ) )

Something interesting to note, is that the two arguments to the compare function don't correspond to array1 and array2.  That's why there has to be logic in it to handle that either of the arguments might be pointing to the more complex employee array.  (Found this out the hard way.)
Colin 02-Aug-2006 01:15
I think the example given here using classes is convoluting things too much to demonstrate what this function does.

array_udiff() will walk through array_values($a) and array_values($b) and compare each value by using the passed in callback function.

To put it another way, array_udiff() compares $a[0] to $b[0], $b[1], $b[2], and $b[3] using the provided callback function.  If the callback returns zero for any of the comparisons then $a[0] will not be in the returned array from array_udiff().  It then compares $a[1] to $b[0], $b[1], $b[2], and $b[3].  Then, finally, $a[2] to $b[0], $b[1], $b[2], and $b[3].

For example, compare_ids($a[0], $b[0]) === -5 while compare_ids($a[1], $b[1]) === 0.  Therefore, $a[1] is not returned from array_udiff() since it is present in $b.

<?
$a = array(
        array(
                'id' => 10,
                'name' => 'John',
                'color' => 'red',
        ),
        array(
                'id' => 20,
                'name' => 'Elise',
                'color' => 'blue',
        ),
        array(
                'id' => 30,
                'name' => 'Mark',
                'color' => 'red',
        ),
);

$b = array(
        array(
                'id' => 15,
                'name' => 'Nancy',
                'color' => 'black',
        ),
        array(
                'id' => 20,
                'name' => 'Elise',
                'color' => 'blue',
        ),
        array(
                'id' => 30,
                'name' => 'Mark',
                'color' => 'red',
        ),
        array(
                'id' => 40,
                'name' => 'John',
                'color' => 'orange',
        ),
);

function compare_ids($a, $b)
{
    return ($a['id'] - $b['id']);
}
function compare_names($a, $b)
{
    return strcmp($a['name'], $b['name']);
}

$ret = array_udiff($a, $b, 'compare_ids');
var_dump($ret);

$ret = array_udiff($b, $a, 'compare_ids');
var_dump($ret);

$ret = array_udiff($a, $b, 'compare_names');
var_dump($ret);
?>

Which returns the following.

In the first return we see that $b has no entry in it with an id of 10.
<?
array(1) {
  [0]=>
  array(3) {
    ["id"]=>
    int(10)
    ["name"]=>
    string(4) "John"
    ["color"]=>
    string(3) "red"
  }
}
?>

In the second return we see that $a has no entry in it with an id of 15 or 40.
<?
array(2) {
  [0]=>
  array(3) {
    ["id"]=>
    int(15)
    ["name"]=>
    string(5) "Nancy"
    ["color"]=>
    string(5) "black"
  }
  [3]=>
  array(3) {
    ["id"]=>
    int(40)
    ["name"]=>
    string(4) "John"
    ["color"]=>
    string(6) "orange"
  }
}
?>

In third return we see that all names in $a are in $b (even though the entry in $b whose name is 'John' is different, the anonymous function is only comparing names).
<?
array(0) {
}
?>
dmhouse at gmail dot com 20-Jan-2005 01:44
Very easy way of achieving a case-insensitive version of array_diff (or indeed array_diff_assoc, array_intersect or any of these types of functions which have a similar function that takes a callback function as one of their parameters):

array_udiff($array1, $array2, 'strcasecmp');

This works because strcasecmp() compares two strings case-insensitively, as compared to the array_diff() which compares two strings by using the == operator, which is case-sensitive.
aidan at php dot net 28-May-2004 07:11
This functionality is now implemented in the PEAR package PHP_Compat.

More information about using this function without upgrading your version of PHP can be found on the below link:

http://pear.php.net/package/PHP_Compat


Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel

  • « array_udiff
  • array_uintersect_uassoc »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel

array_uintersect_assoc

(PHP 5, PHP 7, PHP 8)

array_uintersect_assoc — Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel

Description

array_uintersect_assoc ( array $array , array ...$arrays , callable $value_compare_func ) : array

Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel.

Notez que les clés sont utilisées dans la comparaison par opposition à la fonction array_uintersect(). Les données sont comparées en utilisant une fonction de rappel.

Liste de paramètres

array

Le premier tableau.

arrays

Tableaux à comparer contre

value_compare_func

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

callback ( mixed $a, mixed $b ) : int

Valeurs de retour

Retourne un tableau contenant toutes les valeurs du tableau array qui sont présentes dans tous les autres arguments.

Exemples

Exemple #1 Exemple avec array_uintersect_assoc()

<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "GREEN", "B" => "brown", "yellow", "red");

print_r(array_uintersect_assoc($array1, $array2, "strcasecmp"));
?>

L'exemple ci-dessus va afficher :

Array
(
    [a] => green
)

Voir aussi

  • array_uintersect() - Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_intersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
  • array_uintersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée

User Contributed Notes

There are no user contributed notes for this page.


Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée

  • « array_uintersect_assoc
  • array_uintersect »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée

array_uintersect_uassoc

(PHP 5, PHP 7, PHP 8)

array_uintersect_uassoc — Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée

Description

array_uintersect_uassoc ( array $array1 , array ...$arrays , callable $value_compare_func , callable $key_compare_func ) : array

Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée.

Liste de paramètres

array1

Le premier tableau.

arrays

Tableaux supplémentaires

value_compare_func

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

callback ( mixed $a, mixed $b ) : int
key_compare_func

Fonction de rappel utilisée pour la comparaison des clés.

Valeurs de retour

Retourne un tableau contenant toutes les valeurs du tableau array qui sont présentes dans tous les arguments.

Exemples

Exemple #1 Exemple avec array_uintersect_uassoc()

<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "GREEN", "B" => "brown", "yellow", "red");

print_r(array_uintersect_uassoc($array1, $array2, "strcasecmp", "strcasecmp"));
?>

L'exemple ci-dessus va afficher :

Array
(
    [a] => green
    [b] => brown
)

Voir aussi

  • array_uintersect() - Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_intersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
  • array_uintersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel

User Contributed Notes

aidan at php dot net 31-Aug-2004 03:52
Please note, the correct function synopsis is:

array array_uintersect_uassoc ( array array1, array array2 [, array ...], callback data_compare_func, callback key_compare_func)

You may specifiy as many arrays as you like, but the last two parameters must be valid call back functions.


Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel

  • « array_uintersect_uassoc
  • array_unique »
  • PHP Manual
  • Fonctions sur les tableaux
  • Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel

array_uintersect

(PHP 5, PHP 7, PHP 8)

array_uintersect — Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel

Description

array_uintersect ( array $array , array ...$arrays , callable $value_compare_func ) : array

Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel.

Liste de paramètres

array

Le premier tableau.

arrays

Tableaux à comparer contre

value_compare_func

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

callback ( mixed $a, mixed $b ) : int

Valeurs de retour

Retourne un tableau contenant toutes les valeurs du tableau array qui sont présentes dans tous les arguments.

Exemples

Exemple #1 Exemple avec array_uintersect()

<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "GREEN", "B" => "brown", "yellow", "red");

print_r(array_uintersect($array1, $array2, "strcasecmp"));
?>

L'exemple ci-dessus va afficher :

Array
(
    [a] => green
    [b] => brown
    [0] => red
)

Voir aussi

  • array_intersect() - Calcule l'intersection de tableaux
  • array_intersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur les index
  • array_uintersect_assoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel
  • array_uintersect_uassoc() - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée

User Contributed Notes

rob dot c dot ruiz at gmail dot com 15-Nov-2018 11:21
When trying to do a case insensitive comparison between arrays of words, the strcasecmp function works very nicely with this one like so:

$arr1 = array('blue', 'green', 'red');

$arr2 = array('BLUE', 'Purple', 'Red');

$loose_matches = array_uintersect($arr1, $arr2, 'strcasecmp');

print_r($loose_matches) // array('blue', 'red');
Hayley Watson 01-Jan-2018 10:25
As for the other "compare function" callbacks, the return value from the callback function doesn't need to be -1, 0, or 1.

cmp($a,$b) just needs to be <0, =0, or >0 depending on whether $a<$b, $a=$b, or $a>$b.
Nate at RuggFamily dot com 02-Feb-2007 12:03
I want to stress that in the user function, you do need to return either a 1 or a -1 properly; you cannot simply return 0 if the results are equal and 1 if they are not.

The following code is incorrect:

<?php
function myfunction($v1,$v2)
{
if ($v1===$v2)
    {
    return 0;
    }
return 1;
}

$a1=array(1, 2, 4);
$a2=array(1, 3, 4);
print_r(array_uintersect($a1,$a2,"myfunction"));
?>

This code is correct:

<?php
function myfunction($v1,$v2)
{
if ($v1===$v2)
    {
    return 0;
    }
if ($v1 > $v2) return 1;
return -1;
}
$a1=array(1, 2, 4);
$a2=array(1, 3, 4);
print_r(array_uintersect($a1,$a2,"myfunction"));
?>


Dédoublonne un tableau

  • « array_uintersect
  • array_unshift »
  • PHP Manual
  • Fonctions sur les tableaux
  • Dédoublonne un tableau

array_unique

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

array_unique — Dédoublonne un tableau

Description

array_unique ( array $array , int $flags = SORT_STRING ) : array

array_unique() extrait du tableau array les valeurs distinctes, et supprime tous les doublons.

Notez que les clés sont préservées. Si plusieurs éléments comparés sont égaux sous le flags donné, alors la clé et la valeur du premier élément égal sera conservé.

Note: Deux éléments sont considérés comme égaux si et seulement si (string) $elem1 === (string) $elem2, i.e. lorsque la représentation en chaîne de caractères est identique.

Liste de paramètres

array

Le tableau d'entrée.

flags

Le second paramètre optionnel flags peut être utilisé pour modifier le comportement du tri en utilisant les valeurs suivantes :

Drapeau de type de tri :

  • SORT_REGULAR - compare les éléments normalement (ne modifie pas les types)
  • SORT_NUMERIC - compare les éléments numériquement
  • SORT_STRING - compare les éléments comme des chaînes
  • SORT_LOCALE_STRING - compare les éléments comme des chaînes, suivant la locale courante.

Valeurs de retour

Retourne le tableau filtré.

Historique

Version | Description
7.2.0 | Si flags est SORT_STRING, précédemment array était copié et les éléments non-unique était supprimé (sans compresser le tableau après), mais maintenant un nouveau tableau est construit en ajoutant les éléments unique. Par conséquence le résultat final peut avoir des index numérique différent.

Exemples

Exemple #1 Exemple avec array_unique()

<?php
$input = array("a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique($input);
print_r($result);
?>

L'exemple ci-dessus va afficher :

Array
(
    [a] => green
    [0] => red
    [1] => blue
)

Exemple #2 Exemple avec array_unique() et les types

<?php
$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);
?>

L'exemple ci-dessus va afficher :

array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}

Voir aussi

  • array_count_values() - Compte le nombre de valeurs d'un tableau

Notes

Note: Notez que array_unique() ne fonctionne pas avec des tableaux multi-dimensionnels.

User Contributed Notes

contact at evoweb dot fr 16-Feb-2021 08:32
Here is a solution to make unique values keeping empty values for an array with keys :

<?php
function array_unique_kempty($array) {
    $values = array_unique($array);
    $return = array_combine(array_keys($array), array_fill(0,count($array),null));
    return array_merge($return,$values);
}

$myArray = [
    "test1" => "aaa",
    "test2" => null,
    "test3" => "aaa",
    "test4" => "bbb",
    "test5" => null,
    "test6" => "ccc",
    "test7" => "ddd",
    "test8" => "ccc"
];

echo "<pre>".print_r(array_unique_kempty($myArray),true)."</pre>";

/*
Array
(
    [test1] => aaa
    [test2] =>
    [test3] =>
    [test4] => bbb
    [test5] =>
    [test6] => ccc
    [test7] => ddd
    [test8] =>
)
*/
?>
Eduardo Corts Vzquez (ecortes) 08-Jan-2021 10:19
Create multidimensional array unique for any single key index.

<?php

$users = [
    ['id' => 1, 'name' => 'ecortes', 'phone' => '1111111'],
    ['id' => 2, 'name' => 'canepa', 'phone' => '222222'],
    ['id' => 1, 'name' => 'john', 'phone' => '3333333'],
];

function array_unique_multi($array, $key) {
    return array_reduce($array, function($acc, $curr) use($key) {
        if(!in_array($curr[$key], array_column($acc, $key))) {
            array_push($acc, $curr);
        }
        return $acc;
    }, []);
}

//Call the function
$unique_users = array_unique_multi($users, 'id');

//output
$users = [
    ['id' => 1, 'name' => 'ecortes', 'phone' => '1111111'],
    ['id' => 2, 'name' => 'canepa', 'phone' => '222222'],
];
?>
falundir at gmail dot com 19-Jun-2018 05:51
I find it odd that there is no version of this function which allows you to use a comparator callable in order to determine items equality (like array_udiff and array_uintersect). So, here's my version for you:

<?php
function array_uunique(array $array, callable $comparator): array {
    $unique_array = [];
    do {
        $element = array_shift($array);
        $unique_array[] = $element;

        $array = array_udiff(
            $array,
            [$element],
            $comparator
        );
    } while (count($array) > 0);

    return $unique_array;
}
?>

And here is a test code:

<?php
class Foo {

    public $a;

    public function __construct(int $a) {
        $this->a = $a;
    }
}

$array_of_objects = [new Foo(2), new Foo(1), new Foo(3), new Foo(2), new Foo(2), new Foo(1)];

$comparator = function (Foo $foo1, Foo $foo2): int {
    return $foo1->a <=> $foo2->a;
};

var_dump(array_uunique($array_of_objects, $comparator)); // should output [Foo(2), Foo(1), Foo(3)]
?>
subhrajyoti dot de007 at gmail dot com 01-Jun-2018 05:25
Simple and clean way to get duplicate entries removed from a multidimensional array.

<?php
          $multi_array = $multi_array [0];
          $multi_array = array_unique($multi_array);
          print_r($multi_array);
?>
Matt S 26-Apr-2018 02:45
In case you are looking for a function that works like array_unique but does not do the string conversion first.

<?php
function array_unique_full($arr, $strict = false) {
    return array_filter($arr, function($v, $k) use ($arr, $strict) {
        return array_search($v, $arr, $strict) === $k;
    }, ARRAY_FILTER_USE_BOTH);
}
?>
Fabiano 04-Jan-2018 10:22
As for PHP 7.1.12, this is the comparison between array_keys(array_flip()), array_flip(array_flip()), for each elimination and array_unique. The array_keys(array_flip()) is the fastest method to remove duplication values from a single dimension array:

<?php

$max = 1000000;
$arr = range(1,$max,3);
$arr2 = range(1,$max,2);
$arr = array_merge($arr,$arr2);

$time = -microtime(true);
$res1 = array_unique($arr);
$time += microtime(true);

echo "<br>deduped to ".count($res1)." in ".$time;
// deduped to 666667 in 0.78185796737671
// memory used: 33558528

$time = -microtime(true);
$res2 = array_flip(array_flip($arr));
$time += microtime(true);

echo "<br><br>deduped to ".count($res2)." in ".$time;
// deduped to 666667 in 0.072191953659058
// memory used: 3774873

$time = -microtime(true);
$res3 = array();
foreach($arr as $key=>$val) {
    $res3[$val] = true;
}
$res3 = array_keys($res3);
$time += microtime(true);

echo "<br /><br>deduped to ".count($res3)." in ".$time;
// deduped to 666667 in 0.095494985580444
// memory used: 33558528

$time = -microtime(true);
$res4 = array_keys(array_flip($arr));
$time += microtime(true);

echo "<br /><br>deduped to ".count($res4)." in ".$time;
// deduped to 666667 in 0.05807900428772
// memory used: 33558528
calexandrepcjr at gmail dot com 20-Jun-2017 03:19
Following the Ghanshyam Katriya idea, but with an array of objects, where the $key is related to object propriety that you want to filter the uniqueness of array:

<?php
function obj_multi_unique($obj, $key = false)
    {
        $totalObjs = count($obj);
        if (is_array($obj) && $totalObjs > 0 && is_object($obj[0]) && ($key && !is_numeric($key))) {
            for ($i = 0; $i < $totalObjs; $i++) {
                if (isset($obj[$i])) {
                    for ($j = $i + 1; $j < $totalObjs; $j++) {
                        if (isset($obj[$j]) && $obj[$i]->{$key} === $obj[$j]->{$key}) {
                            unset($obj[$j]);
                        }
                    }
                }
            }
            return array_values($obj);
        } else {
            throw new Exception('Invalid argument or your array of objects is empty');
        }
    }
?>
stoff@ 20-Jan-2017 03:23
In reply to performance tests array_unique vs foreach.

In PHP7 there were significant changes to Packed and Immutable arrays resulting in the performance difference to drop considerably. Here is the same test on php7.1 here;
http://sandbox.onlinephpfunctions.com/code/2a9e986690ef8505490489581c1c0e70f20d26d1

$max = 770000; //large enough number within memory allocation
$arr = range(1,$max,3);
$arr2 = range(1,$max,2);
$arr = array_merge($arr,$arr2);

$time = -microtime(true);
$res1 = array_unique($arr);
$time += microtime(true);
echo "deduped to ".count($res1)." in ".$time;
// deduped to 513333 in 1.0876770019531

$time = -microtime(true);
$res2 = array();
foreach($arr as $key=>$val) {
    $res2[$val] = true;
}
$res2 = array_keys($res2);
$time += microtime(true);
echo "<br />deduped to ".count($res2)." in ".$time;
// deduped to 513333 in 0.054931879043579
zoolyka at gmail dot com 18-Jan-2016 10:48
I found the simplest way to "unique" multidimensional arrays as follows:

<?php

$array = array(
    'a' => array(1, 2),
    'b' => array(1, 2),
    'c' => array(2, 2),
    'd' => array(2, 1),
    'e' => array(1, 1),
);

$array = array_map('json_encode', $array);
$array = array_unique($array);
$array = array_map('json_decode', $array);

print_r($array);

?>

As you can see "b" will be removed without any errors or notices.
tim at heuer dot nz 11-Oct-2015 10:57
I created a function for doing array_unique with a custom in_array function. So, if elements are considered in the array passed to this function, the array returned won't include elements that are considered equal and only return the values from the first array that are not considered in the array:

<?php

function uniqueBy(array $array, callable $in_array_func) {
    $result = array();
    foreach ($array as $key => $item) {
        if (!$in_array_func($item, $result)) {
            $result[$key] = $item;
        }
    }
    return $result;
}

?>

Example usage:

<?php

$in_array_func = function($item, $array) {
    $fromBower = function($item) {
        $result = substr($item, strpos($item, 'bower_components'));
        return $result;
    };
    foreach ($array as $myItem) {
        if ($fromBower($item) == $fromBower($myItem)) {
            return true;
        }
    }
    return false;
};

// ...
$jss = uniqueBy($jss, $in_array_func);
?>
Ludovico Grossi 19-Dec-2014 02:01
[Editor's note: please note that this will not work well with non-scalar values in the array. Array keys can not be arrays themselves, nor streams, resources, etc. Flipping the array causes a change in key-name]

You can do a super fast version of array_unique directly in PHP, even faster than the other solution posted in the comments!

Compared to the built in function it is 20x faster! (2x faster than the solution in the comments).

<?php
function superfast_array_unique($array) {
    return array_keys(array_flip($array));
}
?>

This works faster for small and big arrays.
Ghanshyam Katriya(anshkatriya at gmail) 09-Dec-2014 10:15
Create multidimensional array unique for any single key index.
e.g I want to create multi dimentional unique array for specific code

Code :
My array is like this,

<?php
$details = array(
    0 => array("id"=>"1", "name"=>"Mike",    "num"=>"9876543210"),
    1 => array("id"=>"2", "name"=>"Carissa", "num"=>"08548596258"),
    2 => array("id"=>"1", "name"=>"Mathew",  "num"=>"784581254"),
);
?>

You can make it unique for any field like id, name or num.

I have develop this function for same :
<?php
function unique_multidim_array($array, $key) {
    $temp_array = array();
    $i = 0;
    $key_array = array();

    foreach($array as $val) {
        if (!in_array($val[$key], $key_array)) {
            $key_array[$i] = $val[$key];
            $temp_array[$i] = $val;
        }
        $i++;
    }
    return $temp_array;
}
?>

Now, call this function anywhere from your code,

something like this,
<?php
$details = unique_multidim_array($details,'id');
?>

Output will be like this :
<?php
$details = array(
    0 => array("id"=>"1","name"=>"Mike","num"=>"9876543210"),
    1 => array("id"=>"2","name"=>"Carissa","num"=>"08548596258"),
);
?>
mostafatalebi at rocketmail dot com 13-Dec-2013 02:38
If you find the need to get a sorted array without it preserving the keys, use this code which has worked for me:

<?php

$array = array("hello", "fine", "good", "fine", "hello", "bye");

$get_sorted_unique_array = array_values(array_unique($array));

?>

The above code returns an array which is both unique and sorted from zero.
bx16soupapes at gmail dot com 11-Jun-2013 07:55
Another form to make an array unique (manual):

This is my array

Array
(
    [0] => Array
        (
            [0] => 40665
            [1] => 40665
            [2] => 40665
            [3] => 40665
            [4] => 40666
            [5] => 40666
            [6] => 40666
            [7] => 40666
            [8] => 40667
            [9] => 40667
            [10] => 40667
            [11] => 40667
            [12] => 40667
            [13] => 40668
            [14] => 40668
            [15] => 40668
            [16] => 40668
            [17] => 40668
            [18] => 40669
            [19] => 40669
            [20] => 40670
            [21] => 40670
            [22] => 40670
            [23] => 40670
            [24] => 40671
            [25] => 40671
            [26] => 40671
            [27] => 40671
            [28] => 40671
        )

    [1] => Array
        (
            [0] => 40672
            [1] => 40672
            [2] => 40672
            [3] => 40672
        )

)

this is my script:

    $anterior = 0;
    foreach($item as $array_key => $array_value)
    {
            echo "<li>$array_key";
            echo "<ul>";
            foreach($array_value as $xarray_key => $xarray_value){
                if($xarray_value != $anterior) {
                    echo "<li>$xarray_key => $xarray_value";
                    $item_nuevo[$array_key][] = $xarray_value;    // or to use the same key number $item_nuevo[$array_key][$xarray_key] = $xarray_value;
                }
                $anterior = $xarray_value;
            }
            echo "</ul>";
    }

result:

0
    0 => 40665
    4 => 40666
    8 => 40667
    13 => 40668
    18 => 40669
    20 => 40670
    24 => 40671

1
    0 => 40672

saludos desde chile.
sashasimkin at gmail dot com 25-Apr-2012 01:26
My object unique function:

<?php
function object_unique( $obj ){
    $objArray = (array) $obj;

    $objArray = array_intersect_assoc( array_unique( $objArray ), $objArray );

    foreach( $obj as $n => $f ) {
        if( !array_key_exists( $n, $objArray ) ) unset( $obj->$n );
    }

    return $obj;
}
?>

And these code:

<?php
class Test{
    public $pr0 = 'string';
    public $pr1 = 'string1';
    public $pr2 = 'string';
    public $pr3 = 'string2';
}

$obj = new Test;

var_dump( object_unique( $obj ) );
?>

returns:
object(Test)[1]
  public 'pr0' => string 'string' (length=6)
  public 'pr1' => string 'string1' (length=7)
  public 'pr3' => string 'string2' (length=7)
gma (at) qoob (dot) gr 12-Nov-2011 10:07
Lets say that you want to capture unique values from multidimensional arrays and flatten them in 0 depth.

i.e.
<?php
$tmp = array( 'a' => array( 1,2,3,4 ), 'b' => array( 'c' => array( 4,5,6,7 ) ) );
?>

will return with array_flat( $tmp ) --> array( 1,2,3,4,5,6,7 );

I hope that the function will help someone

<?php
/**
 * @params      : $a            array           the recursion array
 *              : $s            array           storage array
 *              : $l            integer         the depth level
 *
 */
if( !function_exists( 'array_flat' ) )
{
    function array_flat( $a, $s = array( ), $l = 0 )
    {
        # check if this is an array
        if( !is_array( $a ) )                           return $s;

        # go through the array values
        foreach( $a as $k => $v )
        {
            # check if the contained values are arrays
            if( !is_array( $v ) )
            {
                # store the value
                $s[ ]       = $v;

                # move to the next node
                continue;

            }

            # increment depth level
            $l++;

            # replace the content of stored values
            $s              = array_flat( $v, $s, $l );

            # decrement depth level
            $l--;

        }

        # get only unique values
        if( $l == 0 ) $s = array_values( array_unique( $s ) );

        # return stored values
        return $s;

    } # end of function array_flat( ...

}
?>
Friendly Code 01-Aug-2011 03:48
I required a function that removed a specific duplicate entry from an array and ignoring all others so came up with this:

<?php
function specified_array_unique($array, $value)
{
    $count = 0;

    foreach($array as $array_key => $array_value)
    {
        if ( ($count > 0) && ($array_value == $value) )
        {
            unset($array[$array_key]);
        }

        if ($array_value == $value) $count++;
    }

    return array_filter($array);
}
?>
0cool.f 23-May-2011 03:54
Hope this can help...

<?php
function array_unique_key_group($array) {
    if(!is_array($array))
        return false;

    $temp = array_unique($array);
    foreach($array as $key => $val) {
        $i = array_search($val,$temp);
        if(!empty($i) && $key != $i) {
            $temp[$i.','.$key] = $temp[$i];
            unset($temp[$i]);
        }
    }
    return $temp;
}
?>

this function return an array that is unique, but preserve every key for the element...
sorry for bad english I'm italian...

$array['asd'] = 'value';
$array['lol'] = 'value';
$array['foo'] = 'val';
$array['bar'] = 'val';

var_dump(array_unique_key_group($array));
// will be output
array(2) { ["asd,lol"]=> string(5) "value" ["foo,bar"]=> string(3) "val" }
Anonymous 16-Jun-2010 05:46
It's often faster to use a foreache and array_keys than array_unique:

    <?php

    $max = 1000000;
    $arr = range(1,$max,3);
    $arr2 = range(1,$max,2);
    $arr = array_merge($arr,$arr2);

    $time = -microtime(true);
    $res1 = array_unique($arr);
    $time += microtime(true);
    echo "deduped to ".count($res1)." in ".$time;
    // deduped to 666667 in 32.300781965256

    $time = -microtime(true);
    $res2 = array();
    foreach($arr as $key=>$val) {
        $res2[$val] = true;
    }
    $res2 = array_keys($res2);
    $time += microtime(true);
    echo "<br />deduped to ".count($res2)." in ".$time;
    // deduped to 666667 in 0.84372591972351

    ?>
regeda at inbox dot ru 12-Apr-2010 08:11
recursive array unique for multiarrays

<?php
function super_unique($array)
{
  $result = array_map("unserialize", array_unique(array_map("serialize", $array)));

  foreach ($result as $key => $value)
  {
    if ( is_array($value) )
    {
      $result[$key] = super_unique($value);
    }
  }

  return $result;
}
?>
brendel at krumedia dot de 24-Feb-2010 11:47
Prior to 5.2.9 you may create a list of unique objects this way:

<?php
for (; ; ) {
  // ...
  $uniqueObjectList[spl_object_hash($myObject)] = $myObject;
}
?>
amri [ at t] dhstudio dot eu 18-Dec-2009 02:36
I searched how to show only the de-duplicate elements from array, but failed.
Here is my solution:

<?php
function arrayUniqueElements($array)
{
return array_unique(array_diff_assoc($array1,array_unique($array1)));
};
?>

Example:
<?php
$arr1 = array('foo', 'bar', 'xyzzy', '&', 'xyzzy',
'baz', 'bat', '|', 'xyzzy', 'plugh',
'xyzzy', 'foobar', '|', 'plonk', 'xyzzy',
'apples', '&', 'xyzzy', 'oranges', 'xyzzy',
'pears','foobar');

$result=arrayUniqueElements($arr1);
print_r($result);exit;
?>

Output:

Array
(
[4] => xyzzy
[12] => |
[16] => &
[21] => foobar
)
dirk dot avery a t gmail 30-Apr-2009 08:45
Although array_unique is not intended to work with multi-dimensional arrays, it does on 5.2.9.  However, it does not for 5.2.5.  Beware.
serg dot podtynnyi at gmail dot com 06-Feb-2009 11:21
//Remove duplicates from a text files and dump result in one file for example: emails list, links list etc

<?php

$data1 = file("data1.txt");
$data2 = file("data2.txt");

file_put_contents('unique.txt', implode('', array_unique(array_merge($data1,$data2))));
?>
jusvalceanu - SPAM at SPAM - yahoo dot com 06-Nov-2008 02:23
so .... my problem was multidimensional sort.

<?php
      $new = array();
      $exclude = array("");
      for ($i = 0; $i<=count($attribs)-1; $i++) {
         if (!in_array(trim($attribs[$i]["price"]) ,$exclude)) { $new[] = $attribs[$i]; $exclude[] = trim($attribs[$i]["price"]); }
      }

?>

Array $attribs is an array contaning arrays. Each array in the $attrib array consists in multiple fields (ex: name, lenght, price, etc.) to be more simpler in speech think that $attrib is the array resulted by a search sql query done by a visitator on your online shoopping website ... (so ... each array in the $attrib is a product :P) if you want to sort only the uniq results use the above or use this:

<?php

   /* Our Array of products */
   $attribs[] = array(
                           "name"         => "Test Product 1",
                           "length"     => "42 cm",
                           "weight"     => "0,5 kg",
                           "price"     => "10 $",
                           "stock"     => "100",
                        );

   $attribs[] = array(
                           "name"         => "Test Product 2",
                           "length"     => "42 cm",
                           "weight"     => "1,5 kg",
                           "price"     => "10 $",
                           "stock"     => "200",
                        );

    /* The nice stuff */

      $new = array();
      $exclude = array("");
      for ($i = 0; $i<=count($attribs)-1; $i++) {
         if (!in_array(trim($attribs[$i]["price"]) ,$exclude)) { $new[] = $attribs[$i]; $exclude[] = trim($attribs[$i]["price"]); }
      }

      print_r($new); // $new is our sorted array

?>

Have fun tweaking this ;)) i know you will ;))

From Romania With Love
quecoder at gmail 25-Aug-2008 10:30
another method to get unique values is :

<?php
$alpha=array('a','b','c','a','b','d','e','f','f');

$alpha= array_keys(array_count_values($alpha));

print_r($alpha);
?>

Output:
Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f )
Dorphalsig 28-Jul-2008 09:47
I had a problem with array_unique and multidimensional arrays ... Maybe there's a better way to do this, but this will work for any dimensional arrays.

<?php
function arrayUnique($myArray)
{
    if(!is_array($myArray))
           return $myArray;

    foreach ($myArray as &$myvalue){
        $myvalue=serialize($myvalue);
    }

    $myArray=array_unique($myArray);

    foreach ($myArray as &$myvalue){
        $myvalue=unserialize($myvalue);
    }

    return $myArray;

}
?>
PHP Expert 14-Apr-2008 05:34
Case insensitive for PHP v4.x and up.

<?php

function in_iarray($str, $a) {
    foreach ($a as $v) {
        if (strcasecmp($str, $v) == 0) {
            return true;
        }
    }
    return false;
}

function array_iunique($a) {
    $n = array();
    foreach ($a as $k => $v) {
        if (!in_iarray($v, $n)) {
            $n[$k]=$v;
        }
    }
    return $n;
}

$input = array("aAa","bBb","cCc","AaA","ccC","ccc","CCC","bBB","AAA","XXX");
$result = array_iunique($input);
print_r($result);

/*
Array
(
    [0] => aAa
    [1] => bBb
    [2] => cCc
    [9] => XXX
)
*/
?>
Ray dot Paseur at SometimesUsesGmail dot com 01-Mar-2008 07:46
I needed to identify email addresses in a data table that were replicated, so I wrote the array_not_unique() function:

<?php

function array_not_unique($raw_array) {
    $dupes = array();
    natcasesort($raw_array);
    reset ($raw_array);

    $old_key    = NULL;
    $old_value    = NULL;
    foreach ($raw_array as $key => $value) {
        if ($value === NULL) { continue; }
        if ($old_value == $value) {
            $dupes[$old_key]    = $old_value;
            $dupes[$key]        = $value;
        }
        $old_value    = $value;
        $old_key    = $key;
    }
return $dupes;
}

$raw_array     = array();
$raw_array[1]    = 'abc@xyz.com';
$raw_array[2]    = 'def@xyz.com';
$raw_array[3]    = 'ghi@xyz.com';
$raw_array[4]    = 'abc@xyz.com'; // Duplicate

$common_stuff    = array_not_unique($raw_array);
var_dump($common_stuff);
?>
mnbayazit 28-Oct-2007 02:18
Case insensitive; will keep first encountered value.

<?php

function array_iunique($array) {
    $lowered = array_map('strtolower', $array);
    return array_intersect_key($array, array_unique($lowered));
}

?>
webmaster at jukkis dot net 30-Jul-2007 04:08
Another way to 'unique column' an array, in this case an array of objects:
Keep the desired unique column values in a static array inside the callback function for array_filter.

Example:
<?php
/* example object */
class myObj {
  public $id;
  public $value;
  function __construct( $id, $value ) {
    $this->id = $id;
    $this->value = $value;
  }
}

/* callback function */
function uniquecol( $obj ) {
  static $idlist = array();

  if ( in_array( $obj->id, $idlist ) )
    return false;

  $idlist[] = $obj->id;
  return true;
}

/* a couple of arrays with second array having an element with same id as the first */
$list  = array( new myObj( 1, 1  ), new myObj( 2, 100 ) );
$list2 = array( new myObj( 1, 10 ), new myObj( 3, 100 ) );
$list3 = array_merge( $list, $list2 );

$unique = array_filter( $list3, 'uniquecol' );
print_r( $list3 );
print_r( $unique );

?>

In addition, use array_merge( $unique ) to reindex.
Ome_Henk 27-Oct-2006 12:16
For people looking at the flip flip method for getting unique values in a simple array. This is the absolute fastest method:

<?php
$unique = array_keys(array_flip($array));
?>

It's marginally faster as:
<?php
$unique = array_merge(array_flip(array_flip($array)));
?>

And it's marginally slower as:
<?php
$unique array_flip(array_flip($array)); // leaves gaps
?>

It's still about twice as fast or fast as array_unique.

This tested on several different machines with 100000 random arrays. All machines used a version of PHP5.
geuis dot teses at gmail dot com 09-Oct-2006 10:27
Here's the shortest line of code I could find/create to remove all duplicate entries from an array and then reindex the keys.

<?php

// Fruits, vegetables, and other food:
$var = array('apple','banana','carrot','cat','dog','egg','eggplant','fish');

$var = array_values(array_unique($var));
?>
keneks at gmail dot com 30-Sep-2006 07:01
Taking the advantage of array_unique, here is a simple function to check if an array has duplicate values.

It simply compares the number of elements between the original array and the array_uniqued array.

<?php

function array_has_duplicates(array $array)
{
    $uniq = array_unique($array);
    return count($uniq) != count($array);
}

?>
uditsawhney at yahoo dot com 15-Jul-2006 12:14
<?php

//Fn for array_unique column-wise for multi-dimensioanl array without losing keys | Start
function array_uniquecolumn($arr)
{
    $rows   = sizeof($arr);
    $columns = sizeof($arr[0]);

    $columnkeys = array_keys($arr[0]);

    for($i=0; $i<$columns; $i++)
    {
        for($j=0;$j<$rows;$j++)
        {
            for($k = $j+1; $k<$rows; $k++)
            {
                if($arr[$j][$columnkeys[$i]] == $arr[$k][$columnkeys[$i]])
                    $arr[$k][$columnkeys[$i]] = "";
            }
        }

    }

return ($arr);

}
//Fn for array_unique column-wise for multi-dimensioanl array without losing keys | Stop

$arrUGCourse[]= array(  "CTR" => "1",

                        "UGCOURSE"=>"ABC",

                        "TSINITIATE"=>"540",

                        "COUNT"=>"34",

                        "ENTRY_DT"=>"2006-05-01",

                        "CUMULATIVE"=> 44);

$arrUGCourse[]= array(  "CTR" => "2",

                        "UGCOURSE"=>"ABC",

                        "TSINITIATE"=>"5401",

                        "COUNT"=>"341",

                        "ENTRY_DT"=>"2006-05-11",

                        "CUMULATIVE"=> 44);

print_r(array_uniquecolumn($arrUGCourse));

?>
agarcia at rsn dot com dot co 31-Mar-2006 12:41
This is a script for multi_dimensional arrays

<?php
function remove_dup($matriz) {
    $aux_ini=array();
    $entrega=array();
    for($n=0;$n<count($matriz);$n++)
    {
        $aux_ini[]=serialize($matriz[$n]);
    }
    $mat=array_unique($aux_ini);
    for($n=0;$n<count($matriz);$n++)
    {

            $entrega[]=unserialize($mat[$n]);

    }
    return $entrega;
}
?>
mcmeijer at yahoo dot com 27-Jan-2006 05:18
This is a recursive arrayUnique function for arrays of any dimension. (tested with 4-dimensional array)
The line '$newArray=deleteEmpty($newArray);' is optional and removes empty keys and values
<?php
function arrayUnique($myArray)
    {
    $newArray = Array();
    if (is_array($myArray))
        {
        foreach($myArray as $key=>$val)
            {
            if (is_array($val))
                {
                $val2 = arrayUnique($val);
                }
            else
                {
                $val2 = $val;
                $newArray=array_unique($myArray);
                $newArray=deleteEmpty($newArray);
                break;
                }
            if (!empty($val2))
                {
                $newArray[$key] = $val2;
                }
            }
        }
    return ($newArray);
    }

function deleteEmpty($myArray)
    {
    $retArray= Array();
    foreach($myArray as $key=>$val)
        {
        if (($key<>"") && ($val<>""))
            {
            $retArray[$key] = $val;
            }
        }
    return $retArray;
    }
?>
memandeemail at gmail dot com 03-Jan-2006 10:47
Problem:
I have loaded an array with the results of a database
query.  The Fields are 'FirstName' and 'LastName'.

I would like to find a way to contactenate the two
fields, and then return only unique values for the
array.  For example, if the database query returns
three instances of a record with the FirstName John
and the LastName Smith in two distinct fields, I would
like to build a new array that would contain all the
original fields, but with John Smith in it only once.
Thanks for: Colin Campbell

Solution:

<?php
/**
 * The same thing than implode function, but return the keys so
 *
 * <code>
 * $_GET = array('id' => '4587','with' => 'key');
 * ...
 * echo shared::implode_with_key('&',$_GET,'='); // Resultado: id=4587&with=key
 * ...
 * </code>
 *
 * @param string $glue Oque colocar entre as chave => valor
 * @param array $pieces Valores
 * @param string $hifen Separar chave da array do valor
 * @return string
 * @author memandeemail at gmail dot com
 */
function implode_with_key($glue = null, $pieces, $hifen = ',') {
  $return = null;
  foreach ($pieces as $tk => $tv) $return .= $glue.$tk.$hifen.$tv;
  return substr($return,1);
}

/**
 * Return unique values from a tree of values
 *
 * @param array $array_tree
 * @return array
 * @author memandeemail at gmail dot com
 */
function array_unique_tree($array_tree) {
  $will_return = array(); $vtemp = array();
  foreach ($array_tree as $tkey => $tvalue) $vtemp[$tkey] = implode_with_key('&',$tvalue,'=');
  foreach (array_keys(array_unique($vtemp)) as $tvalue) $will_return[$tvalue] = $array_tree[$tvalue];
  return $will_return;
}

$problem = array_fill(0,3,
array('FirstName' => 'John', 'LastName' => 'Smith')
);

$problem[] = array('FirstName' => 'Davi', 'LastName' => 'S. Mesquita');
$problem[] = array('FirstName' => 'John', 'LastName' => 'Tom');

print_r($problem);

print_r(array_unique_tree($problem));
?>
csaba at alum dot mit dot edu 09-Jun-2004 07:17
The following is an efficient, adaptable implementation of array_unique which always retains the first key having a given value:

<?php
function array_unique2(&$aray) {
    $aHash = array();
    foreach ($aray as $key => &$val) if (@$aHash[$val]++) unset ($aray[$key]);
}
?>

It is also adaptable to multi dimensional arrays.  For example, if your array is a sequence of (multidimensional) points, then in place of @$aHash[$val]++ you could use @$aHash[implode("X",$val)]++
If you want to not have holes in your array, you can do an array_merge($aray) at the end.

Csaba Gabor
spunk at dasspunk dot NOSPAM dot com 14-Nov-2001 04:52
I needed a way of retaining the original array's keys in the new, unique array. I came up with this. It works for my purposes but may need refinement.

<?php
function my_array_unique($somearray)
{
    asort($somearray);
    reset($somearray);
    $currentarrayvar = current($somearray);
    foreach ($somearray as $key=>$var)
    {
        if (next($somearray) != $currentarrayvar)
        {
            $uniquearray[$key] = $currentarrayvar;
            $currentarrayvar = current($somearray);
        }
    }
    reset($uniquearray);
    return $uniquearray;
}
?>


Empile un ou plusieurs éléments au début d'un tableau

  • « array_unique
  • array_values »
  • PHP Manual
  • Fonctions sur les tableaux
  • Empile un ou plusieurs éléments au début d'un tableau

array_unshift

(PHP 4, PHP 5, PHP 7, PHP 8)

array_unshift — Empile un ou plusieurs éléments au début d'un tableau

Description

array_unshift ( array &$array , mixed ...$values ) : int

array_unshift() ajoute les éléments value1, ..., passés en argument au début du tableau array. Notez que les éléments sont ajoutés comme un tout, et qu'ils restent dans le même ordre. Toutes les clés numériques seront modifiées afin de commencer à partir de zéro, tandis que les clés littérales ne seront pas touchées.

Liste de paramètres

array

Le tableau d'entrée.

values

Valeur à empiler.

Valeurs de retour

Retourne le nouveau nombre d'éléments du tableau array.

Historique

Version | Description
7.3.0 | Cette fonction peut désormais être appelée avec un seul paramètre. Auparavant, au moins deux paramètres étaient requis.

Exemples

Exemple #1 Exemple avec array_unshift()

<?php
$queue = array("orange", "banana");
array_unshift($queue, "apple", "raspberry");
print_r($queue);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => apple
    [1] => raspberry
    [2] => orange
    [3] => banana
)

Voir aussi

  • array_shift() - Dépile un élément au début d'un tableau
  • array_push() - Empile un ou plusieurs éléments à la fin d'un tableau
  • array_pop() - Dépile un élément de la fin d'un tableau

User Contributed Notes

Richard Akindele 16-Mar-2016 06:31
Another way to tack something to the beginning of an array is with array_merge().

$plans = array('AARP'=>'Senior', 'AAA'=>'Automobile Club');

$plans = array_merge(array("BAR"=>"Best Available Rate"),  $plans);
daniel at smallboxcms dot com 17-Apr-2015 08:18
Anonymous' associative version wasn't working for me, but it did with this small tweak:

function array_unshift_assoc(&$arr, $key, $val)
{
    $arr = array_reverse($arr, true);
    $arr[$key] = $val;
    $arr = array_reverse($arr, true);
    return $arr;
}
Anonymous 19-Nov-2011 09:44
Sahn's example almost works but has a small error. Try it like this if you need to prepend something to the array without the keys being reindexed and/or need to prepend a key value pair, you can use this short function:

<?php
function array_unshift_assoc(&$arr, $key, $val)
{
    $arr = array_reverse($arr, true);
    $arr[$key] = $val;
    return = array_reverse($arr, true);
}
?>
sergei at gmx dot net 03-Oct-2007 08:49
You can preserve keys and unshift an array with numerical indexes in a really simple way if you'll do the following:

<?php
$someArray=array(224=>'someword1', 228=>'someword2', 102=>'someword3', 544=>'someword3',95=>'someword4');

$someArray=array(100=>'Test Element 1 ',255=>'Test Element 2')+$someArray;
?>

now the array looks as follows:

array(
100=>'Test Element 1 ',
255=>'Test Element 2'
224=>'someword1',
228=>'someword2',
102=>'someword3',
544=>'someword3',
95=>'someword4'
);
amschroeder at gmail dot com 26-Mar-2007 09:13
This becomes a nice little problem if you index your arrays out of order (while manually sorting).  For example:

<?php
$recordMonths[3] = '8/%/2006';
$recordMonths[4] = '7/%/2004';
$recordMonths[0] = '3/%/2007';
$recordMonths[1] = '2/%/2007';
$recordMonths[5] = '12/%/2000';
$recordMonths[6] = '11/%/2000';
$recordMonths[7] = '10/%/2000';
$recordMonths[2] = '1/%/2007';

for($i = 0; $i < count($recordMonths); $i++)
{
    $singleMonth = $recordMonths[$i];
    echo "singleMonth: $singleMonth <br />";
}
array_unshift($recordMonths,'%');
for($i = 0; $i < count($recordMonths); $i++)
{
    $singleMonth = $recordMonths[$i];
    echo "singleMonth: $singleMonth <br />";
}
?>

Produces:

singleMonth: 3/%/2007
singleMonth: 2/%/2007
singleMonth: 1/%/2007
singleMonth: 8/%/2006
singleMonth: 7/%/2004
singleMonth: 12/%/2000
singleMonth: 11/%/2000
singleMonth: 10/%/2000
singleMonth: %
singleMonth: 8/%/2006
singleMonth: 7/%/2004
singleMonth: 3/%/2007
singleMonth: 2/%/2007
singleMonth: 12/%/2000
singleMonth: 11/%/2000
singleMonth: 10/%/2000
singleMonth: 1/%/2007

It reindexes them based on the order they were created.  It seems like if an array has all numeric indexes, then it should reindex them based on the order of their index.  Just my opinion...
John Brooking 02-Jun-2006 06:54
I had a need tonight to convert a numeric array from 1-based to 0-based, and found that the following worked just fine due to the "side effect" of renumbering:

<?php
   array_unshift( $myArray, array_shift( $myArray ));
?>
php at electricsurfer dot com 26-Feb-2004 06:20
even simpler unshifting of a reference !
<?php
/**
 * @return int
 * @param $array array
 * @param $value mixed
 * @desc Prepend a reference to an element to the beginning of an array. Renumbers numeric keys, so $value is always inserted to $array[0]
 */
function array_unshift_ref(&$array, &$value)
{
   $return = array_unshift($array,'');
   $array[0] =& $value;
   return $return;
}
?>
lagroue 09-Nov-2003 04:46
Last version of PHP deprecated unshifting of a reference.
You can use this function instead :

<?php
function array_unshift1 (& $ioArray, $iValueWrappedInAnArray) {
    $lNewArray = false;
    foreach (array_keys ($ioArray) as $lKey)
        $lNewArray[$lKey+1] = & $ioArray[$lKey];
    $ioArray = array (& $iValueWrappedInAnArray[0]);
    if ($lNewArray)
        foreach (array_keys ($lNewArray) as $lKey)
             $ioArray[] = & $lNewArray[$lKey];
    return count($ioArray);
}

// before last PHP (now generates a deprecation warning)
array_unshift ($a, &$v);
// since last PHP (caution, there is a wrapping array !!)
array_unshift1 ($a, array (&$v));
?>
chris dot NoThxSpam dot given at hp dot com 23-Jul-2003 12:17
If you need to change the name of a key without changing its position in the array this function may be useful.

<?php
function array_key_change($Old, $New, $In, $NewVal=NULL) {
        $Temp = array();
        while(isset($Temp[$Old]) == false) {
                list($k, $v) = each($In);
                $Temp[$k] = $v;
                unset($In[$k]);
        }
        if($NewVal == NULL) {
                $NewVal = $Temp[$Old];
        }
        unset($Temp[$Old]);
        $Temp = array_reverse($Temp);
        $In = array_merge(array($New=>$NewVal), $In);
        while(list($k,$v) = each($Temp)) {
                $In = array_merge(array($k=>$v), $In);
        }
        return($In);
}
?>
rsmith_NOSPAM_ at _NOSPAM_unitec dot ac dot nz 30-Jul-2002 07:00
array_merge() will also reindex (see array_merge() manual entry), but the '+' operator won't, so...

<?php
$arrayone=array("newkey"=>"newvalue") + $arrayone;
?>

does the job.
robert dot wills at fuzzbrain dot uklinux dot net 07-Feb-2002 06:02
Actually this problem with the keys getting reindexed only happens when the keys are numerical:

<?php

$a = array("f"=>"five", "s" =>"six", "t" =>
        "twenty");

print_r($a);
echo "\n";
foreach($a as $key=>$val)
{
    echo "k: $key v: $val \n";
}

array_unshift($a, "zero");
print_r($a);
echo "\n";
foreach($a as $key=>$val)
{
    echo "k: $key v: $val \n";
}
?>

Array
(
    [f] => five
    [s] => six
    [t] => twenty
)

k: f v: five
k: s v: six
k: t v: twenty
Array
(
    [0] => zero
    [f] => five
    [s] => six
    [t] => twenty
)

k: 0 v: zero
k: f v: five
k: s v: six
k: t v: twenty
sahn at hmc dot edu 27-Jul-2001 12:21
If you need to prepend something to the array without the keys being reindexed and/or need to prepend a key value pair, you can use this short function:

<?php
function array_unshift_assoc(&$arr, $key, $val)
{
    $arr = array_reverse($arr, true);
    $arr[$key] = $val;
    $arr = array_reverse($arr, true);
    return count($arr);
}
?>


Retourne toutes les valeurs d'un tableau

  • « array_unshift
  • array_walk_recursive »
  • PHP Manual
  • Fonctions sur les tableaux
  • Retourne toutes les valeurs d'un tableau

array_values

(PHP 4, PHP 5, PHP 7, PHP 8)

array_values — Retourne toutes les valeurs d'un tableau

Description

array_values ( array $array ) : array

array_values() retourne les valeurs du tableau array et l'indexe de façon numérique.

Liste de paramètres

array

Le tableau.

Valeurs de retour

Retourne un tableau de valeurs indexé.

Exemples

Exemple #1 Exemple avec array_values()

<?php
$array = array("size" => "XL", "color" => "gold");
print_r(array_values($array));
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => XL
    [1] => gold
)

Voir aussi

  • array_keys() - Retourne toutes les clés ou un ensemble des clés d'un tableau
  • array_combine() - Crée un tableau à partir de deux autres tableaux

User Contributed Notes

biziclop at vipmail dot hu 01-May-2014 11:47
Remember, array_values() will ignore your beautiful numeric indexes, it will renumber them according tho the 'foreach' ordering:

<?php
$a = array(
 3 => 11,
 1 => 22,
 2 => 33,
);
$a[0] = 44;

print_r( array_values( $a ));
==>
Array(
  [0] => 11
  [1] => 22
  [2] => 33
  [3] => 44
)
?>
heber dot gentilin at gmail dot com 21-Aug-2013 06:43
/**
* Return the new array from the offset index
*/
function array_values_from($array, $offset_index = 0) {
    if (!is_array($array))
        return null;
    $index = (int)$offset_index;
    foreach($array as $i => $value)
        $array_return[$index++] = $value;
    return $array_return;
}
Certainist 22-Apr-2013 03:51
Non-recursive simplest array_flatten.

<?php

function array_flatten($arr) {
    $arr = array_values($arr);
    while (list($k,$v)=each($arr)) {
        if (is_array($v)) {
            array_splice($arr,$k,1,$v);
            next($arr);
        }
    }
    return $arr;
}

?>
info at djdb dot be 29-Jan-2013 12:45
<?php
$array = array("size" => "XL", "color" => "gold","x" => " ","y" => "gold","z" => "");
print_r(array_values($array));
?>
wil result:
Array ( [0] => XL [1] => gold [2] => [3] => gold [4] => )
kapilgopinath at gmail dot com 09-Mar-2012 06:57
extract all values from a multi dimesnsional array or a nexted json object
function array_keys_multi($array,&$vals)
{
    foreach ($array as $key => $value) {

        if (is_array($value)) {

            array_keys_multi($value,$vals);

        }else{

            $vals[] = $value;
        }
    }

    return $vals;
}
a dot ross at amdev dot eu 30-May-2011 12:21
<?php
/**
 * Flattens an array, or returns FALSE on fail.
 */
function array_flatten($array) {
  if (!is_array($array)) {
    return FALSE;
  }
  $result = array();
  foreach ($array as $key => $value) {
    if (is_array($value)) {
      $result = array_merge($result, array_flatten($value));
    }
    else {
      $result[$key] = $value;
    }
  }
  return $result;
}
?>
abimaelrc 10-May-2011 05:39
This is another way to get value from a multidimensional array, but for versions of php >= 5.3.x
<?php
/**
 * Get all values from specific key in a multidimensional array
 *
 * @param $key string
 * @param $arr array
 * @return null|string|array
 */
function array_value_recursive($key, array $arr){
    $val = array();
    array_walk_recursive($arr, function($v, $k) use($key, &$val){
        if($k == $key) array_push($val, $v);
    });
    return count($val) > 1 ? $val : array_pop($val);
}

$arr = array(
    'foo' => 'foo',
    'bar' => array(
        'baz' => 'baz',
        'candy' => 'candy',
        'vegetable' => array(
            'carrot' => 'carrot',
        )
    ),
    'vegetable' => array(
        'carrot' => 'carrot2',
    ),
    'fruits' => 'fruits',
);

var_dump(array_value_recursive('carrot', $arr)); // array(2) { [0]=> string(6) "carrot" [1]=> string(7) "carrot2" }
var_dump(array_value_recursive('apple', $arr)); // null
var_dump(array_value_recursive('baz', $arr)); // string(3) "baz"
var_dump(array_value_recursive('candy', $arr)); // string(5) "candy"
var_dump(array_value_recursive('pear', $arr)); // null
?>
aowie1 at gmail dot com 19-Jan-2011 12:23
I needed a function that recursively went into each level of the array to order (only the indexed) arrays... and NOT flatten the whole thing.

Solution:
<?php
function array_values_recursive($arr){
        $arr = array_values($arr);
        foreach($arr as $key => $val)
            if(array_values($val) === $val)
                $arr[$key] = array_values_recursive($val);

        return $arr;
}
?>
geo dot artemenko at gmail dot com 04-May-2010 12:37
same array_flatten function, compressed and preserving keys.

function array_flatten($a,$f=array()){
  if(!$a||!is_array($a))return '';
  foreach($a as $k=>$v){
    if(is_array($v))$f=array_flatten($v,$f);
    else $f[$k]=$v;
  }
  return $f;
}
Carsten Milkau 01-Nov-2009 04:46
Note that in a multidimensional array, each element may be identified by a _sequence_ of keys, i.e. the keys that lead towards that element. Thus "preserving keys" may have different interpretations. Ivan's function for example creates a two-dimensional array preserving the last two keys. Other functions below create a one-dimensional array preserving the last key. For completeness, I will add a function that merges the key sequence by a given separator and a function that preserves the last n keys, where n is arbitrary.

<?php
/*
 * Flattening a multi-dimensional array into a
 * single-dimensional one. The resulting keys are a
 * string-separated list of the original keys:
 *
 * a[x][y][z] becomes a[implode(sep, array(x,y,z))]
 */

function array_flatten_sep($sep, $array) {
  $result = array();
  $stack = array();
  array_push($stack, array("", $array));

  while (count($stack) > 0) {
    list($prefix, $array) = array_pop($stack);

    foreach ($array as $key => $value) {
      $new_key = $prefix . strval($key);

      if (is_array($value))
        array_push($stack, array($new_key . $sep, $value));
      else
        $result[$new_key] = $value
    }
  }

  return $result;
}

/*
 * Flattening a multi-dimensional array into an
 * n-dimensional one. The last n keys of each element are
 * preserved. If this results in ambiguities, results are
 * undefined.
 *
 * a[x_1][x_2]...[x_m]  becomes  a[x_{m-n+1}]...[x_m]
 */
function array_flatten_n($array, $n) {
  $result = array();
  $stack = array();
  array_push($stack, array(array(), $array));

  while (count($stack) > 0) {
    list($prefix, $array) = array_pop($stack);

    foreach ($array as $key => $value) {
      if (is_array($value)) {
        $new_prefix = array_values($prefix);
        array_push($new_prefix, $key);
        if (count($new_prefix) >= n)
          array_shift($new_prefix);

        array_push($stack, array($new_prefix, $value));
      } else {
        $array = $result;
        foreach ($prefix as $pkey) {
           if (!is_array($array[$pkey]))
             $array[$pkey] = array();
           $array = $array[$pkey];
        }
        $array[$key] = $value;
      }
    }
  }

  return $result;
}
?>
karl dot rixon at gmail dot com 18-Sep-2009 02:57
A modification of wellandpower at hotmail.com's function to perform array_values recursively. This version will only re-index numeric keys, leaving associative array indexes alone.

<?php

function array_values_recursive($array) {
    $temp = array();
    foreach ($array as $key => $value) {
        if (is_numeric($key)) {
            $temp[] = is_array($value) ? array_values_recursive($value) : $value;
        } else {
            $temp[$key] = is_array($value) ? array_values_recursive($value) : $value;
        }
    }
    return $temp;
}

?>
chrysb at gmail dot com 24-Sep-2008 12:34
If you are looking for a way to count the total number of times a specific value appears in array, use this function:

<?php
function array_value_count ($match, $array)
{
    $count = 0;

    foreach ($array as $key => $value)
    {
        if ($value == $match)
        {
            $count++;
        }
    }

    return $count;
}
?>

This should really be a native function of PHP.
madhamster 12-Jun-2008 04:18
Good function, if you want to acces associative array element by position:

<?php

$array = array('fruit'=>'apple', 'juice'=>'orange', 'color'=>'lime');

$array = array_values($array);

echo $array[2];

?>
rene dot zak at post dot cz 24-Apr-2008 01:05
<?php
$array = array(
    'fruit1' => 'apple',
    'fruit2' => 'orange',
    'fruit3' => ' ',
    'fruit4' => ' ',
    'fruit5' => 'apple');

    for ($i = 0; $i <  count($array); $i++) {
    $key=key($array);
    $val=$array[$key];
    if ($val<> ' ') {
       echo $key ." = ".  $val ." <br> ";
       }
     next($array);
    }

/*
fruit1 = apple
fruit2 = orange
fruit5 = apple
*/
?>
bluej100 at gmail dot com 07-Sep-2007 10:10
Most of the array_flatten functions don't allow preservation of keys. Mine allows preserve, don't preserve, and preserve only strings (default).

<?
// recursively reduces deep arrays to single-dimensional arrays
// $preserve_keys: (0=>never, 1=>strings, 2=>always)
function array_flatten($array, $preserve_keys = 1, &$newArray = Array()) {
  foreach ($array as $key => $child) {
    if (is_array($child)) {
      $newArray =& array_flatten($child, $preserve_keys, $newArray);
    } elseif ($preserve_keys + is_string($key) > 1) {
      $newArray[$key] = $child;
    } else {
      $newArray[] = $child;
    }
  }
  return $newArray;
}

// Tests

$array = Array(
  'A' => Array(
    1 => 'foo',
    2 => Array(
      'a' => 'bar'
    )
  ),
  'B' => 'baz'
);

echo 'var_dump($array);'."\n";
var_dump($array);
echo 'var_dump(array_flatten($array, 0));'."\n";
var_dump(array_flatten($array, 0));
echo 'var_dump(array_flatten($array, 1));'."\n";
var_dump(array_flatten($array, 1));
echo 'var_dump(array_flatten($array, 2));'."\n";
var_dump(array_flatten($array, 2));
?>
deceze at gmail dot YesThatsGoogleMail dot com 03-Sep-2007 12:31
Please note that 'wellandpower at hotmail.com's recursive merge doesn't work. Here's the fixed version:

<?php

function array_values_recursive($array) {
   $flat = array();

   foreach ($array as $value) {
           if (is_array($value)) $flat = array_merge($flat, array_values_recursive($value));
           else $flat[] = $value;
   }
   return $flat;
}

?>
warmo_at_o2_dot_pl 21-Mar-2007 10:42
@Yassin Ezbakhe <yassin88 at gmail dot com>
When we have to flatten multidimensional array of strings or numbers this method could be much faster.
Inconvenience of this method is, that its speed depends on size of strings/numbers, which array contains - bigger strings, lower efficiency.
Conclusion: Use this method for small amount of data in arrays (less than 500B per element in my case) which have many dimensions, in other case, use Yassin Ezbakhe method.

<?php

function md_implode($array, $glue = '')
{
    if (is_array ($array))
    {
        $output = '';
        foreach ($array as $v)
        {
            $output .= md_implode($v, $glue);
        }
        return $output;
    }
    else
    {
        return $array.$glue;
    }
}

function md_array_flatten($md_array)
{
    $flat_array = explode ('#|#',md_implode($md_array,'#|#')); // "#|#" is a sample delimiter
    array_pop($flat_array); // to remove last empty element
    return $flat_array;
}

//Usage:
$flat_array = md_array_flatten($some_md_array)

?>
ahigerd at stratitec dot com 24-Jan-2007 06:07
A comment on array_merge mentioned that array_splice is faster than array_merge for inserting values. This may be the case, but if your goal is instead to reindex a numeric array, array_values() is the function of choice. Performing the following functions in a 100,000-iteration loop gave me the following times: ($b is a 3-element array)

array_splice($b, count($b)) => 0.410652
$b = array_splice($b, 0) => 0.272513
array_splice($b, 3) => 0.26529
$b = array_merge($b) => 0.233582
$b = array_values($b) => 0.151298
wellandpower at hotmail.com 29-Aug-2006 05:56
The function here flatterns an entire array and was not the behaviour I expected from a function of this name.

I expected the function to flattern every sub array so that all the values were aligned and it would return an array with the same dimensions as the imput array, but as per array_values() adjusting the keys rater than removing them.

In order to do this, you will want this function:

function array_values_recursive($array) {
   $temp = array();

   foreach ($array as $value) {
           if(is_array($value)) { $temp[] = array_values_recursive($value); }
           else { $temp[] = $value; }
   }
   return $temp;
}

Hopefully this will assist.
wizglins at gmx dot ch 13-Apr-2006 12:21
In case you want to replace all keys in multiarrays by integers starting at 0, the following function might help.

<?php

function numerieren($array)
{
$array_v = array_values($array);
$count_v = count($array_v);

for ($i=0; $i<$count_v; $i++)
  if (is_array($array_v[$i]))
    $array_v[$i] = numerieren($array_v[$i]);
return $array_v;
}

?>
Yassin Ezbakhe <yassin88 at gmail dot com> 31-Aug-2005 04:28
<?php
/**********************************************
 *
 *   PURPOSE: Flatten a deep multidimensional array into a list of its
 *   scalar values
 *
 *   array array_values_recursive (array array)
 *
 *   WARNING: Array keys will be lost
 *
 *********************************************/

function array_values_recursive($array)
{
    $arrayValues = array();

    foreach ($array as $value)
    {
        if (is_scalar($value) OR is_resource($value))
        {
             $arrayValues[] = $value;
        }
        elseif (is_array($value))
        {
             $arrayValues = array_merge($arrayValues, array_values_recursive($value));
        }
    }

    return $arrayValues;
}
?>

This function is an improved and faster version of the one posted by <27-Apr-2004 09:47>
27-Apr-2004 06:47
<?php
/**
   flatten an arbitrarily deep multidimensional array
   into a list of its scalar values
   (may be inefficient for large structures)
   (will infinite recurse on self-referential structures)
   (could be extended to handle objects)
*/
function array_values_recursive($ary)
{
   $lst = array();
   foreach( array_keys($ary) as $k ){
      $v = $ary[$k];
      if (is_scalar($v)) {
         $lst[] = $v;
      } elseif (is_array($v)) {
         $lst = array_merge( $lst,
            array_values_recursive($v)
         );
      }
   }
   return $lst;
}
?>

code till dawn!  -mark meves!
nopy at users dot sourceforge dot net 24-Oct-2003 03:36
Just a warning that re-indexing an array by array_values() may cause you to reach the memory limit unexpectly.

For example, if your PHP momory_limits is 8MB,
 and says there's a BIG array $bigArray which allocate 5MB of memory.

Doing this will cause PHP exceeds the momory limits:

<?php
  $bigArray = array_values( $bigArray );
?>

It's because array_values() does not re-index $bigArray directly,
it just re-index it into another array, and assign to itself later.
mailseppel at gmx dot de 04-Oct-2002 04:10
Remember, that the following way of fetching data from a mySql-Table will do exactly the thing as carl described before: An array, which data may be accessed both by numerical and DB-ID-based Indexes:

<?php
$row = mysql_fetch_array($db_result, $db_link);
?>

Hope I haven't misunderstood anything here.. :)
carl at thep.lu.se 29-Jan-2002 03:59
Indeed you can, and that's what's so great about it. I have, for instance, a function that returns the results of a database query as an array. I want to keep the order that the entries were returned in, but at the same time I want to be able to access them _either_ by the position _or_ by some other index (such as some sort of ID in the database, gotten from elsewhere). In this case, I can make the function return an array from id to [array of values], and by a simple call to array_values() this is transformed into an array indexed from 0 to count()-1. Useful.


Applique une fonction de rappel récursivement à chaque membre d'un tableau

  • « array_values
  • array_walk »
  • PHP Manual
  • Fonctions sur les tableaux
  • Applique une fonction de rappel récursivement à chaque membre d'un tableau

array_walk_recursive

(PHP 5, PHP 7, PHP 8)

array_walk_recursive — Applique une fonction de rappel récursivement à chaque membre d'un tableau

Description

array_walk_recursive ( array|object &$array , callable $callback , mixed $userdata = null ) : bool

Applique la fonction utilisateur callback à chaque élément du tableau array. Cette fonction se reproduira dans toutes les profondeurs du tableau.

Liste de paramètres

array

Le tableau d'entrée.

callback

Typiquement, callback prend 2 paramètres. Le paramètre array, représentant la valeur, est le premier, l'index/clé, le deuxième.

Note:

Si callback doit être exécuté avec les valeurs actuelles du tableau, spécifiez le premier paramètre de callback par référence. Alors, tout changement effectué sur les éléments de ce tableau sera également effectué sur le tableau original.

userdata

Si le paramètre optionnel userdata est fourni, il sera passé comme troisième paramètre à la fonction de rappel callback.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec array_walk_recursive()

<?php
$sweet = array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');

function test_print($item, $key)
{
    echo "La clé $key contient l'élément $item\n";
}

array_walk_recursive($fruits, 'test_print');
?>

L'exemple ci-dessus va afficher :

La clé a contient l'élément apple
La clé b contient l'élément banana
La clé sour contient l'élément lemon

Vous aurez noté que la clé 'sweet' n'est jamais affichée. Toute clé qui est associée à un tableau n'est pas passée à la fonction de rappel.

Voir aussi

  • array_walk() - Exécute une fonction fournie par l'utilisateur sur chacun des éléments d'un tableau

User Contributed Notes

lincoln dot du dot j at gmail dot com 21-Jul-2020 02:24
Normal function solution

//1,2,2,3,6,7,3,1,4,2
$arr=[
    [1,2],
    [2,3],
    6,7,[3,1,[4,2]]
];

function a($array){
    static $res=[];
    foreach($array as $val){
        if(is_array($val)){
            a($val);
        }else{
            $res[]=$val;
        }
    }
    return $res;
}

print_r(a($arr));
mike at mpsharp dot com 13-Jul-2019 04:32
Here's a more general solution to modifying the array to which the leaf belongs.   You can unset the current key, or add siblings, etc.

<?php
/**
 * Modified version of array_walk_recursive that passes in the array to the callback
 * The callback can modify the array or value by specifying a reference for the parameter.
 *
 * @param array The input array.
 * @param callable $callback($value, $key, $array)
 */
function array_walk_recursive_array(array &$array, callable $callback) {
    foreach ($array as $k => &$v) {
        if (is_array($v)) {
            array_walk_recursive_array($v, $callback);
        } else {
            $callback($v, $k, $array);
        }
    }
}
?>
Dario 01-Oct-2018 06:42
I was looking for how to change values of array since you can't pass array by reference anymore in new PHP versions, here is simple solution

<?php
array_walk_recursive(
    $myArray,
    function (&$value) {
        if (/*some condition*/) {
            $value = 'New value';
        }
    }
);
?>

After that $myArray will be altered with new value.
r 08-Apr-2018 02:54
How to modify external variable from inside recursive function using userdata argument.

<?php
$arr = [
   'one' => ['one_one' => 11, 'one_two' => 12],
   'two' => 2
];

$counter = 0;

//Does not persist
array_walk_recursive( $arr, function($value, $key, $counter) {
   $counter++;
   echo "$value : $counter";
}, $counter);
echo "counter : $counter";

// result
// 11 : 1
// 12 : 1
// 2 : 1
// counter: 0

//Persists only in same array node
array_walk_recursive( $arr, function($value, $key, &$counter) {
   $counter++;
   echo "$value : $counter";
}, $counter);

// result
// 11 : 1
// 12 : 2
// 2 : 1
// counter : 0

//Fully persistent. Using 'use' keyword
array_walk_recursive( $arr, function($value, $key) use (&$counter) {
   $counter++;
   echo "$value : $counter";
}, $counter);
echo "counter : $counter";

// result
// 11 : 1
// 12 : 2
// 2 : 3
// counter : 3
seductiveapps.com 14-Mar-2018 05:45
usage :
$nd = $newsApp2->dataSources();
//walkArray ($nd, 'walkArray_printKey', 'walkArray_printValue');
// prints the entire array

$x = chaseToPath ($nd, 'RSS_list/English News',false);
walkArray ($x, 'walkArray_printKey', 'walkArray_printValue');
// prints everything under $nd['RSS_list']['English News']

function &chaseToPath (&$wm, $path, $create=false) {
    //var_dump ($create); die();
    //echo '$wm=<pre>'; var_dump ($wm);echo '</pre>'; //die();
    //$path = str_replace ('/', '/d/', $path);
    //$path .= '/d';
    $nodes = explode ('/', $path);
    $chase = &chase ($wm, $nodes, $create);

    //echo '$wm=<pre>'; var_dump ($wm);echo '</pre>'; die();
    /*
    $dbg = array (
        '$path' => $path,
        '$nodes' => $nodes,
        '$wm' => $wm,
        '$chase' => $chase
    );
    echo '$dbg=<pre style="background:red;color:yellow;">'; var_dump ($dbg); echo '</pre>';
    */
    //die();

    $false = false;
    if (good($chase)) {
        $arr = &result($chase);
        return $arr;
    } else return $false;
}

function &chase (&$arr, $indexes, $create=false) {
        if (false) {
        echo 'sitewide/functions.php --- $arr=<pre>'; var_dump ($arr); echo '</pre>';
        echo 'sitewide/functions.php --- $indexes=<pre>'; var_dump ($indexes); echo '</pre>';
        echo 'sitewide/functions.php --- $create=<pre>'; var_dump ($create); echo '</pre>';
        }
    $r = &$arr;
    foreach ($indexes as $idx) {
            //echo 'sitewide/functions.php --- $idx=<pre>'; var_dump ($idx); var_dump (array_key_exists($idx,$r)); var_dump ($r); echo '</pre>';
            if (
                    is_array($r)
                    && (
                            $create===true
                            || array_key_exists($idx,$r)
                    )
            ) {
                    if ($create===true && !array_key_exists($idx,$r)) $r[$idx]=array();
                    //echo 'sitewide/functions.php --- $idx=<pre>'; var_dump ($idx); echo '</pre>';
                    $r = &$r[$idx];
            } else {
                    $err = array(
                    'msg' => 'Could not walk the full tree',
                    'vars' => array(
                            '$idx--error'=>$idx,
                            '$indexes'=>$indexes,
                            '$arr'=>$arr
                            )
                    );
                    badResult (E_USER_NOTICE, $err);
                    $ret = false; // BUG #2 squashed
                    return $ret;
            }
    }

        //echo 'sitewide/functions.php --- $r=<pre>'; var_dump ($r); echo '</pre>';
    return goodResult($r);
}
seductiveapps.com 14-Mar-2018 05:10
function walkArray (&$a, $keyCallback, $valueCallback, $k='', $level=0, $path='') {
// usage : walkArray ($someRecursiveArray, 'walkArray_printKey', 'walkArray_printValue');
// can handle recursive arrays. a nested array is a recursive array.
// is faster, especially on large arrays, than RecuriveArrayIterator, see speed testing comment at http://php.net/manual/en/class.recursiveiteratoriterator.php
// provides detailed information to callbacks on where in the data we are, something that array_walk_recursive just doesnt do.
// passes data around as pointers, not copies of data.
    if (
        !function_exists($keyCallback)
        && !function_exists($valueCallback)
    ) {
        return badResult (E_USER_ERROR, array (
            'msg' => 'walkArray() was called without $keyCallback or $valueCallback as existing function names. see also : call_user_func() in PHP manual.'
        );
    }

    if (!is_array($a)) {
        return badResult (E_USER_ERROR, array (
            'msg' => 'walkArray() was called but $a parameter passed is not an array.'
        ));
    } else {
        foreach ($a as $k=>&$v) {
            $cd = array ( // callback data
                'type' => 'key',
                'path' => $path,
                'level' => $level,
                'k' => &$k,
                'v' => &$v
            );
            if (!is_null($keyCallback)) call_user_func ($keyCallback, $cd);
            if (is_array ($v)) {
                walkArray ($a[$k], $keyCallback, $valueCallback, $k, $level+1, $path.'/'.$k);
            } else {
                $cd['type'] = 'value';
                if (!is_null($valueCallback)) call_user_func ($valueCallback, $cd);
            }
        }
    }
    return true;
}

function walkArray_printKey ($cd) {
    echo '<div style="background:blue;color:yellow;border-radius:5px;padding:2px;margin-top:5px;">'.PHP_EOL;
    $indent = 20 * $cd['level'];
    echo '<div style="padding-left:'.$indent.'px">'.PHP_EOL;
    echo 'key : '.$cd['k'].'<br/>'.PHP_EOL;
    echo 'path : '.$cd['path'].'<br/>'.PHP_EOL;
    echo '</div>'.PHP_EOL;
    echo '</div>'.PHP_EOL;
}

function walkArray_printValue ($cd) {
    echo '<pre style="background:green;color:white;border-radius:5px;padding:2px;margin-top:2px;">'.PHP_EOL;
    $indent = 20 * $cd['level'];
    echo '<div style="padding-left:'.$indent.'px">'.PHP_EOL;
    echo 'key : '.$cd['k'].'<br/>'.PHP_EOL;
    echo 'path : '.$cd['path'].'<br/>'.PHP_EOL;
    echo 'value : '.$cd['v'].'<br/>'.PHP_EOL;
    echo '</div>'.PHP_EOL;
    echo '</pre>'.PHP_EOL;
}

// the only thing you have to change in this code is the badResult() function, but you could raise an exception or return false
CommentUser 07-Jul-2017 01:55
The following code, which returns back a flattened array of sorts into the $results array, in newer versions of PHP raises the error "PHP Fatal error:  Call-time pass-by-reference has been removed":

<?php

$results = array();

function example_function ($item, $key, &$arr_values)
{
    $arr_values[$key] = $item;
}

array_walk_recursive($data, 'example_function', &$results);

print_r($results);

?>

This can be fixed using an anonymous function:

<?php

$results = array();

array_walk_recursive($data, function ($item, $key) use (&$results){$results[$key] = $item;});

print_r($results);

?>
lincoln dot du dot j at gmail dot com 03-Jul-2017 06:40
multidimensional array to single array

$array=[1=>[2,5=>[4,2],[7,8=>[3,6]],5],4];
$arr=[];
array_walk_recursive($array, function($k){global $arr; $arr[]=$k;});
print_r($arr);

Output

Array ( [0] => 2 [1] => 4 [2] => 2 [3] => 7 [4] => 3 [5] => 6 [6] => 5 [7] => 4 )
Anonymous 03-Jul-2017 06:39
multidimensional array to single array

$array=[1=>[2,5=>[4,2],[7,8=>[3,6]],5],4];
$arr=[];
array_walk_recursive($array, function($k){global $arr; $arr[]=$k;});
print_r($arr);

Output

Array ( [0] => 2 [1] => 4 [2] => 2 [3] => 7 [4] => 3 [5] => 6 [6] => 5 [7] => 4 )
webdiecinove at gmail dot com 04-Jan-2017 04:34
If you want print a multidimensional array, you could try this (the array I use is just an example).
Then, I use array_walk_recursive with a function that checks the type of items:

$arraytest=array();
$arraytest["firstlev1"] = "First level";
$arraytest["firstlev2"] = array(
                0 => array(
                    "secondlev11"=>"Title1",
                    "secondlev12"=>"Subtitle1",
                    "secondlev13" => array(
                        0 => array("othertitle"=>"other title", "othersubtitle"=>"other sub title"),
                        1 => array("info"=>"Informations", "otherinfo"=>"Other info")
                    )
                ),
                1 => array(
                        "secondlev21"=>"Title2",
                        "secondlev22"=>"Subtitle2"
                )
);

function testitems($theitem,$thekey){

    if(is_array($theitem)){
        foreach($theitem as $thekey=> $theitem2){
            echo "<br>the key: $thekey..........the item: $theitem2";
        }
    }
    else{
            echo "<br>the value:  $theitem";

    }

}

array_walk_recursive($arraytest, 'testitems');
KH 01-Nov-2016 05:43
Example for the use of $userdata:

$userdata is the third parameter of the callback function.
The first parameter is $item, the second is $key, and the third one is $userdata.

<?php
$sweet = array('a' => 'Apfel', 'b' => 'Banane');
$fruits = array('süß' => $sweet, 'sauer' => 'Zitrone');

function test_print($item, $key, $info)
{
    echo "$key beinhaltet $item $info\n";
}

array_walk_recursive($fruits, 'test_print', '  ... Bio');
?>

generates

a beinhaltet Apfel ... Bio
b beinhaltet Banane ... Bio
sauer beinhaltet Zitrone ... Bio
php at genjo dot fr 13-Mar-2015 05:33
I use RecursiveIteratorIterator with parameter CATCH_GET_CHILD to iterate on leafs AND nodes instead of array_walk_recursive function :

<?php
// Iteration on leafs AND nodes
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($candidate), RecursiveIteratorIterator::CATCH_GET_CHILD) as $key => $value) {
    echo 'My node ' . $key . ' with value ' . $value . PHP_EOL;
}
?>
robin leffmann 28-Jan-2015 03:48
A simple solution for walking a nested array to obtain the last set value of a specified key:

<?php

$key = 'blah';
$val = null;
array_walk_recursive( $your_array,
                      function($v, $k, $u) { if($k === $u[0]) $u[1] = $v; },
                      [$key ,&$val] );

echo "$key = $val";

?>
gk at anuary dot com 07-Mar-2014 09:29
array_walk_recursive itself cannot unset values. Even though you can pass array by reference, unsetting the value in the callback will only unset the variable in that scope.

<?php
/**
 * http://uk1.php.net/array_walk_recursive implementation that is used to remove nodes from the array.
 *
 * @param array The input array.
 * @param callable $callback Function must return boolean value indicating whether to remove the node.
 * @return array
 */
function walk_recursive_remove (array $array, callable $callback) {
    foreach ($array as $k => $v) {
        if (is_array($v)) {
            $array[$k] = walk_recursive_remove($v, $callback);
        } else {
            if ($callback($v, $k)) {
                unset($array[$k]);
            }
        }
    }

    return $array;
}
?>

An up to date implementation of the above function can be looked up from https://github.com/gajus/marray/blob/master/src/marray.php#L116.
Anonymous 21-Nov-2013 10:42
since PHP 5.3.0, you will get a warning saying that "call-time pass-by-reference" is deprecated when you use & in foo(&$a);. And as of PHP 5.4.0, call-time pass-by-reference was removed, so using it will raise a fatal error.
Rodrigo Guariento 23-Aug-2013 01:27
Simple array_walk_recursive:

// var example
$myArray = Array(
  Array('keyA1' => '    textA1 ', 'keyA2' => '  textA2     '),
  Array('keyB1' => '    textB1 ', 'sub' =>
        Array('keyB1_sub1' => '      textB1_sub1   '),
          Array('keyB1_sub2' => '      textB1_sub2   ')
      ),
  Array('keyC1' => '    textC1 ', 'keyC2' => '  textC2     '),
  Array('keyD1' => '    textD1 ', 'keyD2' => '  textD2     '),
  Array('keyE1' => '    textE1 ', 'keyE2' => '  textE2     ')
);

// function for "trim" (or your function, use same structure)
function trimming($data) {
  if (gettype($data) == 'array')
    return array_map("trimming", $data);
  else
    return trim($data);
}

// get array
$myArray = array_map("trimming", $myArray);

// show array trimmed
var_dump($myArray);

/*
RESULT

array (size=5)
  0 =>
    array (size=2)
      'keyA1' => string 'textA1' (length=6)
      'keyA2' => string 'textA2' (length=6)
  1 =>
    array (size=3)
      'keyB1' => string 'textB1' (length=6)
      'sub' =>
        array (size=1)
          'keyB1_sub1' => string 'textB1_sub1' (length=11)
      0 =>
        array (size=1)
          'keyB1_sub2' => string 'textB1_sub2' (length=11)
  2 =>
    array (size=2)
      'keyC1' => string 'textC1' (length=6)
      'keyC2' => string 'textC2' (length=6)
  3 =>
    array (size=2)
      'keyD1' => string 'textD1' (length=6)
      'keyD2' => string 'textD2' (length=6)
  4 =>
    array (size=2)
      'keyE1' => string 'textE1' (length=6)
      'keyE2' => string 'textE2' (length=6)

*/
none at of dot your dot biz 03-Jun-2013 10:50
Since this is only mentioned in the footnote of the output of one of the examples, I feel it should be spelled out:

* THIS FUNCTION ONLY VISITS LEAF NODES *

That is to say that if you have a tree of arrays with subarrays of subarrays, only the plain values at the leaves of the tree will be visited by the callback function.  The callback function isn't ever called for a nodes in the tree that subnodes (i.e., a subarray).  This has the effect as to make this function unusable for most practical situations.
chris at willowsconsulting dot ie 23-Oct-2012 10:11
To convert all values of an array in UTF8, do this:

<?php

function convert_before_json(&$item, &$key)
{
   $item=utf8_encode($item);
}

array_walk_recursive($your_array,"convert_before_json");

?>
cyranix at cyranix dot com 28-Oct-2011 07:45
I needed to add or modify values in an array with unknown structure. I was hoping to use array_walk_recursive for the task, but because I was also adding new nodes I came up with an alternate solution.

<?php

    /**
     * Sets key/value pairs at any depth on an array.
     * @param $data an array of key/value pairs to be added/modified
     * @param $array the array to operate on
     */
    function setNodes($data, &$array)
    {
        $separator = '.'; // set this to any string that won't occur in your keys
        foreach ($data as $name => $value) {
            if (strpos($name, $separator) === false) {
                // If the array doesn't contain a special separator character, just set the key/value pair.
                // If $value is an array, you will of course set nested key/value pairs just fine.
                $array[$name] = $value;
            } else {
                // In this case we're trying to target a specific nested node without overwriting any other siblings/ancestors.
                // The node or its ancestors may not exist yet.
                $keys = explode($separator, $name);
                // Set the root of the tree.
                $opt_tree =& $array;
                // Start traversing the tree using the specified keys.
                while ($key = array_shift($keys)) {
                    // If there are more keys after the current one...
                    if ($keys) {
                        if (!isset($opt_tree[$key]) || !is_array($opt_tree[$key])) {
                            // Create this node if it doesn't already exist.
                            $opt_tree[$key] = array();
                        }
                        // Redefine the "root" of the tree to this node (assign by reference) then process the next key.
                        $opt_tree =& $opt_tree[$key];
                    } else {
                        // This is the last key to check, so assign the value.
                        $opt_tree[$key] = $value;
                    }
                }
            }
        }
    }

?>

Sample usage:

<?php

$x = array();
setNodes(array('foo' => 'bar', 'baz' => array('quux' => 42, 'hup' => 101)), $x);
print_r($x); // $x has the same structure as the first argument
setNodes(array('jif.snee' => 'hello world', 'baz.quux.wek' => 5), $x);
print_r($x); // added $x['jif']['snee'] and modified $x['baz']['quux'] to be array('wek' => 5)

?>
ghoffman at salientdigital dot com 13-Oct-2011 10:29
If you are wanting to change the values of an existing multi-dimensional array, as it says above in the note, you need to specify the first argument as a reference. All that means is, be sure to precede the $item variable with an ampersand (&) as in the good_example below.

Unfortunately the PHP example given doesn't do this. It actually took me a while to figure out why my function wasn't changing the original array, even though I was passing by reference.

Here's the tip: Don't return any value from the function! Just change the value of $item that you passed in by reference. This is rather counter-intuitive since the vast majority of functions return a value.

<?php
// array_walk_recursive fails to change your array unless you pass by reference.
// Don't return values from your filter function, even though it's quite logical at a glance!
function bad_example($item,$key){
   if($key=='test'){
       return 'PHP Rocks';  // Don't do it
   }else{
      return $item;  // Don't do this either
   }
}

// array_walk_recursive pass-by-reference example
function good_example(&$item,$key){
   if($key=='test'){
        $item='PHP Rocks'; // Do This!
   }
}

$arr = array('a'=>'1','b'=>'2','test'=>'Replace This');

array_walk_recursive($arr,'bad_example');
var_dump($arr);
/**
 * no errors, but prints...
 * array('a'=>'1','b'=>'2','test'=>'Replace This');
 */

array_walk_recursive($arr,'good_example');
var_dump($arr);
/**
 * prints...
 * array('a'=>'1','b'=>'2','test'=>'PHP Rocks');
 */

?>

Returning a value from your function does work if you pass by reference and modify $item before you return, but you will eat up memory very, very fast if you try it, even on an example as small as the one here.

One other silly thing you might try first is something like this:

<?php
// Resist the urge to do this, it doesn't work.
$filtered = array_walk_recursive($unfiltered,'filter_function');
?>

Of course, $filtered is just TRUE afterwards, not the filtered results you were wanting. Oh, it ran your function recursively alright, but changed all the values in the local function scope only and returns a boolean as the documentation states.
rob at yurkowski dot net 26-Oct-2010 11:16
If you don't really particularly care about the keys of an array, you can capture all values quite simply:

<?php

$sample = array('dog' => 'woof', 'cat' => array('angry' => 'hiss', 'happy' => 'purr'), 'aardvark' => 'kssksskss');
$output = array();

// Push all $val onto $output.
array_walk_recursive($sample, create_function('$val, $key, $obj', 'array_push($obj, $val);'), &output);

// Printing
echo nl2br(print_r($output, true));

/*
* Array
* (
*  [0] => woof
*  [1] => hiss
*  [2] => purr
*  [3] => kssksskss
* )
*/
?>

[EDIT BY danbrown AT php DOT net: In a note added by 'FaustoFilho' on 17-MAY-2011, the following information was appended to this note.

[If you intend to use this] "function to extract the last key value of an array, don't forget to insert a currency sign ($) signal before '$output' at 7th line.

This value must be a variable, and if you forgot to assign this signal, your code won't work, displaying an error like this:

Parse error: syntax error, unexpected ')', expecting T_PAAMAYIM_NEKUDOTAYIM in /path/to/script.php on line 7."]
bradbeattie at gmail dot com 27-Aug-2010 11:18
The description says "If funcname needs to be working with the actual values of the array, specify the first parameter of funcname as a reference." This isn't necessarily helpful as the function you're calling might be built in (e.g. trim or strip_tags). One option would be to create a version of these like so.

<?php
    function trim_by_reference(&$string) {
        $string = trim($string);
    }
?>

The downside to this approach is that you need to create a wrapper function for each function you might want to call. Instead, we can use PHP 5.3's inline function syntax to create a new version of array_walk_recursive.

<?php
    /**
     * This function acts exactly like array_walk_recursive, except that it pretends that the function
     * its calling replaces the value with its result.
     *
     * @param $array The first value of the array will be passed into $function as the primary argument
     * @param $function The function to be called on each element in the array, recursively
     * @param $parameters An optional array of the additional parameters to be appeneded to the function
     *
     * Example usage to alter $array to get the second, third and fourth character from each value
     *     array_walk_recursive_referential($array, "substr", array("1","3"));
     */
    function array_walk_recursive_referential(&$array, $function, $parameters = array()) {
        $reference_function = function(&$value, $key, $userdata) {
            $parameters = array_merge(array($value), $userdata[1]);
            $value = call_user_func_array($userdata[0], $parameters);
        };
        array_walk_recursive($array, $reference_function, array($function, $parameters));
    }
?>

The advantage here is that we only explicitly define one wrapper function instead of potentially dozens.
amoffat at amoffat dot com 04-Jun-2008 05:15
<?
function my_array_map() {
    $args = func_get_args();
    $arr = array_shift($args);

    foreach ($args as $fn) {
        $nfn = create_function('&$v, $k, $fn', '$v = $fn($v);');
        array_walk_recursive($arr, $nfn, $fn);
    }
    return $arr;
}
?>

takes an array as the first argument, and functions as the other arguments.  it applies those functions recursively to the array
JW 14-Mar-2008 05:59
This function has a serious bug, which is still not fixed as of the PHP 5.2.5 release. After you call it, it can accidentally modify your original array. Save yourself hours of frustration by reading on.

The bug is here: http://bugs.php.net/bug.php?id=42850, and it looks like it will be fixed for 5.3.

If the array that you walk contains other array elements, they will be turned into references. This will happen even if the callback function doesn't take its first argument by reference, and doesn't do anything to the values.

For example, try this:
<?php
$data = array ('key1' => 'val1', 'key2' => array('key3' => 'val3'));
function foo($item, $key){}
var_dump($data);
?>

The original array has no references. Now try this:
<?php
array_walk_recursive($data,'foo');
var_dump($data);
?>

Now key2 is a reference, not just an array. So if you do this:
<?php
function test($item){$item['key2'] = array();}
test($data);
var_dump($data);
?>

you will see that test modifies $data, even though it shouldn't.

One workaround is to immediately make a deep copy of the array after calling array_walk_recursive, like this:
<?php
function array_duplicate($input) {
  if (!is_array($input)) return $input;
  $output = array();
  foreach ($input as $key => $value) {
    $output[$key] = array_duplicate($value);
  }
  return $output;
}
array_walk_recursive($data,'foo');
$data = array_duplicate($data);
var_dump($data);
?>

After doing that, the references are gone.
ik at paulkaspers dot nl 15-Oct-2006 01:46
To egingell at sisna dot com:

There is a small bug in your function, the following line should be changed:
From: if ($value != $saved_value || $saved_key != $key) {
Into: if ($value !== $saved_value || $saved_key !== $key) {

It's a nice function, because I was searching for something to change the keys of a multiple dimension array.
gabrielu at hotmail dot com 21-Feb-2006 01:13
I decided to add to the previous PHP 4 compatible version of array_walk_recursive() so that it would work within a class and as a standalone function.  Both instances are handled by the following function which I modified from omega13a at sbcglobal dot net.

The following example is for usage within a class.  To use as a standalone function take it out of the class and rename it.  (Example: array_walk_recursive_2)

<?php
class A_Class {

function array_walk_recursive(&$input, $funcname, $userdata = '') {
  if(!function_exists('array_walk_recursive')) {
    if(!is_callable($funcname))
      return false;

    if(!is_array($input))
      return false;

    foreach($input as $key=>$value) {
      if(is_array($input[$key])) {
        if(isset($this)) {
          eval('$this->' . __FUNCTION__ . '($input[$key], $funcname, $userdata);');
        } else {
          if(@get_class($this))
            eval(get_class() . '::' . __FUNCTION__ . '($input[$key], $funcname, $userdata);');
          else
            eval(__FUNCTION__ . '($input[$key], $funcname, $userdata);');
        }
      } else {
        $saved_value = $value;

        if(is_array($funcname)) {
          $f = '';
          for($a=0; $a<count($funcname); $a++)
            if(is_object($funcname[$a])) {
              $f .= get_class($funcname[$a]);
            } else {
              if($a > 0)
                $f .= '::';
              $f .= $funcname[$a];
            }
          $f .= '($value, $key' . (!empty($userdata) ? ', $userdata' : '') . ');';
          eval($f);
        } else {
          if(!empty($userdata))
            $funcname($value, $key, $userdata);
          else
            $funcname($value, $key);
        }

        if($value != $saved_value)
          $input[$key] = $value;
      }
    }
    return true;
  } else {
    array_walk_recursive($input, $funcname, $userdata);
  }
}

function kv_addslashes(&$v, $k) {
  $v = addslashes($v);
}
}
?>

Usage:
<?php
$arr = array(
  'a' => '"Hello World"',
  'b' => "'Hello World'",
  'c' => "Hello 'Worl\"d",
  'd' => array(
    'A' => 'H"e"l"l"o" "W"o"r"l"d'
    )
  );

$class = new A_Class();
$class->array_walk_recursive($arr, array(&$class, 'kv_addslashes'));
print_r($arr);
?>
omega13a at sbcglobal dot net 21-Dec-2005 04:21
This is a peice of code I wrote that appears to create this function for PHP 4.

<?php
if (!function_exists('array_walk_recursive'))
{
    function array_walk_recursive(&$input, $funcname, $userdata = "")
    {
        if (!is_callable($funcname))
        {
            return false;
        }

        if (!is_array($input))
        {
            return false;
        }

        foreach ($input AS $key => $value)
        {
            if (is_array($input[$key]))
            {
                array_walk_recursive($input[$key], $funcname, $userdata);
            }
            else
            {
                $saved_value = $value;
                if (!empty($userdata))
                {
                    $funcname($value, $key, $userdata);
                }
                else
                {
                    $funcname($value, $key);
                }

                if ($value != $saved_value)
                {
                    $input[$key] = $value;
                }
            }
        }
        return true;
    }
}
?>

Please note it is a conditionaly set function and will have to be put before any call to it.

If there is anything wrong with it, please email me.


Exécute une fonction fournie par l'utilisateur sur chacun des éléments d'un tableau

  • « array_walk_recursive
  • array »
  • PHP Manual
  • Fonctions sur les tableaux
  • Exécute une fonction fournie par l'utilisateur sur chacun des éléments d'un tableau

array_walk

(PHP 4, PHP 5, PHP 7, PHP 8)

array_walk — Exécute une fonction fournie par l'utilisateur sur chacun des éléments d'un tableau

Description

array_walk ( array|object &$array , callable $callback , mixed $userdata = null ) : bool

Exécute la fonction callback définie par l'utilisateur sur chaque élément du tableau array.

array_walk() n'est pas affecté par le pointeur interne du tableau array. array_walk() traversera le tableau en totalité sans se soucier de la position du pointeur.

Liste de paramètres

array

Le tableau d'entrée.

callback

Typiquement, callback prend deux paramètres. La valeur du paramètre array étant le premier et la clé/index, le second.

Note:

Si callback doit travailler avec les véritables valeurs du tableau, spécifiez que le premier paramètre de callback doit être passé par référence. Alors, les éléments seront directement modifiés dans le tableau.

Note:

Plusieurs fonctions internes (par exemple, strtolower()) émettent une alerte si plus d'arguments que ceux attendus sont passés à la fonction et ne sont pas utilisables directement comme callback.

Seules les valeurs du array peuvent être modifiées; sa structure ne peut pas, c'est à dire que vous ne pouvez ajouter, supprimer ou réordonner des éléments. Si la fonction de callback ne respecte pas cette règle, le comportement va devenir indéfini et imprévisible.

userdata

Si le paramètre optionnel userdata est fourni, il sera passé comme troisième paramètre à la fonction définie par l'utilisateur callback.

Valeurs de retour

Retourne true.

Erreurs / Exceptions

A partir de PHP 7.1.0, un ArgumentCountError sera levé si la fonction callback requiert plus de 2 paramètres (la valeur et la clé de l'élément du tableau). Précédemment, si la fonction callback nécessitait plus de 2 paramètres, une erreur de niveau E_WARNING aurait été générée à chaque fois que la fonction array_walk() appelle callback.

Exemples

Exemple #1 Exemple avec array_walk()

<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");

function test_alter(&$item1, $key, $prefix)
{
    $item1 = "$prefix: $item1";
}

function test_print($item2, $key)
{
    echo "$key. $item2\n";
}

echo "Avant ...:\n";
array_walk($fruits, 'test_print');

array_walk($fruits, 'test_alter', 'fruit');
echo "... et après :\n";

array_walk($fruits, 'test_print');
?>

L'exemple ci-dessus va afficher :

Avant ...:
d. lemon
a. orange
b. banana
c. apple
... et après :
d. fruit: lemon
a. fruit: orange
b. fruit: banana
c. fruit: apple

Voir aussi

  • array_walk_recursive() - Applique une fonction de rappel récursivement à chaque membre d'un tableau
  • iterator_apply() - Appelle une fonction pour tous les éléments d'un itérateur
  • list() - Assigne des variables comme si elles étaient un tableau
  • each() - Retourne chaque paire clé/valeur d'un tableau
  • call_user_func_array() - Appelle une fonction de rappel avec les paramètres rassemblés en tableau
  • array_map() - Applique une fonction sur les éléments d'un tableau
  • foreach

User Contributed Notes

mystral77 at gmail dot com 24-Jun-2020 02:54
Hello,

If you want to add values with same key from two arrays :

<?php
function add(&$item,$key,$search) {
    $item += (is_array($search))?((isset($search[$key]))?$search[$key]:0):0;
}

$a = ["orange" => 2, "banana" => 3, "apple" => 1];
$b = ["orange" => 1, "apple" => 4];

array_walk($c,"add",$b);

echo "<pre>".print_r($c,true)."</pre>";
?>

This will output:

"orange" => 3,
"banana" => 3,
"apple" => 5
taj at yahoo dot fr 27-Feb-2019 11:42
// We can make that with this simple FOREACH loop :

$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");

foreach($fruits as $cls => $vls)
{
  $fruits[$cls] = "fruit: ".$vls;
}

Results:

Array
(
    [d] => fruit: lemon
    [a] => fruit: orange
    [b] => fruit: banana
    [c] => fruit: apple
)
EllisGL 01-Aug-2018 06:15
For those that think they can't use array_walk to change / replace a key name, here you go:

<?php
function array_explore(array &$array, callable $callback)
{
    array_walk($array, function(&$value, $key) use (&$array, $callback)
    {
        $callback($array, $key, $value);

        if(is_array($value))
        {
            array_explore($value, $callback);
        }
    });
}

/**
 * Stolen from: https://stackoverflow.com/questions/13233405/change-key-in-associative-array-in-php
 */
function renameKey(array &$data, $oldKey, $newKey, $ignoreMissing = false, $replaceExisting = false)
{
    if (!empty($data))
    {
        if (!array_key_exists($oldKey, $data))
        {
            if ($ignoreMissing)
            {
                return FALSE;
            }

            throw new \Exception('Old key does not exist.');
        }
        else
        {
            if (array_key_exists($newKey, $data))
            {
                if ($replaceExisting)
                {
                    unset($data[$newKey]);
                }
                else
                {
                    throw new \Exception('New key already exist.');
                }
            }

            $keys = array_keys($data);

            // Fix from EllisGL: http://php.net/manual/en/function.array-search.php#122377
            $keys[array_search($oldKey, array_map('strval', $keys))] = $newKey;

            $data = array_combine($keys, $data);

            return TRUE;
        }
    }

    return FALSE;
}

$array = [
    "_10fish" => 'xyz',
    "_11fish" => [
        "_22" => "a", "b", "c"
        ],
    "someFish" => [
        'xyz',
        '@attributes' => ['type' => 'cod']
        ]
    ];

array_explore($array, function(&$value, $key)
{
    // Replace key '@attrutes' with '_attributes'
    if('@attributes' === $key)
    {
        renameKey($value, $key, '_attributes');
    }

});

print_r($array);
?>
01001coder at gmail dot com 05-Dec-2017 10:19
I noticed that :

PHP ignored arguments type when using array_walk() even if there was

declare(strict_types=1) .

See this code as an example ...

<?php
declare(strict_types=1);

$fruits = array("butter" => 5.3, "meat" => 7, "banana" => 3);

function test_print(int $item2, $key) {
    echo "$key: $item2<br />\n";
}

array_walk($fruits, 'test_print');

?>

The output is :

butter: 5
meat: 7
banana: 3

whilst the expecting output is :

Fatal error: Uncaught TypeError: Argument 1 passed to test_print() must be of the type integer

because "butter" => 5.3 is float

I asked someone about it and they said "this was caused by the fact that callbacks called from internal code will always use weak type". But I tried to do some tests and this behavior is not an issue when using call_user_func().
vrrivaro at YESIUSEGMAIL dot gmail dot SO dot com 18-Mar-2017 02:40
The output of the example is only correct if viewed through a web browser. If you pass it through to PHP-CLI, you will get to see the additional HTML line breaks, however.
fantomx1 at gmail dot com 22-Aug-2016 08:08
Since array_walk cannot modify / change / reindex keys as already mentioned, i provide this small wrapping function which accomplishes passing array reference and index using closures , "use" keyword.

function indexArrayByElement($array, $element)
{
    $arrayReindexed = [];
    array_walk(
        $array,
        function ($item, $key) use (&$arrayReindexed, $element) {
            $arrayReindexed[$item[$element]] = $item;
        }
    );
    return $arrayReindexed;
}
fred 30-Dec-2015 09:01
Correction for the speed test from zlobnygrif.

<?php
// Test results
$array1 = test('array_walk');
$array2 = test('array_walk_list_each');
$array3 = test('array_walk_foreach1');
$array4 = test('array_walk_foreach2');

// Check arrays for equal
var_dump($array1 == $array2, $array1 == $array3, $array1 == $array4);

// Test function 1
function array_walk_list_each(&$array, $function, $userData = null) {
   /* make sure we walk the array each time */
    reset($array);
    while ( list($key, $value) = each($array) )
        $function($array[$key], $key, $userData);
}

// Test function 2
function array_walk_foreach1(&$array, $function, $userData = null) {
    foreach ($array as $key => &$value )
        $function($value, $key, $userData);
}

// Test function 3
function array_walk_foreach2(&$array, $function, $userData = null) {
    foreach ($array as $key => $value )
        $function($array[$key], $key, $userData);
}

function some_function(&$value, $key, $userData) {
    $value = "$key => $userData";
}

function test($function, $count = 10000, $arrayElements = 1000) {
    echo $function, ' ... ';
    $array = array_fill(0, $arrayElements, "some text value");

    $timer = microtime(true);
    for( $i = 0; ++$i < $count; )
        /* change data for each $i */
        $function($array, 'some_function', 'some user data ' . $i);
    printf("%.3f sec\n", microtime(true) - $timer);

    return $array;
}
ezhacher at gmail dot com 27-Aug-2014 12:45
Calling an array Walk inside a class

If the class is static:
array_walk($array, array('self', 'walkFunction'));
or
array_walk($array, array('className', 'walkFunction'));

Otherwise:
array_walk($array, array($this, 'walkFunction'));
chaley at brtransport dot com 16-Jun-2014 12:46
There is a note about 3 years ago regarding using this for trimming. array_map() may be cleaner for this. I haven't checked the time/resource impact:

$result = array_map("trim", $array);
zlobnygrif at gmail dot com 17-Jul-2013 05:41
Some speed tests

<?php
// Test results
$array1 = test('array_walk');
$array2 = test('array_walk_list_each');
$array3 = test('array_walk_foreach1');
$array4 = test('array_walk_foreach2');

// Check arrays for equal
var_dump($array1 == $array2, $array1 == $array3, $array1 == $array4);

// Test function 1
function array_walk_list_each(&$array, $function, $userData = null) {
    while ( list($key, $value) = each($array) )
        $function($array[$key], $key, $userData);
}

// Test function 2
function array_walk_foreach1(&$array, $function, $userData = null) {
    foreach ($array as $key => &$value )
        $function($value, $key, $userData);
}

// Test function 3
function array_walk_foreach2(&$array, $function, $userData = null) {
    foreach ($array as $key => $value )
        $function($array[$key], $key, $userData);
}

function some_function(&$value, $key, $userData) {
    $value = "$key => $userData";
}

function test($function, $count = 10000, $arrayElements = 1000) {
    echo $function, ' ... ';
    $array = array_fill(0, $arrayElements, "some text value");

    $timer = microtime(true);
    for( $i = 0; ++$i < $count; )
        $function($array, 'some_function', 'some user data');
    printf("%.3f sec\n", microtime(true) - $timer);

    return $array;
}
?>

Output (PHP 5.4.9-4ubuntu2.2 (cli) (built: Jul 15 2013 18:24:39))
=========================
array_walk ... 13.572 sec
array_walk_list_each ... 0.027 sec
array_walk_foreach1 ... 15.356 sec
array_walk_foreach2 ... 17.416 sec
bool(true)
bool(true)
bool(true)

Output (PHP 5.5.0 (cli) (built: Jul 16 2013 17:59:42) - same server)
=========================
array_walk ... 4.776 sec
array_walk_list_each ... 0.006 sec
array_walk_foreach1 ... 4.482 sec
array_walk_foreach2 ... 5.166 sec
bool(true)
bool(true)
bool(true)

PHP 5.5 array_walk looks pretty good but list each is more and more quickly...
brian at access9 dot net 24-May-2013 10:03
array_walk does not work on SplFixedArray objects:
<?php
$array = new SplFixedArray(2);
$array[0] = 'test_1';
$array[1] = 'test_2';

array_walk($array, function(&$val){
    $val .= '__';
    return $val;
});
foreach ($array as $a) {
    echo "$a\n";
}
?>

result is:
test_1
test_2
gold[at]evolved.net.nz 27-Mar-2013 10:08
For all those people trying to shoe-horn trim() into array_walk() and have found all these tricks to work around the issue with array_walk() passing 2 parameters to the callback...

Check out array_map().

http://php.net/array_map

It's all sorts of win.

For the record. I'm one of these people and after 15 years of php development I'm pleased to say that there's still things I'm learning. :)  I just found out about array_map() myself...
espertalhao04 at hotmail dot com 26-Dec-2012 11:35
here is a simple and yet easy to use implementation of this function.
the 'original' function has the problem that you can't unset a value.
with my function, YOU CAN!

<?php
function array_walk_protected(&$a,$s,$p=null)
{
    if(!function_exists($s)||!is_array($a))
    {
        return false;
    }

    foreach($a as $k=>$v)
    {
        if(call_user_func_array($s,array(&$a[$k],$k,$p))===false)
        {
            unset($a[$k]);
        }
    }
}

function get_name(&$e,$i,$p)
{
    echo "$i: $e<br>";
    return false;
}

$m=array('d'=>'33','Y'=>55);

array_walk_protected($m,'get_name');

var_dump($m); //returns array(0) { }
?>

i called it array_walk_protected because it is protected against the unexpected behavior of unsetting the value with the original function.

to delete an element, simply return false!!!
nothing else is needed!
unsetting $e, under your created function, will keep the same array as-is, with no changes!

by the way, the function returns false if $a is not array or $s is not a string!

limitations: it only can run user defined functions.
i hope you like it!
manuscle at gmail dot com 06-Dec-2011 07:16
example with closures, checking and deleting value in array:

<?php
$array = array('foo' => 'bar', 'baz' => 'bat');

array_walk($array, function($val,$key) use(&$array){
    if ($val == 'bar') {
        unset($array[$key]);
    }
});

var_dump($array);
alex_stanhope at hotmail dot com 26-Oct-2011 01:16
I wanted to walk an array and reverse map it into a second array.  I decided to use array_walk because it should be faster than a reset,next loop or foreach(x as &$y) loop.

<?php
$output = array();
array_walk($input, 'gmapmark_reverse', $output);

function gmapmark_reverse(&$item, $index, &$target) {
    $target[$item['form_key']] = $index;
}
?>

In my debugger I can see that $target is progressively updated, but when array_walk returns, $output is empty.  If however I use a (deprecated) call-by-reference:

<?php
array_walk($input, 'gmapmark_reverse', &$output);
?>

$output is returned correctly.  Unfortunately there's not an easy way to suppress the warnings:

<?php
@array_walk($input, 'gmapmark_reverse', &$output);
?>

doesn't silence them.  I've designed a workaround using a static array:

<?php
$reverse = array();
array_walk($input, 'gmapmark_reverse');
// call function one last time to get target array out, because parameters don't work
$reverse = gmapmark_reverse($reverse);

function gmapmark_reverse(&$item, $index = 0) {
  static $target;
  if (!$target) {
    $target = array();
  }
  if (isset($item['form_key'])) {
    $target[$item['form_key']] = $index;
  }
  return($target);
}
?>
tufanbarisyildirim at gmail dot com 05-Oct-2011 06:15
Filter an array by using key.

<?php
    $product_1 = 'test';
    $product_2 = 'test 2';

    function array_key_filter($array,$callback = 'trim')
    {
        $filtered = array();
        array_walk($array,function ($degeri,$degisken_adi) use (&$filtered,$callback)
        {
            if($callback($degisken_adi))
            {
                $filtered[$degisken_adi] =  $degeri;
            }
        });

        return $filtered;
    }

    #using

    $degiskenler = array_key_filter(get_defined_vars(),function($key)
    {
        return strpos($key,'product_') === 0;
    });

    print_r($degiskenler);
?>
output:

Array
(
    [product_1] => test
    [product_2] => test 2
)
Maxim 11-Jul-2011 12:23
Note that using array_walk with intval is inappropriate.
There are many examples on internet that suggest to use following code to safely escape $_POST arrays of integers:
<?php
array_walk($_POST['something'],'intval'); // does nothing in PHP 5.3.3
?>
It works in _some_ older PHP versions (5.2), but is against specifications. Since intval() does not modify it's arguments, but returns modified result, the code above has no effect on the array and will leave security hole in your website.

You can use following instead:
<?php
$_POST['something'] = array_map(intval,$_POST['something']);
?>
@jfredys 22-Mar-2011 05:07
I was looking for trimming all the elements in an array, I found this as the simplest solution:

<?php
array_walk($ids, create_function('&$val', '$val = trim($val);'));
?>
http://alex.moutonking.com/wordpress 15-Feb-2011 10:49
For completeness one has to mention the possibility of using this function with PHP 5.3 closures:

<?php
$names = array("D\'Artagnan", "Aramis", "Portos");
array_walk($names, function(&$n) {
  $n = stripslashes($n);
});
?>

The trap with array_walk being it doesn't return the array, instead it's modified by reference.
op_adept at yahoo dot co dot uk 02-Dec-2010 03:20
Prefix array values with keys and retrieve as a glued string, the original array remains unchanged. I used this to create some SQL queries from arrays.

<?php

function array_implode_prefix($outer_glue, $arr, $inner_glue, $prefix=false){
    array_walk( $arr , "prefix", array($inner_glue, $prefix) );
    return implode($outer_glue, $arr);
}

function prefix(&$value, $key, array $additional){
    $inner_glue = $additional[0];
    $prefix = isset($additional[1])? $additional[1] : false;
    if($prefix === false) $prefix = $key;

    $value = $prefix.$inner_glue.$value;
}

//Example 1:
$order_by = array("3"=>"ASC", "2"=>"DESC", "7"=>"ASC");
echo array_implode_prefix(",", $order_by, " ");
//Output: 3 ASC,2 DESC,7 ASC

//Example 2:
$columns = array("product_id", "category_id", "name", "description");
$table = "product";

echo array_implode_prefix(", ", $columns, ".", $table);
//Output:product.product_id, product.category_id, product.name, product.description

//Example 3 (function prefix) won't really be used on its own
$pre= "vacation";
$value = "lalaland";
prefix($value, $pre, array("."));
echo $value;

//Output: vacation.lalaland

?>
matthew at codenaked dot org 02-Sep-2010 11:24
Using lambdas you can create a handy zip function to zip together the keys and values of an array. I extended it to allow you to pass in the "glue" string as the optional userdata parameter. The following example is used to zip an array of email headers:

<?php

/**
 * Zip together the keys and values of an array using the provided glue
 *
 * The values of the array are replaced with the new computed value
 *
 * @param array $data
 * @param string $glue
 */
function zip(&$data, $glue=': ')
{
    if(!is_array($data)) {
        throw new InvalidArgumentException('First parameter must be an array');
    }

    array_walk($data, function(&$value, $key, $joinUsing) {
        $value = $key . $joinUsing . $value;
    }, $glue);
}

$myName = 'Matthew Purdon';
$myEmail = 'matthew@example.com';
$from = "$myName <$myEmail>";

$headers['From'] = $from;
$headers['Reply-To'] = $from;
$headers['Return-path'] = "<$myEmail>";
$headers['X-Mailer'] = "PHP" . phpversion() . "";
$headers['Content-Type'] = 'text/plain; charset="UTF-8"';

zip($headers);

$headers = implode("\n", $headers);
$headers .= "\n";

echo $headers;

/*
From: Matthew Purdon <matthew@example.com>
Reply-To: Matthew Purdon <matthew@example.com>
Return-path: <matthew@example.com>
X-Mailer: PHP5.3.2
Content-Type: text/plain; charset="UTF-8"
*/
?>
arekandrei at yandex dot ru 03-Jan-2010 07:30
You can use lambda function as a second parameter:

<?php
array_walk($myArray, function(&$value, $key){
    // if you want to change array values then "&" before the $value is mandatory.
});
?>

Example (multiply positive values by two):

<?php
$myArray = array(1, 2, 3, 4, 5);

array_walk($myArray, function(&$value, $index){
    if ($value > 0) $value *= 2;
});
?>
rustamabd at gmail dot com 13-Dec-2009 06:32
Don't forget about the array_map() function, it may be easier to use!

Here's how to lower-case all elements in an array:

<?php
    $arr = array_map('strtolower', $arr);
?>
erelsgl at gmail dot com 04-Mar-2009 03:40
If you want to unset elements from the callback function, maybe what you really need is array_filter.
jab_creations_-at_-yahoo_-dot-_com 26-Nov-2008 04:08
Unfortunately I spent a lot of time trying to permanently apply the effects of a function to an array using the array_walk function when instead array_map was what I wanted. Here is a very simple though effective example for those who may be getting overly frustrated with this function...

<?php
$fruits = array("Lemony & Fresh","Orange Twist","Apple Juice");

print_r($fruits);
echo '<br />';

function name_base($key)
{
 $name2 = str_replace(" ", "_", $key);
 $name3 = str_replace("&", "and", $name2);
 $name4 = strtolower($name3);
 echo $name4.'<br />';
 return $name4;
}
echo '<br />';

$test = array_map('name_base', $fruits);
$fruits_fixed = $test;
echo '<br />';
print_r($fruits_fixed);
?>
peterzuzek AT gmail DOT com 16-Nov-2008 09:04
I had some problems using this function - it didn't want to apply PHP-defined functions. So I decided to write my own - here it is. I had to use some generic-programming skills, didn't really checked the speed (I think it could be slow)... I believe it could be much better, but I don't know, how - well, I guess multiple array support and recursion would be nice. So?

Prototype:
bool arrayWalk(array &$arry, callback $callback, mixed $params=false)

<?php

    function arrayWalk(&$arry, $callback, $params=false) {
        $P=array(""); // parameters
        $a=""; // arguement string :)

        if($params !== false) { // add parameters
            if(is_array($params)) { // multiple additional parameters
                foreach($params as $par)
                    { $P[]=$par; }
            }
            else // just one additional
                { $P[]=$params; }
        }

        for( // create the arguement string
            $i=0; isset($P[$i]); ++$i
        )
            { $a.='$'.chr($i + 97).', '; } // random argument names

        $a=substr($a, 0, -2); // to get rid of the last comma and two spaces

        $func=create_function($a, 'return '.$callback.'('.$a.');'); // the generic function

        if(is_callable($func)) {
            for( // cycle through array
                $i=0; isset($arry[$i]); ++$i
            ) {
                $P[0]=$arry[$i]; // first element must be the first argument - array value
                $arry[$i] = call_user_func_array($func, $P); // assign the new value obtained by the generic function
            }
        }
        else
            { return false; } // failure - function not callable

        return true; // success!
    } // arrayWalk()

?>

One big problem I've noticed so far - for example, if you wanted to use str_replace on the array, you'd fail - simply because of the arguement order of str_replace, where the string modified is the third arguement, not the first as arrayWalk requires.

So, still some work left...
diyism 30-Oct-2008 11:18
When i pass the third parameter by reference in php5.2.5,
happened this: Warning: Call-time pass-by-reference has been deprecated - argument passed by value...

And to set allow_call_time_pass_reference to true in php.ini won't work, according to http://bugs.php.net/bug.php?id=19699   thus to work around:

<?php
array_walk($arrChnOut, create_function('&$v, $k, $arr_rtn', 'if ($k{0}!="_") {$arr_rtn[0]["_".$v[\'ID\']]=$v; unset($arr_rtn[0][$k]);}'), array(&$arrChnOut));
?>
jerk at yoosic dot de 21-Dec-2006 08:05
if you want to modify every value of an multidimensional array use this function used here:

<?php

$array = array (1=>1, 2=> 2, 3 => array(1=>11, 2=>12, 3=>13));
$text = "test";

function modarr(&$array, $text) {
        foreach ($array as $key => $arr) {
                if(is_array($arr)) $res[$key] = modarr(&$arr,$text);
                // modification function here
                else $res[$key] = $arr.$text;
                }
        return $res;
}

$erg = modarr($array, $text);

print_r($erg);

?>

result will be_

<?php
Array ( [1] => 1test [2] => 2test [3] => Array ( [1] => 11test [2] => 12test [3] => 13test ) )
?>
ludvig dot ericson at gmail dot com 21-Nov-2005 06:09
In response to 'ibolmo', this is an extended version of string_walk, allowing to pass userdata (like array_walk) and to have the function edit the string in the same manner as array_walk allows, note now though that you have to pass a variable, since PHP cannot pass string literals by reference (logically).

<?php
function string_walk(&$string, $funcname, $userdata = null) {
    for($i = 0; $i < strlen($string); $i++) {
        # NOTE: PHP's dereference sucks, we have to do this.
        $hack = $string{$i};
        call_user_func($funcname, &$hack, $i, $userdata);
        $string{$i} = $hack;
    }
}

function yourFunc($value, $position) {
    echo $value . ' ';
}

function yourOtherFunc(&$value, $position) {
    $value = str_rot13($value);
}

# NOTE: We now need this ugly $x = hack.
string_walk($x = 'interesting', 'yourFunc');
// Ouput: i n t e r e s t i n g

string_walk($x = 'interesting', 'yourOtherFunc');
echo $x;
// Output: vagrerfgvat
?>

Also note that calling str_rot13() directly on $x would be much faster ;-) just a sample.
Andrzej Martynowicz at gmail dot com 18-Sep-2005 06:03
It can be very useful to pass the third (optional) parameter by reference while modifying it permanently in callback function. This will cause passing modified parameter to next iteration of array_walk(). The exaple below enumerates items in the array:

<?php
function enumerate( &$item1, $key, &$startNum ) {
   $item1 = $startNum++ ." $item1";
}

$num = 1;

$fruits = array( "lemon", "orange", "banana", "apple");
array_walk($fruits, 'enumerate', $num );

print_r( $fruits );

echo '$num is: '. $num ."\n";
?>

This outputs:

Array
(
    [0] => 1 lemon
    [1] => 2 orange
    [2] => 3 banana
    [3] => 4 apple
)
$num is: 1

Notice at the last line of output that outside of array_walk() the $num parameter has initial value of 1. This is because array_walk() does not take the third parameter by reference.. so what if we pass the reference as the optional parameter..

<?php
$num = 1;

$fruits = array( "lemon", "orange", "banana", "apple");
array_walk($fruits, 'enumerate', &$num ); // reference here

print_r( $fruits );

echo '$num is: '. $num ."\n";
echo "we've got ". ($num - 1) ." fruits in the basket!";
?>

This outputs:
Array
(
    [0] => 1 lemon
    [1] => 2 orange
    [2] => 3 banana
    [3] => 4 apple
)
$num is: 5
we've got 4 fruits in the basket!

Now $num has changed so we are able to count the items (without calling count() unnecessarily).

As a conclusion, using references with array_walk() can be powerful toy but this should be done carefully since modifying third parameter outside the array_walk() is not always what we want.
el_porno at web dot de 27-May-2005 03:03
You want to get rid of the whitespaces users add in your form fields...?
Simply use...:

class SomeVeryImportantClass
{
...
    public function mungeFormData(&$data)
    {
        array_walk($data, array($this, 'munge'));
    }

    private function munge(&$value, &$key)
    {
        if(is_array($value))
        {
            $this->mungeFormData($value);
        }
        else
        {
            $value = trim($value);
        }
    }
...
}

so...
$obj = new SomeVeryImportantClass;
$obj->mungeFormData($_POST);
___
eNc
Enlightened One 07-Apr-2005 11:17
Beware that "array ($this, method)" construct. If you're wanting to alter members of the "$this" object inside "method" you should construct the callback like this:

  $callback[] = &$this;
  $callback[] = method;
  array_walk ($input, $callback);

Creating your callback using the array() method as suggested by "appletalk" results in a copy of $this being passed to method, not the original object, therefor any changes made to the object by method will be lost when array_walk() returns. While you could construct the callback with "array(&$this, method)", I believe this relies on the deprecated runtime pass-by-reference mechanism which may be removed in future releases of PHP. Better to not create a dependence on that feature now than having to track it down and fix it in the future.
bisqwit at iki dot fi 03-Sep-2004 04:54
It's worth nothing that array_walk can not be used to change keys in the array.
The function may be defined as (&$value, $key) but not (&$value, &$key).
Even though PHP does not complain/warn, it does not modify the key.


Crée un tableau

  • « array_walk
  • arsort »
  • PHP Manual
  • Fonctions sur les tableaux
  • Crée un tableau

array

(PHP 4, PHP 5, PHP 7, PHP 8)

array — Crée un tableau

Description

array ( mixed ...$values ) : array

Crée un tableau. Lisez la section sur les types tableaux pour plus d'informations sur ce qu'est un tableau.

Liste de paramètres

values

La syntaxe "index => valeur", séparée par des virgules, définit les index et leur valeur. Un index peut être une chaîne ou un nombre. Si l'index est omis, un index numérique sera automatiquement généré (commençant à 0). Si l'index est un entier, le prochain index généré prendra la valeur d'index la plus grande + 1. Notez que si deux index identiques sont définis, le dernier remplacera le premier.

Avoir une virgule après avoir défini la dernière entrée, bien qu'inutile, est une syntaxe valide.

Valeurs de retour

Retourne un tableau des paramètres. Les paramètres peuvent fournir un index en utilisant l'opérateur =>. Lisez la section sur les types-tableaux pour plus d'informations sur ce qu'est un tableau.

Exemples

L'exemple suivant montre comment créer un tableau à deux dimensions, comment spécifier les index d'un tableau associatif, et comment générer automatiquement des index numériques.

Exemple #1 Exemple avec array()

<?php
$fruits = array (
    "fruits"  => array("a" => "orange", "b" => "banana", "c" => "apple"),
    "numbers" => array(1, 2, 3, 4, 5, 6),
    "holes"   => array("first", 5 => "second", "third")
);
?>

Exemple #2 Index automatique avec array()

<?php
$array = array(1, 1, 1, 1,  1, 8 => 1,  4 => 1, 19, 3 => 13);
print_r($array);
?>

L'exemple ci-dessus va afficher :

Array
(
    [0] => 1
    [1] => 1
    [2] => 1
    [3] => 13
    [4] => 1
    [8] => 1
    [9] => 19
)

Notez bien que l'index '3' est défini deux fois, et conserve finalement sa dernière valeur de 13. L'index '4' est défini après l'index '8', et l'index généré suivant (valeur 19) est 9, puisque le plus grand index est alors 8.

Cet exemple crée un tableau dont les index commencent à 1.

Exemple #3 Index commençant à 1 avec array()

<?php
$firstquarter = array(1 => 'January', 'February', 'March');
print_r($firstquarter);
?>

L'exemple ci-dessus va afficher :

Array
(
    [1] => January
    [2] => February
    [3] => March
)

Tout comme en Perl, vous pouvez accéder à une valeur d'un tableau dans des doubles guillemets. Cependant, avec PHP, vous devez entourer votre tableau avec des accolades.

Exemple #4 Accéder à un tableau dans des doubles guillemets

<?php

$foo = array('bar' => 'baz');
echo "Hello {$foo['bar']}!"; // Hello baz!

?>

Notes

Note:

array() est un constructeur de langage utilisé pour représenter littéralement les tableaux, mais ce n'est en aucun cas une fonction régulière.

Voir aussi

  • array_pad() - Complète un tableau avec une valeur jusqu'à la longueur spécifiée
  • list() - Assigne des variables comme si elles étaient un tableau
  • count() - Compte tous les éléments d'un tableau ou quelque chose d'un objet
  • range() - Crée un tableau contenant un intervalle d'éléments
  • foreach
  • Le type array

User Contributed Notes

razvan_bc at yahoo dot com 18-May-2020 06:49
an array can execute code.
i try this on php 7.4 (xampp version)

<?php

[
     $msg='HI GUYS !'
    ,print ($msg)
    ,(function()use ($msg){
        print 'here is php';
    })()
    ,print ' I`m just an array ,alive one'
];

?>
ayyappan dot ashok at gmail dot com 18-Apr-2016 06:26
The code bellow by dave@wp.pl:

$var_name='var';
$var=array(0,1,2,3,4);
echo $$var_name[2];

//prints NOTHING instead 2.
// prints 2 with PHP version 7.01 onwards

Note :
This results 2 with PHP version 7.01 onwards. Other versions throws a notice error
majkel 20-Apr-2015 09:13
During initialization php parses every value as expression. One can declare variables, do calculations, or even manipulate "current" array

<?php

$arr['A'] = [
    &$arr, // circular reference
    'key' => 'val',
    $arr['B'] = [ // declare array, insert key and then value
        'a' => 'b',
    ],
    ucfirst(strtolower('SOME TEXT')),
    true ? 'TRUE' : 'FALSE', // evaluate expression
    $x  = 3, // declare variable
    $x *= 3, // perform calculations
];

var_dump($arr);

// Output
/*
array(2) {
  'B' => array(1) {
    'a' => string(1) "b"
  }
  'A' => array(7) {
    [0] => array(2) {
      'B' => array(1) {
        ...
      }
      'A' => &array
    }
    'key' => string(3) "val"
    [1] => array(1) {
      'a' => string(1) "b"
    }
    [2] => string(9) "Some text"
    [3] => string(4) "TRUE"
    [4] => int(3)
    [5] => int(9)
  }
}
*/
?>
dave at wp dot pl 27-Feb-2015 03:55
The code bellow:

$var_name='var';
$var=array(0,1,2,3,4);
echo $$var_name[2];

prints NOTHING instead 2.
ole dot aanensen at gmail dot com 10-Jun-2014 08:13
As of PHP 5.4.x you can now use 'short syntax arrays' which eliminates the need of this function.

Example #1 'short syntax array'
<?php
    $a = [1, 2, 3, 4];
    print_r($a);
?>

The above example will output:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)

Example #2 'short syntax associative array'
<?php
    $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
    print_r($a);
?>

The above example will output:
Array
(
    [one] => 1
    [two] => 2
    [three] => 3
    [four] => 4
)
sergei dot solomonov at gmail dot com 02-Oct-2013 08:53
Consider:
file inc1.php
-------------
<?php
return 'key';

file inc2.php
-------------
<?php
return 'value';

Test:
<?php
$a = [
    include 'inc1.php' => include 'inc2.php'
];
var_dump($a);

/* It works!!!
array(1) {
  'key' =>
  string(5) "value"
}
*/
qeremy 07-Mar-2012 02:50
Some tricky functions;

<?php
function is_array_assoc($arr) {
    if (is_array($arr)) {
        foreach ($arr as $k => $v) {
            if (is_string($k) || (is_int($k) && $k < 0)) {
                return 1;
            }
        }
        return 0;
    }
    return -1;
}

function is_array_multi($arr) {
    return is_array($arr)
        ? (count($arr) != count($arr, COUNT_RECURSIVE) ? 1 : 0)
        : -1;
}

$arr[] = array("foo", "bar", 1.09);
$arr[] = array("red", "yellow", 1 => "foo");
$arr[] = array("red", "yellow", -1 => "foo");
$arr[] = array("x" => array("red", "yellow"), "y" => array("one", "two"));
$arr[] = array();
$arr[] = "s";

foreach ($arr as $a) {
    echo is_array_assoc($a) ."\n";
}
echo "\n";
foreach ($arr as $a) {
    echo is_array_multi($a) ."\n";
}
?>

0
0
1
1
0
-1

0
0
0
1
0
-1

<?php
function array_count($arr) {
    $r = 0;
    foreach ($arr as $k => $v) {
        if (is_array($v)) {
            $r++;
        }
    }
    return $r;
}

function array_count_all($arr, $r = 0) {
    foreach ($arr as $k => $v) {
        if (is_array($v)) {
            $r = array_count_all($v, $r);
            $r++;
        }
    }
    return $r;
}

$a = array("foo", "bar", 1.09, array(1,2,3), array("a" => "aaa"));
echo array_count($a); // 2

$a = array(
    "foo", "bar", 1.09,
    "x" => array(1,2,3),
    array("a" => "aaa", "b" => array(), "c" => array(""), "d" => array("")),
    "e" => array(""),
    "z" => array(""),
    "q" => array("", array()),
    "w" => array("lorem", 1 => "impsum", 18, "dolor", array("last as 11th array"))
);
echo array_count_all($a); // 11
?>
r0h4rd at gmail dot com 06-Feb-2011 02:59
"Quick and dirty" class to get an offset of multidimensional array by given path (sorry, that without comments).

<?php

    class ArrayAsPathException extends Exception {}

    class ArrayAsPath {
        protected
            $data = array(),
            $separator = '.';

        public function __construct (array $data = array()) {
            $this->data = $data;
        }

        public function set ($value, $path = null) {
            if (!isset($path)) {
                $this->data = $value;
            }

            $separator = $this->separator;
            $pathtoken = strtok($path, $separator);

            $code = '';
            $pices = '[\''.$pathtoken.'\']';
            while ($pathtoken !== false) {
                if (($pathtoken = strtok($separator)) !== false) {
                    $code .= 'if (!isset($this->data'.$pices.')) $this->data'.$pices.' = array(); ';
                    $pices .= '[\''.$pathtoken.'\']';
                } else {
                    $code .= 'return $this->data'.$pices.' = $value;';
                }
            }

            return eval($code);
        }

        public function get ($path = '', $default = null) {
            $result = $this->data;
            $separator = $this->separator;
            $pathtoken = strtok($path, $separator);

            while ($pathtoken !== false) {
                if (!isset($result[$pathtoken]) || is_string($result)) {
                    if (isset($default)) {
                        return $default;
                    }

                    throw new ArrayAsPathException ('Can\'t find "'.$pathtoken.'" in "'.$path.'"');
                }

                $result = $result[$pathtoken];
                $pathtoken = strtok($separator);
            }

            return $result ? $result : $default;
        }

        public function has ($path) {
            $result = $this->data;
            $separator = $this->separator;
            $pathtoken = strtok($path, $separator);

            while ($pathtoken !== false) {
                if (!isset($result[$pathtoken]) || is_string($result)) {
                    return false;
                }

                $result = $result[$pathtoken];
                $pathtoken = strtok($separator);
            }

            return true;
        }

        public function setSepatator ($separator) {
            $this->separator = $separator;
        }

        public function getSeparator ($separator) {
            return $this->separator;
        }
    }

?>

Code:
<?php

    $params = new ArrayAsPath;
    $params->set(array(
        'foo' => array(
            'bar' => array(
                'item' => 'Value'
            )
        )
    ));

    try {
        $params->set('test', 'foo.bar.far.new');
        printf(
            'Array:<pre>%s</pre>
            foo.bar.item:<pre>%s</pre>
            foo.bar.far:<pre>%s</pre>
            foo.bar.far.new<pre>%s</pre>',
            var_export($params->get(), true),
            var_export($params->get('foo.bar.item'), true),
            var_export($params->get('foo.bar.far'), true),
            var_export($params->get('foo.bar.far.new'), true)
        );
    } catch (ArrayAsPathException $e) {
        echo 'Oops! It seems that something is wrong. '.$e->getMessage();
    }

?>

Will display:
Array:
array (
  'foo' =>
  array (
    'bar' =>
    array (
      'item' => 'Value',
      'far' =>
      array (
        'new' => 'test',
      ),
    ),
  ),
)

foo.bar.item:
'Value'

foo.bar.far:
array (
  'new' => 'test',
)

foo.bar.far.new:
'test'
eugene at ultimatecms dot co dot za 03-Mar-2010 06:29
This is a useful way to get foreign key variables from a specific sql table.
This function can be used to include all relevant data from all relating tables:

<?php
function get_string_between($string, $start, $end){
         $string = " ".$string;
         $ini = strpos($string,$start);
         if($ini == 0)
                return $tbl;
         $ini += strlen($start);
         $len = strpos($string,$end,$ini) - $ini;
         return substr($string,$ini,$len);
}

function get_foreign_keys($tbl) {
        $query = query_getrow("SHOW CREATE TABLE ".mysql_escape_string($tbl));

        $dat = explode('CONSTRAINT',$query[1]);
        foreach($dat as $d => $a) {
                if(strpos($a,"FOREIGN KEY"))
                $data['keys'][] = array($tbl,get_string_between($a,"` FOREIGN KEY (`","`) REFERENCES"));
        }

        foreach($dat as $d => $a) {
                if(strpos($a,"REFERENCE"))
                $data['references'][] = explode('` (`',get_string_between($a,"REFERENCES `","`) ON"));
        }
        return $data;
}

//Example code:

        $data = get_foreign_keys('task_table');
        echo '<pre>';
        print_r($data);
        echo '</pre>';

?>

// $query[1] outputs:

CREATE TABLE `task_table` (
  `task_id` int(64) NOT NULL auto_increment,
  `ticket_id` int(64) NOT NULL,
  `task_type` varchar(64) NOT NULL,
  `comment` text,
  `assigned_to` int(11) default NULL,
  `dependant` int(64) default NULL,
  `resolved` int(1) default NULL,
  PRIMARY KEY  (`task_id`),
  KEY `ticket_id` (`ticket_id`,`dependant`),
  KEY `assigned_to` (`assigned_to`),
  KEY `task_dependant` (`dependant`),
  CONSTRAINT `task_table_ibfk_1` FOREIGN KEY (`ticket_id`) REFERENCES `tickets_table` (`ticket_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `task_table_ibfk_2` FOREIGN KEY (`assigned_to`) REFERENCES `contact_table` (`contact_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `task_table_ibfk_3` FOREIGN KEY (`dependant`) REFERENCES `task_table` (`task_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1

// $data outputs:
Array (
    [keys] => Array
        (
            [0] => Array
                (
                    [0] => task_table
                    [1] => ticket_id
                )

            [1] => Array
                (
                    [0] => task_table
                    [1] => assigned_to
                )

            [2] => Array
                (
                    [0] => task_table
                    [1] => dependant
                )
        )

    [references] => Array
        (
            [0] => Array
                (
                    [0] => tickets_table
                    [1] => ticket_id
                )

            [1] => Array
                (
                    [0] => contact_table
                    [1] => contact_id
                )

            [2] => Array
                (
                    [0] => task_table
                    [1] => task_id
                )
        )
)
kamil at navikam dot pl 03-Jun-2009 03:42
Easy function to unarray an array :-)
It will make $array['something'] => $something.
Usefull for making code more clear.

example of use:
<?
function unarray($row) {
    foreach($row as $key => $value) {
        global $$key;
        $$key = $value;
    }
}

$sql = mysql_query("SELECT * FROM `pracownicy`");
while ($row = mysql_fetch_assoc($sql)) {
    unarray($row);
    echo $idpracownika.'<br>'; //instead of $row['idpracownika']
}
?>
Marcel G 27-Apr-2009 03:49
I encountered the following but didn't see it documented/reported anywhere so I'll just mentioned it here.

As written in the manual:
"When index is omitted, an integer index is automatically generated, starting at 0. If index is an integer, next generated index will be the biggest integer index + 1".

This generated index has always the largest integer used as a key so far. So adding $a[5] = 'foo'; after an $a[10] = 'bar'; will not force the next generated index to be 6 but to be 11 as 10 was the highest index encountered until here.

Anyway, the following can happen:
<?php
$max_int = 2147483647; // Max value for integer on a 32-bit system
$arr = array();

$arr[1] = 'foo'; // New generated index will be 2
$arr[ $max_int ] = 'bar'; // Caution: Next generated index will be -2147483648 due to the integer overflow!
$arr[0] = 'bar'; // The highest value should be 2147483648 but due to the i-overflow it is -2147483648 so current index 0 is larger. The new generated index therefore is 1!
$arr[]  = 'failure'; // Warning: Cannot add element to the array as the next element is already occupied.
?>
jonberglund at gmail dot com 07-Jul-2008 09:25
The following function (similar to one above) will render an array as a series of HTML select options (i.e. "<option>...</option>"). The problem with the one before is that there was no way to handle <optgroup>, so this function solves that issue.

function arrayToSelect($option, $selected = '', $optgroup = NULL)
{
    $returnStatement = '';

    if ($selected == '') {
        $returnStatement .= '<option value="" selected="selected">Select one...</option>';
    }

    if (isset($optgroup)) {
        foreach ($optgroup as $optgroupKey => $optgroupValue) {
            $returnStatement .= '<optgroup label="' . $optgroupValue . '">';

            foreach ($option[$optgroupKey] as $optionKey => $optionValue) {
                if ($optionKey == $selected) {
                    $returnStatement .= '<option selected="selected" value="' . $optionKey . '">' . $optionValue . '</option>';
                } else {
                    $returnStatement .= '<option value="' . $optionKey . '">' . $optionValue . '</option>';
                }
            }

            $returnStatement .= '</optgroup>';
        }
    } else {
        foreach ($option as $key => $value) {
            if ($key == $selected) {
                $returnStatement .= '<option selected="selected" value="' . $key . '">' . $value . '</option>';
            } else {
                $returnStatement .= '<option value="' . $key . '">' . $value . '</option>';
            }
        }
    }

    return $returnStatement;
}

 So, for example, I needed to render a list of states/provinces for various countries in a select field, and I wanted to use each country name as an <optgroup> label. So, with this function, if only a single array is passed to the function (i.e. "arrayToSelect($stateList)") then it will simply spit out a bunch of "<option>" elements. On the other hand, if two arrays are passed to it, the second array becomes a "key" for translating the first array.

Here's a further example:

$countryList = array(
    'CA'        => 'Canada',
    'US'        => 'United States');

$stateList['CA'] = array(
    'AB'        => 'Alberta',
    'BC'        => 'British Columbia',
    'AB'        => 'Alberta',
    'BC'        => 'British Columbia',
    'MB'        => 'Manitoba',
    'NB'        => 'New Brunswick',
    'NL'        => 'Newfoundland/Labrador',
    'NS'        => 'Nova Scotia',
    'NT'        => 'Northwest Territories',
    'NU'        => 'Nunavut',
    'ON'        => 'Ontario',
    'PE'        => 'Prince Edward Island',
    'QC'        => 'Quebec',
    'SK'        => 'Saskatchewan',
    'YT'        => 'Yukon');

$stateList['US'] = array(
    'AL'        => 'Alabama',
    'AK'        => 'Alaska',
    'AZ'        => 'Arizona',
    'AR'        => 'Arkansas',
    'CA'        => 'California',
    'CO'        => 'Colorado',
    'CT'        => 'Connecticut',
    'DE'        => 'Delaware',
    'DC'        => 'District of Columbia',
    'FL'        => 'Florida',
    'GA'        => 'Georgia',
    'HI'        => 'Hawaii',
    'ID'        => 'Idaho',
    'IL'        => 'Illinois',
    'IN'        => 'Indiana',
    'IA'        => 'Iowa',
    'KS'        => 'Kansas',
    'KY'        => 'Kentucky',
    'LA'        => 'Louisiana',
    'ME'        => 'Maine',
    'MD'        => 'Maryland',
    'MA'        => 'Massachusetts',
    'MI'        => 'Michigan',
    'MN'        => 'Minnesota',
    'MS'        => 'Mississippi',
    'MO'        => 'Missouri',
    'MT'        => 'Montana',
    'NE'        => 'Nebraska',
    'NV'        => 'Nevada',
    'NH'        => 'New Hampshire',
    'NJ'        => 'New Jersey',
    'NM'        => 'New Mexico',
    'NY'        => 'New York',
    'NC'        => 'North Carolina',
    'ND'        => 'North Dakota',
    'OH'        => 'Ohio',
    'OK'        => 'Oklahoma',
    'OR'        => 'Oregon',
    'PA'        => 'Pennsylvania',
    'RI'        => 'Rhode Island',
    'SC'        => 'South Carolina',
    'SD'        => 'South Dakota',
    'TN'        => 'Tennessee',
    'TX'        => 'Texas',
    'UT'        => 'Utah',
    'VT'        => 'Vermont',
    'VA'        => 'Virginia',
    'WA'        => 'Washington',
    'WV'        => 'West Virginia',
    'WI'        => 'Wisconsin',
    'WY'        => 'Wyoming');

...

<select name="state" id="state"><?php echo arrayToSelect($stateList,'',$countryList) ?></select>
<select name="country" id="country"><?php echo arrayToSelect($countryList,'US') ?></select>
sebasg37 at gmail dot com 12-Feb-2008 11:32
Recursive function similar to print_r for describing anidated arrays in html <ol>. Maybe it's useful for someone.

<?php
function describeAnidatedArray($array)
{
    $buf = '';
    foreach($array as $key => $value)
    {
        if(is_array($value))
        {
            $buf .= '<ol>' . describeAnidatedArray($value) . '</ol>';
        }
        else
            $buf .= "<li>$value</li>";
    }
    return $buf;
}

// Example:
$array = array("a", "b", "c", array("1", "2", array("A", "B")), array("3", "4"), "d");

echo describeAnidatedArray($array);
?>

output:

# a
# b
# c

   1. 1
   2. 2
         1. A
         2. B

   1. 3
   2. 4

# d
jon hohle 16-Nov-2007 05:12
Here are shorter versions of sam barrow's functions. From a PHP perspective these are O(1) (without getting into what's going on in the interpreter), instead of O(n).

<?php
function randomKey(array $array)
{
    return randomElement(array_keys($array));
}

function randomElement(array $array)
{
    if (count($array) === 0)
    {
        trigger_error('Array is empty.',  E_USER_WARNING);
        return null;
    }

    $rand = mt_rand(0, count($array) - 1);
    $array_keys = array_keys($array);

    return $array[$array_keys[$rand]];
}
?>
Mike Mackintosh 29-Oct-2007 09:38
If you need to add an object as an array key, for example an object from Simple XML Parser, you can use the following.

File.XML
<?xml version="1.0" encoding="UTF-8"?>
<Settings type="General">
  <Setting name="SettingName">This This This</Setting>
</Settings>

The script:
<?php
$raw = $xml =  new SimpleXMLElement('File.XML');
foreach($raw->Setting as $A => $B)
{
    // Set Array From XML
    $Setting[(string) $B['name']] = (string)  $B[0];
}
?>
By telling the key to read the object as a string, it will let you set it.

Hope this helps someone out!
webmaster at phpemailformprocessor dot com 06-Aug-2006 09:48
When using an array to create a list of keys and values for a select box generator which will consist of states I found using "NULL" as an index and ""(empty value) as a value to be useful:

<?php

$states = array(
    0    => 'Select a State',
    NULL => '',
    1    => 'AL - Alabama',
    2    => 'AK - Alaska',
    # And so on ...
);

$select = '<select name="state" id="state" size="1">'."\r\n";

foreach($states as $key => $value){
    $select .= "\t".'<option value="'.$key.'">' . $value.'</option>'."\r\n";
}

$select .= '</select>';

echo $select;

?>

 This will print out:

<select name="state" id="state" size="1">
    <option value="0">Select a State</option>
    <option value=""></option>
    <option value="1">AL - Alabama</option>
    <option value="2">AK - Alaska</option>
    # And so on ...

</select>

Now a user has a blank value to select if they later decide to not provide their address in the form. The first two options will return TRUE when checked against the php function - EMPTY() after the form is submitted when processing the form
jupiter at nospam dot com 02-Jun-2006 03:33
<?php

// changes any combination of multiarray elements and subarrays
// into a consistent 2nd level multiarray, tries to preserves keys
function changeMultiarrayStructure($multiarray, $asc = 1) {
  if ($asc == 1) {  // use first subarrays for new keys of arrays
    $multiarraykeys = array_reverse($multiarray, true);
  } else {  // use the last array keys
    $multiarraykeys = $multiarray;  // use last subarray keys
  }  // end array reordering
  $newarraykeys = array();  // establish array
  foreach ($multiarraykeys as $arrayvalue) {  // build new array keys
    if (is_array($arrayvalue)) {  // is subarray an array
      $newarraykeys = array_keys($arrayvalue) + $newarraykeys;
    }  // if count(prevsubarray)>count(currentarray), extras survive
  }  // end key building loop
  foreach ($multiarray as $newsubarraykey => $arrayvalue) {
    if (is_array($arrayvalue)) {  // multiarray element is an array
      $i = 0;  // start counter for subarray key
      foreach ($arrayvalue as $subarrayvalue) {  // access subarray
        $newmultiarray[$newarraykeys[$i]][$newsubarraykey] = $subarrayvalue;
        $i++;  // increase counter
      }  // end subarray loop
    } else {  // multiarray element is a value
      foreach ($newarraykeys as $newarraykey) {  // new subarray keys
        $newmultiarray[$newarraykey][$newsubarraykey] = $arrayvalue;
      }  // end loop for array variables
    }  // end conditional
  }  // end new multiarray building loop
  return $newmultiarray;
}

// will change
$old = array('a'=>1,'b'=>array('e'=>2,'f'=>3),'c'=>array('g'=>4),'d'=>5);
// to
$new = array('e'=>array('a'=>1,'b'=>2,'c'=>4,'d'=>5),
  'f'=>array('a'=>1,'b'=>3,'d'=>5));

// note: if $asc parameter isn't default, last subarray keys used

?>

The new key/value assignment pattern is clearer with bigger arrays.
I use this to manipulate input/output data from my db. Enjoy.
bill at carneyco dot com 02-Feb-2006 08:42
I wanted to be able to control the flow of data in a loop instead of just building tables with it or having to write 500 select statements for single line items. This is what I came up with thanks to the help of my PHP brother in FL. Hope someone else gets some use out it.
<?

//set array variable
$results = array();

//talk to the db
$query = "SELECT * FROM yourtable";
$result = mysql_query($query) or die(mysql_error());

//count the rows and fields
$totalRows = mysql_num_rows($result);
$totalFields = mysql_num_fields($result);

//start the loop
for ( $i = 0; $i < $totalRows; ++$i ) {

//make it 2 dim in case you change your order
  $results[$i] = mysql_fetch_array($result);

//call data at will controlling the loop with the array
echo $results[your_row_id]['your_field_name']; }

//print the entire array to see what lives where
print_r($results);  ?>
php 07-Jan-2006 03:30
This function converts chunks of a string in an array:

function array_str($str, $len) {
  $newstr = '';
  for($i = 0; $i < strlen($str); $i++) {
    $newstr .= substr($str, $i, $len);
  }
  return $newstr;
}

use it as:

$str = "abcdefghilmn";
echo "<table width=\"100%\">\n";
foreach(array_str($str, 4) as $chunk) {
  echo "<tr><td>".$chunk."</td></tr>\n";
}
echo "</table>";

this prints:

------
abcd
------
efgh
------
ilmn
------

It don't use regular expressions. Please add this function to php :)
matthiasDELETETHIS at ansorgs dot de 31-May-2005 02:52
How to use array() to create an array of references rather than of copies? (Especially needed when dealing with objects.) I played around somewhat and found a solution: place & before the parameters of array() that shall be references. My PHP version is 4.3.10.

Demonstration:

<?php
$ref1 = 'unchanged';
$ref2 = & $ref1;

$array_of_copies = array($ref1, $ref2);
print_r($array_of_copies); // prints: Array ( [0] => unchanged [1] => unchanged )
$array_of_copies[0] = 'changed'; // $ref1 = 'changed'; is not equivalent, as it was _copied_ to the array
print_r($array_of_copies); // prints: Array ( [0] => changed [1] => unchanged )

$array_of_refs = array(& $ref1, & $ref2); // the difference: place & before arguments
print_r($array_of_refs); // prints: Array ( [0] => unchanged [1] => unchanged )
$array_of_refs[0] = 'changed'; // $ref1 = 'changed'; is equivalent as $array_of_refs[0] references $ref1
print_r($array_of_refs, true); // prints: Array ( [0] => changed [1] => changed )
?>
aissatya at yahoo dot com 16-May-2005 01:48
<?php

$foo = array('bar' => 'baz');
echo "Hello {$foo['bar']}!"; // Hello baz!

?>
<?php
$firstquarter = array(1 => 'January', 'February', 'March');
print_r($firstquarter);
?>
<?php
$fruits = array (
   "fruits"  => array("a" => "orange", "b" => "banana", "c" => "apple"),
   "numbers" => array(1, 2, 3, 4, 5, 6),
   "holes"  => array("first", 5 => "second", "third")
);
?>
brian at blueeye dot us 21-Apr-2005 05:34
If you need, for some reason, to create variable Multi-Dimensional Arrays, here's a quick function that will allow you to have any number of sub elements without knowing how many elements there will be ahead of time. Note that this will overwrite an existing array value of the same path.

<?php
// set_element(array path, mixed value)
function set_element(&$path, $data) {
    return ($key = array_pop($path)) ? set_element($path, array($key=>$data)) : $data;
}
?>

For example:

<?php
echo "<pre>";
$path = array('base', 'category', 'subcategory', 'item');
$array = set_element($path, 'item_value');
print_r($array);
echo "</pre>";
?>

Will display:
Array
(
    [base] => Array
        (
            [category] => Array
                (
                    [subcategory] => Array
                        (
                            [item] => item_value
                        )
                )
        )
)
mortoray at ecircle-ag dot com 18-Feb-2005 05:35
Be careful if you need to use mixed types with a key of 0 in an array, as several distinct forms end up being the same key:

$a = array();
$a[null] = 1;
$a[0] = 2;
$a['0'] = 3;
$a["0"] = 4;
$a[false] = 5;
$a[0.0] = 6;
$a[''] = 7;
$a[] = 8;

print_r( $a );

This will print out only 3 values: 6, 7, 8.
rdude at fuzzelish dot com 17-Feb-2005 01:35
If you are creating an array with a large number of static items, you will find serious performance differences between using the array() function and the $array[] construct. For example:
<?
 // Slower method
 $my_array = array(1, 2, 3, ? 500);

 // Faster method
 $my_array[] = 1;
 $my_array[] = 2;
 $my_array[] = 3;
 ?
 $my_array[] = 500;
?>
phpm at nreynolds dot me dot uk 11-Jan-2005 08:24
This helper function creates a multi-dimensional array. For example, creating a three dimensional array measuring 10x20x30: <?php $my_array = multi_dim(10, 20, 30); ?>

<?php

function multi_dim()
{
    $fill_value = null;

    for ($arg_index = func_num_args() - 1; $arg_index >= 0; $arg_index--) {
        $dim_size = func_get_arg($arg_index);
        $fill_value = array_fill(0, $dim_size, $fill_value);
    }

    return $fill_value;
}

?>
baZz 16-Oct-2003 03:27
Chek this out!!!. Suppose that you want to create an array like the following:
<?php
  $arr1 = (
    0 => array ("customer"=>"Client 1","Item a"),
    1 => array ("customer"=>"Client 2","Item b")
  );
?>
Seems prety easy, but what if you want to generate it dinamically woops!!!.  Imagine that you have a file with thousands of lines and each line is a purchase order from diferent clients:
<?php
/*function to add elements*/
function addArray(&$array, $id, $var)
{
    $tempArray = array( $var => $id);
    $array = array_merge ($array, $tempArray);
}
/*The same as above but the element is an array*/
function addArrayArr(&$array, $var, &$array1)
{
    $tempArray = array($var => $array1);
    $array = array_merge ($array, $tempArray);
}
/*labels of our array or heders of the file*/
$keyarr = array("customer","item");
/*info that may you read from a file line 1 and 2*/
$valarr0 = array("Client 1","Item a");
$valarr1 = array("Client 2","Item b");

$numofrows = 2;/*In our case is just two lines*/
$tmpArray = array();
for($i = 0; $i < $numofrows; $i++){
  $tmp = "valarr$i";
  $tmpvar = ${$tmp};/*Using var of vars tricky tricky*/
  foreach( $keyarr as $key=>$value){
    addArray($tmparr,$tmpvar[$key],$value);
  }
  addArrayArr($finalarr,$i,$tmparr);
} /*voila all it's perfectly ordered on finalarr*/

/*Here we just print the info but you can insert it into a database*/
echo "Customer: ".$finalarr[0]["customer"]."<br>";
echo "Item: ".$finalarr[0]["item"]."<br>";
echo "Customer: ".$finalarr[1]["customer"]."<br>";
echo "Item: ".$finalarr[1]["item"]."<br>";
?>

The lines above should print something like:
Customer: Client 1
Item: Item a
Customer: Client 2
Item: Item b
I hope someone find this useful.
TCross1 at hotmail dot com 03-Sep-2003 12:38
here is the sort of "textbook" way to output the contents of an array which avoids using foreach() and allows you to index & iterate through the array as you see fit:

<?php

$arrayName = array("apples", "bananas", "oranges", "pears");
$arrayLength = count($arrayName);

for ($i = 0; $i < $arrayLength; $i++){
    echo "arrayName at[" . $i . "] is: [" .$arrayName[$i] . "]<br>\n";
}

?>

enjoy!

-tim
10-May-2003 03:53
Similarly to a comment by stlawson at sbcglobal dot net on this page:
http://www.php.net/basic-syntax.instruction-separation

It is usually advisable to define your arrays like this:
$array = array(
     'foo',
     'bar',
);

Note the comma after the last element - this is perfectly legal. Moreover,
it's best to add that last comma so that when you add new elements to the
array, you don't have to worry about adding a comma after what used to be
the last element.

<?php
$array = array(
     'foo',
     'bar',
     'baz',
);
?>
marcel at labor-club dot de 24-Feb-2003 07:58
i tried to find a way to create BIG multidimensional-arrays. but the notes below only show the usage of it, or the creation of small arrays like $matrix=array('birne', 'apfel', 'beere');

for an online game, i use a big array (50x80) elements.
it's no fun, to write the declaration of it in the ordinary way.

here's my solution, to create an 2d-array, filled for example with raising numbers.

<?php
$matrix=array();
$sx=30;
$sy=40;
$i=1;
for ($y=0; $y<$sy; $y++)
{
    array_push($matrix,array());
    for ($x=0; $x<$sx; $x++)
    {
        array_push($matrix[$y],array());
        $matrix[$x][$y]=$i;
        $i++;
    }
}
?>

if there is a better way, plz send an email. i always want to learn more php!
MadLogic at Paradise dot net dot nz 31-Oct-2002 02:39
Heres a simple yet intelligent way of setting an array, grabbing the values from the array using a loop.

<?php
$ary = array("1"=>'One','Two',"3"=>'Three');
$a = '0'; $b = count($ary);
while ($a <= $b) {
  $pr = $ary[$a];
  print "$pr<br>";
  $a++;
}
?>
mads at __nospam__westermann dot dk 23-Oct-2002 07:39
In PHP 4.2.3 (and maybe earlier versions) arrays with numeric indexes may be initialized to start at a specific index and then automatically increment the index. This will save you having to write the index in front of every element for arrays that are not zero-based.

The code:

<?php
                  $a = array
        (
            21    => 1,
            2,
            3,
        );
    print '<pre>';
    print_r($a);
    print '</pre>';
?>

will print:

<?php
Array
(
    [21] => 1
    [22] => 2
    [23] => 3
)
?>
John 18-Jul-2002 11:48
Be careful not to create an array on top of an already existing variable:

<?php
$name = "John";
$name['last'] = "Doe";
?>

$name becomes "Dohn" since 'last' evaluates to the 0th position of $name.
Same is true for multi-arrays.
jay at ezlasvegas dot net 20-Apr-2002 04:21
If you want to create an array of a set size and you have PHP4, use
array_pad(array(), $SIZE, $INITIAL_VALUE); This can be handy if you wish
to initialize a bunch of variables at once:

list($Var1, $Var2, etc) = array_pad(array(), $NUMBER_OF_VARS,
$INITIAL_VALUE);

Jay Walker
Las Vegas Hotel Associate
http://www.ezlasvegas.net
jjm152 at hotmail dot com 10-Mar-2002 06:22
The easiest way to "list" the values of either a normal 1 list array or a multi dimensional array is to use a foreach() clause.

Example for 1 dim array:

<?php
   $arr = array( 1, 2, 3, 4, 5 );
   foreach ( $arr as $val ) {
       echo "Value: $Val\n";
      }
?>

For multi dim array:

<?php
     $arr = array( 1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four, 5 => 'five');
      foreach ( $arr as $key => $value ) {
       echo "Key: $key, Value: $value\n";
      }
?>

This is quite possibly the easiest way i've found to iterate through an array.
tobiasquinteiro at ig dot com dot br 29-Jan-2002 12:25
<?
        // This is a small script that shows how to use an multiple array
        for($x = 0;$x < 10;$x++){
                for($y = 0;$y < 10;$y++){
                        $mat[$x][$y] = "$x,$y";
                }
        }

        for($x = 0;$x < count($mat);$x++){
                for($y = 0;$y < count($mat[$x]);$y++){
                        echo    "mat[$x][$y]: " .
                                $mat[$x][$y] . " ";
                }
                echo "\n";
        }
?>
joshua dot e at usa dot net 24-May-2001 11:12
Here's a cool tip for working with associative arrays-
Here's what I was trying to accomplish:

I wanted to hit a DB, and load the results into an associative array, since I only had key/value pairs returned. I loaded them into an array, because I wanted to manipulate the data further after the DB select, but I didn't want to hit the DB more than necessary.

Here's how I did it:

<?php
//assume db connectivity
//load it all into the associative array
$sql = "SELECT key,value FROM table";
$result = mysql_query($sql);
while($row = mysql_fetch_row($result)) {
$myArray[$row[0]] = $row[1];
}
//now we expand it
while(list($key,$value) = each($myArray)) {
echo "$key : $value";
}
?>

I found this to be super efficient, and extremely cool.
slicky at newshelix dot com 20-Mar-2001 01:57
Notice that you can also add arrays to other arrays with the $array[] "operator" while the dimension doesn't matter.

Here's an example:
$x[w][x] = $y[y][z];
this will give you a 4dimensional assosiative array.
$x[][] = $y[][];
this will give you a 4dimensional non assosiative array.

So let me come to the point. This get interessting for shortening things up. For instance:

<?php
        foreach ($lines as $line){
            if(!trim($line)) continue;
            $tds[] = explode("$delimiter",$line);
        }
?>
rubein at earthlink dot net 26-Sep-2000 11:07
Multidimensional arrays are actually single-dimensional arrays nested inside other single-dimensional arrays.

$array[0] refers to element 0 of $array
$array[0][2] refers to element 2 of element 0 of $array.

If an array was initialized like this:

$array[0] = "foo";
$array[1][0] = "bar";
$array[1][1] = "baz";
$array[1][2] = "bam";

then:
is_array($array) = TRUE
is_array($array[0]) = FALSE
is_array($array[1]) = TRUE
count($array) = 2 (elements 0 and 1)
count($array[1] = 3 (elements 0 thru 2)

This can be really useful if you want to return a list of arrays that were stored in a file or something:

$array[0] = unserialize($somedata);
$array[1] = unserialize($someotherdata);

if $somedata["foo"] = 42 before it was serialized previously, you'd now have this:
$array[0]["foo"] = 42


Trie un tableau en ordre inverse et conserve l'association des index

  • « array
  • asort »
  • PHP Manual
  • Fonctions sur les tableaux
  • Trie un tableau en ordre inverse et conserve l'association des index

arsort

(PHP 4, PHP 5, PHP 7, PHP 8)

arsort — Trie un tableau en ordre inverse et conserve l'association des index

Description

arsort ( array &$array , int $flags = SORT_REGULAR ) : bool

arsort() trie le tableau array de telle manière que la corrélation entre les index et les valeurs soit conservée.

L'usage principal est lors de tri de tableaux associatifs où l'ordre des éléments est important.

Note:

Si deux membres se comparent comme égaux, leur ordre relatif dans le tableau trié n'est pas défini.

Liste de paramètres

array

Le tableau d'entrée.

flags

Le deuxième paramètre optionnel flags peut être utilisé pour modifier le comportement de tri en utilisant ces valeurs :

Type de drapeaux de tri :

  • SORT_REGULAR - compare items normally; the details are described in the comparison operators section
  • SORT_NUMERIC - compare les éléments numériquement
  • SORT_STRING - compare les éléments comme des chaînes de caractères
  • SORT_LOCALE_STRING - compare les éléments comme des chaînes de caractères, basé sur la locale courante. Ceci utilise la locale, qui peut être changée en utilisant setlocale()
  • SORT_NATURAL - compare les éléments comme des chaînes de caractères utilisant "l'ordre naturel" comme natsort()
  • SORT_FLAG_CASE - peut être combiné (OU bit à bit) avec SORT_STRING ou SORT_NATURAL pour trier les chaînes sans tenir compte de la casse

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec arsort()

<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
arsort($fruits);
foreach ($fruits as $key => $val) {
    echo "$key = $val\n";
}
?>

L'exemple ci-dessus va afficher :

a = orange
d = lemon
b = banana
c = apple

Les fruits ont été triés en ordre alphabétique inverse, et leurs index respectifs ont été conservés.

Voir aussi

  • asort() - Trie un tableau et conserve l'association des index
  • Les fonctions de tri des tableaux

User Contributed Notes

stephenakins at gmail dot com 09-Jun-2017 01:25
I have two servers; one running 5.6 and another that is running 7.  Using this function on the two servers gets me different results when all of the values are the same.

<?php

$list = json_decode('{"706":2,"703":2,"702":2,"696":2,"658":2}', true);

print_r($list);

arsort($list);
echo "<br>";

print_r($list);

?>

PHP 5.6 results:
Array ( [706] => 2 [703] => 2 [702] => 2 [696] => 2 [658] => 2 )
Array ( [658] => 2 [696] => 2 [702] => 2 [703] => 2 [706] => 2 )

PHP 7 results:
Array ( [706] => 2 [703] => 2 [702] => 2 [696] => 2 [658] => 2 )
Array ( [706] => 2 [703] => 2 [702] => 2 [696] => 2 [658] => 2 )
sebas2day 07-May-2012 02:52
If you are dealing with a multidimensional array you want to sort, then this might be helpfull:

<?php
function array_sort($arr){
    if(empty($arr)) return $arr;
    foreach($arr as $k => $a){
        if(!is_array($a)){
            arsort($arr); // could be any kind of sort
            return $arr;
        }else{
            $arr[$k] = array_sort($a);
        }
    }
    return $arr;
}
?>
FatBat 13-Oct-2011 01:40
Needed to get the index of the max/highest value in an assoc array.
max() only returned the value, no index, so I did this instead.

<?php
reset($x);   // optional.
arsort($x);
$key_of_max = key($x);   // returns the index.
?>
jordancdarwin at googlemail dot com 15-Dec-2007 02:21
A lot of people seem to trip up on this and ask me questions as to debugging. Bear in mind that this returns boolean, and does not return an array of affected items.

$array = array("One"=>1, "Three" => 3,"Two" =>2);
print_r(asort($array));

If successful, will return 1, and error if there is a string used. Useful to note so then people stop asking me :D
rodders_plonker at yahoo dot com 21-Aug-2000 06:43
I was having trouble with the arsort() function on an older version of PHP which was returning an error along the lines of 'wrong perameter count for function arsort' when I tried to use a flag for numeric sorting (2/SORT_NUMERIC).
I figured, as I only wanted to sort integers, I could pad numbers from the left to a specific length with 0's (using the lpad function provided by improv@magma.ca in the notes at http://www.php.net/manual/ref.strings.php).
A string sort then correctly sorts numerically (i.e. {30,2,10,21} becomes {030,021,010,002} not {30,21,2,10}) when echoing the number an (int)$string_name hides the leading 0's.

Made my day :).

Rodders.
morgan at anomalyinc dot com 24-Nov-1999 07:30
If you need to sort a multi-demension array, for example, an array such as

$TeamInfo[$TeamID]["WinRecord"]
$TeamInfo[$TeamID]["LossRecord"]
$TeamInfo[$TeamID]["TieRecord"]
$TeamInfo[$TeamID]["GoalDiff"]
$TeamInfo[$TeamID]["TeamPoints"]

and you have say, 100 teams here, and want to sort by "TeamPoints":

first, create your multi-dimensional array. Now, create another, single dimension array populated with the scores from the first array, and with indexes of corresponding team_id... ie
$foo[25] = 14
$foo[47] = 42
or whatever.
Now, asort or arsort the second array.
Since the array is now sorted by score or wins/losses or whatever you put in it, the indices are all hoopajooped.
If you just walk through the array, grabbing the index of each entry, (look at the asort example. that for loop does just that) then the index you get will point right back to one of the values of the multi-dimensional array.
Not sure if that's clear, but mail me if it isn't...
-mo


Trie un tableau et conserve l'association des index

  • « arsort
  • compact »
  • PHP Manual
  • Fonctions sur les tableaux
  • Trie un tableau et conserve l'association des index

asort

(PHP 4, PHP 5, PHP 7, PHP 8)

asort — Trie un tableau et conserve l'association des index

Description

asort ( array &$array , int $flags = SORT_REGULAR ) : bool

asort() trie le tableau array de telle manière que la corrélation entre les index et les valeurs soit conservée. L'usage principal est lors de tri de tableaux associatifs où l'ordre des éléments est important.

Note:

Si deux membres se comparent comme égaux, leur ordre relatif dans le tableau trié n'est pas défini.

Liste de paramètres

array

Le tableau d'entrée.

flags

Le deuxième paramètre optionnel flags peut être utilisé pour modifier le comportement de tri en utilisant ces valeurs :

Type de drapeaux de tri :

  • SORT_REGULAR - compare items normally; the details are described in the comparison operators section
  • SORT_NUMERIC - compare les éléments numériquement
  • SORT_STRING - compare les éléments comme des chaînes de caractères
  • SORT_LOCALE_STRING - compare les éléments comme des chaînes de caractères, basé sur la locale courante. Ceci utilise la locale, qui peut être changée en utilisant setlocale()
  • SORT_NATURAL - compare les éléments comme des chaînes de caractères utilisant "l'ordre naturel" comme natsort()
  • SORT_FLAG_CASE - peut être combiné (OU bit à bit) avec SORT_STRING ou SORT_NATURAL pour trier les chaînes sans tenir compte de la casse

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec asort()

<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
asort($fruits);
foreach ($fruits as $key => $val) {
    echo "$key = $val\n";
}
?>

L'exemple ci-dessus va afficher :

c = apple
b = banana
d = lemon
a = orange

Les fruits ont été triés par ordre alphabétique, et leurs index respectifs ont été conservés.

Voir aussi

  • arsort() - Trie un tableau en ordre inverse et conserve l'association des index
  • Les fonctions de tri des tableaux

User Contributed Notes

marty8zhang at gmail dot com 06-Oct-2020 04:26
"This function sorts an array such that array indices maintain their correlation with the array elements they are associated with."

Note this sentence in the description has a quite important implication especially when you're working with an originally non-indexed (or say integer-indexed) array and JSON encoding/decoding.
I'm not reporting this as a bug, because the end result does fit into the description.

<?php

$myArray = ['small_image', 'image'];
var_dump(json_encode($myArray)); // string(23) "["small_image","image"]"
var_dump(is_object($myArray)); // bool(false)

asort($myArray);
$myJson = json_encode($myArray);
var_dump($myJson); // string(31) "{"1":"image","0":"small_image"}"
var_dump(is_object($myArray)); // bool(false)

/*
 * class stdClass#1 (2) {
 *     public $1 =>
 *     string(5) "image"
 *     public $0 =>
 *     string(11) "small_image"
 * }
 */
var_dump(json_decode($myJson));

?>
Jesse K 31-Aug-2020 07:49
'asort' is fine for sorting arrays in English, but if accented characters exist in the array then it is better to use the 'asort' method of PHP's Collator class:
https://www.php.net/manual/en/class.collator.php

$collator = new \Collator('fr_CA');
$collator->asort($french_list);

There are options for using `setlocale()` to control `asort` behaviour, but it isn't reliable across systems.
For instance, in my development environment I only have access to the following locals:

$ locale -a
C
C.UTF-8
POSIX
elhanafi123 at gmail dot com 20-Sep-2018 09:47
I have written this function so its sort an multidimensional array with a specific key.

<?php
function sort_array($array, $sort_value, $reverse = false){
    $value = $result = array();

    foreach($array as $key => $rows){
        $value[$key] = strtolower($rows[$sort_value]);
    }

    if($reverse == true){
        arsort($value);
    }else{
        asort($value);
    }

    foreach($value as $keys => $null){
        $result[] = $array[$keys];
    }

    return $result;
}
?>

Examples

<?php

$array = array(array('a' => 'foo'), array('a' => 'foo4'), array('a' => 'foo2'), array('a' => 'foo3'));
print_r($array);
//Array ( [0] => Array ( [a] => foo ) [1] => Array ( [a] => foo4 ) [2] => Array ( [a] => foo2 ) [3] => Array ( [a] => foo3 ) )

print_r(sort_array($array, 'a'));
//Array ( [0] => Array ( [a] => foo ) [1] => Array ( [a] => foo2 ) [2] => Array ( [a] => foo3 ) [3] => Array ( [a] => foo4 ) )

print_r(sort_array($array, 'a', true));
//Array ( [0] => Array ( [a] => foo4 ) [1] => Array ( [a] => foo3 ) [2] => Array ( [a] => foo2 ) [3] => Array ( [a] => foo ) )

?>
aditycse at gmail dot com 07-Aug-2015 12:41
/*
 * Name : Aditya Mehrotra
 * Email: aditycse@gmail.com
 */
//Example for sorting by values for an alphanumeric array also having case-sensitive data
$exampleArray1 = $exampleArray2 = array(
    0 => 'example1',
    1 => 'Example10',
    2 => 'example12',
    3 => 'Example2',
    4 => 'example3',
    5 => 'EXAMPLE10',
    6 => 'example10'
);

//default sorting
asort($exampleArray1);

// alphanumeric with case-sensitive data sorting by values
asort($exampleArray2, SORT_STRING | SORT_FLAG_CASE | SORT_NATURAL);

//output of defaut sorting
print_r($exampleArray1);
/*
 * output of default sorting
  Array
  (
  [5] => EXAMPLE10
  [1] => Example10
  [3] => Example2
  [0] => example1
  [6] => example10
  [2] => example12
  [4] => example3
  )
 */

print_r($exampleArray2);
/*
 * output of alphanumeric with case-sensitive data sorting by values
 Array
(
    [0] => example1
    [3] => Example2
    [4] => example3
    [5] => EXAMPLE10
    [1] => Example10
    [6] => example10
    [2] => example12
)
 */
stephen [ at ] brooksie-net [ dot ] co [ dot ] uk 01-Mar-2013 04:37
It is obviously necessary to log the keys used as so we don't overwrite previous entries in the array ;o)

N.B. this also effects the timings, but still faster than the alternatives :

     * int : 0.00159    (ms)
     * str : 0.00092    (ms)

<?php
private function _keySort(Array $data)
    {
        $keys = array();

        foreach($data as $row) {

            $keyIncrement =
                (!isset($keys[$row[$this->_orderField]]))
                    ? $keys[$row[$this->_orderField]] = 0
                    : ++$keys[$row[$this->_orderField]];

            $tempArray[$row[$this->_orderField].$keyIncrement] = $row;
        }

        if ($this->_orderDirection == 'DESC') {
            krsort($tempArray, SORT_NATURAL | SORT_FLAG_CASE );
        } else {
            ksort($tempArray, SORT_NATURAL | SORT_FLAG_CASE);
        }

        return $tempArray;

    }
?>
nick ([AT]) nickyost ([DOT]) com 15-Sep-2011 03:32
This function can be used to sort multidimensional arrays with almost no work whatsoever by using the individual values within the custom sort function.

This function passes the entire child element even if it is not a string. If it is an array, as would be the case in multidimensional arrays, it will pass the whole child array as one parameter.

Therefore, do something elegant like this:

<?php
     // Sort the multidimensional array
     usort($results, "custom_sort");
     // Define the custom sort function
     function custom_sort($a,$b) {
          return $a['some_sub_var']>$b['some_sub_var'];
     }
?>

This does in 4 lines what other functions took 40 to 50 lines to do. This does not require you to create temporary arrays or anything. This is, for me, a highly preferred solution.

Hope it helps!
Anon 06-May-2011 05:37
Case insensitive sort in one line:

<?php

array_multisort(array_map('strtolower', $array), $array);

?>
rick at toewsweb dot net 28-Apr-2011 04:40
On sorting by value first, then by key (cf., 2008-01-31 notes by mike at clear-link dot com):

What occurred to me to solve this problem was to extract the keys and values into separate arrays, then use array_multisort to get the desired order:

Ex:
<?php
$kvpairs = array('noun' => 'thought', 'animal' => 'fish', 'abstract' => 'thought', 'food' => 'fish', 'verb' => 'fish');
print "before:\n";
print_r($kvpairs);

// Essentially, one line of code is all that's needed for the sort:
array_multisort(array_values($kvpairs), array_keys($kvpairs), $kvpairs);

print "after:\n";
print_r($kvpairs);
?>

before:
Array
(
    [noun] => thought
    [animal] => fish
    [abstract] => thought
    [food] => fish
    [verb] => fish
)
after:
Array
(
    [animal] => fish
    [food] => fish
    [verb] => fish
    [abstract] => thought
    [noun] => thought
)

Of course, array_multisort allows you to specify sort order (SORT_ASC, SORT_DESC) and sort type (SORT_REGULAR, SORT_STRING, SORT_NUMERIC) for each array you pass it.
Eran 21-Apr-2009 05:15
i made this sample multi dimensional array sort to someone who needed to read lines from a text file instead of using sql - order by statement.

the idea is to take the key and sort(order) the specific column and then order the entire of the array as the selected column asort returned.

<?php
/**
 *
 * This sample is reading text data
 * and perform a sort to a 2 dimensional array
 * just like a normal sql do to "order by asc"
 *
 */

$foo = array();

/*
# SORT_REGULAR - compare items normally (don't change types)
# SORT_NUMERIC - compare items numerically
# SORT_STRING - compare items as strings
*/
$sort_by = SORT_REGULAR;

/*
# 0 - order by name column
# 1 - order by age column
# 2 - order by rank column
# 3 - order by color column
*/
$order_by = 1;

// source file
$line_of_text[1] = 'a1name|f2age|h3rank|jcolor';
$line_of_text[2] = 'b1name|d2age|i3rank|k4color';
$line_of_text[0] = 'c1name|e2age|g3rank|l4color';

// make array
for ($x=0; $x<=2; $x++)
{
    $line = explode('|',$line_of_text[$x]);

    // save it by coulmns otherwise it will saved like rows
    for ($i=0; $i<=3; $i++) {
          $foo[$i][$x] = $line[$i];
    }
}

// get the key order
$a = $foo[$order_by];

// sort
asort($a, $sort_by);

// start print
echo "<table cellpudding=0 cellspacing=0 border=1>\n";
        echo "<tr>\n";
          echo "<td>key</td>\n";
          echo "<td>name</td>\n";
          echo "<td>age</td>\n";
          echo "<td>rank</td>\n";
          echo "<td>color</td>\n";
        echo "</tr>\n";

// print by key order
foreach ($a as $k => $v) {
    echo "<tr>\n";
      echo "<td>$k</td>\n";
      // you can print here a for loop (0 to num of columns[=3])
      echo "<td>".$foo[0][$k]."</td>\n";
      echo "<td>".$foo[1][$k]."</td>\n";
      echo "<td>".$foo[2][$k]."</td>\n";
      echo "<td>".$foo[3][$k]."</td>\n";
    echo "</tr>\n";
}
echo "</table>\n";
?>
bakatamas at freemail dot hu 15-Feb-2008 02:34
Dear mike at clear-link dot com!

I needed a case insensitive version of your function. It is still not perfect as I have to do something with country specific characters (öüóoúéáuíÖÜÓOÚÉÁUÍ)

function akisort(&$array,$valrev=false,$keyrev=false)
    {
    if ($valrev)
        {
        arsort($array);
        }
        else
        {
        asort($array);
        };
    $vals = array_count_values($array);
    $i = 0;
    foreach ($vals AS $val=>$num)
        {
        $first = array_splice($array,0,$i);
        $tmp = array_splice($array,0,$num);
        $tmp2 = array();
        foreach($tmp as $key => $value)
            {
            $tmp2[] = $key;
            $number = $value;
            };
        natcasesort($tmp2);
        reset($tmp2);
        print_r($tmp2);
        unset($tmp);
        foreach($tmp2 as $key => $value)
            {
            $tmp[$value] = $number;
            };
        if($keyrev)
            {
            $tmp = array_reverse($tmp, true);
            };
        $array = array_merge($first,$tmp,$array);
        unset($tmp);
        $i = $i+$num;
        };
};
mike at clear-link dot com 31-Jan-2008 03:56
Small typo in the aksort function I just submitted. Here's the entire thing again, with the correction noted:

<?php
function aksort(&$array,$valrev=false,$keyrev=false) {
  if ($valrev) { arsort($array); } else { asort($array); }
  $vals = array_count_values($array);
    $i = 0;
    foreach ($vals AS $val=>$num) {
        $first = array_splice($array,0,$i);
        $tmp = array_splice($array,0,$num);
        if ($keyrev) { krsort($tmp); } else { ksort($tmp); }
        $array = array_merge($first,$tmp,$array);
        unset($tmp);
        $i = $i+$num;
        // Fixed from previous post: $i = $num;
    }
}
?>
mike at clear-link dot com 31-Jan-2008 03:23
For a recent project I needed to sort an associative array by value first, and then by key if a particular value appeared multiple times. I wrote this function to accomplish the task. Note that the parameters default to sort ascending on both keys and values, but allow granular control over each.

<?php
function aksort(&$array,$valrev=false,$keyrev=false) {
  if ($valrev) { arsort($array); } else { asort($array); }
    $vals = array_count_values($array);
    $i = 0;
    foreach ($vals AS $val=>$num) {
        $first = array_splice($array,0,$i);
        $tmp = array_splice($array,0,$num);
        if ($keyrev) { krsort($tmp); } else { ksort($tmp); }
        $array = array_merge($first,$tmp,$array);
        unset($tmp);
        $i = $num;
    }
}

// Example
$tmp = array('ca'=>1,'cb'=>2,'ce'=>1,'pa'=>2,'pe'=>1);

// Standard asort
asort($tmp);
print_r($tmp);

// Sort value ASC, key ASC
aksort($tmp);
print_r($tmp);

// Sort value DESC, key ASC
aksort($tmp,true);
print_r($tmp);

// Sort value DESC, key DESC
aksort($tmp,true,true);
print_r($tmp);

// Results
Array
(
    [pe] => 1
    [ca] => 1
    [ce] => 1
    [cb] => 2
    [pa] => 2
)
Array
(
    [ca] => 1
    [ce] => 1
    [pe] => 1
    [cb] => 2
    [pa] => 2
)
Array
(
    [cb] => 2
    [pa] => 2
    [ca] => 1
    [ce] => 1
    [pe] => 1
)
Array
(
    [pa] => 2
    [cb] => 2
    [pe] => 1
    [ce] => 1
    [ca] => 1
)
mzvarik at gmail dot com 16-Jan-2008 09:29
I noticed that my function mentioned earlier is very misleading - somebody please delete that note!

This is how you sort:
<?php
setlocale (LC_ALL, 'czech');
$array = array("a", "c", "c");
usort ($array, 'strcoll');
print_r($array);
?>
przemekkus [at] interia [dot] pl 02-Nov-2007 06:34
Function written by a dot brandon at chello dot nl has an error  - wrong variable name. It should be:

if($rev) arsort($named_hash,$flags=0) ;

instead of

if($reverse) arsort($named_hash,$flags=0) ;
a dot brandon at chello dot nl 25-Jun-2007 07:18
I use this for quasi-SQL orderby. Loosely based on smileaf. Any good for you nerds?

<?

function named_records_sort($named_recs, $order_by, $rev=false, $flags=0)
{// Create 1-dimensional named array with just
 // sortfield (in stead of record) values
    $named_hash = array();
     foreach($named_recs as $key=>$fields)
             $named_hash["$key"] = $fields[$order_by];

 // Order 1-dimensional array,
 // maintaining key-value relations
    if($reverse) arsort($named_hash,$flags=0) ;
    else asort($named_hash, $flags=0);

 // Create copy of named records array
 // in order of sortarray
    $sorted_records = array();
    foreach($named_hash as $key=>$val)
           $sorted_records["$key"]= $named_recs[$key];

return $sorted_records;} // named_recs_sort()

function show_sorted_records($named_recs, $order_by, $rev=false, $flags=0)
{$sorted_records=named_records_sort($named_recs, $order_by, $rev, $flags);
foreach($sorted_records as $name=>$fields)
  {echo "<b>$name</b>   ";
   foreach($fields as $field=>$val)
          echo "$field = $val "; echo "<br>";}
} // show_sorted_records()

$girl_friends=array();
$girl_friends["Anna"]=
array("born"=>'1989-08-22',"cupsize"=>'B-',"IQ"=>105, "daddy"=>'rich');
$girl_friends["Zoe"]
=array("born"=>'1978-03-11',"cupsize"=>'C#',"IQ"=>130, "daddy"=>'poor');
$girl_friends["Lilly"]
=array("born"=>'1985-06-16',"cupsize"=>'DD',"IQ"=>90, "daddy"=>'nasty');

$order_by="cupsize"; echo "And the winners are: <br>";
show_sorted_records($girl_friends, $order_by, true);

?>
gunnar at taljaren dot se 14-Jun-2007 01:00
for ($i=0;$i<5;$i++)
   $values[] = $i;
asort($values);

works, but
for ($i=0;$i<5;$i++)
   $values[$i] =$i;
asort($values);
doesn't!
smileaf at smileaf dot org 24-Jan-2007 06:34
Ok I was mistaken, after re-reading the previous post the ".$key" is important. What caused the sorting issue for me wasn't that at all. But rather something else.
doing an: asort($records, $flags); before returning fixes the sorting problems.
The sorting problem I was refearing to causes a character based sorting done on numeric data.
so instead of:
1
2
3
...
10
12
20
It was returned back as
1
10
12
2
20
3
...
basically what I was trying to fix in the first place.
richard at happymango dot me dot uk 23-Nov-2006 03:52
This is a fixed version of the same function I posted below. Now it will handle duplicate entries in the sorted field. EG: If there were two records that had the name Heathrow it would still work.

<?php

function record_sort($records, $field, $reverse=false)
{
    $hash = array();

    foreach($records as $key => $record)
    {
        $hash[$record[$field].$key] = $record;
    }

    ($reverse)? krsort($hash) : ksort($hash);

    $records = array();

    foreach($hash as $record)
    {
        $records []= $record;
    }

    return $records;
}

?>
richard at happymango dot me dot uk 22-Nov-2006 03:35
This is a function to sort an indexed 2D array by a specified sub array key, either ascending or descending.

It is usefull for sorting query results from a database by a particular field after the query has been returned

This function can be quite greedy. It recreates the array as a hash to use ksort() then back again

By default it will sort ascending but if you specify $reverse as true it will return the records sorted descending

<?php

function record_sort($records, $field, $reverse=false)
{
    $hash = array();

    foreach($records as $record)
    {
        $hash[$record[$field]] = $record;
    }

    ($reverse)? krsort($hash) : ksort($hash);

    $records = array();

    foreach($hash as $record)
    {
        $records []= $record;
    }

    return $records;
}

// Example below

$airports = array
(
    array( "code" => "LHR", "name" => "Heathrow" ),
    array( "code" => "LGW", "name" => "Gatwick" ),
);

printf("Before: <pre>%s</pre>", print_r($airports, true));

$airports = record_sort($airports, "name");

printf("After: <pre>%s</pre>", print_r($airports, true));

?>

Example Outputs:

Before: Array
(
    [0] => Array ( [code] => LHR, [name] => Heathrow )
    [1] => Array ( [code] => LGW, [name] => Gatwick )
)

After: Array
(
    [0] => Array ( [code] => LGW, [name] => Gatwick )
    [1] => Array ( [code] => LHR, [name] => Heathrow )
)
php at web-in-time dot com 05-Sep-2006 02:47
acecream's function works fine, especially with the spectre extension.

nevertheless sometimes the index values have to be kept. To achieve this, just replace:

$sorted_arr[] = $array[$arr_key];

with:

$sorted_arr[$arr_key] = $array[$arr_key];
rojaro 23-Jun-2004 07:38
Advanced sort array by second index function, which produces ascending (default) or descending output and uses optionally natural case insensitive sorting (which can be optionally case sensitive as well).
Only the first two arguments are required.

<?php

function sabsi ($array, $index, $order='asc', $natsort=FALSE, $case_sensitive=FALSE) {
  if(is_array($array) && count($array)>0) {
    foreach(array_keys($array) as $key) $temp[$key]=$array[$key][$index];
    if(!$natsort) ($order=='asc')? asort($temp) : arsort($temp);
    else {
      ($case_sensitive)? natsort($temp) : natcasesort($temp);
      if($order!='asc') $temp=array_reverse($temp,TRUE);
    }
    foreach(array_keys($temp) as $key) (is_numeric($key))? $sorted[]=$array[$key] : $sorted[$key]=$array[$key];
    return $sorted;
  }
  return $array;
}

?>
spectre at hellfish dot NOSPAM dot org 28-Apr-2003 09:54
that works nicely, tho it breaks the result-array up if one or more of arrays indexes are deleted before sorting. this one should fix it up:

change:
for ($i = 0; $i < sizeof($array); $i++) {

to:
foreach ($array as $i => $k) {
mbevan at marginsoftware dot com 03-Dec-2002 01:25
Nevermind... use my last note as a quick tip: if you wish to keep the keys, use asort() and arsort() in place of sort() and rsort().
31-Jul-2002 06:48
Similar to above but for an array of arrays instead of an array of objects.

<?php
function aasort($x,$var,$cmp='strcasecmp'){
  if ( is_string($var) ) $var = "'$var'";
  uasort($x,
    create_function('$a,$b',
      'return '.$cmp.'( $a['.$var.'],$b['.$var.']);')
  );
  return $x;
}
?>
phzzzt .a.t. acm .d.o.t. org 31-Jul-2002 06:32
Similar to above but for an array of arrays instead of an array of objects.

<?php
function aasort($x,$var,$cmp='strcasecmp'){
  if ( is_string($var) ) $var = "\'$var\'";
  uasort($x,
    create_function('$a,$b',
      'return '.$cmp.'( $a['.$var.'],$b['.$var.']);')
  );
  return $x;
}
?>
salchicha at cable dot net dot co 03-Apr-2002 01:23
Here's one I whipped up to allow you to sort an array of a specific class by a member or function:

<?php
// Sort a class by one of its members (even lowercase!!!)
function casort($arr, $var) {
   $tarr = array();
   $rarr = array();
   for($i = 0; $i < count($arr); $i++) {
      $element = $arr[$i];
      $tarr[] = strtolower($element->{$var});
   }

   reset($tarr);
   asort($tarr);
   $karr = array_keys($tarr);
   for($i = 0; $i < count($tarr); $i++) {
      $rarr[] = $arr[intval($karr[$i])];
   }

   return $rarr;
}
?>

It works very well. For example, I have a Room class with members title, isActive(), date, etc. I can sort an array by casort($rooms, "title") or casort($rooms, "isActive()") and it'll work.
rcwang at cmu dot edu 02-Mar-2002 05:42
Here's my version of sorting multi-dimensional array by 2nd index.
Feel free to change the code to suit your needs.

<?php
function aSortBySecondIndex($multiArray, $secondIndex) {
    while (list($firstIndex, ) = each($multiArray))
        $indexMap[$firstIndex] = $multiArray[$firstIndex][$secondIndex];
    asort($indexMap);
    while (list($firstIndex, ) = each($indexMap))
        if (is_numeric($firstIndex))
            $sortedArray[] = $multiArray[$firstIndex];
        else $sortedArray[$firstIndex] = $multiArray[$firstIndex];
    return $sortedArray;
}
?>
freeman at generalresources dot com 04-May-2001 04:51
The asortbyindex($sortarray, $index) looks like sort not asort. The key of the $sortarray was changed.
sweetland at whoadammit dot com 15-Aug-2000 12:02
Here's a little routine I whipped up to sort multi-dimensional arrays:
<?php
/**
 ** comesafter ($s1, $s2)
 **
 ** Returns 1 if $s1 comes after $s2 alphabetically, 0 if not.
 **/

function comesafter ($s1, $s2) {
        /**
         ** We don't want to overstep the bounds of one of the strings and segfault,
         ** so let's see which one is shorter.
         **/

        $order = 1;

        if (strlen ($s1) > strlen ($s2)) {
                $temp = $s1;
                $s1 = $s2;
                $s2 = $temp;
                $order = 0;
        }

        for ($index = 0; $index < strlen ($s1); $index++) {
                /**
                 ** $s1 comes after $s2
                 **/

                if ($s1[$index] > $s2[$index]) return ($order);

                /**
                 ** $s1 comes before $s2
                 **/

                if ($s1[$index] < $s2[$index]) return (1 - $order);
        }

        /**
         ** Special case in which $s1 is a substring of $s2
         **/

        return ($order);
}

/**
 ** asortbyindex ($sortarray, $index)
 **
 ** Sort a multi-dimensional array by a second-degree index. For instance, the 0th index
 ** of the Ith member of both the group and user arrays is a string identifier. In the
 ** case of a user array this is the username; with the group array it is the group name.
 ** asortby
 **/

function asortbyindex ($sortarray, $index) {
        $lastindex = count ($sortarray) - 1;
        for ($subindex = 0; $subindex < $lastindex; $subindex++) {
                $lastiteration = $lastindex - $subindex;
                for ($iteration = 0; $iteration < $lastiteration;    $iteration++) {
                        $nextchar = 0;
                        if (comesafter ($sortarray[$iteration][$index], $sortarray[$iteration + 1][$index])) {
                                $temp = $sortarray[$iteration];
                                $sortarray[$iteration] = $sortarray[$iteration + 1];
                                $sortarray[$iteration + 1] = $temp;
                        }
                }
        }
        return ($sortarray);
}
?>

It's a bit long with all the comments, but I hope it helps.
bwuhlman at tallships dot ca 02-Aug-2000 03:01
Well, actually, asort has *two* annoying features.

It works perfectly well sorting hashes (or associative arrays, as you might have it), but doggedly refuses to sort regular arrays maintaining index assocation. Kind've makes sense, but the docs don't explicitly say you can't do it.

Urgggh.
jacko at kring dot co dot uk 24-Feb-2000 11:26
asort has one anoying feature, it ignores any default or implicit order in the data.  i.e. if two elements of an array contain "banana" then it is not garanteed that the first will still be the first after the sort.
This makes the Burrows-Wheeler block sort a bit of a pain to impliment, with a trailing string having to be appended to all strings before sorting, and removed after sorting. To maintain the so called "banana" order.


Crée un tableau à partir de variables et de leur valeur

  • « asort
  • count »
  • PHP Manual
  • Fonctions sur les tableaux
  • Crée un tableau à partir de variables et de leur valeur

compact

(PHP 4, PHP 5, PHP 7, PHP 8)

compact — Crée un tableau à partir de variables et de leur valeur

Description

compact ( array|string $var_name , array|string ...$var_names ) : array

Crée un tableau à partir de variables et de leur valeur.

Pour chacun des arguments varname, ..., compact() recherche une variable avec un même nom dans la table courante des symboles, et l'ajoute dans le tableau, de manière à avoir la relation nom => 'valeur de variable'. En bref, c'est le contraire de la fonction extract().

Note:

Avant PHP 7.3, toutes les chaînes qui ne sont pas définies était ignorées en silence.

Liste de paramètres

var_name
var_names

compact() accepte différents paramètres varname. Les paramètres peuvent être des variables contenant des chaînes, ou un tableau de chaînes, qui peut contenir d'autres tableaux de noms de variables, que compact() traitera récursivement.

Valeurs de retour

Retourne le tableau de sortie contenant toutes les variables ajoutées.

Erreurs / Exceptions

compact() émet une erreur de niveau E_NOTICE si une chaîne donnée fait référence à une variable non définie.

Historique

Version | Description
7.3.0 | compact() émet maintenant une erreur de niveau E_NOTICE si une chaîne donnée fait référence à une variable non définie. Autrefois, ces chaînes ont été silencieusement ignorées.

Exemples

Exemple #1 Exemple avec compact()

<?php
$city  = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", $location_vars);
print_r($result);
?>

L'exemple ci-dessus va afficher :

Array
(
    [event] => SIGGRAPH
    [city] => San Francisco
    [state] => CA
)

Notes

Note: Erreur commune

Parce que les variables variables ne doivent pas être utilisées avec les tableaux superglobaux dans des fonctions, les tableaux Superglobaux ne doivent pas être passés dans la fonction compact().

Voir aussi

  • extract() - Importe les variables dans la table des symboles

User Contributed Notes

lekiagospel at gmail dot com 13-Jan-2020 01:20
Consider these two examples. The first as used in the manual, and  the second a slight variation of it.

Example #1

<?php
$city  = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", $location_vars);
print_r($result);
?>

Example #1 above  will output:

Array
(
    [event] => SIGGRAPH
    [city] => San Francisco
    [state] => CA
)

Example #2

<?php
$city  = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", "location_vars");
print_r($result);
?>

Example #2 above will output:

Array
(
    [event] => SIGGRAPH

    [location_vars] => Array
        (
            [0] => city
            [1] => state
        )

)

In the first example, the value of the variable $location_values (which is an array containing city, and state) is passed to compact().

In the second example, the name of the variable $location_vars  (i.e  without the '$' sign) is passed to compact() as a string. I hope this further clarifies the points made in the manual?
jmarkmurph at yahoo dot com 26-Jan-2016 01:45
So compact('var1', 'var2') is the same as saying array('var1' => $var1, 'var2' => $var2) as long as $var1 and $var2 are set.
Robc 19-Jan-2011 03:16
The description says that compact is the opposite of extract() but it is important to understand that it does not completely reverse extract().  In particluar compact() does not unset() the argument variables given to it (and that extract() may have created).  If you want the individual variables to be unset after they are combined into an array then you have to do that yourself.
M Spreij 24-May-2007 06:10
Can also handy for debugging, to quickly show a bunch of variables and their values:

<?php
print_r(compact(explode(' ', 'count acw cols coldepth')));
?>

gives

Array
(
    [count] => 70
    [acw] => 9
    [cols] => 7
    [coldepth] => 10
)


Compte tous les éléments d'un tableau ou quelque chose d'un objet

  • « compact
  • current »
  • PHP Manual
  • Fonctions sur les tableaux
  • Compte tous les éléments d'un tableau ou quelque chose d'un objet

count

(PHP 4, PHP 5, PHP 7, PHP 8)

count — Compte tous les éléments d'un tableau ou quelque chose d'un objet

Description

count ( Countable|array $value , int $mode = COUNT_NORMAL ) : int

Compte tous les éléments d'un tableau ou quelque chose d'un objet.

Pour les objets, count() retourne le nombre de propriétés non-statiques, sans tenir compte de la visibilité. Si SPL est disponible, vous pouvez utiliser la fonction count() en implémentant l'interface Countable. Cette interface a exactement une méthode, Countable::count(), qui retourne la valeur retournée par la fonction count().

Reportez-vous à la section sur les Tableaux du manuel, pour plus de détails sur le fonctionnement des tableaux en PHP.

Liste de paramètres

value

Un tableau ou un objet Countable.

mode

Si le paramètre optionnel mode vaut COUNT_RECURSIVE (ou 1), count() va compter récursivement les tableaux. C'est particulièrement pratique pour compter le nombre d'éléments d'un tableau.

Attention

La fonction count() peut détecter les récursions afin d'éviter les boucles infinies, mais émettra une alerte de type E_WARNING à chaque fois qu'une boucle infinie surviendra (dans le cas où un tableau contient lui-même plus d'une boucle infinie) et retournera un compteur plus grand que l'attendu.

Valeurs de retour

Retourne le nombre d'éléments dans value. Quand le paramètre n'est ni un tableau, ni un objet qui implémente l'interface Countable, 1 sera retourné. Il y a néanmoins une exception : si le paramètre value vaut null, 0 sera retourné.

Exemples

Exemple #1 Exemple avec count()

<?php
$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
var_dump(count($a));

$b[0]  = 7;
$b[5]  = 9;
$b[10] = 11;
var_dump(count($b));

var_dump(count(null));

var_dump(count(false));
?>

L'exemple ci-dessus va afficher :

int(3)
int(3)

Warning: count(): Parameter must be an array or an object that implements Countable in … on line 12 // as of PHP 7.2
int(0)

Warning: count(): Parameter must be an array or an object that implements Countable in … on line 14 // as of PHP 7.2
int(1)

Exemple #2 Exemple de récursivité avec count()

<?php
$food = array('fruits' => array('orange', 'banana', 'apple'),
              'veggie' => array('carrot', 'collard', 'pea'));

// count récursif
echo count($food, COUNT_RECURSIVE); // affiche 8

// count normal
echo count($food); // affiche 2

?>

Historique

Version | Description
7.2.0 | count() va maintenant générer un avertissement sur des types dénombrables non valides sont passés au paramètre value.

Voir aussi

  • is_array() - Détermine si une variable est un tableau
  • isset() - Détermine si une variable est déclarée et est différente de null
  • empty() - Détermine si une variable est vide
  • strlen() - Calcule la taille d'une chaîne
  • is_countable() - Vérifie si le contenu de la variable est une valeur dénombrable

User Contributed Notes

vojtaripa at gmail dot com 25-Jun-2020 12:29
To get the count of the inner array you can do something like:

$inner_count = count($array[0]);
echo ($inner_count);
max at schimmelmann dot org 08-Mar-2020 12:12
In special situations you might only want to count the first level of the array to figure out how many entries you have, when they have N more key-value-pairs.

<?php

$data = [
    'a' => [
        'bla1' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ],
        'bla2' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ],
        'bla3' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ],
        'bla4' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ],
    ],
    'b' => [
        'bla1' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ],
        'bla2' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ],
    ],
    'c' => [
        'bla1' => [
            0 => 'asdf',
            1 => 'asdf',
            2 => 'asdf',
        ]
    ]
];
$count = array_sum(array_values(array_map('count', $data)));
// will return int(7)
var_dump($count);

// will return 31
var_dump(count($data, 1));
?>
XavDeb 30-Jan-2020 10:59
If you want to know the sub-array containing the MAX NUMBER of values in a 3 dimensions array, here is a try (maybe not the nicest way, but it works):

function how_big_is_the_biggest_sub ($array)  {
   // we parse the 1st level
   foreach ($array AS $key => $array_lvl2) {
         //within level 2, we count the 3d levels max
            $lvl2_nb = array_map( 'count',  $array_lvl2) ;
            $max_nb = max($lvl2_nb);
         // we store the matching keys, it might be usefull
            $max_key = array_search($max_nb, $lvl2_nb);
            $max_nb_all[$max_key.'|'.$key] = $max_nb;
        }
       // now we want the max from all levels 2, so one more time
        $real_max = max($max_nb_all);
        $real_max_key = array_search($real_max, $max_nb_all);
        list($real_max_key2, $real_max_key1) = explode('|', $real_max_key);
                // preparing result
        $biggest_sub['max'] = $real_max;
        $biggest_sub['key1'] = $real_max_key1;
        $biggest_sub['key2'] = $real_max_key2;

        return $biggest_sub;
}
/*
$cat_poids_max['M']['Juniors'][] = 55;
$cat_poids_max['M']['Juniors'][] = 61;
$cat_poids_max['M']['Juniors'][] = 68;
$cat_poids_max['M']['Juniors'][] = 76;
$cat_poids_max['M']['Juniors'][] = 100;

$cat_poids_max['M']['Seniors'][] = 55;
$cat_poids_max['M']['Seniors'][] = 60;
$cat_poids_max['M']['Seniors'][] = 67;
$cat_poids_max['M']['Seniors'][] = 75;
$cat_poids_max['M']['Seniors'][] = 84;
$cat_poids_max['M']['Seniors'][] = 90;
$cat_poids_max['M']['Seniors'][] = 100;
//....
$cat_poids_max['F']['Juniors'][] = 52;
$cat_poids_max['F']['Juniors'][] = 65;
$cat_poids_max['F']['Juniors'][] = 74;
$cat_poids_max['F']['Juniors'][] = 100;

$cat_poids_max['F']['Seniors'][] = 62;
$cat_poids_max['F']['Seniors'][] = 67;
$cat_poids_max['F']['Seniors'][] = 78;
$cat_poids_max['F']['Seniors'][] = 86;
$cat_poids_max['F']['Seniors'][] = 100;
*/
$biggest_sub = how_big_is_the_biggest_sub($cat_poids_max);
echo "<li> ".$biggest_sub['key1']." ==> ".$biggest_sub['key2']." ==> ".$biggest_sub['max']; // displays : M ==> Seniors ==> 7
Anonymous 05-Oct-2019 05:52
For a Non Countable Objects

$count = count($data);
print "Count: $count\n";

Warning:  count(): Parameter must be an array or an object that implements Countable in example.php on line 159

#Quick fix is to just cast the non-countable object as an array..

$count = count((array) $data);
print "Count: $count\n";

Count: 250
jerome dot gds at gmail dot com 20-Sep-2019 12:53
to end the debate: count() is the same as empty()

test code below:

results on my computer:

count : double(0.81396999359131)
empty : double(0.81621310710907)

using isset($test[0]) is a bit slower than empty;
test without adding value to the array in function ****Test: still the same.

<?php

function average(array $test)
{
    $sum = 0;
    foreach($test as $value) {
        $sum += $value;
    }

    return $sum;
}

function countTest(array $test)
{
    $i = 0;
    while ($i++ < 1000000) {
        count($test);
        $test["lol$i"] = "teset$i";
    }
}

function emptyTest(array $test)
{
    $i = 0;
    while ($i++ < 1000000) {
        empty($test);
        $test["lol$i"] = "teset$i";
    }
}

$test = [];
$i = 0;
while ($i++ < 20000000) {
    $test[] = $i;
}

$j = 10;
$value = $j;
$count = [];
$isEmpty = [];
while ($j--) {
    $time = microtime(true);
    countTest($test);
    $count[] = microtime(true) - $time;

    $time = microtime(true);
    emptyTest($test);
    $isEmpty[] = microtime(true) - $time;
}

var_dump(average($count) / $value);
var_dump(average($isEmpty) / $value);
lucasfsmartins at gmail dot com 07-Mar-2019 11:26
If you are on PHP 7.2+, you need to be aware of "Changelog" and use something like this:

<?php
$countFruits = is_array($countFruits) || $countFruits instanceof Countable ? count($countFruits) : 0;
?>

You can organize your code to ensure that the variable is an array, or you can extend the Countable so that you don't have to do this check.
flavioaugusto dot br at gmail dot com 01-Mar-2019 02:55
Criada para contar quantos níveis um array multidimensional possui.

function count_multiLevel($matrix, $_LEVEL = 0){

        /* Variáveis de recursão */
        $_COUNT = $_LEVEL;

        /* Verifica se o ARRAY foi instanciado */
        if (is_setVar($matrix)){

            /* Verifica se a variável é um ARRAY */
            if(is_array($matrix)){

                /* Loop de elementos da matriz*/
                foreach ($matrix as $elements => $value) {

                    /* Auxiliar para verificação posterior */
                    $_AUX = $_COUNT;

                    /* Verifiando os Nós */
                    if (is_array($matrix[$elements])) {
                        $_COUNT = count_multiLevel($matrix[$elements], $_LEVEL+1);
                    }
                    /* Cereja do bolo */
                    if($_AUX > $_COUNT)
                        $_COUNT = $_AUX;
                }
                /* Retorn do resultado da operação */
                return $_COUNT;

            }else{
                /* Em casos que o valor passado não seja uma matriz/array */
                return -1;
            }
        }
    }
buyatv at gmail dot com 27-Jan-2017 09:16
You can not get collect sub array count when use the key on only one sub array in an array:

$a = array("a"=>"appple", b"=>array('a'=>array(1,2,3),'b'=>array(1,2,3)));
$b = array("a"=>"appple", "b"=>array(array('a'=>array(1,2,3),'b'=>array(1,2,3)), array(1,2,3),'b'=>array(1,2,3)), array('a'=>array(1,2,3),'b'=>array(1,2,3))));

echo count($a['b']);  // 2 NOT 1, expect 1
echo count($b['b']);  // 3,   expected
buyatv at gmail dot com 26-Jan-2017 10:32
You can not get collect sub array count when there is only one sub array in an array:

$a = array ( array ('a','b','c','d'));
$b = array ( array ('a','b','c','d'), array ('e','f','g','h'));

echo count($a);  // 4 NOT 1, expect 1
echo count($b);  // 2,   expected
php_count at cubmd dot com 22-Nov-2016 03:12
All the previous recursive count solutions with $depth option would not avoid infinite loops in case the array contains itself more than once.
Here's a working solution:

<?php
    /**
     * Recursively count elements in an array. Behaves exactly the same as native
     * count() function with the $depth option. Meaning it will also add +1 to the
     * total count, for the parent element, and not only counting its children.
     * @param $arr
     * @param int $depth
     * @param int $i (internal)
     * @return int
     */
    public static function countRecursive(&$arr, $depth = 0, $i = 0) {
        $i++;
        /**
         * In case the depth is 0, use the native count function
         */
        if (empty($depth)) {
            return count($arr, COUNT_RECURSIVE);
        }
        $count = 0;
        /**
         * This can occur only the first time when the method is called and $arr is not an array
         */
        if (!is_array($arr)) {
            return count($arr);
        }

        // if this key is present, it means you already walked this array
        if (isset($arr['__been_here'])) {
            return 0;
        }

        $arr['__been_here'] = true;

        foreach ($arr as $key => &$value) {
            if ($key !== '__been_here') {
                if (is_array($value) && $depth > $i) {
                    $count += self::countRecursive($value, $depth, $i);
                }

                $count++;
            }
        }

        // you need to unset it when done because you're working with a reference...
        unset($arr['__been_here']);
        return $count;
    }
?>
ThisIsNotImportant 17-Dec-2015 03:10
About 2d arrays, you have many way to count elements :

<?php
$MyArray = array ( array(1,2,3),
                   1,
                   'a',
                   array('a','b','c','d') );

// All elements
echo count($MyArray ,COUNT_RECURSIVE);  // output 11 (9 values + 2 arrays)

// First level elements
echo count($MyArray );                  // output 4 (2 values+ 2 arrays)

// Both level values, but only values
echo(array_sum(array_map('count',$MyArray ))); //output 9 (9 values)

// Only second level values
echo (count($MyArray ,COUNT_RECURSIVE)-count($MyArray )); //output 7 ((all elements) - (first elements))
?>
pied-pierre 04-Jun-2015 05:27
A function of one line to find the number of elements that are not arrays, recursively :

function count_elt($array, &$count=0){
  foreach($array as $v) if(is_array($v)) count_elt($v,$count); else ++$count;
  return $count;
}
JumpIfBelow 05-May-2015 02:18
As I see in many codes, don't use count to iterate through array.
Onlyranga says you could declare a variable to store it before the for loop.
I agree with his/her approach, using count in the test should be used ONLY if you have to count the size of the array for each loop.

You can do it in the for loop too, so you don't have to "search" where the variable is set.
e.g.
<?php
    $array = [1, 5, 'element'];
    for($i = 0, $c = count($array); $i < $c; $i++)
        var_dump($array[$i]);
?>
onlyranga at gmail dot com 28-Apr-2014 02:14
[Editor's note: array at from dot pl had pointed out that count() is a cheap operation; however, there's still the function call overhead.]

If you want to run through large arrays don't use count() function in the loops , its a over head in performance,  copy the count() value into a variable and use that value in loops for a better performance.

Eg:

// Bad approach

for($i=0;$i<count($some_arr);$i++)
{
    // calculations
}

// Good approach

$arr_length = count($some_arr);
for($i=0;$i<$arr_length;$i++)
{
    // calculations
}
Gerd Christian Kunze 11-Dec-2013 12:56
Get maxWidth and maxHeight of a two dimensional array..?

Note:
1st dimension = Y (height)
2nd dimension = X (width)
e.g. rows and cols in database result arrays

<?php
$TwoDimensionalArray = array( 0 => array( 'key' => 'value', ...), ... );
?>

So for Y (maxHeight)
<?php
$maxHeight = count( $TwoDimensionalArray )
?>

And for X (maxWidth)
<?php
$maxWidth = max( array_map( 'count',  $TwoDimensionalArray ) );
?>

Simple? ;-)
danny at dannymendel dot com 13-Jun-2007 01:14
I actually find the following function more useful when it comes to multidimension arrays when you do not want all levels of the array tree.

// $limit is set to the number of recursions
<?php
function count_recursive ($array, $limit) {
    $count = 0;
    foreach ($array as $id => $_array) {
        if (is_array ($_array) && $limit > 0) {
            $count += count_recursive ($_array, $limit - 1);
        } else {
            $count += 1;
        }
    }
    return $count;
}
?>
alexandr at vladykin dot pp dot ru 08-Nov-2006 04:28
My function returns the number of elements in array for multidimensional arrays subject to depth of array. (Almost COUNT_RECURSIVE, but you can point on which depth you want to plunge).

<?php
  function getArrCount ($arr, $depth=1) {
      if (!is_array($arr) || !$depth) return 0;

     $res=count($arr);

      foreach ($arr as $in_ar)
         $res+=getArrCount($in_ar, $depth-1);

      return $res;
  }
?>


Retourne l'élément courant du tableau

  • « count
  • each »
  • PHP Manual
  • Fonctions sur les tableaux
  • Retourne l'élément courant du tableau

current

(PHP 4, PHP 5, PHP 7, PHP 8)

current — Retourne l'élément courant du tableau

Description

current ( array|object $array ) : mixed

Chaque tableau entretient un pointeur interne, qui est initialisé lorsque le premier élément est inséré dans le tableau.

Liste de paramètres

array

Le tableau.

Valeurs de retour

current() ne fait que retourner l'élément courant pointé par le pointeur interne du tableau array. current() ne déplace pas le pointeur. Si le pointeur est au-delà du dernier élément de la liste, current() retourne false.

Avertissement

Cette fonction peut retourner false, mais elle peut aussi retourner une valeur équivalent à false. Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour exacte de cette fonction.

Historique

Version | Description
7.0.0 | array est maintenant toujours passé par valeur. Précédemment à cette version,il était passé par référence si possible et par valeur dans les autres cas.

Exemples

Exemple #1 Exemple d'utilisation de current()

<?php
$transport = array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport);    // $mode = 'bike';
$mode = current($transport); // $mode = 'bike';
$mode = prev($transport);    // $mode = 'foot';
$mode = end($transport);     // $mode = 'plane';
$mode = current($transport); // $mode = 'plane';

$arr = array();
var_dump(current($arr)); // bool(false)

$arr = array(array());
var_dump(current($arr)); // array(0) { }
?>

Notes

Note: Il n'est pas possible de distinguer la fin d'un tableau ou le résultat de l'appel current() sur un tableau vide, à partir de l'élément bool false. Pour traverser correctement un tableau qui peut contenir l'élément false, voyez la fonction foreach(). Pour continuer d'utiliser current() et vérifier correctement si la valeur est réellement un élément du tableau, la key() de l'élément current() devrait être comparée strictement différente de l'élément null.

Voir aussi

  • end() - Positionne le pointeur de tableau en fin de tableau
  • key() - Retourne une clé d'un tableau associatif
  • each() - Retourne chaque paire clé/valeur d'un tableau
  • prev() - Recule le pointeur courant de tableau
  • reset() - Remet le pointeur interne de tableau au début
  • next() - Avance le pointeur interne d'un tableau

User Contributed Notes

leozmm at outlook dot com 24-Sep-2019 08:02
Array can be passed by both REFERENCE and EXPRESSION on `current`, because current doesn't move array's internal pointer,
this is not true for other functions like: `end`, `next`, `prev` etc.

<?php
    function foo() {return array(1,2,3);}
    echo current(foo());  // this print '1'
    echo end(foo());      // this print error: Only variables should be passed by reference
?>
xedin dot unknown at gmail dot com 10-Jul-2018 01:28
Array functions, such as `current()` and `rewind()` will work on `Traversable` as well, PHP 5.0 - 7.3, but not in HHVM:

<?php

$queue = new ArrayIterator(array('adasdasd'));
reset($queue);
$current = current($queue);
var_dump($current);

?>

See https://3v4l.org/VjCHR
pdarmis at gmail dot com 06-Aug-2017 06:22
Based on this example http://php.net/manual/en/function.current.php#116128 i would like to add the following.  As Vasily points out in his example
<?php
$prices = array(
    0 => '1300990',
    1 => '500',
    2 => '600'
);
foreach($prices as $key => $price){
    if($price < 1000){
        unset($prices[$key]);
    }
}

var_dump(current($prices)); // bool(false)
?>
The above example will not work and return false for version of PHP between 5.2.4 and 5.6.29. The issue is not present on PHP versions >= 7.0.1
A different workaround (at least from Vasily's example) would be to use reset() before using current() in order to reset the array pointer to start.
<?php
$prices = array(
    0 => '1300990',
    1 => '500',
    2 => '600'
);
foreach($prices as $key => $price){
    if($price < 1000){
        unset($prices[$key]);
    }
}
reset($prices);
var_dump(current($prices)); // string(7) "1300990"
?>
jodevweb at gmail dot com 16-Sep-2016 02:50
As Sergey stated a long time ago in this notes, when adding to the array using the brackets syntax, current won't return the last added value. Instead of moving the pointer with end(), you simply can get the last value with <?php $my_array[count($my_array) - 1] ?> (only applies to a non-associative array).
Vasily Yudin (st-2 at mail dot ru) 12-Nov-2014 08:51
If you do current() after using uset() on foreach statement, you can get FALSE in PHP version 5.2.4 and above.
There is example:
<?php
$prices = array(
    0 => '1300990',
    1 => '500',
    2 => '600'
);
foreach($prices as $key => $price){
    if($price < 1000){
        unset($prices[$key]);
    }
}

var_dump(current($prices)); // bool(false)
?>
If you do unset() without foreach? all will be fine.
<?php
$prices = array(
    0 => '1300990',
    1 => '500',
    2 => '600'
);
unset($prices[1]);
unset($prices[2]);

var_dump(current($prices));
?>
Pratip Ghosh 14-May-2014 05:55
If we unset any element from an array, and then try the current function, I noted it returned FALSE. To overcome this limitation, you can use array_values function to re-order the tree.
strate at yandex dot com 30-Oct-2013 07:11
Note, that you can pass array by expression, not only by reference (as described in doc).

<?php
var_dump( current( array(1,2,3) ) ); // (int) 1
?>
michael at squiloople dot com 10-Jan-2012 07:44
current() also works on objects:

<?php

  echo current((object) array('one', 'two')); // Outputs: one

?>
aefxx 15-May-2008 08:39
A simple copy function that not only copies the given array but ensures the copy's pointer is set to the exact same position:

<?php
function array_copy(&array)
{
    $key = key($array);
    $copy = $array;

    while (($copy_key = key($copy)) !== NULL) {
        if ($copy_key == $key) break;
        next($copy);
    }

    return $copy;
}
?>

That's all ... bye.
gregory at gregory dot net 27-Feb-2008 09:07
It took me a while to figure this out, but there is a more consistent way to figure out whether you really went past the end of the array, than using each().

You see, each() gets the value BEFORE advancing the pointer, and next() gets the value AFTER advancing the pointer. When you are implementing the Iterator interface, therefore, it's a real pain in the behind to use each().

And thus, I give you the solution:
To see if you've blown past the end of the array, use key($array) and see if it returns NULL. If it does, you're past the end of the array -- keys can't be null in arrays.

Nifty, huh? Here's how I implemented the Iterator interface in one of my classes:

<?php

/**
 * DbRow file
 * @package PalDb
 */

/**
 * This class lets you use Db rows and object-relational mapping functionality.
 */

class DbRow implements Iterator
{
    /**
     * The DbResult object that gave us this row through fetchDbRows
     * @var DbResult
     */
    protected $result;

    /**
     * The fields of the row
     * @var $fields
     */
    protected $fields;

    /**
     * Constructor
     *
     * @param PDOStatement $stmt
     *  The PDO statement object that this result uses
     * @param DbResult $result
     *  The result that produced this row through fetchDbRows
     */
    function __construct($result)
    {
        $this->result = $result;
    }

    /**
     * Get the DbResult object that gave us this row through fetchDbRows
     * @return DbResult
     *
     * @return unknown
     */
    function getResult()
    {
        return $this->result;
    }

    function __set(
        $name,
        $value)
    {
        $this->fields[$name] = $value;
    }

    function __get(
        $name)
    {
        if (isset($this->fields[$name]))
            return $this->fields[$name];
        else
            return null;
    }

    /**
     * Iterator implementation - rewind
     */
    function rewind()
    {
        $this->beyondLastField = false;
        return reset($this->fields);
    }

    function valid()
    {
        return !$this->beyondLastField;
    }

    function current()
    {
        return current($this->fields);
    }

    function key()
    {
        return key($this->fields);
    }

    function next()
    {
        $next = next($this->fields);
        $key = key($this->fields);
        if (isset($key)) {
            return $next[1];
        } else {
            $this->beyondLastField = true;
            return false; // doesn't matter what we return here, see valid()
        }
    }

    private $beyondLastField = false;
};

Hope this helps someone.
vaclav dot sir at gmail dot com 13-Aug-2007 09:23
To that "note": You won't be able to distinguish the end of an array from a boolean FALSE element, BUT you can distinguish the end from a NULL value of the key() function.

Example:
<?php
if (key($array) === null) {
    echo "You are in the end of the array.";
} else {
    echo "Current element: " . current($array);
}
?>
mdeng at kabenresearch dot com 23-Apr-2004 11:04
For large array(my sample was 80000+ elements), if you want to traverse the array in sequence, using array index $a[$i] could be very inefficient(very slow). I had to switch to use current($a).
vitalib at 012 dot net dot il 02-Dec-2003 02:10
Note that by copying an array its internal pointer is lost:

<?php
$myarray = array(0=>'a', 1=>'b', 2=>'c');
next($myarray);
print_r(current($myarray));
echo '<br>';
$a = $myarray;
print_r(current($a));
?>

Would output 'b' and then 'a' since the internal pointer wasn't copied. You can cope with that problem using references instead, like that:

<?php
$a =& $myarray;
?>
retestro_REMOVE at SPAM_esperanto dot org dot il 01-Mar-2003 06:31
The docs do not specify this, but adding to the array using the brackets syntax:
     <?php $my_array[] = $new_value; ?>
will not advance the internal pointer of the array. therefore, you cannot use current() to get the last value added or key() to get the key of the most recently added element.

You should do an end($my_array) to advance the internal pointer to the end ( as stated in one of the notes on end() ), then

    <?php
     $last_key = key($my_array);  // will return the key
     $last_value = current($my_array);  // will return the value
    ?>

If you have no need in the key, $last_value = end($my_array) will also do the job.

- Sergey.


Retourne chaque paire clé/valeur d'un tableau

  • « current
  • end »
  • PHP Manual
  • Fonctions sur les tableaux
  • Retourne chaque paire clé/valeur d'un tableau

each

(PHP 4, PHP 5, PHP 7)

each — Retourne chaque paire clé/valeur d'un tableau

Avertissement

Cette fonctionnalité est OBSOLÈTE à partir de PHP 7.2.0 et a été SUPPRIMÉE à partir de PHP 8.0.0.

Description

each ( array|object &$array ) : array

each() retourne la paire clé/valeur courante du tableau array et avance le pointeur de tableau.

Après chaque appel à each(), le pointeur de tableau est déplacé au prochain élément, ou au-delà dernier élément, lorsqu'on arrive à la fin. Vous devez utiliser reset() si vous voulez traverser le tableau à nouveau avec each().

Liste de paramètres

array

Le tableau d'entrée.

Valeurs de retour

Retourne la paire clé/valeur courante du tableau array et avance le pointeur de tableau. Cette paire est retournée dans un tableau de 4 éléments, avec les clés 0, 1, key, et value. Les éléments 0 et key contiennent le nom de la clé et 1 et value contiennent la valeur.

Si le pointeur interne de tableau est au-delà de la fin du tableau, each() retourne false.

Exemples

Exemple #1 Exemple avec each()

<?php
$foo = array("bob", "fred", "jussi", "jouni", "egon", "marliese");
$bar = each($foo);
print_r($bar);
?>

$bar contient maintenant les clés/valeurs suivantes :

Array
(
    [1] => bob
    [value] => bob
    [0] => 0
    [key] => 0
)

<?php
$foo = array("Robert" => "Bob", "Seppo" => "Sepi");
$bar = each($foo);
print_r($bar);
?>

$bar contient maintenant les clés/valeurs suivantes :

Array
(
    [1] => Bob
    [value] => Bob
    [0] => Robert
    [key] => Robert
)

each() est typiquement utilisée en conjonction avec list() pour passer en revue un tableau. Par exemple :

Exemple #2 Passer en revue un tableau avec each()

<?php
$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);
while (list($key, $val) = each($fruit)) {
    echo "$key => $val\n";
}
?>

L'exemple ci-dessus va afficher :

a => apple
b => banana
c => cranberry

Attention

Assigner un tableau à une autre variable remet le pointeur du tableau original à zéro. À cause de ce comportement, nous aurions pu provoquer une boucle infinie dans notre exemple si nous avions assigné $fruit à une autre variable dans notre boucle.

Avertissement

each() accepte également des objets, mais peut retourner un résultat non-attendu. Aussi, il n'est pas recommandé d'utiliser cette fonction sur des objets.

Voir aussi

  • key() - Retourne une clé d'un tableau associatif
  • list() - Assigne des variables comme si elles étaient un tableau
  • current() - Retourne l'élément courant du tableau
  • reset() - Remet le pointeur interne de tableau au début
  • next() - Avance le pointeur interne d'un tableau
  • prev() - Recule le pointeur courant de tableau
  • foreach
  • Itération d'objet

User Contributed Notes

man13or at hotmail dot fr 03-Feb-2020 07:49
Hello, since each() and list() often "betray" very old applications, I simply recommend not to use them anymore.

If you want to assign variables based on an associative array,
Replace this:

while(list ($key, $value) = each ($my_array)) {
    $$key = $value;
}

with this:

foreach ($my_array as $key => $value) {
    $$key = $value;
}
Henk Poley 30-Aug-2019 07:30
Rector has an automated fix ('ListEachRector') to migrate away from `each()`:

https://github.com/rectorphp/rector/blob/master/docs/AllRectorsOverview.md#listeachrector

If you look at the code example you'll see this is even quite simple to do by hand.
phpcoder at gmail dot com 25-Jun-2019 09:36
each was deprecated because it exposed too much of the internal implementation details, blocking language development. ("We can't do X because it would break each().")

https://wiki.php.net/rfc/deprecations_php_7_2#each

If you want an array pointer, maintain it yourself. Probably a good idea anyway, because then it's visible in the code.
Anonymous 04-Aug-2018 01:12
An odd function to deprecate. If you're keeping track of an array pointer in a collection outside a foreach loop you don't care about performance and the utility of this function is core.

Instead you must call two functions: current() and then next() to replicate its behaviour.
13975001197 at 163 dot com 08-Apr-2018 03:58
In PHP 7.2 we can use foreach() to replace each(), such as:

foreach($array as $key => $value) {
    //do something
}
janhsh at tiscalinet dot be 24-Sep-2017 01:57
The following example is invalid in PHP 7 :

<?php
$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);
while (list($key, $val) = each($fruit)) {
    echo "$key => $val\n";
}
?>

The correct writing is
<?php
$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);
while ($Item= each($fruit)) {
    $key=$Item[0];
    $val=$Item[1];
    echo "$key => $val\n";
}
?>

This is because the "list ()" command on the left no longer works in PHP 7 and there is no replacement command.
Which is very deplorable because this command was strongly used and allowed in a simple way to assign variables from array.
ayyappan dot ashok at gmail dot com 18-Apr-2016 09:21
/* Iterating using objects via each */

class SAI
{
   public function __toString()
   {
          return __CLASS__;
   }
}
$a = new SAI();
$b = new SAI();
$c = new SAI();
$d = new SAI();
$e = new SAI();

$objarray = array($a,$b,$c,$d,$e);
reset($objarray);
while (list($key, $val) = each($objarray))
{
    echo "$key => $val\n";
}
//Results
0 => SAI
1 => SAI
2 => SAI
3 => SAI
4 => SAI

Warning:
each() will also accept objects, but may return unexpected results. It's therefore not recommended to iterate though object properties with each().
nino dot skopac at gmail dot com 02-Jul-2015 01:30
<?php
function each_v2($arr) {
    // same as each() but when it hits end of array, it resets it
    static $i = 0;

    if (isset($arr[$i])) {
        // exists¸
        return $arr[$i++];
    } else {
        // reset $i to 0 and repeat
        $i = 0;
        return each_v2($arr);
    }
}
?>
gaviel 18-Mar-2011 03:53
Ok Here's one for iterating multidimensional array .. using foreach

    <?php
        $members = array(
                            "member1" => array (
                                                "First Name" => "Robert",
                                                "Last Name" => "Burton",
                                                "Age" => "20"
                                                ),
                            "member2" => array (
                                                "First Name" => "Cheska",
                                                "Last Name" => "Vladesk",
                                                "Age" => "21"
                                                ),
                            "member3" => array (
                                                "First Name" => "Gino",
                                                "Last Name" => "Marley",
                                                "Age" => "19"
                                                ),
                            "member4" => array (
                                                "First Name" => "Jake",
                                                "Last Name" => "White",
                                                "Age" => "16"
                                                ),
                            );
        $dataSetCount = count($members);
        echo "<h1>There are $dataSetCount members</h1>";

        $i = 0;
        foreach ($members as $each_members) {
            $i++;
            echo "<h2>Member $i</h2>";
                foreach ($each_members as $position => $details) {
                    echo "<b>$position</b>" . ": " . $details . "<br />";
                }
            }
    ?>
massimo dot modica at tin dot it 03-Feb-2010 02:36
If you forget to reset the array before each(), the same code may give different results with different php versions.

<?php

$a = array(1,2,3);

foreach ($a AS $k => $v) $a[$k] = 2*$v;

while(list($k2, $v2) = each($a)) { echo($v2."\n"); }

?>

In PHP 5.2.0:

2
4
6

In PHP 5.2.6:

4
6
php at omit dot ianco dot co dot uk 13-Apr-2008 06:10
I wanted to be able to add to an array while looping through it. foreach does not allow this because it is using a secret copy of the array. each makes this possible (tested on PHP 4).
<?php
$shopping_list = array('oysters', 'caviare');
reset ($shopping_list);
while (list($key, $value) = each ($shopping_list)) {
    if ($value == 'oysters') $shopping_list[] = 'champagne';
    elseif ($value == 'champagne') $shopping_list[] = 'ice';
}
print_r($shopping_list);
// Array ( [0] => oysters [1] => caviare [2] => champagne [3] => ice )
?>
wolfeym38 at yahoo dot com 11-Jun-2007 11:28
Regarding speed of foreach vs while(list) =each
I wrote a benchmark script and the results are that clearly foreach is faster. MUCH faster. Even with huge arrays (especially with huge arrays). I tested with sizes 100,000. 1,000,000 and 10,000,000. To do the test with 10 million i had to set my memory limit real high, it was close to 1gb by the time it actually worked. Anyways,

<?php
function getDiff($start, $end) {
    $s = explode(' ', $start);
    $stot = $s[1] + $s[0];
    $e = explode(' ', $end);
    $etot = $e[1] + $e[0];
    return $etot - $stot;
}

$lim=10000000;
$arr = array();
for ($i=0; $i<$lim; $i++) {
    $arr[$i] = $i/2;
}

$start = microtime();
foreach ($arr as $key=>$val);

$end = microtime();
echo "time for foreach = " . getDiff($start, $end) . ".\n";

reset($arr);
$start = microtime();
while (list($key, $val) = each($arr));
$end = microtime();
echo "time list each = " . getDiff($start, $end) . ".\n";
?>

here are some of my results: with 1,000,000
time for foreach = 0.0244591236115.
time list each = 0.158002853394.
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 0.0245339870453.
time list each = 0.154260158539.
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 0.0269000530243.
time list each = 0.157305955887.

then with 10,000,000:
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 1.96586894989.
time list each = 14.1371650696.
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 2.02504014969.
time list each = 13.7696218491.
desktop:/media/sda5/mpwolfe/tests$ php test.php
time for foreach = 2.0246758461.
time list each = 13.8425710201.

by the way, these results are with php 5.2 i believe, and a linux machine with 3gb of ram and 2.8ghz dual core pentium
michael k (name der redaktion bekannt.) 10-May-2007 12:36
If you want to iterate over a two-dimensional, sparse array, and want to  first display every first element, then every second and so on, you can use this code:

 $fruits = array ( "fruits"  => array ( "a" => "orange",
                                      "b" => "banana",
                                      "c" => "apple"
                                    ),
                 "numbers" => array ( 1,
                                      2,
                                      3,
                                      4,
                                      5,
                                      6
                                    ),
                 "holes"   => array (      "first",
                                      5 => "second",
                                           "third",
                                     10 => "fourth",
                                    )
               );

$done = False;
while ($done == False) {
       $done = True;

       // Important: &$val has to be a reference (use the &),
       // if you don't, the internal counter of $val will be
       // re-initialized each time and you loop over the first elements
       // for eternity.

       foreach($fruits as $key => &$val) {

               if (list($inner_key, $inner_val) = each(&$val)) {
                       $done = False;
                       echo "$key : : $inner_key => $inner_val  <br>  \n";
               }

       }
}

NOTE: this is just a quick hack, if you know a better way, post it!
sjoerd-php at linuxonly dot nl 31-Mar-2006 06:04
Use foreach instead of while, list and each. Foreach is:
- easier to read
- faster
- not influenced by the array pointer, so it does not need reset().

It works like this:
<?php
$arr = array('foo', 'bar');
foreach ($arr as $value) {
    echo "The value is $value.";
}

$arr = array('key' => 'value', 'foo' => 'bar');
foreach ($arr as $key => $value) {
    echo "Key: $key, value: $value";
}
?>
matthew at mhalls dot net 04-Dec-2005 03:58
To panania at 3ringwebs dot com:

If you know for certain that you are only receiving one row, the while becomes redundant. To shorten your code:

$strSQL = "SELECT * FROM table WHERE id=1";
$RecordsetSelect = $db->runQuery ($strSQL);
list($key, $val) = mysql_fetch_row($RecordsetSelect);
echo "$key => $val\n";
mysql_free_result($RecordsetSelect);

With only one row being returned this is more elegant a solution, but just being nit-picky in essence. It also shows another quick way of using list.
amby2 at izh dot com 24-Nov-2005 09:55
I've found a compact way to cycle through an associative array using for statement (not while, as it has been done in the most of examples below):

<?php

for (reset($array); list($key) = each($array);) {
  echo $key;
  echo $array[$key];
}

?>

or

<?php

for (reset($array); list($key, $value) = each($array);) {
  echo $key;
  echo $value;
  echo $array[$key];
}

?>

You hardly forget to add reset($array) code line using such construction.
Sopinon 23-Jul-2005 05:17
If you want to display the hole structure (tree) of your array, then you can use this recursive solution.

<?PHP
$tree= "";
array_tree($your_array);
echo $tree;

// Recursive Function
function array_tree($array, $index=0){
    global $tree;
    $space="";
    for ($i=0;$i<$index;$i++){
        $space .= "     ";
    }
    if(gettype($array)=="array"){
        $index++;
        while (list ($x, $tmp) = each ($array)){
            $tree .= $space."$x => $tmp\n";
            array_tree($tmp, $index);
        }
    }
}
?>
james at gogo dot co dot nz 02-Nov-2004 07:29
It's worth noting that references to an array don't have thier own array pointer, and taking a reference to an array doesn't reset it's array pointer, so this works as you would expect it would by eaching the first three items of the array, rather than the first item 3 times.

<?php
  $x = array(1,2,3);

  print_r(each($x));
  echo "\n";

  $y =& $x;
  print_r(each($y));
  echo "\n";

  $z =& $y;
  print_r(each($z));
  echo "\n";
?>
wodzuY2k at anronet dot pl 04-Aug-2002 12:41
This function will help you dump any variable into XML structure.

        //dump var into simple XML structure
        function var_dump_xml($tagname,$variable,$level=0)
         {
            for($i=0;$i<$level;$i++) $marg.=' ';
            if (eregi('^[0-9].*$',$tagname)) $tagname='tag_'.$tagname; //XML tag cannot start with [0-9] character
            if (is_array($variable))
             {
                echo $marg."<$tagname>\n";
                while (list ($key, $val) = each ($variable))  var_dump_xml($key,$val,$level+1);
                echo $marg."</$tagname>\n";
             }
            elseif (strlen($variable)>0)
             {
                 echo $marg."<$tagname>".htmlspecialchars($variable)."</$tagname>\n";
             };
         };

        /*
        example:

        $myVar = array("name"=>"Joe", "age"=>"26", "children"=>array("Ann","Michael"));
        var_dump_xml("myVarTag",$myVar);
        */
Gillis at dancrea dot com 26-May-2002 10:13
I wrote a short and pretty simple script to search through associative arrays for some value in the values, heres a simplifyed example of it:

<?php

$foo['bob'] = "bob is ugly";
$foo['bill'] = "bill is rich";
$foo['barbie'] = "barbie is cute";
$search = "rich";

echo "searching the array foo for $search:<br>";
reset ($foo);
while (list ($key, $val) = each ($foo)) {
if (preg_match ("/$search/i", $val)) {
    print "A match was found in $key.<br />";
} else {
    print "A match was not found in $key.<br />";
}
}

?>

will output:
Searching the array foo for rich:
A match was not found in bob
A match was found in bill
A match was not found in barbie
13-Feb-2002 04:10
I usually work a lot with 2D arrays. Since I've had some trouble traversing them correctly maybe someone out there also experienced those problems and can use this one.

It's based on a 2D-array called $array[$x][$y]. At some (but not necessarily all) (x,y) there is a value I want to reach. Note that I do not know beforehand the ranges of $x or $y (that is their highest and lowest values).

while (list ($x, $tmp) = each ($array)) {
   while (list ($y, $val) = each ($tmp)) {
      echo "$x, $y, $val";
   }
}

The answer for each (x,y) pair can thus be (providng, of course those values where in your array beforehand):

1, 1, 2
2, 2, 0
3, 1, 1
5, 2, 2
5, 1, 2

Note that only the (x,y) pairs with a corresponding value is shown.

Hang in there
Jon Egil Strand
NTNU
tk at turtle-entertainment dot de 29-Jan-2001 11:33
Be sure to use the integrated functions "unset();" or "reset();" - many people forget this and wonder about the created output!
kris at angelanthony dot com 25-Oct-2000 01:03
Remember to use "reset()" if you iterate over an array with "each()" more than once!  Example:

while(list($key,$value) = each($array)){
 // code here
}

NOW the internal pointer on $array is at the end of the array, and another attempt at an iteration like the one above will result in zero executions of the code within the "while" block.  You MUST call "reset($array)" to reset the internal array pointer before iterating over the array again from the first element.


Positionne le pointeur de tableau en fin de tableau

  • « each
  • extract »
  • PHP Manual
  • Fonctions sur les tableaux
  • Positionne le pointeur de tableau en fin de tableau

end

(PHP 4, PHP 5, PHP 7, PHP 8)

end — Positionne le pointeur de tableau en fin de tableau

Description

end ( array|object &$array ) : mixed

end() déplace le pointeur interne du tableau array jusqu'au dernier élément et retourne sa valeur.

Liste de paramètres

array

Le tableau. Ce tableau est passé par référence car il sera modifié par la fonction. Cela signifie que vous devez passer une vraie variable et non une fonction retournant un tableau, car actuellement, seules les variables peuvent être passées par référence.

Valeurs de retour

Retourne la valeur du dernier élément ou false si le tableau est vide.

Exemples

Exemple #1 Exemple avec end()

<?php

$fruits = array('apple', 'banana', 'cranberry');
echo end($fruits); // cranberry

?>

Voir aussi

  • current() - Retourne l'élément courant du tableau
  • each() - Retourne chaque paire clé/valeur d'un tableau
  • prev() - Recule le pointeur courant de tableau
  • reset() - Remet le pointeur interne de tableau au début
  • next() - Avance le pointeur interne d'un tableau
  • array_key_last() - Récupère la dernière clé d'un tableau

User Contributed Notes

aaaaa976 at gmail dot com 16-Nov-2018 11:12
To get the first element:

    // Get first item.
    foreach ($array as $item) {
        $first = $item;
        break;
    }
    // $first will have the first element.
Aleksandr 28-Apr-2018 04:17
<?php
$A=[1];
print_r($A);
end($A[5]);
print_r($A);
?>

Array
(
    [0] => 1
)
Array
(
    [0] => 1
    [5] =>
)
Jacob 15-Jul-2017 05:55
Attempting to get the value of a key from an empty array through end() will result in NULL instead of throwing an error or warning becuse end() on an empty array results in false:

<?php

$a = ['a' => ['hello' => 'a1','world' => 'a2'],
      'b' => ['hello' => 'b1','world' => 'b2'],
      'c' => ['hello' => 'c1','world' => 'c2']
    ];
$b = [];

var_dump(end($a)['hello']);
var_dump(end($b)['hello']);
var_dump(false['hello']);

?>

Results in:

string(2) "c1"
NULL
NULL
Omolewa stephen 24-Oct-2016 06:16
I found using pathinfo very useful in getting extension of  a file.
<? Php
  $filename = dictionary.txt;
   $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)) ;

echo $ext; // txt
?>
goran 14-May-2016 05:16
In case you need add separator at end

$numbers = array('1','2','3','4');
        foreach ($numbers as $number){
            echo $number;
            if (end($numbers) != $number){
                echo ', ';
            }
        }
ivijan dot stefan at gmail dot com 08-May-2014 04:47
I found that the function end() is the best for finding extensions  on file name. This function cleans backslashes and takes the extension of a file.

<?php
private function extension($str){
    $str=implode("",explode("\\",$str));
    $str=explode(".",$str);
    $str=strtolower(end($str));
     return $str;
}

// EXAMPLE:
$file='name-Of_soMe.File.txt';
echo extension($file); // txt
?>

Very simple.
Jason 18-Mar-2013 10:37
$filename = 'somefile.jpg';

php v5.4 does not support the following statement.
echo end(explode(".", $filename)); // return jpg string

instead you have to split into 2 statements
$file = explode(".", $filename);
echo end ($file);
jorge at REMOVETHIS-2upmedia dot com 01-Mar-2012 01:20
If all you want is the last item of the array without affecting the internal array pointer just do the following:

<?php

function endc( $array ) { return end( $array ); }

$items = array( 'one', 'two', 'three' );
$lastItem = endc( $items ); // three
$current = current( $items ); // one
?>

This works because the parameter to the function is being sent as a copy, not as a reference to the original variable.
franz at develophp dot org 01-Dec-2010 03:06
It's interesting to note that when creating an array with numeric keys in no particular order, end() will still only return the value that was the last one to be created. So, if you have something like this:

    <?php
    $a = array();
    $a[1] = 1;
    $a[0] = 0;
    echo end($a);
    ?>

This will print "0".
laurence at crazypillstudios dot com 07-Jun-2010 02:12
this is a function to move items in an array up or down in the array. it is done by breaking the array into two separate arrays and then have a loop creates the final array adding the item we want to move when the counter is equal to the new position we established the array key, position and direction were passed via a query string

<?php
//parameters
//$array- the array you are modifying
//$keytomove - the key of the item you wish to move
//$pos - the current position of the item: used a count($array) function
//and then loop with incrementing integer to add the position to the up //or down button
//$dir - the direction you want to move it - "up"/"dn"

function change_pos($array, $keytomove, $pos, $dir){
    //count the original number of rows
    $count = count($array);
    //set the integer we will use to place the moved item
    if($dir=="up"){
        if($pos==1){
            //if the item is already first and we try moving it up
            //we send it to the end of the array
            $change = $count;
        }else{
            //anywhere else it just moves back one closer to the start of the array
            $change = $pos-1;
        }
    }
    //do the same for the down button
    if($dir=="dn"){
        if($pos==$count){
            $change = 1;
        }else{
            $change = $pos+1;
        }
    }
    //copy the element that you wish to move
    $move = $array[$keytomove];
    //delete the original from the main array
    unset($array[$keytomove]);
    //create an array of the names of the values we
    //are not moving
    $preint = 1;
    foreach($array as $c){
        $notmoved["{$preint}"] = $c['name'];
    $preint++;
    }
    //loop through all the elements
    $int = 1;
    while($int<=$count){
        //dynamically change the key of the unmoved item as we increment the counter
        $notmovedkey = $notmoved["$int"];
        //when the counter is equal to the position we want
        //to place the moved entry we pump it into a new array
        if($int==$change){
            $neworder["{$keytomove}"] = $move;
        }
        //add all the other array items if the position number is not met and
        //resume adding them once the moved item is written
        if($contkey!=""){
            $neworder["{$notmovedkey}"] = $array["{$notmovedkey}"];
        }
    $int++;
    }

    return($neworder);
}
?>

This is not too elegant but it works.
Sam Yong - hellclanner at live dot com 23-Aug-2009 05:05
Take note that end() does not recursively set your multiple dimension arrays' pointer to the end.

Take a look at the following:
<?php

// create the array for testing
$a = array();
$i = 0;
while($i++ < 3){
$a[] = array(dechex(crc32(mt_rand())),dechex(crc32('lol'.mt_rand())));
}

// show the array tree
echo '<pre>';var_dump($a);

// set the pointer of $a to the end
end($a);

// get the current element of $a
var_dump(current($a));
// get the current element of the current element of $a
var_dump(current(current($a)));

?>

You will notice that you probably get something like this:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(8) "764d8d20"
    [1]=>
    string(8) "85ee186d"
  }
  [1]=>
  array(2) {
    [0]=>
    string(8) "c8c72466"
    [1]=>
    string(8) "a0fdccb2"
  }
  [2]=>
  array(2) {
    [0]=>
    string(8) "3463a31b"
    [1]=>
    string(8) "589f6b63"
  }
}

array(2) {
  [0]=>
  string(8) "3463a31b"
  [1]=>
  string(8) "589f6b63"
}

string(8) "3463a31b"

The array elements' pointer are still at the first one as current. So do take note.
jasper at jtey dot com 11-Jul-2006 12:48
This function returns the value at the end of the array, but you may sometimes be interested in the key at the end of the array, particularly when working with non integer indexed arrays:

<?php
// Returns the key at the end of the array
function endKey($array){
 end($array);
 return key($array);
}
?>

Usage example:
<?php
$a = array("one" => "apple", "two" => "orange", "three" => "pear");
echo endKey($a); // will output "three"
?>
ken at expitrans dot com 27-Oct-2005 09:02
Please note that from version 5.0.4 ==> 5.0.5 that this function now takes an array. This will possibly break some code for instance:

<?php

echo ">> ".end(array_keys(array('x' => 'y')))."\n";

?>

which will return "Fatal error: Only variables can be passed by reference" in version <= 5.0.4 but not in 5.0.5.

If you run into this problem with nested function calls, then an easy workaround is to assign the result from array_keys (or whatever function) to an intermediary variable:

<?php

$x = array_keys(array('x' => 'y'));
echo ">> ".end($x)."\n";

?>
28-Aug-2002 06:34
If you need to get a reference on the first or last element of an array, use these functions because reset() and end() only return you a copy that you cannot dereference directly:

<?php
function first(&$array) {
if (!is_array($array)) return &$array;
if (!count($array)) return null;
reset($array);
return &$array[key($array)];
}

function last(&$array) {
if (!is_array($array)) return &$array;
if (!count($array)) return null;
end($array);
return &$array[key($array)];
}
?>
28-Aug-2002 06:17
When adding an element to an array, it may be interesting to know with which key it was added. Just adding an element does not change the current position in the array, so calling key() won't return the correct key value; you must first position at end() of the array:

<?php
function array_add(&$array, $value) {
$array[] = $value; // add an element
end($array); // important!
return key($array);
}
?>


Importe les variables dans la table des symboles

  • « end
  • in_array »
  • PHP Manual
  • Fonctions sur les tableaux
  • Importe les variables dans la table des symboles

extract

(PHP 4, PHP 5, PHP 7, PHP 8)

extract — Importe les variables dans la table des symboles

Description

extract ( array &$array , int $flags = EXTR_OVERWRITE , string $prefix = "" ) : int

Importe les variables dans la table des symboles.

extract() vérifie chaque clé afin de contrôler si elle a un nom de variable valide. Elle vérifie également les collisions avec des variables existantes dans la table des symboles.

Avertissement

N'utilisez pas extract() sur des données non sûres comme les entrées utilisateur (ex. $_GET, $_FILES).

Liste de paramètres

array

Un tableau associatif. Cette fonction crée les variables dont les noms sont les index de ce tableau, et leur affecte la valeur associée. Pour chaque paire clé/valeur, extract() crée une variable, avec les paramètres flags et prefix.

Vous devez utiliser un tableau associatif. Un tableau indexé numériquement ne produira aucun résultat, à moins que vous n'utilisiez l'option EXTR_PREFIX_ALL ou EXTR_PREFIX_INVALID.

flags

Le traitement des collisions est déterminé par flags. Ce paramètre peut prendre une des valeurs suivantes :

EXTR_OVERWRITE
Lors d'une collision, réécrire la variable existante.
EXTR_SKIP
Lors d'une collision, ne pas réécrire la variable existante.
EXTR_PREFIX_SAME
Lors d'une collision, ajouter le préfixe prefix, et créer une nouvelle variable.
EXTR_PREFIX_ALL
Ajouter le préfixe prefix pour toutes les variables.
EXTR_PREFIX_INVALID
Préfixer uniquement les variables aux noms invalides ou numériques avec le préfixe prefix.
EXTR_IF_EXISTS
Écrase la variable uniquement si elle existe déjà dans la table des symboles, et, sinon, ne rien faire. Ceci est pratique pour définir une liste de variables valides, puis extraire du tableau les valeurs que vous avez déjà définies grâce à $_REQUEST, par exemple.
EXTR_PREFIX_IF_EXISTS
Ne crée que des variables préfixées, si la version non préfixée de la même variable existe dans la table des symboles courante.
EXTR_REFS
Extrait les variables sous forme de références. Cela signifie que les valeurs des variables importées font toujours référence aux valeurs des variables d'origine dans le paramètre array. Vous pouvez utiliser cette option seule, ou bien la combiner avec d'autres options avec l'opérateur OR, dans le paramètre flags.

Si flags est omis, extract() utilisera EXTR_OVERWRITE par défaut.

prefix

Notez que prefix n'est nécessaire que pour les valeurs de flags suivantes : EXTR_PREFIX_SAME, EXTR_PREFIX_ALL, EXTR_PREFIX_INVALID ou EXTR_PREFIX_IF_EXISTS. Si le résultat préfixé n'est pas un nom de variable valide, il ne sera pas importé dans la table des symboles. Les préfixes sont automatiquement séparés de l'index du tableau par un caractère de soulignement.

Valeurs de retour

Retourne le nombre de variables importées avec succès dans la table des symboles.

Exemples

Exemple #1 Exemple avec extract()

Une utilisation possible de la fonction extract() est l'exportation vers la table des symboles de tableaux de variables retournés par wddx_deserialize().

<?php

/* Supposons que $var_array est un tableau retourné par
   wddx_deserialize */

$size = "large";
$var_array = array("color" => "blue",
                   "size"  => "medium",
                   "shape" => "sphere");
extract($var_array, EXTR_PREFIX_SAME, "wddx");

echo "$color, $size, $shape, $wddx_size\n";

?>

L'exemple ci-dessus va afficher :

blue, large, sphere, medium

La variable $size n'a pas été réécrite, car on avait spécifié le paramètre EXTR_PREFIX_SAME, qui a permis la création de $wddx_size. Si EXTR_SKIP avait été utilisée, alors $wddx_size n'aurait pas été créé. Avec EXTR_OVERWRITE, $size aurait pris la valeur "medium", et avec EXTR_PREFIX_ALL, les variables créées seraient $wddx_color, $wddx_size et $wddx_shape.

Notes

Avertissement

N'utilisez pas extract() sur des données inconnues, comme les données utilisateurs (i.e. $_GET, $_FILES, etc.). Si vous le faites, assurez-vous d'utiliser l'une des constantes flags qui n'écrasent pas les valeurs, comme EXTR_SKIP. Sachez aussi que vous devez maintenant extraire dans le même ordre que celui défini dans variables_order du php.ini.

Voir aussi

  • compact() - Crée un tableau à partir de variables et de leur valeur
  • list() - Assigne des variables comme si elles étaient un tableau

User Contributed Notes

amolocaleb at gmail dot com 26-Jul-2018 05:14
If an object is typecasted into an array and "extracted",only the public properties will be accessible.Methods are of course omitted.
<?php
class Test{
    public $name = '';

    protected $age = 10;

    public $status = 'disabled';

    private $isTrue = false;

    public function __construct()
    {
        $this->name = 'Amolo';
        $this->status = 'active';
    }

    public function getName()
    {
        return $this->name;
    }

    public function getAge()
    {
        return $this->age;
    }

    public function getStatus()
    {
        return $this->status;
    }

}

$obj = (array) new Test();
var_dump($obj);
/* array(4) { ["name"]=> string(5) "Amolo" ["*age"]=> int(10) ["status"]=> string(6) "active" ["TestisTrue"]=> bool(false) } */
extract((array)new Test());
echo  $name; //Amolo
echo  $status; //active
echo $age;//Notice: Undefined variable: age
echo $isTrue;//Notice: Undefined variable: isTrue
phatsk+php at gmail dot com 18-Jun-2018 06:59
Using extract's return parameter can lead to unintended results, particularly with EXTR_REFS:

<?php

$my_data = [
    'count' => 15,
    'name' => 'foo',
];

$count = extract( $my_data, EXTR_REFS );

echo $my_data['count']; // 2, not 15.
mrkhoa99 at gmail dot com 29-May-2018 03:29
We can use extract () function for Template Engine:

<?php
#Template.php

class Template
{
    protected $viewVars;

    public function renderPage($tpl)
    {
        ob_start();
        extract($this->viewVars, EXTR_SKIP);
        include $tpl;
        return ob_end_flush();
    }

    public function assign($arr)
    {
        foreach ($arr as $key => $value) {
            $this->viewVars[$key] = $value;
        }
        return $this;
    }
}

$template = new Template();
$template->assign(
   [ 'pageHeader' => 'Page Header', 'content' => 'This is the content page']
);
$template->renderPage('tpl.php');

#tpl.php

<h1><?= $pageHeader; ?></h1>
<p><?= $content ;?></p>

Output:

Page Header
This is the content page
bob 18-Jan-2015 08:35
Note that extract() will only create or overwrite variables in the current scope, so
<?
function test(){
 $a=Array('b'=>1,'c'=>2);
 extract($a);
}
test();
exit("$b");
?>
will produce no output, whereas
<?
function test(){
 global $b;
 $a=Array('b'=>1,'c'=>2);
 extract($a);
}
test();
exit("$b");
?>
will output 1.
dmikam 18-Sep-2014 10:18
I have made some tests to compare the speed of next constructions:
<?php

extract($ARRAY);

// vs.

foreach($ARRAY as $key=>$value)
    $$key = $value;
?>

Surprisingly for me extract is 20%-80% slower then foreach construction. I don't really understand why, but it's so.
CertaiN 10-Jan-2014 04:38
[New Version]

Example Usage:
<?php
$_GET['A']['a'] = '  CORRECT(including some spaces)    ';
$_GET['A']['b'] = '  CORRECT(including some spaces)    ';
$_GET['A']['c'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['A']['d']['invalid_structure'] = 'INVALID';

$_GET['B']['a'] = '  CORRECT(including some spaces)    ';
$_GET['B']['b'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['B']['c']['invalid_structure'] = 'INVALID';
$_GET['B']["Invalid UTF-8 sequence: \xe3\xe3\xe3"] = 'INVALID';

$_GET['C']['a'] = '  CORRECT(including some spaces)    ';
$_GET['C']['b'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['C']['c']['invalid_structure'] = 'INVALID';
$_GET['C']["Invalid UTF-8 sequence: \xe3\xe3\xe3"] = 'INVALID';

$_GET['unneeded_item'] = 'UNNEEDED';

var_dump(filter_struct_utf8(INPUT_GET, array(
    'A' => array(
        'a' => '',
        'b' => FILTER_STRUCT_TRIM,
        'c' => '',
        'd' => '',
    ),
    'B' => FILTER_STRUCT_FORCE_ARRAY,
    'C' => FILTER_STRUCT_FORCE_ARRAY | FILTER_STRUCT_TRIM,
)));
?>

Example Result:
array(3) {
  ["A"]=>
  array(4) {
    ["a"]=>
    string(36) "  CORRECT(including some spaces)    "
    ["b"]=>
    string(30) "CORRECT(including some spaces)"
    ["c"]=>
    string(0) ""
    ["d"]=>
    string(0) ""
  }
  ["B"]=>
  array(3) {
    ["a"]=>
    string(36) "  CORRECT(including some spaces)    "
    ["b"]=>
    string(0) ""
    ["c"]=>
    string(0) ""
  }
  ["C"]=>
  array(3) {
    ["a"]=>
    string(30) "CORRECT(including some spaces)"
    ["b"]=>
    string(0) ""
    ["c"]=>
    string(0) ""
  }
}
CertaiN 10-Jan-2014 04:37
[New Version]
This function is very useful for filtering complicated array structure.
Also, Some integer bitmasks and invalid UTF-8 sequence detection are available.

Code:
<?php
/**
 * @param  integer $type    Constant like INPUT_XXX.
 * @param  array   $default Default structure of the specified super global var.
 *                          Following bitmasks are available:
 *  + FILTER_STRUCT_FORCE_ARRAY - Force 1 dimensional array.
 *  + FILTER_STRUCT_TRIM        - Trim by ASCII control chars.
 *  + FILTER_STRUCT_FULL_TRIM   - Trim by ASCII control chars,
 *                                full-width and no-break space.
 * @return array            The value of the filtered super global var.
 */
define('FILTER_STRUCT_FORCE_ARRAY', 1);
define('FILTER_STRUCT_TRIM', 2);
define('FILTER_STRUCT_FULL_TRIM', 4);
function filter_struct_utf8($type, array $default) {
    static $func = __FUNCTION__;
    static $trim = "[\\x0-\x20\x7f]";
    static $ftrim = "[\\x0-\x20\x7f\xc2\xa0\xe3\x80\x80]";
    static $recursive_static = false;
    if (!$recursive = $recursive_static) {
        $types = array(
            INPUT_GET => $_GET,
            INPUT_POST => $_POST,
            INPUT_COOKIE => $_COOKIE,
            INPUT_REQUEST => $_REQUEST,
        );
        if (!isset($types[(int)$type])) {
            throw new LogicException('unknown super global var type');
        }
        $var = $types[(int)$type];
        $recursive_static = true;
    } else {
        $var = $type;
    }
    $ret = array();
    foreach ($default as $key => $value) {
        if ($is_int = is_int($value)) {
            if (!($value | (
                FILTER_STRUCT_FORCE_ARRAY |
                FILTER_STRUCT_FULL_TRIM |
                FILTER_STRUCT_TRIM
            ))) {
                $recursive_static = false;
                throw new LogicException('unknown bitmask');
            }
            if ($value & FILTER_STRUCT_FORCE_ARRAY) {
                $tmp = array();
                if (isset($var[$key])) {
                    foreach ((array)$var[$key] as $k => $v) {
                        if (!preg_match('//u', $k)){
                            continue;
                        }
                        $value &= FILTER_STRUCT_FULL_TRIM | FILTER_STRUCT_TRIM;
                        $tmp += array($k => $value ? $value : '');
                    }
                }
                $value = $tmp;
            }
        }
        if ($isset = isset($var[$key]) and is_array($value)) {
            $ret[$key] = $func($var[$key], $value);
        } elseif (!$isset || is_array($var[$key])) {
            $ret[$key] = null;
        } elseif ($is_int && $value & FILTER_STRUCT_FULL_TRIM) {
            $ret[$key] = preg_replace("/\A{$ftrim}++|{$ftrim}++\z/u", '', $var[$key]);
        } elseif ($is_int && $value & FILTER_STRUCT_TRIM) {
            $ret[$key] = preg_replace("/\A{$trim}++|{$trim}++\z/u", '', $var[$key]);
        } else {
            $ret[$key] = preg_replace('//u', '', $var[$key]);
        }
        if ($ret[$key] === null) {
            $ret[$key] = $is_int ? '' : $value;
        }
    }
    if (!$recursive) {
        $recursive_static = false;
    }
    return $ret;
}
?>
FredLawl 13-May-2013 02:56
It is possible to use this as a way to create public attributes for a class.

<?php
class Foo {

  public function __construct ($array) {

      extract($array, EXTR_REFS);
      foreach ($array as $key => $value) {
          $this->$key = $$key;
          // Do: $this->key = $key; if $key is not a string.
      }

  }

}

$array = array(
    'valueOne'      => 'Test Value 1',
    'valueTwo'      => 'Test Value 2',
    'valueThree'    => 'Test Value 3'
);

$foo = new Foo($array);

// Works
echo $foo->valueOne; // Test Value 1
echo $foo->valueTwo; // Test Value 2

// Does not work!
echo $foo::$valueOne; // Fatal error:  Access to undeclared static property: Test::$valueOne
?>
dotslash.lu at gmail.com 29-Apr-2013 12:55
You can't extract a numeric indexed array(e.g. non-assoc array).
<?php
$a = array(
  1,
  2
);
extract($a);
var_dump(${1});
?>

result:
PHP Notice:  Undefined variable: 1 in /Users/Lutashi/t.php on line 7

Notice: Undefined variable: 1 in /Users/Lutashi/t.php on line 7
NULL
Robc 01-Nov-2011 06:30
When extracting from a row after a database query using for example:

$row = mysql_fetch_array($result, MYSQL_ASSOC)
extract($row);

I find that the resultant variables may not match the variable type in the database.  In particular I have found integers in the database may gettype() to string on the extracted variable.
Rodrigo 15-Jun-2010 09:41
Here's a way to use extract in $_FILES arrays without using register_gloabals on.

I started to use extract a few weeks ago, and my codes hasn't been so clean since then. The use of the arrays $_POST and $_GET is ok, but one missed doublequote causes a lot of trouble.

Besides I teach PHP in a school, and this function has made my examples easier.

<?php
if(isset($_FILES["file"])){
    extract($_FILES);
    extract($file);
    echo $name."<br>";
    echo $tmp_name."<br>";
    echo $size."<br>";
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Documento sin t&iacute;tulo</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<form action="" method="post" enctype="multipart/form-data" name="form1">
  <p>
    <input type="file" name="file">
</p>
  <p>
    <input type="submit" name="Submit" value="Enviar">
</p>
</form>
</body>
</html>

Hope this can help anyone.
auto493097 at hushmail dot com 23-Feb-2010 10:07
I use XDebug with NetbeansIDE to for analyzing and developing PHP Code. When debugging an extract statement no new variables appeared in the variable's list. Although all variables created by extract could be examined by explicit watch items and single variables appeared as soon as an PHP script makes use of them I am not sure weather it is a wrong configuration, a feature or a bug in XDebug.
danbettles at yahoo dot co dot uk 24-Aug-2009 04:04
When using EXTR_PREFIX_ALL - and probably all the other EXTR_PREFIX_* constants - and a numerically-indexed array, extract() will add an underscore ("_") between the prefix and the index.

<?php

extract(array('foo', 'bar'), EXTR_PREFIX_ALL, 'var');

print_r(get_defined_vars());  // Reveals $var_0 = 'foo' and $var_1 = 'bar'
?>
benjaminATwebbutvecklarnaDOTse 16-Mar-2008 07:15
In the meantime, I'm using this:

// extract alternative
# extracts variables where new value is above the threshold or if old value is on or below the threshold (or var is not defined)
# an associative array is obviously the sane thing to pass
#
# I am absolutely certain someone will find obvious problems or errors with this
# I haven't even tried to compare other values than 0 so if you need to do that and surely finds obvious flaws,
# please mail me, I'd really like to know.
# benjaminATwebbutvecklarnaDOTse

// usage example:
# thrextract(mysql_fetch_assoc(mysql_query("SELECT preset_this,preset_that FROM site_preset WHERE ID = $site_id")));
# thrextract(mysql_fetch_assoc(mysql_query("SELECT preset_this,preset_that FROM category_preset WHERE ID = $category_id")));

function thrextract($arr,$thr = 0){
    foreach($arr as $key => $var){
        global $$key;
        if($var > $thr or $$key <= $thr) $$key = $var;
    }
}
benjaminATwebbutvecklarnaDOTse 16-Mar-2008 06:19
Re: anon at anon dot org, about extract() and null values

Personally I've found use extracting multiple resultsets from db where the latter would overwrite the previous when a variable is not null ( and optionally if its not >0 )

It would be useful if $extract_type was extended on top of these two:

EXTR_OVERWRITE
EXTR_SKIP

with something like this:

EXTR_OVERWRITE_NULL
 - If there is a collision, overwrite the existing variable if it is null

EXTR_OVERWRITE_0
 - Same thing but == 0 or null

EXTR_SKIP_NULL
 - If there is a collision, skip the new variable if the existing is not null

EXTR_SKIP_0
 - Same thing but == 0 or null

Those ought to cover a few good cases that aren't covered now.
Hayley Watson 13-Mar-2008 03:18
Dan O'Donnell's suggestion needs a third requirement to work as described:

c) No other variables are defined - especially variables that contain potentially sensitive information.

Without that condition the difference between extract() and assigning variables by hand (and the resulting security implications) should be obvious.

The only valid security step there is (b) - but you should be doing that anyway.
Dan O'Donnell 21-Apr-2007 12:25
Following up on ktwombley at gmail dot com's post:

Presumably one easy way of dealing with this security issue is to use the EXTR_IF_EXISTS flag and make sure

a) your define acceptable input variables beforehand (i.e. as empty variables)
b) Sanitise any user input to avoid unacceptable variable content.

If you do these two things, then I'm not sure I see the difference between extract($_REQUEST,EXTR_IF_EXISTS); and assigning each of the variables by hand.

I'm not talking here about the idea of storing the variables in a database, just the immediately necessary steps to allow you to use extract on REQUEST arrays with relative safety.
Dutchdavey 13-Mar-2007 12:26
I would draw your attention to the user note at the very end of this page regarding PREFIXES. The user points out that php adds a '_' to your prefixes.
ktwombley at gmail dot com 31-Aug-2006 10:05
It's really easy to open gaping security holes using extract() on $_REQUEST, $_GET, etc. You have to be really sure of what you're doing, and use the proper flags on extract() to avoid clobbering important variables.

For instance, the submission by kake26 at gmail dot com will not only perfectly emulate register globals (that's bad), but it'll store it in a database and recall the same variables every time the script runs (essentially allowing an attacker to attack your script every time it runs via one attack). Oops!

To fix it, you'd have to get creative with flags. Maybe you could use EXTR_PREFIX_ALL instead of EXTR_OVERWRITE, for example. Of course, you should also sanitize the form elements to ensure there's no php code in them, and also to make sure any very important variables aren't in the form data. (like the classic $is_admin = true attack)
nicolas zeh 16-Mar-2006 09:24
This function provides exactly the same functionality as extract except that a parameter was added defining the extract target.
This function can be used if your PHP installation does not support the required Flags or more important if you would like to extract arrays to another destination as to $GLOBALS, i.e. other arrays or objects.
The only difference to extract is that extract_to moves the array pointer of $arr to the end as $arr is passed by reference to support the EXTR_REFS flag.

<?php
    if( !defined('EXTR_PREFIX_ALL') ) define('EXTR_PREFIX_ALL', 3);
    if( !defined('EXTR_PREFIX_INVALID') ) define('EXTR_PREFIX_INVALID', 4);
    if( !defined('EXTR_IF_EXISTS') ) define('EXTR_IF_EXISTS', 5);
    if( !defined('EXTR_PREFIX_IF_EXISTS') ) define('EXTR_PREFIX_IF_EXISTS', 6);
    if( !defined('EXTR_REFS') ) define('EXTR_REFS', 256);

    function extract_to( &$arr, &$to, $type=EXTR_OVERWRITE, $prefix=false ){

        if( !is_array( $arr ) ) return trigger_error("extract_to(): First argument should be an array", E_USER_WARNING );

        if( is_array( $to ) ) $t=0;
        else if( is_object( $to ) ) $t=1;
        else return trigger_error("extract_to(): Second argument should be an array or object", E_USER_WARNING );

        if( $type==EXTR_PREFIX_SAME || $type==EXTR_PREFIX_ALL || $type==EXTR_PREFIX_INVALID || $type==EXTR_PREFIX_IF_EXISTS )
            if( $prefix===false ) return trigger_error("extract_to(): Prefix expected to be specified", E_USER_WARNING );
            else $prefix .= '_';

        $i=0;
        foreach( $arr as $key=>$val ){

            $nkey = $key;
            $isset = $t==1 ? isset( $to[$key] ) : isset( $to->$key );

            if( ( $type==EXTR_SKIP && $isset )
                || ( $type==EXTR_IF_EXISTS && !$isset ) )
                    continue;

            else if( ( $type==EXTR_PREFIX_SAME && $isset )
                || ( $type==EXTR_PREFIX_ALL )
                || ( $type==EXTR_PREFIX_INVALID && !preg_match( '#^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$#', $key ) ) )
                    $nkey = $prefix.$key;

            else if( $type==EXTR_PREFIX_IF_EXISTS )
                if( $isset ) $nkey = $prefix.$key;
                else continue;

            if( !preg_match( '#^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$#', $nkey ) ) continue;

            if( $t==1 )
                if( $type & EXTR_REFS ) $to->$nkey = &$arr[$key];
                else $to->$nkey = $val;
            else
                if( $type & EXTR_REFS ) $to[$nkey] = &$arr[$key];
                else $to[$nkey] = $val;

            $i++;
        }

        return $i;
    }

    // e.g.:
    extract_to( $myarray, $myobject, EXTR_IF_EXISTS );
?>
owk dot ch199_ph at gadz dot org 08-Mar-2006 04:21
And if you want with PHP 5 an easy way to extract $V by reference, try this :
<?php
    foreach ($V as $k => &$v) {
        $$k =& $v;
    }
?>
It can be used to create special kind of "free args" functions that let you choose when you call them the way you send variables, and which ones. They are moreover very fast to call thanks to references :
<?php
    function free_args (&$V) {
        foreach ($V as $k => &$v) {
            $$k =& $v;
        }
        unset ($k);  unset ($v);  unset ($V);

        // be careful that if you need to extract $k, $v or $V variables you should find other names for them in the lines above (ie. $__k, $__v and $__V)
    }

    $huge_text = '...';

    $a = array ('arg1' => 'val1', 'arg2' => &$huge_text); // in this call, only $arg2 will be a true reference in the function
    free_args ($a);
?>
Be warned that you can't write : "<?php free_args (array ('arg1' => 'val1')); ?>" because the array can't be referenced by the function, as it's not yet created when the function starts.
moslehi<atsign>gmail<d0t>c0m 20-Jan-2006 01:32
Experimentally I found that calling extract() also shows the number of keys if the key is set and is not numeric ! Maybe there was a better definition than mine  . Please have a look to this scripts :

<?PHP
$var["i"] = "a";
$var["j"] = "b";
$var["k"] = 1;
echo extract($var); // returns 3
?>

<?PHP
$var2["i"] = "a";
$var2[2] = "b";
$var2[] = 1;
echo extract($var2); // returns 1
?>

(Arash Moslehi)
Csaba at alum dot mit dot edu 27-Nov-2005 11:41
Sometimes you may want to extract only a named subset of the key/value pairs in an array.  This keeps things more orderly and could prevent an unrelated variable from getting clobbered from an errant key.  For example,

$things = 'unsaid';
$REQUEST = array(He=>This, said=>1, my=>is, info=>2, had=>a,
                 very=>3, important=>test, things=>4);
$aVarToExtract = array(my, important, info);
extract (array_intersect_key ($REQUEST, array_flip($aVarToExtract)));

will extract
$my = 'is';
$important = 'test';
$info = 2;

but will leave certain
$things = 'unsaid'

Csaba Gabor from Vienna
NB.  Of course the composite request coming in from a web page is in $_REQUEST.
anon at anon dot org 30-May-2005 12:02
A warning about extract() and null values.

This might be an actual Zend2 Engine bug, but it's bad programming practice, so I'm sharing it here instead.

I often work in envrionments where E_STRICT (which would prevent errors like this) isn't on, and I don't have access to change it. I also use a very simple template class that in a nutshell works like this:

$t = new Template('somefile.php');
$t->title = $title;
$t->body = $body;
$t->display();

display() more or less looks like this:

function display(){
    extract(get_object_vars($this),EXTR_REFS);
    ob_start(); include $this->templateFileName;
    return ob_get_clean();
}

If any of the assigned values are null (let's say that in this case $title wasn't initialized above) it causes the engine to do all sorts of incredibly whacky stuff like certifiably lose track of variables in an incredibly inconsistent way. I traced the problem down to the fact that it's using the EXTR_REFS flag. I assume that in PHP's internal variable storage or reference counting mechanism, that trying to extract null references makes it lose track or count of something or rather.

In a nutshell, if you start getting wierd behavior when using extract() make sure that the array or object you are trying to get variables out of doesn't contain null keys or values!
kake26 at gmail dot com 30-Apr-2005 08:59
The following is a neat use for extract to store and manipulate large amounts of form data from. I basically loop through the $_POST and implode it seperating the key and value pairs by a space. Then store it in a db, the reversing function basically explodes the string to a array. Then converts the indexed array to a associative array then uses extract to seal the deal and make it easily available within a program. My main reason for sharing these are the fact I make some big web applications that store allot of forum data in a DB and these functions make it very easy to quickly and easily store and recall the data. I've contributed it because I spent many hours creating this code and recall going "I wish someone had previously submitted it to the page notes". Would have saved me allot of time and agony and I'm sure I'm not the only person that could really benefit from it, so I decided to share.

<?php
$stack = array();
foreach ($_POST as $key => $value) {
array_push($stack, $key, $value);
}
// store it
$block = implode(" ",$stack); // yeilds a space delimited string
// insert query to store string in DB here, like the one below
$query = "INSERT INTO `sometable` VALUES('".$seluser."','".addslashes($block)."');";
$result = mysql_query($query) or die("Query failed for block insert: " . mysql_error());
// note $seluser in my case is a user ID associated with that block
// in one of my web apps
?>

The nice thing is with the above we can quickly create a string of key and value pairs from the data the script got. Without really caring what their names are. You know how if register globals are on you say $someformvar rather than $_POST["someformvar"]; , basically the code below reads this previous created block returns it to that state. Sort of like presistant register globals.

<?php
// insert query to grab the previously stored string here
$query = "SELECT * FROM `sometable` WHERE `blockid` = '".addslashes($bid)."';";
$result = mysql_query($query) or die("Query failed read: " . mysql_error());
$sql = mysql_fetch_array($result, MYSQL_ASSOC);
$array = eplode(" ",$sql["data"]);
for ($i = 0; $i < sizeof($array); $i+=2) {
$myassoc[$array[$i]] = isset($array[$i+1])?$array[$i+1]:NULL;
}
extract($myassoc, EXTR_OVERWRITE);
// now you're key and value pairs from $_POST have been restored
// instead of $_POST
?>
pg dot perfection at gmail dot com 14-Mar-2005 02:33
Here is a little example of how an extraction method should look like when it needs to work recursive (work on nested_arrays too)...

Note that this is only an example, it can be done more easily, and more advanced too.

<?php
/**
 * A nested version of the extract () function.
 *
 * @param    array    $array        The array which to extract the variables from
 * @param    int        $type        The type to use to overwrite (follows the same as extract () on PHP 5.0.3
 * @param    string    $prefix        The prefix to be used for a variable when necessary
 */
function extract_nested (&$array, $type = EXTR_OVERWRITE, $prefix = '')
{
    /**
     *  Is the array really an array?
     */
    if (!is_array ($array))
    {
        return trigger_error ('extract_nested (): First argument should be an array', E_USER_WARNING);
    }

    /**
     *  If the prefix is set, check if the prefix matches an acceptable regex pattern
     * (the one used for variables)
     */
    if (!empty ($prefix) && !preg_match ('#^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$#', $prefix))
    {
        return trigger_error ('extract_nested (): Third argument should start with a letter or an underscore', E_USER_WARNING);
    }

    /**
     * Check if a prefix is necessary. If so and it is empty return an error.
     */
    if (($type == EXTR_PREFIX_SAME || $type == EXTR_PREFIX_ALL || $type == EXTR_PREFIX_IF_EXISTS) && empty ($prefix))
    {
        return trigger_error ('extract_nested (): Prefix expected to be specified', E_USER_WARNING);
    }

    /**
     * Make sure the prefix is oke
     */
    $prefix = $prefix . '_';

    /**
     *  Loop thru the array
     */
    foreach ($array as $key => $val)
    {
        /**
         *  If the key isn't an array extract it as we need to do
         */
        if (!is_array ($array[$key]))
        {
            switch ($type)
            {
                default:
                case EXTR_OVERWRITE:
                    $GLOBALS[$key] = $val;
                break;
                case EXTR_SKIP:
                    $GLOBALS[$key] = isset ($GLOBALS[$key]) ? $GLOBALS[$key] : $val;
                break;
                case EXTR_PREFIX_SAME:
                    if (isset ($GLOBALS[$key]))
                    {
                        $GLOBALS[$prefix . $key] = $val;
                    }
                    else
                    {
                        $GLOBALS[$key] = $val;
                    }
                break;
                case EXTR_PREFIX_ALL:
                    $GLOBALS[$prefix . $key] = $val;
                break;
                case EXTR_PREFIX_INVALID:
                    if (!preg_match ('#^[a-zA-Z_\x7f-\xff]$#', $key{0}))
                    {
                        $GLOBALS[$prefix . $key] = $val;
                    }
                    else
                    {
                        $GLOBALS[$key] = $val;
                    }
                break;
                case EXTR_IF_EXISTS:
                    if (isset ($GLOBALS[$key]))
                    {
                        $GLOBALS[$key] = $val;
                    }
                break;
                case EXTR_PREFIX_IF_EXISTS:
                    if (isset ($GLOBALS[$key]))
                    {
                        $GLOBALS[$prefix . $key] = $val;
                    }
                break;
                case EXTR_REFS:
                    $GLOBALS[$key] =& $array[$key];
                break;
            }
        }
        /**
         *  The key is an array... use the function on that index
         */
        else
        {
            extract_nested ($array[$key], $type, $prefix);
        }
    }
}
?>
Michael Newton 02-Mar-2005 05:23
They say "If the result is not a valid variable name, it is not imported into the symbol table."

What they should say is that if _any_ of the results have invalid names, _none_ of the variables get extracted.

Under 4.3.10 on Windows 2000, I was pulling some mySQL records, but needed to convert two fields into IP addresses:
<?
extract(mysql_fetch_assoc(mysql_query('SELECT * FROM foo')));
extract(mysql_fetch_assoc(mysql_query('SELECT INET_NTOA(bar) AS bar, INET_NTOA(baz) FROM foo')));
?>

I had forgotten the second AS modifier in the SQL query.  Because it couldn't extract a variable called INET_NTOA(baz) into the symbol table, it didn't do either of them.

(BTW I don't normally stack functions up like that!  Just to make a short example!)
21-Feb-2005 07:31
To make this perfectly clear (hopefully), an underscore is always added when the string is prefixed.
extract(array("color" => "blue"),EXTR_PREFIX_ALL,'');// note: prefix is empty
is the same as
$color='_blue';
Aaron Stone 17-Nov-2004 10:44
If you are working porting an older application, and taking the advice above, extracting only _SERVER, _SESSING, _COOKIE, _POST, _GET, you have forgotten to extract _FILES. Putting _FILES last and using EXTR_SKIP doesn't work because the name of the file upload box is already set as a variable containing only the temporary name of the uploaded file from one of the earlier extracts (I haven't tested to see which one specifically, however). A workaround is to put _FILES last and use EXTR_OVERWRITE. This allows extract to replace that temp-name-only variable with the full array of file upload information.
Adam Monsen <adamm at wazamatta dot com> 02-Oct-2004 05:03
As shown in the example, if your 'prefix' is used, a single underscore is added to the name of the extracted variable. Meaning, a prefix of 'p' becomes a prefix of 'p_', so 'blarg' prefixed would be 'p_blarg'.

If you're not sure what variables you've created through extraction, you can call get_defined_vars() to see all defined variables in the current scope.


Indique si une valeur appartient à un tableau

  • « extract
  • key_exists »
  • PHP Manual
  • Fonctions sur les tableaux
  • Indique si une valeur appartient à un tableau

in_array

(PHP 4, PHP 5, PHP 7, PHP 8)

in_array — Indique si une valeur appartient à un tableau

Description

in_array ( mixed $needle , array $haystack , bool $strict = false ) : bool

Recherche needle dans haystack en utilisant une comparaison souple à moins que strict ne soit utilisé.

Liste de paramètres

needle

La valeur recherchée.

Note:

Si needle est une chaîne de caractères, la comparaison est faite en tenant compte de la casse.

haystack

Le tableau.

strict

Si le troisième paramètre strict est définit à true alors la fonction in_array() vérifiera aussi que le type du paramètre needle correspond au type de la valeur trouvée dans haystack.

Valeurs de retour

Retourne true si needle est trouvé dans le tableau, false sinon.

Exemples

Exemple #1 Exemple avec in_array()

<?php
$os = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $os)) {
    echo "Got Irix";
}
if (in_array("mac", $os)) {
    echo "Got mac";
}
?>

La seconde condition échoue, car in_array() est sensible à la casse. Le script retourne :

Got Irix

Exemple #2 Exemple avec in_array() et le mode strict

<?php
$a = array('1.10', 12.4, 1.13);

if (in_array('12.4', $a, true)) {
    echo "'12.4' est trouvé avec le mode strict\n";
}

if (in_array(1.13, $a, true)) {
    echo "1.13 est trouvé avec le mode strict\n";
}
?>

L'exemple ci-dessus va afficher :

1.13 est trouvé avec le mode strict

Exemple #3 Exemple avec in_array() et un tableau en paramètre

<?php
$a = array(array('p', 'h'), array('p', 'r'), 'o');

if (in_array(array('p', 'h'), $a)) {
    echo "'ph' a été trouvé\n";
}

if (in_array(array('f', 'i'), $a)) {
    echo "'fi' was found\n";
}

if (in_array('o', $a)) {
    echo "'o' a été trouvé\n";
}
?>

L'exemple ci-dessus va afficher :

  'ph' a été trouvé
  'o' a été trouvé

Voir aussi

  • array_search() - Recherche dans un tableau la clé associée à la première valeur
  • isset() - Détermine si une variable est déclarée et est différente de null
  • array_key_exists() - Vérifie si une clé existe dans un tableau

User Contributed Notes

ethraza at gmail dot com 04-Dec-2020 02:53
A function to check an array of values within another array.

<?php
/**
 * Return TRUE if any value in neddles exists in haystack (values or keys) or FALSE.
 */
function array_in_array_exists($aNeedles, $aHaystack_values, $aHaystack_keys = null) {
    $needles = (is_string($aNeedles))? explode(',', $aNeedles) : $aNeedles;

    if (is_array($aHaystack_values)) {
        $search_func = 'in_array';
        $haystack = $aHaystack_values;
    } else {
        $search_func = 'array_key_exists';
        $haystack = $aHaystack_Keys;
    }

    return !empty(array_filter($needles, function($e) use ($search_func, $haystack) {
            return call_user_func($search_func, $e, $haystack);
    } ));
}

// Usage example:
var_dump( array_in_array_exists(array('000', '123'), array('123','456')) );
?>
bool(true)

Second element '123' of needles was found as first element of haystack, so it return TRUE.
reiji_nakama at yahoo dot com 22-Sep-2020 03:21
The top voted notes talked about creating strict comparison function, because in_array is insufficient, because it has very lenient type checking (which is PHP default behaviour).

The thing is, in_array is already sufficient. Because as a good programmer, you should never have an array which contains {true, false, 0, 1, '0', '1', null, '', 'hello world'}; all in one array anyway.

It's better to fix how you store data and retrieve data from user, rather than fixing in_array() which is not broken.
fermar21 at gmail dot com 25-May-2020 02:51
If you need to find if a value in an array is in another array you can use the function:

<?php
function array_in_array($arr_needle,$arr_haystack){
    $retorno = false;
    foreach ($arr_needle as $value) {
        if(in_array($value, $arr_haystack)){
            $retorno = true;
        }
    }
    return $retorno;
}
?>
Camille Dugas 06-Nov-2019 03:09
<?php

class Method {

    /** @var int current number of inMultiArray() loop */
    private static $currentMultiArrayExec = 0;

    /**
     * Checks if an element is found in an array or one of its subarray.
     * The verification layer of this method is limited to the parameter boundary xdebug.max_nesting_level of your php.ini.
     * @param mixed $element
     * @param array $array
     * @param bool $strict
     * @return bool
     */
    public static function inMultiArray($element, array $array, bool $strict = true) : bool {
        self::$currentMultiArrayExec++;

        if(self::$currentMultiArrayExec >= ini_get("xdebug.max_nesting_level")) return false;

        foreach($array as $key => $value){
            $bool = $strict ? $element === $key : $element == $key;

            if($bool) return true;

            if(is_array($value)){
                $bool = self::inMultiArray($element, $value, $strict);
            } else {
                $bool = $strict ? $element === $value : $element == $value;
            }

            if($bool) return true;
        }

        self::$currentMultiArrayExec = 0;
        return isset($bool) ? $bool : false;
    }
}

$array = array("foo" => array("foo2", "bar"));
$search = "foo";

if(Method::inMultiArray($search, $array, false)){
    echo $search . " it is found in the array or one of its sub array.";
} else {
    echo $search . " was not found.";
}

# foo it is found in the array or one of its sub array.
loordu 20-Sep-2019 11:16
In PHP array function the in_array() function mainly used to check the item are available or not in array.

In_array() Syntax:

in_array( 'search_item' , $array, boolean)

Where,
     boolean - It is used to check strict validation. And this field is optional one. If you want the strict validation you can use this.

We using in_array() function to performing following following two function. That is ,

1. Non-strict validation
2. Strict validation

1. Non-strict validation:
     This method to validate array with some negotiation. And it allow two parameters.

     For example,
          $array_sample = array (  'key1' => 567 , 'key2' => 579);

          in_array('key1', $array_sample);   // output1:  true
          in_array('577', $array_sample, false);   // output2:  true

      Note: the Example 1, we use only two parameter. Because we can't mention `false` value. Because In default the in_array() take `false` as a boolean value.

      In above example,
             Example 1 : The `key1` is not value in the array.    This is key of the array. So this scenario the in_array accept the search key as a value of the array.
             Example 2: The value `577` is not in the value and key of the array. It is some similar to the value `579`. So this is also accepted.

     So this reason this type is called non-strict function.

2. Strict validation
     This method to validate array without any negotiation. And it have three parameters. If you only mention two parameter the `in_array()` function take as a non-strict validation.

     For example,
          $array_sample = array (  'key1' => 567 , 'key2' => 579);

          in_array('key1', $array_sample , true);   // output1:  false
          in_array('577', $array_sample, true);   // output2:  false

    This is return `true` only the search string is match exactly with the array value with case sensitivity.

Thanks for your time.
artem dot g dot prozorov at gmail dot com 04-Sep-2019 11:43
in_array() may also return NULL if the second argument is NULL and strict types are off.

<?php
var_dump(in_array(1, null));
?>

The output is NULL

If the strict mode is on, then this code would end up with the TypeError
roman dot varuta at gmail dot com 06-Nov-2018 01:53
If array contain at least one true value, in_array() will return true every times if it is not false or null

Use strict = true

<?php

$arr = array(true);

in_array($any, $arr); // Will return true every time except null and false

?>
iammanjil at gmail dot com 25-Oct-2018 08:00
If third parameter is not set to Strict then, the needle is found in haystack eventhought the values are not same. the limit behind the decimal seems to be 6 after which, the haystack and needle match no matter what is behind the 6th.

Wrong Response.
$os = array("652875063.10089021");
if (in_array("652875063.10089021", $os)) {
    echo "In Array";
}

Correct Response
$os = array("652875063.1008902");
if (in_array("652875063.1008901", $os)) {
    echo "In Array";
}
msegit post pl 18-Jul-2018 12:20
You can use my function inArray, to search:
- multidimensional arrays
- for substrings (case [in]sensitive)
- for sub-arrays
- get array of keys of found values
Look at github https://gist.github.com/msegu/80093a65316ded5b69558d5456f80ff9 (here is too long)
Carmen 15-Feb-2018 11:16
Esta función falla con las letras acentuadas y con las eñes. Por tanto, no sirve para los caracteres UTF-8.
El siguiente código falla para na cadena = "María Mañas", no reconoce ni la "í" ni la "ñ":

    function validarNombreYApellidos ($cadena, $selector)
    {
        /* Se admiten las letras (he puesto sólo las mayusculas,
             porque paso la cadena con el nombre o
             el apellido a mayúscula antes de hacer la comparación),
             las vocales acentuadas, la diéresis,
             las eñes, los espacios en blanco y el guión
            (para los apellidos compuestos)*/
        $caracteresPermitidos =
               array ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
                          "N", "Ñ", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X",
                          "Y",  "Z", " ", "Á", "É", "Í", "Ó", "Ú", "Ü", "-");

        $correcto = true;

        // ¿La cadena está vacía?
        if (empty ($cadena))
        {
            $correcto = false;
        }
        else
        {
            $nombreOapellido = mb_strtoupper ($cadena, "utf-8");
            $longitudCadena = mb_strlen ($cadena, "utf-8");

            for ($i = 0; ($i < $longitudCadena) && $correcto; $i++)
            {
                if (!in_array ($nombreOapellido [$i],
                                     $caracteresPermitidos))
                {
                    // Se ha encontrado un carácter no permitido
                    $correcto = false;
                }
            }
        }
            return $correcto;
     }
Carmen 15-Feb-2018 11:15
Esta función falla con las letras acentuadas y con las eñes. Por tanto, no sirve para los caracteres UTF-8.
El siguiente código falla para na cadena = "María Mañas", no reconoce ni la "í" ni la "ñ":

    function validarNombreYApellidos ($cadena, $selector)
    {
        /* Se admiten las letras (he puesto sólo las mayusculas,
             porque paso la cadena con el nombre o
             el apellido a mayúscula antes de hacer la comparación),
             las vocales acentuadas, la diéresis,
             las eñes, los espacios en blanco y el guión
            (para los apellidos compuestos)*/
        $caracteresPermitidos =
               array ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
                          "N", "Ñ", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X",
                          "Y",  "Z", " ", "Á", "É", "Í", "Ó", "Ú", "Ü", "-");

        $correcto = true;

        // ¿La cadena está vacía?
        if (empty ($cadena))
        {
            $correcto = false;
        }
        else
        {
            $nombreOapellido = mb_strtoupper ($cadena, "utf-8");
            $longitudCadena = mb_strlen ($cadena, "utf-8");

            for ($i = 0; ($i < $longitudCadena) && $correcto; $i++)
            {
                if (!in_array ($nombreOapellido [$i],
                                     $caracteresPermitidos))
                {
                    // Se ha encontrado un carácter no permitido
                    $correcto = false;
                }
            }
        }
            return $correcto;
     }
Geoffrey Hoffman 04-Aug-2017 04:00
Be careful to use the strict parameter with truth comparisons of specific strings like "false":

<?php

$truthy = [true, 'true', 1, '1', 'y', 'Y', 'yes', 'YES'];

if (in_array('false', $truthy)) {
   echo "False is truthy.\n";
} else {
   echo "False is not truthy.\n";
}

if (in_array('false', $truthy, true)) {
    echo "False is truthy.\n";
} else {
    echo "False is not truthy.\n";
}

?>

The above example prints:

False is truthy.
False is not truthy.
stocki dot r at gmail dot com 02-Jun-2017 02:56
Add an extra if() to adrian foeder's comment to make it work properly:

<?php
    ...
    if (!@$ret) {
        $ret = rec_in_array($needle, $element, $alsokeys);
    }
    ...
?>

So this will work, too:

<?php
    $array = array(
        array('a', 'b'),
        array('c', 'd')
    );
    var_dump(rec_in_array('a', $array));
?>
rhuan at rhuan dot com dot br 31-Dec-2016 11:29
This code will search for a value in a multidimensional array with strings or numbers on keys.

function in_multiarray($elem, $array)
{
    while (current($array) !== false) {
        if (current($array) == $elem) {
            return true;
        } elseif (is_array(current($array))) {
            if (in_multiarray($elem, current($array))) {
                return true;
            }
        }
        next($array);
    }
    return false;
}
hoopyfroop at yahoo dot com 11-Nov-2016 02:14
If you search for numbers, in_array will convert any strings in your array to numbers, dropping any letters/characters, forcing a numbers-to-numbers comparison. So if you search for 1234, it will say that '1234abcd' is a match.  Example:

<?php
$test_array = array('test', '1234abcd');
if (in_array(1234, $test_array)) {
    echo '1234 is a match!';
}
?>
tjamadeira at gmail dot com 29-Jan-2016 07:17
This function is for search a needle in a multidimensional haystack:

<?php
/**
 * A special function for search in a multidimensional array a needle
 *
 * @param mixed needle The searched variable
 * @param array haystack The array where search
 * @param bool strict It is or it isn't a strict search?
 *
 * @return bool
 **/
function in_array_r($needle, $haystack, $strict = false){
 foreach($haystack as $item){
   if(is_array($item)){
     if(in_array_r($needle, $item, $strict)){
       return true;
     }
   }else{
     if(($strict ? $needle === $item : $needle == $item)){
       return true;
     }
   }
 }
 return false;
}
?>
splogamurugan at gmail dot com 06-Nov-2015 11:49
var_dump(in_array('invalid', array(0,10,20)));
The above code gives true since the 'invalid' is getting converted to 0 and checked against the array(0,10,20)

but var_dump(in_array('invalid', array(10,20)));  gives 'false' since 0 not there in the array
dazero0 dot ls at gmail dot com 24-Sep-2015 10:43
I would like to add something to beingmrkenny at gmail dot com comparison post. After debugging a system, i discovered a security issue in our system and his post helped me find the problem.

In my additional testing i found out that not matter what you search for in an array, except for 0 and null, you get true as the result if the array contains true as the value.

Examples as php code :

<?php
$a = ['a', 32, true, 'x' => y];
var_dump(in_array(25, $a)); // true, one would expect false
var_dump(in_array('ggg', $a)); // true, one would expect false

var_dump(in_array(0, $a)); // false
var_dump(in_array(null, $a)); // false
?>

Such the best practice in our case is to use strict mode. Which was not so obvious.
Harry Willis 24-Jan-2015 11:39
Kelvin's case-insensitive in_arrayi is fine if you desire loose typing, but mapping strtolower onto the array will (attempt to) cast all array members to string. If you have an array of mixed types, and you wish to preserve the typing, the following will work:

<?php
function in_array_ci($needle, array $haystack, $strict = false) {
    foreach ($haystack as $element) {
        if (gettype($needle) == 'string' && gettype($element) == 'string') {
            if (!strcasecmp($needle, $element)) {
                return true;
            }
        }
        elseif ($strict) {
            if ($needle === $element) {
                return true;
            }
        }
        else {
            if ($needle == $element) {
                return true;
            }
        }
    }

    return false;
}
?>
what loose checking means 20-Jan-2014 05:03
In a high-voted example, an array is given that contains, amongst other things, true, false and null, against which various variables are tested using in_array and loose checking.

It impossible to receive false as a return value from in_array using loose checking if your arrays contains both the constants true and false. You might understandably trip over this (or the inverse - passing boolean true to check against an array of e.g. non-empty strings), but it's certainly not counter intuitive and makes perfect sense.
rolf dot dergham dot public at gmail dot com 13-Jan-2014 01:02
Watch out for this:

<?

print_r( (int) in_array('hello',array( 0 => 0)) );

?>

returns 1

Yes, it seems that is_array thinks that a random string and 0 are the same thing.
Excuse me, that's not loose checking, that's drunken logic.
Or maybe I found a bug?
Valerchik 13-May-2013 07:30
Beware when using this function to validate user input:

$a = array('0' => 'Opt 1', '1' => 'Opt 2', '2' => 'Opt 3');
$v = 'sql injection';
var_dump(in_array($v, array_keys($a)));

This will result : true;

array_keys($a) will cast array keys to int instead of string !
then when in_array will compare it will cast  'sql injection' to int 0 !
Beware of this!
janis dot janovskis at gmail dot com 28-Feb-2012 11:03
Since sometimes in_array returns strange results - see notes above.
I was able to find value in array by this quite a simple function;
<?php
/**
* $find <mixed> value to find
* $array<array> array to search in
*/

function _value_in_array($array, $find){
 $exists = FALSE;
 if(!is_array($array)){
   return;
}
foreach ($array as $key => $value) {
  if($find == $value){
       $exists = TRUE;
  }
}
  return $exists;
}

// Note
// You can't use wildcards and it does not check variable type
?>
beingmrkenny at gmail dot com 27-Oct-2011 03:35
Loose checking returns some crazy, counter-intuitive results when used with certain arrays. It is completely correct behaviour, due to PHP's leniency on variable types, but in "real-life" is almost useless.

The solution is to use the strict checking option.

<?php

// Example array

$array = array(
    'egg' => true,
    'cheese' => false,
    'hair' => 765,
    'goblins' => null,
    'ogres' => 'no ogres allowed in this array'
);

// Loose checking -- return values are in comments

// First three make sense, last four do not

in_array(null, $array); // true
in_array(false, $array); // true
in_array(765, $array); // true
in_array(763, $array); // true
in_array('egg', $array); // true
in_array('hhh', $array); // true
in_array(array(), $array); // true

// Strict checking

in_array(null, $array, true); // true
in_array(false, $array, true); // true
in_array(765, $array, true); // true
in_array(763, $array, true); // false
in_array('egg', $array, true); // false
in_array('hhh', $array, true); // false
in_array(array(), $array, true); // false

?>
Lea Hayes 04-Aug-2011 05:40
Determine whether an object field matches needle.

Usage Example:
---------------

<?php
$arr = array( new stdClass(), new stdClass() );
$arr[0]->colour = 'red';
$arr[1]->colour = 'green';
$arr[1]->state  = 'enabled';

if (in_array_field('red', 'colour', $arr))
   echo 'Item exists with colour red.';
if (in_array_field('magenta', 'colour', $arr))
   echo 'Item exists with colour magenta.';
if (in_array_field('enabled', 'state', $arr))
   echo 'Item exists with enabled state.';
?>

Output:
--------
Item exists with colour red.
Item exists with enabled state.

<?php
function in_array_field($needle, $needle_field, $haystack, $strict = false) {
    if ($strict) {
        foreach ($haystack as $item)
            if (isset($item->$needle_field) && $item->$needle_field === $needle)
                return true;
    }
    else {
        foreach ($haystack as $item)
            if (isset($item->$needle_field) && $item->$needle_field == $needle)
                return true;
    }
    return false;
}
?>
ctulek at gmail dot com 30-Aug-2010 11:07
If you have an array like:
$arr = array(0,1,2,3,4,5);

in_array(NULL, $arr) returns true because you have 0 in your array. That is, in_array does not use === for equal check.
bogdan AT bogdanconstantinescu DOT com 21-Apr-2010 08:01
If you found yourself in need of a multidimensional array in_array like function you can use the one below. Works in a fair amount of time

<?php

    function in_multiarray($elem, $array)
    {
        $top = sizeof($array) - 1;
        $bottom = 0;
        while($bottom <= $top)
        {
            if($array[$bottom] == $elem)
                return true;
            else
                if(is_array($array[$bottom]))
                    if(in_multiarray($elem, ($array[$bottom])))
                        return true;

            $bottom++;
        }
        return false;
    }
?>
jv at vip dot ie 13-Feb-2010 04:46
If you're working with very large 2 dimensional arrays (eg 20,000+ elements) it's much faster to do this...

<?php
$needle = 'test for this';

$flipped_haystack = array_flip($haystack);

if ( isset($flipped_haystack[$needle]) )
{
  print "Yes it's there!";
}
?>

I had a script that went from 30+ seconds down to 2 seconds (when hunting through a 50,000 element array 50,000 times).

Remember to only flip it once at the beginning of your code though!
thomas dot sahlin at gmail dot com 05-Oct-2009 12:53
If you're creating an array yourself and then using in_array to search it, consider setting the keys of the array and using isset instead since it's much faster.

<?php

$slow = array('apple', 'banana', 'orange');

if (in_array('banana', $slow))
    print('Found it!');

$fast = array('apple' => 'apple', 'banana' => 'banana', 'orange' => 'orange');

if (isset($fast['banana']))
    print('Found it!');

?>
john at dwarven dot co dot uk 01-Jul-2009 04:34
I just struggled for a while with this, although it may be obvious to others.

If you have an array with mixed type content such as:

<?php

 $ary = array (
   1,
   "John",
   0,
   "Foo",
   "Bar"
 );

?>

be sure to use the strict checking when searching for a string in the array, or it will match on the 0 int in that array and give a true for all values of needle that are strings strings.

<?php

var_dump( in_array( 2, $ary ) );

// outputs FALSE

var_dump( in_array( 'Not in there', $ary ) );

// outputs TRUE

var_dump( in_array( 'Not in there', $ary, TRUE ) );

// outputs FALSE

?>
Kelvin J 28-Feb-2009 05:04
For a case-insensitive in_array(), you can use array_map() to avoid a foreach statement, e.g.:

<?php
    function in_arrayi($needle, $haystack) {
        return in_array(strtolower($needle), array_map('strtolower', $haystack));
    }
?>
rhill at xenu-directory dot net 17-Jan-2009 01:05
I found out that in_array will *not* find an associative array within a haystack of associative arrays in strict mode if the keys were not generated in the *same order*:

<?php

$needle = array(
    'fruit'=>'banana', 'vegetable'=>'carrot'
    );

$haystack = array(
    array('vegetable'=>'carrot', 'fruit'=>'banana'),
    array('fruit'=>'apple', 'vegetable'=>'celery')
    );

echo in_array($needle, $haystack, true) ? 'true' : 'false';
// Output is 'false'

echo in_array($needle, $haystack) ? 'true' : 'false';
// Output is 'true'

?>

I had wrongly assumed the order of the items in an associative array were irrelevant, regardless of whether 'strict' is TRUE or FALSE: The order is irrelevant *only* if not in strict mode.
crashrox at gmail dot com 21-Jul-2008 08:34
Recursive in array using SPL

<?php
function in_array_recursive($needle, $haystack) {

    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($haystack));

    foreach($it AS $element) {
        if($element == $needle) {
            return true;
        }
    }

    return false;
}
?>
Martijn Wieringa 19-May-2008 02:20
When using numbers as needle, it gets tricky:

Note this behaviour (3rd statement):

in_array(0, array(42)) = FALSE
in_array(0, array('42')) = FALSE
in_array(0, array('Foo')) = TRUE
in_array('0', array('Foo')) = FALSE
sick949 at hotmail dot com 05-Mar-2008 03:43
A first idea for a function that checks if a text is in a specific column of an array.
It does not use in_array function because it doesn't check via columns.
Its a test, could be much better. Do not use it without test.

<?php

function in_array_column($text, $column, $array)
{
    if (!empty($array) && is_array($array))
    {
        for ($i=0; $i < count($array); $i++)
        {
            if ($array[$i][$column]==$text || strcmp($array[$i][$column],$text)==0) return true;
        }
    }
    return false;
}

?>
musik at krapplack dot de 04-Jun-2006 05:52
I needed a version of in_array() that supports wildcards in the haystack. Here it is:

<?php
function my_inArray($needle, $haystack) {
    # this function allows wildcards in the array to be searched
    foreach ($haystack as $value) {
        if (true === fnmatch($value, $needle)) {
            return true;
        }
    }
    return false;
}

$haystack = array('*krapplack.de');
$needle = 'www.krapplack.de';

echo my_inArray($needle, $haystack); # outputs "true"
?>

Unfortunately, fnmatch() is not available on Windows or other non-POSIX compliant systems.

Cheers,
Thomas
adrian foeder 08-Nov-2005 01:21
hope this function may be useful to you, it checks an array recursively (if an array has sub-array-levels) and also the keys, if wanted:

<?php
function rec_in_array($needle, $haystack, $alsokeys=false)
    {
        if(!is_array($haystack)) return false;
        if(in_array($needle, $haystack) || ($alsokeys && in_array($needle, array_keys($haystack)) )) return true;
        else {
            foreach($haystack AS $element) {
                $ret = rec_in_array($needle, $element, $alsokeys);
            }
        }

        return $ret;
    }
?>
Aragorn5551 at gmx dot de 11-Jun-2005 05:26
If you have a multidimensional array filled only with Boolean values like me, you need to use 'strict', otherwise in_array() will return an unexpected result.

Example:

<?php
$error_arr = array('error_one' => FALSE, 'error_two' => FALSE, array('error_three' => FALSE, 'error_four' => FALSE));

if (in_array (TRUE, $error_arr)) {
   echo 'An error occurred';
}
else {
   echo 'No error occurred';
}
?>

This will return 'An error occurred' although theres no TRUE value inside the array in any dimension. With 'strict' the function will return the correct result 'No error occurred'.

Hope this helps somebody, cause it took me some time to figure this out.


Alias de array_key_exists

  • « in_array
  • key »
  • PHP Manual
  • Fonctions sur les tableaux
  • Alias de array_key_exists

key_exists

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

key_exists — Alias de array_key_exists()

Description

Cette fonction est un alias de : array_key_exists().

User Contributed Notes

There are no user contributed notes for this page.


Retourne une clé d'un tableau associatif

  • « key_exists
  • krsort »
  • PHP Manual
  • Fonctions sur les tableaux
  • Retourne une clé d'un tableau associatif

key

(PHP 4, PHP 5, PHP 7, PHP 8)

key — Retourne une clé d'un tableau associatif

Description

key ( array|object $array ) : int|string|null

key() retourne la clé courante dans le tableau array.

Liste de paramètres

array

Le tableau.

Valeurs de retour

La fonction key() retourne simplement la clé de l'élément du tableau qui est actuellement pointée par le pointeur interne. Cette fonction ne modifie en aucun cas la position de ce pointeur. Si le pointeur interne pointe un élément se situant après la fin de la liste des éléments, ou bien si le tableau est vide, la fonction key() retournera null.

Historique

Version | Description
7.0.0 | array est maintenant toujours passé par valeur. Précédemment à cette version,il était passé par référence si possible et par valeur dans les autres cas.

Exemples

Exemple #1 Exemple avec key()

<?php
$array = array(
    'fruit1' => 'apple',
    'fruit2' => 'orange',
    'fruit3' => 'grape',
    'fruit4' => 'apple',
    'fruit5' => 'apple');

// Cette boucle affiche toutes les clés
// dont la valeur vaut "apple"
while ($fruit_name = current($array)) {
    if ($fruit_name == 'apple') {
        echo key($array), "\n";
    }
    next($array);
}
?>

L'exemple ci-dessus va afficher :

fruit1<br />
fruit4<br />
fruit5<br />

Voir aussi

  • current() - Retourne l'élément courant du tableau
  • next() - Avance le pointeur interne d'un tableau
  • foreach

User Contributed Notes

Md Tahazzot 13-Dec-2019 06:02
(Editor note: Or just use the array_keys function)

Make as simple as possible but not simpler like this one :)

$k = array();
for($i = 0; $i < count($arr); $i++){
    $k[$i] = key($arr);
    next($arr);
}
danielmadsv at gmail dot com 24-Mar-2019 01:07
In addition to FatBat's response, if you'd like to find out the highest key in an array (assoc or not) but don't want to arsort() it, take a look at this:

<?php

$arr = [ '3' => 14, '1' => 15, '4' => 92, '15' => 65 ];

$key_of_max = array_search( max($arr) , $arr);

?>
lhardie 23-Apr-2014 04:05
Note that using key($array) in a foreach loop may have unexpected results.

When requiring the key inside a foreach loop, you should use:
foreach($array as $key => $value)

I was incorrectly using:
<?php
foreach($array as $value)
{
  $mykey = key($array);
}
?>

and experiencing errors (the pointer of the array is already moved to the next item, so instead of getting the key for $value, you will get the key to the next value in the array)

CORRECT:
<?php
foreach($array as $key => $value)
{
  $mykey = $key;
}

A noob error, but felt it might help someone else out there.
vinob44 at gmail dot com 23-Oct-2013 11:43
Suppose if the array values are in numbers and numbers contains `0` then the loop will be terminated. To overcome this you can user like this

<?php
$array = array(
    '0' => '5',
    '1' => '2',
    '2' => '0',
    '3' => '3',
    '4' => '1');

// wrong approach

while ($fruit_name = current($array)) {

        echo key($array).'<br />';
       next($array);
}

// the way will be break loop when arra('2'=>0) because its value is '0', while(0) will terminate the loop

// correct approach
while ( ($fruit_name = current($array)) !== FALSE ) {

        echo key($array).'<br />';
       next($array);
}
//this will work properly
?>
FatBat 17-Oct-2011 12:20
Needed to get the index of the max/highest value in an assoc array.
max() only returned the value, no index, so I did this instead.

<?php
reset($x);   // optional.
arsort($x);
$key_of_max = key($x);   // returns the index.
?>


Trie un tableau en sens inverse et suivant les clés

  • « key
  • ksort »
  • PHP Manual
  • Fonctions sur les tableaux
  • Trie un tableau en sens inverse et suivant les clés

krsort

(PHP 4, PHP 5, PHP 7, PHP 8)

krsort — Trie un tableau en sens inverse et suivant les clés

Description

krsort ( array &$array , int $flags = SORT_REGULAR ) : bool

krsort() trie le tableau array en ordre inverse et suivant les clés, en maintenant la correspondance entre les clés et les valeurs. Cette fonction est pratique pour les tableaux associatifs.

Liste de paramètres

array

Le tableau d'entrée.

flags

Le deuxième paramètre optionnel flags peut être utilisé pour modifier le comportement de tri en utilisant ces valeurs :

Type de drapeaux de tri :

  • SORT_REGULAR - compare items normally; the details are described in the comparison operators section
  • SORT_NUMERIC - compare les éléments numériquement
  • SORT_STRING - compare les éléments comme des chaînes de caractères
  • SORT_LOCALE_STRING - compare les éléments comme des chaînes de caractères, basé sur la locale courante. Ceci utilise la locale, qui peut être changée en utilisant setlocale()
  • SORT_NATURAL - compare les éléments comme des chaînes de caractères utilisant "l'ordre naturel" comme natsort()
  • SORT_FLAG_CASE - peut être combiné (OU bit à bit) avec SORT_STRING ou SORT_NATURAL pour trier les chaînes sans tenir compte de la casse

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec krsort()

<?php
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
krsort($fruits);
foreach ($fruits as $key => $val) {
    echo "$key = $val\n";
}
?>

L'exemple ci-dessus va afficher :

d = lemon
c = apple
b = banana
a = orange

Voir aussi

  • arsort() - Trie un tableau en ordre inverse et conserve l'association des index
  • ksort() - Trie un tableau suivant les clés
  • Les fonctions de tri des tableaux

User Contributed Notes

07-Aug-2005 06:37
To create a natural reverse sorting by keys, use the following function:

<?php
function natkrsort($array)
{
    $keys = array_keys($array);
    natsort($keys);

    foreach ($keys as $k)
    {
        $new_array[$k] = $array[$k];
    }

    $new_array = array_reverse($new_array, true);

    return $new_array;
}
?>
peter at pmkmedia dot com 07-Nov-2003 01:51
Best deal sorting:

This is a function that will sort an array with integer keys (weight) and float values (cost) and delete 'bad deals' - entries that are more costly than other entries that have greater or equal weight.

Input: an array of unsorted weight/cost pairs
Output: none

function BEST_DEALS($myarray)
{   // most weight for least cost:
    // ? Peter Kionga-Kamau, http://www.pmkmedia.com
    // thanks to Nafeh for the reversal trick
    // free for unrestricted use.
    krsort($myarray, SORT_NUMERIC);
    while(list($weight, $cost) = each($myarray))
    {   // delete bad deals, retain best deals:
        if(!$lastweight)
        {
            $lastweight=$weight;
            $lastcost = $cost;
        }
        else if($cost >= $lastcost) unset($myarray[$weight]);
        else
        {
            $lastweight=$weight;
            $lastcost = $cost;
        }
    }
    ksort($myarray);
}


Trie un tableau suivant les clés

  • « krsort
  • list »
  • PHP Manual
  • Fonctions sur les tableaux
  • Trie un tableau suivant les clés

ksort

(PHP 4, PHP 5, PHP 7, PHP 8)

ksort — Trie un tableau suivant les clés

Description

ksort ( array &$array , int $flags = SORT_REGULAR ) : bool

Trie le tableau array suivant les clés, en maintenant la correspondance entre les clés et les valeurs. Cette fonction est pratique pour les tableaux associatifs.

Liste de paramètres

array

Le tableau d'entrée.

flags

Le deuxième paramètre optionnel flags peut être utilisé pour modifier le comportement de tri en utilisant ces valeurs :

Type de drapeaux de tri :

  • SORT_REGULAR - compare items normally; the details are described in the comparison operators section
  • SORT_NUMERIC - compare les éléments numériquement
  • SORT_STRING - compare les éléments comme des chaînes de caractères
  • SORT_LOCALE_STRING - compare les éléments comme des chaînes de caractères, basé sur la locale courante. Ceci utilise la locale, qui peut être changée en utilisant setlocale()
  • SORT_NATURAL - compare les éléments comme des chaînes de caractères utilisant "l'ordre naturel" comme natsort()
  • SORT_FLAG_CASE - peut être combiné (OU bit à bit) avec SORT_STRING ou SORT_NATURAL pour trier les chaînes sans tenir compte de la casse

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec ksort()

<?php
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort($fruits);
foreach ($fruits as $key => $val) {
    echo "$key = $val\n";
}
?>

L'exemple ci-dessus va afficher :

a = orange
b = banana
c = apple
d = lemon

Voir aussi

  • asort() - Trie un tableau et conserve l'association des index
  • Les fonctions de tri des tableaux

User Contributed Notes

orlov0562 at gmail dot com 07-Jul-2017 01:13
The first thing that I didn't find in description it's that this function return results from MIN value to MAX value, ex: [-5=>'', 0=>'', 5=>'' ]

Also you should know that by default, it has correct sorting for keys that represented as string but has a number as value, ex: ['-5'=>'', '0'=>'', '5'=>'' ]

Few examples with results:

-----------------------------------------

DESCRIPTION: Keys are numbers + default flag (SORT_REGULAR)

$arr = [
    -5 => 'minus five',
    0 => 'zero',
    1 => 'one',
    2 => 'two',
    100 => 'hundred',
];

ksort($arr);
print_r($arr);

RESULT:

Array
(
    [-5] => minus five
    [0] => zero
    [1] => one
    [2] => two
    [100] => hundred
)

-----------------------------------------
DESCRIPTION: Keys are string numbers + default flag (SORT_REGULAR)

$arr = [
    '-5' => 'minus five',
    '0' => 'zero',
    '1' => 'one',
    '2' => 'two',
    '100' => 'hundred',
];

ksort($arr);
print_r($arr);

RESULT:

Array
(
    [-5] => minus five
    [0] => zero
    [1] => one
    [2] => two
    [100] => hundred
)

-----------------------------------------
DESCRIPTION: Keys are string numbers + SORT_STRING flag

$arr = [
    '-5' => 'minus five',
    '0' => 'zero',
    '1' => 'one',
    '2' => 'two',
    '100' => 'hundred',
];

ksort($arr, SORT_STRING);
print_r($arr);

RESULT:

Array
(
    [-5] => minus five
    [0] => zero
    [1] => one
    [100] => hundred
    [2] => two
)

-----------------------------------------

DESCRIPTION: Keys are string numbers + SORT_NUMERIC flag

$arr = [
    '-5' => 'minus five',
    '0' => 'zero',
    '1' => 'one',
    '2' => 'two',
    '100' => 'hundred',
];

ksort($arr, SORT_NUMERIC);
print_r($arr);

RESULT:

Array
(
    [-5] => minus five
    [0] => zero
    [1] => one
    [2] => two
    [100] => hundred
)
bimal at sanjaal dot com 26-May-2014 07:33
An example of reverse sorting a domain name by its name.

<?php
$domains = array(
    'sub.domain.com',
    'sub2.domain.com',
);

foreach($domains as $d => $domain)
{
    $chunks = explode('.', $domain);
    krsort($chunks);

    echo "\r\n<br>", implode('/', $chunks);
}

/**
 * Outputs as:
 *
 * com/domain/sub
 * com/domain/sub2
 */
?>
Anonymous 10-Feb-2014 05:43
@thegrandoverseer

you could also use the build-in php array functions to get exactly what you want to have:

<?php
        $seed_array = array('foo'=>'bar', 'someotherkey'=>'whatev', 'bar'=>'baz', 'baz'=>'foo', 'anotherkey'=>'anotherval');
        $keys_array = array('baz', 'foo', 'bar');

        $return_array = array_intersect_key($seed_array, array_flip($keys_array)) + array_diff_key($seed_array, array_flip($keys_array));

?>
Anonymous 13-Aug-2013 01:11
Note that this function will output the given $fields in the order they were added to the data array and not automatically in numerical key order.

To output in ascending key order, you'll need to ksort the array first (or use appropriate natural order sorting, depending on your keys).

For example:
<?php
$data[2] = 'C';
$data[0] = 'A';
$data[1] = 'B';

fputcsv($fh, $data); // outputs: "C,A,B"

ksort($data);
fputcsv($fh, $data); // outputs: "A,B,C"
?>
centraleffects at yahoo dot com 06-Jun-2013 05:46
I wrote this function to sort meta_value in wordpress. I tried a lot of array sorting but neither of them work. But this is not suitable for multidimensional array. This is intended only for wordpress meta_value

The problem is to sort below( the order should be ascending; alphabetically then numerically like A-Z then 0-9):
500-999 users
25-49 users
 All Sizes
1-4 users
5-9 users
10-24 users
250-499 users
1000-4999
5000-9999

The solution:

function array_sort($arr){
    if(is_array($arr)){
        $numeric = array();
        $string = array();
        foreach($arr as $k => $v)
        {
            if(isset($v["meta_value"])){
                 $str = explode(" ",trim($v["meta_value"]));
                 $firstWord  = explode("-",trim($str[0]));
             }else{
                 $str = $v;
                 $firstWord  = explode("-",trim($str));
             }

            $firstWord = $firstWord[0];

            if(is_numeric($firstWord))
            {
                $numeric[(int)$firstWord] = $v;
            }else{
                $string[$firstWord] = $v;
            }
            unset($firstWord);
        }
        ksort($string,SORT_STRING);
        ksort($numeric,SORT_NUMERIC);

        return array_merge((array)$string, (array)$numeric);
    }

    return false;
}

The usage:
$meta =get_post_meta($post_id,$meta_key);
$sorted = array_sort($meta);

The result:
 All Sizes
1-4 users
5-9 users
10-24 users
25-49 users
250-499 users
500-999 users
1000-4999
5000-9999
stephen [ at ] brooksie-net [ dot ] co [ dot ] uk 17-Apr-2013 05:10
ksort and krsort fail to undestand scientific notation, https://bugs.php.net/bug.php?id=43053, therefore when sorting numeric keys, if the key is of the form 0.00001 php will represent it as 1.0E-5.

These methods will assume this to be a string and therefore not organise your array as you may expect.

When using value of this form for array keys use sprintf('%f', 0.00001) to generate the key, for smaller values the precision needs to be included
e.g. sprintf('%0.10f', 0.00000001)
thegrandoverseer 13-Jul-2012 06:11
I wrote this function to sort the keys of an array using an array of keynames, in order.
<?php
/**
 * function array_reorder_keys
 * reorder the keys of an array in order of specified keynames; all other nodes not in $keynames will come after last $keyname, in normal array order
 * @param array &$array - the array to reorder
 * @param mixed $keynames - a csv or array of keynames, in the order that keys should be reordered
 */
function array_reorder_keys(&$array, $keynames){
    if(empty($array) || !is_array($array) || empty($keynames)) return;
    if(!is_array($keynames)) $keynames = explode(',',$keynames);
    if(!empty($keynames)) $keynames = array_reverse($keynames);
    foreach($keynames as $n){
        if(array_key_exists($n, $array)){
            $newarray = array($n=>$array[$n]); //copy the node before unsetting
            unset($array[$n]); //remove the node
            $array = $newarray + array_filter($array); //combine copy with filtered array
        }
    }
}
$seed_array = array('foo'=>'bar', 'someotherkey'=>'whatev', 'bar'=>'baz', 'baz'=>'foo', 'anotherkey'=>'anotherval');
array_reorder_keys($seed_array, 'baz,foo,bar'); //returns array('baz'=>'foo', 'foo'=>'bar', 'bar'=>'baz', 'someotherkey'=>'whatev', 'anotherkey'=>'anotherval' );
?>
jakub dot lopuszanski at nasza-klasa dot pl 14-Apr-2011 08:48
Note that ksort will NOT help you much if numeric and string keys are mixed together.
<?php
$t = array(
  "a"=>"A",
  0=>"A",
  "b"=>"A",
  1=>"A"
);
var_dump($t);
ksort($t);
var_dump($t);
?>

produces (on PHP 5.3.6-4 with Suhosin-Patch) :

array(4) {
  ["a"]=>
  string(1) "A"
  [0]=>
  string(1) "A"
  ["b"]=>
  string(1) "A"
  [1]=>
  string(1) "A"
}

array(4) {
  ["b"]=>
  string(1) "A"
  [0]=>
  string(1) "A"
  ["a"]=>
  string(1) "A"
  [1]=>
  string(1) "A"
}

note that the second array should be sorted by keys, but is even more messed up than the first one!
DavidG 17-Jun-2010 06:47
A nice way to do sorting of a key on a multi-dimensional array without having to know what keys you have in the array first:

<?php
$people = array(
array("name"=>"Bob","age"=>8,"colour"=>"red"),
array("name"=>"Greg","age"=>12,"colour"=>"blue"),
array("name"=>"Andy","age"=>5,"colour"=>"purple"));

var_dump($people);

$sortArray = array();

foreach($people as $person){
    foreach($person as $key=>$value){
        if(!isset($sortArray[$key])){
            $sortArray[$key] = array();
        }
        $sortArray[$key][] = $value;
    }
}

$orderby = "name"; //change this to whatever key you want from the array

array_multisort($sortArray[$orderby],SORT_DESC,$people);

var_dump($people);
?>

Output from first var_dump:

[0]=&gt;
  array(3) {
    ["name"]=&gt;
    string(3) "Bob"
    ["age"]=&gt;
    int(8)
    ["colour"]=&gt;
    string(3) "red"
  }
  [1]=&gt;
  array(3) {
    ["name"]=&gt;

    string(4) "Greg"
    ["age"]=&gt;
    int(12)
    ["colour"]=&gt;
    string(4) "blue"
  }
  [2]=&gt;
  array(3) {
    ["name"]=&gt;
    string(4) "Andy"
    ["age"]=&gt;
    int(5)
    ["colour"]=&gt;

    string(6) "purple"
  }
}

Output from 2nd var_dump:

array(3) {
  [0]=&gt;
  array(3) {
    ["name"]=&gt;
    string(4) "Greg"
    ["age"]=&gt;
    int(12)
    ["colour"]=&gt;
    string(4) "blue"
  }
  [1]=&gt;
  array(3) {
    ["name"]=&gt;

    string(3) "Bob"
    ["age"]=&gt;
    int(8)
    ["colour"]=&gt;
    string(3) "red"
  }
  [2]=&gt;
  array(3) {
    ["name"]=&gt;
    string(4) "Andy"
    ["age"]=&gt;
    int(5)
    ["colour"]=&gt;

    string(6) "purple"
  }

There's no checking on whether your array keys exist, or the array data you are searching on is actually there, but easy enough to add.
serpro at gmail dot com 13-Mar-2009 02:02
Here is a function to sort an array by the key of his sub-array.

<?php

function sksort(&$array, $subkey="id", $sort_ascending=false) {

    if (count($array))
        $temp_array[key($array)] = array_shift($array);

    foreach($array as $key => $val){
        $offset = 0;
        $found = false;
        foreach($temp_array as $tmp_key => $tmp_val)
        {
            if(!$found and strtolower($val[$subkey]) > strtolower($tmp_val[$subkey]))
            {
                $temp_array = array_merge(    (array)array_slice($temp_array,0,$offset),
                                            array($key => $val),
                                            array_slice($temp_array,$offset)
                                          );
                $found = true;
            }
            $offset++;
        }
        if(!$found) $temp_array = array_merge($temp_array, array($key => $val));
    }

    if ($sort_ascending) $array = array_reverse($temp_array);

    else $array = $temp_array;
}

?>

Example
<?php
$info = array("peter" => array("age" => 21,
                                           "gender" => "male"
                                           ),
                   "john"  => array("age" => 19,
                                           "gender" => "male"
                                           ),
                   "mary" => array("age" => 20,
                                           "gender" => "female"
                                          )
                  );

sksort($info, "age");
var_dump($info);

sksort($info, "age", true);
var_dump($ifno);
?>

This will be the output of the example:

/*DESCENDING SORT*/
array(3) {
  ["peter"]=>
  array(2) {
    ["age"]=>
    int(21)
    ["gender"]=>
    string(4) "male"
  }
  ["mary"]=>
  array(2) {
    ["age"]=>
    int(20)
    ["gender"]=>
    string(6) "female"
  }
  ["john"]=>
  array(2) {
    ["age"]=>
    int(19)
    ["gender"]=>
    string(4) "male"
  }
}

/*ASCENDING SORT*/
array(3) {
  ["john"]=>
  array(2) {
    ["age"]=>
    int(19)
    ["gender"]=>
    string(4) "male"
  }
  ["mary"]=>
  array(2) {
    ["age"]=>
    int(20)
    ["gender"]=>
    string(6) "female"
  }
  ["peter"]=>
  array(2) {
    ["age"]=>
    int(21)
    ["gender"]=>
    string(4) "male"
  }
}
maik dot riechert at animey dot net 12-Aug-2008 11:32
Be careful when using ksort for mixed type keys!!

$a = array(
    'first' => true,
    0       => 'sally',
);

$b = array(
    0       => 'sally',
    'first' => true,
);

ksort($a);
ksort($b);
var_dump($a);
var_dump($b);

Output is:
array(
    0 => 'sally',
    'first' => true,
)

array(
    'first' => true,
    0 => 'sally',
)

If you want same results for both arrays, use:

ksort($a, SORT_STRING);

The reason for that lays in the compare mechanism which would normally just typecast 'first' to an integer or 0 to a string when comparing it to each other. So you have to use SORT_STRING, otherwise you would lose information when 'first' is converted to int.
ssb45 at cornell dot edu 30-Jun-2005 04:58
The function that justin at booleangate dot org provides works well, but be aware that it is not a drop-in replacement for ksort as is.  While ksort sorts the array by reference and returns a status boolean, natksort returns the sorted array, leaving the original untouched.  Thus, you must use this syntax:

$array = natksort($array);

If you want to use the more natural syntax:

$status = natksort($array);

Then use this modified version:

function natksort(&$array) {
    $keys = array_keys($array);
    natcasesort($keys);

    foreach ($keys as $k) {
        $new_array[$k] = $array[$k];
    }

    $array = $new_array;
    return true;
}
justin at booleangate dot org 18-Jan-2005 01:04
Here's a handy function for natural order sorting on keys.

function natksort($array) {
  // Like ksort but uses natural sort instead
  $keys = array_keys($array);
  natsort($keys);

  foreach ($keys as $k)
    $new_array[$k] = $array[$k];

  return $new_array;
}
09-Mar-2002 07:09
here 2 functions to ksort/uksort an array and all its member arrays

function tksort(&$array)
  {
  ksort($array);
  foreach(array_keys($array) as $k)
    {
    if(gettype($array[$k])=="array")
      {
      tksort($array[$k]);
      }
    }
  }

function utksort(&$array, $function)
  {
  uksort($array, $function);
  foreach(array_keys($array) as $k)
    {
    if(gettype($array[$k])=="array")
      {
      utksort($array[$k], $function);
      }
    }
  }
delvach at mail dot com 06-Nov-2001 01:29
A real quick way to do a case-insensitive sort of an array keyed by strings:

uksort($myArray, "strnatcasecmp");
sbarnum at mac dot com 19-Oct-2001 03:54
ksort on an array with negative integers as keys yields some odd results.  Not sure if this is a bad idea (negative key values) or what.


Assigne des variables comme si elles étaient un tableau

  • « ksort
  • natcasesort »
  • PHP Manual
  • Fonctions sur les tableaux
  • Assigne des variables comme si elles étaient un tableau

list

(PHP 4, PHP 5, PHP 7, PHP 8)

list — Assigne des variables comme si elles étaient un tableau

Description

list ( mixed $var , mixed ...$vars = ? ) : array

Tout comme array(), list() n'est pas une véritable fonction, mais un élément de langage, qui permet de rassembler les variables varname, ... sous forme de tableau, pour les assigner en une seule ligne.

Note:

Avant PHP 7.1.0, list() fonctionne uniquement sur un tableau d'indice numérique et suppose que l'indice numérique commence à 0.

Avertissement

Avec PHP 5, list() assigne les valeurs commençant avec le paramètre le plus à droite. Avec PHP 7, list() commence avec le paramètre le plus à gauche.

Si vous utilisez des variables simples, vous n'avez pas à vous en préoccuper. Mais, si vous utilisez des tableaux avec des indices, vous vous attendrez généralement à ce que l'ordre des indices du tableau soit les mêmes que ceux écrit dans list(), de la gauche, vers la droite, ce qui n'est pas le cas dans PHP 5, qui faisait l'assignation dans l'ordre inverse.

D'une manière générale, il est conseillé de ne pas se fier à un ordre spécifique d'exécution, car cela pourrait changer à l'avenir.

Liste de paramètres

var

Une variable.

vars

Variables supplémentaires.

Valeurs de retour

Retourne le tableau assigné.

Historique

Version | Description
7.3.0 | Le support pour l'assignement par référence dans la déstructuration de tableau a été ajouté.
7.1.0 | Il est maintenant possible de spécifier les clés dans la list(). Cela permet de déstructurer des tableaux avec des clés non-entières ou non séquentielles.
7.0.0 | L'ordre dans lequel l'opération d'assignation est exécutée a changé.
7.0.0 | Les expressions de list() ne peuvent plus être complètement vide.
7.0.0 | Les chaînes de caractères ne peuvent plus être défaites.

Exemples

Exemple #1 Exemple avec list()

<?php

$info = array('coffee', 'brown', 'caffeine');

// Liste toutes les variables
list($drink, $color, $power) = $info;
echo "$drink is $color and $power makes it special.\n";

// Liste certaines variables
list($drink, , $power) = $info;
echo "$drink has $power.\n";

// Ou bien, n'utilisons que le troisième
list( , , $power) = $info;
echo "I need $power!\n";

// list() ne fonctionne pas avec les chaînes de caractères
list($bar) = "abcde";
var_dump($bar); // NULL
?>

Exemple #2 Exemple d'utilisation de list()

<table>
 <tr>
  <th>Employee name</th>
  <th>Salary</th>
 </tr>

<?php
$result = $pdo->query("SELECT id, name, salary FROM employees");
while (list($id, $name, $salary) = $result->fetch(PDO::FETCH_NUM)) {
    echo " <tr>\n" .
          "  <td><a href=\"info.php?id=$id\">$name</a></td>\n" .
          "  <td>$salary</td>\n" .
          " </tr>\n";
}

?>

</table>

Exemple #3 Utilisation d'un sous-list()

<?php

list($a, list($b, $c)) = array(1, array(2, 3));

var_dump($a, $b, $c);

?>
int(1)
int(2)
int(3)

Exemple #4 Utilisation de list() en tenant compte de l'ordre

<?php

$info = array('coffee', 'brown', 'caffeine');

list($a[0], $a[1], $a[2]) = $info;

var_dump($a);

?>

Cet exemple donne le résultat suivant (notez l'ordre d'affichage des éléments, en comparaison avec l'ordre dans lequel ils ont été écrits dans la syntaxe de list()) :

Résultat de l'exemple ci-dessus en PHP 7 :

array(3) {
  [0]=>
  string(6) "coffee"
  [1]=>
  string(5) "brown"
  [2]=>
  string(8) "caffeine"
}

Résultat de l'exemple ci-dessus en PHP 5 :

array(3) {
  [2]=>
  string(8) "caffeine"
  [1]=>
  string(5) "brown"
  [0]=>
  string(6) "coffee"
}

Exemple #5 list() et l'ordre de définition des index

L'ordre dans lequel les indices d'un tableau sont traités par list() sont définis est non pertinent.

<?php
$foo = array(2 => 'a', 'foo' => 'b', 0 => 'c');
$foo[1] = 'd';
list($x, $y, $z) = $foo;
var_dump($foo, $x, $y, $z);

Etant donné la sortie suivante (notez l'ordre des éléments comparés et dans quel ordre ils ont été écrits dans la syntaxe de la list()) :

array(4) {
  [2]=>
  string(1) "a"
  ["foo"]=>
  string(1) "b"
  [0]=>
  string(1) "c"
  [1]=>
  string(1) "d"
}
string(1) "c"
string(1) "d"
string(1) "a"

Exemple #6 list() avec des clés

Depuis PHP 7.1.0 list() peut maintenant contenir également des clés explicites, qui peuvent être donnés comme des expressions arbitraires. Le mixage des clés entier et chaîne de caractères est autorisé; Toutefois, les éléments avec et sans clés ne peuvent pas être mélangés.

<?php
$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];
foreach ($data as ["id" => $id, "name" => $name]) {
    echo "id: $id, name: $name\n";
}
echo PHP_EOL;
list(1 => $second, 3 => $fourth) = [1, 2, 3, 4];
echo "$second, $fourth\n";

L'exemple ci-dessus va afficher :

id: 1, name: Tom
id: 2, name: Fred

2, 4

Voir aussi

  • each() - Retourne chaque paire clé/valeur d'un tableau
  • array() - Crée un tableau
  • extract() - Importe les variables dans la table des symboles

User Contributed Notes

samraskul at gmail dot com 27-Feb-2021 08:53
list($a, $b, $c) = ["blue", "money", 32];

shortcut:

[$a, $b, $c] = ["blue", "money", 32];
sergey dot leonidovich dot shevchenko at gmail dot com 12-Feb-2021 01:17
['a' => $x, 'b' => $y] = ['a' => 1, 'b' => 2];

echo $x . '-' . $y; // 1-2
mark at manngo dot net 30-Dec-2020 03:46
For PHP 7.1 on, the documentation states that integer and string keys can be mixed, but that elements with and without keys cannot. Here is an example, using data from getimagesize() with mixed keys:

<?php
    $data=[
        0=> 160,
        1 => 120,
        2 => 2,
        3 => 'width="160" height="120"',
        'mime' => 'image/jpeg'
    ];
    list(0=>$width,1=>$height,2=>$type,3=>$dimensions,'mime'=>$mime)=$data;
?>

Here, the numeric keys also need to be specified, as if the whole array is treated as an associative array.

As noted elsewhere, the list() operator can be written in array format:

<?php
    [0=>$width,1=>$height,2=>$type,3=>$dimensions,'mime'=>$mime]=$data;
?>
fredsaavedra at hotmail dot com 18-Feb-2020 04:03
Easy way to get actual date and time values in variables.

list($day,$month,$year,$hour,$minute,$second) = explode('-',date('d-m-Y-G-i-s'));
echo "$day-$month-$year $hour".":".$minute.":".$second;
vike2000 at gmail dot com 23-Jan-2020 03:49
Setting it like <?php list($var1,$varN) = null ?> does _not_ raise an E_NOTICE (or other error) and afaics effectively equals an https://php.net/function.unset of $var1,$varN.

I note this as contrasting with the fact that PHP triggers an E_NOTICE about "Undefined offset" "if there aren't enough array elements to fill the list()", as attow documented for https://php.net/control-structures.foreach#control-structures.foreach.list and here only noted in https://php.net/function.list#122951 by Mardaneus.

For completeness, a bash(1) (v5.0 or 4.3 on macos10.13) cli test producing the same result for all my PHP-versions (installed via macports.org) follows. It's also tested with php7.3 using bash5.0 on Debian10:
bash --noprofile --norc -c 'for php in php{{53..56},{70..73}};do for literal in "array()" null;do echo -n $php …=$literal:&&$php -n -d error_reporting=E_ALL -r "var_dump(list(\$var)=$literal);";done;done'

# Above produces the same result pairs per version from:
php53 …=array():
Notice: Undefined offset: 0 in Command line code on line 1
array(0) {
}
# ... to:
php73 …=null:NULL
JD 23-Sep-2019 11:24
As of PHP 7.3, lists now support array destructuring - see here: https://www.php.net/manual/en/migration73.new-features.php
Paul Marti 02-Jul-2019 09:45
Since 7.1.0, you can use an array directly without list():

<?php
[$test, $test2] = explode(",", "hello, world");
echo $test . $test2; // hello, world
?>
Mardaneus 17-Jul-2018 08:14
Unless you specify keys when using list() it expects the array being fed into it to start at 0.

So having the following code will result in a notice level warning "Undefined offset: 0" and variables not filling as expected

<?php
list($c1, $c2, $c3) = array [1 =>'a', 2 => 'b', 3 => 'c'];

var_dump($c1); // NULL
var_dump($c2); // string(1) "a"
var_dump($c3); // string(1) "b"

?>
petru at fuxspam dot xtremeweb dot ro 13-Apr-2018 10:11
This is something I haven't seen in documentation.

Since PHP 7.1, you can use short-hand list unpacking using square brackets, just like short-hand array declaration:

<?php

$foo = ['a', 'b', 'c'];

// short-hand array definition
[$a, $b, $c] = $foo;
echo $a; // displays "a"

// it's same like:
list($x, $y, $z) = $foo;
echo $x; // displays "a"

?>
contato at tobias dot ws 28-Mar-2018 07:22
Since PHP 7.1 the [] may now be used as an alternative to the existing list() syntax:

<?php
[$number, $message] = explode('|', '123|Hello World!');
?>
blazej 31-Aug-2017 02:00
From PHP Version 7.1 you can specify keys in list(), or its new shorthand [] syntax. This enables destructuring of arrays with non-integer or non-sequential keys.

<?php
$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];

// list() style
list("id" => $id1, "name" => $name1) = $data[0];

// [] style
["id" => $id1, "name" => $name1] = $data[0];

// list() style
foreach ($data as list("id" => $id, "name" => $name)) {
    // logic here with $id and $name
}

// [] style
foreach ($data as ["id" => $id, "name" => $name]) {
    // logic here with $id and $name
}
grzeniufication 27-May-2017 04:01
<?php
/**
 * It seems you can skip listed values.
 * Here's an example to show what I mean.
 *
 * FYI works just as well with PHP 7.1 shorthand list syntax.
 * Tested against PHP 5.6.30, 7.1.5
 */
$a = [ 1, 2, 3, 4 ];

// this is quite normal use case for list
echo "Unpack all values\n";
list($v1, $v2, $v3, $v4) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);

// this is what I mean:
echo "Skip middle\n";
list($v1, , , $v4) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);

echo "Skip beginning\n";
list( , , $v3, $v4) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);

echo "Skip end\n";
list($v1, $v2, , ) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);

echo "Leave middle\n";
list( , $v2, $v3, ) = $a;
echo "$v1, $v2, $v3, $v4\n";
unset($v1, $v2, $v3, $v4);
Rhamnia Mohamed 17-May-2017 11:37
Since PHP 7.1, keys can be specified

exemple :
<?php
$array = ['locality' => 'Tunis', 'postal_code' => '1110'];

list('postal_code' => $zipCode, 'locality' => $locality) = $array;

print $zipCode; // will output 1110
print $locality; // will output Tunis
 ?>
carlosv775 at gmail dot com 12-Jan-2017 08:30
In PHP 7.1 we can do the following:

<?php
    [$a, $b, $c] = ['a', 'b', 'c'];
?>

Before, we had to do:

<?php
    list($a, $b, $c) = ['a', 'b',  'c'];
?>
anthony dot ossent at live dot fr 23-Oct-2016 03:04
a simple example of use to swap two variables :

$a = 'hello';
$b = 'world';

list($a, $b) = [$b, $a];

echo $a . ' ' . $b; //display "world hello"

another example :

function getPosition($x, $y, $z)
{
   // ... some operations like $x++...
   return [$x, $y, $z];
}

list($x, $y, $z) = getPosition($x ,$y, $z);
pemapmodder1970 at gmail dot com 05-Feb-2016 04:08
list() can be used with foreach

<?php
$array = [[1, 2], [3, 4], [5, 6]];

foreach($array as list($odd, $even)){
    echo "$odd is odd; $even is even", PHP_EOL;
}
?>

The output:
===
1 is odd; 2 is even
3 is odd; 4 is even
5 is odd; 6 is even
Dean 10-Dec-2015 07:20
UNDOCUMENTED BEHAVIOR:

    list($a,$b,$c) = null;

in fact works like:

    $a = null; $b = null; $c = null;

...So correspondingly:

    list($rows[]) = null;

Will increment count($rows), just as if you had executed $rows[] = null;

Watch out for this (for example) when retrieving entire tables from a database, e.g.

    while (list($rows[]) = $mysqlresult->fetch_row());

This will leave an extra 'null' entry as the last element of $rows.
Colin Guthrie 20-Jul-2015 01:41
If you want use the undefined behaviour as you might expect it e.g. if you want:

  $b = ['a','b']; list($a, $b) = $b;

to result in $a=='a' and $b=='b', then you can just cast $b to an array (even although it already is) to create a copy. e.g.

  $b = ['a','b']; list($a, $b) = (array)$b;

and get the expected results.
grzeniufication 21-Oct-2014 10:35
The example showing that:

$info = array('kawa', 'brazowa', 'kofeina');
list($a[0], $a[1], $a[2]) = $info;
var_dump($a);

outputs:
array(3) {
[2]=>
string(8) "kofeina"
[1]=>
string(5) "brazowa"
[0]=>
string(6) "kawa"
}

One thing to note here is that if you define the array earlier, e.g.:
$a = [0, 0, 0];

the indexes will be kept in the correct order:

array(3) {
  [0]=>
  string(4) "kawa"
  [1]=>
  string(8) "brazowa"
  [2]=>
  string(7) "kofeina"
}

Thought that it was worth mentioning.
john at jbwalker dot com 08-Dec-2013 12:31
The list construct seems to look for a sequential list of indexes rather taking elements in sequence. What that obscure statement means is that if you unset an element, list will not simply jump to the next element and assign that to the variable but will treat the missing element as a null or empty variable:

    $test = array("a","b","c","d");
    unset($test[1]);
    list($a,$b,$c)=$test;
    print "\$a='$a' \$b='$b' \$c='$c'<BR>";

results in:
$a='a' $b='' $c='c'

not:
$a='a' $b='c' $c='d'
megan at voices dot com 10-Sep-2013 03:45
As noted, list() will give an error if the input array is too short. This can be avoided by array_merge()'ing in some default values. For example:

<?php
$parameter = 'name';
list( $a, $b ) = array_merge( explode( '=', $parameter ), array( true ) );
?>

However, you will have to array_merge with an array long enough to ensure there are enough elements (if $parameter is empty, the code above would still error).

An alternate approach would be to use array_pad on the array to ensure its length (if all the defaults you need to add are the same).

<?php
    $parameter = 'bob-12345';
    list( $name, $id, $fav_color, $age ) = array_pad( explode( '-', $parameter ), 4, '' );
    var_dump($name, $id, $fav_color, $age);
/* outputs
string(3) "bob"
string(5) "12345"
string(0) ""
string(0) ""
*/
?>
svennd 23-Dec-2012 07:08
The list() definition won't throw an error if your array is longer then defined list.
<?php

list($a, $b, $c) = array("a", "b", "c", "d");

var_dump($a); // a
var_dump($b); // b
var_dump($c); // c
?>
chris at chlab dot ch 07-Nov-2012 03:00
The example states the following:
<?php
// list() doesn't work with strings
list($bar) = "abcde";
var_dump($bar);
// output: NULL
?>

If the string is in a variable however, it seems using list() will treat the string as an array:
<?php
$string = "abcde";
list($foo) = $string;
var_dump($foo);
// output: string(1) "a"
?>


Trie un tableau avec l'algorithme à "ordre naturel" insensible à la casse

  • « list
  • natsort »
  • PHP Manual
  • Fonctions sur les tableaux
  • Trie un tableau avec l'algorithme à "ordre naturel" insensible à la casse

natcasesort

(PHP 4, PHP 5, PHP 7, PHP 8)

natcasesort — Trie un tableau avec l'algorithme à "ordre naturel" insensible à la casse

Description

natcasesort ( array &$array ) : bool

natcasesort() est la version insensible à la casse de natsort().

Cette fonction implémente un algorithme de tri qui traite les chaînes alphanumériques du tableau array comme un être humain tout en conservant la relation clé/valeur. C'est ce qui est appelé l'"ordre naturel".

Note:

Si deux membres se comparent comme égaux, leur ordre relatif dans le tableau trié n'est pas défini.

Liste de paramètres

array

Le tableau d'entrée.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec natcasesort()

<?php
$array1 = $array2 = array('IMG0.png', 'img12.png', 'img10.png', 'img2.png', 'img1.png', 'IMG3.png');

sort($array1);
echo "Tri standard\n";
print_r($array1);

natcasesort($array2);
echo "\nTri en ordre naturel (insensible à la casse)\n";
print_r($array2);
?>

L'exemple ci-dessus va afficher :

Tri standard
Array
(
    [0] => IMG0.png
    [1] => IMG3.png
    [2] => img1.png
    [3] => img10.png
    [4] => img12.png
    [5] => img2.png
)

Tri en ordre naturel (insensible à la casse)
Array
(
    [0] => IMG0.png
    [4] => img1.png
    [3] => img2.png
    [5] => IMG3.png
    [2] => img10.png
    [1] => img12.png
)

Pour plus de détails, rendez-vous sur le site de Martin Pool sur » la comparaison de chaînes en ordre naturel.

Voir aussi

  • natsort() - Trie un tableau avec l'algorithme à "ordre naturel"
  • Les fonctions de tri des tableaux
  • strnatcmp() - Comparaison de chaînes avec l'algorithme d'"ordre naturel"
  • strnatcasecmp() - Comparaison de chaînes avec l'algorithme d'"ordre naturel" (insensible à la casse)

User Contributed Notes

w-dot-rosenbach-at-netskill-de 14-Dec-2010 09:45
Sorting UTF-8 by arbitrary order:

<?php
mb_internal_encoding("UTF-8");

class utf_8_german
{
  // everything else is sorted at the end
  static $order = '0123456789AaÄäBbCcDdEeFfGgHhIiJjKkLlMm
NnOoÖöPpQqRrSsßTtUuÜüVvWwXxYyZz';
  static $char2order;

  static function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }

    // lazy init mapping
    if (empty(self::$char2order))
    {
      $order = 1;
      $len = mb_strlen(self::$order);
      for ($order=0; $order<$len; ++$order)
      {
        self::$char2order[mb_substr(self::$order, $order, 1)] = $order;
      }
    }

    $len_a = mb_strlen($a);
    $len_b = mb_strlen($b);
    $max=min($len_a, $len_b);
    for($i=0; $i<$max; ++$i)
    {
      $char_a= mb_substr($a, $i, 1);
      $char_b= mb_substr($b, $i, 1);

      if ($char_a == $char_b) continue;
      $order_a = (isset(self::$char2order[$char_a])) ? self::$char2order[$char_a] : 9999;
      $order_b = (isset(self::$char2order[$char_b])) ? self::$char2order[$char_b] : 9999;

      return ($order_a < $order_b) ? -1 : 1;
    }
    return ($len_a < $len_b) ? -1 : 1;
  }
}

// usage example:

$t = array(
  'Birnen', 'Birne', 'Äpfel', 'Apfel',
);

uasort($t, 'utf_8_german::cmp');
echo '$t: <pre>'.htmlspecialchars(print_r($t,true),null,'UTF-8').'</pre>';
?>
shawn at shawnwilkerson dot com 05-May-2009 10:03
I kept getting varied results using natcasesort and sort on mixed arrays -- per the descriptions.

Sometimes simple is better:

A little snippet of code:

<?php                        if($responders->num_rows) {
                            $i=0;
                            while($row= $responders->fetch_assoc()) {
                                $user=getUserName($row['responderID']);
                                $r[$i]= array("sortname"=>strtolower($user),"userName"=>$user, "userID"=>$row['responderID'], "responderID"=>$row['idresponders']);
                                $i++;
                            }
                            sort($r);
                            print_r($r);
                        }

?>

I simply created a lower cased sort field at the front of the result set and then sort by it -- which provides the expected result and leaves the actual needed fields unchanged.

For the curious:  all user information is kept completed in another database (and table) from the content database due to security reasons.  The getUser functions we have written allow us to pull only what is legally allowed without exposing anything else.

This is why a left join or something wasn't used and we have to build a pseudo result array here from both databases.
claude at schlesser dot lu 07-Jan-2009 12:41
Here a function that will natural sort an array by keys with keys that contain special characters.

<?php
function natksort($array)
{
    $original_keys_arr = array();
    $original_values_arr = array();
    $clean_keys_arr = array();

    $i = 0;
    foreach ($array AS $key => $value)
    {
        $original_keys_arr[$i] = $key;
        $original_values_arr[$i] = $value;
        $clean_keys_arr[$i] = strtr($key, "ÄÖÜäöüÉÈÀËëéèàç", "AOUaouEEAEeeeac");
        $i++;
    }

    natcasesort($clean_keys_arr);

    $result_arr = array();

    foreach ($clean_keys_arr AS $key => $value)
    {
        $original_key = $original_keys_arr[$key];
        $original_value = $original_values_arr[$key];
        $result_arr[$original_key] = $original_value;
    }

    return $result_arr;
}
?>

Hope it will be useful to somebody :)
vbAlexDOSMan at Yahoo dot com 12-Sep-2003 01:21
Ulli at Stemmeler dot net:  I remade your function -- it's a little more compact now -- Enjoy...

function ignorecasesort(&$array) {

  /*Make each element it's lowercase self plus itself*/
  /*(e.g. "MyWebSite" would become "mywebsiteMyWebSite"*/
  for ($i = 0; $i < sizeof($array); $array[$i] = strtolower($array[$i]).$array[$i], $i++);

  /*Sort it -- only the lowercase versions will be used*/
  sort($array);

  /*Take each array element, cut it in half, and add the latter half to a new array*/
  /*(e.g. "mywebsiteMyWebSite" would become "MyWebSite")*/
  for ($i = 0; $i < sizeof($array); $i++) {
    $this = $array[$i];
    $array[$i] = substr($this, (strlen($this)/2), strlen($this));
  }
}
dslicer at maine dot rr dot com 02-Jun-2003 06:41
Something that should probably be documented is the fact that both natsort and natcasesort maintain the key-value associations of the array. If you natsort a numerically indexed array, a for loop will not produce the sorted order; a foreach loop, however, will produce the sorted order, but the indices won't be in numeric order. If you want natsort and natcasesort to break the key-value associations, just use array_values on the sorted array, like so:

natcasesort($arr);
$arr = array_values($arr);
tmiller25 at hotmail dot com 25-Apr-2002 07:55
add this loop to the function above if you want items which have the same first characters to be listed in a way that the shorter string comes first.
--------------------
  /* short before longer (e.g. 'abc' should come before 'abcd') */
  for($i=count($array)-1;$i>0;$i--) {
    $str_a = $array[$i  ];
    $str_b = $array[$i-1];
    $cmp_a = strtolower(substr($str_a,0,strlen($str_a)));
    $cmp_b = strtolower(substr($str_b,0,strlen($str_a)));
    if ($cmp_a==$cmp_b && strlen($str_a)<strlen($str_b)) {
      $array[$i]=$str_b; $array[$i-1]=$str_a; $i+=2;
    }
  }
--------------------


Trie un tableau avec l'algorithme à "ordre naturel"

  • « natcasesort
  • next »
  • PHP Manual
  • Fonctions sur les tableaux
  • Trie un tableau avec l'algorithme à "ordre naturel"

natsort

(PHP 4, PHP 5, PHP 7, PHP 8)

natsort — Trie un tableau avec l'algorithme à "ordre naturel"

Description

natsort ( array &$array ) : bool

natsort() implémente un algorithme de tri qui traite les chaînes alphanumériques du tableau array comme un être humain tout en conservant la relation clé/valeur. C'est ce qui est appelé l'"ordre naturel". Un exemple de la différence de traitement entre un tel algorithme et un algorithme de tri de chaînes (comme lorsqu'on utilise sort()) est illustré ci-dessous.

Note:

Si deux membres se comparent comme égaux, leur ordre relatif dans le tableau trié n'est pas défini.

Liste de paramètres

array

Le tableau d'entrée.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple d'utilisation de base avec natsort()

<?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);
?>

L'exemple ci-dessus va afficher :

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
)

Pour plus de détails, rendez-vous sur le site de Martin Pool sur » la comparaison de chaînes en ordre naturel.

Exemple #2 Exemples montrant les pièges de natsort()

<?php
echo "Nombres négatifs\n";
$negative = array('-5','3','-2','0','-1000','9','1');
print_r($negative);
natsort($negative);
print_r($negative);

echo "Alignement avec zéros\n";
$zeros = array('09', '8', '10', '009', '011', '0');
print_r($zeros);
natsort($zeros);
print_r($zeros);
?>

L'exemple ci-dessus va afficher :

Nombres négatifs
Array
(
    [0] => -5
    [1] => 3
    [2] => -2
    [3] => 0
    [4] => -1000
    [5] => 9
    [6] => 1
)
Array
(
    [2] => -2
    [0] => -5
    [4] => -1000
    [3] => 0
    [6] => 1
    [1] => 3
    [5] => 9
)

Alignement avec zéros
Array
(
    [0] => 09
    [1] => 8
    [2] => 10
    [3] => 009
    [4] => 011
    [5] => 0
)
Array
(
    [5] => 0
    [1] => 8
    [3] => 009
    [0] => 09
    [2] => 10
    [4] => 011
)

Voir aussi

  • natcasesort() - Trie un tableau avec l'algorithme à "ordre naturel" insensible à la casse
  • Les fonctions de tri des tableaux
  • strnatcmp() - Comparaison de chaînes avec l'algorithme d'"ordre naturel"
  • strnatcasecmp() - Comparaison de chaînes avec l'algorithme d'"ordre naturel" (insensible à la casse)

User Contributed Notes

Malek Mohamed 24-Jun-2018 06:21
$array1 = $array2 = array('IMG0.png', 'img12.png', 'img10.png', 'img2.png', 'img1.png', 'IMG3.png');

natsort($array1);
echo "\n natsort(); \n";
print_r($array1);

sort($array2, SORT_NATURAL);
echo "\n sort() with  SORT_NATURAL Option\n";
print_r($array2);

Ouput:

natsort();
Array
(
    [0] => IMG0.png
    [5] => IMG3.png
    [4] => img1.png
    [3] => img2.png
    [2] => img10.png
    [1] => img12.png
)

sort() with  SORT_NATURAL Option
Array
(
    [0] => IMG0.png
    [1] => IMG3.png
    [2] => img1.png
    [3] => img2.png
    [4] => img10.png
    [5] => img12.png
)

as we can see it's  the same values but not the same keys, and also it's same for sort($array1, SORT_NATURAL | SORT_FLAG_CASE); and natcasesort($array2)
dotancohen splat gmail spot com 30-May-2017 06:59
As noted in other notes, natsort() does _not_ always return the expected sort order. It seems especially buggy when decimals or 0 padding is used. I've filed this bug report on the issue:
https://bugs.php.net/bug.php?id=74672
bb7b5b9 at gmail dot com 14-Jan-2016 08:07
This made me waste a lot of my precious youth ... natsort() is buggy if all numbers don't have the same number of decimal places.

(php 5.6.4-4ubuntu6.2)

<?php
$different_decimal_places_in_values = array('D'=>'13.59', '14.6' => '14.6', 'C-' => '14.19');
natsort($a);
var_dump($a);

/*echoes
array(3) {
  'D' =>
  string(5) "13.59"
  '14.6' =>
  string(4) "14.6" <----------- badly ordered
  'C-' =>
  string(5) "14.19"
}*/
?>

While this

<?php
$same_num_decimal_places_in_values = array('D'=>'13.59', '14.6' => '14.60', 'C-' => '14.19'); natsort($a); var_dump($a);

/*echoes
array(3) {
  'D' =>
  string(5) "13.59"
  'C-' =>
  string(5) "14.19"
  '14.6' =>
  string(5) "14.60" <--------- that is the correct position
}
*/

?>
mvs dot php at gmail dot com 20-May-2015 10:12
To naturally sort by array key, the uksort function can be used.

<?php

echo "Sort by keys\n";
$smoothie = array('orange' => 1, 'apple' => 1, 'yogurt' => 4, 'banana' => 4);
print_r($smoothie);
uksort( $smoothie, 'strnatcmp');
print_r($smoothie)

?>

Output:

Sort by keys
Array
(
    [orange] => 1
    [apple]  => 1
    [yogurt] => 4
    [banana] => 4
)
Array
(
    [apple]  => 1
    [banana] => 4
    [orange] => 1
    [yogurt] => 4
)

See http://php.net/manual/en/function.uksort.php for more information about uksort and http://php.net/strnatcmp for usage of strnatcmp.
Johan GENNESSON (php at genjo dot fr) 24-Nov-2010 07:18
Be careful of the new behaviour in 5.2.10 version.
See the following sample:

<?php

$array = array('1 bis', '10 ter', '0 PHP', '0', '01', '01 Ver', '0 ', '1 ', '1');

natsort($array);
echo '<pre>';
print_r($array);
echo '</pre>';
?>

5.2.6-1 will output:
Array
(
    [3] => 0
    [6] => 0
    [2] => 0 OP
    [4] => 01
    [5] => 01 Ver
    [8] => 1
    [7] => 1
    [0] => 1 bis
    [1] => 10 ter
)

5.2.10 will output:
Array
(
    [6] => 0
    [3] => 0
    [8] => 1
    [4] => 01
    [7] => 1
    [5] => 01 Ver
    [0] => 1 bis
    [1] => 10 ter
    [2] => 0 OP
)

Greetings
ale152 16-Mar-2009 02:00
Note: negatives number.
<?php
$a = array(-5,-2,3,9);
natsort($a);
print_r($a);
?>
Will output:
Array ( [1] => -2 [0] => -5 [2] => 3 [3] => 9 )
AJenbo 15-Jan-2009 01:33
natsort might not act like you would expect with zero padding, heres a quick sample.

<?php
$array = array('09', '8', '10', '009', '011');
natsort($array);
?>
/*
Array
(
    [3] => 009
    [4] => 011
    [0] => 09
    [1] => 8
    [2] => 10
)
*/
wyvern at greywyvern dot com 17-Dec-2008 10:53
There's no need to include your own API code to natsort an associative array by key.  PHP's in-built functions (other than natsort) can do the job just fine:

<?php
  uksort($myArray, "strnatcmp");
?>
lacent at gmail dot com 16-Jan-2007 09:42
there is another rnatsort function lower on the page, but it didn't work in the context i needed it in.

reasoning for this:
sorting naturally via the keys of an array, but needing to reverse the order.

    function rnatsort ( &$array = array() )
    {
        $keys    = array_keys($array);
        natsort($keys);
        $total    = count($keys) - 1;
        $temp1    = array();
        $temp2     = array();

        // assigning original keys to an array with a backwards set of keys, to use in krsort();
        foreach ( $keys as $key )
        {
            $temp1[$total] = $key;
            --$total;
        }

        ksort($temp1);

        // setting the new array, with the order from the krsort() and the values of original array.
        foreach ( $temp1 as $key )
        {
            $temp2[$key] = $array[$key];
        }

        $array = $temp2;
    }
@gmail bereikme 01-Sep-2006 08:06
Here's a handy function to sort an array on 1 or more columns using natural sort:
<?php
// Example: $records = columnSort($records, array('name', 'asc', 'addres', 'desc', 'city', 'asc'));

$globalMultisortVar = array();
function columnSort($recs, $cols) {
    global $globalMultisortVar;
    $globalMultisortVar = $cols;
    usort($recs, 'multiStrnatcmp');
    return($recs);
}

function multiStrnatcmp($a, $b) {
    global $globalMultisortVar;
    $cols = $globalMultisortVar;
    $i = 0;
    $result = 0;
    while ($result == 0 && $i < count($cols)) {
        $result = ($cols[$i + 1] == 'desc' ? strnatcmp($b[$cols[$i]], $a[$cols[$i]]) : $result = strnatcmp($a[$cols[$i]], $b[$cols[$i]]));
        $i+=2;
    }
    return $result;
}

?>

Greetings,

  - John
h3 22-Feb-2006 08:59
This function can be very usefull, but in some cases, like if you want to sort a MySQL query result, it's important to keep in mind that MySQL as built'in sorting functions which are way faster than resorting the result using a complex php algorythm, especially with large arrays.

ex; 'SELECT * FROM `table` ORDER BY columnName ASC, columnName2 DESC'
lil at thedreamersmaze dot spam-me-not dot org 31-Jan-2006 08:38
There's one little thing missing in this useful bit of code posted by mbirth at webwriters dot de:

<?php

function natsort2d(&$aryInput) {
  $aryTemp = $aryOut = array();
  foreach ($aryInput as $key=>$value) {
   reset($value);
   $aryTemp[$key]=current($value);
  }
  natsort($aryTemp);
  foreach ($aryTemp as $key=>$value) {
   $aryOut[$key] = $aryInput[$key];
// --------^^^^ add this if you want your keys preserved!
  }
  $aryInput = $aryOut;
}

?>
natcasesort.too 05-Aug-2005 03:17
I got caught out through naive use of this feature - attempting to sort a list of image filenames from a digital camera, where the filenames are leading zero padded (e.g. DSCF0120.jpg) , will not sort correctly.
Maybe the example could be modified to exhibit this behaviour
(e.g. set array to -img0120.jpg','IMG0.png', 'img0012.png', 'img10.png', 'img2.png', 'img1.png', 'IMG3.png)
If the example hadn't used images I would have coded it correctly first time around!
phpnet at moritz-abraham dot de 02-Sep-2004 02:09
additional to the code posted by justin at redwiredesign dot com (which I found very usefull) here is a function that sorts complex arrays like this:
<?
$array['test0'] = array('main' =>  'a', 'sub' => 'a');
$array['test2'] = array('main' =>  'a', 'sub' => 'b');
$array['test3'] = array('main' =>  'b', 'sub' => 'c');
$array['test1'] = array('main' =>  'a', 'sub' => 'c');
$array['test4'] = array('main' =>  'b', 'sub' => 'a');
$array['test5'] = array('main' =>  'b', 'sub' => 'b');
?>
or
<?
$array[0] = array('main' =>  1, 'sub' => 1);
$array[2] = array('main' =>  1, 'sub' => 2);
$array[3] = array('main' =>  2, 'sub' => 3);
$array[1] = array('main' =>  1, 'sub' => 3);
$array[4] = array('main' =>  2, 'sub' => 1);
$array[5] = array('main' =>  2, 'sub' => 2);
?>
on one or more columns.

the code
<? $array = array_natsort_list($array,'main','sub'); ?>
will result in $array being sortet like this:
test0,test2,test1,test4,test5,test3
or
0,2,1,4,5,3.

you may even submit more values to the function as it uses a variable parameter list. the function starts sorting on the last and the goes on until the first sorting column is reached.

to me it was very usefull for sorting a menu having submenus and even sub-submenus.

i hope it might help you too.

here is the function:
<?
function array_natsort_list($array) {
    // for all arguments without the first starting at end of list
    for ($i=func_num_args();$i>1;$i--) {
        // get column to sort by
        $sort_by = func_get_arg($i-1);
        // clear arrays
        $new_array = array();
        $temporary_array = array();
        // walk through original array
        foreach($array as $original_key => $original_value) {
            // and save only values
            $temporary_array[] = $original_value[$sort_by];
        }
        // sort array on values
        natsort($temporary_array);
        // delete double values
        $temporary_array = array_unique($temporary_array);
        // walk through temporary array
        foreach($temporary_array as $temporary_value) {
            // walk through original array
            foreach($array as $original_key => $original_value) {
                // and search for entries having the right value
                if($temporary_value == $original_value[$sort_by]) {
                    // save in new array
                    $new_array[$original_key] = $original_value;
                }
            }
        }
        // update original array
        $array = $new_array;
    }
    return $array;
}
?>
xlab AT adaptiveNOSPAMarts DOT net 15-Jan-2004 12:51
Under limited testing, natsort() appears to work well for IP addresses. For my needs, it is far less code than the ip2long()/long2ip() conversion I was using before.
mbirth at webwriters dot de 09-Jan-2004 12:31
For those who want to natsort a 2d-array on the first element of each sub-array, the following few lines should do the job.

<?php

function natsort2d(&$aryInput) {
  $aryTemp = $aryOut = array();
  foreach ($aryInput as $key=>$value) {
    reset($value);
    $aryTemp[$key]=current($value);
  }
  natsort($aryTemp);
  foreach ($aryTemp as $key=>$value) {
    $aryOut[] = $aryInput[$key];
  }
  $aryInput = $aryOut;
}

?>
rasmus at flajm dot com 14-Dec-2003 09:30
To make a reverse function, you can simply:

function rnatsort(&$a){
    natsort($a);
    $a = array_reverse($a, true);
}
flash at minet dot net 12-Aug-2003 10:27
About the reverse natsort.. Maybe simpler to do :

function strrnatcmp ($a, $b) {
    return strnatcmp ($b, $a);
}
anonymous at coward dot net 31-May-2003 01:46
Reverse Natsort:

  function rnatsort($a, $b) {
    return -1 * strnatcmp($a, $b);
  }

  usort($arr, "rnatsort");


Avance le pointeur interne d'un tableau

  • « natsort
  • pos »
  • PHP Manual
  • Fonctions sur les tableaux
  • Avance le pointeur interne d'un tableau

next

(PHP 4, PHP 5, PHP 7, PHP 8)

next — Avance le pointeur interne d'un tableau

Description

next ( array|object &$array ) : mixed

next() se comporte comme current(), avec une différence. Il avance le pointeur interne du tableau d'un élément, avant de retourner la valeur de l'élément. Cela signifie qu'il retourne la prochaine valeur du tableau et avance le pointeur interne d'un élément.

Liste de paramètres

array

Le tableau à traiter.

Valeurs de retour

Retourne la prochaine valeur du tableau suivant le pointeur interne, ou false s'il n'y a plus d'élément.

Avertissement

Cette fonction peut retourner false, mais elle peut aussi retourner une valeur équivalent à false. Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour exacte de cette fonction.

Exemples

Exemple #1 Exemple avec next()

<?php
$transport = array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport);    // $mode = 'bike';
$mode = next($transport);    // $mode = 'car';
$mode = prev($transport);    // $mode = 'bike';
$mode = end($transport);     // $mode = 'plane';
?>

Notes

Note: Il n'est pas possible de distinguer la fin d'un tableau de l'élément bool false. Pour traverser correctement un tableau qui peut contenir l'élément false, voyez la fonction foreach(). Pour continuer d'utiliser next() et détecter proprement si la fin du tableau a été atteinte, la key() est null.

Voir aussi

  • current() - Retourne l'élément courant du tableau
  • end() - Positionne le pointeur de tableau en fin de tableau
  • prev() - Recule le pointeur courant de tableau
  • reset() - Remet le pointeur interne de tableau au début
  • each() - Retourne chaque paire clé/valeur d'un tableau

User Contributed Notes

Mikhail 05-Sep-2019 02:47
This function returns next element in array after your key or false if it last or key doesn't exists in array.

<?php

function nextElement(array $array, $currentKey)
{
    if (!isset($array[$currentKey])) {
        return false;
    }
    $nextElement = false;
    foreach ($array as $key => $item) {
        $nextElement = next($array);
        if ($key == $currentKey) {
            break;
        }
    }

    return $nextElement;
}
andy at andysdrawings dot co dot uk 05-Oct-2018 01:58
brentimus' array_set_pointer function will only work if the array value is unique in the array, and none of the array values are FALSE. It would be more reliable to use key() instead of current(). For similar reasons it's better to check key() after calling next() to determine whether the next() element "exists". Simply checking the value returned by next() will produce a false negative when looking at, for example, the first element of the array: ['one', 0, 'three']

However, it also turns out that the copied array retains the original array's pointer, so array_set_pointer is not actually required here. The following should work:

<?php
function has_next(array &$array) {
    $A_work = $array;  // $A_work is a copy of $array including its internal pointer.
    next($A_work);
    if (key($A_work) === NULL)
        return false;
    else
        return true;
}
?>
notImportant 03-May-2018 01:11
a more readable version of papipo's has_next function:

<?php
function has_next($array) {
    $has_next = is_array($array) && next($array) !== false;

    return $has_next;
}
?>

OR

<?php
function has_next($array) {
    $has_next = false;
    if(is_array($array)) {
        $has_next = next($array) !== false;
    }

    return $has_next;
}
?>
nigra 02-Jan-2018 08:01
This function will return the previous,next neighbors of an array entry within an associative array. If the specified $key points to the last or first element of the array, the first or last keys of the array will be returned consecutively. This is an improved version of the same function posted earlier.

<?php
function array_neighbor($count, $key = null, $arRelated = array(), $cntRelated = 2)
{
    if($count > 0 && isset($key))
    {
        $keyL = $count - 1;
        $keyR = 1;
        $arResult = array();
        for($i = 1; $i <= $cntRelated; $i++)
        {
            if($key == 0)
            {
                if(($i % 2) == 0)
                {
                    $curKey = $count - $keyL;
                    $keyL--;
                }
                else
                {
                    $curKey = $count - $keyR;
                    $keyR++;
                }
            }
            else
            {
                if($arRelated[$i] >= $count - 1)
                {
                    $curKey = 0;
                }
                else
                {
                    $curKey = $arRelated[$i] + 1;
                }
            }
            $arResult[$i] = $curKey;
        }
        return $arResult;
    }
}

$arr = range(0, 4);
$count = count($arr);

foreach($arr as $key => $v)
{
    if($arRelated = array_neighbor($count, $key, $arRelated))
    {
        $arHeighbor[$key]['RELATED'] = $arRelated;
    }
}

echo '<pre>';print_r($arHeighbor); echo '</pre>';
?>
Array
(
    [0] => Array
        (
            [RELATED] => Array
                (
                    [1] => 4
                    [2] => 1
                )

        )

    [1] => Array
        (
            [RELATED] => Array
                (
                    [1] => 0
                    [2] => 2
                )

        )

    [2] => Array
        (
            [RELATED] => Array
                (
                    [1] => 1
                    [2] => 3
                )

        )

    [3] => Array
        (
            [RELATED] => Array
                (
                    [1] => 2
                    [2] => 4
                )

        )

    [4] => Array
        (
            [RELATED] => Array
                (
                    [1] => 3
                    [2] => 0
                )

        )

)
JumpIfBelow 24-Aug-2017 11:57
Now from PHP 7.2, the function "each" is deprecated, so the has_next I've posted is no longer a good idea. There is another to keep it simple and fast:

<?php
function has_next(array $_array)
{
  return next($_array) !== false ?: key($_array) !== null;
}
?>
JumpIfBelow 30-Jul-2015 12:45
After dealing with the fact that next() will either returns FALSE when there is no further element in the array or if the element itself is FALSE, I finally find a way to do a has_next() method, which will never fails. You can ignore and/or downvote my last comment, this it will be deleted.
Here is the code that work :
<?php
    function has_next(array $a){
        return next($a) !== false ?: each($a) !== false;
    }
?>
double at dumpit dot de 08-Dec-2009 01:19
PHP: 5.2.10-2ubuntu6.3 (default apt-get installation on actual, see Date, jaunty 9.10 Ubuntu Distro - G33kWoRDs)

Have a look at your array pointer if you copy an array - the pointer will be copied, too.

For example if you got this construct:
<?php
    $array = array('zero','one','two','three','four','five','six','seven');
    $array2 = $array;
    next($array);
    echo key($array);
    echo key($array2);

    // will output:
    // 1
    // 0
?>

But if you copy the array after you've setted the pointer, the pointer will be copied, too:
<?php
    $array = array('zero','one','two','three','four','five','six','seven');
    next($array);
    $array2 = $array;
    echo key($array);
    echo key($array2);

    // will output:
    // 1
    // 1
?>

What's more is, that foreach not resetting the pointer after walk through:
<?php

    $array = array('zero','one','two','three','four','five','six','seven');
    next($array);
    $array2 = array();
    foreach($array AS $key => $value){
        echo $key;
        $array2[$key] = $value;
    }
    echo var_dump(key($array));
    echo key($array2);

    // will output for foreach:
    // 0 1 2 3 4 5 6 7
    // and for the keys
    // NULL
    // 0
?>

The php-functions seems to reset the pointer on the given position after walk through (i don't know the internal handling - there could be used a copy of the array, too):
<?php

    $array = array('zero','one','two','three','four','five','six','seven');
    next($array);
    $array2 = array_values($array);
    echo key($array);
    echo key($array2);

    // will output:
    // 1
    // 0
?>

There are a lot Methods like array_merge($array) that will neither reset the pointer of $array nor copy the pointer to $array2. Have a look on this.
I Hope this was a little helpfull.
ThinkMedical at Gmail dot com 02-Sep-2008 03:27
regarding references with foreach, you can use them directly. Obviating various posts which provide many lines of 'work arounds'.

$array = array(1,2,3,4,5);

foreach($array as &$value)

or use $key

foreach($array as $key => $value)
{
    $array[$key] = '...';
}
darkside at i dot ua 11-Dec-2007 03:36
This class implements simple operations with array

<?php
class Steps {

    private $all;
    private $count;
    private $curr;

    public function __construct () {

      $this->count = 0;

    }

    public function add ($step) {

      $this->count++;
      $this->all[$this->count] = $step;

    }

    public function setCurrent ($step) {

      reset($this->all);
      for ($i=1; $i<=$this->count; $i++) {
        if ($this->all[$i]==$step) break;
        next($this->all);
      }
      $this->curr = current($this->all);

    }

    public function getCurrent () {

      return $this->curr;

    }

    public function getNext () {

      self::setCurrent($this->curr);
      return next($this->all);

    }

  }
?>

usage example:

<?php
   $steps = new Steps();
   $steps->add('one');
   $steps->add('two');
   $steps->add('three');
   $steps->setCurrent('one');
   echo $steps->getCurrent()."<br />";
   echo $steps->getNext()."<br />";
   $steps->setCurrent('two');
   echo $steps->getCurrent()."<br />";
   echo $steps->getNext()."<br />";
?>
gg2005 at gmail dot com 06-Feb-2007 01:32
Don't confuse next with continue!

If you're a Perl developer starting with PHP, you might try to use "next" inside a loop to skip to the next iteration...

i.e.,

foreach ($things as $thing) {
  if (something I don't like about $thing) {
   next;
  }
  blah....
}

The php compiler will take next... but it's not going to work.

Do this instead:
foreach ($things as $thing) {
  if (something I don't like about $thing) {
   continue;
  }
  blah....
}
tino at infeon dot com 13-May-2006 08:48
this may be handy and i didnt know where else to post it.. i need a simple function to cycle through an array i eventually made it into a class so i could have multiple cycles.. if you like it or find it usefull please email me and let me know

class Cycle
{
    var $position;
    var $dataArray;
    var $dataArrayCount;

    function Cycle()
    {
        $this->dataArray = func_get_args();
        $this->dataArrayCount = count($this->dataArray);
    }

    function Display()
    {
        $this->position = (!isset($this->position) || $this->position >= ($this->dataArrayCount - 1)) ? 0 : $this->position += 1;
        return $this->dataArray[$this->position];
    }

}

$bgColor = new Cycle('#000000', '#FFFFFF', '#FF0000');

echo $bgcolor->Display();
//returns #000000
echo $bgcolor->Display();
//returns #FFFFFF
echo $bgcolor->Display();
//returns #FF0000
echo $bgcolor->Display();
//returns #000000
brentimus 28-Apr-2005 10:10
Papipo's function below is usefull in concept but does not work.

"Since you do not pass the array by reference, its pointer is only moved inside the function."

This is true, but the array you are manipulating in your has_next() function will have it's pointer set to the first element, not the same position as the original array. What you want to do is pass the array to the has_next() function via reference. While in the has_next() function, make a copy of the array to work on. Find out the current pointer position of the original array and set the pointer on the working copy of the array to the same element. Then you may test to see if the array has a "next" element.

Try the followig insetad:

<?php
function has_next(&$array)
{
    $A_work=$array;  //$A_work is a copy of $array but with its internal pointer set to the first element.
    $PTR=current($array);
    array_set_pointer($A_work, $PTR);

    if(is_array($A_work))
    {
        if(next($A_work)===false)
            return false;
        else
            return true;
    }
    else
        return false;
}

function array_set_pointer(&$array, $value)
{
    reset($array);
    while($val=current($array))
    {
        if($val==$value)
            break;

        next($array);
    }
}
?>
papipo's gmail account 13-Oct-2004 01:47
I need to know if an array has more items, but without moving array's internail pointer. Thats is, a has_next() function:

<?php
function has_next($array) {
    if (is_array($array)) {
        if (next($array) === false) {
            return false;
        } else {
            return true;
        }
    } else {
        return false;
    }
}

$array = array('fruit', 'melon');
if (has_next($array)) {
    echo next($array);
}

// prints 'melon'
?>

Since you do not pass the array by reference, its pointer is only moved inside the function.
Hope that helps.
lukasz at karapuda dot com 18-Aug-2004 10:06
This function will return the previous,next neighbors of an array entry within an associative array. If the specified $key points to the last or first element of the array, the first or last keys of the array will be returned consecutively. This is an improved version of the same function posted earlier.

<?php
function array_neighbor($arr, $key)
{
   $keys = array_keys($arr);
   $keyIndexes = array_flip($keys);

   $return = array();
   if (isset($keys[$keyIndexes[$key]-1])) {
       $return[] = $keys[$keyIndexes[$key]-1];
   }
   else {
       $return[] = $keys[sizeof($keys)-1];
   }

   if (isset($keys[$keyIndexes[$key]+1])) {
       $return[] = $keys[$keyIndexes[$key]+1];
   }
   else {
       $return[] = $keys[0];
   }

   return $return;
}
?>
court shrock 20-May-2004 04:36
This code returns neighbors of the specified key.  The result will be empty if it doesn't have any neighbors.  My approach was to use the order of keys to determine neighbors, which is differnet from just getting the next/previous element in an array.  Feel free to point out stupidities :)

<?php

function array_neighbor($arr, $key)
{
    krsort($arr);
    $keys = array_keys($arr);
    $keyIndexes = array_flip($keys);

    $return = array();
    if (isset($keys[$keyIndexes[$key]-1]))
        $return[] = $keys[$keyIndexes[$key]-1];
    if (isset($keys[$keyIndexes[$key]+1]))
        $return[] = $keys[$keyIndexes[$key]+1];

    return $return;
}

?>
bm at ANTISPAM dot solidwave dot com 16-Apr-2004 09:49
Take care when replacing code using reset()/next() with code using foreach as foreach does not update the array's internal pointer.  This means you cannot, say, use next() to skip an element in foreach loop, or use current() within a function to get a reference to the current element.  You probably have code depending on this internal pointer and replacing it will be more work than you anticipated.

See http://www.php.net/foreach


Alias de current

  • « next
  • prev »
  • PHP Manual
  • Fonctions sur les tableaux
  • Alias de current

pos

(PHP 4, PHP 5, PHP 7, PHP 8)

pos — Alias de current()

Description

Cette fonction est un alias de : current()

User Contributed Notes

There are no user contributed notes for this page.


Recule le pointeur courant de tableau

  • « pos
  • range »
  • PHP Manual
  • Fonctions sur les tableaux
  • Recule le pointeur courant de tableau

prev

(PHP 4, PHP 5, PHP 7, PHP 8)

prev — Recule le pointeur courant de tableau

Description

prev ( array|object &$array ) : mixed

Recule le pointeur courant de tableau.

prev() se comporte exactement comme next(), mais elle fait reculer le pointeur plutôt que de l'avancer.

Liste de paramètres

array

Le tableau d'entrée.

Valeurs de retour

Retourne la valeur précédente du tableau suivant le pointeur interne du tableau, ou false s'il n'y a plus d'élément.

Avertissement

Cette fonction peut retourner false, mais elle peut aussi retourner une valeur équivalent à false. Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour exacte de cette fonction.

Exemples

Exemple #1 Exemple avec prev()

<?php
$transport = array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport);    // $mode = 'bike';
$mode = next($transport);    // $mode = 'car';
$mode = prev($transport);    // $mode = 'bike';
$mode = end($transport);     // $mode = 'plane';
?>

Notes

Note: Il n'est pas possible de distinguer le début d'un tableau de l'élément bool false. Pour faire la distinction, vérifiez si la key() de l'élément prev() n'est pas null.

Voir aussi

  • current() - Retourne l'élément courant du tableau
  • end() - Positionne le pointeur de tableau en fin de tableau
  • next() - Avance le pointeur interne d'un tableau
  • reset() - Remet le pointeur interne de tableau au début
  • each() - Retourne chaque paire clé/valeur d'un tableau

User Contributed Notes

Mikhail 05-Sep-2019 02:56
Function to get element in array, that goes previous your key or false if it not exeists or key doesn't isset in array.

<?php

function previousElement(array $array, $currentKey)
{
    if (!isset($array[$currentKey])) {
        return false;
    }
    end($array);
    do {
        $key = array_search(current($array), $array);
        $previousElement = prev($array);
    }
    while ($key != $currentKey);

    return $previousElement;
}
MicroVB INC 31-Mar-2014 05:09
Some corrections to the previous function.
- When prev() and next() distance is now calculated properly returning the 'closer' one.
- When exact is false, and an item exists with the key searched for, it now returns that entry instead of next/prev closest
- At ends of the array, sometimes when moving past using next() or prev(), it caused results to die. This was corrected.
- Added field to result stating whether the match was 'exact' ('exact'=>true), or nearest ('exact'=>false)

<?php
function nearest($array, $value, $exact=false) {
    // Initialize Variables
    $next = false;
    $prev = false;
    $return = false;

    $arr_begin = false;
    $arr_end = false;

    $exact_match = false;

    if($exact && isset($array[$value])) {
        // If exact match found, and searching for exact (not nearest), return result.
        $return = Array($value=>$array[$value]);
        $exact_match = true;
    } elseif (!$exact && isset($array[$value])) {
        // If exact match found, and searching for nearest, return result.
        $return = Array($value=>$array[$value]);
        $exact_match = true;
    } else {

        if(!isset($array[$value]) && !$exact) {
            // Insert element that doesn't exist so nearest can be found
            $array[$value] = '-';
        }

        // Sort array so injected record is near relative numerics
        ksort($array); // Sort array on key

        // Set start and end keys
        $arr_begin = key($array);
        end($array);
        $arr_end = key($array);
        reset($array);

        // Loop through array until match is found, then set $prev and $next to the respective keys if exist
        while ( !is_null($key = key($array)) ) {
            $val = current($array);
            if($key == $value) {
                if($value <> $arr_begin) {
                    prev($array); // Get entry before this one
                    $prev = key($array);
                }

                next($array);         // Skip current entry as this was what we were looking for nearest to

                if($value <> $arr_end) {
                    next($array); // Get entry after this one
                    $next = key($array);
                }
                break;
            }
            next($array);
        }

        if($prev && $next) {
            if(($value - $prev) < ($next - $value)) {
                // Previous is closer
                $return = Array($prev=>$array[$prev]);
            } else {
                // Next is closer
                $return = Array($next=>$array[$next]);
            }
        } elseif ($prev || $next) {
            if($prev) {
                // Only Previous exists
                $return = Array($prev=>$array[$prev]);
            } elseif ($next) {
                // Only Next exists
                $return = Array($next=>$array[$next]);
            }
        }
    }

    // Return resulting Array().   $return is false if nothing matches the closest conditions, or if exact is specified and key does not exist.
    if($return) {
        return $return+Array('exact'=>$exact_match);
    } else {
        return false;
    }
}
?>

Just to clarify, this function will return either an Array() containing the $key=>$value pair of the result and 'exact'=>(bool) whether the match was exact or not.

To access the $key=>$value pair, can be done as follows :
<?php

    $result = nearest( ... );  // Just here for clarification of the position for the code that follows.

    if($result) {
        // Output the Key
        echo key($result);

        // Output the Value
        echo $result( key($result) );

        // Output if exact match
        if($result['exact']) {
            echo 'This was an EXACT match';
        } else {
            echo 'This result was found with fuzzy logic';
        }

    } else {

        echo 'No result found';

    }

?>
MicroVB INC 31-Mar-2014 01:17
This function searches for the closest element in an array by key value, and returns the key/value pair, or false if not found.

<?php
function nearest($array, $value, $exact=false) {
        // Initialize Variables
    $next = false;
    $prev = false;
    $return = false;

    if(!isset($array[$value]) && !$exact) {
        // Insert element that doesn't exist so nearest can be found
        $array[$value] = '-';
    }

    if($exact && isset($array[$value])) {
                // If exact match found, and searching for exact (not nearest), return result.
        $return = Array($value=>$array[$value]);
    } else {
            // Sort array so injected record is near relative numerics
        ksort($array); // Sort array on key

                // Loop through array until match is found, then set $prev and $next to the respective keys if exist
        while ( !is_null($key = key($array)) ) {
            $val = current($array);
            if($key == $value) {
                prev($array); // Get entry before this one
                $prev = key($array);
                next($array);         // Skip current entry as this was what we were looking for nearest to
                next($array); // Get entry after this one
                $next = key($array);
                break;
            }
            next($array);
        }

        if($prev && $next) {
            if(($long - $prev) > ($next - $long)) {
                                 // Previous is closer
                $return = Array($prev=>$array[$prev]);
            } else {
                                 // Next is closer
                $return = Array($next=>$array[$next]);
            }
        } elseif ($prev || $next) {
            if($prev) {
                                 // Only Previous exists
                $return = Array($prev=>$array[$prev]);
            } elseif ($next) {
                                 // Only Next exists
                $return = Array($next=>$array[$next]);
            }
        }
    }

        // Return resulting Array().   $return is false if nothing matches the closest conditions, or if exact is specified and key does not exist.
    return $return;
}
?>

Example usage (to lookup the closest color in an array)
<?php
$mycolors= Array(
    5001046=>'Abbey',
    1774596=>'Acadia',
    8171681=>'Acapulco',
    6970651=>'Acorn',
    13238245=>'Aero Blue',
    7423635=>'Affair',
    8803850=>'Afghan Tan',
    13943976=>'Akaroa',
    16777215=>'Alabaster',
    16116179=>'Albescent White',
    10176259=>'Alert Tan',
    30371=>'Allports'
);

// Color to search for in Hex
$color = 'C0C0C0';

// Convert Hex to Long to compare with array() keys
$colorlong = base_convert($color,16,10);

// Check for an exact match
$result = nearest($mycolors, $colorlong, true);
if($result) {
    echo "An exact match was found for #" . $color . " which is called '" . $result[key($result)] . "'";
} else {
    echo "No exact match was found";
}

if(!$result) {
    // Check for closest match
    $result = nearest($mycolors, $colorlong, true);
    if($result) {
        // Match found
        echo "The closest match for #" . $color . " is #" . base_convert(key($result),10,16) . " which is called '" . $result[key($result)] . "'";
    } else {
        // No match found
        echo "No match was found for #" . $color;
    }
}
?>
soapergem at gmail dot com 29-May-2009 12:06
Here's a slight revision to xmlich02's backwards iteration example. The problem with his/her example is that it will halt if any of the array elements are boolean false, while this version will not.

<?php

end($ar);
while ( !is_null($key = key($ar)) ) {
    $val = current($ar);
    echo "{$key} => {$val}\n";
    prev($ar);
}

?>


Crée un tableau contenant un intervalle d'éléments

  • « prev
  • reset »
  • PHP Manual
  • Fonctions sur les tableaux
  • Crée un tableau contenant un intervalle d'éléments

range

(PHP 4, PHP 5, PHP 7, PHP 8)

range — Crée un tableau contenant un intervalle d'éléments

Description

range ( string|int|float $start , string|int|float $end , int|float $step = 1 ) : array

Crée un tableau contenant un intervalle d'éléments.

Liste de paramètres

start

Première valeur de la séquence.

end

La séquence se termine lorsque la valeur end est atteinte.

step

Si une valeur est donnée au paramètre step, il sera utilisé comme valeur incrémentale entre les éléments de la séquence. step doit être exprimé comme un nombre positif. S'il n'est pas spécifié, step vaut par défaut 1.

Valeurs de retour

Retourne un tableau d'éléments depuis start jusqu'à end, inclusif.

Exemples

Exemple #1 Exemple avec range()

<?php
// array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
foreach (range(0, 12) as $number) {
    echo $number;
}

echo "\n";

// La paramètre de pas (step)
// array(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
foreach (range(0, 100, 10) as $number) {
    echo $number;
}

echo "\n";

// Utilisation d'une séquence de caractères
// array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i');
foreach (range('a', 'i') as $letter) {
    echo $letter;
}

echo "\n";

// array('c', 'b', 'a');
foreach (range('c', 'a') as $letter) {
    echo $letter;
}
?>

Notes

Note:

Les valeurs des caractères de séquence sont limitées à une longueur d'un. Si une longueur supérieure à un est entrée, seul le premier caractère est utilisé.

Voir aussi

  • shuffle() - Mélange les éléments d'un tableau
  • array_fill() - Remplit un tableau avec une même valeur
  • foreach

User Contributed Notes

ccb_bc at hotmail dot com 10-Jun-2019 05:45
<?php
    function natural_prime_numbers(array $range, bool $print_info = false) : array {
        $start_time = time();
        $primes_numbers = array();
        $print = '';
        $count_range  = count($range);
        foreach($range as $number){
            $values_division_number = array();
            if($number === 0 || $number === 1 || !is_int($number)){ // eliminate 0, 1 and other no integer
                continue;
            }
            if($number != 2 && $number%2 === 0){ // eliminate 2 and pairs numbers
                continue;
            }
            for($i = 1; $i <= $number; $i++){
                $resultado_divisao = $number / $i;
                $values_division_number[$i] = $resultado_divisao;

                if($count_range <= 20){ // $count_range <= 20 (+ performance)
                    $print .= PHP_EOL;
                    $info = 'The number '.$number.' divided by the number '.$i.' is equal to: '.($number / $i);
                    $print .= $info;
                    if($i === $number){
                        $print .= PHP_EOL;
                    }
                }

                array_walk($values_division_number, function($value, $index) use (&$values_division_number, &$number){ // reference change values
                    // eliminate floats and others numbers not are equal 1 and own number
                    if(is_float($value) && $value != $number && $value > 1){
                        unset($values_division_number[$index]);
                    }
                });

                $values_division_number = array_values($values_division_number); // reindex array

                // here we want only array with 2 indexes with the values 1 and own number (rule to a natural prime number)
                if(count($values_division_number) === 2 && $values_division_number[0] === $number && $values_division_number[1] === 1){
                    $primes_numbers[$number] = $number;
                }

            }
        }
        return array(
            'length_prime_numbers' => count($primes_numbers),
            'prime_numbers' => array_values($primes_numbers),
            'print' => $print,
            'total_time_processing' => (time() - $start_time).' seconds.',
        );
    }
    var_dump(natural_prime_numbers(range(0, 11))); // here the range() function ;-)

    // Result:
    // array (size=3)
    //   'length_prime_numbers' => int 5
    //   'prime_numbers' =>
    //     array (size=5)
    //       0 => int 2
    //       1 => int 3
    //       2 => int 5
    //       3 => int 7
    //       4 => int 11
    //   'print' => string '
    // O número 2 dividido pelo número 1 é igual a: 2
    // O número 2 dividido pelo número 2 é igual a: 1

    // O número 3 dividido pelo número 1 é igual a: 3
    // O número 3 dividido pelo número 2 é igual a: 1.5
    // O número 3 dividido pelo número 3 é igual a: 1

    // O número 5 dividido pelo número 1 é igual a: 5
    // O número 5 dividido pelo número 2 é igual a: 2.5
    // O número 5 dividido pelo número 3 é igual a: 1.6666666666667
    // O número 5 dividido pelo número 4 é igual a: 1.25
    // O número 5 dividido pelo '...

    // **************************** //
    //
    // * Remember that the function is recursive, that is: a range of 5000 takes more than 1 minute on a processor Intel® Core™ i5-8250U (3.40 GHz).
    //
    // **************************** //
?>
luca.favorido ATgmailDOT com 28-Jun-2016 07:58
The function "range" is very useful to get an array of characters as range('C','R') does.

At work, I had to extend the function range($a,$b) to work in this special case: with two uppercase strings $a and $b, it should return all the possible strings between $a and $b.
This could be used for example to get the excel column indexes.
e.g. <?php range('A','AD') ==> array('A','B','C',...,'Z','AA','AB','AC','AD') ?>

So I wrote the function getrange($min,$max) that exactly does this.

<?php

function getcolumnrange($min,$max){
      $pointer=strtoupper($min);
      $output=array();
      while(positionalcomparison($pointer,strtoupper($max))<=0){
         array_push($output,$pointer);
         $pointer++;
      }
      return $output;
}

function positionalcomparison($a,$b){
   $a1=stringtointvalue($a); $b1=stringtointvalue($b);
   if($a1>$b1)return 1;
   else if($a1<$b1)return -1;
   else return 0;
}

/*
* e.g. A=1 - B=2 - Z=26 - AA=27 - CZ=104 - DA=105 - ZZ=702 - AAA=703
*/
function stringtointvalue($str){
   $amount=0;
   $strarra=array_reverse(str_split($str));

   for($i=0;$i<strlen($str);$i++){
      $amount+=(ord($strarra[$i])-64)*pow(26,$i);
   }
   return $amount;
}
?>
qz 19-Jan-2016 11:58
If you're looking to fill an array to get a hash with 0-9 numerical values, using
range(0,9);
is a faster solution compared to
array_fill(0, 10, '');
moficer at host dot sk 15-Jan-2016 03:17
php 5.6.16

<?php
var_export(range('Z', 'a'));

/*
array (
  0 => 'Z',
  1 => '[',
  2 => '\\',
  3 => ']',
  4 => '^',
  5 => '_',
  6 => '`',
  7 => 'a',
)
 */
Alien426 29-Oct-2015 02:09
The function will generate an array of integers even if your numerical parameters are enclosed in quotes.
<?php
var_dump( range('1', '2') ); // outputs  array(2) { [0]=> int(1) [1]=> int(2) }
?>

An easy way to get an array of strings is to map strval() to the range:
<?php
var_dump( array_map('strval', range('1', '2')) ); // outputs  array(2) { [0]=> string(1) "1" [1]=> string(1) "2" }
?>
unicod3 at hotmail dot com 15-Oct-2014 05:43
a function to get column index by letter

function getColumnNumber($char){
    $alphabet = range('a','z');
    $alphabet2 = range('a','z');
    $newAlphabet = $alphabet;
    foreach($alphabet as $k => $r)
    {
        foreach($alphabet2 as $row){
            $newAlphabet[] = $r.$row;
        }
    }
    $key = array_search($char, $newAlphabet);
    return ($key !== false) ? $key : null;
}
lsblsb at gmx dot de 30-Apr-2014 03:09
I needed a function, that creates a letter range with arbitrary length.
You specify via the $length parameter, how many entries you need.
Logic is analog to the logic of the column-titles in a calc-sheet.

<?php

/**
  * create a letter range with arbitrary length
  * @param int $length
  * @return array
  */
function createLetterRange($length)
{
    $range = array();
    $letters = range('A', 'Z');
    for($i=0; $i<$length; $i++)
    {
        $position = $i*26;
        foreach($letters as $ii => $letter)
        {
            $position++;
            if($position <= $length)
                $range[] = ($position > 26 ? $range[$i-1] : '').$letter;
        }
    }
    return $range;
}
?>
php at keith tyler dot com 26-Feb-2014 10:22
So with the introduction of single-character ranges to the range() function, the internal function tries to be "smart", and (I am inferring from behavior here) apparently checks the type of the incoming values. If one is numeric, including numeric string, then the other is treated as numeric; if it is a non-numeric string, it is treated as zero.

But.

If you pass in a numeric string in such a way that is is forced to be recognized as type string and not type numeric, range() will function quite differently.

Compare:

<?php
echo implode("",range(9,"Q"));
// prints 9876543210

echo implode("",range("9 ","Q"));  //space after the 9
// prints 9:;<=>?@ABCDEFGHIJKLMNOPQ

echo implode("",range("q","9 "));
// prints qponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:987654
?>

I wouldn't call this a bug, because IMO it is even more useful than the stock usage of the function.
jazzduck AT gmail DOT com 21-Jan-2014 08:32
Despite the line above that says that the $step value should be "given as a positive number," the range() function will in fact correctly handle reversed (decrementing) ranges. For example:

<?php print_r( range( 24, 20 ) ); ?>
Array
(
    [0] => 24
    [1] => 23
    [2] => 22
    [3] => 21
    [4] => 20
)

<?php print_r( range( 20, 11, -3 ) ); ?>
Array
(
    [0] => 20
    [1] => 17
    [2] => 14
    [3] => 11
)

It will actually ignore the sign of the $step argument, and determine whether to increment or decrement based purely on whether $start > $end or $end > $start. For example:

<?php print_r( range( 20, 11, 3 ) ); ?>
Array
(
    [0] => 20
    [1] => 17
    [2] => 14
    [3] => 11
)

<?php print_r( range( 11, 20, -3 ) ); ?>
Array
(
    [0] => 11
    [1] => 14
    [2] => 17
    [3] => 20
)
pyetrosafe at gmail dot com 27-Sep-2013 01:36
To create a simple array or a multidimensional array with defined size and null values??, use this expression:

<?php

$SimpleArray = array_map(function($n) { return null; }, range(1, 3) );
$MultiArray = array_map(function($n) { return array_map(function($n) { return null; }, range(1, 2) ); }, range(1, 3) );

var_dump($SimpleArray);
var_dump($MultiArray);

// And will print:
?>
>>$SimpleArray
array(3) {
  [0]=>  NULL
  [1]=>  NULL
  [2]=>  NULL
}

>>$MultiArray
array(3) {
  [0]=>  array(2) {
    [0]=>    NULL
    [1]=>    NULL
  }
  [1]=>  array(2) {
    [0]=>    NULL
    [1]=>    NULL
  }
  [2]=>  array(2) {
    [0]=>    NULL
    [1]=>    NULL
  }
}

?>
krdr dot mft at gmail dot com 19-Aug-2013 09:48
I've been introduced with range() function not so long ago, and I found that examples about it is somewhat wrong, even inefficient:

<?php
$o = "";
$time_start = microtime(true);
foreach(range(1, 10000) as $val) {
    $o .= $val;
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo 'rangein: '.$time.'<br />';

$o = "";
$time_start = microtime(true);
$a = range(1, 10000);
foreach($a as $val) {
    $o .= $val;
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo 'rangeout: '.$time.'<br />';

?>

Which gives results:

rangein: 0.0025348663330078
rangeout: 0.0019199848175049

In some cases difference is even bigger and proportional to the range generated. I suppose that results of range() are cached/hashed.

Note: execution order does affects execution times, but difference still exists
Ray.Paseur often uses Gmail 06-Jun-2013 03:16
Interestingly, these two statements produce identical 26-character alphabet arrays.

<?php
$arr = range('A',  'Z');
$arr = range('AA', 'ZZ');
gtisza at gmail dot com 25-Apr-2013 10:27
You might expect range($n, $n-1) to be an empty array (as in e.g. Python) but actually PHP will assume a step of -1 if start is larger than end.
Palz 29-Oct-2012 10:59
To create a range array like

Array
(
    [11] => 1
    [12] => 2
    [13] => 3
    [14] => 4
)

combine two range arrays using array_combine:

array_combine(range(11,14),range(1,4))
ktamas77 at gmail dot com 03-Aug-2012 10:59
if you need zero padding, string prefixes or any other masks, then a simple combination of array_map, inline functions and sprintf is your friend.

<?php

$a = array_map(function($n) { return sprintf('sample_%03d', $n); }, range(50, 59) );

print_r($a);

?>

Will result:

Array
(
    [0] => sample_050
    [1] => sample_051
    [2] => sample_052
    [3] => sample_053
    [4] => sample_054
    [5] => sample_055
    [6] => sample_056
    [7] => sample_057
    [8] => sample_058
    [9] => sample_059
)
me at phpscott dot com 23-May-2012 05:37
So, I needed a quick and dirty way to create a dropdown select for hours, minutes and seconds using 2 digit formatting, and to create those arrays of data, I combined range with array merge..

<?php
$prepend = array('00','01','02','03','04','05','06','07','08','09');
$hours     = array_merge($prepend,range(10, 23));
$minutes     = array_merge($prepend,range(10, 59));
$seconds     = $minutes;
?>

Super simple.
dries at volta dot be 09-Feb-2012 11:30
Ever wanted to generate an array with a range of column names for use in Excel file related parsing?
I've wrote a function that starts at the A column and adds column names up until the column you specified.

<?php

/**
 * This function creates an array with column names up until the column
 * you specified.
*/
function createColumnsArray($end_column, $first_letters = '')
{
  $columns = array();
  $length = strlen($end_column);
  $letters = range('A', 'Z');

  // Iterate over 26 letters.
  foreach ($letters as $letter) {
      // Paste the $first_letters before the next.
      $column = $first_letters . $letter;

      // Add the column to the final array.
      $columns[] = $column;

      // If it was the end column that was added, return the columns.
      if ($column == $end_column)
          return $columns;
  }

  // Add the column children.
  foreach ($columns as $column) {
      // Don't itterate if the $end_column was already set in a previous itteration.
      // Stop iterating if you've reached the maximum character length.
      if (!in_array($end_column, $columns) && strlen($column) < $length) {
          $new_columns = createColumnsArray($end_column, $column);
          // Merge the new columns which were created with the final columns array.
          $columns = array_merge($columns, $new_columns);
      }
  }

  return $columns;
}

?>

Usage:

<?php

// Return an array with all column names from A until and with BI.
createColumnsArray('BI');

?>
Aram Kocharyan 27-Feb-2011 07:58
Here's a function to generate ranges from strings:

<?php

/*  Creates an array of integers based on a given range string of format "int - int"
    Eg. range_str('2 - 5'); */
function range_str($str) {
    preg_match('#(\\d+)\\s*-\\s*(\\d+)#', $str, $matches);
    if ( count($matches) == 3 ) {
        return range($matches[1], $matches[2]);
    }
    return FALSE;
}

// Test
$array = range_str(' 2 - 4 ');
print_r($array);

?>

This outputs:

Array
(
    [0] => 2
    [1] => 3
    [2] => 4
)
jay at NOspam dot myd3 dot com 29-Apr-2009 05:54
This is a modified version of thomas' range_string() function. It's simpler, cleaner, and more robust, but it lacks the advanced features his function had, hopefully it will be of assitance to someone.

Examples:

    input: "1, 2, 3, 4, 5, 6" --> output: 1, 2, 3, 4, 5, 6
    input: "1-6" --> output: 1, 2, 3, 4, 5, 6
    input: "1-6" --> output: 1, 2, 3, 4, 5, 6
    input: "1 - -6" --> output: 1, 2, 3, 4, 5, 6
    input: "0 - 0" --> output: 0
    input: "1, 4-6, 2" --> output: 1, 2, 4, 5, 6
    input: "6,3-1" --> output: 1, 2, 3, 6

<?php

define('RANGE_ARRAY_SORT', 1);
define('RANGE_ARRAY', 2);
define('RANGE_STRING_SORT', 3);
define('RANGE_STRING', 4);

function range_string($range_str, $output_type = RANGE_ARRAY_SORT)
{
    // Remove spaces and nother non-essential characters
    $find[]    = "/[^\d,\-]/";
    $replace[] = "";

    // Remove duplicate hyphens
    $find[]    = "/\-+/";
    $replace[] = "-";

    // Remove duplicate commas
    $find[]    = "/\,+/";
    $replace[] = ",";

    $range_str = preg_replace($find, $replace, $range_str);

    // Remove any commas or hypens from the end of the string
    $range_str = trim($range_str,",-");

    $range_out = array();
    $ranges    = explode(",", $range_str);

    foreach($ranges as $range)
    {

        if(is_numeric($range) || strlen($range) == 1)
        {
            // Just a number; add it to the list.
            $range_out[] = (int) $range;
        }
        else if(is_string($range))
        {

            // Is probably a range of values.
           $range_exp = preg_split("/(\D)/",$range,-1,PREG_SPLIT_DELIM_CAPTURE);

            $start = $range_exp[0];
            $end   = $range_exp[2];

            if($start > $end)
            {
                for($i = $start; $i >= $end; $i -= 1)
                {
                    $range_out[] = (int) $i;
                }
            }
            else
            {
                for($i = $start; $i <= $end; $i += 1)
                {
                    $range_out[] = (int) $i;
                }
            }

        }
    }

    switch ($output_type) {
        case RANGE_ARRAY_SORT:
            $range_out = array_unique($range_out);
            sort($range_out);

        case RANGE_ARRAY:
            return $range_out;
            break;

        case RANGE_STRING_SORT:
            $range_out = array_unique($range_out);
            sort($range_out);

        case RANGE_STRING:

        default:
            return implode(", ", $range_out);
            break;
    }
}

// Sample Usage:
$range = range_string("6, 3-1");

?>
ThinkMedical at Gmail dot com 26-Aug-2008 05:11
foreach(range()) whilst efficiant in other languages, such as python, it is not (compared to a for) in php*.

php is a C-inspired language and thus for is entirely in-keeping with the lanuage aethetic to use it

<?php
//efficiant
for($i = $start; $i < $end; $i+=$step)
{
        //do something with array
}

//inefficiant
foreach(range($start, $end, $step) as $i)
{
        //do something with array
}
?>

That the officiant documentation doesnt mention the for loop is strange.

Note however, that in PHP5 foreach is faster than for when iterating without incrementing a variable.

* My tests using microtime and 100 000 iterations consistently (~10 times) show that for is 4x faster than foreach(range()).
captvanhalen at gmail dot com 27-Mar-2008 10:33
Here is a home rolled range() function that uses the step feature for those unfortunate souls who cannot use PHP5:

<?php
function my_range( $start, $end, $step = 1) {

    $range = array();

    foreach (range( $start, $end ) as $index) {

        if (! (($index - $start) % $step) ) {
            $range[] = $index;
        }
    }

    return $range;
}
?>
chris at laflash dot org 09-May-2007 04:47
Quick HTML menus with minimum and maximum sets of years:

<?php
    /*
    ** Quick HTML menus with minimum and maximum sets of years.
    ** @author Chris Charlton <chris@laflash.org>
    ** @license FREE!
    */

    // Years range setup
    $year_built_min = 1900;
    $year_built_max = date("Y");
?>
<select id="yearBuiltMin" size="1">
    <?php // Generate minimum years

        foreach (range($year_built_min, $year_built_max) as $year) { ?>
        <option value="<?php echo($year); ?>"><?php echo($year); ?></option>
        <?php } ?>
</select>

<select id="yearBuiltMax" size="1">
      <?php // Generate max years

        foreach (range($year_built_max, $year_built_min) as $year) { ?>
        <option value="<?php echo($year); ?>"><?php echo($year); ?></option>
        <?php } ?>
</select>
m0sh3 at hotmail dot com 01-Mar-2007 05:46
Here's how i use it to check if array is associative or not:

<?php

if (array_keys($arr)===range(0, sizeof($arr)-1)) {
// not associative array

} else {
// associative array

}

?>
manuel at levante dot de 07-Nov-2006 05:25
<?php
function srange ($s) {
  preg_match_all("/([0-9]{1,2})-?([0-9]{0,2}) ?,?;?/", $s, $a);
  $n = array ();
  foreach ($a[1] as $k => $v) {
    $n  = array_merge ($n, range ($v, (empty($a[2][$k])?$v:$a[2][$k])));
  }
  return ($n);
}

$s = '1-4 6-7 9-10';
print_r(srange($s));
?>

Return:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 6
    [5] => 7
    [6] => 9
    [7] => 10
)
subscription101 at hotmail dot com 08-Jan-2006 06:36
A much simpler way of creating a range of even numbers is by starting with an even number:

<?php

    range(2, 10, 2);

?>
emory underscore smith at hotmail 20-Aug-2005 07:53
since its not stated explicitly above, thought id point out that you arent limited to using integers.

however, be careful when doing so, as you might not get the range you expect!

to illustrate:

<?php
$am = range(500,1600,10);
$fm = range(88.1,107.9,.2);
print_r($am);
print_r($fm);
?>

print_r($am) yields the expected result:

Array
(
    [0] => 500
    [1] => 510
    [2] => 520
    ...
    [109] => 1590
    [110] => 1600
)

print_r($fm), however, falls a bit (1%) short:

Array
(
    [0] => 88.1
    [1] => 88.3
    [2] => 88.5
    ...
    [97] => 107.5
    [98] => 107.7
)

so, if you want to use a non-integral step size params for numeric ranges, be sure to account for fp representation accuracy and error accumulation; a step size of something like pi or 1/10 could spell disaster for a large range. if in doubt, use integral steps and divide ... something like <?php range(88.1,108,.2) ?> might work to recover 107.9, but would not be scalable like, say <?php array_map(create_function('$x','return $x/10;'),range(881,1079,2)) ?>.

-emory
derek at php dot net 08-May-2005 06:13
This should emulate range() a little better.
<?php
function range_wroar($low, $high, $step = 1) {
    $arr = array();
    $step = (abs($step)>0)?abs($step):1;
    $sign = ($low<=$high)?1:-1;
    if(is_numeric($low) && is_numeric($high)) {
        //numeric sequence
        for ($i = (float)$low; $i*$sign <= $high*$sign; $i += $step*$sign)
            $arr[] = $i;
    }    else    {
        //character sequence
        if (is_numeric($low))
            return $this->range($low, 0, $step);
        if (is_numeric($high))
            return $this->range(0, $high, $step);
        $low = ord($low);
        $high = ord($high);
        for ($i = $low; $i*$sign <= $high*$sign; $i += $step*$sign) {

            $arr[] = chr($i);
        }
    }
    return $arr;
}
?>
j dot gizmo at aon dot at 23-Sep-2004 04:23
i figured i'd add some more functionality to the myRange() functions below.
now you can, besides giving a $step parameter,
1. count backwards
2. count with letters
3. give whatever parameter you want, there's nothing (i know of) that will cause an endless loop (try a negative $step for the previous function....)

<?php
function myRange($num1, $num2, $step=1)
{
    if (is_numeric($num1) && is_numeric($num2))
    {
        //we have a numeric range
        $step = ( abs($step)>0 ? abs($step) : 1 ); //make $step positive
        $dir = ($num1<=$num2 ? 1 : -1); //get the direction
        for($i = (float)$num1; $i*$dir <= $num2*$dir; $i += $step*$dir)
        {
            $temp[] = $i;
        }
    }
    else
    {
        //we have a character range
        $num1=ord((string)$num1); //convert to ascii value
        $num2=ord((string)$num2);
        $step = ( abs($step)>0 ? abs($step) : 1 ); //make $step positive
        $dir = ($num1<=$num2 ? 1 : -1); //get direction
        for($i = $num1; $i*$dir <= $num2*$dir; $i += $step*$dir)
        {
            $temp[] = chr($i);
        }
    }
    return $temp;
}

print_r(myRange( 1, 3, 0.5 )); //you can use fractional steps
print_r(myRange( "a", "k", 3 )); //or count letters
print_r(myRange( "5", "9" )); //numbers are detected even if hidden in strtings
print_r(myRange( "!", "%", 1/pi() )); //or mess around with senseless parameters

?>


Remet le pointeur interne de tableau au début

  • « range
  • rsort »
  • PHP Manual
  • Fonctions sur les tableaux
  • Remet le pointeur interne de tableau au début

reset

(PHP 4, PHP 5, PHP 7, PHP 8)

reset — Remet le pointeur interne de tableau au début

Description

reset ( array|object &$array ) : mixed

reset() replace le pointeur de tableau array au premier élément et retourne la valeur du premier élément.

Liste de paramètres

array

Le tableau d'entrée.

Valeurs de retour

Retourne la valeur du premier élément du tableau, ou false si le tableau est vide.

Avertissement

Cette fonction peut retourner false, mais elle peut aussi retourner une valeur équivalent à false. Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour exacte de cette fonction.

Exemples

Exemple #1 Exemple avec reset()

<?php

$array = array('step one', 'step two', 'step three', 'step four');

// Par défaut, le pointeur est sur le premier élément
echo current($array) . "<br />\n"; // "step one"

// on saute deux éléments
next($array);
next($array);
echo current($array) . "<br />\n"; // "step three"

// on remet le pointeur au début
reset($array);
echo current($array) . "<br />\n"; // "step one"

?>

Notes

Note: La valeur retournée pour un tableau vide n'est pas distinguable de la valeur retournée pour un tableau qui contient une valeur bool false comme premier élément. Pour proprement vérifier la valeur du premier élément d'un tableau, qui peut contenir un élément false, il faut d'abord vérifier le count() du tableau, ou vérifier si la key() n'est pas null, après avoir appelé reset().

Voir aussi

  • current() - Retourne l'élément courant du tableau
  • each() - Retourne chaque paire clé/valeur d'un tableau
  • end() - Positionne le pointeur de tableau en fin de tableau
  • next() - Avance le pointeur interne d'un tableau
  • prev() - Recule le pointeur courant de tableau
  • array_key_first() - Récupère la première clé d'un tableau

User Contributed Notes

Bartek Ferek 30-Aug-2016 11:16
As for taking first key of an array, it's much more efficient to RESET and then KEY, rather then RESET result of ARRAY_KEYS (as sugested by gardnerjohng at gmail dot com).

<?php
reset($someArray);
echo key($someArray);
?>

This will give the same result but is much much faster. Larger arrays, better performance. Tested on 100-elements long array with 16 times faster results.
arne dot slabbinck at duo dot be 01-Oct-2015 03:43
Info:

Following code gives a strict warning in 5.4.45

      return reset(array_keys($result['node']));

"Strict warning: Only variables should be passed by reference"

So should be:

      $keys = array_keys($result['node']);
      return reset($keys);
arne dot ludwig at posteo dot de 18-Sep-2015 09:22
In response to gardnerjohng's note to retrieve the first _key_ of an array:

To retrieve the first _key_ of an array you can use the combination of reset() and key().

<?php
    $properties = array(
        'colour'   => 'grey',
        'flavour'  => 'rubber',
        'name'     => 'Mouse Ball',
        'texture'  => 'rubbery'
    );

    reset($properties);
    echo key($properties); // => 'colour'
?>

I prefer this solution as you don't have to create the keys array. This should (not measured) improve performance on large arrays.
gardnerjohng at gmail dot com 18-Sep-2014 05:54
If you need an easy way to retrieve the first *key* in an array (instead of the value), it can be done like this:

<?php
    $properties = array(
        'colour'   => 'grey',
        'flavour'  => 'rubber',
        'name'     => 'Mouse Ball',
        'texture'  => 'rubbery'
    );

    #    Will output "colour".
    echo reset(array_keys($properties));
?>
Potentially helpful for configuration files that define a sequence of items as an associative array.
Mladen Janjetovic 16-May-2013 10:07
Note that you can't use pointer here. It will reset the iteration counter in this case.
foreach($array as $key=>&$value) {...}

Use standard foreach instead
foreach($array as $key=>$value) {...}
milo at mdlwebsolutions dot com 03-Apr-2012 10:22
GOTCHA: If your first element is false, you don't know whether it was empty or not.

<?php

$a = array();
$b = array(false, true, true);
var_dump(reset($a) === reset($b)); //bool(true)

?>

So don't count on a false return being an empty array.
kendsnyder at gmail dot com 08-Feb-2010 08:12
Don't use `reset()` to get the first value of an associative array. It works great for true arrays but works unexpectedly on Iterator objects. http://bugs.php.net/bug.php?id=38478
m dot lebkowski+php at gmail dot com 03-Aug-2006 01:58
Colin, there`s a better (IMO) way to solve your problem.
<?
  // ...
  foreach($a as $k => &$d){}   // notice the "&"
  // ...
?>
It`s a new feature in PHP5 to use references in foreach loop. This way PHP isn`t making a copy of the array, so the internal pointer won`t be reset.
Colin 06-Jun-2006 08:11
I had a problem with PHP 5.0.5 somehow resetting a sub-array of an array with no apparent reason.  The problem was in doing a foreach() on the parent array PHP was making a copy of the subarrays and in doing so it was resetting the internal pointers of the original array.

The following code demonstrates the resetting of a subarray:

<?
$a = array(
    'a' => array(
        'A', 'B', 'C', 'D',
    ),
    'b' => array(
        'AA', 'BB', 'CC', 'DD',
    ),
);

// Set the pointer of $a to 'b' and the pointer of 'b' to 'CC'
reset($a);
next($a);
next($a['b']);
next($a['b']);
next($a['b']);

var_dump(key($a['b']));
foreach($a as $k => $d)
{
}
var_dump(key($a['b']));
?>

The result of the two var dumps are 3 and 0, respectively.  Clearly the internal pointer of $a['b'] was reset by doing the foreach loop over $a.

Each time the foreach loop iterated over the 'a' and 'b' keys of $a it made a copy of $a['a'] and $a['b'] into $d which resetted the internal pointers of $a['a'] and $a['b'] despite making no obvious changes.

The solution is instead to iterate over the keys of $a.

<?
foreach(array_keys($a) as $k)
{
}
?>

and using $a[$k] (or creating an alias of $a[$k] as $d and dealing with the consequences of using aliases).

For the curious, I was implementing the Iterator interface on a dummy object and calling a global object to do the actual iteration (also to cope with PHP's lack of C-style pointers which when doing a $a = $b on objects would cause the data in $a to be inconsistent with the data in $b when modified).  Being that I had many dummy objects representing different data sets I chose to store each data set as a subarray contained within the global object.  To make this work each dummy object has to store a key (which can freely be duplicated without problems) that it passes to the global object when rewind, key, current, next, and valid were called on the dummy object.

Unfortunately for me, my key required to be more than just a simple string or number (if it was then it could be used to directly index the subarray of data for that object and problem avoided) but was an array of strings.  Instead, I had to iterate over (with a foreach loop) each subarray and compare the key to a variable stored within the subarray.

So by using a foreach loop in this manner and with PHP resetting the pointer of subarrays it ended up causing an infinite loop.

Really, this could be solved by PHP maintaining internal pointers on arrays even after copying.
27-Feb-2006 01:20
I wrote a nice function, which rotates values of array. Very useful for table rows where you have to rotate colors

<?php
function rotate(&$array) {
    $item = current($array);
    if (!next($array)) reset($array);
    return $item;
}
?>
Alexandre Koriakine 18-Nov-2005 02:09
Also it's good to reset this way the multidimentional arrays:

reset($voo2['moder']);
while (list($key, $value) = each ($voo2['moder'])) {

reset($voo2['moder'][$key]);
while (list($key1, $value1) = each ($voo2['moder'][$key])) {
#do what u want
}

}
leaetherstrip at inbox dot NOSPAMru 17-Oct-2004 06:54
Note that reset() will not affect sub-arrays of multidimensional array.

For example,

<?php
    $arr = array(
        1 => array(2,3,4,5,6),
        2 => array(6,7,8,9,10)
    );

    while(list($i,) = each($arr))
    {
        echo "IN \$arr[$i]<br>";

        while(list($sub_i,$entry) = each($arr[$i]))
        {
            echo "\$arr[$i][$sub_i] = $entry<br>";
        }
    }

    reset($arr);

    // Do the same again
    while(list($i,) = each($arr))
    {
        echo "IN \$arr[$i]<br>";

        while(list($sub_i,$entry) = each($arr[$i]))
        {
            echo "\$arr[$i][$sub_i] = $entry<br>";
        }
    }
?>

will print

IN $arr[1]
$arr[1][0] = 2
$arr[1][1] = 3
$arr[1][2] = 4
$arr[1][3] = 5
$arr[1][4] = 6
IN $arr[2]
$arr[2][0] = 6
$arr[2][1] = 7
$arr[2][2] = 8
$arr[2][3] = 9
$arr[2][4] = 10
IN $arr[1]
IN $arr[2]


Trie un tableau en ordre inverse

  • « reset
  • shuffle »
  • PHP Manual
  • Fonctions sur les tableaux
  • Trie un tableau en ordre inverse

rsort

(PHP 4, PHP 5, PHP 7, PHP 8)

rsort — Trie un tableau en ordre inverse

Description

rsort ( array &$array , int $flags = SORT_REGULAR ) : bool

Effectue un tri en ordre décroissant (du plus grand au plus petit) du tableau array.

Note:

Si deux membres se comparent comme égaux, leur ordre relatif dans le tableau trié n'est pas défini.

Liste de paramètres

array

Le tableau d'entrée.

flags

Le deuxième paramètre optionnel flags peut être utilisé pour modifier le comportement de tri en utilisant ces valeurs :

Type de drapeaux de tri :

  • SORT_REGULAR - compare items normally; the details are described in the comparison operators section
  • SORT_NUMERIC - compare les éléments numériquement
  • SORT_STRING - compare les éléments comme des chaînes de caractères
  • SORT_LOCALE_STRING - compare les éléments comme des chaînes de caractères, basé sur la locale courante. Ceci utilise la locale, qui peut être changée en utilisant setlocale()
  • SORT_NATURAL - compare les éléments comme des chaînes de caractères utilisant "l'ordre naturel" comme natsort()
  • SORT_FLAG_CASE - peut être combiné (OU bit à bit) avec SORT_STRING ou SORT_NATURAL pour trier les chaînes sans tenir compte de la casse

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec rsort()

<?php
$fruits = array("lemon", "orange", "banana", "apple");
rsort($fruits);
foreach ($fruits as $key => $val) {
    echo "$key = $val\n";
}
?>

L'exemple ci-dessus va afficher :

0 = orange
1 = lemon
2 = banana
3 = apple

Les fruits ont été classés dans l'ordre alphabétique inverse.

Notes

Note: Cette fonction assigne de nouvelles clés aux éléments dans array. Elle effacera toutes les clés existantes qui ont pu être assignées, plutôt que de réarranger les clés.

Voir aussi

  • arsort() - Trie un tableau en ordre inverse et conserve l'association des index
  • krsort() - Trie un tableau en sens inverse et suivant les clés
  • Les fonctions de tri des tableaux

User Contributed Notes

suniafkhami at gmail dot com 20-Feb-2014 02:40
If you are sorting an array from a database result set, such as MySQL for example, another approach could be to have your database sort the result set by using ORDER BY DESC, which would be the equivalent of using rsort() on the resulting array in PHP.

[Edited by moderator for clarity: googleguy at php dot net]
Alex M 27-Jun-2005 07:39
A cleaner (I think) way to sort a list of files into reversed order based on their modification date.

<?php
   $path = $_SERVER[DOCUMENT_ROOT]."/files/";
   $dh = @opendir($path);

   while (false !== ($file=readdir($dh)))
   {
      if (substr($file,0,1)!=".")
         $files[]=array(filemtime($path.$file),$file);   #2-D array
   }
   closedir($dh);

   if ($files)
   {
      rsort($files); #sorts by filemtime

      #done! Show the files sorted by modification date
      foreach ($files as $file)
         echo "$file[0] $file[1]<br>\n";  #file[0]=Unix timestamp; file[1]=filename
   }
?>
pshirkey at boosthardware dot com 14-Jan-2005 01:06
I needed a function that would sort a list of files into reversed order based on their modification date.

Here's what I came up with:

function display_content($dir,$ext){

    $f = array();
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            while (($folder = readdir($dh)) !== false) {
                if (preg_match("/\s*$ext$/", $folder)) {
                    $fullpath = "$dir/$folder";
                    $mtime = filemtime ($fullpath);

                    $ff = array($mtime => $fullpath);
                    $f = array_merge($f, $ff);

            }
                }

            rsort($f, SORT_NUMERIC);

            while (list($key, $val) = each($f)) {
                $fcontents = file($val, "r");
                while (list($key, $val) = each($fcontents))
                    echo "$val\n";
            }

        }
    }

        closedir($dh);
}

Call it like so:

display_content("folder","extension");
ray at non-aol dot com 02-Nov-2004 07:49
Like sort(), rsort() assigns new keys for the elements in array. It will remove any existing keys you may have assigned, rather than just reordering the keys.  This means that it will destroy associative keys.

$animals = array("dog"=>"large",  "cat"=>"medium",  "mouse"=>"small");
print_r($animals);
//Array ( [dog] => large [cat] => medium [mouse] => small )

rsort($animals);
print_r($animals);
//Array ( [0] => small [1] => medium [2] => large )

Use KSORT() or KRSORT() to preserve associative keys.
rnk-php at kleckner dot net 17-Jun-2003 12:37
Apparently rsort does not put arrays with one value back to zero.  If you have an array like: $tmp = array(9 => 'asdf') and then rsort it, $tmp[0] is empty and $tmp[9] stays as is.
slevy1 at pipeline dot com 12-Jun-2001 11:15
I thought rsort was working successfully or on a multi-dimensional array of strings that had first been sorted with usort(). But, I noticed today that the array  was only partially in descending order.  I tried array_reverse on it and that seems to have solved things.


Mélange les éléments d'un tableau

  • « rsort
  • sizeof »
  • PHP Manual
  • Fonctions sur les tableaux
  • Mélange les éléments d'un tableau

shuffle

(PHP 4, PHP 5, PHP 7, PHP 8)

shuffle — Mélange les éléments d'un tableau

Description

shuffle ( array &$array ) : bool

Mélange les éléments du tableau array. Cette fonction utilise un pseudo générateur de nombre aléatoire qu'il n'est pas conseillé d'utiliser pour de la cryptographie.

Liste de paramètres

array

Le tableau.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
7.1.0 | L'algorithme interne de génération aléatoire a été modifié pour utiliser le générateur de nombre aléatoire » Mersenne Twister au lieu de la fonction libc rand.

Exemples

Exemple #1 Exemple avec shuffle()

<?php
$numbers = range(1, 20);
shuffle($numbers);
foreach ($numbers as $number) {
    echo "$number ";
}
?>

Notes

Note: Cette fonction assigne de nouvelles clés aux éléments dans array. Elle effacera toutes les clés existantes qui ont pu être assignées, plutôt que de réarranger les clés.

Voir aussi

  • array_rand() - Prend une ou plusieurs clés, au hasard dans un tableau
  • Les fonctions de tri des tableaux

User Contributed Notes

thomas dot sahlin at invented dot se 16-May-2017 08:20
Here's a simple one liner for shuffling associative arrays:

<?php

uksort($myArray, function ($a, $b) {return mt_rand(-10, 10);});

?>
xzero at elite7hackers dot net 30-May-2015 01:09
There is an function which uses native shuffle() but preserves keys, and their order, so at end, only values are shuffled.

<?PHP
/**
 * Array Quake - Give an array good quake so every value will endup with random given space.
 * Keys, and their order are preserved.
 * @author xZero <xzero@elite7hackers.net>
 * @param array $array
 * @return boolean false on failure
 */
function array_quake(&$array) {
    if (is_array($array)) {
        $keys = array_keys($array); // We need this to preserve keys
        $temp = $array;
        $array = NULL;
        shuffle($temp); // Array shuffle
        foreach ($temp as $k => $item) {
            $array[$keys[$k]] = $item;
        }
        return;
    }
    return false;
}

// Example
$numbers = array(
    'ZERO' => 0,
    'ONE' => 1,
    'TWO' => 2,
    'THREE' => 3,
    'FOUR' => 4,
    'FIVE' => 5,
    'SIX' => 6,
    'SEVEN' => 7,
    'EIGHT' => 8,
    'NINE' => 9
);
echo "\nBefore (original):\n";
print_r($numbers);
array_quake($numbers);
echo "\n\nAfter (Array Quake);\n";
print_r($numbers);
echo "\n";
?>

Result example:
Before (original):
Array
(
    [ZERO] => 0
    [ONE] => 1
    [TWO] => 2
    [THREE] => 3
    [FOUR] => 4
    [FIVE] => 5
    [SIX] => 6
    [SEVEN] => 7
    [EIGHT] => 8
    [NINE] => 9
)

After (Array Quake);
Array
(
    [ZERO] => 4
    [ONE] => 2
    [TWO] => 0
    [THREE] => 8
    [FOUR] => 3
    [FIVE] => 6
    [SIX] => 1
    [SEVEN] => 7
    [EIGHT] => 5
    [NINE] => 9
)
peter at removethisplease dot ddcrew dot com 02-Dec-2013 01:55
This seems to do reasonably well as a shuffle() that preserves index assocation:

<?php
function ashuffle (&$arr) {
    uasort($arr, function ($a, $b) {
        return rand(-1, 1);
    });
}
?>

Obviously only works if PHP has closures enabled...
timtrinidad at gmail dot com 08-Aug-2011 12:38
It appears that the suhosin extensions >= 0.9.26 that have the suhosin.mt_srand.ignore and suhosin.srand.ignore settings set to "Off" do not affect shuffle().

In other words, the only way I was able to get pseudo-random and predictable results through shuffle() was to disable the extension.
Eric Anderson 29-Mar-2011 09:33
Copy and paste this script and refresh the page to see the shuffling effect.

<?php
    /**
    * Shuffles and displays cards in a deck
    * @author:     Eric Anderson
    * @filename:   deckofcards.php
    */

    // Create an array of face values
    // and an array of card values
    // then merge them together
    $cards = array_merge(array("J", "Q", "K", "A"), range(2,10)); // 13 cards

    // Shuffle the cards
    shuffle($cards);

    // Create an multidimentional array to hold the 4 suits
    $suits = array(
        'Heart' => array(),
        'Spade' => array(),
        'Diamond' => array(),
        'Club' => array()
        );

    // Add cards to their respective suits
    for($i = 0; $i < count($suits); $i++)
    {
        for($j = 0; $j < count($cards); $j++)
        {
            $suits['Heart'][$j] = $cards[$j]."<span style=color:#FF0000;>&hearts;</span>";
            $suits['Spade'][$j] = $cards[$j]."&spades;";
            $suits['Diamond'][$j] = $cards[$j]."<span style=color:#FF0000;>&diams;</span>";
            $suits['Club'][$j] = $cards[$j]."&clubs;";
        }
    }

    // Create a deck
    $deck = array();

    // Merge the suits into the empty deck array
    $deck = array_merge($deck, $suits);

    // Display the deck to the screen
    echo "<p><b>Deck of cards:</b></p>";
    foreach($deck as $k1 => $v1)
    {
        // Display suit name
        echo "<p>&emsp;$k1's<br />&emsp;{<br />&emsp;&emsp;";
        $acc = 0;

        // Display card value
        foreach($v1 as $k2 => $v2)
        {
            echo "$v2&nbsp";
            $acc++;

            if ($acc == 4)
            {
                echo "<br />&emsp;&emsp;";
                $acc = 0;
            }
        }
        echo "<br />&emsp;}</p>";
    }
?>
andjones at gmail dot com 26-Aug-2010 09:35
Shuffle associative and non-associative array while preserving key, value pairs. Also returns the shuffled array instead of shuffling it in place.

<?php

function shuffle_assoc($list) {
  if (!is_array($list)) return $list;

  $keys = array_keys($list);
  shuffle($keys);
  $random = array();
  foreach ($keys as $key)
    $random[$key] = $list[$key];

  return $random;
}

?>
ezakto at ezakto dot com 24-Jul-2010 11:13
This is a replica of shuffle() but preserving keys (associative and non-associative)

bool kshuffle  (  array &$array  )

<?php

function kshuffle(&$array) {
    if(!is_array($array) || empty($array)) {
        return false;
    }
    $tmp = array();
    foreach($array as $key => $value) {
        $tmp[] = array('k' => $key, 'v' => $value);
    }
    shuffle($tmp);
    $array = array();
    foreach($tmp as $entry) {
        $array[$entry['k']] = $entry['v'];
    }
    return true;
}

$array = array('first' => 0, 'second' => 1, 'third' => 2);
kshuffle($array);
print_r($array); // [second] => 1 [first] => 0 [third] => 2

$array = array('first', 'second', 'third');
kshuffle($array);
print_r($array); // [1] => second [2] => third [0] => first

?>
m0gr14 at gmail dot com 04-Jul-2010 10:39
This function shuffles an associative array recursive.

<?php

/**
* Shuffles an associative array recursive
* @author Mogria <m0gr14@gmail.com>
* @param array $array
* @return array
*
*/

function rec_assoc_shuffle($array)
{
  $ary_keys = array_keys($array);
  $ary_values = array_values($array);
  shuffle($ary_values);
  foreach($ary_keys as $key => $value) {
    if (is_array($ary_values[$key]) AND $ary_values[$key] != NULL) {
      $ary_values[$key] = rec_assoc_shuffle($ary_values[$key]);
    }
    $new[$value] = $ary_values[$key];
  }
  return $new;
}

?>

Example of use:
<?php
$array =
    Array(
        1,
        Array(
            1,
            2,
            3,
            4,
            Array(
                1,
                2,
                3,
                4,
                5
            )
        ),
        2,
        3,
        Array(
            0,
            1,
                Array(
                    1,
                    2,
                    3,
                    4,
                        Array(
                            1,
                            6,
                            5,
                            2,
                            1,
                            3
                        )
                )
        ),
        4,
        5,
        6,
        7
    );
$array = rec_assoc_shuffle($array);
echo '<pre>';
print_r($array);
echo '</pre>';

/*
Returns:
Array
(
    [0] => 6
    [1] => 5
    [2] => Array
        (
            [0] => 1
            [1] => 3
            [2] => Array
                (
                    [0] => 3
                    [1] => 1
                    [2] => 2
                    [3] => 4
                    [4] => 5
                )

            [3] => 2
            [4] => 4
        )

    [3] => 3
    [4] => Array
        (
            [0] => Array
                (
                    [0] => 3
                    [1] => 1
                    [2] => 4
                    [3] => Array
                        (
                            [0] => 5
                            [1] => 1
                            [2] => 3
                            [3] => 6
                            [4] => 1
                            [5] => 2
                        )

                    [4] => 2
                )

            [1] => 1
            [2] => 0
        )

    [5] => 2
    [6] => 1
    [7] => 4
    [8] => 7
)

*/

?>
rick at suggestive dot com 24-Mar-2010 02:19
Many people in SEO need to supply an array and shuffle the results and need the same result each time that page is generated. This is my implementation with a working example:

<?php
function seoShuffle(&$items,$string) {
    mt_srand(strlen($string));
    for ($i = count($items) - 1; $i > 0; $i--){
        $j = @mt_rand(0, $i);
        $tmp = $items[$i];
        $items[$i] = $items[$j];
        $items[$j] = $tmp;
    }
}

$items = array('one','two','three','four','five','six');
$string = 'whatever';

echo '<pre>';
print_r($items);
echo '</pre>';

seoShuffle($items,$string);

echo '<pre>';
print_r($items);
echo '</pre>';
?>
tyler at CompLangs dot com 01-Jan-2010 06:59
Here is a quick function I wrote that generates a random password and uses shuffle() to easily shuffle the order.

<?php
public function randPass($upper = 3, $lower = 3, $numeric = 3, $other = 2) {
    //we need these vars to create a password string
    $passOrder = Array();
    $passWord = '';

    //generate the contents of the password
    for ($i = 0; $i < $upper; $i++) {
        $passOrder[] = chr(rand(65, 90));
    }
    for ($i = 0; $i < $lower; $i++) {
        $passOrder[] = chr(rand(97, 122));
    }
    for ($i = 0; $i < $numeric; $i++) {
        $passOrder[] = chr(rand(48, 57));
    }
    for ($i = 0; $i < $other; $i++) {
        $passOrder[] = chr(rand(33, 47));
    }

    //randomize the order of characters
    shuffle($passOrder);

    //concatenate into a string
    foreach ($passOrder as $char) {
        $passWord .= $char;
    }

    //we're done
    return $passWord;
}
?>
ahmad at ahmadnassri dot com 18-Nov-2009 08:58
shuffle for associative arrays, preserves key=>value pairs.
(Based on (Vladimir Kornea of typetango.com)'s function)

<?php
    function shuffle_assoc(&$array) {
        $keys = array_keys($array);

        shuffle($keys);

        foreach($keys as $key) {
            $new[$key] = $array[$key];
        }

        $array = $new;

        return true;
    }
?>

*note: as of PHP 5.2.10, array_rand's resulting array of keys is no longer shuffled, so we use array_keys + shuffle.
Anonymous 28-Aug-2009 09:18
I needed a simple function two shuffle a two dimensional array. Please note the second level arrays must be indexed using integers, for example $myarray[0]["Name"] and not $myarray["One"]["Name"]. Here is the function:

<?php
function twodshuffle($array)
{
    // Get array length
    $count = count($array);
    // Create a range of indicies
    $indi = range(0,$count-1);
    // Randomize indicies array
    shuffle($indi);
    // Initialize new array
    $newarray = array($count);
    // Holds current index
    $i = 0;
    // Shuffle multidimensional array
    foreach ($indi as $index)
    {
        $newarray[$i] = $array[$index];
        $i++;
    }
    return $newarray;
}
?>

Please note it only works on two dimensional arrays. Here is an example:

<?php
$myarray = array("Google" => array("Name" => "Google", "URL" => "www.google.com", "Usage" => "Googling"), "Yahoo" => array("Name" => "Yahoo", "URL" => "www.yahoo.com", "Usage" => "Yahooing?"), "Ask" => array("Name" => "Ask", "URL" => "www.ask.com", "Usage" => "Asking Jeeves"));

print_r(twodshuffle($myarray));

/* And the result is:
Array ( [0] => Array ( [Name] => Ask [URL] => www.ask.com [Usage] => Asking Jeeves ) [1] => Array ( [Name] => Google [URL] => www.google.com [Usage] => Googling ) [2] => Array ( [Name] => Yahoo [URL] => www.yahoo.com [Usage] => Yahooing? ) )
*/
?>

Hope you find it useful!
aalaap at gmail dot com 08-Jun-2009 05:12
I've been wondering why shuffle() doesn't provide the shuffled array as a return value instead of a bool. I mean, what could possibly go wrong in shuffling elements from an array?

So I use something like this:

<?php
function array_shuffle($array) {
    if (shuffle($array)) {
        return $array;
    } else {
        return FALSE;
    }
}
?>
sivaji2009 at gmail dot com 17-May-2009 02:07
Here i wrote a custom shuffle function which preserves the array index and distributes the array element randomly.

<?php

/*
 * return an array whose elements are shuffled in random order.
 */
function custom_shuffle($my_array = array()) {
  $copy = array();
  while (count($my_array)) {
    // takes a rand array elements by its key
    $element = array_rand($my_array);
    // assign the array and its value to an another array
    $copy[$element] = $my_array[$element];
    //delete the element from source array
    unset($my_array[$element]);
  }
  return $copy;
}

$array = array(
  'a' => 'apple',
  'b' => 'ball',
  'c' => 'cat',
  'd' => 'dog',
  'e' => 'egg',
  'f' => 'fan',
  'g' => 'gun'
);

print_r(custom_shuffle($array));

Array
(
    [c] => cat
    [e] => egg
    [f] => fan
    [a] => apple
    [b] => ball
    [g] => gun
    [d] => dog
)

?>
dirk dot avery a t gmail 30-Apr-2009 08:58
Building on examples by m227 and pineappleclock, here is a function that returns all permutations of each set in the power set of an array of strings (instead of a string).  Thanks for the great examples!

<?php

/*
 Use: $arr = power_perms($in);

 Example:
  $in = array("A","B","C");
  $power_perms = power_perms($in);

 Returns:
  Array
  (
    [0] => Array
        (
            [0] => A
            [1] => B
            [2] => C
        )

    [1] => Array
        (
            [0] => A
            [1] => C
            [2] => B
        )

    [2] => Array
        (
            [0] => B
            [1] => A
            [2] => C
        )

    [3] => Array
        (
            [0] => B
            [1] => C
            [2] => A
        )

    [4] => Array
        (
            [0] => C
            [1] => A
            [2] => B
        )

    [5] => Array
        (
            [0] => C
            [1] => B
            [2] => A
        )

    [6] => Array
        (
            [0] => A
            [1] => B
        )

    [7] => Array
        (
            [0] => B
            [1] => A
        )

    [8] => Array
        (
            [0] => B
            [1] => C
        )

    [9] => Array
        (
            [0] => C
            [1] => B
        )

    [10] => Array
        (
            [0] => A
            [1] => C
        )

    [11] => Array
        (
            [0] => C
            [1] => A
        )

    [12] => Array
        (
            [0] => A
        )

    [13] => Array
        (
            [0] => B
        )

    [14] => Array
        (
            [0] => C
        )

  )

*/

function power_perms($arr) {

    $power_set = power_set($arr);
    $result = array();
    foreach($power_set as $set) {
        $perms = perms($set);
        $result = array_merge($result,$perms);
    }
    return $result;
}

function power_set($in,$minLength = 1) {

   $count = count($in);
   $members = pow(2,$count);
   $return = array();
   for ($i = 0; $i < $members; $i++) {
      $b = sprintf("%0".$count."b",$i);
      $out = array();
      for ($j = 0; $j < $count; $j++) {
         if ($b{$j} == '1') $out[] = $in[$j];
      }
      if (count($out) >= $minLength) {
         $return[] = $out;
      }
   }

   //usort($return,"cmp");  //can sort here by length
   return $return;
}

function factorial($int){
   if($int < 2) {
       return 1;
   }

   for($f = 2; $int-1 > 1; $f *= $int--);

   return $f;
}

function perm($arr, $nth = null) {

    if ($nth === null) {
        return perms($arr);
    }

    $result = array();
    $length = count($arr);

    while ($length--) {
        $f = factorial($length);
        $p = floor($nth / $f);
        $result[] = $arr[$p];
        array_delete_by_key($arr, $p);
        $nth -= $p * $f;
    }

    $result = array_merge($result,$arr);
    return $result;
}

function perms($arr) {
    $p = array();
    for ($i=0; $i < factorial(count($arr)); $i++) {
        $p[] = perm($arr, $i);
    }
    return $p;
}

function array_delete_by_key(&$array, $delete_key, $use_old_keys = FALSE) {

    unset($array[$delete_key]);

    if(!$use_old_keys) {
        $array = array_values($array);
    }

    return TRUE;
}
?>
pineappleclock at gmail dot com 22-Jan-2009 10:06
If you want the Power Set (set of all unique subsets) of an array instead of permutations, you can use this simple algorithm:

<?php
/**
* Returns the power set of a one dimensional array,
* a 2-D array.
* array(a,b,c) ->
* array(array(a),array(b),array(c),array(a,b),array(b,c),array(a,b,c))
*/
function powerSet($in,$minLength = 1) {
   $count = count($in);
   $members = pow(2,$count);
   $return = array();
   for ($i = 0; $i < $members; $i++) {
      $b = sprintf("%0".$count."b",$i);
      $out = array();
      for ($j = 0; $j < $count; $j++) {
         if ($b{$j} == '1') $out[] = $in[$j];
      }
      if (count($out) >= $minLength) {
         $return[] = $out;
      }
   }
   return $return;
}
?>
tony at brokerbin dot com 11-Nov-2008 07:26
Here is IMO the simplest and extremely fast way to shuffle an associative array AND keep the key=>value relationship.  However, it ONLY works if there are NO NUMERIC keys AT ALL.  Look into array_merge for the reason why.

<?php

$unshuffled = array('one'=>1,'two'=>2,'three'=>3);

$shuffled = array_merge( array_flip(array_rand($unshuffled,count($unshuffled))),$unshuffled );

?>

peace
Antonio Ognio 06-May-2008 09:42
Another shuffle() implementation that preserves keys, does not use extra memory and perhaps is a bit easier to grasp.

<?php
if (function_exists('shuffle_with_keys')===false) {
  function shuffle_with_keys(&$array) {
    /* Auxiliary array to hold the new order */
    $aux = array();
    /* We work with an array of the keys */
    $keys = array_keys($array);
    /* We shuffle the keys */
    shuffle($keys);
    /* We iterate thru' the new order of the keys */
    foreach($keys as $key) {
      /* We insert the key, value pair in its new order */
      $aux[$key] = $array[$key];
      /* We remove the element from the old array to save memory */
      unset($array[$key]);
    }
    /* The auxiliary array with the new order overwrites the old variable */
    $array = $aux;
  }
}
?>
07-Jun-2006 02:53
Posted below is code that you would expect to work

<?php

$keys = shuffle(array_keys($arr));

foreach ($keys as $key) {

  $arr_elem = $arr[$key];
  // do what you want with the array element

}

?>

This in fact does not work because shuffle returns a boolean true or false. More accurate code using this method would be:

<?php

$keys = array_keys($arr);
shuffle($keys);

foreach ($keys as $key) {

  $arr_elem = $arr[$key];
  // do what you want with the array element

}

?>
bill at SWScripts dot com 22-Sep-2005 09:45
Just a quick note to let people know that shuffle() will work on multidimensional associative arrays provided that the first key is already numeric.

So this array can be shuffled without losing any of the secondary keys or their values:

$array[0]['color'], $array[0]['size'], $array[0]['fabric']
. . .
$array[50]['color'], $array[50]['size'], $array[50]['fabric']

I recently ran up against needing to randomize this array and tried shuffle even though it's not really for associative arrays.

Hope it helps somebody out there.


Alias de count

  • « shuffle
  • sort »
  • PHP Manual
  • Fonctions sur les tableaux
  • Alias de count

sizeof

(PHP 4, PHP 5, PHP 7, PHP 8)

sizeof — Alias de count()

Description

Cette fonction est un alias de : count().

User Contributed Notes

chris at amis dot nl 02-Sep-2013 09:15
I would recommend not using sizeof(). Many programmers expect sizeof() to return the amount of memory allocated. Instead sizeof() -as described above- is an alias for count().

Prevent misinterpretation and use count() instead.
umopdn [at] msn [dawt] com 23-Sep-2008 02:38
a) Always try and use PHP's internal routines to iterate through objects of various types (arrays in most examples below).

Instead of interpreting your code to loop through them, they use their own internal routines which are much faster.

(This is why foreach () will run faster than manual interation)

b) It is _always_ good practice to leave as many static resulting functions outside of loops, having operations that return the exact same piece of data every iteration of the loop is not pretty on resources.

c) I agree with PixEye's remarks on sizeof().  In PHP it is just an alias for the true function count().  It has other meanings logically in other languages rather than the number of elements in an object.  This should be avoided as it may confuse developers transitioning to PHP from other languages.
PixEye 23-Sep-2008 09:09
I am quite surprised about previous posts. Here are my advices:

1/ prefer the count() function instead of sizeOf() as sizeOf() is only an alias of count() and does not mean the same in many other languages based on C (avoid ambiguity).

2/ prefer the powerful forEach() function to iterate over arrays.
communiti.ch 10-Apr-2008 06:55
If your array is "huge"

It is reccomended to set a variable first for this case:

THIS->

$max = sizeof($huge_array);
for($i = 0; $i < $max;$i++)
{
code...
}

IS QUICKER THEN->

for($i = 0; $i < sizeof($huge_array);$i++)
{
code...
}


Trie un tableau

  • « sizeof
  • uasort »
  • PHP Manual
  • Fonctions sur les tableaux
  • Trie un tableau

sort

(PHP 4, PHP 5, PHP 7, PHP 8)

sort — Trie un tableau

Description

sort ( array &$array , int $flags = SORT_REGULAR ) : bool

Cette fonction trie le tableau array. Les éléments seront triés du plus petit au plus grand.

Note:

Si deux membres se comparent comme égaux, leur ordre relatif dans le tableau trié n'est pas défini.

Liste de paramètres

array

Le tableau d'entrée.

flags

Le deuxième paramètre optionnel flags peut être utilisé pour modifier le comportement de tri en utilisant ces valeurs :

Type de drapeaux de tri :

  • SORT_REGULAR - compare items normally; the details are described in the comparison operators section
  • SORT_NUMERIC - compare les éléments numériquement
  • SORT_STRING - compare les éléments comme des chaînes de caractères
  • SORT_LOCALE_STRING - compare les éléments comme des chaînes de caractères, basé sur la locale courante. Ceci utilise la locale, qui peut être changée en utilisant setlocale()
  • SORT_NATURAL - compare les éléments comme des chaînes de caractères utilisant "l'ordre naturel" comme natsort()
  • SORT_FLAG_CASE - peut être combiné (OU bit à bit) avec SORT_STRING ou SORT_NATURAL pour trier les chaînes sans tenir compte de la casse

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec sort()

<?php

$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);
foreach ($fruits as $key => $val) {
    echo "fruits[" . $key . "] = " . $val . "\n";
}

?>

L'exemple ci-dessus va afficher :

fruits[0] = apple
fruits[1] = banana
fruits[2] = lemon
fruits[3] = orange

Les fruits ont été classés dans l'ordre alphabétique.

Exemple #2 Exemple avec sort() en utilisant l'ordre naturel sans tenir compte de la casse

<?php

$fruits = array(
    "Orange1", "orange2", "Orange3", "orange20"
);
sort($fruits, SORT_NATURAL | SORT_FLAG_CASE);
foreach ($fruits as $key => $val) {
    echo "fruits[" . $key . "] = " . $val . "\n";
}

?>

L'exemple ci-dessus va afficher :

fruits[0] = Orange1
fruits[1] = orange2
fruits[2] = Orange3
fruits[3] = orange20

Les fruits ont été classés comme ils l'auraient été avec la fonction natcasesort().

Notes

Note: Cette fonction assigne de nouvelles clés aux éléments dans array. Elle effacera toutes les clés existantes qui ont pu être assignées, plutôt que de réarranger les clés.

Note: Comme la plupart des fonctions de tri de PHP, sort() utilise une implémentation de » Quicksort. Le pivot est choisie au milieu de la partition, résultant ainsi en une optimisation du temps pour les tableaux déjà triés. Mais ceci ne reste qu'un détail de l'implémentation, n'ayant aucun impact pour vous.

Avertissement

Porter attention lors du tri des tableaux avec des valeurs de types différents car sort() peut produire des résultats imprévisible quand flags est SORT_REGULAR.

Voir aussi

  • asort() - Trie un tableau et conserve l'association des index
  • rsort() - Trie un tableau en ordre inverse
  • Les fonctions de tri des tableaux

User Contributed Notes

aminkhoshzahmat at gmail dot com 01-Jun-2020 07:02
Let's say we have a list of names, and it is not sorted.

<?php

$names = array('Amin', 'amir', 'sarah', 'Somayeh', 'armita', 'Armin');

sort($names); // simple alphabetical sort
print_r($names);
?>
Result is :
Array
(
    [0] => Amin
    [1] => Armin
    [2] => Somayeh // actually it's not sort alphabetically from here!
    [3] => amir         // comparison is based on ASCII values.
    [4] => armita
    [5] => sarah
)

If you want to sort alphabeticaly no matter it is upper or lower case:

<?php

sort($names, SORT_STRING | SORT_FLAG_CASE);
print_r($names);
?>

Result is:
Array
(
    [0] => Amin
    [1] => amir
    [2] => Armin
    [3] => armita
    [4] => sarah
    [5] => Somayeh
)
Md. Abutaleb 25-Feb-2020 12:28
<?php
/*
As I found the sort() function normally works as ascending order based on the following priority :
1. NULL
2. Empty
3. Boolean FALSE
4. String
5. Float
6. Int
7. Array
8. Object

Consider the following array:
*/

$a = ['fruit'=> 'apple', 'A' => 10, 20, 5, 2.5, 5=>'A new value', 'last' => 'value', TRUE, NULL, "", FALSE, array(), new StdClass];
sort($a);
var_dump($a);

#The output is:

array(13) {
  [0]=>NULL
  [1]=> string(0) ""
  [2]=>bool(false)
  [3]=>string(11) "A new value"
  [4]=>string(5) "apple"
  [5]=>string(5) "value"
  [6]=> float(2.5)
  [7]=> int(5)
  [8]=>int(10)
  [9]=>int(20)
  [10]=>array(0) { }
  [11]=> bool(true)
  [12]=>object(stdClass)#1 (0) {}
}

//Hope it will remove your confusion when you're sorting an array with mix type data.
?>
r at rcse dot de 23-Dec-2018 10:15
Here is no word about sorting UTF-8 strings by any collation. This should not be so uncommon?
Abhishek Banerjee 08-Jun-2016 07:39
EDIT: To the original note by "phpdotnet at m4tt dot co dot uk"
Use array_push instead of $new_array[$k] for some reason it was
giving me string indexes.

Simple function to sort an array by a specific key. Maintains index association.

<?php

function array_sort($array, $on, $order=SORT_ASC)
{
    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
            break;
            case SORT_DESC:
                arsort($sortable_array);
            break;
        }

        foreach ($sortable_array as $k => $v) {
            array_push($new_array, $array[$k]);
        }
    }

    return $new_array;
}

$people = array(
    12345 => array(
        'id' => 12345,
        'first_name' => 'Joe',
        'surname' => 'Bloggs',
        'age' => 23,
        'sex' => 'm'
    ),
    12346 => array(
        'id' => 12346,
        'first_name' => 'Adam',
        'surname' => 'Smith',
        'age' => 18,
        'sex' => 'm'
    ),
    12347 => array(
        'id' => 12347,
        'first_name' => 'Amy',
        'surname' => 'Jones',
        'age' => 21,
        'sex' => 'f'
    )
);

print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname

/*
Array
(
    [12345] => Array
        (
            [id] => 12345
            [first_name] => Joe
            [surname] => Bloggs
            [age] => 23
            [sex] => m
        )

    [12347] => Array
        (
            [id] => 12347
            [first_name] => Amy
            [surname] => Jones
            [age] => 21
            [sex] => f
        )

    [12346] => Array
        (
            [id] => 12346
            [first_name] => Adam
            [surname] => Smith
            [age] => 18
            [sex] => m
        )

)
Array
(
    [12345] => Array
        (
            [id] => 12345
            [first_name] => Joe
            [surname] => Bloggs
            [age] => 23
            [sex] => m
        )

    [12347] => Array
        (
            [id] => 12347
            [first_name] => Amy
            [surname] => Jones
            [age] => 21
            [sex] => f
        )

    [12346] => Array
        (
            [id] => 12346
            [first_name] => Adam
            [surname] => Smith
            [age] => 18
            [sex] => m
        )

)
*/

?>
aditycse at gmail dot com 07-Aug-2015 10:34
/*
 * Name : Aditya Mehrotra
 * Email: aditycse@gmail.com
 */
//Example for sorting by values for an alphanumeric array also having case-sensitive data
$exampleArray1 = $exampleArray2 = array(
    0 => 'example1',
    1 => 'Example10',
    2 => 'example12',
    3 => 'Example2',
    4 => 'example3',
    5 => 'EXAMPLE10',
    6 => 'example10'
);

//default sorting
asort($exampleArray1);

// alphanumeric with case-sensitive data sorting by values
asort($exampleArray2, SORT_STRING | SORT_FLAG_CASE | SORT_NATURAL);

//output of defaut sorting
print_r($exampleArray1);
/*
 * output of default sorting
  Array
  (
  [5] => EXAMPLE10
  [1] => Example10
  [3] => Example2
  [0] => example1
  [6] => example10
  [2] => example12
  [4] => example3
  )
 */

print_r($exampleArray2);
/*
 * output of alphanumeric with case-sensitive data sorting by values
 Array
(
    [0] => example1
    [3] => Example2
    [4] => example3
    [5] => EXAMPLE10
    [1] => Example10
    [6] => example10
    [2] => example12
)
 */
williamprogphp at[pleaseNOTSPAM] yahoo d 20-Dec-2013 12:15
In order to make some multidimensional quick sort implementation, take advantage of this stuff

<?php
        function quickSortMultiDimensional($array, $chave) {
            if( count( $array ) < 2 ) {
                return $array;
            }
            $left = $right = array( );
            reset( $array );
            $pivot_key    = key( $array );
            $pivot    = array_shift( $array );
            foreach( $array as $k => $v ) {
                if( $v[$chave] < $pivot[$chave] )
                        $left[$k][$chave] = $v[$chave];
                else
                        $right[$k][$chave] = $v[$chave];
            }
            return array_merge(
                                    quickSortMultiDimensional($left, $chave),
                                    array($pivot_key => $pivot),
                                    quickSortMultiDimensional($right, $chave)
            );
        }
?>

I make it using the idea from pageconfig dot com

tks for viewing
me[ at ]szczepan[ dot ]info 27-Dec-2012 12:36
Sorting the keys, but keep the values in order is not possible by just ordering, because it would result in a new array. This is also the solution: Create a new array

<?php
$a = array(9=>"a",8=>"c",5=>"d");

$keys = array_keys($a);
sort($keys);
$result = array_combine($keys, array_values($a));

//Result : array(5=>"a",8=>"c",9=>"d");
?>
Walter Tross 16-Dec-2011 02:38
unless you specify the second argument, "regular" comparisons will be used. I quote from the page on comparison operators:
"If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically."
What this means is that "10" < "1a", and "1a" < "2", but "10" > "2". In other words, regular PHP string comparisons are not transitive.
This implies that the output of sort() can in rare cases depend on the order of the input array:
<?php
function echo_sorted($a)
{
   echo "{$a[0]} {$a[1]} {$a[2]}";
   sort($a);
   echo " => {$a[0]} {$a[1]} {$a[2]}\n";
}
// on PHP 5.2.6:
echo_sorted(array( "10", "1a", "2")); // => 10 1a 2
echo_sorted(array( "10", "2", "1a")); // => 1a 2 10
echo_sorted(array( "1a", "10", "2")); // => 2 10 1a
echo_sorted(array( "1a", "2", "10")); // => 1a 2 10
echo_sorted(array( "2", "10", "1a")); // => 2 10 1a
echo_sorted(array( "2", "1a", "10")); // => 10 1a 2
?>
ajanata at gmail dot com 20-Oct-2011 09:13
This took me longer than it should have to figure out, but if you want the behavior of sort($array, SORT_STRING) (that is, re-indexing the array unlike natcasesort) in a case-insensitive manner, it is a simple matter of doing usort($array, strcasecmp).
alex dot hristov dot 88 at gmail dot com 16-Jun-2011 07:26
As some people have mentioned before sorting a multidimentional array can be a bit tricky. it took me quite a while to get it going but it works as a charm:

<?php
//$order has to be either asc or desc
 function sortmulti ($array, $index, $order, $natsort=FALSE, $case_sensitive=FALSE) {
        if(is_array($array) && count($array)>0) {
            foreach(array_keys($array) as $key)
            $temp[$key]=$array[$key][$index];
            if(!$natsort) {
                if ($order=='asc')
                    asort($temp);
                else
                    arsort($temp);
            }
            else
            {
                if ($case_sensitive===true)
                    natsort($temp);
                else
                    natcasesort($temp);
            if($order!='asc')
                $temp=array_reverse($temp,TRUE);
            }
            foreach(array_keys($temp) as $key)
                if (is_numeric($key))
                    $sorted[]=$array[$key];
                else
                    $sorted[$key]=$array[$key];
            return $sorted;
        }
    return $sorted;
}
?>
cmarshall at gmx dot de 17-May-2011 03:10
I read up on various problems re: sort() and German Umlaut chars and my head was soon spinning - bug in sort() or not, solution via locale or not, etc. ... (a total newbie here).

The obvious solution for me was quick and dirty: transform the Umlaut chars (present as HTML codes in my case) to their normal equivalent ('ä' = 'ae', 'ö' = 'oe', 'ü' = 'ue', 'ß' = 'ss' etc.), sort the array, then transform back. However there are cases in which a 'Mueller' is really that and does NOT need to be transformed into 'Müller' afterwards. Hence I for example replace the Umlaut itself with it's normal equivalent plus a char not used in the string otherwise (e.g. '_') so that the transfer back to Umlaut would only take place on certain combinations.

Of course any other char instead of '_' can be used as additional char (influencing the sort result). I know that my solution is rough at the edges and may cause other sort problems but it was sufficient for my purpose.

The array '$dat' in this example was filled with German town names (I actually worked with a multiple array ('$dat[][]') but stripped the code down to this as it's easier to understand):

<?php
// START Pre-sorting (Umlaut -> normal letters)
$max = count($dat);
for($totcnt = 0; $totcnt < $max; $totcnt++){
   $dat[$totcnt]=str_replace('&szlig;','ss_',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('&Auml;','Ae_',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('&auml;','ae_',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('&Ouml;','Oe_',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('&ouml;','oe_',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('&Uuml;','Ue_',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('&uuml;','ue_',$dat[$totcnt]);
}
// END Pre-sorting (Umlaut -> normal letters)

// START Sorting //
function compare_towns($a, $b)
{
return strnatcmp($a, $b);
}
usort($dat, 'compare_towns');
// END Sorting //

// START Post-sorting (normal letters -> Umlaut)
for($totcnt = 0; $totcnt < $max; $totcnt++){
   $dat[$totcnt]=str_replace('ss_','&szlig;',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('Ae_','&Auml;',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('ae_','&auml;',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('Oe_','&Ouml;',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('oe_','&ouml;',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('Ue_','&Uuml;',$dat[$totcnt]);
   $dat[$totcnt]=str_replace('ue_','&uuml;',$dat[$totcnt]);
}
// END Post-sorting (normal letters -> Umlaut)
?>
anaz114119 at gmail dot com 24-Dec-2010 02:34
sort from textfile by coloumn
example name||date||time||comments
if you want to sort by date
$column = 2
<?php
function array_sort($array,$column){
 $column = $column-1;
 foreach($array as $line){
 $bits = explode("||",$line);
 $bits ="$bits[$column]**$line";
 $array1[]=$bits;
}
 asort($array1);
 foreach($array1 as $line){
 $bit = explode("**",$line);
 $bit ="$bit[1]";
 $array2[]=$bit;
}
 return$array2;
}
?>
poulou_0 at hotmail dot com 21-Dec-2010 12:59
if you are not interested in high or low case sort

<?php
//where
$sortable_array[$k] = $v2;
//put
$sortable_array[$k] = strtolower($v2);

//and where
$sortable_array[$k] = $v;
//put
$sortable_array[$k] = strtolower($v);
?>
phpdotnet at m4tt dot co dot uk 16-Aug-2010 07:03
Simple function to sort an array by a specific key. Maintains index association.

<?php

function array_sort($array, $on, $order=SORT_ASC)
{
    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
            break;
            case SORT_DESC:
                arsort($sortable_array);
            break;
        }

        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }

    return $new_array;
}

$people = array(
    12345 => array(
        'id' => 12345,
        'first_name' => 'Joe',
        'surname' => 'Bloggs',
        'age' => 23,
        'sex' => 'm'
    ),
    12346 => array(
        'id' => 12346,
        'first_name' => 'Adam',
        'surname' => 'Smith',
        'age' => 18,
        'sex' => 'm'
    ),
    12347 => array(
        'id' => 12347,
        'first_name' => 'Amy',
        'surname' => 'Jones',
        'age' => 21,
        'sex' => 'f'
    )
);

print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname

/*
Array
(
    [12345] => Array
        (
            [id] => 12345
            [first_name] => Joe
            [surname] => Bloggs
            [age] => 23
            [sex] => m
        )

    [12347] => Array
        (
            [id] => 12347
            [first_name] => Amy
            [surname] => Jones
            [age] => 21
            [sex] => f
        )

    [12346] => Array
        (
            [id] => 12346
            [first_name] => Adam
            [surname] => Smith
            [age] => 18
            [sex] => m
        )

)
Array
(
    [12345] => Array
        (
            [id] => 12345
            [first_name] => Joe
            [surname] => Bloggs
            [age] => 23
            [sex] => m
        )

    [12347] => Array
        (
            [id] => 12347
            [first_name] => Amy
            [surname] => Jones
            [age] => 21
            [sex] => f
        )

    [12346] => Array
        (
            [id] => 12346
            [first_name] => Adam
            [surname] => Smith
            [age] => 18
            [sex] => m
        )

)
*/

?>
eriewave at hotmail dot com 29-Mar-2010 01:16
If you need to sort an array containing some equivalent values and you want the equivalents to end up next to each other in the overall order (similar to a MySQL's ORDER BY output), rather than breaking the function, do this:

<?php

sort($array, ksort($array))

?>

-When the sort() function finds two equivalents, it will sort them arbitrarily by their key #'s as a second parameter.

-Dirk
Brecht Cloetens 23-Nov-2009 03:57
<?php

/**
 * function: array_columns
 * author: Brecht Cloetens
 * params: $a = array() // original array
 *         $c = int() // number of columns
 */
function array_columns(&$a, $c=2)
{
    $m = ceil(count($a)/$c);
    $j = 0;
    for($i=0; $i<$m; $i++) {
        for($k=0; $k<$c; $k++) {
            $key = $i+($m*$k);
            settype($key,'integer');
            if(array_key_exists($key,$a)) {
                $b[$j] = $a[$key];
                $j++;
            }
        }
    }
    $a = $b;
}

$arr = range('a','z');
array_columns($arr,4);
print_r($arr);

?>

Example:
array(1,2,3,4,5) will be converted to array(1,4,2,5,3);

This can be easy if you want to display an array into a specified number of columns.

<table>
    <tr>
        <td>$arr[0] => 1</td>
        <td>$arr[1] => 4</td>
    </tr>
    <tr>
        <td>$arr[2] => 2</td>
        <td>$arr[3] => 5</td>
    </tr>
    <tr>
        <td>$arr[4] => 3</td>
        <td></td>
    </tr>
</table>
petr dot biza at gmail dot com 11-Sep-2009 06:29
Here is a function to sort an array by the key of his sub-array with keep key in top level.

<?php
function sksort(&$array, $subkey="id", $sort_descending=false, $keep_keys_in_sub = false) {
    $temp_array = $array;

    foreach ($temp_array as $key => &$value) {

      $sort = array();
      foreach ($value as $index => $val) {
          $sort[$index] = $val[$subkey];
      }

      asort($sort);

      $keys = array_keys($sort);
      $newValue = array();
      foreach ($keys as $index) {
        if($keep_keys_in_sub)
            $newValue[$index] = $value[$index];
          else
            $newValue[] = $value[$index];
      }

      if($sort_descending)
        $value = array_reverse($newValue, $keep_keys_in_sub);
      else
        $value = $newValue;
    }

    $array = $temp_array;
  }
?>
danm68 at gmail dot com 25-Aug-2009 09:59
sort() used with strings doesn't sort just alphabetically. It sorts all upper-case strings alphabetically first and then sorts lower-case strings alphabetically second.
Just in case anyone was as confused as I was and I've never seen this mentioned anywhere.
stepmuel at ee dot ethz dot ch 09-Dec-2008 08:14
A little shorter way to sort an array of objects; with a callback function.

<?php
function objSort(&$objArray,$indexFunction,$sort_flags=0) {
    $indices = array();
    foreach($objArray as $obj) {
        $indeces[] = $indexFunction($obj);
    }
    return array_multisort($indeces,$objArray,$sort_flags);
}

function getIndex($obj) {
    return $obj->getPosition();
}

objSort($objArray,'getIndex');
?>
www at designdetector dot com 09-Sep-2008 07:43
To sort an array of multiple text fields alphabetically you have to make the text lowercase before sorting the array. Otherwise PHP puts acronyms before words. You can see this in my example code. Simply store the original text field at the end of the array line and call it later from there. You can safely ignore the lowercase version which is added to the start of the array line.

<?php
echo '<pre>ORIGINAL DATA:
<br />';

$data = array(
'Saturn|7|8|9|0||',
'Hello|0|1|2|3||',
'SFX|5|3|2|4||',
'HP|9|0|5|6||'
);

print_r($data);

sort($data);
reset($data);

echo '<br />RAW SORT:
<br />';

print_r($data);

for ($c = 0; $c < count($data); $c++) {
    list ($letter,$g1,$g2,$g3,$g4,$end) = explode ('|', $data[$c]);
    $lowercase = strtolower($letter);
    $data2[$c] = array($lowercase,$g1,$g2,$g3,$g4,$letter);
}

sort($data2);
reset($data2);

echo '<br />LOWERCASE SORT:
<br />';

print_r($data2);

echo '</pre>';
?>
matpatnik at hotmail dot com 23-Jan-2008 03:46
This function will sort entity letters eg:&eacute;

I hope that help someone

function sort_entity($array) {
    $total = count($array);
    for ($i=0;$i<$total;$i++) {
        if ($array[$i]{0} == '&') {
            $array[$i] = $array[$i]{1}.$array[$i];
        } else {
            $array[$i] = $array[$i]{0}.$array[$i];
        }
    }
    sort($array);

    for ($i=0;$i<$total;$i++) {
        $array[$i] = substr($array[$i],1);
    }

    return $array;
}
sinan at sinaneldem dot com 23-Jun-2007 08:29
here is little script which will merge arrays, remove duplicates and sort it by alphabetical order:

<?php

$array1 = array('apple', 'banana','pear');
$array2 = array('grape', 'pear','orange');

function array_unique_merge_sort($array1, $array2){
$array = array_unique(array_merge($array1, $array2));
sort($array);
foreach ($array as $key => $value) {
    $new[$key] = $value;
}
return $new;
}

print_r (array_unique_merge_sort($array1, $array2));

?>

this will print out:

Array ( [0] => apple [1] => banana [2] => grape [3] => orange [4] => pear )
alishahnovin at hotmail dot com 25-May-2007 04:11
I had a multidimensional array, which needed to be sorted by one of the keys. This is what I came up with...

<?php
function msort($array, $id="id") {
        $temp_array = array();
        while(count($array)>0) {
            $lowest_id = 0;
            $index=0;
            foreach ($array as $item) {
                if ($item[$id]<$array[$lowest_id][$id]) {
                    $lowest_id = $index;
                }
                $index++;
            }
            $temp_array[] = $array[$lowest_id];
            $array = array_merge(array_slice($array, 0,$lowest_id), array_slice($array, $lowest_id+1));
        }
        return $temp_array;
    }
?>

Ex:

<?php

//oh no, this is not in the ordered by id!!
$data[] = array("item"=>"item 4", "id"=>4);
$data[] = array("item"=>"item 1", "id"=>1);
$data[] = array("item"=>"item 3", "id"=>3);
$data[] = array("item"=>"item 2", "id"=>2);

var_dump(  msort($data)  ); //just msort it!

/* outputs

array
  0 =>
    array
      'item' => 'item 1' (length=6)
      'id' => 1
  1 =>
    array
      'item' => 'item 2' (length=6)
      'id' => 2
  2 =>
    array
      'item' => 'item 3' (length=6)
      'id' => 3
  3 =>
    array
      'item' => 'item 4' (length=6)
      'id' => 4

*/

?>
joris at mangrove dot nl 01-Feb-2007 05:40
Commenting on note http://www.php.net/manual/en/function.sort.php#62311 :

Sorting an array of objects will not always yield the results you desire.

As pointed out correctly in the note above, sort() sorts the array by value of the first member variable. However, you can not always assume the order of your member variables! You must take into account your class hierarchy!

By default, PHP places the inherited member variables on top, meaning your first member variable is NOT the first variable in your class definition!
However, if you use code analyzers or a compile cache, things can be very different. E.g., in eAccelerator, the inherited member variables are at the end, meaning you get different sort results with caching on or off.

Conclusion:
Never use sort on arrays with values of a type other than scalar or array.
alex [at] vkpb [dot] com 26-Jan-2007 03:36
Sorting of an array by a method of inserts.

<?

       function sortByField($multArray,$sortField,$desc=true){
            $tmpKey='';
            $ResArray=array();

            $maIndex=array_keys($multArray);
            $maSize=count($multArray)-1;

            for($i=0; $i < $maSize ; $i++) {

               $minElement=$i;
               $tempMin=$multArray[$maIndex[$i]][$sortField];
               $tmpKey=$maIndex[$i];

                for($j=$i+1; $j <= $maSize; $j++)
                  if($multArray[$maIndex[$j]][$sortField] < $tempMin ) {
                     $minElement=$j;
                     $tmpKey=$maIndex[$j];
                     $tempMin=$multArray[$maIndex[$j]][$sortField];

                  }
                  $maIndex[$minElement]=$maIndex[$i];
                  $maIndex[$i]=$tmpKey;
            }

           if($desc)
               for($j=0;$j<=$maSize;$j++)
                  $ResArray[$maIndex[$j]]=$multArray[$maIndex[$j]];
           else
              for($j=$maSize;$j>=0;$j--)
                  $ResArray[$maIndex[$j]]=$multArray[$maIndex[$j]];

           return $ResArray;
       }

// make array
$array['aaa']=array("name"=>"vasia","order"=>1);
$array['bbb']=array("name"=>"petia","order"=>2);
$array['ccc']=array("name"=>"kolia","order"=>3);
$array['ddd']=array("name"=>"zenia","order"=>4);

// set sort
$SortOrder=0; // desc by default , 1- asc

var_dump(sortByField($array,'order',$SortOrder));

array
  'ddd' =>
    array
      'name' => 'zenia' (length=5)
      'order' => 4
  'aaa' =>
    array
      'name' => 'vasia' (length=5)
      'order' => 1
  'bbb' =>
    array
      'name' => 'petia' (length=5)
      'order' => 2
  'ccc' =>
    array
      'name' => 'kolia' (length=5)
      'order' => 3

?>
g8z at yahoo dot com 14-Jul-2006 04:28
<?php
/**
This sort function allows you to sort an associative array while "sticking" some fields.

$sticky_fields = an array of fields that should not be re-sorted. This is a method of achieving sub-sorts within contiguous groups of records that have common data in some fields.

For example:

$a = array();

$a []= array(
    'name'         => 'Sam',
    'age'         => 23,
    'hire_date'    => '2004-01-01'
);
$a []= array(
    'name'        => 'Sam',
    'age'        => 44,
    'hire_date'    => '2003-03-23'
);
$a []= array(
    'name'        => 'Jenny',
    'age'        => 20,
    'hire_date' => '2000-12-31'
);
$a []= array(
    'name'        => 'Samantha',
    'age'        => 50,
    'hire_date' => '2000-12-14'
);

$sticky_fields = array( 'name' );
print_r( stickysort( $a, 'age', DESC_NUM, $sticky_fields ) );

OUTPUT:

Array
(
    [0] => Array
        (
            [name] => Sam
            [age] => 44
            [hire_date] => 2003-03-23
        )
    [1] => Array
        (
            [name] => Sam
            [age] => 23
            [hire_date] => 2004-01-01
        )
    [2] => Array
        (
            [name] => Jenny
            [age] => 20
            [hire_date] => 2000-12-31
        )
    [3] => Array
        (
            [name] => Samantha
            [age] => 50
            [hire_date] => 2000-12-14
        )
)

Here's why this is the correct output - the "name" field is sticky, so it cannot change its sort order. Thus, the "age" field is only sorted as a sub-sort within records where "name" is identical. Thus, the "Sam" records are reversed, because 44 > 23, but Samantha remains at the bottom, even though her age is 50. This is a way of achieving "sub-sorts" and "sub-sub-sorts" (and so on) within records of identical data for specific fields.

Courtesy of the $5 Script Archive: http://www.tufat.com
**/

define( 'ASC_AZ', 1000 );
define( 'DESC_AZ', 1001 );
define( 'ASC_NUM', 1002 );
define( 'DESC_NUM', 1003 );

function stickysort( $arr, $field, $sort_type, $sticky_fields = array() ) {
    $i = 0;
    foreach ($arr as $value) {
        $is_contiguous = true;
        if(!empty($grouped_arr)) {
            $last_value = end($grouped_arr[$i]);

            if(!($sticky_fields == array())) {
                foreach ($sticky_fields as $sticky_field) {
                    if ($value[$sticky_field] <> $last_value[$sticky_field]) {
                        $is_contiguous = false;
                        break;
                    }
                }
            }
        }
        if ($is_contiguous)
            $grouped_arr[$i][] = $value;
        else
            $grouped_arr[++$i][] = $value;
    }
    $code = '';
    switch($sort_type) {
        case ASC_AZ:
            $code .= 'return strcasecmp($a["'.$field.'"], $b["'.$field.'"]);';
            break;
        case DESC_AZ:
            $code .= 'return (-1*strcasecmp($a["'.$field.'"], $b["'.$field.'"]));';
            break;
        case ASC_NUM:
            $code .= 'return ($a["'.$field.'"] - $b["'.$field.'"]);';
            break;
        case DESC_NUM:
            $code .= 'return ($b["'.$field.'"] - $a["'.$field.'"]);';
            break;
    }

    $compare = create_function('$a, $b', $code);

    foreach($grouped_arr as $grouped_arr_key=>$grouped_arr_value)
        usort ( $grouped_arr[$grouped_arr_key], $compare );

    $arr = array();
    foreach($grouped_arr as $grouped_arr_key=>$grouped_arr_value)
        foreach($grouped_arr[$grouped_arr_key] as $grouped_arr_arr_key=>$grouped_arr_arr_value)
            $arr[] = $grouped_arr[$grouped_arr_key][$grouped_arr_arr_key];

    return $arr;
}
?>
g8z at yahoo dot com 10-Jul-2006 08:58
<?php
/**
This sort function allows you to sort an associative array while "sticking" some fields.

$sticky_fields = an array of fields that should not be re-sorted. This is a method of achieving sub-sorts within contiguous groups of records that have common data in some fields.

Courtesy of the $5 Script Archive: http://www.tufat.com
**/

define( 'ASC_AZ', 1000 );
define( 'DESC_AZ', 1001 );
define( 'ASC_NUM', 1002 );
define( 'DESC_NUM', 1003 );

function stickysort( $arr, $field, $sort_type, $sticky_fields = array() ) {
    $i = 0;
    foreach ($arr as $value) {
        $is_contiguous = true;
        if(!empty($grouped_arr)) {
            $last_value = end($grouped_arr[$i]);

            if(!($sticky_fields == array())) {
                foreach ($sticky_fields as $sticky_field) {
                    if ($value[$sticky_field] <> $last_value[$sticky_field]) {
                        $is_contiguous = false;
                        break;
                    }
                }
            }
        }
        if ($is_contiguous)
            $grouped_arr[$i][] = $value;
        else
            $grouped_arr[++$i][] = $value;
    }
    $code = '';
    switch($sort_type) {
        case ASC_AZ:
            $code .= 'return strcasecmp($a["'.$field.'"], $b["'.$field.'"]);';
            break;
        case DESC_AZ:
            $code .= 'return (-1*strcasecmp($a["'.$field.'"], $b["'.$field.'"]));';
            break;
        case ASC_NUM:
            $code .= 'return ($a["'.$field.'"] - $b["'.$field.'"]);';
            break;
        case DESC_NUM:
            $code .= 'return ($b["'.$field.'"] - $a["'.$field.'"]);';
            break;
    }

    $compare = create_function('$a, $b', $code);

    foreach($grouped_arr as $grouped_arr_key=>$grouped_arr_value)
        usort ( $grouped_arr[$grouped_arr_key], $compare );

    $arr = array();
    foreach($grouped_arr as $grouped_arr_key=>$grouped_arr_value)
        foreach($grouped_arr[$grouped_arr_key] as $grouped_arr_arr_key=>$grouped_arr_arr_value)
            $arr[] = $grouped_arr[$grouped_arr_key][$grouped_arr_arr_key];

    return $arr;
}
?>
Emiliyan at ServicesBG dot Com 28-Mar-2006 07:41
#This is a function that will sort an array...
function sort_by($array,  $keyname = null, $sortby) {
   $myarray = $inarray = array();
   # First store the keyvalues in a seperate array
    foreach ($array as $i => $befree) {
        $myarray[$i] = $array[$i][$keyname];
    }
   # Sort the new array by
    switch ($sortby) {
    case 'asc':
    # Sort an array and maintain index association...
    asort($myarray);
    break;
    case 'arsort':
    # Sort an array in reverse order and maintain index association
    arsort($myarray);
    break;
    case 'natcasesor':
    # Sort an array using a case insensitive "natural order" algorithm
    natcasesort($myarray);
    break;
    }
    # Rebuild the old array
    foreach ( $myarray as $key=> $befree) {
       $inarray[$key] = $array[$key];
    }
    return $inarray;
}
sort_by(); example...
$info = sort_by($myarray, 'name', $use = 'asc');
print_r($info);
jesper at snt dot utwente dot nl 24-Feb-2006 01:26
If you sort an array of objects, the first variable in the object will be used for sorting:

<?php
class foo
{
  var $value; //First variable: Used for sorting
  var $id;

  function foo($i, $v)
  {
     $this->id = $i;
     $this->value = $v;
  }

}

for ($i = 0; $i < 10; $i++)
{
  $bar[] = new foo($i,rand(1,10));
}

// This will sort on value
sort($bar);
print_r($bar);
?>

Compare the piece of code above with the following:

<?php
class foo
{
  var $id; //First variable: Used for sorting
  var $value;

  function foo($i, $v)
  {
     $this->id = $i;
     $this->value = $v;
  }

}

for ($i = 0; $i = 10; $i++)
{
  $bar[] = new foo($i,rand(1,10));
}

// This will sort on id
sort($bar);
print_r($bar);
?>

As you can see the location of declaration of the variables matter!
If you want to sort on both or on a combination of variables, use ksort()
nm at thenoodleman dot com 30-Jan-2006 05:18
Faster, more effective function:

array_sort (array, ['asc'/'desc'])

Second parameter specifies whether to order ascending or descending. Default is ascending.

function array_sort($array, $type='asc'){
    $result=array();
    foreach($array as $var => $val){
        $set=false;
        foreach($result as $var2 => $val2){
            if($set==false){
                if($val>$val2 && $type=='desc' || $val<$val2 && $type=='asc'){
                    $temp=array();
                    foreach($result as $var3 => $val3){
                        if($var3==$var2) $set=true;
                        if($set){
                            $temp[$var3]=$val3;
                            unset($result[$var3]);
                        }
                    }
                    $result[$var]=$val;
                    foreach($temp as $var3 => $val3){
                        $result[$var3]=$val3;
                    }
                }
            }
        }
        if(!$set){
            $result[$var]=$val;
        }
    }
    return $result;
}

Works for ordering by integers or strings, no need to specify which.

Example:

$array=array('a' => 50, 'b' => 25, 'c' => 75);
print_r(array_sort($array));

Returns:
Array
(
[b] => 25
[a] => 50
[c] => 75
)
raul at jimi dot com dot mx 01-Dec-2005 09:50
I had an array like this:
$arr=array (1,4,3,6,5);

which returns this:
$arr[0]=1
$arr[1]=4
$arr[2]=3
$arr[3]=6
$arr[4]=5

But lets say i remove [2] which is number 3, i get:

$arr[0]=1
$arr[1]=4
$arr[3]=6
$arr[4]=5

And i want to reindex without doing a sort because i dont want to lose the order of the numbers (like a pop in a stack but in the middle of the list), i do this:

$arr=array_chunk($arr,count($arr));
$arr=$arr[0];

the result is:

$arr[0]=1
$arr[1]=4
$arr[2]=6
$arr[3]=5

This can be applied mostly for tree sorting, when you only have the id and the parent values of the node, and you want to have N levels.
james at miicro dot net 19-Jul-2005 02:49
It's useful to know that if you're using this function on a multidimensional array, php will sort the first key, then the second and so on. This is similar to being able to use SQL to order by field1, field2 etc.

So:

Array (
[0] => Array ( [category] => work [name] => Smith )
[1] => Array ( [category] => play [name] => Johnson )
[2] => Array ( [category] => work [name] => Berger )
)

will become:

Array (
[0] => Array ( [category] => play [name] => Johnson )
[1] => Array ( [category] => work [name] => Berger )
[2] => Array ( [category] => work [name] => Smith )
)

Hope it helps someone.
timc at hlyw dot com 17-Feb-2005 04:04
I dig the multi_sort function(s) from above.  But, they don't work for hash arrays.  I added a keys variable to keep track of the key value as the array gets sorted.  Feed back welcome.

<?php
function array_qsort (&$array, $column=0, $order=SORT_ASC, $first=0, $last= -2)
{
  // $array  - the array to be sorted
  // $column - index (column) on which to sort
  //          can be a string if using an associative array
  // $order  - SORT_ASC (default) for ascending or SORT_DESC for descending
  // $first  - start index (row) for partial array sort
  // $last  - stop  index (row) for partial array sort
  // $keys  - array of key values for hash array sort

  $keys = array_keys($array);
  if($last == -2) $last = count($array) - 1;
  if($last > $first) {
   $alpha = $first;
   $omega = $last;
   $key_alpha = $keys[$alpha];
   $key_omega = $keys[$omega];
   $guess = $array[$key_alpha][$column];
   while($omega >= $alpha) {
     if($order == SORT_ASC) {
       while($array[$key_alpha][$column] < $guess) {$alpha++; $key_alpha = $keys[$alpha]; }
       while($array[$key_omega][$column] > $guess) {$omega--; $key_omega = $keys[$omega]; }
     } else {
       while($array[$key_alpha][$column] > $guess) {$alpha++; $key_alpha = $keys[$alpha]; }
       while($array[$key_omega][$column] < $guess) {$omega--; $key_omega = $keys[$omega]; }
     }
     if($alpha > $omega) break;
     $temporary = $array[$key_alpha];
     $array[$key_alpha] = $array[$key_omega]; $alpha++;
     $key_alpha = $keys[$alpha];
     $array[$key_omega] = $temporary; $omega--;
     $key_omega = $keys[$omega];
   }
   array_qsort ($array, $column, $order, $first, $omega);
   array_qsort ($array, $column, $order, $alpha, $last);
  }
}
?>
anthony at ectrolinux dot com 08-Sep-2004 04:39
In a brief addition to the previous poster's message, the ascending sorting order used by PHP directly corresponds to ISO-8859-1 (ASCII). Therefore the character \48 (numeral 0) would be placed before the character \82 (R), which would be placed before the character \110 (n), and so forth.
arjan321 at hotmail dot com 31-Jan-2003 12:23
Ik you want to sort case insensitive, use the natcasesort()
peek at mailandnews dot com 07-Apr-2001 04:06
I ran into the same problem with case insensitive sorting. Actually I think there should be a SORT_STRING_CASE flag but I tried the following:

usort($listing, 'strcasecmp');

This didn't work (why not?), but you can do a proper case insensitive sort like this:

usort($listing, create_function('$a,$b','return strcasecmp($a,$b);'));


Trie un tableau en utilisant une fonction de rappel

  • « sort
  • uksort »
  • PHP Manual
  • Fonctions sur les tableaux
  • Trie un tableau en utilisant une fonction de rappel

uasort

(PHP 4, PHP 5, PHP 7, PHP 8)

uasort — Trie un tableau en utilisant une fonction de rappel

Description

uasort ( array &$array , callable $callback ) : bool

Trie le tableau array en conservant la correspondance entre les index et leurs valeurs. uasort() sert essentiellement lors de tri de tableaux associatifs où l'ordre des éléments est significatif. La fonction de comparaison utilisée cmp_function est définie par l'utilisateur.

Utilisé habituellement lors du tri de tableaux associatifs où l'ordre actuel des éléments est significatif.

Note:

Si deux membres se comparent comme égaux, leur ordre relatif dans le tableau trié n'est pas défini.

Liste de paramètres

array

Le tableau d'entrée.

callback

Voyez les fonctions usort() et uksort() pour des exemples de tris avec utilisation de fonction personnalisée.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec uasort()

<?php
// Fonction de comparaison
function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

// Tableau à trier
$array = array('a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4);
print_r($array);

// Trie et affiche le tableau résultant
uasort($array, 'cmp');
print_r($array);
?>

L'exemple ci-dessus va afficher :

Array
(
    [a] => 4
    [b] => 8
    [c] => -1
    [d] => -9
    [e] => 2
    [f] => 5
    [g] => 3
    [h] => -4
)
Array
(
    [d] => -9
    [h] => -4
    [c] => -1
    [e] => 2
    [g] => 3
    [a] => 4
    [f] => 5
    [b] => 8
)

Voir aussi

  • usort() - Trie un tableau en utilisant une fonction de comparaison
  • Les fonctions de tri des tableaux

User Contributed Notes

woodongwong at gmail dot com 29-Oct-2020 01:38
PHP version >= 7

<?php

// Comparison function
function cmp($a, $b) {
    return $a <=> $b;
}

// Array to be sorted
$array = ['a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4];
print_r($array);

// Sort and print the resulting array
uasort($array, 'cmp');
print_r($array);

?>

PHP version >= 7.4

<?php

// Array to be sorted
$array = ['a' => 4, 'b' => 8, 'c' => -1, 'd' => -9, 'e' => 2, 'f' => 5, 'g' => 3, 'h' => -4];
print_r($array);

// Sort and print the resulting array
uasort($array, fn($a, $b) => $a <=> $b);
print_r($array);

?>
lixuss at gmail dot com 14-Mar-2020 05:35
Here is a bug fix for "php at clement dot hk" stable_uasort(&$array, $cmp_function)

The implementation has problems with "0" values, because while() cycle stops on current() returning value "0" which is considered false. The condition must be !== false

Just fix those 3 lines:

while(current($array1) && current($array2)) => while(current($array1)!==false && current($array2)!==false)

while(current($array1)) => while(current($array1)!==false)

while(current($array2)) => while(current($array1)!==false)
bpolaszek at gmail dot com 19-Jun-2018 01:47
Keep in mind that PHP sorting functions are not reliable to handle "stable sorting", even since PHP7+.
It might work on small arrays, but not on "big" ones (100 items are enough for the stable sorting to fail).

<?php
$a = array_fill(0, 100, 'foo');
$b = $a;
var_dump($b === $a); // bool(true)

uasort($a, function () {
    return 0; // Consider all items are the same
});

var_dump($b === $a); // bool(false)
?>

To ensure $b === $a, use a 3rd-party stable sorting function:

http://php.net/manual/en/function.uasort.php#121283
alf at prisguide dot no 28-Jun-2017 11:44
User "php at clement dot hk" already provided a stable uasort function, but I find this wrapper much shorter and easier to understand:

https://github.com/vanderlee/PHP-stable-sort-functions/blob/master/classes/StableSort.php

function stable_uasort(array &$array, $value_compare_func) {
    $index = 0;
    foreach ($array as &$item) {
        $item = array($index++, $item);
    }
    $result = uasort($array, function($a, $b) use($value_compare_func) {
        $result = call_user_func($value_compare_func, $a[1], $b[1]);
        return $result == 0 ? $a[0] - $b[0] : $result;
    });
    foreach ($array as &$item) {
        $item = $item[1];
    }
    return $result;
}
ayaou dot mohammed at gmail dot com 15-Jun-2016 03:05
// Anonumous functions
uasort($collection, array($this, function($a, $b){
     //logic
}));
php at clement dot hk 04-Mar-2014 04:00
If you want to keep the order when two members compare as equal, use this.
<?php

function stable_uasort(&$array, $cmp_function) {
    if(count($array) < 2) {
        return;
    }
    $halfway = count($array) / 2;
    $array1 = array_slice($array, 0, $halfway, TRUE);
    $array2 = array_slice($array, $halfway, NULL, TRUE);

    stable_uasort($array1, $cmp_function);
    stable_uasort($array2, $cmp_function);
    if(call_user_func($cmp_function, end($array1), reset($array2)) < 1) {
        $array = $array1 + $array2;
        return;
    }
    $array = array();
    reset($array1);
    reset($array2);
    while(current($array1) && current($array2)) {
        if(call_user_func($cmp_function, current($array1), current($array2)) < 1) {
            $array[key($array1)] = current($array1);
            next($array1);
        } else {
            $array[key($array2)] = current($array2);
            next($array2);
        }
    }
    while(current($array1)) {
        $array[key($array1)] = current($array1);
        next($array1);
    }
    while(current($array2)) {
        $array[key($array2)] = current($array2);
        next($array2);
    }
    return;
}

function cmp($a, $b) {
    if($a['n'] == $b['n']) {
        return 0;
    }
    return ($a['n'] > $b['n']) ? -1 : 1;
}

$a = $b = array(
    'a' => array("l" => "A", "n" => 1),
    'b' => array("l" => "B", "n" => 2),
    'c' => array("l" => "C", "n" => 1),
    'd' => array("l" => "D", "n" => 2),
    'e' => array("l" => "E", "n" => 2),
);

uasort($a, 'cmp');
print_r($a);

stable_uasort($b, 'cmp');
print_r($b);
?>

returns

Array
(
    [e] => Array
        (
            [l] => E
            [n] => 2
        )

    [b] => Array
        (
            [l] => B
            [n] => 2
        )

    [d] => Array
        (
            [l] => D
            [n] => 2
        )

    [c] => Array
        (
            [l] => C
            [n] => 1
        )

    [a] => Array
        (
            [l] => A
            [n] => 1
        )

)
Array
(
    [b] => Array
        (
            [l] => B
            [n] => 2
        )

    [d] => Array
        (
            [l] => D
            [n] => 2
        )

    [e] => Array
        (
            [l] => E
            [n] => 2
        )

    [a] => Array
        (
            [l] => A
            [n] => 1
        )

    [c] => Array
        (
            [l] => C
            [n] => 1
        )
)

https://bugs.php.net/bug.php?id=53341
Anonymous 15-Aug-2013 10:35
//this fix the problem of if any of these sort functions evaluates two members as equal then the order is undefined (the sorting is not stable).

$pos=0;
foreach($values as $k => $v)
  $tosort[$k]=array($v,$pos++);
uasort($tosort,function($a, $b) {
  if($a[0] != $b[0])return ($a[0] < $b[0]) ? -1 : 1;
    return ($a[1] < $b[1]) ? -1 : 1;}
);
foreach($tosort as $k => $v)
  $values[$k]=$v[0];
iborodikhin at gmail dot com 22-Nov-2012 08:32
To shuffle assoc array preserving keys just do this:
<?php uasort(
    $array,
    function ($a, $b) {
        return mt_rand(0, 1) > 0 ? 1 : -1;
    }
); ?>
Said Dashuk 11-Oct-2011 10:33
My simple and effective solution for sort multi-dimensional array by any key:

<?php
function sort_by_key ($arr,$key) {
    global $key2sort;
    $key2sort = $key;
    uasort($arr, 'sbk');
    return ($arr);
}
function sbk ($a, $b) {global $key2sort; return (strcasecmp ($a[$key2sort],$b[$key2sort]));}
?>
yannick dot battail at gmail dot com 17-Nov-2010 06:37
An Example using anonymous function.
Anonymous functions make some time the code easier to understand.
<?php
$fruits = array('Orange9','Orange11','Orange10','Orange6','Orange15');
uasort ( $fruits , function ($a, $b) {
            return strnatcmp($a,$b); // or other function/code
        }
    );
print_r($fruits);
?>
returns
Array
(
    [3] => Orange6
    [0] => Orange9
    [2] => Orange10
    [1] => Orange11
    [4] => Orange15
)
magikMaker 19-Oct-2010 02:48
a quick reminder on the syntax if you want to use uasort in a Class or Object:

<?php

// procedural:
uasort($collection, 'my_sort_function');

// Object Oriented
uasort($collection, array($this, 'mySortMethod'));

// Objet Oriented with static method
uasort($collection, array('self', 'myStaticSortMethod'));

?>
phire_sk 05-Oct-2010 02:19
I tried using some of the previous built multisorts, but they weren't working as expected.

So, I made my own Class, and it seems to work wonderfully.

Here is the code:

<?php
/************************************
*    Allows sorting multi-dimensional
*    arrays by a specific key and in
*    asc or desc order
**/
class multiSort
{
    var $key;    //key in your array

    //runs the sort, and returns sorted array
    function run ($myarray, $key_to_sort, $type_of_sort = '')
    {
        $this->key = $key_to_sort;

        if ($type_of_sort == 'desc')
            uasort($myarray, array($this, 'myreverse_compare'));
        else
            uasort($myarray, array($this, 'mycompare'));

        return $myarray;
    }

    //for ascending order
    function mycompare($x, $y)
    {
        if ( $x[$this->key] == $y[$this->key] )
            return 0;
        else if ( $x[$this->key] < $y[$this->key] )
            return -1;
        else
            return 1;
    }

    //for descending order
    function myreverse_compare($x, $y)
    {
        if ( $x[$this->key] == $y[$this->key] )
            return 0;
        else if ( $x[$this->key] > $y[$this->key] )
            return -1;
        else
            return 1;
    }
}
?>
paul at webtop-designs dot com 30-Nov-2009 01:40
Just expanding on php arobase kochira period com's method:

If you are looking to sort a multi-D array by a specific column and have entries in both upper and lower case, simply drop the entries to lowercase before doing the strcmp.

<?php
$dirs = array(
  array('name' => 'First Folder', 'path' => 'sompath'),
  array('name' => 'second folder', 'path' => 'sompath2'),
  array('name' => 'Third Folder', 'path' => 'sompath3')
);

function so($a, $b) {
    return (strcmp (strtolower($a['name']), strtolower($b['name'])));
}
?>
php arobase kochira period com 08-Jun-2008 04:13
Difference between uasort() and usort(), the missing example ...

<?php
  $arr = array ( 10 => array('id' => 'dix',  'aa' => '1010'),
                100 => array('id' => 'cent', 'aa' => '100100'),
                  2 => array('id' => 'deux', 'aa' => '22'),
                  7 => array('id' => 'sept', 'aa' => '77'));

  // id sorting
  function so ($a, $b) { return (strcmp ($a['id'],$b['id']));    }
?>

*** uasort($arr, 'so') output:

<?php Array (
    [100] => Array
        (
            [id] => cent
            [aa] => 100100
        )

    [2] => Array
        (
            [id] => deux
            [aa] => 22
        )

    [10] => Array
        (
            [id] => dix
            [aa] => 1010
        )

    [7] => Array
        (
            [id] => sept
            [aa] => 77
        ))?>

*** usort($arr, 'so') output:

<?php Array (
    [0] => Array
        (
            [id] => cent
            [aa] => 100100
        )

    [1] => Array
        (
            [id] => deux
            [aa] => 22
        )

    [2] => Array
        (
            [id] => dix
            [aa] => 1010
        )

    [3] => Array
        (
            [id] => sept
            [aa] => 77
        ))?>
php at eden2 dot com 17-Jul-2003 04:36
Is it just me, or are the examples below misleading, and actually demonstrating situations that would be more appropriate for usort()?

After trying to make sense of the uasort() description, it sounds like it's more for sorting a 1D array like this:

"john" => "$23.12"
"tim" => "$6.50"
"bob" => "$18.54"

and getting back:

"tim" => "$6.50"
"bob" => "$18.54"
"john" => $23.12"

(assuming, of course, that your sort function is lopping off the $ and evaluating as a number -- which would complicate the use of asort() ;)
naholyr at yahoo dot fr 10-Jan-2003 09:35
You can sort a multidimensionnal array by any of its key with this function:

function multi_sort($array, $key)
{
  $cmp_val="((\$a['$key']>\$b['$key'])?1:
    ((\$a['$key']==\$b['$key'])?0:-1))";
  $cmp=create_function('$a, $b', "return $body;");
  uasort($array, $cmp);
  return $array;
}

example:
$myarray = array(
  array("name"=>"kernighan", "language"=>"c"),
  array("name"=>"lerdorf", "language"=>"php"),
  array("name"=>"Stroustrup", "language"=>"c++"),
  array("name"=>"Gosling", "language"=>"java")
);

multi_sort($myarray, "name") returns:
name=Gosling    language=java
name=Kernighan    language=c
name=Lerdorf    language=php
name=Stroustrup    language=c++
dholmes at jccc d0t net 09-Oct-2002 02:27
Here is a little sort function that actually uses a dynamic callback for usort to do it's thing.

It assumes your data is in the form of:
    $data = array(
            array('ID'=>'6','LAST'=>'Holmes','FIRST'=>'Dan'),
            array('ID'=>'1234','LAST'=>'Smith','FIRST'=>'Agent K'),
            array('ID'=>'2','LAST'=>'Smith','FIRST'=>'Agent J'),
            array('ID'=>'4','LAST'=>'Barney','FIRST'=>'Bob'));

Now, you want to sort on one or more cols, don't you?

masort($data, 'LAST,FIRST');
or
masort($data,array('FIRST','ID'));

Of course you could add a bunch to it (like numeric comparison if appropriate, desc/asc, etc) but it works for me.

function masort(&$data, $sortby){
    if(is_array($sortby)){
        $sortby = join(',',$sortby);
    }

    uasort($data,create_function('$a,$b','$skeys = split(\',\',\''.$sortby.'\');
        foreach($skeys as $key){
            if( ($c = strcasecmp($a[$key],$b[$key])) != 0 ){
                return($c);
            }
        }
        return($c); '));
}
Notice that I am splitting the string in the comparison function? While this is certainly slower, it was the only way I would find to "pass" and "array".  If anyone has a better way, please suggest.  Then inside, we (string) compare the values only moving to the next key if the values are the same...and so on, and so on.
stilgar_cpsNOSPAM at zipmail dot NOSPAMcom dot br 05-Sep-2001 02:30
Use example:

$array[0]['Fator1']=7;
$array[0]['Fator2']="Name";
$array[1]['Fator1']=5;
$array[1]['Fator2']="Name";
$array[2]['Fator1']=7;
$array[2]['Fator2']="NameDiferente";
.....

We want to order by Fator1, then Fator2, then:

function Compare($ar1, $ar2)
{
   if ($ar1['Fator1']<$ar2['Fator1'])
      return -1;
   else if ($ar1['Fator1']>$ar2['Fator1'])
      return 1;
   if ($ar1['Fator2']<$ar2['Fator2'])
      return -1;
   else if ($ar1['Fator2']>$ar2['Fator2'])
      return 1;
   return 0;
}

To sort now, we use:

uasort($array, 'Compare');


Trie un tableau par ses clés en utilisant une fonction de rappel

  • « uasort
  • usort »
  • PHP Manual
  • Fonctions sur les tableaux
  • Trie un tableau par ses clés en utilisant une fonction de rappel

uksort

(PHP 4, PHP 5, PHP 7, PHP 8)

uksort — Trie un tableau par ses clés en utilisant une fonction de rappel

Description

uksort ( array &$array , callable $callback ) : bool

uksort() trie les clés du tableau array en utilisant la fonction utilisateur cmp_function. Si un tableau doit être trié avec un critère complexe, il est préférable d'utiliser cette fonction.

Note:

Si deux membres se comparent comme égaux, leur ordre relatif dans le tableau trié n'est pas défini.

Liste de paramètres

array

Le tableau d'entrée.

callback

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

callback ( mixed $a, mixed $b ) : int

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec uksort()

<?php
function cmp($a, $b)
{
    $a = preg_replace('@^(a|an|the) @', '', $a);
    $b = preg_replace('@^(a|an|the) @', '', $b);
    return strcasecmp($a, $b);
}

$a = array("John" => 1, "the Earth" => 2, "an apple" => 3, "a banana" => 4);

uksort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}
?>

L'exemple ci-dessus va afficher :

an apple: 3
a banana: 4
the Earth: 2
John: 1

Voir aussi

  • usort() - Trie un tableau en utilisant une fonction de comparaison
  • Les fonctions de tri des tableaux

User Contributed Notes

smcbride at msn dot com 29-Jan-2021 07:17
This might be obvious to many, but just to help others that are trying to use this in a class.  Inside a class, you can prefix the function with self:: within the uksort(), and it will work.  Also, if it is in another class that is included, you can prefix it with the class name.

class someclass {
     private function ArraySortCMPIP($a, $b) {
          $a = ip2long($a);
          $b = ip2long($b);

          if ($a == $b) return 0;
          return ($a < $b) ? -1 : 1;
     }

     // Output
     public function PrintResults() {
          uksort($this->someIPAddressArray, 'self::ArraySortCMPIP');
          print_r($this->someIPAddressArray);
     }
}
DimeCadmium 22-Jun-2018 06:48
Don't use uksort($array, "strnatcasecmp"); ... use ksort($array, SORT_NATURAL|SORT_FLAG_CASE);
andi at example dot com 24-Feb-2016 10:58
I needed to be able to sort a string that contained numbers eg.

"Slot 1 name"
"Slot 2 name"
"Slot 10 name"

using a normal string compare the "Slot 10 name" would appear before "Slot 2 name" so I wrote little function that will compare a string taking numbers in to consideration. There may be a few edge cases that need to be taken in to consideration.

function strCmpWithNumbers( $a, $b) {
  // Split the string in to words.
  $a = explode(' ',$a);
  $b = explode(' ',$b);
  $loop = 0;
  do {
    // Get the first word from each item
    $ta = Utils::gvfa($a, $loop);
    $tb = Utils::gvfa($b, $loop);

    if (isset($ta)) {
      if (isset($tb)) {
        if (is_numeric($ta)) {
          if ($ta != $tb) {
            return $ta - $tb;
          }
        } else {
          $val = strcasecmp($ta, $tb);
          if ($val != 0) {
            return $val;
          }
        }
      } else {
        return 1; // a is set but b isn't
      }
    } else {
      return isset($b);
    }
    $loop +=1;
  } while (true);
}
Anonymous 05-Oct-2015 01:02
An associative array with known keys can be easily custom sorted using a switch statement in the callback:

NB ksort can be used beforehand to ensure expected results

ksort($array);

uksort($array, function ($a) {
    switch($a) {
        case 'pepperoni':
            return 0;
        case 'beef':
            return 1;
        case 'chicken':
            return 2;
        case 'ham':
            return 3;
        case 'vegetarian':
            return 4;
    }
});
PHPUser 06-Feb-2015 05:32
[Editor's note: the following comment may be factually incorrect]

uksort is only usable in the UK
<?php
if($country=="UK"){
  uksort();
}else{
  echo "You have to live in UK to use uksort().";
}
?>
ingo at example dot test 05-May-2014 01:30
sort with collation, to have umlauts correctly:

uksort($retval, array(Collator::create( 'de_DE' ), 'compare'));
mdsky at web dot de 23-May-2010 11:26
Case insensitive without own function:

uksort($array, "strnatcasecmp");
contacto at hardcode dot com dot ar 29-Jul-2009 06:56
need a case insensitive sort by key function? i did and couldn find it, so:

<?php
function insensitive_uksort($a,$b) {
    return strtolower($a)<strtolower($b);
}
uksort($arr, "insensitive_uksort");
?>
brian dot short at gmail dot com 07-Jul-2009 07:58
If you need to periodically sort by grades (A, A+, D-, etc.), here is a compare function that compares strings by the case-insensitive method, unless it finds a grade, in which case it correctly sorts by putting "plus" grades first, unmarked grades second, and "minus" grades last.

<?php
function cmp($a, $b)
{
   $a = preg_replace('@^(a|an|the) @', '', $a);
   $b = preg_replace('@^(a|an|the) @', '', $b);

   //special code for grades
   if (strpos( $a, "+") !== false || strpos( $b, "+") !== false  ||
       strpos( $a, "-") !== false || strpos( $b, "-") !== false ){

        $substrA = substr($a, 0, 1);
        $substrB = substr($b, 0, 1);

        $modifierA = (strlen($a) == 2) ? substr($a, 1, 1) : "";
        $modifierB = (strlen($b) == 2) ? substr($b, 1, 1) : "";

        if ($substrA == $substrB){
            //figure out plusses and minuses.
            if ($modifierA == "+"){
                return -1;
            } else if ($modifierB == "+"){
                return 1;
            }

            if ($modifierA == "-"){
                return 1;
            } else if ($modifierB == '-'){
                return -1;
            }
        } else {
            return strcasecmp($a, $b);
        }

    }
   return strcasecmp($a, $b);
}

$grades = array(
                 "C+" => 13    ,
                "C" => 10     ,
                "D+" => 8     ,
                "B+" => 7     ,
                "C-" => 6     ,
                "A-" => 5     ,
                "F" => 5      ,
                "B" => 4      ,
                "B-" => 4     ,
                "D" => 3      ,
                "D-" => 3     ,
                "A+" => 1
    );

uksort($grades, "cmp");
?>

result:  Array
(
    [A+] => 1
    [A-] => 5
    [B+] => 7
    [B] => 4
    [B-] => 4
    [C+] => 13
    [C] => 10
    [C-] => 6
    [D+] => 8
    [D] => 3
    [D-] => 3
    [F] => 5
)
Jimomighty 19-Mar-2005 07:30
...

function cmp($a, $b)
{
   if ($a == $b) {
       return 0;
   }
   return ($a < $b) ? -1 : 1;
}

function uksort_tree ( &$array )
{
    // [PHP5] foreach ( $array as &$value )
    foreach ( $array as $key => $value )
    {
       if ( is_array ( $value ) )
       {
            // [PHP5] uksort_tree ( $value );
           uksort_tree ( $array[$key] );
       }
    }

    uksort( $array, "cmp" );
}

uksort_tree( $myEntryArray );

...
aleczapka at gmx dot net 22-Dec-2004 04:35
One remark regarding array_sorter class.
It won't work correctly with eg. dates from mysql like 20041206105350, cause you can't convert such number into integer. To fix it remove intval() from the code. If the variable is a number it will work without converting this to int anyways. Here is the fix.

<?php
....
if ($a == $b)
    return 0;
if ($this->sasc)
    return ($a > $b) ? 1 : -1;
else
    return ($a > $b) ? -1 : 1;
...
?>
jg at delegation dot ca 17-Dec-2004 07:41
To sort dates with uksort:

function datediff($a, $b) {

$a = date('U',$a);
$b = date('U',$b);

if ($a == $b) $r = 0;
else $r = ($a > $b) ? 1: -1;

return $r;
}
aleczapka at gmx dot net 06-Dec-2004 04:27
Here is a small and very fast object to handle sorting of multidimentional arrays by a key.
<?php
/**
* Handles multidimentional array sorting by a key (not recursive)
*
* @author Oliwier Ptak <aleczapka at gmx dot net>
*/
class array_sorter
{
    var $skey = false;
    var $sarray = false;
    var $sasc = true;

    /**
    * Constructor
    *
    * @access public
    * @param mixed $array array to sort
    * @param string $key array key to sort by
    * @param boolean $asc sort order (ascending or descending)
    */
    function array_sorter(&$array, $key, $asc=true)
    {
        $this->sarray = $array;
        $this->skey = $key;
        $this->sasc = $asc;
    }

    /**
    * Sort method
    *
    * @access public
    * @param boolean $remap if true reindex the array to rewrite indexes
    */
    function sortit($remap=true)
    {
        $array = &$this->sarray;
        uksort($array, array($this, "_as_cmp"));
        if ($remap)
        {
            $tmp = array();
            while (list($id, $data) = each($array))
                $tmp[] = $data;
            return $tmp;
        }
        return $array;
    }

    /**
    * Custom sort function
    *
    * @access private
    * @param mixed $a an array entry
    * @param mixed $b an array entry
    */
    function _as_cmp($a, $b)
    {
        //since uksort will pass here only indexes get real values from our array
        if (!is_array($a) && !is_array($b))
        {
            $a = $this->sarray[$a][$this->skey];
            $b = $this->sarray[$b][$this->skey];
        }

        //if string - use string comparision
        if (!ctype_digit($a) && !ctype_digit($b))
        {
            if ($this->sasc)
                return strcasecmp($a, $b);
            else
                return strcasecmp($b, $a);
        }
        else
        {
            if (intval($a) == intval($b))
                return 0;

            if ($this->sasc)
                return (intval($a) > intval($b)) ? -1 : 1;
            else
                return (intval($a) > intval($b)) ? 1 : -1;
        }
    }

}//end of class
?>

Sample $input_array:

Array
(
    [0] => Array
        (
            [id] => 961
            [uid] => 29
            [gid] => 12
            [parent_id] => 147
            [created] => 20041206105350
            [modified] => 20041206110702
        )

    [1] => Array
        (
            [id] => 41
            [uid] => 29
            [gid] => 12
            [parent_id] => 153
            [created] => 20041025154009
            [modified] => 20041206105532
        )

    [2] => Array
        (
            [id] => 703
            [uid] => 29
            [gid] => 12
            [parent_id] => 419
            [created] => 20041025154132
            [modified] => 20041027150259
        )

Example of usage:
<?php
    function multi_sort(&$array, $key, $asc=true)
    {
        $sorter = new array_sorter($array, $key, $asc);
        return $sorter->sortit();
    }
    //sort by parent_id in descending order
    $my_array = multi_sort($input_array, "parent_id", false);
?>

The result array will be:
Array
(

    [0] => Array
        (
            [id] => 703
            [uid] => 29
            [gid] => 12
            [parent_id] => 419
            [created] => 20041025154132
            [modified] => 20041027150259
        )

    [1] => Array
        (
            [id] => 41
            [uid] => 29
            [gid] => 12
            [parent_id] => 153
            [created] => 20041025154009
            [modified] => 20041206105532
        )

    [2] => Array
        (
            [id] => 961
            [uid] => 29
            [gid] => 12
            [parent_id] => 147
            [created] => 20041206105350
            [modified] => 20041206110702
        )
fabriceb at gmx dot net 08-Jul-2004 06:26
(about sorting an array of objects by their properties in a class - inspired by webmaster at zeroweb dot org at usort function)
I'm using classes as an abstraction for querying records in a database and use arrays of objects to store records that have an 1 to n relationship. E.g. a class "family" has family members stored as an array of objects. Each of those objects prepresents a record in a database related to the family (by it's familyId).

To identify members, I'm using their memberId as the key of the array e.g. $family->members[$memberId].
To sort the family members AFTER fetching them with the database query, you can use the functions _objSort and sortMembers which will sort the "members" array by key using it's properties (for space reasons I didn't include the methods used to open the records):
<?php
class familyMember
{
    var $memberId;
    var $familyId;
    var $firstName;
    var $age;
    var $hairColor;
// ...
}

class family
{
    var $familyId;
    var $name;
    var $members = array(); // array of familyMember objects
    var $sortFields = array();
    var $sortDirections = array();
    // ...
    function _objSort(&$a, &$b, $i = 0)
    {
        $field        = $this->sortFields[$i];
        $direction    = $this->sortDirections[$i];

        $diff = strnatcmp($this->details[$a]->$field, $this->details[$b]->$field) * $direction;
        if ($diff == 0 && isset($this->sortFields[++$i]))
        {
            $diff = $this->_objSort($a, $b, $i);
        }

        return $diff;
    }

    function sortMembers($sortFields)
    {
        $i = 0;
        foreach ($sortFields as $field => $direction)
        {
            $this->sortFields[$i] = $field;
            $direction == "DESC" ? $this->sortDirections[$i] = -1 : $this->sortDirections[$i] = 1;
            $i++;
        }

        uksort($this->details, array($this, "_objSort"));

        $this->sortFields = array();
        $this->sortDirections = array();
    }
}
// open a family
$familyId = 5;
$family = new family($familyId);
$family->open(); // this will also fetch all members

// sort members by 3 fields
$family->sortMembers(array("firstName" => "ASC", "age" => "DESC", "hairColor" => "ASC"));
// output all family members
foreach ($family->members as $member)
{
    echo $member->firstName." - ".$member->age." - ".$member->hairColor."<br />";
}
?>

Note that this might not be the fastest thing on earth and it hasn't been tested very much yet but I hope it's useful for someone.
webmaster at kik-it at N0SP4M dot com 09-Feb-2004 10:03
The code below allows you to sort an array_A following array_B keys order, original keys and values remain associated.

<?

//main function
Function SortArrayAKeysLikeArrayBKeys(&$TheArrayToSort){
   uksort($TheArrayToSort,"SortArrayAKeysLikeArrayBKeys_cmp");
}

//the custom compare function
Function SortArrayAKeysLikeArrayBKeys_cmp($a,$b){
  global $TheArrayOrder;
  $PosA=KeyPosInArray($a,$TheArrayOrder);
  $PosB=KeyPosInArray($b,$TheArrayOrder);
  if ($PosA==$PosB){return 0;}else{return ($PosA > $PosB ? 1 : -1);}
}

//where is my key in my array
Function KeyPosInArray($Key,$Array){
   $i=0;
   $Pos=99999999;
   if($Array){
      foreach($Array as $K => $V){
         $i++;
         if($K==$Key){
            $Pos=$i;
            break;
         }
      }
   }
   return $Pos;
}

//the array you want to sort
$AnyArrayToSort['age']='19';
$AnyArrayToSort['ville']='rennes';
$AnyArrayToSort['website']='kik-it.com';
$AnyArrayToSort['region']='bretagne';
$AnyArrayToSort['code_postal']='35200';
$AnyArrayToSort['Nom']='Fred';

//the array with the correct keys/values order
$TheArrayOrder['Nom']='Whatever';
$TheArrayOrder['age']='Anything';
$TheArrayOrder['region']='What u want';
$TheArrayOrder['ville']='Something';
$TheArrayOrder['code_postal']='Nothing';

//before sort
print_r($AnyArrayToSort);
echo "<br>";
//we sort
SortArrayAKeysLikeArrayBKeys($AnyArrayToSort);
echo "<br>";
//after sort
print_r($AnyArrayToSort);
?>

Will print :

Array ( [age] => 19 [ville] => rennes [website] => kik-it.com [region] => bretagne [code_postal] => 35200 [Nom] => Fred )

Array ( [Nom] => Fred [age] => 19 [region] => bretagne [ville] => rennes [code_postal] => 35200 [website] => kik-it.com )

The keys not listed in the $TheArrayOrder will appear at the end of your sorted array (only if Key Pos < 99999999 ;o)
guss at typo dot co dot il 07-Dec-2003 12:18
Regarding the recursive sorting function above:
Genrally speaking, any recursion can be reimplemented using simple iteration. in the specific case, using recursion to compare strings has a huge performance impact while a simple loop would suffice and be faster and more simple.
Recursion is only good if it simplifies your code or your understanding of the concept. the previous example does neither, especially as it does a lot of repetitive things in each iteration, such as asigning the character order constant, rebuilding it into an array and such

For example, the string comparison could be written as such :
function str_compare($a,$b) {
    $order="aA??bBcC&#269;&#268;..."; // longer normally & without that html entities
    $default = strlen($a) - strlen($b);
    $minlen = strlen($a) < strlen($b) ? strlen($a) : strlen($b);
    for ($i = 0; $i < $minlen; $i++) {
        $pos_a=strpos($order,$a[$i]);
        $pos_b=strpos($order,$b[$i]);
        if ($pos_a != $pos_b)
            return $pos_a - $pos_b;
    }
    return $default;
}

Which is much simpler and faster.
Note that the above function will break for characters that are not listed in $order. it should be failry trivial to fix it.
ignatius dot reilly at free dot fr 13-Nov-2003 10:59
To use a more complicated comparison function, one can use a callback to a method of an object instance.
For example the following will take an array $arr whose keys are the same as those of $reference, and reorder $arr so that the keys appear in the same order as in $reference.

class kcmp {
    var $reference ;
    function kcmp( $reference ) {
       $this->reference = $reference ;
    }
    function kcompare( $a, $b ) {
       $keys = array_keys( $this->reference ) ;
       $position_a = array_search( $a, $keys ) ;
       $position_b = array_search( $b, $keys ) ;
       return  $position_a < $position_b ? -1 : 1 ;
    }
}

$reference = array(
    "k2" => "a2",
    "k3" => "a3",
    "k1" => "a1"
) ;
$arr = array(
    "k1" => "b1",
    "k2" => "b2",
    "k3" => "b3"
) ;
print_r( $arr ) ;
uksort( $arr, array( new kcmp( $reference ), "kcompare" ) ) ;
print_r( $arr ) ;


Trie un tableau en utilisant une fonction de comparaison

  • « uksort
  • Classes/Objets »
  • PHP Manual
  • Fonctions sur les tableaux
  • Trie un tableau en utilisant une fonction de comparaison

usort

(PHP 4, PHP 5, PHP 7, PHP 8)

usort — Trie un tableau en utilisant une fonction de comparaison

Description

usort ( array &$array , callable $callback ) : bool

usort() va trier le tableau array avec ses valeurs, en utilisant une fonction définie par l'utilisateur. Si un tableau doit être trié avec un critère complexe, il est préférable d'utiliser cette fonction.

Note:

Si deux membres se comparent comme égaux, leur ordre relatif dans le tableau trié n'est pas défini.

Note: Cette fonction assigne de nouvelles clés aux éléments dans array. Elle effacera toutes les clés existantes qui ont pu être assignées, plutôt que de réarranger les clés.

Liste de paramètres

array

Le tableau d'entrée.

callback

La fonction de comparaison doit retourner un entier inférieur à, égal à, ou supérieur à 0 si le premier argument est considéré comme, respectivement, inférieur à, égal à, ou supérieur au second.

callback ( mixed $a, mixed $b ) : int
Attention

Le fait de retourner des valeurs non entières depuis la fonction de comparaison, comme des valeurs de type nombre décimal fera que l'intervalle sera transtypé en entier en se basant sur la valeur retournée par la fonction de rappel. Aussi des valeurs comme 0.99 et 0.1 sera toutes les deux transformées en la valeur 0, et leur comparaison sera égale.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec usort()

<?php
function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}
?>

L'exemple ci-dessus va afficher :

0: 1
1: 2
2: 3
3: 5
4: 6

Note:

Évidemment dans ce cas trivial, sort() serait plus approprié.

Exemple #2 Tri avec usort() sur un tableau multidimensionnel

<?php
function cmp($a, $b)
{
    return strcmp($a["fruit"], $b["fruit"]);
}

$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";

usort($fruits, "cmp");

while (list($key, $value) = each($fruits)) {
    echo "\$fruits[$key]: " . $value["fruit"] . "\n";
}
?>

Lors du tri de tableau multidimensionnel, $a et $b contiennent des références sur le premier élément du tableau.

L'exemple ci-dessus va afficher :

$fruits[0]: apples
$fruits[1]: grapes
$fruits[2]: lemons

Exemple #3 Tri avec usort() sur un objet

<?php
class TestObj {
    var $name;

    function TestObj($name)
    {
        $this->name = $name;
    }

    /* Ceci est une fonction de comparaison statique */
    static function cmp_obj($a, $b)
    {
        $al = strtolower($a->name);
        $bl = strtolower($b->name);
        if ($al == $bl) {
            return 0;
        }
        return ($al > $bl) ? +1 : -1;
    }
}

$a[] = new TestObj("c");
$a[] = new TestObj("b");
$a[] = new TestObj("d");

usort($a, array("TestObj", "cmp_obj"));

foreach ($a as $item) {
    echo $item->name . "\n";
}
?>

L'exemple ci-dessus va afficher :

b
c
d

Exemple #4 Exemple avec usort() en utilisant une closure pour trier un tableau multi-dimensionnel

<?php
$array[0] = array('key_a' => 'z', 'key_b' => 'c');
$array[1] = array('key_a' => 'x', 'key_b' => 'b');
$array[2] = array('key_a' => 'y', 'key_b' => 'a');

function build_sorter($key) {
    return function ($a, $b) use ($key) {
        return strnatcmp($a[$key], $b[$key]);
    };
}

usort($array, build_sorter('key_b'));

foreach ($array as $item) {
    echo $item['key_a'] . ', ' . $item['key_b'] . "\n";
}
?>

L'exemple ci-dessus va afficher :

y, a
x, b
z, c

Voir aussi

  • uasort() - Trie un tableau en utilisant une fonction de rappel
  • Les fonctions de tri des tableaux

User Contributed Notes

gus dot antoniassi at gmail dot com 10-Jun-2019 01:23
This is a simple way to sort based on a "priority list":

<?php

$order = [1,3,0,2];
$arr =   [
    [ 'id' => 0 ],
    [ 'id' => 1 ],
    [ 'id' => 2 ],
    [ 'id' => 3 ],
];

uasort(
    $arr,
    function ($a, $b) use ($order) {
        return array_search($a['id'], $order) <=> array_search($b['id'], $order);
    }
);

print_r($arr);

?>

This will return:

Array
(
    [1] => Array
        (
            [id] => 1
        )

    [3] => Array
        (
            [id] => 3
        )

    [0] => Array
        (
            [id] => 0
        )

    [2] => Array
        (
            [id] => 2
        )

)

Note that if you have a value in $arr that is not on the $order list, you will need additional checks since the array_search function returns FALSE for undefined indexes.
chris at candm dot org dot uk 19-Jan-2019 01:15
In case anyone is interested, comparative timings over 100000000 runs
Based on comparing integers (500 and 501)
Spaceship:4
()?: operator:10
Subtraction:2

Based on comparing floats (500.1 and 501.3) (caveats noted)
Spaceship:5
()?: operator:9
Subtraction:3

Based on comparing strings ("five" and "four")
Spaceship:7
()?: operator:17
(Subtraction obviously not available)

Note: a dummy run was done with an empty loop and the elapsed time for this was subtracted from each of the above times so that they reflect ONLY the time to do the comparisons. As for significance. unless you are doing very large numbers of comparisons where spaceships are the order of the day, the difference is insignificant.
user dot boba at gmail dot com 13-Sep-2017 05:10
PHP7 spaceship operator very helpful in sorting function callback

http://php.net/manual/en/migration70.new-features.php#migration70.new-features.spaceship-op

<?php

// PHP < 7 example
function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

// PHP7 example
function cmp($a, $b)
{
    return $a <=> $b;
}
121616591 at qq dot com 02-May-2017 09:49
You can also sort multi-dimensional array for multiple values like as
<?php
$arr = array(
    array('id'=>1, 'age'=>1, 'sex'=>6, 'name'=>'a'),
    array('id'=>2, 'age'=>3, 'sex'=>1, 'name'=>'c'),
    array('id'=>3, 'age'=>3, 'sex'=>1, 'name'=>'b'),
    array('id'=>4, 'age'=>2, 'sex'=>1, 'name'=>'d'),
);

print_r(arrayOrderBy($arr, 'age asc,sex asc,name desc'));

function arrayOrderBy(array &$arr, $order = null) {
    if (is_null($order)) {
        return $arr;
    }
    $orders = explode(',', $order);
    usort($arr, function($a, $b) use($orders) {
        $result = array();
        foreach ($orders as $value) {
            list($field, $sort) = array_map('trim', explode(' ', trim($value)));
            if (!(isset($a[$field]) && isset($b[$field]))) {
                continue;
            }
            if (strcasecmp($sort, 'desc') === 0) {
                $tmp = $a;
                $a = $b;
                $b = $tmp;
            }
            if (is_numeric($a[$field]) && is_numeric($b[$field]) ) {
                $result[] = $a[$field] - $b[$field];
            } else {
                $result[] = strcmp($a[$field], $b[$field]);
            }
        }
        return implode('', $result);
    });
    return $arr;
}
?>

output:
Array
(
    [0] => Array
        (
            [id] => 1
            [age] => 1
            [sex] => 6
            [name] => a
        )

    [1] => Array
        (
            [id] => 4
            [age] => 2
            [sex] => 1
            [name] => d
        )

    [2] => Array
        (
            [id] => 2
            [age] => 3
            [sex] => 1
            [name] => c
        )

    [3] => Array
        (
            [id] => 3
            [age] => 3
            [sex] => 1
            [name] => b
        )

)
inigo dot grimbergen at gmail dot com 14-Jan-2017 06:51
to sort with numeric and empty values  and have the smallest on top:
<?php
    usort($list, function($a, $b) {
        if( $a == null && $b != null ) return 1;
        if( $a != null && $b == null ) return -1;
        return $a > $b ? 1 : -1;
    });
?>
returns
1
2
3
null
null
null
grzeniufication at gmail dot com 16-Dec-2016 07:56
Just wanted to show off the beauty of PHPs spaceship operator in this use case.

<?php // tested on PHP 7.1
$a = [2, 1, 3, 6, 5, 4, 7];
$asc = $desc = $a;
usort($asc, function (int $a, int $b) { return ($a <=> $b); });
usort($desc, function (int $a, int $b) { return -($a <=> $b); });
print_r([ $a, $asc, $desc ]);

/**
 * Getting ahead of myself but... If arrow function syntax was possible:
 * usort($asc, (int $a, int $b) => ($a <=> $b));
 * usort($desc, (int $a, int $b) => -($a <=> $b));
 */
?>
Nsisodia91 at gmail dot com 19-Feb-2016 12:12
You can also sort multi-dimensional array for multiple values like as

<?php
$arr = [
    [
        "name"=> "Sally",
        "nick_name"=> "sal",
        "availability"=> "0",
        "is_fav"=> "0"
    ],
    [
        "name"=> "David",
        "nick_name"=> "dav07",
        "availability"=> "0",
        "is_fav"=> "1"
    ],
    [
        "name"=> "Zen",
        "nick_name"=> "zen",
        "availability"=> "1",
        "is_fav"=> "0"
    ],
    [
        "name"=> "Jackson",
        "nick_name"=> "jack",
        "availability"=> "1",
        "is_fav"=> "1"
    ],
    [
        "name"=> "Rohit",
        "nick_name"=> "rod",
        "availability"=> "0",
        "is_fav"=> "0"
    ],

];

usort($arr,function($a,$b){
    $c = $b['is_fav'] - $a['is_fav'];
    $c .= $b['availability'] - $a['availability'];
    $c .= strcmp($a['nick_name'],$b['nick_name']);
    return $c;
});

print_r($arr);
?>

Output:

Array
(
    [0] => Array
        (
            [name] => Jackson
            [nick_name] => jack
            [availability] => 1
            [is_fav] => 1
        )

    [1] => Array
        (
            [name] => David
            [nick_name] => dav07
            [availability] => 0
            [is_fav] => 1
        )

    [2] => Array
        (
            [name] => Zen
            [nick_name] => zen
            [availability] => 1
            [is_fav] => 0
        )

    [3] => Array
        (
            [name] => Rohit
            [nick_name] => rod
            [availability] => 0
            [is_fav] => 0
        )

    [4] => Array
        (
            [name] => Sally
            [nick_name] => sal
            [availability] => 0
            [is_fav] => 0
        )

)
me at evertpot dot com 16-Jul-2015 11:13
I see many people here (including the official examples) write their callbacks rather clumsily like this:

<?php
function($a, $b) {
  if ($a === $b) {
    return 0;
  } elseif ($a < $b) {
    return -1;
  } else {
    return 1;
  }
}
?>

Or if they are a bit more clever:

<?php
function($a, $b) {

  if ($a === $b) {
    return 0;
  } else {
    return $a < $b ? -1 : 1;
  }
}
?>

But this can by simplified further to:

<?php
function($a, $b) {
  return $a - $b;
}
?>
bob at thecaverlys dot net 03-Dec-2014 03:10
Below is a variation on Example #4 that implements a multi-key natural sort on an associative array and can be called in such a way as to allow reversing the sort order and/or making the comparison case insensitive on a key by key basis.

Test code is included in the file – run it from the command line with: php sortUtils.php

<?php
/**
 *    sortUtils.php
*/

/**
 *    mknatsort() - Multi-Key Natural Sort for associative arrays
 *
 *    Uses the usort() function to perform a natural sort on a multi-dimensional
 *    array on multiple keys. Optionally specifying the sort order for each key
 *    and/or ignoring the case for each key value.
 *
 *    @param array $data_array The array to be sorted.
 *    @param mixed $keys The list of keys to be sorted by. This may be a single
 *        key or an array of keys
 *    @param boolean $reverse Specify whether or not to reverse the sort order. If
 *        there are multiple keys then $reverse may be an array of booleans - one
 *        per key.
 *    @param boolean $ignorecase Specify whether or not to ignore the case when
 *        comparing key values.reverse the sort order. If there are multiple keys
 *        then $ignorecase may be an array of booleans - one per key.
*/
function mknatsort ( &$data_array, $keys, $reverse=false, $ignorecase=false ) {
    // make sure $keys is an array
    if (!is_array($keys)) $keys = array($keys);
    usort($data_array, sortcompare($keys, $reverse, $ignorecase) );
}

function sortcompare($keys, $reverse=false, $ignorecase=false) {
    return function ($a, $b) use ($keys, $reverse, $ignorecase) {
        $cnt=0;
        // check each key in the order specified
        foreach ( $keys as $key ) {
            // check the value for ignorecase and do natural compare accordingly
            $ignore = is_array($ignorecase) ? $ignorecase[$cnt] : $ignorecase;
            $result = $ignore ? strnatcasecmp ($a[$key], $b[$key]) : strnatcmp($a[$key], $b[$key]);
            // check the value for reverse and reverse the sort order accordingly
            $revcmp = is_array($reverse) ? $reverse[$cnt] : $reverse;
            $result = $revcmp ? ($result * -1) : $result;
            // the first key that results in a non-zero comparison determines
            // the order of the elements
            if ( $result != 0 ) break;
            $cnt++;
        }
        return $result;
    };
} // end sortcompare()

// test code that will be skipped if this is included in the web environment
// test with: php sortUtils.php from the command line
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cli') {

    // the following shows several examples of usage and the resulting output.
    $test[] = array('Status'=>'In Progress', 'comment'=>'This looks good.', 'user_name'=>'John Doe', 'date_modified'=>'06/13/2014 11:20 AM', 'role'=>'Senior Account Manager');
    $test[] = array('Status'=>'In Progress', 'comment'=>'This looks good, please approve.', 'user_name'=>'John Doe', 'date_modified'=>'06/13/2014 11:19 AM', 'role'=>'Account Manager');
    $test[] = array('Status'=>'In Progress', 'comment'=>'This looks good.', 'user_name'=>'Jane Smith', 'date_modified'=>'06/13/2014 11:19 AM', 'role'=>'Senior Account Manager');
    $test[] = array('Status'=>'Returned', 'comment'=>'There is not enough informartion.  Please add the following.', 'user_name'=>'John Doe', 'date_modified'=>'06/13/2014 11:15 AM', 'role'=>'Account Manager');
    $test[] = array('Status'=>'In Progress', 'comment'=>'I am currently reviewing this.', 'user_name'=>'John Doe', 'date_modified'=>'06/13/2014 11:14 AM', 'role'=>'Account Manager');
    echo "Original array: ";
    print_r($test);

    echo "Sorted on date_modified: ";
    mknatsort($test, array('date_modified') );
    print_r($test);

    echo "Sorted on role(reversed) & date_modified: ";
    mknatsort($test, array('role','date_modified'),array(true,false) );
    print_r($test);

    echo "Sorted on role & date_modified(reversed): ";
    mknatsort($test, array('role','date_modified'),array(false,true) );
    print_r($test);
}

?>
Gerald Schneider 09-Dec-2013 07:57
usort returns null when the sorting function is not (yet) defined. The function has to be defined before usort is called, afterwards doesn't work.
Hayley Watson 08-Apr-2013 10:30
As the documentation says, the comparison function needs to return an integer that is either "less than, equal to, or greater than zero". There is no requirement to restrict the value returned to -1, 0, 1.

<?php
usort($array, function($a, $b) {
    if($a->integer_property > $b->integer_property) {
        return 1;
    }
    elseif($a->integer_property < $b->integer_property) {
        return -1;
    }
    else {
        return 0;
    }
});
?>

can be simplified to

<?php
usort($array, function($a, $b) {
    return $a->integer_property - $b->integer_property;
});
?>

This of course applies to any comparison function that calculates an integer "score" for each of its arguments to decide which is "greater".
Jian Wu 06-Jul-2012 09:16
The usort function actually moves $b up when the callback function returns both 0 and 1.  If you want to preserve the original order in the array, return 1 when $a == $b instead of 0.  Try this code below to see how usort alters the order of the original array when all values are the same.

<?php
class TestObj {
    private $name;
    private $id;

    function TestObj($name, $id) {
        $this->name = $name;
        $this->id = $id;
    }

    static function cmp_obj($a, $b) {
        $al = strtolower($a->name);
        $bl = strtolower($b->name);
        if ($al == $bl) {
            return 0; // return 1 if you don't want $b to go in front of $a
        }
        return ($al > $bl) ? +1 : -1;
    }
}

$a[] = new TestObj("a", 1);
$a[] = new TestObj("a", 2);
$a[] = new TestObj("a", 3);

var_dump($a);
usort($a, array("TestObj", "cmp_obj"));
var_dump($a);
?>
zuallauz at gmail dot com 29-Mar-2012 09:56
When trying to do some custom sorting with objects and an anonymous function it wasn't entirely clear how this usort function works. I think it probably uses a quicksort in the background. Basically it actually moves the $b variable up or down in respect to the $a variable. It does NOT move the $a variable inside the callback function. This is key to getting your logic right in the comparisons.

If you return -1 that moves the $b variable down the array, return 1 moves $b up the array and return 0 keeps $b in the same place.

To test I cut down my code to sorting a simple array from highest priority to lowest.

<?php
$priorities = array(5, 8, 3, 7, 3);

usort($priorities, function($a, $b)
{
    if ($a == $b)
    {
        echo "a ($a) is same priority as b ($b), keeping the same\n";
        return 0;
    }
    else if ($a > $b)
    {
        echo "a ($a) is higher priority than b ($b), moving b down array\n";
        return -1;
    }
    else {
        echo "b ($b) is higher priority than a ($a), moving b up array\n";
        return 1;
    }
});

echo "Sorted priorities:\n";
var_dump($priorities);
?>

Output:

b (8) is higher priority than a (3), moving b up array
b (5) is higher priority than a (3), moving b up array
b (7) is higher priority than a (3), moving b up array
a (3) is same priority as b (3), keeping the same
a (8) is higher priority than b (3), moving b down array
b (8) is higher priority than a (7), moving b up array
b (8) is higher priority than a (5), moving b up array
b (8) is higher priority than a (3), moving b up array
a (5) is higher priority than b (3), moving b down array
a (7) is higher priority than b (5), moving b down array

Sorted priorities:
array(5) {
  [0]=> int(8)
  [1]=> int(7)
  [2]=> int(5)
  [3]=> int(3)
  [4]=> int(3)
}
andi_mclean at ntlworld dot com 04-Feb-2012 03:58
I needed a sort method that would sort strings but take note of any numbers and would compare them as number. I also want to ignore any non alphanumerical characters.

Eg.
Slot 1 Example
Slot 10 Example
Slot 2 Example

Should infact be
Slot 1 Example
Slot 2 Example
Slot 10 Example

<?php
function sort_with_numbers($a , $b) {
    $a = explode(' ',$a);
    $b = explode(' ',$b);
    $size = min(count($a), count($b));
    for($index =0; $index < $size; ++$index) {
        $a1 = ereg_replace("[^A-Za-z0-9]", "",$a[$index]);
        $b1 = ereg_replace("[^A-Za-z0-9]", "",$b[$index]);
        $equal = 0;
        if (is_numeric($a1) && is_numeric($b1)) {
            $equal = $a1 - $b1;
        } else {
            $equal = strcasecmp($a1,$b1);
        }
        if ($equal < 0) {
            return -1;
        }
        if ($equal > 0) {
            return 1;
        }
    }
    return count($a) - count($b);
}
?>
admin at gosenz dot com 04-Dec-2011 08:58
sort multi-dimentional arrays in class with usort

<?php
class ArraySort
{
    private $arr = array();

    public function __construct($arr)
    {
        $this->arr = $arr;
    }

    public function doSort()
    {
        $cmp = function($a, $b)
        {
            //Do Some Comparation
        }
        if(is_array($this->arr))
        {
            usort($this->arr, $cmp);
        }
        return $this->arr;
    }
}
?>
Gok6tm 13-Sep-2011 06:09
this is a new multisort function for sorting on multiple subfield like it will be in sql : 'ORDER BY field1, field2'
number of sort field is undefined
<?php

$array[] = array('soc' => 3, 'code'=>1);
$array[] = array('soc' => 2, 'code'=>1);
$array[] = array('soc' => 1, 'code'=>1);
$array[] = array('soc' => 1, 'code'=>1);
$array[] = array('soc' => 2, 'code'=>5);
$array[] = array('soc' => 1, 'code'=>2);
$array[] = array('soc' => 3, 'code'=>2);

//usage
print_r(multiSort($array, 'soc', 'code'));

function multiSort() {
    //get args of the function
    $args = func_get_args();
    $c = count($args);
    if ($c < 2) {
        return false;
    }
    //get the array to sort
    $array = array_splice($args, 0, 1);
    $array = $array[0];
    //sort with an anoymous function using args
    usort($array, function($a, $b) use($args) {

        $i = 0;
        $c = count($args);
        $cmp = 0;
        while($cmp == 0 && $i < $c)
        {
            $cmp = strcmp($a[ $args[ $i ] ], $b[ $args[ $i ] ]);
            $i++;
        }

        return $cmp;

    });

    return $array;

}
?>

output:
Array
(
    [0] => Array
        (
            [soc] => 1
            [code] => 1
        )

    [1] => Array
        (
            [soc] => 1
            [code] => 1
        )

    [2] => Array
        (
            [soc] => 1
            [code] => 2
        )

    [3] => Array
        (
            [soc] => 2
            [code] => 1
        )

    [4] => Array
        (
            [soc] => 2
            [code] => 5
        )

    [5] => Array
        (
            [soc] => 3
            [code] => 1
        )

    [6] => Array
        (
            [soc] => 3
            [code] => 2
        )

)
Lea Hayes 12-Jul-2011 05:55
<?php
/**
 * Sort array of objects by field.
 *
 * @param array $objects Array of objects to sort.
 * @param string $on Name of field.
 * @param string $order (ASC|DESC)
 */
function sort_on_field(&$objects, $on, $order = 'ASC') {
    $comparer = ($order === 'DESC')
        ? "return -strcmp(\$a->{$on},\$b->{$on});"
        : "return strcmp(\$a->{$on},\$b->{$on});";
    usort($objects, create_function('$a,$b', $comparer));
}
?>
bcsj 28-Jun-2011 11:12
Sorting a multidimensional array by a subkey seem to be one of the bigger challenges when using usort. At least if one want the key to be dynamic. For anyone interested this code seemed to work rather well for me:

<?php

usort($array,array(new cmp($key), "cmp__"));

class cmp {
    var $key;
    function __construct($key) {
        $this->key = $key;
    }

    function cmp__($a,$b) {
        $key = $this->key;
        if ($a[$key] == $b[$key]) return 0;
        return (($a[$key] > $b[$key]) ? 1 : -1);
    }
}

?>
xaguilars at gmail dot com 06-May-2010 04:03
I'd like to share with the community my function for sorting an array of arrays or objects containing associative data. This could be used, for example, with a MySQL result.

<?php
function sort_by($field, &$arr, $sorting=SORT_ASC, $case_insensitive=true){
    if(is_array($arr) && (count($arr)>0) && ( ( is_array($arr[0]) && isset($arr[0][$field]) ) || ( is_object($arr[0]) && isset($arr[0]->$field) ) ) ){
        if($case_insensitive==true) $strcmp_fn = "strnatcasecmp";
        else $strcmp_fn = "strnatcmp";

        if($sorting==SORT_ASC){
            $fn = create_function('$a,$b', '
                if(is_object($a) && is_object($b)){
                    return '.$strcmp_fn.'($a->'.$field.', $b->'.$field.');
                }else if(is_array($a) && is_array($b)){
                    return '.$strcmp_fn.'($a["'.$field.'"], $b["'.$field.'"]);
                }else return 0;
            ');
        }else{
            $fn = create_function('$a,$b', '
                if(is_object($a) && is_object($b)){
                    return '.$strcmp_fn.'($b->'.$field.', $a->'.$field.');
                }else if(is_array($a) && is_array($b)){
                    return '.$strcmp_fn.'($b["'.$field.'"], $a["'.$field.'"]);
                }else return 0;
            ');
        }
        usort($arr, $fn);
        return true;
    }else{
        return false;
    }
}
?>
Will Shaver 27-Aug-2009 02:31
An even better implementation of osort [than my original, posted on 24-AUG-09 (since deleted)], allowing for multiple properties and directions.  With php 5.3.0 sorting by properties of an object becomes MUCH simpler.  Note that this uses anonymous functions / closures. Might find reviewing the php docs on that useful.  Look below for examples for previous version of php.

<?php
function osort(&$array, $props)
{
    if(!is_array($props))
        $props = array($props => true);

    usort($array, function($a, $b) use ($props) {
        foreach($props as $prop => $ascending)
        {
            if($a->$prop != $b->$prop)
            {
                if($ascending)
                    return $a->$prop > $b->$prop ? 1 : -1;
                else
                    return $b->$prop > $a->$prop ? 1 : -1;
            }
        }
        return -1; //if all props equal
    });
}
?>

Usage:

<?php
osort($items, array("Color" => true, "Size" => false));
//or
osort($items, "Color");
?>
gmail.com - nmcquay 31-Mar-2009 12:25
I wrote a wrapper for usort that lets you use something similar to an SQL ORDER BY clause. It can sort arrays of associative arrays and arrays of objects and I think it would work with some hybrid case.

Example of how the function works:

<?php
$testAry = array(
  array('a' => 1, 'b' => 2, 'c' => 3),
  array('a' => 2, 'b' => 1, 'c' => 3),
  array('a' => 3, 'b' => 2, 'c' => 1),
  array('a' => 1, 'b' => 3, 'c' => 2),
  array('a' => 2, 'b' => 3, 'c' => 1),
  array('a' => 3, 'b' => 1, 'c' => 2)
);

Utility::orderBy($testAry, 'a ASC, b DESC');

//Result:
$testAry = array(
  array('a' => 1, 'b' => 3, 'c' => 2),
  array('a' => 1, 'b' => 2, 'c' => 3),
  array('a' => 2, 'b' => 3, 'c' => 1),
  array('a' => 2, 'b' => 1, 'c' => 3),
  array('a' => 3, 'b' => 2, 'c' => 1),
  array('a' => 3, 'b' => 1, 'c' => 2)
);
?>

To sort an array of objects you would do something like:
Utility::orderBy($objectAry, 'getCreationDate() DESC, getSubOrder() ASC');

This would sort an array of objects that have methods getCreationDate() and getSubOrder().

Here is the function:

<?php
class Utility {
    /*
    * @param array $ary the array we want to sort
    * @param string $clause a string specifying how to sort the array similar to SQL ORDER BY clause
    * @param bool $ascending that default sorts fall back to when no direction is specified
    * @return null
    */
    public static function orderBy(&$ary, $clause, $ascending = true) {
        $clause = str_ireplace('order by', '', $clause);
        $clause = preg_replace('/\s+/', ' ', $clause);
        $keys = explode(',', $clause);
        $dirMap = array('desc' => 1, 'asc' => -1);
        $def = $ascending ? -1 : 1;

        $keyAry = array();
        $dirAry = array();
        foreach($keys as $key) {
            $key = explode(' ', trim($key));
            $keyAry[] = trim($key[0]);
            if(isset($key[1])) {
                $dir = strtolower(trim($key[1]));
                $dirAry[] = $dirMap[$dir] ? $dirMap[$dir] : $def;
            } else {
                $dirAry[] = $def;
            }
        }

        $fnBody = '';
        for($i = count($keyAry) - 1; $i >= 0; $i--) {
            $k = $keyAry[$i];
            $t = $dirAry[$i];
            $f = -1 * $t;
            $aStr = '$a[\''.$k.'\']';
            $bStr = '$b[\''.$k.'\']';
            if(strpos($k, '(') !== false) {
                $aStr = '$a->'.$k;
                $bStr = '$b->'.$k;
            }

            if($fnBody == '') {
                $fnBody .= "if({$aStr} == {$bStr}) { return 0; }\n";
                $fnBody .= "return ({$aStr} < {$bStr}) ? {$t} : {$f};\n";
            } else {
                $fnBody = "if({$aStr} == {$bStr}) {\n" . $fnBody;
                $fnBody .= "}\n";
                $fnBody .= "return ({$aStr} < {$bStr}) ? {$t} : {$f};\n";
            }
        }

        if($fnBody) {
            $sortFn = create_function('$a,$b', $fnBody);
            usort($ary, $sortFn);
        }
    }
}
?>
luke dot semerau at gmail dot com 28-Mar-2009 12:25
If you need to use usort with a key in the calling method, I wrote this as a utility:
<?php

function usort_comparison($obj, $method, $key) {
    $usorter = &new Usort($obj, $method, $key);
    return array($usorter, "sort");
}

class Usort {
    function __construct($obj, $method, $key) {
        $this->obj = $obj;
        $this->method = $method;
        $this->key = $key;
    }
    function sort($a, $b) {
        return call_user_func_array(array($this->obj, $this->method), array($a, $b, $this->key));
    }
}

?>

<?php

require_once("util/usort.php");

class Foo {
    $items = array(FooBar(13), FooBar(2));
    public function sorter() {
        usort($this-items, usort_comparison("Foo", "_cmp", "item"));
    }

    public static function _cmp($a, $b, $key) {
         return strcasecmp($a->$key, $b->$key);
    }

}

class FooBar {
    public $item;
    function __construct($val) {
        $this->item = $val;
    }
}

?>

~ simple example... but in the way I need to use it was the key was used in a switch statement to choose the different member of the object to compare against dynamically (as in, sort by x or y or z)
jalil at measat dot org 28-Dec-2008 05:37
<?php
/*---------------------------------------------------------
* my own home made easy object sort, which
* i cannot find anywhere on the net
* at all, tut. i can find only complicated ones,
* which brings me a headache.
*
* You can enhance it to return all sorts of error
* conditions if you wish,
* i need nothing but a false return upon failure to sort,
* so that is the only error i have here
*
* Example usage:
*
* INPUT                 -       $objects_array
// an array of objects for sorting

* PARAMETERS    -       property
// the property of the object to be sorted

* OUTPUT                -       $engine
// an engine object created by new,
// with your arrays of objects sorted according to your
// selected property
//( the sorting is done upon sort object creation )
*
* Code Examples
*
* $engine = new objSorter($objects_array);
// sorts on FIRST property -  default

* $engine = new objSorter($objects_array,'property');
// sort on ANY specific property
*--------------------------------------------------------*/

class objSorter
{
var $property;
var $sorted;

    function ObjSorter($objects_array,$property=null)
        {
            $sample    = $objects_array[0];
            $vars    = get_object_vars($sample);

        if (isset($property))
            {
            if (isset($sample->$property))
// make sure requested property is correct for the object
                {
                $this->property = $property;
                usort($objects_array, array($this,'_compare'));
                }
            else
                {
                $this->sorted    = false;
                return;
                }
            }
        else
            {
                list($property,$var)     = each($sample);
                $this->property         = $property;
                usort($objects_array, array($this,'_compare'));
            }

        $this->sorted    = ($objects_array);
        }

    function _compare($apple, $orange)
        {
        $property    = $this->property;
        if ($apple->$property == $orange->$property) return 0;
        return ($apple->$property < $orange->$property) ? -1 : 1;
        }
} // end class
?>

USAGE EXAMPLE
DUMP ORIGINAL
user Object ( [name] => Yunihe Jopoba [age] => 27 [richness] => â‚¬ 899,970 )
user Object ( [name] => Janirevi Fakejorumoa [age] => 19 [richness] => â‚¬ 219,078 )
user Object ( [name] => Korejowi Mezede [age] => 95 [richness] => â‚¬ 3,272 )
user Object ( [name] => Nugoaivu Jongyi [age] => 84 [richness] => â‚¬ 94,853 )
user Object ( [name] => Cepomase Buaesukoyua [age] => 32 [richness] => â‚¬ 677,180 )
user Object ( [name] => Vejosehona Auva [age] => 20 [richness] => â‚¬ 144,540 )
user Object ( [name] => Fewame Wojuvuzo [age] => 69 [richness] => â‚¬ 198,231 )
user Object ( [name] => Risuku Zagedobu [age] => 48 [richness] => â‚¬ 763,860 )
user Object ( [name] => Fazurada Aayu [age] => 16 [richness] => â‚¬ 302,352 )

SORTED by age

<?php
$objects                = new ObjSorter($objects_array,'age');
if ($objects->sorted)
{
$objects_array  = $objects->sorted;
foreach ($objects_array as $key=>$object) { print_r($object); echo "<br />"; }
}
?>

user Object ( [name] => Fazurada Aayu [age] => 16 [richness] => â‚¬ 302,352 )
user Object ( [name] => Janirevi Fakejorumoa [age] => 19 [richness] => â‚¬ 219,078 )
user Object ( [name] => Vejosehona Auva [age] => 20 [richness] => â‚¬ 144,540 )
user Object ( [name] => Yunihe Jopoba [age] => 27 [richness] => â‚¬ 899,970 )
user Object ( [name] => Cepomase Buaesukoyua [age] => 32 [richness] => â‚¬ 677,180 )
user Object ( [name] => Risuku Zagedobu [age] => 48 [richness] => â‚¬ 763,860 )
user Object ( [name] => Fewame Wojuvuzo [age] => 69 [richness] => â‚¬ 198,231 )
user Object ( [name] => Nugoaivu Jongyi [age] => 84 [richness] => â‚¬ 94,853 )
user Object ( [name] => Korejowi Mezede [age] => 95 [richness] => â‚¬ 3,272 )

SORTED by richness

<?php
$objects                = new ObjSorter($objects_array,'richness');
if ($objects->sorted)
{
$objects_array  = $objects->sorted;
foreach ($objects_array as $key=>$object) { print_r($object); echo "<br />"; }
}
?>

user Object ( [name] => Vejosehona Auva [age] => 20 [richness] => â‚¬ 144,540 )
user Object ( [name] => Fewame Wojuvuzo [age] => 69 [richness] => â‚¬ 198,231 )
user Object ( [name] => Janirevi Fakejorumoa [age] => 19 [richness] => â‚¬ 219,078 )
user Object ( [name] => Korejowi Mezede [age] => 95 [richness] => â‚¬ 3,272 )
user Object ( [name] => Fazurada Aayu [age] => 16 [richness] => â‚¬ 302,352 )
user Object ( [name] => Cepomase Buaesukoyua [age] => 32 [richness] => â‚¬ 677,180 )
user Object ( [name] => Risuku Zagedobu [age] => 48 [richness] => â‚¬ 763,860 )
user Object ( [name] => Yunihe Jopoba [age] => 27 [richness] => â‚¬ 899,970 )
user Object ( [name] => Nugoaivu Jongyi [age] => 84 [richness] => â‚¬ 94,853 )

Simulated wrong property request ( dumb property )

<?php
$objects                = new ObjSorter($objects_array,'dumb property');
if ($objects->sorted)
{
$objects_array  = $objects->sorted;
foreach ($objects_array as $key=>$object) { print_r($object); echo "<br />"; }
}
else echo 'DUMB ERROR';
?>

DUMB ERROR
drorasta 22-Jun-2008 10:16
Here's how you can usort() a multidimensional array (like in example #2 above) within a class:

<?php usort($myArray, array("className", "cmp")); ?>
Sid_M 05-Nov-2007 05:54
The sample function for having the sort function be a class method has a comment identifying the sorting function as static, however the function does not have the static keyword. In PHP 5 (at least as configured on my server), usort will fail, identifying the method as non-static. Preceding the function keyword with the static keyword fixed the problem.
svenxy AT nospam gmx net 16-Oct-2006 01:58
This will sort subnets correctly:

<?php

$zones =
array('192.168.11',
'192.169.12',
'192.168.13',
'192.167.14',
'192.168.15',
'122.168.16',
'192.168.17'
);

function sort_subnets ($a, $b) {
    $a_arr = explode('.', $a);
    $b_arr = explode('.', $b);
    foreach (range(0,3) as $i) {
        if ( $a_arr[$i] < $b_arr[$i] ) {
            return -1;
        }
        elseif ( $a_arr[$i] > $b_arr[$i] ) {
            return 1;
        }
    }
    return -1;
}

usort($zones, 'sort_subnets');
print '<pre>';
print_r($zones);
print '</pre>';

?>
stephen in koto 05-Apr-2006 10:28
For using usort inside a method in an object, where the callback sort method is in the same object, this works:

<?php usort($arr_to_sort, array($this, "sort_terms_by_criteria")); ?>

If you wish to keep elements in their original or reverse order if they are the same length, just don't return zero for items that compare the same. Return a 1 or -1, as appropriate.
sydney at totoche dot org 16-Jan-2006 01:44
Instead of doing  :

<?php $strc = strcmp( strtolower($a[$f]), strtolower($b[$f]) ); ?>

you could do this :

<?php $strc = strcasecmp( $a[$f], $b[$f] ); ?>

which is more efficient and is does case insensitive comparison according to the current locale.
Jeremy Swinborne 20-Jul-2005 01:56
When I query a DB I usually put my record set inside of a multi-dimentional array.  I finally wrote a program that will allow you to sort your record set by column after you put it in an array.

<?php
$test = array();
$test[0]['name'] = 'jeremy';
$test[0]['email'] = 'lala@example.com';
$test[0]['phone'] = '123-123-1234';
$test[0]['trick'] = 'mezopia';

$test[1]['name'] = 'Amanda';
$test[1]['email'] = 'hot@example.com';
$test[1]['phone'] = '123-123-1235';
$test[1]['trick'] = 'youarecool';

$test[2]['name'] = 'john';
$test[2]['email'] = 'wowee@example.com';
$test[2]['phone'] = '123-123-3333';
$test[2]['trick'] = 'goneinanhour';

print_r(columnSort($test, 'name'));

function columnSort($unsorted, $column) {
    $sorted = $unsorted;
    for ($i=0; $i < sizeof($sorted)-1; $i++) {
      for ($j=0; $j<sizeof($sorted)-1-$i; $j++)
        if ($sorted[$j][$column] > $sorted[$j+1][$column]) {
          $tmp = $sorted[$j];
          $sorted[$j] = $sorted[$j+1];
          $sorted[$j+1] = $tmp;
      }
    }
    return $sorted;
}
?>
dmhouse at gmail dot com 19-Jul-2005 02:09
The easiest way to compare two integers is just to take the second away from the first. For example, say you wanted to sort by an integer property of an object. Your comparison function would look like this:

<?php
function compare_counts($a, $b) {
  return $a->count - $b->count;
}
?>

This works because you don't necessarily have to return -1, 0 or 1, the manual states any integer less than, equal to or greater than 0 is OK.
Raveler at telenet dot be 20-May-2004 10:02
The array_alternate_multisort function written by robert below doesn't work. There are several bugs in the code and it doesn't work when sorting by multiple keys because the order of the first key isn't taken into account when sorting by the second key and so on. Also, because robert uses strcasecmp the algorithm doesn't work properly with floats or other variable types. Here's the improved version:

<?php
    function SortArray() {
        $arguments = func_get_args();
        $array = $arguments[0];
        $code = '';
        for ($c = 1; $c < count($arguments); $c += 2) {
            if (in_array($arguments[$c + 1], array("ASC", "DESC"))) {
                $code .= 'if ($a["'.$arguments[$c].'"] != $b["'.$arguments[$c].'"]) {';
                if ($arguments[$c + 1] == "ASC") {
                    $code .= 'return ($a["'.$arguments[$c].'"] < $b["'.$arguments[$c].'"] ? -1 : 1); }';
                }
                else {
                    $code .= 'return ($a["'.$arguments[$c].'"] < $b["'.$arguments[$c].'"] ? 1 : -1); }';
                }
            }
        }
        $code .= 'return 0;';
        $compare = create_function('$a,$b', $code);
        usort($array, $compare);
        return $array;
    }
?>
sreid at sea-to-sky dot net 07-Jan-2004 08:22
As the manual says, "If two members compare as equal, their order in the sorted array is undefined." This means that the sort used is not "stable" and may change the order of elements that compare equal.

Sometimes you really do need a stable sort. For example, if you sort a list by one field, then sort it again by another field, but don't want to lose the ordering from the previous field. In that case it is better to use usort with a comparison function that takes both fields into account, but if you can't do that then use the function below. It is a merge sort, which is guaranteed O(n*log(n)) complexity, which means it stays reasonably fast even when you use larger lists (unlike bubblesort and insertion sort, which are O(n^2)).

<?php
function mergesort(&$array, $cmp_function = 'strcmp') {
    // Arrays of size < 2 require no action.
    if (count($array) < 2) return;
    // Split the array in half
    $halfway = count($array) / 2;
    $array1 = array_slice($array, 0, $halfway);
    $array2 = array_slice($array, $halfway);
    // Recurse to sort the two halves
    mergesort($array1, $cmp_function);
    mergesort($array2, $cmp_function);
    // If all of $array1 is <= all of $array2, just append them.
    if (call_user_func($cmp_function, end($array1), $array2[0]) < 1) {
        $array = array_merge($array1, $array2);
        return;
    }
    // Merge the two sorted arrays into a single sorted array
    $array = array();
    $ptr1 = $ptr2 = 0;
    while ($ptr1 < count($array1) && $ptr2 < count($array2)) {
        if (call_user_func($cmp_function, $array1[$ptr1], $array2[$ptr2]) < 1) {
            $array[] = $array1[$ptr1++];
        }
        else {
            $array[] = $array2[$ptr2++];
        }
    }
    // Merge the remainder
    while ($ptr1 < count($array1)) $array[] = $array1[$ptr1++];
    while ($ptr2 < count($array2)) $array[] = $array2[$ptr2++];
    return;
}
?>
skrebbel at operamail dot com 27-Mar-2003 01:59
here's another recursive multisort, however a clean and fast one that is class-based (but works as well outside classes) and does not uglify your global namespace at all. note that strnatcmp is used, but one could use something else of course.

btw, for arrays in which the rows/columns are 'swapped', use array_multisort().

<?php
class Banana {
    var $aData;//the array we want to sort.
    var $aSortkeys;//the order in which we want the array to be sorted.
    function _sortcmp($a, $b, $i=0) {
        $r = strnatcmp($a[$this->aSortkeys[$i]],$b[$this->aSortkeys[$i]]);
        if($r==0) {
            $i++;
            if ($this->aSortkeys[$i]) $r = $this->_sortcmp($a, $b, $i+1);
        }
        return $r;
    }
    function sort() {
        if(count($this->aSortkeys)) {
            usort($this->aData,array($this,"_sortcmp"));
        }
    }
}
$B = new Banana;
$B->aData = array(
    array("name" => "hank", "headsize" => "big", "age" => 32),
    array("name" => "frank", "headsize" => "huge", "age" => 36)
);
$B->aSortkeys = array("age","name");
$B->sort();

?>
sorry for the ugly indenting, but i couldn't get it any better in this note adder thing.
mkr at binarywerks dot dk 20-Sep-2002 09:29
If you want to sort an array according to another array acting as a priority list, you can use this function.

<?php
function listcmp($a, $b)
{
  global $order;

  foreach($order as $key => $value)
    {
      if($a==$value)
        {
          return 0;
          break;
        }

      if($b==$value)
        {
          return 1;
          break;
        }
    }
}

$order[0] = "first";
$order[1] = "second";
$order[2] = "third";

$array[0] = "second";
$array[1] = "first";
$array[2] = "third";
$array[3] = "fourth";
$array[4] = "second";
$array[5] = "first";
$array[6] = "second";

usort($array, "listcmp");

print_r($array);
?>
prozac at iguanasoft dot com 15-Jul-2002 05:55
Here is a simple example of converting a timestamp date("U") into a date. This sorts by that day and then by string value alphabetically.

I hope it saves someone some time... Happy PHP'in!

<?php
//data to sort
$shared[0]["page_id"] = "2025731470";
$shared[1]["page_id"] = "2025731450";
$shared[2]["page_id"] = "1025731456";
$shared[3]["page_id"] = "1025731460";
$shared[0]["username"] = "larry";
$shared[1]["username"] = "alvin";
$shared[2]["username"] = "garth";
$shared[3]["username"] = "harvy";

//function to convert timestamp to date
function convert_timestamp($timestamp){
    $limit=date("U");
    $limiting=$timestamp-$limit;
    return date ("Ymd", mktime (0,0,$limiting));
}
//comparison function
function cmp ($a, $b) {
    $l=convert_timestamp($a["page_id"]);
    $k=convert_timestamp($b["page_id"]);
    if($k==$l){
        return strcmp($a["username"], $b["username"]);
    }else{
        return strcmp($k, $l);
    }
}

//sort array
usort($shared, "cmp");

//display sorted info
while (list ($key, $value) = each ($shared)) {
    echo "\$shared[$key]: ";
    echo $value["page_id"];
    echo " username: ";
    echo $value["username"];
    echo "<break_tag>";
}
?>

This will output:
$shared[0]: 2025731450   username: alvin
$shared[1]: 2025731470   username: larry
$shared[2]: 1025731456   username: garth
$shared[3]: 1025731460   username: harvy
alex at netflex dot nl 02-Jul-2002 04:10
This function will sort on more then one values, test and have fun

<pre>
<?php

  $array[0]['name'] = "a";
  $array[0]['id'] = 3;

  $array[1]['name'] = "a";
  $array[1]['id'] = 2;

  $array[2]['name'] = "a";
  $array[2]['id'] = 5;

  $array[3]['name'] = "b";
  $array[3]['id'] = 8;

  $array[4]['name'] = "b";
  $array[4]['id'] = 1;

  $array[5]['name'] = "b";
  $array[5]['id'] = 0;

  $array[6]['name'] = "c";
  $array[6]['id'] = 5;

  $array[7]['name'] = "c";
  $array[7]['id'] = 7;

  $array[8]['name'] = "c";
  $array[8]['id'] = 3;

  print_r($array);

  $sort_array[0]['name'] = "name";
  $sort_array[0]['sort'] = "ASC";
  $sort_array[0]['case'] = TRUE;

  $sort_array[1]['name'] = "id";
  $sort_array[1]['case'] = FALSE;

  sortx($array, $sort_array);

  print_r($array);

  function sortx(&$array, $sort = array()) {
    $function = '';
    while (list($key) = each($sort)) {
      if (isset($sort[$key]['case'])&&($sort[$key]['case'] == TRUE)) {
        $function .= 'if (strtolower($a["' . $sort[$key]['name'] . '"])<>strtolower($b["' . $sort[$key]['name'] . '"])) { return (strtolower($a["' . $sort[$key]['name'] . '"]) ';
      } else {
        $function .= 'if ($a["' . $sort[$key]['name'] . '"]<>$b["' . $sort[$key]['name'] . '"]) { return ($a["' . $sort[$key]['name'] . '"] ';
      }
      if (isset($sort[$key]['sort'])&&($sort[$key]['sort'] == "DESC")) {
        $function .= '<';
      } else {
        $function .= '>';
      }
      if (isset($sort[$key]['case'])&&($sort[$key]['case'] == TRUE)) {
        $function .= ' strtolower($b["' . $sort[$key]['name'] . '"])) ? 1 : -1; } else';
      } else {
        $function .= ' $b["' . $sort[$key]['name'] . '"]) ? 1 : -1; } else';
      }
    }
    $function .= ' { return 0; }';
    usort($array, create_function('$a, $b', $function));
  }

?>
</pre>
josh at wintelcom dot net 24-Aug-2001 06:58
This lets you sort an associative multi-dimensional array by multiple key/field names.  Much similiar to the SQL clause ORDER BY.  Enjoy.

<?php
function cmp ($a, $b) {

    // Populate this array with your values...
    // Below is the SQL equivalent of
    // select * from blah ORDER BY date desc, type asc, name asc

    $vals = array(
        'date' => 'd',
        'type' => 'a',
        'name' => 'a'
    );

    while(list($key, $val) = each($vals)) {

        if($val == "d") {
            if ($a["$key"] > $b["$key"]) {
                return -1;
            }
            if ($a["$key"] < $b["$key"]) {
                return 1;
            }
        }

        if($val == "a") {
            if ($a["$key"] < $b["$key"]) {
                return -1;
            }
            if($a["$key"] > $b["$key"]) {
                return 1;
            }
        }

    }

}
?>
franky at iname dot com 17-Jul-2001 03:08
For sort multi-array by specific index

<?php
function cmp ($a, $b)
{
 global $w_o;
 if ($a[$w_o] == $b[$w_o]) return 0;
 return ($a[$w_o] < $b[$w_o]) ? -1 : 1;
}
# the index is the second element of
# each row

$w_o =1;
usort($my_arry_info,"cmp");
?>
bo at erichsen dot com 20-Mar-2001 05:16
when using usort to refer to a function inside a class i have succesfully used:

<?php usort($myarray,array($this,"cmp")); ?>
derek at luddite dot net 18-Sep-2000 11:35
Needed a date sort and I didn't know if one was available so I wrote one. Maybe it'll help someone:

<?php
function DateSort($a,$b,$d="-") {
    if ($a == $b) {
        return 0;
    } else {  //Convert into dates and compare
        list($am,$ad,$ay)=split($d,$a);
        list($bm,$bd,$by)=split($d,$b);
        if (mktime(0,0,0,$am,$ad,$ay) < mktime(0,0,0,$bm,$bd,$by)) {
            return -1;
        } else {
            return 1;
        }
    }
}
?>

$d is the delimeter


Les Classes/Objets

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Exemples
  • Fonctions Classes/Objets
    • __autoload — Tente de charger une classe indéfinie
    • class_alias — Crée un alias de classe
    • class_exists — Vérifie si une classe a été définie
    • get_called_class — Le nom de la classe en "Late Static Binding"
    • get_class_methods — Retourne les noms des méthodes d'une classe
    • get_class_vars — Retourne les valeurs par défaut des propriétés d'une classe
    • get_class — Retourne le nom de la classe d'un objet
    • get_declared_classes — Liste toutes les classes définies dans PHP
    • get_declared_interfaces — Retourne un tableau avec toutes les interfaces déclarées
    • get_declared_traits — Retourne un tableau contenant tous les traits déclarés
    • get_object_vars — Retourne les propriétés d'un objet
    • get_parent_class — Retourne le nom de la classe parente d'un objet
    • interface_exists — Vérifie si une interface a été définie
    • is_a — Vérifie si l'objet est une instance d'une classe donnée ou a cette classe parmi ses parents
    • is_subclass_of — Détermine si un objet est une sous-classe d'une classe donnée ou l'implémente
    • method_exists — Vérifie si la méthode existe pour une classe
    • property_exists — Vérifie si un objet ou une classe possède une propriété
    • trait_exists — Vérifie si un trait existe

User Contributed Notes

There are no user contributed notes for this page.


Introduction

Ces fonctions vous permettent d'obtenir des informations à propos de classes et d'instances d'objets. Vous pouvez obtenir le nom de la classe à laquelle un objet appartient, ainsi que ses propriétés et méthodes membres. En utilisant ces fonctions, vous pouvez retrouver non seulement la classe d'un objet, mais aussi son héritage (autrement dit, quelle classe est étendue par la classe de l'objet).

Veuillez vous reporter à la section sur les objets du manuel pour avoir des explications détaillées sur la façon dont sont implémentés les classes et les objets en PHP.

User Contributed Notes

There are no user contributed notes for this page.


Exemples

Dans cet exemple, nous commençons par définir une classe de base ainsi qu'une extension de cette classe. La classe de base décrit un légume, s'il peut être consommé, et qu'elle est sa couleur. La sous-classe Spinach ajoute une méthode pour le cuisiner, et une autre pour déterminer s'il est cuit.

Exemple #1 classes.inc

<?php

// classe de base, avec des propriétés et des méthodes membres
class Vegetable {

   var $edible;
   var $color;

   function __construct($edible, $color="green")
   {
       $this->edible = $edible;
       $this->color = $color;
   }

   function is_edible()
   {
       return $this->edible;
   }

   function what_color()
   {
       return $this->color;
   }
} // fin de la classe Vegetable

// étend la classe de base
class Spinach extends Vegetable {

   var $cooked = false;

   function __construct()
   {
       parent::__construct(true, "green");
   }

   function cook_it()
   {
       $this->cooked = true;
   }

   function is_cooked()
   {
       return $this->cooked;
   }
} // fin de la classe Spinach

?>

Nous créons ensuite deux objets depuis ces classes et affichons des informations sur ceux-ci, incluant leur classe parente. Nous définissons également des fonctions utilitaires, principalement afin d'obtenir un affichage plus joli des variables.

Exemple #2 test_script.php

<pre>
<?php

include "classes.inc";

// fonctions utilitaires

function print_vars($obj)
{
foreach (get_object_vars($obj) as $prop => $val) {
    echo "\t$prop = $val\n";
}
}

function print_methods($obj)
{
$arr = get_class_methods(get_class($obj));
foreach ($arr as $method) {
    echo "\tfonction $method()\n";
}
}

function class_parentage($obj, $class)
{
if (is_subclass_of($GLOBALS[$obj], $class)) {
    echo "L'objet $obj appartient à la classe " . get_class($GLOBALS[$obj]);
    echo ", une sous-classe de $class\n";
} else {
    echo "L'object $obj n'appartient pas à une sous-classe $class\n";
}
}

// instanciation de 2 objets

$veggie = new Vegetable(true, "blue");
$leafy = new Spinach();

// Affiche des informations à propos des objets
echo "veggie: CLASS " . get_class($veggie) . "\n";
echo "leafy: CLASS " . get_class($leafy);
echo ", PARENT " . get_parent_class($leafy) . "\n";

// affichage de la propriété veggie
echo "\nveggie: Propriétés\n";
print_vars($veggie);

// et enfin, les méthodes
echo "\nleafy: Méthodes\n";
print_methods($leafy);

echo "\nClasse parente :\n";
class_parentage("leafy", "Spinach");
class_parentage("leafy", "Vegetable");
?>
</pre>

Une chose importante à noter dans l'exemple ci-dessus est que l'objet $leafy est une instance de la classe Spinach qui est une sous-classe de Vegetable, donc la dernière partie de ce script affichera :

   [...]
Classe parente :
L'object leafy n'appartient pas à la sous-classe Spinach
L'object leafy appartient à la classe spinach, une sous-classe de Vegetable

User Contributed Notes

There are no user contributed notes for this page.


Fonctions Classes/Objets

Sommaire

  • __autoload — Tente de charger une classe indéfinie
  • class_alias — Crée un alias de classe
  • class_exists — Vérifie si une classe a été définie
  • get_called_class — Le nom de la classe en "Late Static Binding"
  • get_class_methods — Retourne les noms des méthodes d'une classe
  • get_class_vars — Retourne les valeurs par défaut des propriétés d'une classe
  • get_class — Retourne le nom de la classe d'un objet
  • get_declared_classes — Liste toutes les classes définies dans PHP
  • get_declared_interfaces — Retourne un tableau avec toutes les interfaces déclarées
  • get_declared_traits — Retourne un tableau contenant tous les traits déclarés
  • get_object_vars — Retourne les propriétés d'un objet
  • get_parent_class — Retourne le nom de la classe parente d'un objet
  • interface_exists — Vérifie si une interface a été définie
  • is_a — Vérifie si l'objet est une instance d'une classe donnée ou a cette classe parmi ses parents
  • is_subclass_of — Détermine si un objet est une sous-classe d'une classe donnée ou l'implémente
  • method_exists — Vérifie si la méthode existe pour une classe
  • property_exists — Vérifie si un objet ou une classe possède une propriété
  • trait_exists — Vérifie si un trait existe

User Contributed Notes

Skydev 05-Jan-2011 11:40
A small function that allows finding all references to the object. Written in 3 minutes and may be buggy (for ex pass object as reference in some places?)

<?php
function find_ref_obj($object, $obj, $path) {
    if (in_array($obj,$GLOBALS['__REF_CHECKED'],true))
        return false;
    $GLOBALS['__REF_CHECKED'][]=$obj;
    $r = array();
    foreach ((array)$obj as $k => $v) {
        if ($v === $object)
            $r[] = $path . "->$k";
        if (is_object($v)) {
            $t = find_ref_obj($object,$v,$path . "->$k");
            if ($t!==false)
                $r=array_merge($r,$t);
        }
        else if (is_array($v)) {
            $t = find_ref_arr($object,$v,$path . "->$k");
            if ($t!==false)
                $r=array_merge($r,$t);
        }
    }
    if (empty($r))
        return false;
    else
        return $r;
}
function find_ref_arr($object, $arr, $path) {
    if (in_array($arr,$GLOBALS['__REF_CHECKED'],true))
        return false;
    $GLOBALS['__REF_CHECKED'][]=$arr;
    $r = array();
    foreach ($arr as $k => $v) {
        if ($v === $object)
            $r[] = $path . "['$k']";
        if (is_object($v)) {
            $t = find_ref_obj($object,$v,$path . "['$k']");
            if ($t!==false)
                $r=array_merge($r,$t);
        }
        else if (is_array($v)) {
            $t = find_ref_arr($object,$v,$path . "['$k']");
            if ($t!==false)
                $r=array_merge($r,$t);
        }
    }
    if (empty($r))
        return false;
    else
        return $r;
}
function find_references($object) {
    $r = array();
    $GLOBALS['__REF_CHECKED']=array();
    foreach ($GLOBALS as $n => $v)
    if ($n!='__REF_CHECKED')
    if ($n!='GLOBALS') {
        if ($v === $object)
            $r[]=$n;
        if (is_object($v)) {
            $t = find_ref_obj($object,$v,$n);
            if ($t!==false)
                $r=array_merge($r,$t);
        }
        else if (is_array($v)) {
            $t = find_ref_arr($object,$v,$n);
            if ($t!==false)
                $r=array_merge($r,$t);
        }
    }
    unset($GLOBALS['__REF_CHECKED']);
    return $r;
}

function find_refs($object) {
    return implode(', ',find_references($object));
}
?>
Dennis 01-Jul-2010 04:04
We have an array with many objects in a style like

<?php

$step = new StepModel(1); // if the StepModel id is "1"
$demand = $step->getDemand(); // returns DemandModel
$step2 = $demand->getCustomer(); // returns StepModel
$demand2 = $step2->getDemand(); // returns DemandModel

// [ ... ]

?>

$step and $step2 can be the same objects. So we have an recursive array. Now we need to know if $step == $step2 or $step === $step2. In other words: We need to know the php internal resource ids.

Because there is no function in php api, we made the following function.

Be careful: In our case, all objects have as first attribute ["id":protected]. If your objects are different from this, you need to edit $pattern.

Warning: function is very slow and should only be called if it's necessary for debugging reasons:

<?php

/**
 * returns resource- and object-ids of all objects in an array
 *
 * @param array $array
 * @return array
 */
function getObjectInformation(Array $array)
{
    // start output-buffering
    ob_start();

    // create an var_dump of $array
    var_dump($array);

    // save the dump in var $dump
    $dump = ob_get_contents();

    // clean the output-buffer
    ob_end_clean();

    // delete white-spaces
    $dump = str_replace(' ', '', $dump);

    // define the regex-pattern
    // in our case, all objects look like this:
    //
    // object(ClassName)#1(1){
    // ["id":protected]=>
    // string(1)"1"
    $pattern  = '/object\(([a-zA-Z0-9]+)\)#([0-9]+)\([0-9]+\){\\n';
    $pattern .= '\["id":protected\]=>\\n';
    $pattern .= 'string\([0-9]+\)"([v]?[0-9]+)"/im';

    // search for all matches
    preg_match_all($pattern, $dump, $regs);

    // sort all mathes by class name, object id and then resource id
    array_multisort($regs[1], SORT_ASC, SORT_STRING,
                    $regs[3], SORT_ASC, SORT_NUMERIC,
                    $regs[2], SORT_ASC, SORT_NUMERIC);

    // cache the last match
    $lastMatch = array();

    // the return value
    $return = array();

    // loop through the matches
    for ($i = 0; $i < sizeof($regs[0]); $i ++) {

        // check if the current match was not visited before
        if (0 == sizeof($lastMatch) ||
            $regs[1][$i] != $lastMatch[1] ||
            $regs[2][$i] != $lastMatch[2] ||
            $regs[3][$i] != $lastMatch[3]) {

            // save the match in return value
            array_push($return, array($regs[1][$i],
                                      $regs[2][$i],
                                      $regs[3][$i]));
        }

        // save match in last match cache
        $lastMatch[1] = $regs[1][$i];
        $lastMatch[2] = $regs[2][$i];
        $lastMatch[3] = $regs[3][$i];
    }

    // return all matches
    return $return;
}

?>

I know, it's not that elegant but I hope it's useful for a few people.
ahigerd at timeips dot com 20-Dec-2007 07:02
To access an object member with an illegal character in the name, use this syntax:

$obj->{'illegal-property:name()'}

This is particularly relevant with the dynamically-generated classes used by, for instance, database objects and the SoapClient class.
pascal dot poncet at netconsult dot com 13-Oct-2005 07:21
Subject: using "sql_calc_found_rows" in a MySQL query while exploiting result in a PHP db class object.

Hello,

There is a nice function in MySQL that allows to know how many records would have been returned if no "where" clause were set : SQL_CALC_FOUND_ROWS.

If you have create a db object to collect the returned lines, you will be a little perplex when trying to call the result of this function.

Why ?
Simply because the returned field's name is "found_rows()" and obviously it's not possible to call something like :

<?php $result->found_rows() ?>

...as it will try to acces a method, not a property !

Then, the only way to get the right result seems to be the use of a class function, like :

<?php
  $db->query("select found_rows()");
  $count=current(get_object_vars(current($db->result)));
?>

Of course, if somebody found an other way to solve it, like a special syntax (see the one used with curled arrays in a string), I'm really open to discuss.

Good luck,
Pascal
ia [AT] zoznam [DOT] sk 02-Aug-2005 10:55
as for zabmilenko's solution:
wouldn't it be better to create it this way?

<?php
// The base class for all db classes
class DB {
 protected $connectId;
}

// Class for MySQL, which extends base class
class MySQL extends DB {
 function connect () {
  $this->connectId = mysql_connect (...);
 }
}

// Class for PostgreSQL, which extends base class
class pgSQL extends DB {
 function connect () {
  $this->connectId = pg_connect (...);
 }
}

// and then call constructor like this:
$dbName = "MySQL";
$db = new $dbName ( ... );
// ... which creates an object of class MySQL
?>
zabmilenko at hotmail dot com 27-Jun-2005 12:08
((PHP5))

I wanted to dynamically choose an extender for a class.  This took awhile of playing with it but I came up with a solution.  Note that I can't verify how safe it is, but it appears to work for me.  Perhaps someone else can shed light on the details:

<?php

class A { var $value = "Class A\n"; }
class B { var $value = "Class B\n"; }

// Uncomment which extender you want.  You can use variables as well.
// define('__EXTENDER__', 'A');
   define('__EXTENDER__', 'B');

// Use eval to create a wrapper class.
eval('class EXTENDER extends '. __EXTENDER__ . ' { }');

class C extends EXTENDER
{
  function __construct()
  {
     echo $this->value;
  }
}

$t = new C;

?>

Outputs:   Class B

Practical application:  I have a database abstraction system that has individual classes for mysql, pgsql, et al.  I want to be able to create a global db class that extends one of the individual db classes depending on the application configuration.

I know that there are probably much better ways of doing this but I haven't reached that level when it comes to classes.
cjones 03-Mar-2005 01:27
If anyone is interested in looking for a way to dynamically load existing objects into a class, here is what I found very useful.

//---------------------------------------------------------
// Dynamically load External Objects into a class

  function objRef ( &$obj ) {
    eval("\$this->obj_".get_class($obj)." = \$obj;");
  }
//---------------------------------------------------------
// Reference by using: $this->obj_[object Name]->[var|f{}]

Example:

class date {  function date ( ) { $this->date = "March 3rd"; } }
class time {  function time ( ) { $this->time = "12:30pm"; } }

class show {
    function objRef ( &$obj ){
        eval("\$this->obj_".get_class($obj)." = \$obj;");
    }
   function test ( $var ){
       echo "$var".$this->obj_date->date." @ ".$this->obj_time->time;
   }
}

$date = new date;
$time = new time;
$show = new show;
    $show->objRef($date);
    $show->objRef($time);
    $show->test("Time Now => ");

// Output: Time Now => March 3rd @ 12:30pm

I found the prefix 'obj_' before the class name useful because it helped me to automatically identify external object references when scanning through my scripts. You can omit this if you want. Hope this helps someone.
http://sc.tri-bit.com/ StoneCypher 02-Mar-2005 10:25
to covertka at muohio dot edu and pillepop2003 at yahoo dot de:

There's a much easier solution to getting a class' name for working with a factory function.  Let's assume you're doing something like this:

<?php

  function FactoryFunction($whatever, $instancedata) {

    switch ($whatever) {
      case 'stuff'      : return new Stuff($instancedata);
      case 'otherstuff' : return new Otherstuff($instancedata);
    }

  }

?>

Now, consider the named parameter idiom and remember that PHP uses hashes for everything; as a result make the following changes:

<?php

  function FactoryFunction($whatever, $instancedata) {

    switch ($whatever) {

      case 'stuff'      : return array('typeis'=>'stuff',      'instance'=>new Stuff($instancedata));
      case 'otherstuff' : return array('typeis'=>'otherstuff', 'instance'=>new Otherstuff($instancedata));

    }

  }

?>

Nice 'n simple.  It seems that what the original poster wanted was something like C++ static data members; unfortunately as PHP4 has no static variables at all, there would need to be significant language change to support static-like behavior.  If you move to PHP5, the static keyword solves your problem cleanly.
covertka at muohio dot edu 02-Jan-2005 05:27
To pillepop2003 at yahoo dot de:

I have the same issue.  I have a base class that manages database tasks for a number of child classes.  One of the functions in the base class is a find() method that returns instances of the child classes.  Since find() is usually called as a static method, it needs to know the name of the child class.  As you've found, this appears to be impossible to get in an easy fashion.

The only way I've found to get the child class name is to use the debug_traceback() function.  This requires me to have a find() method in every child class, but it does work.

Here's an example:

<?php
  require_once("Application.php");

  class parentClass {
    function find() {
      $className = NULL;
      foreach (debug_backtrace() as $bt) {
        if ($bt['function'] == __FUNCTION__) {
          $className = $bt['class'];
        }
      }

      // here should be some code to find the proper id, let's assume it was id 1
      $id = 1;
      return new $className($id);
    }
  }

  class foo extends parentClass {
    function __construct($id) {
      $this->id = id;
    }

    function find() {
      return parent::find();
    }
  }

  class bar extends parentClass {
    function __construct($id) {
      $this->id = id;
    }

    function find() {
      return parent::find();
    }
  }

  $a = foo::find();
  printf("Type for \$a: %s<br/>\n", get_class($a));
  $b = bar::find();
  printf("Type for \$b: %s<br/>\n", get_class($b));
?>
iparanoid at gmx dot de 04-Aug-2004 11:17
To pillepop2003 at yahoo dot de:

It seems to me if there really is no nice way to get the class name in an un-instanciated class, there is a workaround in PHP5 though using static/class variables.

Example:

<?php

class myFoo
{
    static $__ClassName = __CLASS__;

    static function getClassName()
    {
        return myFoo::$__ClassName;
    }
};

class myFooExtended extends myFoo
{
    function __construct()
    {
        myFooExtended::$__ClassName = __CLASS__;
    };
};

?>

However, you'll need to have at least instanciated an object of the class myFooExtended before calling getClassName or introduce some other initialization (the class variable will need to be set at some point to __CLASS__ in the sub-class).
greg at doutromundo dot com 05-Jul-2004 07:58
As programmers, you're probably more organized than me, but, I do try and maintain some order in my classes and codes and separate them in "packages" as in java.
This helped me keep them organized but caused havok when trying to use them, so what I did was to create a class that handles the loading of classes (which I instanciate in all pages) along with my error handling class all bundled up. This way, I can load my classes with a command similar to
$baseClass->loadClass("package","className"[,"constructor"]);

the function responsible for this has some checking to see if they are loaded and stuff like that...

function loadClass($packageName,$className,$constructor=""){
  // if you dont have a constructor declare any function inside
  // the class
  if ($constructor==""){
    $constructor=$className;
  }
  if(!is_callable(array($className,$constructor))){
    if (defined("CLASS_DIR")){
      $pkg = CLASS_DIR.$packageName."/";
        if (is_dir($pkg)){
          // we have a directory with the package name
          $cls = $pkg.$className.".class.php";
          if(is_file($cls)){
            // we have a file
            include_once($cls);
          }else{
            die("Class <b>$className</b> could not be found in package <b>$packageName</b> , please check your instalation");
          }
        }else{
          die("Package <b>$packageName</b> could not be found, please check your instalation");
        }
      }
    }
}

Just remember to define CLASS_DIR as the physical path for the directories where you packages are...

Hope this comes in handy...

Here's an example of a diretory strucutre...
/var/www/classes/   <- this would be CLASS_DIR
in there I have:
package1/
     name.class.php
     name2.class.php
....

The loadClass would look like: loadClass("package1","name");

Cute and easy
ettinger at consultant dot com 18-Jun-2004 04:59
Re: Looking for an uninstantiated class

# Loads data from a table into a class object
class LFPDataFactory extends LFPObject {
        var $object;
        var $class;
        var $table;
        function LFPDataFactory($args) {
                $this->unpackArgs($args); // assigns locals from $args
                if (in_array(strtolower($this->class), get_declared_classes())) {
                        $this->object = new $this->class;
                        // assemble the columns in the table...
                        // select their values and put them in our new object...
                } else { trigger_error("Class ".$this->class." not found", E_USER_ERROR); }
        }
}
$r = new LFPDataFactory("class=LFPLayout,table=layout");
$new_obj = $r->object; // this is a LFPLayout object.
print_r($new_obj);

This class looks to see if the class exists, then instantiates it -- a declared class is not the same as an instantiated class. As long as LFPLayout exists somewhere in the scripts, get_declared_classes() will find it. Remember strtolower on compare, however.

Why would I do this? Because I have my class layouts the same as their respective tables; the factory then selects the data (making sure that the variables match) and plugs in the data. (I've left out the actual code to do the selection/insertion).
HOC 28-May-2004 09:40
to pillepop2003

Why do u want to know the classname of an non-existant object?

The only possible explanation for this question seems to me u want to know the class before u instantiate the object. Well, this is of no use since u always instantiate a class of ur choice.

When the class is instantiated into an object u can find the class of the object by means of get_class(). This is all u need. In case of inheritance u can use get_class($this) to get the class of the instantiated object. Now u can differentiate according to which class the object belongs to.

e.g.:

<?php
class A{
   function A(){
      $class_of_this = get_class($this);
      echo 'Object is an instance of class '.$class_of_this.' which is the ';
      if(strcmp($class_of_this,'A')==0)
         echo 'parent-class';
      else if(strcmp($class_of_this,'B')==0)
         echo 'child-class';
      echo ".\n";
   }
}

class B extends A{
   function B(){
      $this->A();
   }
}

$object1 = new A();
$object2 = new B();
?>

When u run this code-snippet the output will be:

Object is an instance of class A which is the parent-class.
Object is an instance of class B which is the child-class.
ar at 5mm de 28-Aug-2003 07:59
I missed some kind of function to dynamicly override or extend an Object:

-----------------------------------------
function &extendObj(&$obj, $code) {
    static $num = 0;

    $classname = get_class($obj);
    $newclass = $classname.$num;

    eval('class '.$newclass.' extends '.$classname.' { '.$code.' }');

    $newobj = new $newclass();

    $vars = get_class_vars($classname);
    foreach($vars AS $key=>$value) {
        $newobj->$key = &$obj->$key;
    }

    return $newobj;
}
-----------------------------------------

This creates a new class which extends the old one by the given code parameter, instanciates it and copy all vars from the old obj to the new one.

-----------------------------------------
class testA {
    var $prop = 'a';

    function funcA($val) {
        $this->prop = $val;
    }

    function value() {
        return $this->prop;
    }
}

$obj = new testA();

$newobj = &extendObj(&$obj, 'function addX() { $this->prop .= "x"; }');

$newobj->funcA('abc');
$newobj->addX();
echo $newobj->value();
-----------------------------------------

Results in 'abcx'. You can use the function multiple times and also with class variables. Be carefull, even if $newobj is just a copy of $obj, $obj->value() will return 'abcx', too, because of the & operator: $newobj->$key = &$obj->$key;
zidsu at hotmail dot com 08-Jul-2003 05:24
FYI: if you want to split your class into manageble chunks, what means different files for you, you can put you functoins into includes, and make include() have a return value. Like this:

class Some_class {
  var $value = 3;
  function add_value ($input_param) {
    return include ("path/some_file.php");
  }
}

And your included file:

$input_param += $this->value;
return $input_param;

Then your function call will be:

$instance = new Some_class ();
$instance->add_value (3);

And this will return
6
hopefully :P

Keep in mind though, that the scope in the included file will be identical to the scope the function 'add_value' has.
And if you want to return the outcome, you should also have a return statement made in your include as well.
asommer*at*as-media.com 20-Sep-2002 02:52
Something I found out just now that comes in very handy for my current project:

it is possible to have a class override itself in any method ( including the constructor ) like this:

class a {

..function ha ( ) {
....if ( $some_expr ) {
......$this = new b;
......return $this->ha ( );
....}
....return $something;
..}

}

in this case assuming that class b is already defined and also has the method ha ( )

note that the code after the statement to override itself is still executed but now applies to the new class

i did not find any information about this behaviour anywhere, so i have no clue wether this is supposed to be like this and if it might change... but it opens a few possibilities in flexible scripting!!
einhverfr at not-this-host dot hotmail dot com 14-Sep-2002 12:35
You may find it helpful in complex projects to have namespaces for your classes, and arrange these in a hierarchical manner.   A simple way to do this is to use the filesystem to order your hierarchies and then define a function like this:

function use_namespace($namespace){

require_once("namespaces/$namespace.obj.php");

}

(lack of indentation due to HTML UI for this page)
This requires that all your object libraries end in .obj.php (which I use) but you can modfy it to suit your needs.  To call it you could, for exmaple call:

use_namespace("example");
or if foo is part of example you can call:
use_namespace("example/foo");
justin at quadmyre dot com 19-Aug-2002 09:38
If you want to be able to call an instance of a class from within another class, all you need to do is store a reference to the external class as a property of the local class (can use the constructor to pass this to the class), then call the external method like this:

$this->classref->memberfunction($vars);

or if the double '->' is too freaky for you, how about:

$ref=&$this->classref;
$ref->memberfunction($vars);

This is handy if you write something like a general SQL class that you want member functions in other classes to be able to use, but want to keep namespaces separate. Hope that helps someone.

Justin

Example:

<?php

class class1 {
    function test($var) {
        $result = $var + 2;
        return $result;
    }
}

class class2{
    var $ref_to_class=''; # to be pointer to other class

    function class1(&$ref){ #constructor
        $this->ref_to_class=$ref; #save ref to other class as property of this class
    }

    function test2($var){
        $val = $this->ref_to_class->test($var); #call other class using ref
        return $val;
    }
}

$obj1=new class1;
# obj1 is instantiated.
$obj2=new class2($obj1);
# pass ref to obj1 when instantiating obj2

$var=5;
$result=obj2->test2($var);
# call method in obj2, which calls method in obj1
echo ($result);

?>
gateschris at yahoo dot com 08-Mar-2001 01:59
[Editor's note: If you are trying to do overriding, then you can just interrogate (perhaps in the method itself) about what class (get_class()) the object belongs to, or if it is a subclass of a particular root class.

You can alway refer to the parent overriden method, see the "Classes and Objects" page of the manual and comments/editor's notes therein.]

There is no function to determine if a member belongs to a base class or current class eg:

<?php
class foo {
 function foo () { }
 function a () { }
}

class bar extends foo {
 function bar () { }
 function a () { }
}

lala = new Bar();
?>
------------------
how do we find programmatically if member a now belongs to class Bar or Foo.


Tente de charger une classe indéfinie

  • « Fonctions Classes/Objets
  • class_alias »
  • PHP Manual
  • Fonctions Classes/Objets
  • Tente de charger une classe indéfinie

__autoload

(PHP 5, PHP 7)

__autoload — Tente de charger une classe indéfinie

Avertissement

Cette fonctionnalité est OBSOLÈTE à partir de PHP 7.2.0 et a été SUPPRIMÉE à partir de PHP 8.0.0.

Description

__autoload ( string $class ) : void

Vous pouvez définir cette fonction pour activer le chargement automatique des classes.

Liste de paramètres

class

Nom de la classe à charger.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • spl_autoload_register() - Enregistre une fonction en tant qu'implémentation de __autoload()

User Contributed Notes

sham dot hrm at gmail dot com 14-Mar-2021 06:18
We you create an object of the class and If the PHP engine doesn't find the class file included in the script then __autoload() magic method will automatically trigger.

You can implement it as given below example:

<?PHP
function __autoload($ClassName)
{
    include($ClassName.".php");
}
$obj = new Base;
?>
ohcc at 163 dot com 29-Nov-2017 05:51
In PHP 7.2, this code will trigger a "
Deprecated: __autoload() is deprecated, use spl_autoload_register() instead in path\to\file.php on line *" error although the spl_autoload_register function really really exists.
<?php
    if(!function_exists('spl_autoload_register')){
        function __autoload($class){
            // blah blah blah
        }
    }
?>
dagirovdjamal at gmail dot com 02-Aug-2017 09:13
Simple autoload :

function __autoload($class_name){
            require 'class/' . $class_name . '.php';
}
Jose G 04-Dec-2014 08:29
You should use include() or require() inside __autoload()
instead of include_once() or require_once().

If you reach __autoload(), then you know the file with the class definition has not been loaded yet.

include() and require() are more efficient than include_once() and require_once().
romi 29-Jun-2014 11:16
<?php
    if(!function_exists('classAutoLoader')){
        function classAutoLoader($class){
            $class=strtolower($class);
            $classFile=$_SERVER['DOCUMENT_ROOT'].'/include/class/'.$class.'.class.php';
            if(is_file($classFile)&&!class_exists($class)) include $classFile;
        }//You have to give the class name and not the class's path for the first parameter in the class_exists()
    }
    spl_autoload_register('classAutoLoader');
?>
Ben 26-Mar-2014 05:56
Guys, this document ( i mean __autoload() ) not mentioned one special situation: if you both use __autoload() and spl_autoload_register(), the __autoload() function will never to be called. Although spl_autoload_register() documentation explained why, i decide to wrote this in case some one get confused and waste all day to figure out why.

Here is some code to verify above:

<?php
function __autoload($class) {
}

function my_loader() {
}

function your_loader() {
}

var_dump ( spl_autoload_functions () );
echo '<br/>';

spl_autoload_register ( 'my_loader' );
spl_autoload_register ( 'your_loader' );

var_dump ( spl_autoload_functions () );
ohcc at 163 dot com 08-Dec-2013 07:12
It is highly recommended not to use the __autoload() function any more. Now the spl_autoload_register() function is what you should consider.Sorry for the mistake in line 6 of my previous note. And below is the corrected PHP code.
<?php
    if(!function_exists('classAutoLoader')){
        function classAutoLoader($class){
            $class=strtolower($class);
            $classFile=$_SERVER['DOCUMENT_ROOT'].'/include/class/'.$class.'.class.php';
            if(is_file($classFile)&&!class_exists($class)) include $classFile;
        }
    }
    spl_autoload_register('classAutoLoader');
?>
ohcc at 163 dot com 07-Dec-2013 06:28
It is highly recommended not to use the __autoload() function any more. Now the spl_autoload_register() function is what you should consider.
<?php
    if(!function_exists('classAutoLoader')){
        function classAutoLoader($class){
            $class=strtolower($class);
            $classFile=$_SERVER['DOCUMENT_ROOT'].'/include/class/'.$class.'.class.php';
            if(is_file($classFile)&&!class_exists($classFile)) include $classFile;
        }
    }
    spl_autoload_register('classAutoLoader');
?>
eragroove at gmail dot com 10-Jul-2013 05:48
If you can keep file name and class name as same, it will be good programming practice. It helps to __autoload function to load file without checking any condition.

function __autoload($class){
  require_once( $class.".php");
}
wojciech.fornal@gmail,com 07-Jun-2013 11:56
keyboardSmasher

You may or may not be right as the file name doesn't necessarily have to reflect a class name it contains (but it's usually considered a good practice). It isn't always a straightforward mapping (look at some PHP frameworks and autoload implementations).

File myBar.php may contain the class:

class Bar {
}

or it even contain the class:

class Foo {
}

Best regards
keyboardSmasher 16-Apr-2013 07:45
qeremy, your code is incorrect.

<?php
include_once("./myClass.php");
include_once("./myFoo.php");
include_once("./myBar.php");

$obj = new myClass();
$foo = new Foo();
$bar = new Bar();
?>

<?php
$foo = new Foo();
$bar = new Bar();
?>

should be:

<?php
$foo = new myFoo();
$bar = new myBar();
?>
qeremy 08-Mar-2012 03:01
Even I have never been using this function, just a simple example in order to explain it;

./myClass.php
<?php
class myClass {
    public function __construct() {
        echo "myClass init'ed successfuly!!!";
    }
}
?>

./index.php
<?php
// we've writen this code where we need
function __autoload($classname) {
    $filename = "./". $classname .".php";
    include_once($filename);
}

// we've called a class ***
$obj = new myClass();
?>

*** At this line, our "./myClass.php" will be included! This is the magic that we're wondering... And you get this result "myClass init'ed successfuly!!!".

So, if you call a class that named as myClass then a file will be included myClass.php if it exists (if not you get an include error normally). If you call Foo, Foo.php will be included, and so on...

And you don't need some code like this anymore;

<?php
include_once("./myClass.php");
include_once("./myFoo.php");
include_once("./myBar.php");

$obj = new myClass();
$foo = new Foo();
$bar = new Bar();
?>

Your class files will be included "automatically" when you call (init) them without these functions: "include, include_once, require, require_once".


Crée un alias de classe

  • « __autoload
  • class_exists »
  • PHP Manual
  • Fonctions Classes/Objets
  • Crée un alias de classe

class_alias

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

class_alias — Crée un alias de classe

Description

class_alias ( string $original , string $alias , bool $autoload = true ) : bool

Crée un alias appelé alias basé sur une classe original définie par l'utilisateur. L'alias est en tous points similaire à la classe originale.

Liste de paramètres

original

La classe originale.

alias

Le nom de l'alias de la classe.

autoload

Si l'on doit charger automatiquement si la classe originale n'est pas trouvée.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec class_alias()

<?php

class foo { }

class_alias('foo', 'bar');

$a = new foo;
$b = new bar;

// les objets sont les mêmes
var_dump($a == $b, $a === $b);
var_dump($a instanceof $b);

// les classes sont les mêmes
var_dump($a instanceof foo);
var_dump($a instanceof bar);

var_dump($b instanceof foo);
var_dump($b instanceof bar);

?>

L'exemple ci-dessus va afficher :

bool(true)
bool(false)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)

Voir aussi

  • get_parent_class() - Retourne le nom de la classe parente d'un objet
  • is_subclass_of() - Détermine si un objet est une sous-classe d'une classe donnée ou l'implémente

User Contributed Notes

Anonymous 16-Oct-2020 06:48
Check is alias:
<?php
/**
 * @param string $class Class name
 * @return bool
 */
function is_alias(string $class): bool
{
    return $class !== (new ReflectionClass($class))->name;
}
?>
Get class aliases:
<?php
/**
 * @param string $class Class name
 * @param bool $throw Throw exception at error?
 * @return string[]|null Aliases or null at error in silent mode
 * @throws InvalidArgumentException Class not exists or it's alias
 */
function get_class_aliases(string $class, bool $throw = false): ?array
{
    /**
     * @var array An array of defined classes: keys - classes, values - aliases
     */
    static $classes = [];
    // check: class exists
    if (! class_exists($class, true)) {
        if ($throw) {
            throw new InvalidArgumentException('Class ' . $class . ' not exists');
        }
        return null;
    }
    // refresh list
    $newClasses = array_diff(get_declared_classes(), array_keys($classes));
    if ($newClasses) {
        $abc = range('a', 'z');
        foreach ($newClasses as $newClass) {
            // fast check first char: class_alias() convert alias to lower case
            if (in_array($newClass[0], $abc, true)) {
                $realClass = (new ReflectionClass($newClass))->getName();
                $classes[$newClass] = $newClass !== $realClass ? $realClass : null;
            } else {
                $classes[$newClass] = null;
            }
        }
        unset($abc, $newClasses);
    }
    // check: is alias?
    if (! empty($classes[$class])) {
        if ($throw) {
            throw new InvalidArgumentException($class . ' is alias for class ' . $classes[$class]);
        }
        return null;
    }
    // find aliases
    return array_keys($classes, $class, true);
}
?>
Usage:
<?php
class Foo {}
class_alias('Foo', 'Bar');
class_alias('Bar', 'Baz');
$aliases = get_class_aliases('Foo', true); // ['bar', 'baz']
?>
info at ensostudio dot ru 03-Oct-2020 07:30
Note: this function set alias for user classes, you can't use something like this
<?php
class_alias('ArrayObject', 'ArrObj');
?>
elliseproduction at gmail dot com 29-Apr-2020 12:09
You can add a alias inside a class :

<?php

class foo{

    function __construct(){

        echo('yes!');

    }
}

class bar {

    function __construct(){

        class_alias('foo', 'fooAlias');

    }

    function test(){

        new fooAlias;

    }

}

$bar=new bar;

$bar->test(); // yes!
Hayley Watson 12-Jun-2018 01:55
The alias really is an alias for the existing class. It's not a new class of any kind - whether by inheritance or otherwise; it doesn't just look and behave exactly like the existing class; it really is the same class.

<?php

class foo
{
    public static $count = 0;
}

class_alias('foo', 'bar');

bar::$count++;

echo foo::$count; // Output: 1

echo get_class(new Bar); // Output: foo
?>
Note in the last line there that aliases are just as case-insensitive as "genuine" class names.
sofe2038 at gmail dot com 07-Jan-2017 04:06
Doesn't work with coupled classes when used along with autoloading.

For example, in these classes where each class is autoloaded in a separate class file:

Foo.php:

<?php
interface Foo{
  public function fx(Bar $bar);
}
?>

Bar2.php:

<?php
class Bar2 implements Foo{
  public function fx(Bar2 $bar){
    // some implementation code here
  }
}
?>

Bar.php:

<?php
class_alias("Bar2", "Bar");
?>

When used with an autoloader like this:

<?php
spl_autoload_register(function($class){
  require($class . ".php");
});
new Bar;
?>

Results in fatal error:

    Declaration of Bar2::fx(Bar2 $bar) must be compatible with Foo::fx(Bar $bar) in ~/Bar2.php on line 2
sofe2038 at gmail dot com 07-Jan-2017 04:06
Doesn't work with coupled classes when used along with autoloading.

For example, in these classes where each class is autoloaded in a separate class file:

Foo.php:

<?php
interface Foo{
  public function fx(Bar $bar);
}
?>

Bar2.php:

<?php
class Bar2 implements Foo{
  public function fx(Bar2 $bar){
    // some implementation code here
  }
}
?>

Bar.php:

<?php
class_alias("Bar2", "Bar");
?>

When used with an autoloader like this:

<?php
spl_autoload_register(function($class){
  require($class . ".php");
});
new Bar;
?>

Results in fatal error:

    Declaration of Bar2::fx(Bar2 $bar) must be compatible with Foo::fx(Bar $bar) in ~/Bar2.php on line 2
robsonvnasc at gmail dot com 22-Sep-2016 03:30
It also works with Traits!

<?php
trait Foo {}
class_alias("Foo","Bar");
echo trait_exists("Bar") ? 'yes' : 'no';
?>
//yes
stanislav dot eckert at vizson dot de 14-Sep-2015 07:00
class_alias() creates aliases only for user defined classes, not for classes supplied by PHP (PHP will show the warning "First argument of class_alias() must be a name of user defined class"). To create aliases for every kind of classes, use namespaces:

<?php

// Does not work
class_alias("ZipArchive", "myZip");

// Creates class alias "myZip" of class "ZipArchive"
use \ZipArchive as myZip;

?>
petar dot karan dot pk at gmail dot com 06-Feb-2014 02:19
If you need the same function in PHP version < 5.3 you can use this

<?php
function class_alias($original,$alias) {
    $newclass = create_function('','class '.$alias.' extends '.$original.' {}');
    $newclass();
}
?>
mweierophinney at gmail dot com 06-Mar-2013 02:05
class_alias() gives you the ability to do conditional imports.

Whereas the following will not work:

<?php
namespace Component;

if (version_compare(PHP_VERSION, '5.4.0', 'gte')) {
    use My\ArrayObject;
} else {
    use ArrayObject;
}

class Container extends ArrayObject
{
}
?>

the following, using class_alias, will:

<?php
namespace Component;

if (version_compare(PHP_VERSION, '5.4.0', 'lt')) {
    class_alias('My\ArrayObject', 'Component\ArrayObject');
} else {
    class_alias('ArrayObject', 'Component\ArrayObject');
}

class Container extends ArrayObject
{
}
?>

The semantics are slightly different (I'm now indicating that Container extends from an ArrayObject implementation in the same namespace), but the overall idea is the same: conditional imports.
sergey dot karavay at gmail dot com 25-Feb-2013 11:08
At first, you might wonder that:
<?php class A {}; class_alias('A', 'B'); ?>

is equivalent to:
<?php class A {}; class B extends A {}; ?>

class_alias is NOT equivalent to class extending! Private methods/properties are unseen in child classes, but in alias classes they are.
Anonymous 12-Feb-2013 05:42
Like class_alias but for functions:

<?php
function function_alias ($original, $alias) {

  $args = func_get_args();
  assert('count($args) == 2', 'function_alias() require exactly two arguments');
  assert('is_string($original) && is_string($alias)', 'function_alias() require string arguments');

  // valid function name - http://php.net/manual/en/functions.user-defined.php
  assert('preg_match(\'/^[a-zA-Z_\x7f-\xff][\\\\\\\\a-zA-Z0-9_\x7f-\xff]*$/\', $original) > 0',
    "'$original' is not a valid function name");
  assert('preg_match(\'/^[a-zA-Z_\x7f-\xff][\\\\\\\\a-zA-Z0-9_\x7f-\xff]*$/\', $alias) > 0',
    "'$alias' is not a valid function name");

  $aliasNamespace = substr($alias, 0, strrpos($alias, '\\') !== false ? strrpos($alias, '\\') : 0);
  $aliasName = substr($alias, strrpos($alias, '\\') !== false ? strrpos($alias, '\\') + 1 : 0);
  $serializedOriginal = var_export($original, true);

  eval("
    namespace $aliasNamespace {
      function $aliasName () {
        return call_user_func_array($serializedOriginal, func_get_args());
      }
    }
  ");

}

?>

Until hopefully function_alias is added to php...
adam at adamhahn dot com 06-Sep-2011 12:13
Something to note,

If the $original class has not yet been defined or loaded, the auto loader will be invoked in order to try and load it.

If the class for which you are trying to create an alias does not exist, or can not be loaded with the auto loader, you will generate a PHP Warning.
programmer-comfreek at hotmail dot com 15-Aug-2011 09:38
If you defined the class 'original' in a namespace, you will have to specify the namespace(s), too:
<?php
namespace ns1\ns2\ns3;

class A {}

class_alias('ns1\ns2\ns3\A', 'B');
/* or if you want B to exist in ns1\ns2\ns3 */
class_alias('ns1\ns2\ns3\A', 'ns1\ns2\ns3\B');
?>
nicolas dot grekas+php at gmail dot com 31-Dec-2010 01:09
At first, you might wonder that:
<?php class A {}; class_alias('A', 'B'); ?>

is equivalent to:
<?php class A {}; class B extends A {}; ?>

BUT when derivation creates a new class name - that means, you can then instantiate a new kind of objects - aliasing is just what it says: a synonym, so objects instantiated with the aliased name are of the exact same kind of objects instantiated with the non-aliased name.

See this code for example:
<?php
class A {};
class B1 extends A {};
class_alias('A', 'B2');

$b1 = new B1; echo get_class($b1); // prints B1
$b2 = new B2; echo get_class($b2); // prints A !
?>
nicolas dot grekas+php at gmail dot com 30-Dec-2010 02:41
class_alias also works for interfaces!

<?php
interface foo {}
class_alias('foo', 'bar');
echo interface_exists('bar') ? 'yes!' : 'no'; // prints yes!
?>


Vérifie si une classe a été définie

  • « class_alias
  • get_called_class »
  • PHP Manual
  • Fonctions Classes/Objets
  • Vérifie si une classe a été définie

class_exists

(PHP 4, PHP 5, PHP 7, PHP 8)

class_exists — Vérifie si une classe a été définie

Description

class_exists ( string $class_name , bool $autoload = true ) : bool

Cette fonction vérifie si une classe donnée a été définie.

Liste de paramètres

class_name

Le nom de la classe. Il est recherché de manière insensible à la casse.

autoload

Si l'on doit appeler __autoload ou non par défaut.

Valeurs de retour

Retourne true si class_name est une classe définie, false sinon.

Exemples

Exemple #1 Exemple avec class_exists()

<?php
// Vérifie que la classe existe avant de l'utiliser
if (class_exists('MyClass')) {
    $myclass = new MyClass();
}

?>

Exemple #2 Exemple avec le paramètre autoload

<?php
function __autoload($class)
{
    include($class . '.php');

    // Vérifie si l'include a déclaré la classe
    if (!class_exists($class, false)) {
        trigger_error("Impossible de charger la classe : $class", E_USER_WARNING);
    }
}

if (class_exists('MyClass')) {
    $myclass = new MyClass();
}

?>

Voir aussi

  • function_exists() - Indique si une fonction est définie
  • interface_exists() - Vérifie si une interface a été définie
  • get_declared_classes() - Liste toutes les classes définies dans PHP

User Contributed Notes

info at ensostudio dot ru 16-Sep-2020 06:54
Note: class_exists() check only classes!
<?php
interface DemoInterface {};
var_dump(class_exists('DemoInterface')); // false
trait DemoTrait {};
var_dump(class_exists('DemoTrait')); // false
class DemoClass {};
var_dump(class_exists('DemoClass')); // true
?>

Common function:
<?php
/**
  * Checks if the class/trait/interface has been defined.
  *
  * @param string $name The case-insensitive name of class/trait/interface
  * @param bool $autoload Whether to call spl_autoload()
  * @return bool
  */
function structure_exists(string $name, bool $autoload = true): bool
{
       return class_exists($name, $autoload)
              || interface_exists($name, $autoload)
              || trait_exists($name, $autoload);
}
?>
rn at alpha9marketing dot com 06-Apr-2014 05:55
Beware: class_exists is case-INsensitive, as is class instantiation.

php > var_dump(class_exists("DomNode"));
bool(true)
php > var_dump(class_exists("DOMNode"));
bool(true)
php > var_dump(class_exists("DOMNodE"));
bool(true)
php > $x = new DOMNOdE();
php > var_dump(get_class($x));
string(7) "DOMNode"

(tested with PHP 5.5.10 on Linux)

This can cause some headaches in correlating class names to file names, especially on a case-sensitive file system.
spam at wikicms dot org 09-Dec-2013 02:43
Hi guys!
Be careful  and don't forget about second boolean argument $autoload (TRUE by default) when check exists class after spl_autoload_register. Propose short example
file second.php
<?php
class Second {}
?>
file index.php
<?php
class First
{
    function first($class, $bool) {
        spl_autoload_register( function($class) {
            require strtolower($class) . '.php';
        });
        echo class_exists($class, $bool)?'Exist!!!!':'Not exist!';
    }
}

new First($class = 'Second', $bool = true); //Exist!!!!
new First($class = 'Second', $bool = false); //Not exist!
?>
Because __autoload executing much earlier than boolean returned, imho..
giunta dot gaetano at gmail dot com 31-Oct-2013 05:28
If you are using aliasing to import namespaced classes, take care that class_exists will not work using the short, aliased class name - apparently whenever a class name is used as string, only the full-namespace version can be used

use a\namespaced\classname as coolclass;

class_exists( 'coolclass' ) => false
toocoolone at gmail dot com 14-Feb-2012 06:47
I'm running PHP 5.3.4 on Windows 7 and had some difficulty autoloading classes using class_exists(). In my case, when I checked for the class and it didn't exist, class_exists automatically threw a system Exception. I was also throwing my own exception resulting in an uncaught exception.

<?php
/**
 * Set my include path here
 */
$include_path = array( '/include/this/dir', '/include/this/one/too' );
set_include_path( $include_path );
spl_autoload_register();
/**
 * Assuming I have my own custom exception handler (MyException) let's
 * try to see if a file exists.
 */
try {
    if( ! file_exists( 'myfile.php' ) ) {
        throw new MyException('Doh!');
    }
    include( 'myfile.php' );
}
catch( MyException $e ) {
    echo $e->getMessage();
}
/**
 * The above code either includes myfile.php or throws the new MyException
 * as expected. No problem right? The same should be true of class_exists(),
 * right? So then...
 */
$classname = 'NonExistentClass';
try {
    if( ! class_exists( $classname ) ) {
        throw new MyException('Double Doh!');
    }
    $var = new $classname();
}
catch( MyException $e ) {
    echo $e->getMessage();
}
/**
* Should throw a new instance of MyException. But instead I get an
* uncaught LogicException blah blah blah for the default Exception
* class AND MyException. I only catch MyException so we've got on
* uncaught resulting in the dreaded LogicException error.
*/
?>

By registering an additional autoload handler function that did nothing, I was able to stop throwing the extra Exception and only throw my own.

<?php
/**
 * Set my include path here
 */
$include_path = array( '/include/this/dir', '/include/this/one/too' );
set_include_path( $include_path );
spl_autoload_register();
spl_autoload_register( 'myAutoLoad' ); // Add these two and no worries...
function myAutoLoad() {}
/**
 * By registering the additional custom autoload function that does nothing
 * class_exists() returns only boolean and does NOT throw an uncaught Exception
 */
?>

Found this buried in some search results. I don't remember the page URL but if it would have been here it might have saved me some time!
Klaus 28-Apr-2010 04:21
If you recursively load several classes inside an autoload function (or mix manual loading and autoloading), be aware that class_exists() (as well as get_declared_classes()) does not know about classes previously loaded during the *current* autoload invocation.

Apparently, the internal list of declared classes is only updated after the autoload function is completed.
azrael dot com at gmail dot com 11-Dec-2008 04:14
If spl_autoload_register() had been called, then function will try autoload class if it does not exists.

Use instead
<?php
in_array($class_name, get_declared_classes());
?>
richard at richard-sumilang dot com 27-Mar-2008 12:56
[ >= PHP 5.3]

If you are checking if a class exists that is in a specific namespace then you have to pass in the full path to the class:

echo (class_exists("com::richardsumilang::common::MyClass")) ? "Yes" : "No";
anonymous at somewhere dot tld 17-Jul-2003 12:20
If you have a directory of classes you want to create. (Modules in my instance)... you can do it like that

<?php
if (is_dir($this->MODULE_PATH) && $dh = opendir($this->MODULE_PATH)) {
   while (($file = readdir($dh)) !== false) {
      if (preg_match("/(Mod[a-zA-Z0-9]+).php/", $file, $matches)>0) {
         // include and create the class
         require_once($this->MODULE_PATH."/".$file);
         $modules[] = new $matches[1]();
      }
   }
} else {
   exit;
}
?>

//---
Here the rule is that all modules are on the form
ModModulename.php and that the class has the same name as the file.
The $modules array has all the classes initialized after this code


Le nom de la classe en "Late Static Binding"

  • « class_exists
  • get_class_methods »
  • PHP Manual
  • Fonctions Classes/Objets
  • Le nom de la classe en "Late Static Binding"

get_called_class

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

get_called_class — Le nom de la classe en "Late Static Binding"

Description

get_called_class ( ) : string

Retourne le nom de la classe depuis laquelle une méthode statique a été appelée, tel que le Late State Binding le détermine.

Valeurs de retour

Retourne le nom de la classe. Retourne false si appelée depuis l'extérieur d'une classe.

Exemples

Exemple #1 Exemple avec get_called_class()

<?php

class foo {
    static public function test() {
        var_dump(get_called_class());
    }
}

class bar extends foo {
}

foo::test();
bar::test();

?>

L'exemple ci-dessus va afficher :

string(3) "foo"
string(3) "bar"

Voir aussi

  • get_parent_class() - Retourne le nom de la classe parente d'un objet
  • get_class() - Retourne le nom de la classe d'un objet
  • is_subclass_of() - Détermine si un objet est une sous-classe d'une classe donnée ou l'implémente

User Contributed Notes

amcolin at 126 dot com 24-Mar-2020 07:08
namespace root;
class Factor {
    protected static $instance = null;

    private function __construct() {

    }

    public static function getInstance() {
        if (!self::$instance) {
            $name           = get_called_class();
            self::$instance = new $name();
        }

        return self::$instance;
    }
}

namespace admin\test;

use root\Factor;

class Single extends Factor {
    public function abc() {
        return 'abc';
    }
}

namespace index;

use admin\test\Single;

class Index {
    public function get() {
        return Single::getInstance();
    }
}

$index = new Index();
var_dump($index->get());

The result is:

object(admin\test\Single)#2 (0) {
}
fantomx1 at gmail dot com 12-Sep-2017 03:57
When calling dynamic method statically in php 5.6 (under 7) it allows it, but it doesnt work, it incorrectly evaluates class that called our subject class, therefore containing method must be static.
Safak Ozpinar 24-Sep-2014 07:00
As of PHP 5.5 you can also use "static::class" to get the name of the called class.

<?php
class Bar {
    public static function test() {
        var_dump(static::class);
    }
}

class Foo extends Bar {

}

Foo::test();
Bar::test();
?>

Output:

string(3) "Foo"
string(3) "Bar"
luc at s dot illi dot be 05-Feb-2013 03:09
get_called_class() in closure-scopes:

<?PHP
    ABSTRACT CLASS Base
    {
        protected static $stub = ['baz'];

        //final public function boot()
        static public function boot()
        {
            print __METHOD__.'-> '.get_called_class().PHP_EOL;

            array_walk(static::$stub, function()
            {
                print __METHOD__.'-> '.get_called_class().PHP_EOL;
            });
        }

        public function __construct()
        {
            self::boot();
            print __METHOD__.'-> '.get_called_class().PHP_EOL;

            array_walk(static::$stub, function()
            {
                print __METHOD__.'-> '.get_called_class().PHP_EOL;
            });
        }
    }

    CLASS Sub EXTENDS Base
    {
    }

    // static boot
        Base::boot(); print PHP_EOL;
            // Base::boot        -> Base
            // Base::{closure}    -> Base

        Sub::boot(); print PHP_EOL;
            // Base::boot        -> Sub
            // Base::{closure}    -> Base

        new sub;
            // Base::boot        -> Sub
            // Base::{closure}    -> Base
            // Base->__construct    -> Sub
            // Base->{closure}    -> Sub

    // instance boot
        new sub;
            // Base->boot        -> Sub
            // Base->{closure}    -> Sub
            // Base->__construct    -> Sub
            // Base->{closure}    -> Sub
?>
uebele 06-Apr-2011 09:14
SEE: http://php.net/manual/en/language.oop5.late-static-bindings.php

I think it is worth mentioning on this page, that many uses of the value returned by get_called_function() could be handled with the new use of the old keyword static, as in
<?php
static::$foo;
?>

versus
<?php
$that=get_called_class();
$that::$foo;
?>

I had been using $that:: as my conventional replacement for self:: until my googling landed me the url above.  I have replaced all uses of $that with static with success both as
<?php
static::$foo; //and...
new static();
?>

Since static:: is listed with the limitation: "Another difference is that static:: can only refer to static properties." one may still need to use a $that:: to call static functions; though I have not yet needed this semantic.
Abhi Beckert 28-Oct-2009 08:41
Beware that this does not behave as expected if your method is not declared as static! For example:

<?php

class foo {
  static public function test() {
    var_dump(get_called_class());
  }

  public function testTwo() {
    var_dump(get_called_class());
  }
}

class bar extends foo {
}

class abc {
  function test() {
    foo::test();
    bar::test();
  }

  function testTwo() {
    foo::testTwo();
    bar::testTwo();
  }
}

echo "basic\n";
foo::test();
bar::test();

echo "basic without static declaration\n";
foo::testTwo();
bar::testTwo();

echo "in a class\n";
$abc = new abc();
$abc->test();

echo "in a class without static declaration\n";
$abc->testTwo();

?>

The result is:

basic
string 'foo'
string 'bar'

basic without static declaration
string 'foo'
string 'bar'

in a class
string 'foo'
string 'bar'

in a class without static declaration
string 'abc'
string 'abc'
php at itronic dot at 07-Aug-2009 06:53
If you call a static getInstance() function to create a instance of a class from another class, this function have to be static, if it is not static the original name of the caller class and not of the current class get returned.

example:

<?php

class a {
  function getXName() {
     return x::getClassName();
  }
  function getXStaticName() {
     return x::getStaticClassName();
  }

}

class b extends a {
}

class x {
  public function getClassName() {
    return get_called_class();
  }
  public static function getStaticClassName() {
    return get_called_class();
  }
}

$a = new a();

$b = new b();

echo $a->getXName(); // will return "a"
echo $b->getXName(); // will return "b"

echo $a->getXStaticName(); // will return "x"
echo $b->getXStaticName(); // will return "x"

?>
a dot cudbard-bell at sussex dot ac dot uk 21-Feb-2009 10:03
Here's a simple way of getting the inheritance tree of a class, no matter which class the function was actually defined in. Will work as a static function method too.

<?php
class A {
    public function get_class_tree(){
        $cur_class = get_called_class();
        do {
            echo $cur_class;
        }
        while($cur_class = get_parent_class($cur_class));
    }
}

class B {

}

class C {

}

$foo = new C();
$foo->get_class_tree();

?>

CBA
danbettles at yahoo dot co dot uk 08-Oct-2008 12:00
It is possible to write a completely self-contained Singleton base class in PHP 5.3 using get_called_class.

<?php

abstract class Singleton {

    protected function __construct() {
    }

    final public static function getInstance() {
        static $aoInstance = array();

        $calledClassName = get_called_class();

        if (! isset ($aoInstance[$calledClassName])) {
            $aoInstance[$calledClassName] = new $calledClassName();
        }

        return $aoInstance[$calledClassName];
    }

    final private function __clone() {
    }
}

class DatabaseConnection extends Singleton {

    protected $connection;

    protected function __construct() {
        // @todo Connect to the database
    }

    public function __destruct() {
        // @todo Drop the connection to the database
    }
}

$oDbConn = new DatabaseConnection();  // Fatal error

$oDbConn = DatabaseConnection::getInstance();  // Returns single instance
?>


Retourne les noms des méthodes d'une classe

  • « get_called_class
  • get_class_vars »
  • PHP Manual
  • Fonctions Classes/Objets
  • Retourne les noms des méthodes d'une classe

get_class_methods

(PHP 4, PHP 5, PHP 7, PHP 8)

get_class_methods — Retourne les noms des méthodes d'une classe

Description

get_class_methods ( mixed $class_name ) : array

Retourne les noms des méthodes d'une classe.

Liste de paramètres

class_name

Le nom de la classe ou une instance d'objet

Valeurs de retour

Retourne un tableau contenant les noms des méthodes de la classe class_name. En cas d'erreur, null est retourné.

Exemples

Exemple #1 Exemple avec get_class_methods()

<?php

class myclass {
    // constructeur
    function __construct()
    {
        return(true);
    }

    // méthode 1
    function myfunc1()
    {
        return(true);
    }

    // méthode 2
    function myfunc2()
    {
        return(true);
    }
}

$class_methods = get_class_methods('myclass');
// ou
$class_methods = get_class_methods(new myclass());

foreach ($class_methods as $method_name) {
    echo "$method_name\n";
}

?>

L'exemple ci-dessus va afficher :

myclass
myfunc1
myfunc2

Voir aussi

  • get_class() - Retourne le nom de la classe d'un objet
  • get_class_vars() - Retourne les valeurs par défaut des propriétés d'une classe
  • get_object_vars() - Retourne les propriétés d'un objet

User Contributed Notes

iarias at loyalia dot es 21-Feb-2018 12:19
If you only need the methods declared by the class, and not the parent classes ones, you can do something like:

$declared_methods = array_diff(get_class_methods($class), get_class_methods(get_parent_class($class)));
polarglow06 at gmail dot com 18-Nov-2015 06:09
I have created a very simple test runner using this function

function get_bar($text) {
    $bar = "";
    for($i=1; $i<=strlen($text); $i++) {
        $bar .= "=";
    }
    return $bar;
}
class Tester {
    function __construct() {
        $this->run_tests();
    }
    // run the tests
    function run_tests() {
        print("Tester by Minhajul Anwar \n");
        $class = get_class($this);
        $test_methods = preg_grep('/^test/', get_class_methods($this));
        foreach($test_methods as $method) {
            $start_rep = "test: $class::$method";
            $bar = get_bar($start_rep);
            print("\n$start_rep\n$bar\n");
            $this->$method();
            print("\n");
        }
    }
}

now you just need to write your test class with tegst methods prefixed by 'test', and then just instantiate object of that test class of your, all those tests methods will get run automatically
The drawback is: your test methods must not accept any arguments

an example:
require '../autoload.php';
register_autoload_paths(realpath('./'));

class Test_Test extends Tester {
    function test_something() {
        print("method got executed");
    }
    function testAnotherThing() {
    print("another test method");
    }
}

$Test = new Test_Test();
fschmengler at sgh-it dot eu 08-Jan-2010 04:40
It should be noted that the returned methods are dependant on the current scope. See this example:

<?php
class C
{
    private function privateMethod()
    {

    }
    public function publicMethod()
    {

    }
    public function __construct()
    {
        echo '$this:';
        var_dump(get_class_methods($this));
        echo 'C (inside class):';
        var_dump(get_class_methods('C'));
    }
}
$c = new C;
echo '$c:';
var_dump(get_class_methods($c));
echo 'C (outside class):';
var_dump(get_class_methods('C'));
?>

Output:

$this:
array
  0 => string 'privateMethod' (length=13)
  1 => string 'publicMethod' (length=12)
  2 => string '__construct' (length=11)

C (inside class):
array
  0 => string 'privateMethod' (length=13)
  1 => string 'publicMethod' (length=12)
  2 => string '__construct' (length=11)

$c:
array
  0 => string 'publicMethod' (length=12)
  1 => string '__construct' (length=11)

C (outside class):
array
  0 => string 'publicMethod' (length=12)
  1 => string '__construct' (length=11)
php at stock-consulting dot com 06-Feb-2007 02:40
Note that this function will answer both class AND instance methods ("class methods" are called "static" in PHP). Sort of a little "trap" for people who have in-depth experience with the OO terminology :-)
BoD 15-Mar-2006 07:09
!Concerning PHP5 Only!

If you want to get all methods/functions from a class you can do this with the get_class_methods function.
<?php
    $arrMethodNames = get_class_methods ( $ClassNameOrObject);
?>
However the drawback on this function in PHP5 is that you will NOT receive protected and private methods of a class/object if you are calling the method from another class/object context.

If you want to receive all methods of a given Class in another Class you should use the PHP5 Reflection API. The following source allows to retrieve all methods from a derived class in its (abstract) Base Class.

In the example you need to call the base constructor from the derived classes constructor in order to let the base class know the name of the derived class. Use the "__CLASS__" definition for passing the classname of current class to its base class.

<?php

    // Base Class - Abstract
    abstract class A {

        // Array of ReflectionMethod Objects
        // is being set upon instanciation
        // derived Classes don't need to know about this array
        private $arrMethods;

        // Constructor which MUST be called from derived Class Constructor
        protected function __construct ( $strDerivedClassName ) {
            $oRefl = new ReflectionClass ( $strDerivedClassName );
            if ( is_object($oRefl) ) {
                $this->arrMethods = $oRefl->getMethods();
            }
        }

        // Some abstract function
        abstract protected function D ();

        // Some private function
        private function E() {
        }

        // method to print all class/object methods
        // must be callable from derived classes
        // can be protected if only for internal class use
        public function PrintAllMethods () {
            foreach ( $this->arrMethods as $curReflectionMethod ) {
                echo $curReflectionMethod->getName()."<br>";
            }
        }
    }

    // Derived Class
    class B extends A {

        // Constructor for this class
        // MUST call Base Constructor
        public function __construct () {
            // Call Base Constructor
            parent::__construct(__CLASS__);
        }

        // Some public function
        public function A () {
        }

        // some protected function
        protected function B () {
        }

        // some private function
        private function C() {
        }

        // some abstract method from base class implemented
        protected function D () {
        }
    }

    // Create new B Object
    $b = new B();
    // Print all Methods of this Object/Class
    $b->PrintAllMethods();
?>

In this example output will be:

__construct
A
B
C
D
E
PrintAllMethods

As you can see these are all methods from class B and also all methods from Class A respectivly in order of their declaration. Note that only one method "__construct" and only one method "D" are being shown. This is due to overloading (__construct) and implementing (D) in PHP.

In this example any further method-handling methods should be implemented in the base class as these will be available in derived classes as well. Just make sure that you use the right access specifiers for these additional methods ( private, protected, public )

BoD
jazepstein at greenash dot net dot au 16-Oct-2005 06:37
In PHP4, this function converts its return values to lowercase; but in PHP5, it leaves the return values in their original case. This can cause serious problems when trying to write code that dynamically calls a class method, and that works in both PHP4 and PHP5. This code snippet shows one way of achieving compatibility with both versions:

<?php
// Example variables - these would be dynamic in a real application.
$className = 'SomeClass';
$methodName= 'someMethod';
$args = array('arg1', 'arg2');

// Use array_map() and strtolower() to make all values returned by get_class_methods() lowercase. PHP4 does this anyway - now it will happen regardless of the PHP version being used.
$classMethods = array_map(strtolower, get_class_methods($className));

// in_array() can only handle being given an array.
if (!$classMethods) {
  $classMethods = array();
}

if (in_array(strtolower($methodName), $classMethods)) {
  // call some method
  return call_user_func_array(array($className, $methodName), $args);
}
?>
Oli Filth 11-Apr-2005 08:21
As an extension to onesimus's code below for finding inherited methods, in PHP 5 you can use the Reflection API to find which of these are overriden.

e.g.

<?php
function get_overriden_methods($class)
{
    $rClass = new ReflectionClass($class);
    $array = NULL;

    foreach ($rClass->getMethods() as $rMethod)
    {
        try
        {
            // attempt to find method in parent class
            new ReflectionMethod($rClass->getParentClass()->getName(),
                                $rMethod->getName());
            // check whether method is explicitly defined in this class
            if ($rMethod->getDeclaringClass()->getName()
                == $rClass->getName())
            {
                // if so, then it is overriden, so add to array
                $array[] .=  $rMethod->getName();
            }
        }
        catch (exception $e)
        {    /* was not in parent class! */    }
    }

    return $array;
}
?>
kabatak 20-Feb-2005 05:11
In PHP4, if you need to get_class_methods in their original case. You can use this simple function I created.

// Note: this function assumes that you only have 1 class in 1 file

$file = "path/to/myclass.php"

function file_get_class_methods ($file)
{
    $arr = file($file);
    foreach ($arr as $line)
    {
        if (ereg ('function ([_A-Za-z0-9]+)', $line, $regs))
            $arr_methods[] = $regs[1];
    }
    return $arr_methods;
}
epowell at removethis dot visi dot com 11-Oct-2004 08:47
I've figured out how to get around my issue described below, using the Reflection API.

<?
/* Pass the name of the class, not a declared handler */
function get_public_methods($className) {
    /* Init the return array */
    $returnArray = array();

    /* Iterate through each method in the class */
    foreach (get_class_methods($className) as $method) {

        /* Get a reflection object for the class method */
        $reflect = new ReflectionMethod($className, $method);

        /* For private, use isPrivate().  For protected, use isProtected() */
        /* See the Reflection API documentation for more definitions */
        if($reflect->isPublic()) {
            /* The method is one we're looking for, push it onto the return array */
            array_push($returnArray,$method);
        }
    }

    /* return the array to the caller */
    return $returnArray;
}
?>
onesimus at cox dot net 19-Jun-2004 02:32
This function will return only the methods for the object you indicate. It will strip out the inherited methods.

function get_this_class_methods($class){
    $array1 = get_class_methods($class);
    if($parent_class = get_parent_class($class)){
        $array2 = get_class_methods($parent_class);
        $array3 = array_diff($array1, $array2);
    }else{
        $array3 = $array1;
    }
    return($array3);
}
gk at proliberty dot com 01-Jun-2003 04:16
It is important to note that get_class_methods($class) returns not only methods defined by $class but also the inherited methods.

There does not appear to be any PHP function to determine which methods are inherited and which are defined explicitly by a class.
aldo at cerca dot com 21-Apr-2002 10:18
If you use "get_class_methods" to check if a Method is in a Class remember that the function return lowered name of class methods:

class classPippo
{
        function DummyFunct()
        {
                // Do nothing...
        }
}

$aClassMethods = get_class_methods(classPippo);

$sMethodName = 'DummyFunct';

// This not work...

        if (in_array($sMethodName, $aClassMethods))
        classPippo::DummyFunct();

// This work...

        if (in_array(strtolower($sMethodName), $aClassMethods))
        classPippo::DummyFunct();
matt at zevi dot net 21-Mar-2002 04:46
Win32 only:

It's probably worth noting here that you can't get the methods of an object created by the built-in 'COM' class. ie - this won't work:

$word = new COM('Word.Application');
$methods = get_class_methods(get_class($word));
print_r($methods);

Matt


Retourne les valeurs par défaut des propriétés d'une classe

  • « get_class_methods
  • get_class »
  • PHP Manual
  • Fonctions Classes/Objets
  • Retourne les valeurs par défaut des propriétés d'une classe

get_class_vars

(PHP 4, PHP 5, PHP 7, PHP 8)

get_class_vars — Retourne les valeurs par défaut des propriétés d'une classe

Description

get_class_vars ( string $class_name ) : array

Retourne les valeurs par défaut des propriétés d'une classe.

Liste de paramètres

class_name

Le nom de la classe

Valeurs de retour

Retourne un tableau associatif contenant les noms/valeurs des propriétés visibles dans le scope courant, avec leurs valeurs par défaut. Les éléments du tableau résultant sont sous la forme varname => value. En cas d'erreur, la fonction retournera false.

Exemples

Exemple #1 Exemple avec get_class_vars()

<?php

class myclass {

    var $var1; // pas de valeur par défaut...
    var $var2 = "xyz";
    var $var3 = 100;
    private $var4;

    // constructeur
    function __construct() {
        // changement de quelques propriétés
        $this->var1 = "foo";
        $this->var2 = "bar";
        return true;
    }

}

$my_class = new myclass();

$class_vars = get_class_vars(get_class($my_class));

foreach ($class_vars as $name => $value) {
    echo "$name : $value\n";
}

?>

L'exemple ci-dessus va afficher :

var1 :
var2 : xyz
var3 : 100

Exemple #2 Exemple avec get_class_vars() et les contextes

<?php
function format($array)
{
    return implode('|', array_keys($array)) . "\r\n";
}

class TestCase
{
    public $a = 1;
    protected $b = 2;
    private $c = 3;

    public static function expose()
    {
        echo format(get_class_vars(__CLASS__));
    }
}

TestCase::expose();
echo format(get_class_vars('TestCase'));
?>

L'exemple ci-dessus va afficher :

// 5.0.0
a| * b| TestCase c
a| * b| TestCase c

// 5.0.1 - 5.0.2
a|b|c
a|b|c

// 5.0.3 +
a|b|c
a

Voir aussi

  • get_class_methods() - Retourne les noms des méthodes d'une classe
  • get_object_vars() - Retourne les propriétés d'un objet

User Contributed Notes

flobee 16-Nov-2015 12:43
<?php
class someClass {
    public function toArray() {
        $records = array();

        foreach( $this as $key => $value ) {
                $records[$key] = $value;
        }

        return $records;
    }

}
?>
bof at bof dot de 09-Sep-2012 07:02
I needed to get only the class static variables, leaving out instance variables.

<?php
function get_static_vars($class) {
    $result = array();
    foreach (get_class_vars($class) as $name => $default)
        if (isset($class::$$name))
            $result[$name] = $default;
    return $result;
}
?>

That function returns only the public ones. The same pattern can be used inside a class, then it returns private and protected static variables, too:

<?php
static protected function get_static_vars($class = NULL) {
    if (!isset($class)) $class = get_called_class();
    $result = array();
    foreach (get_class_vars($class) as $name => $default)
        if (isset($class::$$name))
            $result[$name] = $default;
    return $result;
}
?>
Mattias Ahlbck 14-Feb-2012 09:39
get_class_vars_assoc()
- Returns an associative array with name of (parent) class(es) as key(s) and corresponding class vars as sub-arrays. My boilerplate for some crude O/R mapping.

Note: vars re-defined in sub-classes are ignored.

<?php

class GrandClass {
    public $grandVar;
    public $in_grand_and_parent;
    public $in_grand_and_child;

    public static function load() {
        print_r(self::get_class_vars_assoc());
    }

    protected static function get_class_vars_assoc() {
        $called = get_called_class();
        //echo "called: $called \n";
        $classVars[$called] = array_keys(get_class_vars($called));

        $parent = get_parent_class($called);
        while ( $parent !== FALSE ) {
            //echo "parent: $parent \n";
            $classVars[$parent] = array_keys(get_class_vars($parent));
            $classVars[$called] = array_diff($classVars[$called],
                                             $classVars[$parent]);
            if ( isset($prevParentVars) ) {
                $prevParentVars = array_diff($prevParentVars,
                                             $classVars[$parent]);
            }

            $prevParentVars = &$classVars[$parent];
            $parent = get_parent_class($parent);
        }

        return $classVars;
    }
}

class ParentClass extends GrandClass {
    public $in_grand_and_parent;
    public $parentVar;
    public $in_parent_and_child;
}

class ChildClass extends ParentClass {
    public $in_grand_and_child;
    public $in_parent_and_child;
    public $childVar;
}

ChildClass::load();

?>

Array
(
    [ChildClass] => Array
        (
            [2] => childVar
        )

    [ParentClass] => Array
        (
            [1] => parentVar
            [2] => in_parent_and_child
        )

    [GrandClass] => Array
        (
            [0] => grandVar
            [1] => in_grand_and_parent
            [2] => in_grand_and_child
        )

)
ciantic 30-Jan-2012 10:06
I propse following for getting Public members, always:
<?PHP
if (!function_exists("get_public_class_vars")) {
    function get_public_class_vars($class) {
        return get_class_vars($class);
    }
}
if (!function_exists("get_public_object_vars")) {
    function get_public_object_vars($object) {
        return get_object_vars($object);
    }
}
?>

This is to mitigate the problem and a feature that get_object_vars($this) returns private members. Running it simply outside the scope will get the public.

Iterating public members only and their defaults are enormously useful in e.g. in serialization classes such as options where each public member is an serializable that is saved and loaded.
pBakhuis at Gmail dot com 07-Oct-2011 03:08
If you need the variables before the class is included this function does not seem to work.
Use a reflection class to get around this.
http://www.php.net/reflectionclass
ken at verango dot com 04-Oct-2010 04:50
All 3 of get_object_vars, get_class_vars and reflection getDefaultProperties will reveal the name of the array.  For serialization I recommend:

<?php
$cName = get_class($this);
$varTemplate= get_class_vars($cName)
foreach ($varTemplate as $name => $defaultVal) {
  $vars[$name] = $this->$name; // gets actual val.
}
?>

No scan the $vars and create serialization string how you wish.

This protects against erroneous prior deserializing in maintaining the integrity of the class template and ignoring unintended object properties.
ianitsky at gmail dot com 10-Nov-2009 11:53
If you need get the child protected/private vars ignoring the parent vars, use like this:

<?php
class childClass extends parentClass {
    private $login;
    private $password;

    public function __set($key, $val) {
        if ($key == 'password')
            $this->$key = md5($val);
        else
            $this->$key = $val;
    }
}
class parentClass {
    public $name;
    public $email;

    function __construct() {
        $reflection = new ReflectionClass($this);
        $vars = array_keys($reflection->getdefaultProperties());
        $reflection = new ReflectionClass(__CLASS__);
        $parent_vars = array_keys($reflection->getdefaultProperties());

        $my_child_vars = array();
        foreach ($vars as $key) {
            if (!in_array($key, $parent_vars)) {
                $my_child_vars[] = $key;
            }
        }

        print_r($my_child_vars);
    }
}

$child_class = new childClass();
?>
harmor 20-Dec-2008 03:53
So I wanted to get a list of the public parameters in a child class using a static function pre-5.3.0 (< 5.3.0).  In 5.3.0+ you would use the new 'static' like you would 'self' to get the late binding.

<?php
class childClass extends parentClass
{
    public $id;
    public $name;

    public static function getFields()
    {
        return self::_getFields(__CLASS__);
    }

}
abstract class parentClass
{
    public $idInParent;
    public $nameInParent;

    abstract public static function getFields();

    final protected static function _getFields($className)
    {
        $rtn = array();
        foreach (array_keys(get_class_vars($className)) as $var) {
            $rtn[] = $var;
        }
        return $rtn;
    }

}

var_dump(childClass::getFields());
?>

Results:
array(4) {
  [0]=>
  string(2) "id"
  [1]=>
  string(4) "name"
  [2]=>
  string(10) "idInParent"
  [3]=>
  string(12) "nameInParent"
}
artktec at art-k-tec dot com 16-Nov-2007 09:18
There seems to be be a function to get constants missing , i.e. get_class_constants() ... so here is a simple function for you all. Hopefully Zend will include this in the next round as a native php call, without using reflection.

<?php
   function GetClassConstants($sClassName) {
      $oClass = new ReflectionClass($sClassName);
      return $oClass->getConstants());
   }
?>
phpnet at stccorp dot net 15-Jun-2007 05:18
This is one of the best php functions. Look at what you can do

class Object
{
   var $updtFields;//keep track of affected values
   function Object($record="") {
       if (is_array($record))
       {
          $this->updtFields = array();
          foreach(array_keys(get_class_vars(get_class($this))) as $k)
          if (isset($record[$k]))
         {
          $this->$k = $record[$k];
          $this->updtFields[] = $k;
         }
      }
   }//end of arrayToObject

   function toDebug($nl='<br>')
   {
       foreach(array_keys(get_class_vars(get_class($this))) as $k)
       echo "$k = [" . $this->$k . "]{$nl}";
    }//end of toDebug
}

Now you can do really cool things. If you have a form like
<form action="" method="post">
  <input type="text" name="name" />
  <input type="text" name="phone" />
  <input type="submit" />
</form>

and you define your class like this
class Person extends Object{
  var $name; //same same as in the form
  var $phone;
}

when you submmit the form, you can get the data like

$person = new Person($_POST);

//everything in just one line,cool!! Also if you use pear db or adodb when you get data from the database you can do the same thing except use the $row that you get from the database. Remember to ask the result is associative mode.

This is my core Object for everthing I do and it works great.
bernd at tiggerswelt dot net 29-Jan-2007 02:52
If you assign a constant value using the self-scope by default to a variable, get_class_vars() will result in a FATAL error.

Example:

<?PHP

  class Foo {
    const Bar = "error";

    public $Foo = self::Bar;
  }

  print_r(get_class_vars("Foo"));

?>

... but using "Foo::Bar" instead "self::Bar" will work ;)
gizmobits at hotmail dot com 03-Mar-2006 07:48
I wanted a simple ToString() function that was automatic and class independent.  I wanted to dump it into any of several classes and get values quickly.  I wanted to leave it there so I could customize it for each class, so an outside function wasn't suitable.  I came up with this and thought it might be useful.  Have fun!

<?php
  function ToString () {
    $s = "";
    $s .= "<table>\n";
    $s .= "<tr><td colspan=2><hr></td></tr>\n";
    foreach (get_class_vars(get_class($this)) as $name => $value) {
      $s .= "<tr><td>$name:</td><td>" . $this->$name . "</td></tr>\n";
    }
    $s .= "<tr><td colspan=2><hr></td></tr>\n";
    $s .= "</table>\n";
    return $s;
  }

?>
php dot net at sharpdreams dot com 25-Oct-2005 06:25
Contrary to multiple comments throughout the manual, get_class_vars() performed within a class can access any public, protected, and private members.

<?php
class Foo {
   public $x;
   protected $y;
   private $z;
   public function __sleep() {
      return( get_class_vars( __CLASS__ ) );
   }
}
?>

works fine (returns x, y, & z). However, given the same class as above,

<?php
print_r( get_class_vars( "Foo" ) );
?>

will NOT return x, y, & z. Instead it will only return the public members (in our case, z).
alan_k at php dot net 21-Jan-2005 07:23
in PHP5 to get all the vars (including private etc.) use:

$reflection = new ReflectionClass($class);
$defaults = $reflection->getdefaultProperties();
rec at NOSPAM dot instantmassacre dot com 23-Jan-2003 04:23
If you want to retrieve the class vars from within the class itself, use $this.

<?php
class Foo {

    var $a;
    var $b;
    var $c;
    var $d;
    var $e;

    function GetClassVars()
    {
        return array_keys(get_class_vars(get_class($this))); // $this
    }

}

$Foo = new Foo;

$class_vars = $Foo->GetClassVars();

foreach ($class_vars as $cvar)
{
    echo $cvar . "<br />\n";
}
?>

Produces, after PHP 4.2.0, the following:

a
b
c
d
e


Retourne le nom de la classe d'un objet

  • « get_class_vars
  • get_declared_classes »
  • PHP Manual
  • Fonctions Classes/Objets
  • Retourne le nom de la classe d'un objet

get_class

(PHP 4, PHP 5, PHP 7, PHP 8)

get_class — Retourne le nom de la classe d'un objet

Description

get_class ( object $object = ? ) : string

Retourne le nom de la classe de l'objet obj.

Liste de paramètres

object

L'objet testé. Ce paramètre peut être omis lorsque la fonction est utilisée dans une classe.

Note: Passer explicitement null dans object n'est plus autorisé depuis PHP 7.2.0. Le paramètre est toujours optionnel et appeler get_class() dans une classe fonctionnera, mais passer null émet une notice E_WARNING.

Valeurs de retour

Retourne le nom de la classe dont object est une instance. Retourne false si object n'est pas un objet.

Si object est omis lorsque la fonction est appelée dans une classe, le nom de la classe courante est retourné.

Si object est une instance d'une classe qui existe dans un namespace, le nom avec les namespace de la classe sera retourné.

Erreurs / Exceptions

Si get_class() est appelée avec autre chose qu'un objet, une alerte de niveau E_WARNING sera émise.

Historique

Version | Description
7.2.0 | Antérieur à cette version, la valeur par défaut pour object était null et avait le même effet que pas passer de valeur. Désormais null n'est plus la valeur par défaut pour object, et n'est plus une entrée valide.

Exemples

Exemple #1 Exemple avec get_class()

<?php

class foo {
    function name()
    {
        echo "Mon nom est " , get_class($this) , "\n";
    }
}

// création d'un objet
$bar = new foo();

// Appel externe
echo "Son nom est " , get_class($bar) , "\n";

// Appel interne
$bar->name();

?>

L'exemple ci-dessus va afficher :

Son nom est foo
Mon nom est foo

Exemple #2 Utilisation de get_class() dans une superclasse

<?php

abstract class bar {
    public function __construct()
    {
        var_dump(get_class($this));
        var_dump(get_class());
    }
}

class foo extends bar {
}

new foo;

?>

L'exemple ci-dessus va afficher :

string(3) "foo"
string(3) "bar"

Exemple #3 Utilisation get_class() avec des namespace de classe

<?php

namespace Foo\Bar;

class Baz {
    public function __construct()
    {

    }
}

$baz = new \Foo\Bar\Baz;

var_dump(get_class($baz));
?>

L'exemple ci-dessus va afficher :

string(11) "Foo\Bar\Baz"

Voir aussi

  • get_called_class() - Le nom de la classe en "Late Static Binding"
  • get_parent_class() - Retourne le nom de la classe parente d'un objet
  • gettype() - Retourne le type de la variable
  • is_subclass_of() - Détermine si un objet est une sous-classe d'une classe donnée ou l'implémente

User Contributed Notes

kiril (AT) aternus networks 10-Oct-2017 09:03
If you want the Class Name without the Namespace or if you've got here because basename() returns a dot (.) for the FQCN (Fully Qualified Class Name), here is the solution:

<?php
// FQCN: App\Http\Controllers\CustomerReportController

substr(self::class, (int)strrpos(self::class, '\\') + 1)

// returns: CustomerReportController
?>
Hayley Watson 24-Sep-2017 11:22
Although you can call a class's static methods from an instance of the class as though they were object instance methods, it's nice to know that, since classes are represented in PHP code by their names as strings, the same thing goes for the return value of get_class():

<?php
$t->Faculty();
SomeClass::Faculty(); // $t instanceof SomeClass
"SomeClass"::Faculty();
get_class($t)::Faculty();
?>

The first is legitimate, but the last makes it clear to someone reading it that Faculty() is a static method (because the name of the method certainly doesn't).
dense 17-Dec-2016 01:33
well, if you call  get_class() on an aliased class, you will get the original class name

<?php

class Person {}

class_alias('Person', 'User');

$me = new User;

var_dump( get_class($me) ); // 'Person'

?>
XyQrTw 28-Nov-2016 10:18
To get class name without the Namespace you can use easily this trick :
<?php
namespace My\Long\Namespace;

class MyClass {

    static function getClassName() {
        return basename(__CLASS__);
       // or with get_class();
        return basename(get_class());
    }

}

echo \My\Long\Namespace\MyClass::getClassName(); // Display : MyClass
?>
RQuadling at GMail dot com 19-Dec-2014 03:09
With regard to getting the class name from a namespaced class name, then using basename() seems to do the trick quite nicely.

<?php
namespace Foo\Bar;

abstract class Baz
{
  public function report()
  {
    echo
      '__CLASS__        ', __CLASS__, ' ', basename(__CLASS__), PHP_EOL,
      'get_called_class ', get_called_class(), ' ', basename(get_called_class()), PHP_EOL;
  }
}

class Snafu extends Baz
{
}

(new Snafu)->report();
?>

produces output of ...

__CLASS__        Foo\Bar\Baz   Baz
get_called_class Foo\Bar\Snafu Snafu
jjanak at webperfection dot net 03-Oct-2014 11:06
>= 5.5

::class
fully qualified class name, instead of get_class

<?php
namespace my\library\mvc;

class Dispatcher {}

print Dispatcher::class; // FQN == my\library\mvc\Dispatcher

$disp = new Dispatcher;

print $disp::class; // parse error
Anonymous 18-Sep-2014 08:55
If you want the path to an file if you have i file structure like this

project -> system -> libs -> controller.php
project -> system -> modules -> foo -> foo.php

and foo() in foo.php extends controller() in controller.php like this

<?PHP
namespace system\modules\foo;

class foo extends \system\libs\controller {
    public function __construct() {
        parent::__construct();
    }
}
?>

and you want to know the path to foo.php in controller() this may help you

<?PHP
namespace system\libs;

class controller {
    protected function __construct() {
        $this->getChildPath();
    }
    protected function getChildPath() {
        echo dirname(get_class($this));
    }
}
?>

<?PHP
$f = new foo();  // system\modules\foo
?>
var23rav at gmail dot com 27-Aug-2014 01:52
class A
{
function __construct(){
        //parent::__construct();
        echo $this->m =  'From constructor A: '.get_class();
        echo $this->m =  'From constructor A:- argument = $this: '.get_class($this);

        echo $this->m =  'From constructor A-parent: '.get_parent_class();
        echo $this->m =  'From constructor A-parent:- argument =  $this: '.get_parent_class($this);
    }
}
class B extends A
{
function __construct(){
        parent::__construct();
        echo $this->m =  'From constructor B: '.get_class();
        echo $this->m =  'From constructor B:- argument =  $this: '.get_class($this);

        echo $this->m =  'From constructor B-parent: '.get_parent_class();
        echo $this->m =  'From constructor B-parent:- argument =  $this: '.get_parent_class($this);
    }
}
$b = new B();
//----------------output--------------------

From constructor A: A
From constructor A:- argument = $this: B
From constructor A-parent:
From constructor A-parent:- argument = $this: A
From constructor B: B
From constructor B:- argument = $this: B
From constructor B-parent: A
From constructor B-parent:- argument = $this: A

Use get_class() to get the name of class  ,it will help you get the class name, in case you extend that class with another class and want to get the name of the class to which object is instance of user get_class($object)

when you create an object of class{$b object of B} which has a super class{Class A}.
uses these code IN Super Class {A}
--------------------------------------------
to get class name B{object instance} :  get_class($this)
to get class name A{super class}  : get_class() or get_parent_class($this)
dave at shax dot com 06-Mar-2014 04:36
A lot of people in other comments wanting to get the classname without the namespace. Some weird suggestions of code to do that - not what I would've written! So wanted to add my own way.

<?php
function get_class_name($classname)
{
    if ($pos = strrpos($classname, '\\')) return substr($classname, $pos + 1);
    return $pos;
}
?>

Also did some quick benchmarking, and strrpos() was the fastest too. Micro-optimisations = macro optimisations!

39.0954 ms - preg_match()
28.6305 ms - explode() + end()
20.3314 ms - strrpos()

(For reference, here's the debug code used. c() is a benchmarking function that runs each closure run 10,000 times.)

<?php
c(
    function($class = 'a\b\C') {
        if (preg_match('/\\\\([\w]+)$/', $class, $matches)) return $matches[1];
        return $class;
    },
    function($class = 'a\b\C') {
        $bits = explode('\\', $class);
        return end($bits);
    },
    function($class = 'a\b\C') {
        if ($pos = strrpos($class, '\\')) return substr($class, $pos + 1);
        return $pos;
    }
);
?>
Nanhe Kumar 20-Dec-2013 12:14
<?php
class Parent{
}
class Child extends Parent{
}
$c = new Child();
echo get_class($c) //Child
?>
<?php
class Parent{
  public function getClass(){
     echo get_class();
  }
}
class Child extends Parent{
}
$obj = new Child();
$obj->getClass(); //outputs Parent
?>
<?php
class Parent{
  public function getClass(){
     echo get_class($this);
  }
}
class Child extends Parent{
}
$obj = new Child();
$obj->getClass(); // Parent
?>
emmanuel dot antico at gmail dot com 10-May-2013 07:35
/**
 * Obtains an object class name without namespaces
 */
function get_real_class($obj) {
    $classname = get_class($obj);

    if (preg_match('@\\\\([\w]+)$@', $classname, $matches)) {
        $classname = $matches[1];
    }

    return $classname;
}
macnimble at gmail dot com 17-Mar-2012 07:24
Need a quick way to parse the name of a class when it's namespaced? Try this:

<?php
namespace Engine;
function parse_classname ($name)
{
  return array(
    'namespace' => array_slice(explode('\\', $name), 0, -1),
    'classname' => join('', array_slice(explode('\\', $name), -1)),
  );
}
final class Kernel
{
  final public function __construct ()
  {
    echo '<pre>', print_r(parse_classname(__CLASS__),1), '</pre>';
    // Or this for a one-line method to get just the classname:
    // echo join('', array_slice(explode('\\', __CLASS__), -1));
  }
}
new Kernel();
?>

Outputs:
Array
(
    [namespace] => Array
        (
            [0] => Engine
        )

    [classname] => Kernel
)
mail dot temc at gmail dot com 06-Dec-2011 02:51
People seem to mix up what __METHOD__, get_class($obj) and get_class() do, related to class inheritance.

Here's a good example that should fix that for ever:

<?php

class Foo {
 function doMethod(){
  echo __METHOD__ . "\n";
 }
 function doGetClassThis(){
  echo get_class($this).'::doThat' . "\n";
 }
 function doGetClass(){
  echo get_class().'::doThat' . "\n";
 }
}

class Bar extends Foo {

}

class Quux extends Bar {
 function doMethod(){
  echo __METHOD__ . "\n";
 }
 function doGetClassThis(){
  echo get_class($this).'::doThat' . "\n";
 }
 function doGetClass(){
  echo get_class().'::doThat' . "\n";
 }
}

$foo = new Foo();
$bar = new Bar();
$quux = new Quux();

echo "\n--doMethod--\n";

$foo->doMethod();
$bar->doMethod();
$quux->doMethod();

echo "\n--doGetClassThis--\n";

$foo->doGetClassThis();
$bar->doGetClassThis();
$quux->doGetClassThis();

echo "\n--doGetClass--\n";

$foo->doGetClass();
$bar->doGetClass();
$quux->doGetClass();

?>

OUTPUT:

--doMethod--
Foo::doMethod
Foo::doMethod
Quux::doMethod

--doGetClassThis--
Foo::doThat
Bar::doThat
Quux::doThat

--doGetClass--
Foo::doThat
Foo::doThat
Quux::doThat
ozana at omdesign dot cz 28-Nov-2011 07:53
Simplest way how to gets Class without namespace

<?php
namespace a\b\c\d\e\f;

class Foo {

  public function __toString() {
    $class = explode('\\', __CLASS__);
    return end($class);
  }
}

echo new Foo(); // prints Foo
?>
Michael Richey 31-Oct-2011 12:01
Attempting various singleton base class methods described on this page, I have created a base class and bridge function that allows it to work without get_called_class() if it's not available.  Unlike other methods listed here, I chose not to prevent use of __construct() or __clone().

<?php
abstract class Singleton {
    protected static $m_pInstance;
    final public static function getInstance(){
        $class = static::getClass();
        if(!isset(static::$m_pInstance[$class])) {
            static::$m_pInstance[$class] = new $class;
        }
        return static::$m_pInstance[$class];
    }
    final public static function getClass(){
        return get_called_class();
    }
}

// I don't remember where I found this, but this is to allow php < 5.3 to use this method.
if (!function_exists('get_called_class')) {
    function get_called_class($bt = false, $l = 1) {
        if (!$bt)
            $bt = debug_backtrace();
        if (!isset($bt[$l]))
            throw new Exception("Cannot find called class -> stack level too deep.");
        if (!isset($bt[$l]['type'])) {
            throw new Exception('type not set');
        }
        else
            switch ($bt[$l]['type']) {
                case '::':
                    $lines = file($bt[$l]['file']);
                    $i = 0;
                    $callerLine = '';
                    do {
                        $i++;
                        $callerLine = $lines[$bt[$l]['line'] - $i] . $callerLine;
                    } while (stripos($callerLine, $bt[$l]['function']) === false);
                    preg_match('/([a-zA-Z0-9\_]+)::' . $bt[$l]['function'] . '/', $callerLine, $matches);
                    if (!isset($matches[1])) {
                        // must be an edge case.
                        throw new Exception("Could not find caller class: originating method call is obscured.");
                    }
                    switch ($matches[1]) {
                        case 'self':
                        case 'parent':
                            return get_called_class($bt, $l + 1);
                        default:
                            return $matches[1];
                    }
                // won't get here.
                case '->': switch ($bt[$l]['function']) {
                        case '__get':
                            // edge case -> get class of calling object
                            if (!is_object($bt[$l]['object']))
                                throw new Exception("Edge case fail. __get called on non object.");
                            return get_class($bt[$l]['object']);
                        default: return $bt[$l]['class'];
                    }

                default: throw new Exception("Unknown backtrace method type");
            }
    }
}

class B extends Singleton {
}

class C extends Singleton {
}

$b = B::getInstance();
echo 'class: '.get_class($b);

echo '<br />';

$c = C::getInstance();
echo echo 'class: '.get_class($c);
?>
This returns:
class: b
class: c
me at nwhiting dot com 06-Dec-2010 08:14
Method for pulling the name of a class with namespaces pre-stripped.

<?php
/**
 * Returns the name of a class using get_class with the namespaces stripped.
 * This will not work inside a class scope as get_class() a workaround for
 * that is using get_class_name(get_class());
 *
 * @param  object|string  $object  Object or Class Name to retrieve name

 * @return  string  Name of class with namespaces stripped
 */
function get_class_name($object = null)
{
    if (!is_object($object) && !is_string($object)) {
        return false;
    }

    $class = explode('\\', (is_string($object) ? $object : get_class($object)));
    return $class[count($class) - 1];
}
?>

And for everyone for Unit Test goodiness!

<?php
namespace testme\here;

class TestClass {

    public function test()
    {
       return get_class_name(get_class());
    }
}

class GetClassNameTest extends \PHPUnit_Framework_TestCase
{
    public function testGetClassName()
    {
        $class  = new TestClass();
        $std  = new \stdClass();
        $this->assertEquals('TestClass', get_class_name($class));
        $this->assertEquals('stdClass', get_class_name($std));
        $this->assertEquals('Test', get_class_name('Test'));
        $this->assertFalse(get_class_name(null));
        $this->assertFalse(get_class_name(array()));
        $this->assertEquals('TestClass', $class->test());
    }
}
?>
Aaron 18-Jun-2010 11:14
This can sometimes be used in place of get_called_class(). I used this function in a parent class to get the name of the class that extends it.
ovidiu.bute [at] gmail.com 05-Apr-2010 10:23
If you are using namespaces this function will return the name of the class including the namespace, so watch out if your code does any checks for this. Ex:

namespace Shop;

<?php
class Foo
{
  public function __construct()
  {
     echo "Foo";
  }
}

//Different file

include('inc/Shop.class.php');

$test = new Shop\Foo();
echo get_class($test);//returns Shop\Foo
?>
Lanselot 11-Feb-2009 02:09
Beware if you're omitting the parameter on inherited classes.
It'll return the class name of the method where it's called.

<?php
class A {
    function foo() {
      return get_class();
    }
}
class B extends A {
   function bar() {
      return get_class();
   }
}
$instance = new B();
echo $instance->bar(); //Prints 'B';
echo $instance->foo(); //Prints 'A';
?>
danbettles at yahoo dot co dot uk 08-Oct-2008 11:56
It is possible to write a completely self-contained Singleton base class in PHP 5.3 using the new get_called_class function.  When called in a static method, this function returns the name of the class the call was made against.

<?php

abstract class Singleton {

    protected function __construct() {
    }

    final public static function getInstance() {
        static $aoInstance = array();

        $calledClassName = get_called_class();

        if (! isset ($aoInstance[$calledClassName])) {
            $aoInstance[$calledClassName] = new $calledClassName();
        }

        return $aoInstance[$calledClassName];
    }

    final private function __clone() {
    }
}

class DatabaseConnection extends Singleton {

    protected $connection;

    protected function __construct() {
        // @todo Connect to the database
    }

    public function __destruct() {
        // @todo Drop the connection to the database
    }
}

$oDbConn = new DatabaseConnection();  // Fatal error

$oDbConn = DatabaseConnection::getInstance();  // Returns single instance
?>

Full write-up in Oct 2008: http://danbettles.blogspot.com
Edward 21-Aug-2008 03:26
The code in my previous comment was not completely correct. I think this one is.

<?
abstract class Singleton {
    protected static $__CLASS__ = __CLASS__;

    protected function __construct() {
    }

    abstract protected function init();

    /**
     * Gets an instance of this singleton. If no instance exists, a new instance is created and returned.
     * If one does exist, then the existing instance is returned.
     */
    public static function getInstance() {
        static $instance;

        $class = self::getClass();

        if ($instance === null) {
            $instance = new $class();
            $instance->init();
        }

        return $instance;
    }

    /**
     * Returns the classname of the child class extending this class
     *
     * @return string The class name
     */
    private static function getClass() {
        $implementing_class = static::$__CLASS__;
        $original_class = __CLASS__;

        if ($implementing_class === $original_class) {
            die("You MUST provide a <code>protected static \$__CLASS__ = __CLASS__;</code> statement in your Singleton-class!");
        }

        return $implementing_class;
    }
}
?>
Edward 20-Aug-2008 05:42
With Late Static Bindings, available as of PHP 5.3.0, it is now possible to implement an abstract Singleton class with minimal overhead in the child classes. Late static bindings are explained here: http://nl2.php.net/manual/en/language.oop5.late-static-bindings.php

In short, it introduces a new 'static::' keyword, that is evaluated at runtime. In the following code I use it to determine the classname of the child Singleton class.

<?
abstract class Singleton {
    protected static $__CLASS__ = __CLASS__;
    protected static $instance;

    protected function __construct() {
        static::$instance = $this;
        $this->init();
    }

    abstract protected function init();

    protected function getInstance() {
        $class = static::getClass();

        if (static::$instance===null) {
            static::$instance = new $class;
        }

        return static::$instance;
    }

    private static function getClass() {
        if (static::$__CLASS__ == __CLASS__) {
            die("You MUST provide a <code>protected static \$__CLASS__ = __CLASS__;</code> statement in your Singleton-class!");
        }

        return static::$__CLASS__;
    }
}
?>

An example Singleton class can then be implemented as follows:

<?
class A extends Singleton {
    protected static $__CLASS__ = __CLASS__; // Provide this in each singleton class.

    protected function someFunction() {
        $instance = static::getInstance();
        // ...
    }
}
?>

Hope this helps you save some time :)
dave dot zap at gmail dot com 29-Apr-2008 09:13
Take care using the backtrace method to find the calling class of a static method, you should step backward through the array and find a match for your getInstance() function. In backtrace the class name you want is not always the last item in the array.

I will not post the whole singleton class here, but have made the following modification to Frederik Krautwald's method (found below)

<?php
$bt = debug_backtrace();
// this method is count($bt)-1) by Frederik will fall over when calling getInstance from within an include file.
//$class = $bt[count($bt) - 1]['class'];

for( $i=count($bt)-1 ; $i > 0 ; $i--)
{
    if($bt[$i]['function'] == 'getInstance')
    {
        $class = $bt[$i]['class'];
        break;
    }
}
?>
Anonymous 12-Apr-2008 02:01
In Perl (and some other languages) you can call some methods in both object and class (aka static) context. I made such a method for one of my classes in PHP5, but found out that static methods in PHP5 do not 'know' the name of the calling subclass', so I use a backtrace to determine it. I don't like hacks like this, but as long as PHP doesn't have an alternative, this is what has to be done:

public function table_name() {
        $result = null;
        if (isset($this)) { // object context
            $result = get_class($this);
        }
        else { // class context
            $result = get_class();
            $trace = debug_backtrace();
            foreach ($trace as &$frame) {
                if (!isset($frame['class'])) {
                    break;
                }
                if ($frame['class'] != $result) {
                    if (!is_subclass_of($frame['class'], $result)) {
                        break;
                    }
                    $result = $frame['class'];
                }
            }
        }
        return $result;
    }
andregs at NOSPAM dot gmail dot NOSPAM dot com 21-Feb-2008 01:17
After reading the previous comments, this is the best I've done to get the final class name of a subclass:

<?php

class Singleton
{
   private static $_instances = array();
   protected final function __construct(){}

   /**
    * @param string $classname
    * @return Singleton
    */
   protected static function getInstance()
   {
      $classname = func_get_arg(0);
      if (! isset(self::$_instances[$classname]))
      {
         self::$_instances[$classname] = new $classname();
      }
      return self::$_instances[$classname];
   }

}

class Child extends Singleton
{
   /**
    * @return Child
    */
   public static function getInstance()
   {
      return parent::getInstance(get_class());
   }
}

?>

Subclasses must override "getInstance" and cannot override "__construct".
dodgie74 at NOSPAM dot yahoo dot NOSPAM dot co dot uk 09-Sep-2007 05:40
As noted in bug #30934 (which is not actually a bug but a consequence of a design decision), the "self" keyword is bound at compile time. Amongst other things, this means that in base class methods, any use of the "self" keyword will refer to that base class regardless of the actual (derived) class on which the method was invoked. This becomes problematic when attempting to call an overridden static method from within an inherited method in a derived class. For example:

<?php
class Base
{
    protected $m_instanceName = '';

    public static function classDisplayName()
    {
        return 'Base Class';
    }

    public function instanceDisplayName()
    {
        //here, we want "self" to refer to the actual class, which might be a derived class that inherits this method, not necessarily this base class
        return $this->m_instanceName . ' - ' . self::classDisplayName();
    }
}

class Derived extends Base
{
    public function Derived( $name )
    {
        $this->m_instanceName = $name;
    }

    public static function classDisplayName()
    {
        return 'Derived Class';
    }
}

$o = new Derived('My Instance');
echo $o->instanceDisplayName();
?>

In the above example, assuming runtime binding (where the keyword "self" refers to the actual class on which the method was invoked rather than the class in which the method is defined) would produce the output:

My Instance - Derived Class

However, assuming compile-time binding (where the keyword "self" refers to the class in which the method is defined), which is how php works, the output would be:

My Instance - Base Class

The oddity here is that "$this" is bound at runtime to the actual class of the object (obviously) but "self" is bound at compile-time, which seems counter-intuitive to me. "self" is ALWAYS a synonym for the name of the class in which it is written, which the programmer knows so s/he can just use the class name; what the programmer cannot know is the name of the actual class on which the method was invoked (because the method could be invoked on a derived class), which it seems to me is something for which "self" ought to be useful.

However, questions about design decisions aside, the problem still exists of how to achieve behaviour similar to "self" being bound at runtime, so that both static and non-static methods invoked on or from within a derived class act on that derived class. The get_class() function can be used to emulate the functionality of runtime binding for the "self" keyword for static methods:

<?php
class Base
{
    protected $m_instanceName = '';

    public static function classDisplayName()
    {
        return 'Base Class';
    }

    public function instanceDisplayName()
    {
        $realClass = get_class($this);
        return $this->m_instanceName . ' - ' . call_user_func(array($realClass, 'classDisplayName'));
    }
}

class Derived extends Base
{
    public function Derived( $name )
    {
        $this->m_instanceName = $name;
    }

    public static function classDisplayName()
    {
        return 'Derived Class';
    }
}

$o = new Derived('My Instance');
echo $o->instanceDisplayName();
?>

Output:
My Instance - Derived Class

I realise that some people might respond "why don't use just just the class name with ' Class' appended instead of the classDisplayName() method", which is to miss the point. The point is not the actual strings returned but the concept of wanting to use the real class for an overridden static method from within an inherited non-static method. The above is just a simplified version of a real-world problem that was too complex to use as an example.

Apologies if this has been mentioned before.
bramus at bram dot us 20-Aug-2007 08:40
@ Frederik :

<?
$class = $bt[count($bt) - 1]['class'];
?>

should be

<?
$class = $bt[count($bt) - 2]['class'];
?>

;-)
Frederik Krautwald 25-Jun-2007 08:13
Due to PHP 5 engine that permits to get final class in a static called function, and this is a modified version of examples published below.

<?php
abstract class Singleton {
    protected static $_instances = array();

    protected function __construct() {}

    protected static function getInstance() {
        $bt = debug_backtrace();
        $class = $bt[count($bt) - 1]['class'];
        if (!isset(self::$_instances[$class])) {
            self::$_instances[$class] = new $class();
        }
        return self::$_instances[$class];
    }
}
class A extends Singleton {
    public static function getInstance() {
        return parent::getInstance();
    }
}
class B extends Singleton {
    public static function getInstance() {
        return parent::getInstance();
    }
}
class C extends A {
    public static function getInstance() {
        return parent::getInstance();
    }
}

$a = A::getInstance();
$b = B::getInstance();
$c = C::getInstance();

echo "\$a is a " . get_class($a) . "<br />";
echo "\$b is a " . get_class($b) . "<br />";
echo "\$c is a " . get_class($c) . "<br />";
?>

I don't know about if performance would increase if debug_backtrace() is skipped and instead have getInstance() to accept a passed class retrieved by get_class() method as parameter as described in a post below.

By having set getInstance() to protected in the Singleton class, the function is required to be overridden (good OOP practice).

One thing to mention is, that there is no error checking in case $class is null or undefined, which would result in a fatal error. At the moment, though, I can't see how it could happen when the getInstance() is protected, i.e. has to be overridden in a subclass -- but with good coding practice you should always error check.
mightye at gmail dot com 23-Jun-2007 06:20
To: Bryan

In this model it is still workable if your singleton variable is actually an array.  Consider:
<?php
abstract class Singleton {
    protected final static $instances = array();

    protected __construct(){}

    protected function getInstance() {
        $class = get_real_class(); // imaginary function returning the final class name, not the class the code executes from
        if (!isset(self::$instances[$class])) {
            self::$instances[$class] = new $class();
        }
        return self::$instances[$class];
    }
}
class A extends Singleton {
}
class B extends Singleton {
}

$a = A::getInstance();
$b = B::getInstance();

echo "\$a is a " . get_class($a) . "<br />";
echo "\$b is a " . get_class($b) . "<br />";
?>
This would output:
$a is a A
$b is a B

The only alternative as described elsewhere is to make getInstance() protected abstract, accept the class name as an argument, and extend this call with a public final method for every sub-class which uses get_class() in its local object scope and passes it to the superclass.

Or else create a singleton factory like this:
<?php
final class SingletonFactory {
    protected static $instances = array();

    protected getInstance($class) {
        if (!isset(self::$instances[$class])) {
            self::$instances[$class] = new $class();
        }
        return self::$instances[$class];
    }
}
?>
The downside to this of course to this latter model is that the class itself doesn't get to decide if it is a singleton, the calling code gets to decide this instead, and a class that really wants or *needs* to be a singleton has no way to enforce this, not even by making its constructor protected.

Basically these design patterns, and various other meta manipulations (things which operate on the nature of the object, not on the data the object holds) could benefit greatly from knowing exactly what the final type of this object is, and not having native access to this information obligates work-arounds.
janci 30-Apr-2007 12:00
To yicheng zero-four at gmail dot com: Another, maybe better example where finding out the real class (not the class we are in) in static method should be quite usefull is the Singleton pattern.

There is currently no way how to create an abstract Singleton class that could be used just by extending it without the need to change the extended class. Consider this example:
<?php
abstract class Singleton
{
    protected static $__instance = false;

    public static function getInstance()
    {
        if (self::$__instance == false)
        {
            // This acctually is not what we want, $class will always be 'Singleton' :(
            $class = get_class();
            self::$__instance = new $class();
        }
        return self::$__instance;
    }
}

class Foo extends Singleton
{
    // ...
}

$single_foo = Foo::getInstance();
?>
This piece of code will result in a fatal error saying: Cannot instantiate abstract class Singleton in ... on line 11

The best way I figured out how to avoid this requires simple but still a change of the extended (Foo) class:
<?php
abstract class Singleton
{
    protected static $__instance = false;

    protected static function getInstance($class)
    {
        if (self::$__instance == false)
        {
            if (class_exists($class))
            {
                self::$__instance = new $class();
            }
            else
            {
                throw new Exception('Cannot instantiate undefined class [' . $class . ']', 1);
            }
        }
        return self::$__instance;
    }
}

class Foo extends Singleton
{
    // You have to overload the getInstance method in each extended class:
    public static function getInstance()
    {
        return parent::getInstance(get_class());
    }
}

$single_foo = Foo::getInstance();
?>

This is of course nothing horrible, you will propably need to change something in the extended class anyway (at least the constructor access), but still... it is just not as nice as it possibly could be ;)
yicheng zero-four at gmail dot com 18-Jan-2007 12:22
This a response to luke at liveoakinteractive dot com and davidc at php dot net.  Static methods and variables, by definition, are bound to class types not object instances.  You should not need to dynamically find out what class a static method belongs to, since the context of your code should make it quite obvious.  Your questions reveals that you probably don't quite understand OOP quite yet (it took me a while as well).

Luke, the observed behavior from your particular code snippet makes perfect sense when you think about it.  The method getclass() is defined in BooBoof, so the __CLASS__ macro would be bound to BooBoof and defined in relation to the BooBoof class.  The fact that CooCoof is a subclass of BooBoof just means that it gains a shortcut to BooBoof::getclass().  So, in effect, you are really asking (in a convoluted way): "What is the class to which belongs the method call BooBoof::getclass()?"  The correct solution (if you actually want/need to do this) is to simply implement CooCoof::getclass() { return __CLASS__; } inside of the CooCoof definition, and any childclasses that you want to mimic this behavior.  CooCoof::getclass() will have the expected behavior.
luke at liveoakinteractive dot com 06-Dec-2006 07:03
This note is a response to the earlier post by davidc at php dot net. Unfortunately, the solution posted for getting the class name from a static method does not work with inherited classes.

Observe the following:
<?php
class BooBoof {
  public static function getclass() {
    return __CLASS__;
  }

  public function retrieve_class() {
    return get_class($this);
  }
}

class CooCoof extends BooBoof {
}

echo CooCoof::getclass();
// outputs BooBoof

$coocoof = new CooCoof;
echo $coocoof->retrieve_class();
// outputs CooCoof
?>

__CLASS__ and get_class($this) do not work the same way with inherited classes. I have been thus far unable to determine a reliable way to get the actual class from a static method.
benjaminhill at gmail dot com 27-Apr-2006 10:47
More funkyness:

class Parent {
   function displayTableName() {
      echo get_class($this);
      echo get_class();
   }
}

class Child {
   function __construct() {
      $this->displayTableName();
   }
}

Will return
- Child
- Parent

So when they say "the object isn't required in PHP5" - they don't really mean it.
refrozen dot com 05-Jul-2005 03:01
philip at cornado dot com, it returns the value of the class from which it was called, rather than the instance's name... causing inheritance to result in unexpected returns
MagicalTux at FF.ST 02-Feb-2004 04:11
Note that the constant __CLASS__ is different from get_class($this) :
<?
  class test {
    function whoami() {
      echo "Hello, I'm whoami 1 !\r\n";
      echo "Value of __CLASS__ : ".__CLASS__."\r\n";
      echo "Value of get_class() : ".get_class($this)."\r\n\r\n";
    }
  }
  class test2 extends test {
    function whoami2() {
      echo "Hello, I'm whoami 2 !\r\n";
      echo "Value of __CLASS__ : ".__CLASS__."\r\n";
      echo "Value of get_class() : ".get_class($this)."\r\n\r\n";
      parent::whoami(); // call parent whoami() function
    }
  }
  $test=new test;
  $test->whoami();
  $test2=new test2;
  $test2->whoami();
  $test2->whoami2();
?>

The output is :
Hello, I'm whoami 1 !
Value of __CLASS__ : test
Value of get_class() : test

Hello, I'm whoami 1 !
Value of __CLASS__ : test
Value of get_class() : test2

Hello, I'm whoami 2 !
Value of __CLASS__ : test2
Value of get_class() : test2

Hello, I'm whoami 1 !
Value of __CLASS__ : test
Value of get_class() : test2

In fact, __CLASS__ returns the name of the class the function is in and get_class($this) returns the name of the class which was created.


Liste toutes les classes définies dans PHP

  • « get_class
  • get_declared_interfaces »
  • PHP Manual
  • Fonctions Classes/Objets
  • Liste toutes les classes définies dans PHP

get_declared_classes

(PHP 4, PHP 5, PHP 7, PHP 8)

get_declared_classes — Liste toutes les classes définies dans PHP

Description

get_declared_classes ( ) : array

Liste toutes les classes définies.

Valeurs de retour

Retourne un tableau contenant la liste des noms des classes déclarées dans le script courant.

Note:

Notez que suivant les extensions qui sont compilées ou chargées dans PHP, d'autres classes peuvent être présentes. Cela signifie que vous ne pourrez pas utiliser ces noms de classes pour définir vos propres classes. Voici une liste des classes prédéfinies.

Historique

Version | Description
7.4.0 | Précédement get_declared_classes() retournait toujours les classes parentes avant les classes enfant. Ceci n'est plus le cas. Aucun ordre particulier n'est garentie pour la valeur de retour de get_declared_classes().

Exemples

Exemple #1 Exemple avec get_declared_classes()

<?php
print_r(get_declared_classes());
?>

Résultat de l'exemple ci-dessus est similaire à :

Array
(
    [0] => stdClass
    [1] => __PHP_Incomplete_Class
    [2] => Directory
)

Voir aussi

  • class_exists() - Vérifie si une classe a été définie
  • get_declared_interfaces() - Retourne un tableau avec toutes les interfaces déclarées
  • get_defined_functions() - Liste toutes les fonctions définies

User Contributed Notes

brain at code dot com 14-Feb-2014 08:53
get-declared-classes makes no sense at all, if u maybe, later for production, merge class files in one package file.

lets say: package.php
print_r(get_declared_classes());
class declaredHere { }
print_r(get_declared_classes());

so in this case, the declaredHerr class is defined at the first call of print_r();
because PHP-complier runs a hole file and declare Stuff before running the code.

But (Lovely PHP):
print_r(get_declared_classes());
if(true){
class declaredHere { }
}
print_r(get_declared_classes());
Will print the declaredHere class only in the second print_r.

Its not a Bug it a...
yarco dot wang at gmail dot com 24-Nov-2013 07:32
those above comments are too old.
now, whatever the order is, the output will be the same:

<?php
class Test1
{}

print_r(get_declared_classes());

class Test2
{}

print_r(get_declared_classes());

?>

will output the same result.
dcahh at gmx de 29-Feb-2008 09:23
This function considers only classes and subclasses. Not subsubclasses.

In fact I have code that provides an abstract class and then classes using this abstract class. Further I have subclasses to my concrete classes - which is why my subclasses are not listed within the returned array.
dexen + goofy _ pl 25-Sep-2007 11:32
Summary:
 * in PHP 5.1 class names have case preserved
 * contrary, in PHP 4.4 class names are downcased, withe exception of a few build-in ones

The get_declared_classes() funcition returns the list of names with case preserved, as of PHP 5.1 series (prolly 5.0 too, but i have no way to test it right now). Since PHP generally is caseless in regard to names of classes, this may come at a surprise. Also, this could potentially break older code asssuming downcased list.

Take extra care when  checking for existence of a class. Following example is, potentially, error prone: <?php in_array( $className, $classget_declared_classes() ) ?>

A sure-fire (while slower) way would be to iterate over the array and normalize case to, say, lower:

<?php
$exists = FALSE;
$className = strtolower( $className );
foreach ( get_declared_classes() as $c ) {
    if ( $className === strtolower( $c ) ) {
        $exists = TRUE;
        break;
    }
}?>

Optimization of the above snippet is left as a simple excercise to the reader ;)
-- dexen deVries
matt at mattsoft dot net 21-Dec-2005 02:58
classes can't be unloaded. probably not very practical to implement that in a future version. I wouldn't go out of my way to do it if I were zend. you're better off finding a workaround. it's better programming technique to find a way around having to do that anyway.

http://www.zend.com/zend/week/week223.php#Heading10
22-Mar-2005 09:16
Regarding note of 3-21:

<?php

class myclass {}

$class = 'myclass';
$instance = new $class();

?>

This function could also be used to determine the names of classes defined in a particular file by calling it before and after include. It's hardly a pointless function.
matt-php at DONT-SPAM-ME dot bitdifferent dot com 01-Nov-2004 07:41
The array returned by this function will be in the order the classes were defined / included / required and this order does not appear to change.

For example:

<?PHP

//define classone
class classone { }

//define classtwo
class classtwo { }

//This will show X classes (built-ins, extensions etc) with
//classone and classtwo as the last two elements

print_r(get_declared_classes());

//define classthree
class classthree { }

//...and four
class classfour { }

//Shows the same result as before with class three and four appended
print_r(get_declared_classes());

?>

Output:

Array
(
   [0] => stdClass
   [1] .... other defined classes....
   [10] => classone
   [11] => classtwo
 )

and...

Array
(
   [0] => stdClass
   [1] .... other defined classes....
   [10] => classone
   [11] => classtwo
   [12] => classthree
   [13] => classfour
)
Jazeps Basko 07-Feb-2004 11:52
In PHP5, you don't get declared interfaces by calling this function!!!
To get interfaces you should use get_declared_interfaces(). However, to check if an interface is already defined, you should use class_exists()! This is strange, but PHP team does not think so.
smokey 20-Mar-2003 03:06
you cannot remove them. they are "defined", which happens when the class is being loaded from the parser. you just deleted an instance of a class.


Retourne un tableau avec toutes les interfaces déclarées

  • « get_declared_classes
  • get_declared_traits »
  • PHP Manual
  • Fonctions Classes/Objets
  • Retourne un tableau avec toutes les interfaces déclarées

get_declared_interfaces

(PHP 5, PHP 7, PHP 8)

get_declared_interfaces — Retourne un tableau avec toutes les interfaces déclarées

Description

get_declared_interfaces ( ) : array

Retourne un tableau avec toutes les interfaces déclarées.

Valeurs de retour

Retourne un tableau contenant les noms des interfaces déclarées dans le script courant.

Exemples

Exemple #1 Exemple avec get_declared_interfaces()

<?php
print_r(get_declared_interfaces());
?>

Résultat de l'exemple ci-dessus est similaire à :

Array
(
    [0] => Traversable
    [1] => IteratorAggregate
    [2] => Iterator
    [3] => ArrayAccess
    [4] => reflector
    [5] => RecursiveIterator
    [6] => SeekableIterator
)

Voir aussi

  • interface_exists() - Vérifie si une interface a été définie
  • get_declared_classes() - Liste toutes les classes définies dans PHP
  • class_implements() - Retourne les interfaces implémentées par une classe ou une interface donnée

User Contributed Notes

There are no user contributed notes for this page.


Retourne un tableau contenant tous les traits déclarés

  • « get_declared_interfaces
  • get_object_vars »
  • PHP Manual
  • Fonctions Classes/Objets
  • Retourne un tableau contenant tous les traits déclarés

get_declared_traits

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

get_declared_traits — Retourne un tableau contenant tous les traits déclarés

Description

get_declared_traits ( ) : array

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un tableau contenant comme valeurs les noms de tous les traits déclarés. Retourne null en cas d'échec.

Voir aussi

  • class_uses() - Retourne les traits utilisé par une classe donnée.
  • trait_exists() - Vérifie si un trait existe

User Contributed Notes

@everaldofilho 14-Jul-2019 04:57
Example of use:

<?php

namespace Example;

// Declare Trait
trait FooTrait
{
}

// Declare Abstract class
abstract class FooAbstract
{
}

// Declare class
class Bar extends FooAbstract
{
    use FooTrait;
}

// Get all traits declareds
$array = get_declared_traits();

var_dump($array);
/**
 * Result:

 * array(1) {
 *  [0] =>
 *  string(23) "Example\FooTrait"
 * }
 */


Retourne les propriétés d'un objet

  • « get_declared_traits
  • get_parent_class »
  • PHP Manual
  • Fonctions Classes/Objets
  • Retourne les propriétés d'un objet

get_object_vars

(PHP 4, PHP 5, PHP 7, PHP 8)

get_object_vars — Retourne les propriétés d'un objet

Description

get_object_vars ( object $object ) : array

Récupère les propriétés non-statiques de l'objet object, accessibles depuis le contexte.

Liste de paramètres

object

Une instance d'un objet.

Valeurs de retour

Retourne un tableau associatif contenant les propriétés non-statiques, accessibles depuis le contexte courant, de l'objet object.

Exemples

Exemple #1 Exemple avec get_object_vars()

<?php

class foo {
    private $a;
    public $b = 1;
    public $c;
    private $d;
    static $e;

    public function test() {
        var_dump(get_object_vars($this));
    }
}

$test = new foo;
var_dump(get_object_vars($test));

$test->test();

?>

L'exemple ci-dessus va afficher :

array(2) {
  ["b"]=>
  int(1)
  ["c"]=>
  NULL
}
array(4) {
  ["a"]=>
  NULL
  ["b"]=>
  int(1)
  ["c"]=>
  NULL
  ["d"]=>
  NULL
}

Voir aussi

  • get_class_methods() - Retourne les noms des méthodes d'une classe
  • get_class_vars() - Retourne les valeurs par défaut des propriétés d'une classe

User Contributed Notes

niemans at pbsolo dot nl 02-Jan-2021 04:47
You can use an anonymous class to return public variables from inside the class:

public function getPublicVars () {
    $me = new class {
        function getPublicVars($object) {
            return get_object_vars($object);
        }
    };
    return $me->getPublicVars($this);
}

Test script:

class Test {
    protected $protected;
    public    $public;
    private   $private;
    public function getAllVars () {
        return call_user_func('get_object_vars', $this);
    }
    public function getPublicVars () {
        $me = new class {
            function getPublicVars($object) {
                return get_object_vars($object);
            }
        };
        return $me->getPublicVars($this);
    }
}

$test = new Test();
print_r(get_object_vars($test)); // array("public" => NULL)
print_r($test->getAllVars());   // array("protected" => NULL, "public" => NULL, "private" => NULL)
print_r($test->getPublicVars()); // array("public" => NULL)
iluxaorlov at yandex dot ru 23-Sep-2020 01:58
When we use typed properties that was never set and not initialized:

<?php

class Test
{
    public string $notInitialized;
}

$test = new Test();
$vars = get_object_vars($test);
var_dump($vars); // array(0) { }

?>

But:

<?php

class Test
{
    public $notTyped;
    public string $initialized = '';
}

$test = new Test();
$vars = get_object_vars($test);
var_dump($vars); // array(2) { ["notTyped"]=> NULL ["string"]=> string(0) "" }

?>
beat 07-Nov-2014 11:39
If your object contains a reference, beware that you might get references for all object properties in the array values, thus when changing values in the array, they may change the object too (confirmed and not yet fixed PHP bug https://bugs.php.net/bug.php?id=66961 affecting all PHP versions up to at least 5.6.2 and 5.5.18 and 5.4.34).

This 10-years old comment tried reporting this: http://php.net/manual/en/function.get-object-vars.php#40515 but its exemple was incomplete. See bug report for example.
lee dot howarth dot 90 at gmail dot com 13-Apr-2014 10:48
I find this function very helpful, What i wanted to do was to get the object properties of an exception so i could sanitize them for output.

   try
   {
       throw new Exception( 'Test Exception.', 100 );
   }
   catch( Exception $e )
   {
       var_dump( ( object ) get_object_vars( ( object ) ( new ArrayObject( $e ) ) -> getarrayCopy() ) );
   }

Example return:

object(stdClass)#10 (4) { ["message"]=> string(15) "Test Exception." ["code"]=> int(100) ["file"]=> string(29) "C:\xampp\htdocs\dev\index.php" ["line"]=> int(19) }
rabatto1 at web dot de 03-Feb-2014 04:21
function to convert object (with children) to an (associative) array ... recusive

<?php

// ---------------------------------------------------------
// ----- object_to_array_recusive --- function (PHP) ------
// --------------------------------------------------------
// -- arg1:  $object  =  (PHP Object with Children)
// -- arg2:  $assoc   =  (TRUE / FALSE) - optional
// -- arg3:  $empty   =  ('' or NULL) - optional
// --------------------------------------------------------
// ----- return: Array from Object --- (associative) ------
// --------------------------------------------------------

function object_to_array_recusive ( $object, $assoc=1, $empty='' )
{
    $out_arr = array();
    $assoc = (!empty($assoc)) ? TRUE : FALSE;

    if (!empty($object)) {

        $arrObj = is_object($object) ? get_object_vars($object) : $object;

        $i=0;
        foreach ($arrObj as $key => $val) {
            $akey = ($assoc !== FALSE) ? $key : $i;
              if (is_array($val) || is_object($val)) {
                $out_arr[$key] = (empty($val)) ? $empty : object_to_array_recusive($val);
              }
              else {
                $out_arr[$key] = (empty($val)) ? $empty : (string)$val;
              }
        $i++;
        }

    }

    return $out_arr;
}

// --------------------------------------------------------
// --------------------------------------------------------

?>

Example / Usage:

a) return an associative (recusive) array from object

$new_arr1 = object_to_array_recusive($my_object);
// --- or --- object_to_array_recusive($my_object,TRUE);
// --- or --- object_to_array_recusive($my_object,1);

b) return a numeric  (recusive) array from object (set 2nd argument = FALSE)

$new_arr2 = object_to_array_recusive($my_object,FALSE);

you can pre-set the Array-Value of Empty (Sub-) Objects in 3rd argument ($empty)
// --- eg: NULL --- object_to_array_recusive($my_object,1,NULL);
oom at oscarotero dot com 09-Oct-2013 09:37
You can use call_user_func() to return public variables from inside the class:

class Test {
    protected $protected;
    public $public;
    private $private;

    public function getPublicVars () {
        return call_user_func('get_object_vars', $this);
    }
}

$test = new Test();
var_dump($test->getPublicVars()); // array("public" => NULL)
jozef at mostka dot com 03-Sep-2013 06:59
class A{
    private $priA;
    protected $proA;
    public $pubA;
}

class B extends A{
    private $priB;
    protected $proB;
    public $pubB;

    public function getVars(){
        return array_diff_key(get_object_vars($this), get_class_vars(get_parent_class($this)));
    }
}
$b = new B();
var_dump($b->getVars());

array(3) {
  ["priB"]=>
  NULL
  ["proB"]=>
  NULL
  ["pubB"]=>
  NULL
}
kuko at webperfection dot net 16-Apr-2013 11:09
get_object_vars($this)
php5.3 + it returns only public and protected; NOT private vars
@chozilla 11-Feb-2013 12:35
A simple way to call this function within an Object and to only export the *public* params would be to artificially change the scope - for example with a closure in php 5.3:

<?php
class Example
{
    public $publicSetting = 'public';
    protected $protectedSetting = 'protected';
    private $privateSetting = 'private';

    public function showEverything()
    {
        return get_object_vars($this);
    }

    public function showMyPublicsOnly()
    {
        $me = $this;
        $publics = function() use ($me) {
            return get_object_vars($me);
        };
        return $publics();
    }
}
?>
Fabien Haddadi 30-May-2012 09:42
It seems like there's no function that determines all the *static* variables of a class.

I've come out with this one as I needed it in a project:

<?php
function get_class_static_vars($object) {
     return array_diff(get_class_vars(get_class($object)), get_object_vars($object));
}
?>

It relies on an interesting property: the fact that get_object_vars only returns the non-static variables of an object.
Dionisiy 20-Apr-2012 06:21
Note that before PHP 5.3.9 numeric object variables of unserialized object are not public, and get_object_vars() won't return them:
https://bugs.php.net/bug.php?id=61774
elminster2031 at hotmail dot com 07-Jul-2010 12:30
Also note that this is recursive. For example:

<?php
class Sarah{

    private $Father;
    private $Mother;

    public function __construct(){
        $this->Father    =    NULL; //I don't know Sarah's Father
        $this->Mother    =    NULL; //I don't know Sarah's Mother
    }
}
class John_Connor{

    private $Father;
    private $Mother;

    public function __construct(){
        $this->Father    =    $this; //John went back in time and fathered himself
        $this->Mother    =    new Sarah(); //Sarah was his mom and his mate ewww
    }

    public function showParents(){
        return get_object_vars($this);
    }
}

$John    =    new John_Connor();
var_dump($John->showParents());
?>

You will see this outputs:

array(2) {
  ["Father"]=>
  object(John_Connor)#1 (2) {
    ["Father":"John_Connor":private]=>
    object(John_Connor)#1 (2) {
      ["Father":"John_Connor":private]=>
      *RECURSION*
      ["Mother":"John_Connor":private]=>
      object(Sarah)#2 (2) {
        ["Father":"Sarah":private]=>
        NULL
        ["Mother":"Sarah":private]=>
        NULL
      }
    }
    ["Mother":"John_Connor":private]=>
    object(Sarah)#2 (2) {
      ["Father":"Sarah":private]=>
      NULL
      ["Mother":"Sarah":private]=>
      NULL
    }
  }
  ["Mother"]=>
  object(Sarah)#2 (2) {
    ["Father":"Sarah":private]=>
    NULL
    ["Mother":"Sarah":private]=>
    NULL
  }
}
benny at nospam dot com 26-Dec-2009 01:31
Be aware of the fact that this is scope-sensitive. If you're calling this from an objects own method, then private and protected vars will be outputted as well. Call it from outside the object and the result will most likely be what you want to archive.
huzursuz at mailinator dot com 02-Feb-2009 08:44
better version of conv_obj, based on XML... this converts XML to an array... use it by

<?php
$result = xmlobj2arr(simplexml_load_string($xmlContent));

function xmlobj2arr($Data) {
       if (is_object($Data)) {
               foreach (get_object_vars($Data) as $key => $val) {
                       $ret[$key] = xmlobj2arr($val);
               }
               return $ret;
       } elseif (is_array($Data)) {
               foreach ($Data as $key => $val) {
                       $ret[$key] = xmlobj2arr($val);
               }
               return $ret;
       } else {
               return $Data;
       }
}
?>
jon at websandbox dot net 05-Jul-2008 09:00
If you're using the SPL ArrayObject class (or similar, or the ArrayAccess interface), you may have noticed that it's difficult to loop through an object's properties.

get_object_vars does not return the properties of an ArrayObject.  The only workaround I can see is to use get_class_vars.

<?php
$obj = new ArrayObject();
$obj->foo = "bar";
$obj[] = "1";
$obj[] = "2";
foreach($obj as $key => $value) {
 // will iterate over the array, iterating over "1" and "2", but ignoring $obj->foo
}

var_dump($obj); // dumps the array values, ignores $obj->foo

$a = get_object_vars($obj); // returns an empty array

class Fart extends ArrayObject {
    public $foo = "bar";
}

$obj = new Fart();
$a = get_object_vars($obj); // return an empty array
$a = get_class_vars(get_class($obj)); // returns array("foo"=>"bar"), Yay!

/* The above works with subclasses as well */
class Toot extends Fart {
    public $weeble = "wobble";
}

$a = get_class_vars(get_class($obj));
// returns array("weeble" => "wobble", "foo"=>"bar"), Yay again!

?>

So, to iterate over the properties of an ArrayObject, and not the array values:

<?php

$obj = new Toot(); // which is a subclass of ArrayObject
$props = get_class_vars(get_class($obj));
foreach($props as $prop => $defaultValue) {
  $value = $obj->$prop; // now you have the property name and  its value
}

?>
pardini at gmail dot com 08-May-2008 04:38
get_object_vars() has confusing behaviour when called as get_object_vars($this) or similar: since a method inside a class definition can access private vars, apparently so can get_object_vars(), so it returns private vars as well.

A simple workaround is to define a method that in itself calls get_object_vars, like:

<?php
function getPublicObjectVars($obj) {
  return get_object_vars($obj);
}

class Smth {
  private $notShown = 1;
  public $shown = 2;

  function test() {
    $vars = get_object_vars($this); // includes 'notShown'
    $vars = getPublicObjectVars($this); // only 'shown'
  }

}
?>
biga888 AT gmail 19-Nov-2007 12:48
Just thought I would pass this on.

Working with PHP 5.2.4

In Windows this works by reading the vars from the passed in object and copying them to the vars of the current object.

    public function copyMe(User $user) {
        $varArray = get_object_vars($this);
        $copyVarArray = get_object_vars($user);
        foreach ($varArray as $key=>$value) {
            $this->$key = $copyVarArray[$key];
        }
    }

This did not work in Linux, I had to add another function to return the array of vars. Calling get_array_vars on the passed in object would return an empty array.

        public function copyMe(User $user) {
        $varArray = $this->getArray();
        $copyVarArray = $user->getArray();
        foreach ($varArray as $key=>$value) {
            $this->$key = $copyVarArray[$key];
        }
    }

    public function getArray() {
        return get_object_vars($this);
    }
firemouth at gmail dot com 10-Sep-2007 06:48
This is a slight modification of the previous poster's function.  We ran into a problem using this function when we had a JS array nested inside a JS hash.

Something like this...

myHash = new Hash();
myHash[address] = new Array();

When we threw that at this function, it found the first hash as an object, and then using the previous poster's function, it did not consider the array as an "object."  Instead it gave us a std_object type and we were unable to make any use of it.

The modification we made was adding a check for is_array inside both the is_object and is_array checks when you call the function.  This checks for an array inside either an object or a nested array.

function conv_obj($Data){
    if(is_object($Data)){

        foreach(get_object_vars($Data) as $key=>$val){
            if(is_object($val) || is_array($val)){
                $ret[$key]=conv_obj($val);
            }else{
                $ret[$key]=$val;
            }
        }
        return $ret;
    }elseif(is_array($Data)){
        foreach($Data as $key=>$val){
            if(is_object($val) || is_array($val)){
                $ret[$key]=conv_obj($val);
            }else{
                $ret[$key]=$val;
            }
        }
        return $ret;
    }else{
        return $Data;
    }
}
C.H. 15-Aug-2007 06:03
function conv_obj($Data){
     if(is_object($Data)){
         foreach(get_object_vars($Data) as $key=>$val){
             if(is_object($val)){
                 $ret[$key]=conv_obj($val);
             }else{
                 $ret[$key]=$val;
             }
         }
         return $ret;
     }elseif(is_array($Data)){
         foreach($Data as $key=>$val){
             if(is_object($val)){
                 $ret[$key]=conv_obj($val);
             }else{
                 $ret[$key]=$val;
             }
         }
         return $ret;
     }else{
         return $Data;
     }
 }

Very simple function to convert any Subobject to an array.
Created it while working with Soap.
For me as an beginner with PHP, very useful :o)
thinice at gmail dot com 13-Aug-2007 10:46
To add to my previous comment - the error message should have meant same structure.

As my implementation called for cross-class comparison.
Maikel 23-May-2007 11:13
To follow the code of d11wtq (enquiries AT chriscorbyn.co.uk). I did this function to inspect all properties(public, private, protected) of object.

<?php
header("content-type: text/plain");

// Classes to test!
class OtherClass
{
    private $privateVarOtherClass = 11;
}

class MyClass extends OtherClass
{
    protected $protectedVar = "some";
    public $publicVar = "nk";
    private $privateVar = "algo";
    var $oldStyle;
}

// Dangerous function
function get_properties($obj, $values=false)
{
    $obj_dump  = print_r($obj, 1);
    $matches =  array();
    preg_match_all('/^\s+\[(\w+).*\] => (\w*)/m', $obj_dump, $matches);
    if ($values)
    {
        $output = array();
        foreach ($matches[1] as $key => $property)
        {
            $output[$property] = $matches[2][$key];
        }
        return $output;
    }
    else
    {
        return $matches[1];
    }
}

$instance = new MyClass();

echo "Properties\n";
print_r(get_properties($instance));

echo "Properties and values\n";
print_r(get_properties($instance, true));

?>

Note: remember that static properties are not visible to the object. By that not supported to them
thiago dot henrique dot mata at gmail dot com 21-Feb-2007 11:23
<?php
# How to make a function change the private attributes
# from some object without use serialize functions or
# lose the control of the changes.

/**
 * Parent Class to allow the change of privates attributes
 * Look the abstract function __setAttribute.
 *
 * @author Renan de Lima ( renandelima@gmail.com )
 * @author Thiago Mata ( thiago.henrique.mata@gmail.com )
 * @date 2007-02-21
 */
abstract class father
{
    /**
     * Receive the Aray and try to change the attribute value
     *
     * @param array $arrNewValues
     */
    public function __fromDatabase( $arrNewValues )
    {
        $arrToSet = array_intersect_key( $arrNewValues, get_object_vars( $this ) );
        foreach( $arrToSet as $strAttribute => $mixValue )
        {
            $this->__setAttribute( $strAttribute , $mixValue );
        }
    }

    /**
     * Required method to control the attributes of class
     * @param string $strAttribute
     * @param unknown $mixValue
     */
    abstract protected function __setAttribute( $strAttribute, $mixValue );

}

/**
 * Just a example of a child class using the functionality
 *
 * Note: if you don't wanna to allow the change of some attribute
 * by this method you can just make more complex the __setAttribute function.
 *
 * @author Renan de Lima ( renandelima@gmail.com )
 * @author Thiago Mata ( thiago.henrique.mata@gmail.com )
 * @date 2007-02-21
 */
class son extends father
{

    private $atr = 9;

    /**
     * This is the most simple implementation of the method.
     * This way it's allowed to the parent class change any attribute
     * @param string $strAttribute
     * @param unknown $mixValue
     */
    protected function __setAttribute( $strAttribute, $mixValue )
    {
        $this->{ $strAttribute } = $mixValue;
    }

}

$objSon = new son();
$objSon->__fromDatabase( array( 'atr' => 55 ) );
var_dump( $objSon );
?>
ananda dot putra at gmail dot com 01-Mar-2006 03:49
Hi all, I just wrote a function which dumps all the object propreties and its associations recursively into an array. Here it is..
<?php
function object_to_array($obj) {
        $_arr = is_object($obj) ? get_object_vars($obj) : $obj;
        foreach ($_arr as $key => $val) {
                $val = (is_array($val) || is_object($val)) ? object_to_array($val) : $val;
                $arr[$key] = $val;
        }
        return $arr;
}
?>

Example:
You have an object like this:
fruitsbasket Object
(
    [Fruits] => Array
        (
            [0] => fruits Object
                (
                    [_name] => Mango
                    [_color] => Green
                    [_weight] => 10
                )

            [1] => fruits Object
                (
                    [_name] => Apple
                    [_color] => Red
                    [_weight] => 15
                )

            [2] => fruits Object
                (
                    [_name] => Grape
                    [_color] => Purple
                    [_weight] => 5
                )

        )

    [total_weight] => 30
)

just do:
<?php
$the_array = object_to_array($the_object);
print_r($the_array);
?>

it will produce an array:
Array
(
    [Fruits] => Array
        (
            [0] => Array
                (
                    [_name] => Mango
                    [_color] => Green
                    [_weight] => 10
                )

            [1] => Array
                (
                    [_name] => Apple
                    [_color] => Red
                    [_weight] => 15
                )

            [2] => Array
                (
                    [_name] => Grape
                    [_color] => Purple
                    [_weight] => 5
                )

        )

    [total_weight] => 30
)

I wish function like this could be usefull for you all. :)
support at sascha minus diebel dot de 23-Dec-2005 02:55
Note that get_object_vars() returns the variables of the object not the class. You need to know if your class is extended from a parent class.
d11wtq (enquiries AT chriscorbyn.co.uk) 17-Nov-2005 03:40
Since there's no apparent means of obtaining all the *private* properties in an object I wrote a little function to do it.  Built in support would be much more efficient since mine uses a preg_  search to do this....

<?php

function get_private_properties($obj, $inside=false)
{
    $obj_dump  = print_r($obj, 1);
    preg_match_all('/^\s+\[(\w+):private\]/m', $obj_dump, $matches);
    if ($inside)
    {
        $output = array();
        foreach ($matches[1] as $property)
        {
            $output[$property] = $obj->$property;
            return $output;
        }
    }
    else return $matches[1];
}

?>

So if you run it with the optional second paramter missing you'll just get an array of the variable names that are private inside the class.  This is the only option if you are not inside the actual object and the object has no private properties inherited.

If you run it with the second parameter set to true you will get an associative array with the properties and their corresponding values.  I'd only advise to do that for singletons since you may get errors if there are any private properites in parents/children.
pascal dot poncet at netconsult dot com 13-Oct-2005 07:20
Subject: using "sql_calc_found_rows" in a MySQL query while exploiting result in a PHP db class object.

Hello,

There is a nice function in MySQL that allows to know how many records would have been returned if no "where" clause were set : SQL_CALC_FOUND_ROWS.

If you have create a db object to collect the returned lines, you will be a little perplex when trying to call the result of this function.

Why ?
Simply because the returned field's name is "found_rows()" and obviously it's not possible to call something like :

<?php $result->found_rows() ?>

...as it will try to acces a method, not a property !

Then, the only way to get the right result seems to be the use of a class function, like :

<?php
  $db->query("select found_rows()");
  $count=current(get_object_vars(current($db->result)));
?>

Of course, if somebody found an other way to solve it, like a special syntax (see the one used with curled arrays in a string), I'm really open to discuss.

Good luck,
Pascal
Marc 23-Aug-2005 06:08
If you want to access all properties (private, protected, public) of a class and his base class(es) from outside the object you can take a look in the code below.
You can even reffrence them.

Example:
<?php

// Dummy class to act as parent class.
class Dummy
{
    private        $d1 = 1;
    protected    $d2 = 2;
    public        $d3 = 3;
}

// The class to test on.
class Test extends Dummy
{
    private        $t1 = 11;
    protected    $t2 = 12;
    public        $t3 = 13;
}

// Instance of the test class.
$test =& new Test();

// The propertynames of the test class and his parent.
$nameD1 = "\0Dummy\0d1";    // class Dummy, private      $d1
$nameD2 = "\0*\0d2";        // class Dummy, protected $d2
$nameD3 = "d3";            // class Dummy, public    $d3

$nameT1 = "\0Test\0t1";        // class Test,  private      $t1
$nameT2 = "\0*\0t2";        // class Test,  protected $t2
$nameT3 = "t3";            // class Test,  public    $t3

// Printing all members (private, protected, public) of test class and parent.
// These are the values at construction.
print("Original object:\n");
print("\t\$d1 = ".$test->$nameD1."\n");
print("\t\$d2 = ".$test->$nameD2."\n");
print("\t\$d3 = ".$test->$nameD3."\n");
print("\t\$t1 = ".$test->$nameT1."\n");
print("\t\$t2 = ".$test->$nameT2."\n");
print("\t\$t3 = ".$test->$nameT3."\n");
print("\n");

// Create new values to use as reffrence.
$varD1 = 31;
$varD2 = 32;
$varD3 = 33;

$varT1 = 41;
$varT2 = 42;
$varT3 = 43;

// Reffrence these to the class properties.
$test->$nameD1 =& $varD1;
$test->$nameD2 =& $varD2;
$test->$nameD3 =& $varD3;

$test->$nameT1 =& $varT1;
$test->$nameT2 =& $varT2;
$test->$nameT3 =& $varT3;

// Printing all members (private, protected, public) of test class and parent.
// The values have changed by assigning reffrence to them.
print("Object Changed by reffrence (1):\n");
print("\t\$d1 = ".$test->$nameD1."\n");
print("\t\$d2 = ".$test->$nameD2."\n");
print("\t\$d3 = ".$test->$nameD3."\n");
print("\t\$t1 = ".$test->$nameT1."\n");
print("\t\$t2 = ".$test->$nameT2."\n");
print("\t\$t3 = ".$test->$nameT3."\n");
print("\n");

// Change the original values.
// This will change the class properties.
$varD1 = 61;
$varD1 = 62;
$varD1 = 63;

$varT1 = 71;
$varT1 = 72;
$varT1 = 73;

// Printing all members (private, protected, public) of test class and parent.
// The values have changed because the variables $varXX have been changed.
print("Object Changed by reffrence (2):\n");
print("\t\$d1 = ".$test->$nameD1."\n");
print("\t\$d2 = ".$test->$nameD2."\n");
print("\t\$d3 = ".$test->$nameD3."\n");
print("\t\$t1 = ".$test->$nameT1."\n");
print("\t\$t2 = ".$test->$nameT2."\n");
print("\t\$t3 = ".$test->$nameT3."\n");
print("\n");

// Printing the object using print_r() shows the changes
// have been done on the object.
print("Object Changed (print_r):\n");
print_r($test);
print("\n");

// If you dont now the class propertynames you can get these by casting the
// object to an array. The array keys are the names
$prop = array_keys((array) $test);
print("Getting all class propertynames (print_r)\n");
print_r($prop);

//Result
/*

Original object:
    $d1 = 1
    $d2 = 2
    $d3 = 3
    $t1 = 11
    $t2 = 12
    $t3 = 13

Object Changed by reffrence (1):
    $d1 = 31
    $d2 = 32
    $d3 = 33
    $t1 = 41
    $t2 = 42
    $t3 = 43

Object Changed by reffrence (2):
    $d1 = 63
    $d2 = 32
    $d3 = 33
    $t1 = 73
    $t2 = 42
    $t3 = 43

Object Changed (print_r):
Test Object
(
    [t1:private] => 73
    [t2:protected] => 42
    [t3] => 43
    [d1:private] => 63
    [d2:protected] => 32
    [d3] => 33
)

Getting all class propertynames (print_r)
Array
(
    [0] => Test

*/

?>
stachnik at gmail dot com 02-Aug-2005 09:00
In PHP5 to get an array with all properties (even the private ones) all you have to do is write a public method that returns an array for your class:

public function getArray()
{
  return get_object_vars($this);
}

and then

$myBeautifulArray = $myBeautifulObject->getArray ();

Have BEAUTIFUL day :)
fmmarzoa at librexpresion dot org 01-Nov-2004 11:53
You can still cast the object to an array to get all its members and see its visibility. Example:

<?php

class Potatoe {
    public $skin;
    protected $meat;
    private $roots;

    function __construct ( $s, $m, $r ) {
        $this->skin = $s;
        $this->meat = $m;
        $this->roots = $r;
    }
}

$Obj = new Potatoe ( 1, 2, 3 );

echo "<pre>\n";
echo "Using get_object_vars:\n";

$vars = get_object_vars ( $Obj );
print_r ( $vars );

echo "\n\nUsing array cast:\n";

$Arr = (array)$Obj;
print_r ( $Arr );

?>

This will returns:

Using get_object_vars:
Array
(
    [skin] => 1
)

Using array cast:
Array
(
    [skin] => 1
    [ * meat] => 2
    [ Potatoe roots] => 3
)

As you can see, you can obtain the visibility for each member from this cast. That which seems to be spaces into array keys are '\0' characters, so the general rule to parse keys seems to be:

Public members: member_name
Protected memebers: \0*\0member_name
Private members: \0Class_name\0member_name

I've wroten a obj2array function that creates entries without visibility for each key, so you can handle them into the array as it were within the object:

<?php

function obj2array ( &$Instance ) {
    $clone = (array) $Instance;
    $rtn = array ();
    $rtn['___SOURCE_KEYS_'] = $clone;

    while ( list ($key, $value) = each ($clone) ) {
        $aux = explode ("\0", $key);
        $newkey = $aux[count($aux)-1];
        $rtn[$newkey] = &$rtn['___SOURCE_KEYS_'][$key];
    }

    return $rtn;
}

?>

I've created also a <i>bless</i> function that works similar to Perl's bless, so you can further recast the array converting it in an object of an specific class:

<?php

function bless ( &$Instance, $Class ) {
    if ( ! (is_array ($Instance) ) ) {
        return NULL;
    }

    // First get source keys if available
    if ( isset ($Instance['___SOURCE_KEYS_'])) {
        $Instance = $Instance['___SOURCE_KEYS_'];
    }

    // Get serialization data from array
    $serdata = serialize ( $Instance );

    list ($array_params, $array_elems) = explode ('{', $serdata, 2);
    list ($array_tag, $array_count) = explode (':', $array_params, 3 );
    $serdata = "O:".strlen ($Class).":\"$Class\":$array_count:{".$array_elems;

    $Instance = unserialize ( $serdata );
    return $Instance;
}
?>

With these ones you can do things like:

<?php

define("SFCMS_DIR", dirname(__FILE__)."/..");
require_once (SFCMS_DIR."/Misc/bless.php");

class Potatoe {
    public $skin;
    protected $meat;
    private $roots;

    function __construct ( $s, $m, $r ) {
        $this->skin = $s;
        $this->meat = $m;
        $this->roots = $r;
    }

    function PrintAll () {
        echo "skin = ".$this->skin."\n";
        echo "meat = ".$this->meat."\n";
        echo "roots = ".$this->roots."\n";
    }
}

$Obj = new Potatoe ( 1, 2, 3 );

echo "<pre>\n";
echo "Using get_object_vars:\n";

$vars = get_object_vars ( $Obj );
print_r ( $vars );

echo "\n\nUsing obj2array func:\n";

$Arr = obj2array($Obj);
print_r ( $Arr );

echo "\n\nSetting all members to 0.\n";
$Arr['skin']=0;
$Arr['meat']=0;
$Arr['roots']=0;

echo "Converting the array into an instance of the original class.\n";
bless ( $Arr, Potatoe );

if ( is_object ($Arr) ) {
    echo "\$Arr is now an object.\n";
    if ( $Arr instanceof Potatoe ) {
        echo "\$Arr is an instance of Potatoe class.\n";
    }
}

$Arr->PrintAll();

?>
27-Oct-2004 08:02
actually, it's not entirely true that php5 will only return public members....php5 will return any variable IT HAS ACCESS TO

In other words, if you do a get_class_variables($this) inside a class, you'll get everything - public, private, the whole shebang...really annoying since you can't check to see what's private/public without using reflection
manicdepressive AT mindless DOT com 05-Mar-2004 07:57
more strange, strange behaviour:

if you are trying to deep-copy an object with get_object_vars(), strange behaviour can accidentally clobber your original object properties.  please read very, very carefully:

get_object_vars() may either return references to *or* deep copies of the object's properties *depending on whether that property has been set with the -> operator*.   (this behaviour probably varies per php platform and os so please confirm for yourself.)

furthermore, consider
  $properties = get_object_vars($obj);
normally, unset()ting a reference does not affect the original, i.e. $ref = NULL; is not the same as unset($ref); per the references documentation.  However, if you have this strange references version and you unset() an array element of $properties, it will *SET THE OBJECT PROPERTY TO NULL*, which is not how references normally work.

even stranger behaviour comes into effect that i can only express with an example.  please test this with your version and OS and proceed very carefully:
-->
<?php
echo "<pre>\n";

class Lump
{
   var $size = 'average';

   function & copy()
   {  // return a deep copy
      $copy = new Lump();
      $properties = get_object_vars($this);
      foreach( array_keys( $properties ) as $property ){
         $copy->$property = $properties[$property];  // deep, right?
      }
      return $copy;
   }

}

$lump = new Lump();

$lump->size = 'huge';  // <--- this line changes everything
// comment above line out, and see the difference
// also, try substituting another property for 'size'

$properties = get_object_vars($lump);
$properties['size'] = 'small'; // this behavior varies

echo "after changing the properties array:\n";
var_dump( $lump );
// it's either big or small (never huge) depending on
// whether you commented-out the indicated line

//------------- let's try using our copy() method

$original_lump = new Lump();
$original_lump->size = 'huge'; // this line changes the behaviour
$other_lump =& $original_lump->copy();
unset( $other_lump->size );
echo "after unsetting in copy:\n";
var_dump( $original_lump ); // i'm afraid so -- original value clobbered !

echo "</pre>\n";
?>
code till dawn,
   mark meves
christopher AT NOSPAM AT idealab DOT com 30-Dec-2003 03:12
Hmmm.  A bit embarassing...

It turns out the best way to get references to all of your objects member variables is NOT with the functions I provided before, or with get_object_vars.

Just cast the object to array.

$a=(array)$obj;

# The two following statements are now equivalent and identical
$a["member"]=3;
$obj->member=3;

A very powerful tool, for inspectors and what not.
christopher AT NOSPAM AT idealab DOT com 23-Dec-2003 12:49
Please note that you cannot affect the object via the array values...in other words, the returned array does not contain references to the values within the object, but copies.

If you are making an object inspector or editor, this is not good enough.  So I made the following methods:

METHODS:

function &getVar($obj, $name)
{
        $expr="\$prop=&\$obj->$name;";
        eval($expr);
        return $prop;
}

function &getObjectVars($obj)
{
        $result=array();
        $vars=get_object_vars($obj);
        foreach ($vars as $var => $value)
        {
                $result[$var]=&getVar(&$obj, $var);
        }
        return $result;
}

[NOTE:  You must pass in a reference to an object, not an object.  Sorry if this  offends PHP'ers, but the distinction of pass-by-value and copy-on-assignment drives me batty (compared to Python, Java, Smalltalk), so I make all my functions pass by value, and force myself to pass in a reference to keep track of what is happening under the hood.]

EXAMPLE:

class Bob
{
        function Bob()
        {
                $this->thing=13;
                $this->other="whatever";
        }

        var $thing;
        var $other;
}

$obj=&new Bob();

# NOTE:  Passing in a reference!
$props=getObjectVars(&$obj);
$props["thing"]=-11;

var_dump($obj);

RESULTS:

object(bob)(2) {
  ["thing"]=>
  &int(-11)
  ["other"]=>
  &string(8) "whatever"
}
jordi at laigu dot net 06-Nov-2003 05:21
In case your object contains again OBJECTS or ARRAYS:

function makeAssoc($res) {
  if (is_object($res)) $res = get_object_vars($res);
  while (list($key, $value) = each($res)) {
    if (is_object($value) || is_array($value)) {
      $res[$key] = makeAssoc($value);
    }
  }
  return $res;
}

Thanks to mark at dreamzpace dot com
markus at emedia-solutions-wolf dot de 06-Mar-2003 12:01
Hi,

I figured out that in prior version to 4.2 the returned array only contains attributes directly in this class, excluding the derived ones from parentclasses.
info at phpken dot de 21-Nov-2002 06:34
hello,

this example will look like all values of vars was set in your class. write a method like the name: dumpClass and then fill in follow code:

$vars = get_object_vars($this);

echo "<b>class vars</b>";

foreach( $vars as $name => $value ) {
    echo "<li>".$name." : ".$value;
}

look at: get_object_vars($this);

andreas v.l
mark at dreamzpace dot com 13-Sep-2002 10:44
In case your object contains again objects (and so on), this function might be useful:

function makeAssoc($res) {
  $res = get_object_vars($res);
  while (list($key, $value) = each($res)) {
    if (is_object($value)) {
      $res[$key] = makeAssoc($value);
    }
  }
  return $res;
}
nick_eby at bonzidev dot com 09-Jul-2002 12:13
Furthermore, variables not declared in the class but set on a given object, will be returned by get_object_vars().

Example, ver. 4.2.1:
<?
class MyTest {
        var $classVar1 = 'Class Var 1';
        var $classVar2;
        var $classVar3;

        function MyTest()
        {
                $this->classVar2 = 'class var 2';
        }
}

$test = new MyTest();
// This var isn't declared in the class
$test->newObjVar = 'foobar';

echo "<pre>";
print_r(get_object_vars($test));
echo "</pre>";
?>

The output is:
Array
(

    [classVar1] => Class Var 1
    [classVar2] => class var 2
    [classVar3] =>
    [newObjVar] => foobar
)

Prior to version 4.2, classVar3 would not be output as it was never assigned a value.
michael at tapinternet dot com 13-Jun-2002 03:32
It seems that get_object_vars will now return properties of an object even if they have no value  - meaning only defined by var $foo in the class declaration.  This is noted behaviour in 4.2.1 which is different from previous versions and hitherto undocumented on this page.
florian at XCLUDETHISgsf dot de 29-Jan-2002 10:02
There is a strange behaviour, not sure whether it is a bug:

if I call
<?
$single_object = $data_array_of_objects[0];
$array_of_objectvars = get_object_vars($single_object);
     foreach($array_of_objectvars as $key => $val) {
     echo(" $key => $val<br>");
     }
?>
I get only _ONE_ line with the $key = first variable name of the object and $val = the values of _ALL_ variables of the object including the first separated by a space.

NOW:
if I call
<?
$single_object = $data_array_of_objects[0];
$array_of_objectvars = get_object_vars($single_object);
     foreach($array_of_objectvars as $key => $val) {
     echo(" $key => $val<br>");
     }
     echo($data_array_of_objects[0]->objectvar1."<br>");
     echo($data_array_of_objects[0]->objectvar2."<br>");
?>

I get a list of $key = $ val as expected, before the other echos' are printed.
It seems to me that get_object_vars works differently when you access a variable in those objects explicitly (as in the echos)


Retourne le nom de la classe parente d'un objet

  • « get_object_vars
  • interface_exists »
  • PHP Manual
  • Fonctions Classes/Objets
  • Retourne le nom de la classe parente d'un objet

get_parent_class

(PHP 4, PHP 5, PHP 7, PHP 8)

get_parent_class — Retourne le nom de la classe parente d'un objet

Description

get_parent_class ( mixed $object = ? ) : string

Récupère le nom de la classe parente pour un objet ou une classe.

Liste de paramètres

object

L'objet ou le nom de la classe testé. Ce paramètre est optionnel s'il est appelé depuis la méthode de l'objet.

Valeurs de retour

Retourne le nom de la classe parente dont object est une instance ou le nom.

Note:

Si l'objet n'a pas de parent ou si la classe fournie n'existe pas, false sera retourné.

Si appelée sans paramètre en dehors d'un objet, cette fonction retourne false.

Exemples

Exemple #1 Exemple avec get_parent_class()

<?php

class papa {
    function papa()
    {
    // un peu de code
    }
}

class enfant extends papa {
    function enfant()
    {
        echo "je suis le fils de " , get_parent_class($this) , "\n";
    }
}

class enfant2 extends papa {
    function enfant2()
    {
        echo "Je suis aussi le fils de " , get_parent_class('enfant2') , "\n";
    }
}

$foo = new enfant();
$bar = new enfant2();

?>

L'exemple ci-dessus va afficher :

je suis le fils de papa
Je suis aussi le fils de papa

Voir aussi

  • get_class() - Retourne le nom de la classe d'un objet
  • is_subclass_of() - Détermine si un objet est une sous-classe d'une classe donnée ou l'implémente
  • class_parents() - Retourne les classes parentes d'une classe

User Contributed Notes

jake at qzdesign dot co dot uk 17-Oct-2019 10:47
Note that from PHP 5.5 you can also use `parent::class` from within a method, e.g.

<?php
    function child()
    {
        echo "I'm ", parent::class, "'s son\n";
    }
?>

Looks a bit tidier and technically probably more optimal, as it avoids a function call lookup.
yukal dot alexander at gmail dot com 24-Nov-2018 07:28
An output of the entire inheritance chain using closures, recursion, and OOP

class ParentClass {
    public static function getChain() {
        $chain = null;
        return $function = function($className='') use (& $chain, & $function) {
            if (empty($className))
                $className = static::class;

            if (empty($chain))
                $chain = $className;

            $parent = get_parent_class($className);

            if ($parent !== false) {
                $chain .= " > {$parent}";
                return $function($parent);
            }

            return $chain;
        };
    }
}

class Child extends ParentClass {}
class SubChild extends Child {}
class Sub2 extends SubChild {}
class Sub3 extends Sub2 {}
class Sub4 extends Sub3 {}
class Sub5 extends Sub4 {}
class Sub6 extends Sub5 {}
class Sub7 extends Sub6 {}

printf("%s\n", Sub7::getChain()());

$getChain = Sub7::getChain();
printf("%s\n", $getChain('Sub3'));

Output is:
Sub7 > Sub6 > Sub5 > Sub4 > Sub3 > Sub2 > SubChild > Child > ParentClass
Sub3 > Sub2 > SubChild > Child > ParentClass
falundir at gmail dot com 13-Apr-2012 10:27
You can use this function to find common parent of multiple objects or classes.

<?php
/**
 * Returns name of the first (in class hierarchy) common parent class of all provided objects or classes.
 * Returns FALSE when common class is not found.
 *
 * @param mixed $objects Array that can contain objects or class names.
 * @return mixed
 */
function get_first_common_parent($objects) {
    $common_ancestors = null;
    foreach($objects as $object) {
        if (is_object($object)) {
            $class_name = get_class($object);
        } else {
            $class_name = $object;
        }

        $parent_class_names = array();
        $parent_class_name = $class_name;
        do {
            $parent_class_names[] = $parent_class_name;
        } while($parent_class_name = get_parent_class($parent_class_name));

        if ($common_ancestors === null) {
            $common_ancestors = $parent_class_names;
        } else {
            $common_ancestors = array_intersect($common_ancestors, $parent_class_names);
        }
    }

    return reset($common_ancestors);
}
?>

Example:

<?php
class A {
}

    class B extends A {
    }

        class D extends B {
        }

        class E extends B {
        }

    class C extends A {
    }

        class F extends C {
        }

            class G extends F {
            }

class H {
}

//returns "A"
get_first_common_parent(array('G', 'E'));

//returns "F"
get_first_common_parent(array(new G(), 'F'));

//returns false (no common parent)
get_first_common_parent(array('C', 'H'));

//returns false (non-existent class provided)
get_first_common_parent(array(new B(), 'X'));
?>
levu 20-Apr-2011 08:36
I wrote a simple function doing the reverse thing: get the children:

<?php
function get_child($instance, $classname) {
    $class = $classname;
    $t = get_class($instance);
    while (($p = get_parent_class($t)) !== false) {
        if ($p == $class) {
            return $t;
        }
        $t = $p;
    }
    return false;
}

abstract class A {
    function someFunction() {
        return get_child($this, __CLASS__);
    }
}

class B extends A {

}

class C extends B {

}

$c = new C();
echo $c->someFunction(); //displays B

?>
ssb45 at cornell dot edu 14-May-2008 08:32
"'If called without parameter outside object' What on earth does that mean?"

There are two places this could be called:
1. From within a member function of an object.  In this case, it may be called with no parameters and will return the parent class of the object owning the member function.  (If the parameter is included, then it will return the parent class of the specified class as normal.)

2. From outside an object (i.e., global or function scope).  In this case, PHP doesn't know what class you're talking about if you don't include a parameter, so it returns FALSE.  (But, of course, it works if you specify the class with the parameter.)
matt-php at DONT-SPAM-ME dot bitdifferent dot com 01-Nov-2004 07:52
PHP (4 at least, dunno about 5) stores classnames in lower case, so:

<?PHP

class Foo
{
}

class Bar extends Foo
{
}

echo get_parent_class('Bar');

echo "\n";

echo get_parent_class('bar');

?>

will output:

foo
foo
radu dot rendec at ines dot ro 07-Apr-2004 06:44
If the argument obj is a string and the class is not defined, then the function returns FALSE.

If the argument obj is an object created from a class with no ancestors (or a string representing a class with no ancestors), then the function returns FALSE.


Vérifie si une interface a été définie

  • « get_parent_class
  • is_a »
  • PHP Manual
  • Fonctions Classes/Objets
  • Vérifie si une interface a été définie

interface_exists

(PHP 5 >= 5.0.2, PHP 7, PHP 8)

interface_exists — Vérifie si une interface a été définie

Description

interface_exists ( string $interface_name , bool $autoload = true ) : bool

Vérifie si une interface a été définie.

Liste de paramètres

interface_name

Le nom de l'interface

autoload

Si l'on doit appeler __autoload ou non par défaut.

Valeurs de retour

Retourne true si l'interface fournie par le paramètre interface_name a été définie, false sinon.

Exemples

Exemple #1 Exemple avec interface_exists()

<?php
// Vérifie si l'interface existe avant de l'utiliser
if (interface_exists('MyInterface')) {
    class MyClass implements MyInterface
    {
        // Méthodes
    }
}

?>

Voir aussi

  • get_declared_interfaces() - Retourne un tableau avec toutes les interfaces déclarées
  • class_implements() - Retourne les interfaces implémentées par une classe ou une interface donnée
  • class_exists() - Vérifie si une classe a été définie

User Contributed Notes

CoR 28-Nov-2015 02:30
Class and Interface share SAME namespace!

class k{}

interface k {}    // Fatal error: Cannot redeclare class k
maxim at inbox dot ru 01-Oct-2012 10:40
If you want to check for included interface and you already register spl autoloader - it will crash. Becassue autoloader trying to load `string` and he doesnt matter is it class or not.
Iv found several ways :
1 - unregister AL - -> check for Ifaces - -> register Autoloader

2 - $ifaces = array_flip(get_declared_interfaces());
 if($ifaces["MyIface"]) // empty // isset .

Interfaces are not bad, you can build correct geomentry of system , with validation by funcs / vars / const .
Also they are good to storage variables <?php
 ROOT::THEMES ; ROOT::LOC ; ?> . Much faster then Define, but you cant put algorithms inside, only complite strings / __file__ / etc.
nils dot rocine at gmail dot com 26-Oct-2011 06:35
A little note on namespaces that may be obvious to some, but was not obvious to me.

Although you can make the below statement when the statement is in the same namespace as the interface/class declaration MyInterface...
<?php
$foo instanceof MyInterface
?>

Making use of the interface_exists, or class_exists functions, you must enter the full namespaced interface name like so (even if the function call is from the same namespace.)
<?php
interface_exists(__NAMESPACE__ . '\MyInterface', false);
?>
andrey at php dot net 24-Oct-2004 04:40
As far as I remember interface_exists() was added in 5.0.2 . In 5.0.0 and 5.0.1 class_exists() used to return TRUE when asked for a existing interface. Starting 5.0.2 class_exists() doesn't do that anymore.


Vérifie si l'objet est une instance d'une classe donnée ou a cette classe parmi ses parents

  • « interface_exists
  • is_subclass_of »
  • PHP Manual
  • Fonctions Classes/Objets
  • Vérifie si l'objet est une instance d'une classe donnée ou a cette classe parmi ses parents

is_a

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

is_a — Vérifie si l'objet est une instance d'une classe donnée ou a cette classe parmi ses parents

Description

is_a ( mixed $object , string $class_name , bool $allow_string = false ) : bool

Vérifie si l'objet object est une instance d'une classe donnée ou a cette classe comme parent.

Liste de paramètres

object

Un nom de classe ou une instance d'un objet.

class_name

Le nom de la classe

allow_string

Si ce paramètre vaut false, le nom de la classe sous forme de chaîne de caractères dans le paramètre object n'est pas autorisé. Ceci permet d'éviter l'appel de l'autoloader si la classe n'existe pas.

Valeurs de retour

Retourne true si l'objet est une instance de cette classe ou a cette classe comme parent, false sinon.

Exemples

Exemple #1 Exemple avec is_a()

<?php
// Définit une classe
class WidgetFactory
{
  var $oink = 'moo';
}

// Crée un nouvel objet
$WF = new WidgetFactory();

if (is_a($WF, 'WidgetFactory')) {
  echo "oui, \$WF est toujours un objet WidgetFactory\n";
}
?>

Exemple #2 Utilisation de l'opérateur instanceof avec PHP 5

<?php
if ($WF instanceof WidgetFactory) {
    echo 'Oui, $WF est un WidgetFactory';
}
?>

Voir aussi

  • get_class() - Retourne le nom de la classe d'un objet
  • get_parent_class() - Retourne le nom de la classe parente d'un objet
  • is_subclass_of() - Détermine si un objet est une sous-classe d'une classe donnée ou l'implémente

User Contributed Notes

dkrupyanskiy[at]gmail 10-Jan-2018 09:36
Looks like the function signature given in description is wrong. Actually it can take a string  as a first parameter in the case if $allow_string is set to true.

It took some time to find out how the last parameter should be used. Please consider the following example

<?php

class Foo{}

spl_autoload_register(
    function($classname){
        printf('autoload has been triggered for %s%s', $classname, PHP_EOL);
    }
);

var_dump(is_a('UndefinedClassName', Foo::class, true));

?>
Ronald Locke 30-Sep-2016 02:19
Please note that you have to fully qualify the class name in the second parameter.

A use statement will not resolve namespace dependencies in that is_a() function.

<?php
namespace foo\bar;

class A {};
class B extends A {};
?>

<?php
namespace har\var;

use foo\bar\A;
$foo = new foo\bar\B();

is_a($foo, 'A'); // returns false;
is_a($foo, 'foo\bar\A'); // returns true;
?>

Just adding that note here because all examples are without namespaces.
portugal {at} jawira {dot} com 12-Jun-2015 09:32
I just want to point out that you can replace "is_a()" function with the "instanceof" operator, BUT you must use a variable to pass the class name string.

This will work:
<?php
$object = new \stdClass();
$class_name = '\stdClass';

var_dump(is_a($object, $class_name));     // bool(true)
var_dump(is_a($object, '\stdClass'));     // bool(true)
var_dump($object instanceof $class_name); // bool(true)
?>

While this don't:
<?php
$object = new \stdClass();
var_dump($object instanceof '\stdClass'); // Parse error: syntax error, unexpected ''\stdClass'' (T_CONSTANT_ENCAPSED_STRING)
?>
eitan at mosenkis dot net 12-Jan-2012 01:09
As of PHP 5.3.9, is_a() seems to return false when passed a string for the first argument. Instead, use is_subclass_of() and, if necessary for your purposes, also check if the two arguments are equal, since is_subclass_of('foo', 'foo') will return false, while is_a('foo', 'foo') used to return true.
Aron Budinszky 07-Sep-2011 04:21
Be careful! Starting in PHP 5.3.7 the behavior of is_a() has changed slightly: when calling is_a() with a first argument that is not an object, __autoload() is triggered!

In practice, this means that calling is_a('23', 'User'); will trigger __autoload() on "23". Previously, the above statement simply returned 'false'.

More info can be found here:
https://bugs.php.net/bug.php?id=55475

Whether this change is considered a bug and whether it will be reverted or kept in future versions is yet to be determined, but nevertheless it is how it is, for now...
p dot scheit at zweipol dot net 16-Jan-2007 01:44
At least in PHP 5.1.6 this works as well with Interfaces.

<?php
interface test {
  public function A();
}

class TestImplementor implements test {
  public function A () {
    print "A";
  }
}

$testImpl = new TestImplementor();

var_dump(is_a($testImpl,'test'));
?>

will return true
cesoid at yahoo dot com 05-Oct-2005 07:01
is_a returns TRUE for instances of children of the class.

For example:

class Animal
{}

class Dog extends Animal
{}

$test = new Dog();

In this example is_a($test, "Animal") would evaluate to TRUE as well as is_a($test, "Dog").

This seemed intuitive to me, but did not seem to be documented.


Détermine si un objet est une sous-classe d'une classe donnée ou l'implémente

  • « is_a
  • method_exists »
  • PHP Manual
  • Fonctions Classes/Objets
  • Détermine si un objet est une sous-classe d'une classe donnée ou l'implémente

is_subclass_of

(PHP 4, PHP 5, PHP 7, PHP 8)

is_subclass_of — Détermine si un objet est une sous-classe d'une classe donnée ou l'implémente

Description

is_subclass_of ( mixed $object , string $class_name , bool $allow_string = true ) : bool

Vérifie si l'objet object a la classe class_name parmi ses parents ou l'implémente.

Liste de paramètres

object

Un nom de classe ou une instance d'un objet. Aucune erreur n'est générée si la classe n'existe pas.

class_name

Le nom de la classe

allow_string

Si ce paramètre est défini à false, un nom de classe sous forme de chaîne de caractères dans le paramètre object n'est pas autorisé. Ceci permet d'éviter d'appeler l'autoloader si la classe n'existe pas.

Valeurs de retour

Cette fonction retourne true si l'objet object est une instance d'une classe qui est une sous-classe de class_name, false sinon.

Exemples

Exemple #1 Exemple avec is_subclass_of()

<?php
// Définit une classe
class WidgetFactory
{
  var $oink = 'moo';
}

// Définit une sous-classe
class WidgetFactory_Child extends WidgetFactory
{
  var $oink = 'oink';
}

// Création d'un nouvel objet
$WF = new WidgetFactory();
$WFC = new WidgetFactory_Child();

if (is_subclass_of($WFC, 'WidgetFactory')) {
  echo "oui, \$WFC est une sous-classe de la classe WidgetFactory\n";
} else {
  echo "non, \$WFC n'est pas une sous-classe de la classe WidgetFactory\n";
}

if (is_subclass_of($WF, 'WidgetFactory')) {
  echo "oui, \$WF est une sous-classe de la classe WidgetFactory\n";
} else {
  echo "non, \$WF n'est pas une sous-classe de la classe WidgetFactory\n";
}

// utilisable uniquement depuis PHP 5.0.3
if (is_subclass_of('WidgetFactory_Child', 'WidgetFactory')) {
  echo "oui, WidgetFactory_Child est une sous-classe de la classe WidgetFactory\n";
} else {
  echo "non, WidgetFactory_Child n'est pas une sous-classe de la classe WidgetFactory\n";
}
?>

L'exemple ci-dessus va afficher :

oui, $WFC est une sous-classe de la classe WidgetFactory
non, $WF n'est pas une sous-classe de la classe WidgetFactory
oui, WidgetFactory_Child est une sous-classe de la classe WidgetFactory

Exemple #2 Exemple avec is_subclass_of() en utilisant une interface

<?php
// Définition de l'interface
interface MyInterface
{
  public function MyFunction();
}

// Définition de l'implémentation de la classe de l'interface
class MyClass implements MyInterface
{
  public function MyFunction()
  {
    return "MyClass implémente MyInterface!";
  }
}

// Instanciation de l'objet
$my_object = new MyClass;

// Fonctionne depuis PHP 5.3.7

// Test utilisant l'objet de l'instance de la classe
if (is_subclass_of($my_object, 'MyInterface')) {
  echo "Oui, \$my_object est une sous-classe de MyInterface\n";
} else {
  echo "Non, \$my_object n'est pas une sous-classe de MyInterface\n";
}

// Test utilisant le nom de la classe sous forme de chaîne de caractères
if (is_subclass_of('MyClass', 'MyInterface')) {
  echo "Oui, MyClass est une sous-classe de MyInterface\n";
} else {
  echo "Non, MyClass n'est pas une sous-classe de MyInterface\n";
}
?>

L'exemple ci-dessus va afficher :

Oui, $my_object est une sous-classe de MyInterface
Oui, MyClass est une sous-classe de MyInterface

Notes

Note:

L'usage de cette fonction utilisera tous les autoloaders enregistrés si la classe n'est pas encore connue.

Voir aussi

  • get_class() - Retourne le nom de la classe d'un objet
  • get_parent_class() - Retourne le nom de la classe parente d'un objet
  • is_a() - Vérifie si l'objet est une instance d'une classe donnée ou a cette classe parmi ses parents
  • class_parents() - Retourne les classes parentes d'une classe

User Contributed Notes

alan at jynxy.net 21-Jun-2018 06:56
The $allow_string parameter is not very clearly documented. When true, it simply allows the first parameter to be the name of a class, instead of an object whose class we are interested in.

Some usage examples:

class parent_class {
    // objects and methods ...
}

$possible_child_object = new possible_child_class(); // might be an extension of parent_class

$result = is_subclass_of($possible_child_object, 'parent_class'); //  valid
$result = is_subclass_of($possible_child_object, 'parent_class', false); //  valid
$result = is_subclass_of('possible_child_class', 'parent_class', true); // valid
$result = is_subclass_of('possible_child_class', 'parent_class', false); // not valid
nicholas at aquarionics dot com 17-Mar-2009 01:02
This might be useful to someone, so:

If you're using Autoload, you should be aware that this will attempt to autoload $classname if it isn't already loaded. I discovered this when I had something using is_subclass_of inside an error thrown by autoload, which then recursed until it ran out of memory.
Damien Bezborodov 16-Mar-2009 04:55
If you need something similar to is_subclass_of() to determine if a class implements an interface before instantiating it, use reflection:

<?php

interface A_Interface {}
class A implements A_Interface {}

$reflectionA = new ReflectionClass('A');
var_dump(
    $reflectionA->implementsInterface('A_Interface')
);

?>
bool(true)
kostyl_kostyl gav-gav mail point ru 07-Mar-2009 03:08
<?php
interface I {
}
class A implements I {
}
class B extends A  {
}
if (is_subclass_of('A', 'I')) {
    echo 'good<br>';
}
else {
    echo 'bad<br>';
}
if (is_subclass_of('B', 'I')) {
    echo 'good<br>';
}
else {
    echo 'bad<br>';
}
if (is_subclass_of('B', 'A')) {
    echo 'good<br>';
}
else {
    echo 'bad<br>';
}
?>

result:
bad <- you must to describe intermediate class B to be good
good
good
jm 30-Sep-2008 08:02
It would appear that is_subclass_of is case insensitive unlike get_class in php5.
i.e.

<?php
class fooBar {}
class bar extends fooBar {}

assert(get_class(new fooBar()) == "fooBar");
assert(is_subclass_of(new bar(), "foobar") == true);
?>

i run across this while migrating some code from php4 to php5 and the code would only half-the-time break.
Ondra Zizka 13-Oct-2006 05:31
For PHP4:

<?php
/** Returns whether specified class is subclass of the other class. */
function is_subclass($sClass, $sExpectedParentClass){
    do if( $sExpectedParentClass === $sClass ) return true;
    while( false != ($sClass = get_parent_class($sClass)) );
    return false;
}
// Test:
class A {} class B extends A {} class C extends B {} echo (int) is_subclass('C', 'A');
?>
gunniboyh at web dot de 20-May-2006 06:16
is_subclass_of() works also with classes between the class of obj and the superclass.

example:
<?php
class A {};
class B extends A {};
class C extends B {};

$foo=new C();
echo ((is_subclass_of($foo,'A')) ? 'true' : 'false');
?>

echoes 'true' .


Vérifie si la méthode existe pour une classe

  • « is_subclass_of
  • property_exists »
  • PHP Manual
  • Fonctions Classes/Objets
  • Vérifie si la méthode existe pour une classe

method_exists

(PHP 4, PHP 5, PHP 7, PHP 8)

method_exists — Vérifie si la méthode existe pour une classe

Description

method_exists ( string|object $object , string $method_name ) : bool

Vérifie si la méthode existe pour l'objet object fourni.

Liste de paramètres

object

Une instance d'un objet ou le nom d'une classe

method_name

Le nom de la méthode

Valeurs de retour

Retourne true si la méthode fournie par le paramètre method_name a été définie pour l'objet object, false sinon.

Notes

Note:

L'usage de cette fonction utilisera tous les autoloaders enregistrés si la classe n'est pas encore connue.

Exemples

Exemple #1 Exemple avec method_exists()

<?php
$directory = new Directory('.');
var_dump(method_exists($directory,'read'));
?>

L'exemple ci-dessus va afficher :

bool(true)

Exemple #2 Exemple avec method_exists() en appel statique

<?php
var_dump(method_exists('Directory','read'));
?>

L'exemple ci-dessus va afficher :

bool(true)

Voir aussi

  • function_exists() - Indique si une fonction est définie
  • is_callable() - Détermine si l'argument peut être appelé comme fonction
  • class_exists() - Vérifie si une classe a été définie

User Contributed Notes

El 02-Dec-2019 08:39
Undocumented change since 7.4.0 is released:

<?php
class Foo
{
    private function privateMethodTest()
    {

    }
}

class Bar extends Foo
{

}

var_dump(method_exists(Bar::class, 'privateMethodTest'));
// PHP 7.4: bool(false)
// PHP 7.3: bool(true)

var_dump(is_callable(Bar::class, 'privateMethodTest'));
// PHP 7.3: bool(true)
// PHP 7.4: bool(true)
jave [at] issomewhereontheweb [com] 01-Jun-2016 05:15
The function does not care about class existance, so you can use it to check an existance of a method even when class was not declared e.g.
<?php
if( method_exists('THIS_WAS_NOT_DECLARED', 'some_method') )
   echo "it does exist!";
else
   echo "nope, it is not there...";
?>
...raises no errors/warnings... outputs "nope, it is not there..." if class does not exist at all or if it does but the method doesn't.
w3dk 04-Apr-2015 10:38
A couple of the older comments (specifically "jp at function dot fi" and "spam at majiclab dot com") state that is_callable() does not respect a methods visibility when checked outside of that class. ie. That private/protected methods are seen as callable when tested publicly. However, this was a bug (#29210) in early versions of PHP 5 and was fixed (according to the changelog) in PHP 5.0.5 (and/or PHP 5.1.0).

Bug #29210 - Function: is_callable - no support for private and protected classes
http://bugs.php.net/29210

Changelog - Fixed bug #29210 (Function: is_callable - no support for private and protected classes). (Dmitry)
http://php.net/ChangeLog-5.php#5.1.0
charleston olaes at gmail no spaces 10-Oct-2014 04:31
I was wondering if caching the the methods in an array would have a faster lookup. So I ran a very simple benchmark using xdebug_time_index() with 10000 iterations on each statement.

using PHP 5.3.13 btw

<?php
// using an actual instance of an object shows 0.10398316383362 secs
method_exist($object, $method);
?>

<?php
// using a string shows 0.12779307365417 secs
method_exist('ClassName', $method);
?>

<?php
$array = array(/*method names with numeric index*/);
// shows 0.10288906097412 secs
in_array($method, $array);
?>

<?php
$assoc = array( /*method name as key and value*/ );
// shows 0.017536878585815 secs
isset( $assoc[$method] );
?>

From the looks of the results, there is very little difference in method_exist and in_array. Isset seems to the fastest and using a string as the first parameter is the slowest.

Please note that the test was done on multiple methods, not just one, the code presented above is to show the results, not the actual test code that ran. Also, this was tested just out of curiosity and I didn't set up a specific environment or used any profiling tools, and it was not meant to be an official benchmark in anyway.
konzertheld at thedomainistheusersname dot de 15-Feb-2013 05:32
Note that prepending the namespace (if any) is required even if the calling class is in the same namespace:

<?php
namespace test;
class foo {
 public function lookup() {
  // will return false
  return method_exists('bar', 'nonsense_method');
 }
}

class bar {
 public function nonsense_method() {
  // will return true
  return method_exists('test\foo', 'lookup');
 }
}
?>
Niels 11-May-2011 12:45
Just to mention it: both method_exists() and is_callable() return true for inherited methods:

<?php
class ParentClass {

   function doParent() { }
}

class ChildClass extends ParentClass { }

$p = new ParentClass();
$c = new ChildClass();

// all return true
var_dump(method_exists($p, 'doParent'));
var_dump(method_exists($c, 'doParent'));

var_dump(is_callable(array($p, 'doParent')));
var_dump(is_callable(array($c, 'doParent')));
?>
mail at bartrail dot de 25-Apr-2011 10:06
Using method_exists inside an object's __call() method can be very usefull if you want to avoid to get a fatal error because of a limit in function nesting or if you are calling methods that dont exist but need to continue in your application:

<?php
class Something
{

    /**
     * Call a method dynamically
     *
     * @param string $method
     * @param array $args
     * @return mixed
     */
    public function __call($method, $args)
    {
        if(method_exists($this, $method)) {
          return call_user_func_array(array($this, $method), $args);
        }else{
          throw new Exception(sprintf('The required method "%s" does not exist for %s', $method, get_class($this)));
        }
    }

}
?>
phoenix at todofixthis dot com 21-Dec-2010 09:13
As noted [elsewhere] method_exists() does not care about the existence of __call(), whereas is_callable() does:

<?php
class Test {
  public function explicit(  ) {
      // ...
  }

  public function __call( $meth, $args ) {
      // ...
  }
}

$Tester = new Test();

var_export(method_exists($Tester, 'anything')); // false
var_export(is_callable(array($Tester, 'anything'))); // true
?>
uramihsayibok, gmail, com 06-Aug-2010 10:09
It wasn't spelled out but could be inferred: method_exists() also works on interfaces.

<?php

var_dump(method_exists("Iterator", "current"));
// bool(true)

?>
Anonymous 08-May-2010 05:20
If you want to check in a class itself if a method is known you may do so with magic variable __CLASS__

<?php

class A{
  __construct($method){
      return method_exists(__CLASS__,$method);
  }

  private function foo(){

  }
}

$test = new A('foo');
//should return true

?>

You might also use the method describe below with <?php in_array() ?> trick but I consider this one here easier and more readable and well, the way it is intended toi be done ;)
admin ( at ) djokodonev dot com 16-Oct-2009 04:30
Hi,

Here is a useful function that  you can use to check classes methods access e.g whether it is public, private or static or both..

here it goes:

<?php
// Example class
class myClass {

    private $private1;

    static $static1;

    public $public1;

    public function publ() {

    }

    private function priv() {

    }

    private static function privstatic() {

    }

    public static function publstatic() {

    }

    static function mytest() {

    }
}

// The function uses the reflection class that is built into PHP!!!
// The purpose is to determine the type of a certain method that exi
function is_class_method($type="public", $method, $class) {
   // $type = mb_strtolower($type);
    $refl = new ReflectionMethod($class, $method);
    switch($type) {
        case "static":
        return $refl->isStatic();
        break;
        case "public":
        return $refl->isPublic();
        break;
        case "private":
        return $refl->isPrivate();
        break;
    }
}
var_dump(is_class_method("static", "privstatic", "myClass")); // true - the method is  private and also static..
var_dump(is_class_method("private", "privstatic", "myClass")); // true - the method is  private and also static..
var_dump(is_class_method("private", "publstatic", "myClass")); // False the methos is public and also static not private
 // you get the idea.. I hope this helps someone..
?>
florin from syneto net 07-Oct-2009 07:34
This function is case-insensitive (as is PHP) and here is the proof:
<?php
class A {
    public function FUNC() { echo '*****'; }
}

$a = new A();
$a->func(); // *****
var_dump(method_exists($a, 'func')); // bool(true)
?>
jp at function dot fi 30-Apr-2006 02:29
As mentioned before, is_callable and method_exists report all methods callable even if they are private/protected and thus actually not callable. So instead of those functions you may use following work-around which reports methods as supposed to.

<?php
class Foo1 {
  public function bar() {
    echo "I'm private Foo1::bar()";
  }
}

class Foo2 {
  private function bar() {
    echo "I'm public Foo2::bar()";
  }
}

$f1=new Foo1;
$f2=new Foo2;

if(is_callable(array($f1,"bar"))) {
    echo "Foo1::bar() is callable";
} else {
    echo "Foo1::bar() isn't callable";
}
if(is_callable(array($f2,"bar"))) {
    echo "Foo2::bar() is callable";
} else {
    echo "Foo2::bar() isn't callable";
}
if(in_array("bar",get_class_methods($f1))) {
    echo "Foo1::bar() is callable";
} else {
    echo "Foo1::bar() isn't callable";
}
if(in_array("bar",get_class_methods($f2))) {
    echo "Foo2::bar() is callable";
} else {
    echo "Foo2::bar() isn't callable";
}

?>

output
Foo1::bar() is callable (correct)
Foo2::bar() is callable (incorrect)
Foo1::bar() is callable (correct)
Foo2::bar() isn't callable (correct)

?>
seufert at gmail dot com 26-Apr-2006 06:27
Just a note that the behaviour of this function changed between version 5.0.x and 5.1.x when using static member functions

Using this code:
<?php
class a {
    static function test() {return "A";}
}
if(method_exists('a','test'))
    print call_user_func(array('a','test'));
else
    print "Nothing";
?>
PHP 5.1.x returns "A"
PHP 5.0.x returns "Nothing"

Im not sure of a workaround for PHP 5.0.x yet.
spam at majiclab dot com 31-Jan-2006 08:33
Both method_exists() and is_callable() return private and protected functions, which, as mentioned below, causes problems for PHP5/OO programming.  You can use get_class_methods() with either an $instance of a class or the 'ClassName' to get only public functions.
daniel at softel dot jp 09-Jan-2006 07:34
Note that in PHP5, method_exists() will sucessfully find *private* methods. This has some OO/data-hiding ramifications.
jpgiot at nospam ifrance.com 06-May-2004 07:42
a little difference :

to find a method of an object (instance of a class)

<?php
if (method_exists($myinstance,'themethod'))
    echo 'ok';
?>

to find a method of a class (using the class name, not the instance of the class!)

<?php
if (is_callable(array('theclassname','themethod')))
    echo 'ok';
?>
Thomas@ThBeckmann 31-Jan-2003 01:47
Though, as Bejamin noted, it's not possible to use the class name in method_exists within the class definition, get_class_methods delivers the method names for a given class name even inside the class. Thus another workaround for the mentioned problem is to use in_array(<method_name>, get_class_methods(<class_name>))
benjamin_ansbach at web dot de 27-Dec-2002 12:49
if you want to check for a method "inside" of a class use:

method_exists($this, 'function_name')

i was a bit confused 'cause i thought i'm only able to check for a method when i got an object like $object_name = new class_name() with:

method_exists($object_name, 'method_name')

small example for those who didn't understood what i mean ( maybe caused by bad english :) ):

<?php

class a {

    function a() {

        if(method_exists($this, 'test'))
            echo 'a::test() exists!';
        else
            echo 'a::test() doesn\'t exists';

    }

    function test() {

        return true;

    }

}

$b = new a();

?>

the output will be: a::test() exists!

maybe this will help someone
j dot metzger at steptown dot com 16-Jan-2002 03:42
call_user_method uses the same mechanism as a normal method call. So you can get the returned values as well in this way.

$pagetext=call_user_method($method,$object_call);

All information is then in $pagetext.


Vérifie si un objet ou une classe possède une propriété

  • « method_exists
  • trait_exists »
  • PHP Manual
  • Fonctions Classes/Objets
  • Vérifie si un objet ou une classe possède une propriété

property_exists

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

property_exists — Vérifie si un objet ou une classe possède une propriété

Description

property_exists ( mixed $class , string $property ) : bool

Cette fonction vérifie si la propriété property existe dans la classe spécifiée.

Note:

property_exists() retourne true même si la propriété a une valeur null, contrairement à la fonction isset().

Liste de paramètres

class

Le nom de la classe ou un objet de la classe à tester

property

Le nom de la propriété

Valeurs de retour

Retourne true si la propriété existe, false si elle n'existe pas et null si une erreur survient.

Notes

Note:

L'usage de cette fonction utilisera tous les autoloaders enregistrés si la classe n'est pas encore connue.

Note:

La fonction property_exists() ne peut pas détecter les propriétés qui sont accessibles en utilisant la méthode __get.

Exemples

Exemple #1 Exemple avec property_exists()

<?php

class myClass {
    public $mine;
    private $xpto;
    static protected $test;

    static function test() {
        var_dump(property_exists('myClass', 'xpto')); //true
    }
}

var_dump(property_exists('myClass', 'mine'));   //true
var_dump(property_exists(new myClass, 'mine')); //true
var_dump(property_exists('myClass', 'xpto'));   //true, depuis PHP 5.3.0
var_dump(property_exists('myClass', 'bar'));    //false
var_dump(property_exists('myClass', 'test'));   //true, depuis PHP 5.3.0
myClass::test();

?>

Voir aussi

  • method_exists() - Vérifie si la méthode existe pour une classe

User Contributed Notes

rnealxp at yahoo dot com 11-May-2020 06:56
For class constants, use defined() to check for their existence since property_exists() cannot be used.
<?php
class A{
    private static $c = 'C';
    const B = 'B';
}
if(property_exists('A','c')===true){
    echo 'y';
}else{
    echo 'n';
} //output: y
if(property_exists('A','B')===true){
    echo 'y';
}else{
    echo 'n';
} //output: n
if(defined('A::B')===true){
    echo 'y';
}else{
    echo 'n';
} //output: y
?>
@fitorec 14-Jul-2019 02:12
<?php

abstract class P {
  private $priv;
  static protected $static_prop;
  static function exists($prop = 'priv') {
      var_dump(property_exists(new static, $prop)); //true
  }
}

class S extends P {
  static protected $new_prop;
}
S::exists('new_prop');       // True
S::exists('static_prop');    // True
S::exists('priv');           // True
David Spector 03-Sep-2018 12:37
Just to clarify, property_exists only works for static properties. There is no corresponding const_exists function in PHP to do something similar for const names.
falundir at gmail dot com 16-Feb-2017 08:42
If you want to test if declared *public* property was unset, you can use the following code:

<?php
class A {
    public $declared;
}

$a = new A();
$is_defined = array_key_exists('declared', (array)$a); //=>true

unset($a->declared);
$is_defined = array_key_exists('declared', (array)$a); //=>false
?>
Daniel dot Peder at infoset dot com 23-Nov-2016 09:24
declared properties cannot be unset
any set property does exist, even being set to null, regardless how it was set

<?php

class demo_property_exists {

    public $my_public;
    protected $my_protected;
    private $my_private;

    function __construct() {
        $this->dumper('before-constructed');
        $this->my_constructed_int = 123;
        $this->my_constructed_null = null;
        $this->dumper('after-constructed');
    }

    public function dumper($name) {
        printf("\n[%s] dump:\n", $name);

        foreach ($this->my_checklist() as $prop) {
            printf("[%s]:\t", $prop);
            var_dump(property_exists($this, $prop));
        }
    }

    public function unset_all() {
        foreach ($this->my_checklist() as $prop) {
            unset($this->$prop);
        }
    }

    private function my_checklist() {
        return array('my_public', 'my_protected', 'my_private', 'my_constructed_int', 'my_constructed_null', 'my_assigned_int', 'my_assigned_null',);
    }

}

$object = new demo_property_exists();
$object->dumper('before-assigned');
$object->my_assigned_int = 456;
$object->my_assigned_null = null;
$object->dumper('after-assigned');
$object->unset_all();
$object->dumper('after-unset');

/*
results:

[before-constructed] dump:
[my_public]:    bool(true)
[my_protected]: bool(true)
[my_private]:   bool(true)
[my_constructed_int]:   bool(false)
[my_constructed_null]:  bool(false)
[my_assigned_int]:      bool(false)
[my_assigned_null]:     bool(false)

[after-constructed] dump:
[my_public]:    bool(true)
[my_protected]: bool(true)
[my_private]:   bool(true)
[my_constructed_int]:   bool(true)
[my_constructed_null]:  bool(true)
[my_assigned_int]:      bool(false)
[my_assigned_null]:     bool(false)

[before-assigned] dump:
[my_public]:    bool(true)
[my_protected]: bool(true)
[my_private]:   bool(true)
[my_constructed_int]:   bool(true)
[my_constructed_null]:  bool(true)
[my_assigned_int]:      bool(false)
[my_assigned_null]:     bool(false)

[after-assigned] dump:
[my_public]:    bool(true)
[my_protected]: bool(true)
[my_private]:   bool(true)
[my_constructed_int]:   bool(true)
[my_constructed_null]:  bool(true)
[my_assigned_int]:      bool(true)
[my_assigned_null]:     bool(true)

[after-unset] dump:
[my_public]:    bool(true)
[my_protected]: bool(true)
[my_private]:   bool(true)
[my_constructed_int]:   bool(false)
[my_constructed_null]:  bool(false)
[my_assigned_int]:      bool(false)
[my_assigned_null]:     bool(false)

*/
saurabh dot agarwal89 at gmail dot com 27-May-2015 11:17
$a = array('a','b'=>'c');
print_r((object) $a);
var_dump( property_exists((object) $a,'0'));
var_dump( property_exists((object) $a,'b'));

OUTPUT:
stdClass Object
(
    [0] => a
    [b] => c
)
bool(false)
bool(true)
g dot gentile at parentesigraffe dot com 05-Mar-2015 09:02
The function behaves differently depending on whether the property has been present in the class declaration, or has been added dynamically, if the variable has been unset()

<?php

class TestClass {

    public $declared = null;

}

$testObject = new TestClass;

var_dump(property_exists("TestClass", "dynamic")); // boolean false, as expected
var_dump(property_exists($testObject, "dynamic")); // boolean false, same as above

$testObject->dynamic = null;
var_dump(property_exists($testObject, "dynamic")); // boolean true

unset($testObject->dynamic);
var_dump(property_exists($testObject, "dynamic")); // boolean false, again.

var_dump(property_exists($testObject, "declared")); // boolean true, as espected

unset($testObject->declared);
var_dump(property_exists($testObject, "declared")); // boolean true, even if has been unset()
ewisuri [gmail] 15-Feb-2014 04:37
As of PHP 5.3.0, calling property_exists from a parent class sees private properties in sub-classes.

<?php
class P {
    public function test_prop($prop) { return property_exists($this, $prop); }
}

class Child extends P {
    private $prop1;
}

$child = new Child();
var_dump($child->test_prop('prop1')); //true, as of PHP 5.3.0
Nanhe Kumar 17-Jan-2014 10:39
<?php

class Student {

    protected $_name;
    protected $_email;

    public function __call($name, $arguments) {
        $action = substr($name, 0, 3);
        switch ($action) {
            case 'get':
                $property = '_' . strtolower(substr($name, 3));
                if(property_exists($this,$property)){
                    return $this->{$property};
                }else{
                    echo "Undefined Property";
                }
                break;
            case 'set':
                $property = '_' . strtolower(substr($name, 3));
                if(property_exists($this,$property)){
                    $this->{$property} = $arguments[0];
                }else{
                    echo "Undefined Property";
                }

                break;
            default :
                return FALSE;
        }
    }

}

$s = new Student();
$s->setName('Nanhe Kumar');
$s->setEmail('nanhe.kumar@gmail.com');
echo $s->getName(); //Nanhe Kumar
echo $s->getEmail(); // nanhe.kumar@gmail.com
$s->setAge(10); //Undefined Property
?>
Stefan W 03-Sep-2013 01:23
If you are in a namespaced file, and you want to pass the class name as a string, you will have to include the full namespace for the class name - even from inside the same namespace:

<?
namespace MyNS;

class A {
    public $foo;
}

property_exists("A", "foo");          // false
property_exists("\\MyNS\\A", "foo");  // true
?>


Vérifie si un trait existe

  • « property_exists
  • Classkit »
  • PHP Manual
  • Fonctions Classes/Objets
  • Vérifie si un trait existe

trait_exists

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

trait_exists — Vérifie si un trait existe

Description

trait_exists ( string $traitname , bool $autoload = ? ) : bool

Liste de paramètres

traitname

Nom du trait à vérifier

autoload

true s'il faut charger le trait dans le cas où ce n'est pas encore fait.

Valeurs de retour

Retourne true si le trait existe, false s'il n'existe pas, null en cas d'erreur.

User Contributed Notes

astinus dot eberhard at gmail dot com 10-Mar-2017 03:35
Traits are compatible with class autoload mechanism - in fact, if you look at source code of trait_exists function, you will find similar peace of code (see Zend/zend_builtin_functions.c)
valerio dot bozzolan at gmail dot com 28-Jan-2016 06:38
What is the default value of $autoload? And in which way traits are autoloaded? Is there something as spl_autoload() for traits?
Lubaev.K 19-Jun-2013 02:20
<?php
trait World {

    private static $instance;
    protected $tmp;

    public static function World()
    {
        self::$instance = new static();
        self::$instance->tmp = get_called_class().' '.__TRAIT__;

        return self::$instance;
    }

}

if ( trait_exists( 'World' ) ) {

    class Hello {
        use World;

        public function text( $str )
        {
            return $this->tmp.$str;
        }
    }

}

echo Hello::World()->text('!!!'); // Hello World!!!


Classkit

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Fonctions Classkit
    • classkit_import — Importe de nouvelles définitions de méthodes de classes depuis un fichier
    • classkit_method_add — Ajoute dynamiquement une nouvelle méthode à une classe donnée
    • classkit_method_copy — Copie une méthode d'une classe vers une autre classe
    • classkit_method_redefine — Change dynamiquement le code de la méthode donnée
    • classkit_method_remove — Efface dynamiquement une méthode donnée
    • classkit_method_rename — Change dynamiquement le nom d'une méthode donnée

User Contributed Notes

There are no user contributed notes for this page.


Introduction

Ces fonctions permettent la manipulation dynamique des classes PHP, au moment de l'exécution.

Note:

Cette extension a été remplacée par l'extension runkit, qui n'est pas limitée aux classes, mais qui permet également la manipulation des fonctions.

User Contributed Notes

There are no user contributed notes for this page.


Installation

Cette extension est considérée comme non-maintenue et morte. Cependant, le code source est toujours disponible depuis le SVN de PECL ici : » https://svn.php.net/viewvc/pecl/classkit.

User Contributed Notes

There are no user contributed notes for this page.


Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

CLASSKIT_ACC_PRIVATE (entier)
Rend la méthode privée ("private")
CLASSKIT_ACC_PROTECTED (entier)
Rend la méthode protégée ("protected")
CLASSKIT_ACC_PUBLIC (entier)
Rend la méthode publique ("public")

User Contributed Notes

There are no user contributed notes for this page.


Fonctions Classkit

Sommaire

  • classkit_import — Importe de nouvelles définitions de méthodes de classes depuis un fichier
  • classkit_method_add — Ajoute dynamiquement une nouvelle méthode à une classe donnée
  • classkit_method_copy — Copie une méthode d'une classe vers une autre classe
  • classkit_method_redefine — Change dynamiquement le code de la méthode donnée
  • classkit_method_remove — Efface dynamiquement une méthode donnée
  • classkit_method_rename — Change dynamiquement le nom d'une méthode donnée

User Contributed Notes

There are no user contributed notes for this page.


Importe de nouvelles définitions de méthodes de classes depuis un fichier

  • « Fonctions Classkit
  • classkit_method_add »
  • PHP Manual
  • Fonctions Classkit
  • Importe de nouvelles définitions de méthodes de classes depuis un fichier

classkit_import

(PECL classkit >= 0.3)

classkit_import — Importe de nouvelles définitions de méthodes de classes depuis un fichier

Description

classkit_import ( string $filename ) : array

Note: Cette fonction ne peut pas être utilisée pour manipuler la méthode en cours (ou liée) d'exécution.

Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Liste de paramètres

filename

Le nom du fichier contenant les définitions des méthodes de classes à importer

Valeurs de retour

Tableau associatif contenant les méthodes importées

Exemples

Exemple #1 Exemple avec classkit_import()

<?php
// Fichier : newclass.php
class Example {
    function foo() {
        return "bar!\n";
    }
}
?>
<?php
// Requière newclass.php (voir ci-dessous)
class Example {
    function foo() {
        return "foo!\n";
    }
}

$e = new Example();

// Affichage original
echo $e->foo();

// Importation d'une méthode de remplacement
classkit_import('newclass.php');

// Affichage après importation
echo $e->foo();

?>

L'exemple ci-dessus va afficher :

foo!
bar!

Voir aussi

  • classkit_method_add() - Ajoute dynamiquement une nouvelle méthode à une classe donnée
  • classkit_method_copy() - Copie une méthode d'une classe vers une autre classe

User Contributed Notes

There are no user contributed notes for this page.


Ajoute dynamiquement une nouvelle méthode à une classe donnée

  • « classkit_import
  • classkit_method_copy »
  • PHP Manual
  • Fonctions Classkit
  • Ajoute dynamiquement une nouvelle méthode à une classe donnée

classkit_method_add

(PECL classkit >= 0.1)

classkit_method_add — Ajoute dynamiquement une nouvelle méthode à une classe donnée

Description

classkit_method_add ( string $classname , string $methodname , string $args , string $code , int $flags = CLASSKIT_ACC_PUBLIC ) : bool
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Liste de paramètres

classname

La classe où la méthode doit être ajoutée

methodname

Le nom de la méthode à ajouter

args

Liste d'arguments, séparés par des virgules, de la nouvelle méthode créée

code

Le code à exécuter lorsque methodname est appelé

flags

Le type de méthode à créer ; peut être CLASSKIT_ACC_PUBLIC, CLASSKIT_ACC_PROTECTED ou CLASSKIT_ACC_PRIVATE

Note:

Ce paramètre est utilisé depuis PHP 5, car avant cette version, toutes les méthodes étaient publiques.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec classkit_method_add()

<?php
class Example {
    function foo() {
        echo "foo!\n";
    }
}

// Création d'un objet Example
$e = new Example();

// Ajout d'une nouvelle méthode publique
classkit_method_add(
    'Example',
    'add',
    '$num1, $num2',
    'return $num1 + $num2;',
    CLASSKIT_ACC_PUBLIC
);

// Ajoute 12 + 4
echo $e->add(12, 4);
?>

L'exemple ci-dessus va afficher :

16

Voir aussi

  • classkit_method_copy() - Copie une méthode d'une classe vers une autre classe
  • classkit_method_redefine() - Change dynamiquement le code de la méthode donnée
  • classkit_method_remove() - Efface dynamiquement une méthode donnée
  • classkit_method_rename() - Change dynamiquement le nom d'une méthode donnée
  • create_function() - Crée une fonction anonyme

User Contributed Notes

Lester 03-Apr-2008 09:54
If you creates methods by using classkit_method_add(), they are not visible in get_class_methods().

class A
{
       public function foo()
       {
            return "foo!\n";
       }
}

classkit_method_redefine('A','bar','','return "bar !\n";',CLASSKIT_ACC_PUBLIC);

print_r(get_class_methods('A'));
// writes only "foo"


Copie une méthode d'une classe vers une autre classe

  • « classkit_method_add
  • classkit_method_redefine »
  • PHP Manual
  • Fonctions Classkit
  • Copie une méthode d'une classe vers une autre classe

classkit_method_copy

(PECL classkit >= 0.2)

classkit_method_copy — Copie une méthode d'une classe vers une autre classe

Description

classkit_method_copy ( string $dClass , string $dMethod , string $sClass , string $sMethod = ? ) : bool
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Liste de paramètres

dClass

Classe de destination de la méthode copiée

dMethod

Nom de la nouvelle méthode

sClass

Classe source contenant la méthode à copier

sMethod

Nom de la méthode à copier depuis la classe source. Si ce paramètre est omis, la valeur du paramètre dMethod est utilisée.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec classkit_method_copy()

<?php
class Foo {
    function example() {
        return "foo!\n";
    }
}

class Bar {
    // Initialement, aucune méthode
}

// Copie la méthode example() depuis la classe Foo vers la classe Bar et la nomme baz()
classkit_method_copy('Bar', 'baz', 'Foo', 'example');

// Affiche la fonction copiée
echo Bar::baz();
?>

L'exemple ci-dessus va afficher :

foo!

Voir aussi

  • classkit_method_add() - Ajoute dynamiquement une nouvelle méthode à une classe donnée
  • classkit_method_redefine() - Change dynamiquement le code de la méthode donnée
  • classkit_method_remove() - Efface dynamiquement une méthode donnée
  • classkit_method_rename() - Change dynamiquement le nom d'une méthode donnée

User Contributed Notes

There are no user contributed notes for this page.


Change dynamiquement le code de la méthode donnée

  • « classkit_method_copy
  • classkit_method_remove »
  • PHP Manual
  • Fonctions Classkit
  • Change dynamiquement le code de la méthode donnée

classkit_method_redefine

(PECL classkit >= 0.1)

classkit_method_redefine — Change dynamiquement le code de la méthode donnée

Description

classkit_method_redefine ( string $classname , string $methodname , string $args , string $code , int $flags = CLASSKIT_ACC_PUBLIC ) : bool

Note: Cette fonction ne peut pas être utilisée pour manipuler la méthode en cours (ou liée) d'exécution.

Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Liste de paramètres

classname

La classe dans laquelle la méthode est redéfinie

methodname

Le nom de la méthode à redéfinir

args

Liste d'arguments séparés par une virgule pour la méthode redéfinie

code

Le nouveau code à évaluer lorsque methodname est appelé

flags

La méthode redéfinie peut être CLASSKIT_ACC_PUBLIC, CLASSKIT_ACC_PROTECTED ou CLASSKIT_ACC_PRIVATE

Note:

Ce paramètre est utilisé depuis PHP 5, car avant cette version, toutes les méthodes étaient publiques.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec classkit_method_redefine()

<?php
class Example {
    function foo() {
        return "foo!\n";
    }
}

// Création d'un objet Example
$e = new Example();

// Affichage de Example::foo() (avant la redéfinition)
echo "Avant : " . $e->foo();

// Redéfinition de la méthode 'foo'
classkit_method_redefine(
    'Example',
    'foo',
    '',
    'return "bar!\n";',
    CLASSKIT_ACC_PUBLIC
);

// Affichage de Example::foo() (après la redéfinition)
echo "Après : " . $e->foo();
?>

L'exemple ci-dessus va afficher :

Avant : foo!
Après : bar!

Voir aussi

  • classkit_method_add() - Ajoute dynamiquement une nouvelle méthode à une classe donnée
  • classkit_method_copy() - Copie une méthode d'une classe vers une autre classe
  • classkit_method_remove() - Efface dynamiquement une méthode donnée
  • classkit_method_rename() - Change dynamiquement le nom d'une méthode donnée

User Contributed Notes

fdrean 03-Sep-2016 12:22
This could lead to revolution in cli mode now that developers can load new code without restarting process.


Efface dynamiquement une méthode donnée

  • « classkit_method_redefine
  • classkit_method_rename »
  • PHP Manual
  • Fonctions Classkit
  • Efface dynamiquement une méthode donnée

classkit_method_remove

(PECL classkit >= 0.1)

classkit_method_remove — Efface dynamiquement une méthode donnée

Description

classkit_method_remove ( string $classname , string $methodname ) : bool

Note: Cette fonction ne peut pas être utilisée pour manipuler la méthode en cours (ou liée) d'exécution.

Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Liste de paramètres

classname

La classe dans laquelle la méthode est effacée

methodname

Le nom de la méthode à effacer

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec classkit_method_remove()

<?php
class Example {
    function foo() {
        return "foo!\n";
    }

    function bar() {
        return "bar!\n";
    }
}

// Efface la métode 'foo'
classkit_method_remove(
    'Example',
    'foo'
);

echo implode(' ', get_class_methods('Example'));

?>

L'exemple ci-dessus va afficher :

bar

Voir aussi

  • classkit_method_add() - Ajoute dynamiquement une nouvelle méthode à une classe donnée
  • classkit_method_copy() - Copie une méthode d'une classe vers une autre classe
  • classkit_method_redefine() - Change dynamiquement le code de la méthode donnée
  • classkit_method_rename() - Change dynamiquement le nom d'une méthode donnée

User Contributed Notes

There are no user contributed notes for this page.


Change dynamiquement le nom d'une méthode donnée

  • « classkit_method_remove
  • ctype »
  • PHP Manual
  • Fonctions Classkit
  • Change dynamiquement le nom d'une méthode donnée

classkit_method_rename

(PECL classkit >= 0.1)

classkit_method_rename — Change dynamiquement le nom d'une méthode donnée

Description

classkit_method_rename ( string $classname , string $methodname , string $newname ) : bool

Note: Cette fonction ne peut pas être utilisée pour manipuler la méthode en cours (ou liée) d'exécution.

Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Liste de paramètres

classname

La classe dans laquelle la méthode doit être renommée

methodname

Le nom de la méthode à renommer

newname

Le nouveau nom à donner à la méthode

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec classkit_method_rename()

<?php
class Example {
    function foo() {
        return "foo!\n";
    }
}

// Renomme la méthode 'foo' en 'bar'
classkit_method_rename(
    'Example',
    'foo',
    'bar'
);

// Affiche la fonction renommée
echo Example::bar();
?>

L'exemple ci-dessus va afficher :

foo!

Voir aussi

  • classkit_method_add() - Ajoute dynamiquement une nouvelle méthode à une classe donnée
  • classkit_method_copy() - Copie une méthode d'une classe vers une autre classe
  • classkit_method_redefine() - Change dynamiquement le code de la méthode donnée
  • classkit_method_remove() - Efface dynamiquement une méthode donnée

User Contributed Notes

There are no user contributed notes for this page.


Vérification des types de caractères

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Fonctions Ctype
    • ctype_alnum — Vérifie qu'une chaîne est alphanumérique
    • ctype_alpha — Vérifie qu'une chaîne est alphabétique
    • ctype_cntrl — Vérifie qu'un caractère est un caractère de contrôle
    • ctype_digit — Vérifie qu'une chaîne est un entier
    • ctype_graph — Vérifie qu'une chaîne est imprimable
    • ctype_lower — Vérifie qu'une chaîne est en minuscules
    • ctype_print — Vérifie qu'une chaîne est imprimable
    • ctype_punct — Vérifie qu'une chaîne contient de la ponctuation
    • ctype_space — Vérifie qu'une chaîne n'est faite que de caractères blancs
    • ctype_upper — Vérifie qu'une chaîne est en majuscules
    • ctype_xdigit — Vérifie qu'un caractère représente un nombre hexadécimal

User Contributed Notes

There are no user contributed notes for this page.


Introduction

Les fonctions fournies par cette extension vérifient si un caractère ou une chaîne appartient à une certaine classe de caractères, suivant la configuration locale courante (voir aussi la fonction setlocale()).

Lorsqu'appelées avec un entier comme argument, ces fonctions se comportent exactement comme leur équivalent C du fichier ctype.h. Cela signifie que si vous passez un entier plus petit que 256, l'équivalent ASCII de la valeur sera utilisé afin de vérifier s'il se situe bien dans l'intervalle (les chiffres sont dans l'intervalle 0x30-0x39). Si le nombre se situe entre -128 et -1 inclus, alors 256 sera ajouté et la vérification se fera sur le résultat.

Lorsqu'appelées avec une chaîne comme argument, ces fonctions vérifient chaque caractère de la chaîne et ne retourneront true que si chacun des caractères correspond aux critères. Lorsqu'une chaîne vide est passée, le résultat sera toujours true en PHP < 5.1 et false depuis 5.1.

Si l'on passe autre chose qu'une chaîne ou un entier, false est retourné immédiatement.

Il est important de garder à l'esprit que les fonctions ctype sont toujours préférées pour les expressions rationnelles ainsi que pour les fonctions préfixées pas "str_*" et "is_*". En effet, ctype utilisant la bibliothèque native C, le traitement est extrêmement rapide.

Note:

Ces fonctions ne sont absolument pas relatives à la bibliothèque Python "ctypes". Les noms des fonctions sont relatives à l'en-tête du fichier C ctype.h où les fonctions C équivalentes sont définies.

Cette extension est antérieure à "ctypes" Python, aussi, toute confusion ne provient pas de cette extension...

User Contributed Notes

flashinno at gmail dot com 16-Jan-2015 08:12
pcre from the ver. 5.3 is a part of core PHP, any function exported from .so can't work wih faster than core function


Pré-requis

Aucune autre bibliothèque mis à part la bibliothèque C n'est requise. Cette dernière est toujours disponible.

User Contributed Notes

There are no user contributed notes for this page.


Installation

Le support de ctype peut être désactivé avec l'option de compilation --disable-ctype.

La version Windows de PHP dispose du support automatique de cette extension. Vous n'avez pas à ajouter de bibliothèque supplémentaire pour disposer de ces fonctions.

User Contributed Notes

sparc at fastmail dot fm 28-Dec-2016 08:42
Or pkg install php56-ctype if you have PHP 5.6 in FreeBSD
php at darkain dot com 02-Oct-2016 09:41
On FreeBSD, this library is NOT included automatically. It must be manually installed. This can be done with the following command:

pkg install php70-ctype


Fonctions Ctype

Sommaire

  • ctype_alnum — Vérifie qu'une chaîne est alphanumérique
  • ctype_alpha — Vérifie qu'une chaîne est alphabétique
  • ctype_cntrl — Vérifie qu'un caractère est un caractère de contrôle
  • ctype_digit — Vérifie qu'une chaîne est un entier
  • ctype_graph — Vérifie qu'une chaîne est imprimable
  • ctype_lower — Vérifie qu'une chaîne est en minuscules
  • ctype_print — Vérifie qu'une chaîne est imprimable
  • ctype_punct — Vérifie qu'une chaîne contient de la ponctuation
  • ctype_space — Vérifie qu'une chaîne n'est faite que de caractères blancs
  • ctype_upper — Vérifie qu'une chaîne est en majuscules
  • ctype_xdigit — Vérifie qu'un caractère représente un nombre hexadécimal

User Contributed Notes

There are no user contributed notes for this page.


Vérifie qu'une chaîne est alphanumérique

  • « Fonctions Ctype
  • ctype_alpha »
  • PHP Manual
  • Fonctions Ctype
  • Vérifie qu'une chaîne est alphanumérique

ctype_alnum

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_alnum — Vérifie qu'une chaîne est alphanumérique

Description

ctype_alnum ( mixed $text ) : bool

ctype_alnum() vérifie si tous les caractères de la chaîne text sont des lettres et des chiffres.

Liste de paramètres

text

La chaîne testée.

Note:

Si un entier dans l'intervalle -128 et 255 inclus est fourni, il sera interprété comme la valeur ASCII d'un seul caractère (les valeurs négatives se verront ajouter 256 afin d'autoriser les caractères dans l'intervalle ASCII étendue). Tout autre entier sera interprété comme une chaîne de caractères contenant les décimales de l'entier.

Valeurs de retour

Retourne true si tous les caractères de text sont soit des lettres, soit des chiffres, false sinon.

Exemples

Exemple #1 Exemple avec ctype_alnum() (en utilisant les locales par défaut)

<?php
$strings = array('AbCd1zyZ9', 'foo!#$bar');
foreach ($strings as $testcase) {
  if (ctype_alnum($testcase)) {
    echo "La chaîne $testcase contient des chiffres ou des lettres.\n";
  } else {
    echo "La chaîne $testcase ne contient pas que des chiffres ou des lettres.\n";
  }
}
?>

L'exemple ci-dessus va afficher :

La chaîne AbCd1zyZ9 contient des chiffres ou des lettres.
La chaîne foo!#$bar ne contient pas que des chiffres ou des lettres.

Voir aussi

  • ctype_alpha() - Vérifie qu'une chaîne est alphabétique
  • ctype_digit() - Vérifie qu'une chaîne est un entier
  • setlocale() - Modifie les informations de localisation

User Contributed Notes

marcelocamargo at linuxmail dot org 04-Jan-2016 04:42
It is also important to note that the behavior of `ctype_alnum` differs according to the operating system. For UNIX-based operating system, if you pass a value that is not a string (or an overloaded object), independently of the value, it will always result in false. However, if we do the same on Windows, using, for example, -1 as literal (a minus and a number greater than 0), we'll have true as result.

<?php var_dump(ctype_alnum(-1));
// UNIX: bool(false)
// Windows: bool(true)
Anonymous 28-Jan-2013 05:12
Quicktip: If ctype is not enabled by default on your server, replace ctype_alnum($var) with preg_match('/^[a-zA-Z0-9]+$/', $var).
Rory 07-Dec-2009 04:42
Just for the record, Gentoo doesn't include this function by default. You'll have to recompile PHP with the "ctype" USE flag.
thinice at gmail dot com 22-Jul-2009 02:46
ctype_alnum() is a godsend for quick and easy username/data filtering when used in conjunction with str_replace().

Let's say your usernames have dash(-) and underscore(_) allowable and alphanumeric digits as well.

Instead of a regex you can trade a bit of performance for simplicity:

<?php
$sUser = 'my_username01';
$aValid = array('-', '_');

if(!ctype_alnum(str_replace($aValid, '', $sUser))) {
    echo 'Your username is not properly formatted.';
}
?>


Vérifie qu'une chaîne est alphabétique

  • « ctype_alnum
  • ctype_cntrl »
  • PHP Manual
  • Fonctions Ctype
  • Vérifie qu'une chaîne est alphabétique

ctype_alpha

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_alpha — Vérifie qu'une chaîne est alphabétique

Description

ctype_alpha ( mixed $text ) : bool

ctype_alpha() vérifie si tous les caractères de la chaîne text sont des lettres, et false sinon. En langage C, les lettres sont [A-Za-z] et ctype_alpha() est équivalent à (ctype_upper($text) || ctype_lower($text)), si text est un caractère unique, mais certaines langues ont des caractères qui ne sont ni des majuscules, ni des minuscules.

Liste de paramètres

text

La chaîne testée.

Note:

Si un entier dans l'intervalle -128 et 255 inclus est fourni, il sera interprété comme la valeur ASCII d'un seul caractère (les valeurs négatives se verront ajouter 256 afin d'autoriser les caractères dans l'intervalle ASCII étendue). Tout autre entier sera interprété comme une chaîne de caractères contenant les décimales de l'entier.

Valeurs de retour

Retourne true si tous les caractères de text est une lettre de la locale courante, false sinon.

Exemples

Exemple #1 Exemple avec ctype_alpha() (en utilisant les locales courantes)

<?php
$strings = array('KjgWZC', 'arf12');
foreach ($strings as $testcase) {
  if (ctype_alpha($testcase)) {
    echo "La chaîne $testcase ne contient que des lettres.\n";
  } else {
    echo "La chaîne $testcase ne contient pas que des lettres.\n";
  }
}
?>

L'exemple ci-dessus va afficher :

La chaîne KjgWZC ne contient que des lettres.
La chaîne arf12 ne contient pas que des lettres.

Voir aussi

  • ctype_upper() - Vérifie qu'une chaîne est en majuscules
  • ctype_lower() - Vérifie qu'une chaîne est en minuscules
  • setlocale() - Modifie les informations de localisation

User Contributed Notes

Tyrunur 27-May-2009 02:12
It works if you set the locale correctly:

<?php

setLocale(LC_CTYPE, 'FR_fr.UTF-8');

?>

with this change you will get "yes" "yes"


Vérifie qu'un caractère est un caractère de contrôle

  • « ctype_alpha
  • ctype_digit »
  • PHP Manual
  • Fonctions Ctype
  • Vérifie qu'un caractère est un caractère de contrôle

ctype_cntrl

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_cntrl — Vérifie qu'un caractère est un caractère de contrôle

Description

ctype_cntrl ( mixed $text ) : bool

ctype_cntrl() vérifie si tous les caractères de la chaîne text sont des caractères de contrôles spéciaux. Ces caractères sont les nouvelles lignes, les tabulations, les caractères d'échappement.

Liste de paramètres

text

La chaîne testée.

Note:

Si un entier dans l'intervalle -128 et 255 inclus est fourni, il sera interprété comme la valeur ASCII d'un seul caractère (les valeurs négatives se verront ajouter 256 afin d'autoriser les caractères dans l'intervalle ASCII étendue). Tout autre entier sera interprété comme une chaîne de caractères contenant les décimales de l'entier.

Valeurs de retour

Retourne true si chaque caractère de text est un caractère de contrôle de la locale courante, false sinon.

Exemples

Exemple #1 Exemple avec ctype_cntrl()

<?php
$strings = array('string1' => "\n\r\t", 'string2' => 'arf12');
foreach ($strings as $name => $testcase) {
  if (ctype_cntrl($testcase)) {
    echo "La chaîne '$name' ne contient que des caractères de contrôle.\n";
  } else {
    echo "La chaîne '$name' ne contient pas que des caractères de contrôle.\n";
  }
}
?>

L'exemple ci-dessus va afficher :

La chaîne 'string1' ne contient que des caractères de contrôle.
La chaîne 'string2' ne contient pas que des caractères de contrôle.

Voir aussi

  • ctype_print() - Vérifie qu'une chaîne est imprimable

User Contributed Notes

Tor 09-Mar-2013 10:02
Returns true if bytes are in the range of \x00-\x1f or \x7f (del). Returns false if bytes are in the range of \x20-\x7e or \x80-\xff.


Vérifie qu'une chaîne est un entier

  • « ctype_cntrl
  • ctype_graph »
  • PHP Manual
  • Fonctions Ctype
  • Vérifie qu'une chaîne est un entier

ctype_digit

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_digit — Vérifie qu'une chaîne est un entier

Description

ctype_digit ( mixed $text ) : bool

ctype_digit() vérifie si tous les caractères de la chaîne text sont des chiffres.

Liste de paramètres

text

La chaîne testée.

Note:

Si un entier dans l'intervalle -128 et 255 inclus est fourni, il sera interprété comme la valeur ASCII d'un seul caractère (les valeurs négatives se verront ajouter 256 afin d'autoriser les caractères dans l'intervalle ASCII étendue). Tout autre entier sera interprété comme une chaîne de caractères contenant les décimales de l'entier.

Valeurs de retour

Retourne true si tous les caractères de text sont des chiffres décimaux, false sinon.

Exemples

Exemple #1 Exemple avec ctype_digit()

<?php
$strings = array('1820.20', '10002', 'wsl!12');
foreach ($strings as $testcase) {
  if (ctype_digit($testcase)) {
    echo "La chaîne $testcase ne contient que des entiers.\n";
  } else {
    echo "La chaîne $testcase ne contient pas que des entiers.\n";
  }
}
?>

L'exemple ci-dessus va afficher :

La chaîne 1820.20 ne contient pas que des entiers.
La chaîne 10002 ne contient que des entiers.
La chaîne wsl!12 ne contient pas que des entiers.

Exemple #2 Exemple avec ctype_digit() pour comparer des chaînes et des nombres

<?php

$numeric_string = '42';
$integer        = 42;

ctype_digit($numeric_string);  // true
ctype_digit($integer);         // false (ASCII 42 correspond au caractère *)

is_numeric($numeric_string);   // true
is_numeric($integer);          // true
?>

Voir aussi

  • ctype_alnum() - Vérifie qu'une chaîne est alphanumérique
  • ctype_xdigit() - Vérifie qu'un caractère représente un nombre hexadécimal
  • is_numeric() - Détermine si une variable est un nombre ou une chaîne numérique
  • is_int() - Détermine si une variable est de type nombre entier
  • is_string() - Détermine si une variable est de type chaîne de caractères

User Contributed Notes

divinity76 at gmail dot com 13-Feb-2021 08:54
an alternative if you want to check if it's a valid integer:

<?php
if(false!==filter_var($v, FILTER_VALIDATE_INT)){
    // it's a valid int!
    $v=(int)$v;
}else{
    // it's not a valid int
}
?>

or if you want to check that it's a positive integer (>= 0):
<?php
if(false!==filter_var($v, FILTER_VALIDATE_INT, ["options"=>["min_range"=>0]])){
    // it's a valid positive integer!
    $v = (int)$v;
}else{
    // it's not a valid positive integer
}

?>
brcontainer at yahoo dot com dot br 07-Oct-2018 03:00
ctype_digit don't support negative value in string:

<?php
var_dump( ctype_digit('-10') ); //return bool(false)
?>

Improved (and simplified) Tim Boormans code:

<?php
/**
 * Check input for existing only of digits (numbers)
 * @author Guilherme Nascimento <brcontainer@yahoo.com.br>
 * @param $digit
 * @return bool
 */
function is_digit($digit)
{
    return preg_match('#^-?\d+$#', $digit) && is_int((int) $digit);
}
zorrosNOSPAMwordsman at NOSPAM dot gmail dot com 11-May-2016 12:34
If you want to verify whether or not a variable contains only digits, you can type cast it to a string and back to int and see if the result is identical. Like so:

<?php

// (bool) TRUE if only digits, FALSE otherwise
$isOnlyDigits = (string) (int) $input === (string) $input;

?>

I haven't benchmarked it, but I'm guessing it's significantly faster then regular expressions.
smicheal2 at gmail dot com 07-Oct-2015 01:21
Please note that ctype_digit() will say true for strings such as '00001', which are not technically valid representations of integers, while saying false to strings such as '-1', which are. It's basically a faster version of the regex /^\d+$/. As the name says, it answers the question "does this string contain only digits" literally. It does not answer "is this a valid representation of an integer". If that's what you want, use is_int(filter_var($val, FILTER_VALIDATE_INT)) instead.
error17191 at gmail dot com 03-Oct-2015 01:41
I just wanted to clarify a flaw in the function is_digit() suggested by "info at directwebsolutions dot nl " ..
It returns true in case of negative integers and false in case of strings that contain negative integers .
 example:
is_digit(-10); // returns ture
is_digit('-10'); // returns false
rlerne at gmail dot com 25-Apr-2013 06:04
Interesting to note that you must pass a STRING to this function, other values won't be typecasted (I figured it would even though above explicitly says string $text).

I.E.

<?PHP
$val = 42; //Answer to life
$x = ctype_digit($val);
?>

Will return false, even though, when typecasted to string, it would be true.

<?PHP
$val = '42';
$x = ctype_digit($val);
?>

Returns True.

Could do this too:

<?PHP
$val = 42;
$x = ctype_digit((string) $val);
?>

Which will also return true, as it should.
info at directwebsolutions dot nl 19-May-2012 09:16
All basic PHP functions which i tried returned unexpected results. I would just like to check whether some variable only contains numbers. For example: when i spread my script to the public i cannot require users to only use numbers as string or as integer. For those situation i wrote my own function which handles all inconveniences of other functions and which is not depending on regular expressions. Some people strongly believe that regular functions slow down your script.

The reason to write this function:
1. is_numeric() accepts values like: +0123.45e6 (but you would expect it would not)
2. is_int() does not accept HTML form fields (like: 123) because they are treated as strings (like: "123").
3. ctype_digit() excepts all numbers to be strings (like: "123") and does not validate real integers (like: 123).
4. Probably some functions would parse a boolean (like: true or false) as 0 or 1 and validate it in that manner.

My function only accepts numbers regardless whether they are in string or in integer format.
<?php
    /**
     * Check input for existing only of digits (numbers)
     * @author Tim Boormans <info@directwebsolutions.nl>
     * @param $digit
     * @return bool
     */
    function is_digit($digit) {
        if(is_int($digit)) {
            return true;
        } elseif(is_string($digit)) {
            return ctype_digit($digit);
        } else {
            // booleans, floats and others
            return false;
        }
    }
?>
Skippy 25-Oct-2011 01:44
If you need to check for integers instead of just digits you can supply your own function such as this:

<?php
function ctype_int($text)
{
    return preg_match('/^-?[0-9]+$/', (string)$text) ? true : false;
}
?>
mdsky at web dot de 21-May-2010 12:44
is_numeric gives true by f. ex. 1e3 or 0xf5 too. So it's not the same as ctype_digit, which just gives true when only values from 0 to 9 are entered.
John Saman 05-Feb-2010 05:38
Using is_numeric function is quite faster than ctype_digit.

is_numeric took 0.237 Seconds for one million runs. while ctype_digit took 0.470 Seconds.
strrev xc tod noxeh ta ellij 14-Dec-2009 08:41
ctype_digit() will treat all passed integers below 256 as character-codes. It returns true for 48 through 57 (ASCII '0'-'9') and false for the rest.

ctype_digit(5) -> false
ctype_digit(48) -> true
ctype_digit(255) -> false
ctype_digit(256) -> true

(Note: the PHP type must be an int; if you pass strings it works as expected)
Peter de Pijd 18-Jul-2009 03:53
Note that an empty string is also false:
ctype_digit("") // false
a_p_leeming at hotmail dot com 24-May-2009 06:17
Also note that

<?php ctype_digit("-1");   //false ?>
raul dot 3k at gmail dot com 09-Apr-2009 08:21
The ctype_digit can be used in a simple form to validate a field:
<?php
$field = $_POST["field"];
if(!ctype_digit($field)){
  echo "It's not a digit";
}
?>

Note:
Digits is 0-9


Vérifie qu'une chaîne est imprimable

  • « ctype_digit
  • ctype_lower »
  • PHP Manual
  • Fonctions Ctype
  • Vérifie qu'une chaîne est imprimable

ctype_graph

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_graph — Vérifie qu'une chaîne est imprimable

Description

ctype_graph ( mixed $text ) : bool

ctype_graph() vérifie si tous les caractères de la chaîne text ont une représentation graphique, et créeront une impression sur l'écran (les espaces n'en font pas partie).

Liste de paramètres

text

La chaîne testée.

Note:

Si un entier dans l'intervalle -128 et 255 inclus est fourni, il sera interprété comme la valeur ASCII d'un seul caractère (les valeurs négatives se verront ajouter 256 afin d'autoriser les caractères dans l'intervalle ASCII étendue). Tout autre entier sera interprété comme une chaîne de caractères contenant les décimales de l'entier.

Valeurs de retour

Retourne true si tous les caractères de text ont une représentation graphique et créeront une impression sur l'écran, false sinon.

Exemples

Exemple #1 Exemple avec ctype_graph()

<?php
$strings = array('string1' => "asdf\n\r\t", 'string2' => 'arf12', 'string3' => 'LKA#@%.54');
foreach ($strings as $name => $testcase) {
  if (ctype_graph($testcase)) {
    echo "La chaîne '$name' ne contient que des caractères imprimables.\n";
  } else {
    echo "La chaîne '$name' ne contient pas que des caractères imprimables.\n";
  }
}
?>

L'exemple ci-dessus va afficher :

La chaîne 'string1' ne contient pas que des caractères imprimables.
La chaîne 'string2' ne contient que des caractères imprimables.
La chaîne 'string3' ne contient que des caractères imprimables.

Voir aussi

  • ctype_alnum() - Vérifie qu'une chaîne est alphanumérique
  • ctype_print() - Vérifie qu'une chaîne est imprimable
  • ctype_punct() - Vérifie qu'une chaîne contient de la ponctuation

User Contributed Notes

There are no user contributed notes for this page.


Vérifie qu'une chaîne est en minuscules

  • « ctype_graph
  • ctype_print »
  • PHP Manual
  • Fonctions Ctype
  • Vérifie qu'une chaîne est en minuscules

ctype_lower

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_lower — Vérifie qu'une chaîne est en minuscules

Description

ctype_lower ( mixed $text ) : bool

ctype_lower() vérifie si tous les caractères de la chaîne text sont des minuscules.

Liste de paramètres

text

La chaîne testée.

Note:

Si un entier dans l'intervalle -128 et 255 inclus est fourni, il sera interprété comme la valeur ASCII d'un seul caractère (les valeurs négatives se verront ajouter 256 afin d'autoriser les caractères dans l'intervalle ASCII étendue). Tout autre entier sera interprété comme une chaîne de caractères contenant les décimales de l'entier.

Valeurs de retour

Retourne true si tous les caractères de text sont en minuscule dans la locale courante.

Exemples

Exemple #1 Exemple avec ctype_lower() (en utilisant les locales courantes)

<?php
$strings = array('aac123', 'qiutoas', 'QASsdks');
foreach ($strings as $testcase) {
  if (ctype_lower($testcase)) {
    echo "La chaîne $testcase ne contient que des minuscules.\n";
  } else {
    echo "La chaîne $testcase ne contient pas que des minuscules.\n";
  }
}
?>

L'exemple ci-dessus va afficher :

La chaîne aac123 ne contient pas que des minuscules.
La chaîne qiutoas ne contient que des minuscules.
La chaîne QASsdks ne contient pas que des minuscules.

Voir aussi

  • ctype_alpha() - Vérifie qu'une chaîne est alphabétique
  • ctype_upper() - Vérifie qu'une chaîne est en majuscules
  • setlocale() - Modifie les informations de localisation

User Contributed Notes

There are no user contributed notes for this page.


Vérifie qu'une chaîne est imprimable

  • « ctype_lower
  • ctype_punct »
  • PHP Manual
  • Fonctions Ctype
  • Vérifie qu'une chaîne est imprimable

ctype_print

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_print — Vérifie qu'une chaîne est imprimable

Description

ctype_print ( mixed $text ) : bool

ctype_print() vérifie si tous les caractères de la chaîne text vont être imprimables à l'écran (y compris les espaces blancs).

Liste de paramètres

text

La chaîne testée.

Note:

Si un entier dans l'intervalle -128 et 255 inclus est fourni, il sera interprété comme la valeur ASCII d'un seul caractère (les valeurs négatives se verront ajouter 256 afin d'autoriser les caractères dans l'intervalle ASCII étendue). Tout autre entier sera interprété comme une chaîne de caractères contenant les décimales de l'entier.

Valeurs de retour

Retourne true si tous les caractères de text seront imprimables (y compris les espaces blancs). Retourne false si text contient des caractères de contrôle ou des caractères qui ne s'afficheront pas ou non pas de fonction de contrôle.

Exemples

Exemple #1 Exemple avec ctype_print()

<?php
$strings = array('string1' => "asdf\n\r\t", 'string2' => 'arf12', 'string3' => 'LKA#@%.54');
foreach ($strings as $name => $testcase) {
  if (ctype_print($testcase)) {
    echo "La chaîne '$name' ne contient que des caractères imprimables.\n";
  } else {
    echo "La chaîne '$name' ne contient pas que des caractères imprimables.\n";
  }
}
?>

L'exemple ci-dessus va afficher :

La chaîne 'string1' ne contient pas que des caractères imprimables.
La chaîne 'string2' ne contient que des caractères imprimables.
La chaîne 'string3' ne contient que des caractères imprimables.

Voir aussi

  • ctype_cntrl() - Vérifie qu'un caractère est un caractère de contrôle
  • ctype_graph() - Vérifie qu'une chaîne est imprimable
  • ctype_punct() - Vérifie qu'une chaîne contient de la ponctuation

User Contributed Notes

ClayDragon 02-Sep-2018 09:20
As mentioned above, only ASCII characters from 32 to 126 are considered printable, all others, including UTF-8 encoded characters are always considered unprintable, no matter what your locale settings are. Therefore, e.g. German "ä", the Euro sign "€" or the British pound symbol "£" will never be printable. If you need to check any characters for "printability" beyond the standard ASCII range, use a regular expression or write a specific function yourself.

See also this discussion: https://grokbase.com/t/php/php-i18n/102tkqe6rk/ctype-print-returns-false-for-british-pound-symbol-and-non-ascii-symbols
Anonymous 12-Jun-2012 05:59
Only ascii 32 thru 126 (inclusive) are considered printable. Tab (ascii 7), carriage return (ascii 13), linefeed (ascii 10) etc may produce output but are not considered printable.


Vérifie qu'une chaîne contient de la ponctuation

  • « ctype_print
  • ctype_space »
  • PHP Manual
  • Fonctions Ctype
  • Vérifie qu'une chaîne contient de la ponctuation

ctype_punct

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_punct — Vérifie qu'une chaîne contient de la ponctuation

Description

ctype_punct ( mixed $text ) : bool

ctype_punct() vérifie si tous les caractères de la chaîne text sont imprimables, mais ne sont ni des lettres, ni des chiffres, ni des espaces.

Liste de paramètres

text

La chaîne testée.

Note:

Si un entier dans l'intervalle -128 et 255 inclus est fourni, il sera interprété comme la valeur ASCII d'un seul caractère (les valeurs négatives se verront ajouter 256 afin d'autoriser les caractères dans l'intervalle ASCII étendue). Tout autre entier sera interprété comme une chaîne de caractères contenant les décimales de l'entier.

Valeurs de retour

Retourne true si tous les caractères de text sont des caractères de ponctuation, false sinon.

Exemples

Exemple #1 Exemple avec ctype_punct()

<?php
$strings = array('ABasdk!@!$#', '!@ # $', '*&$()');
foreach ($strings as $testcase) {
  if (ctype_punct($testcase)) {
    echo "La chaîne $testcase ne contient que de la ponctuation.\n";
  } else {
    echo "The string $testcase ne contient pas que de la ponctuation.\n";
  }
}
?>

L'exemple ci-dessus va afficher :

La chaîne ABasdk!@!$# ne contient pas que de la ponctuation.
La chaîne !@ # $ ne contient pas que de la ponctuation.
La chaîne *&$() ne contient que de la ponctuation.

Voir aussi

  • ctype_cntrl() - Vérifie qu'un caractère est un caractère de contrôle
  • ctype_graph() - Vérifie qu'une chaîne est imprimable

User Contributed Notes

There are no user contributed notes for this page.


Vérifie qu'une chaîne n'est faite que de caractères blancs

  • « ctype_punct
  • ctype_upper »
  • PHP Manual
  • Fonctions Ctype
  • Vérifie qu'une chaîne n'est faite que de caractères blancs

ctype_space

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_space — Vérifie qu'une chaîne n'est faite que de caractères blancs

Description

ctype_space ( mixed $text ) : bool

ctype_space() vérifie si tous les caractères de la chaîne text vont créer un espace blanc.

Liste de paramètres

text

La chaîne testée.

Note:

Si un entier dans l'intervalle -128 et 255 inclus est fourni, il sera interprété comme la valeur ASCII d'un seul caractère (les valeurs négatives se verront ajouter 256 afin d'autoriser les caractères dans l'intervalle ASCII étendue). Tout autre entier sera interprété comme une chaîne de caractères contenant les décimales de l'entier.

Valeurs de retour

Retourne true si tous les caractères de text vont créer des espaces blancs, false sinon. Cela inclut le tabulations, les tabulations verticales, les nouvelles lignes, les retours chariots et les retours à la ligne.

Exemples

Exemple #1 Exemple avec ctype_space()

<?php
$strings = array(
    'string1' => "\n\r\t",
    'string2' => "\narf12",
    'string3' => '\n\r\t' // notez les guillemets simple
);
foreach ($strings as $name => $testcase) {
    if (ctype_space($testcase)) {
        echo "La chaîne de caractères '$name' ne contient que des caractères d'espacements blancs.\n";
    } else {
        echo "La chaîne de caractères '$name' ne contient pas que des caractères d'espacements blancs.\n";
    }
}
?>

L'exemple ci-dessus va afficher :

La chaîne 'string1' ne contient que des caractères d'espacements blancs.
La chaîne 'string2' ne contient pas que des caractères d'espacements blancs.
La chaîne 'string3' ne contient pas que des caractères d'espacements blancs.

Voir aussi

  • ctype_cntrl() - Vérifie qu'un caractère est un caractère de contrôle
  • ctype_graph() - Vérifie qu'une chaîne est imprimable
  • ctype_punct() - Vérifie qu'une chaîne contient de la ponctuation

User Contributed Notes

vlabots at gmail dot com 18-Jun-2014 07:03
thanks to gardnerjohng, but a had some problems with non-breaking spaces in this function.

I added 2 more cases for this:
case 0xC2
case 0xA0

After this modification non-breaking spaces in my test code were successfully detected.
gardnerjohng at hotmail dot com 14-Sep-2009 09:00
A function I wrote last night was fairly flexible in terms of detecting whitespace, and even took into account the pesky non-breaking spaces / zero-width spaces further up the Unicode alphabet.

The benefit here was being able to isolate and identify specific Unicode indices based on their subrange.

<?php
    //    Returns TRUE if the ASCII value of $string matches a registered whitespace character.
    //    *    This includes non-breaking spaces, zero-width spaces, and any unicode values below 32.
    //    *    $string: Character to identify. If string extends past one character, the value
    //        is truncated and only the initial character is examined.
    function is_whitespace($string){
        //    Return FALSE if passed an empty string.
        if($string == "") return FALSE;

        $char    =    ord($string);

        //    Control Characters
        if($char < 33)                        return TRUE;
        if($char > 8191 && $char < 8208)    return TRUE;
        if($char > 8231 && $char < 8240)    return TRUE;

        //    Additional Characters
        switch($char){
            case 160:    // Non-Breaking Space
            case 8287:    // Medium Mathematical Space
                return TRUE;
                break;
        }
        return FALSE;
    }
?>


Vérifie qu'une chaîne est en majuscules

  • « ctype_space
  • ctype_xdigit »
  • PHP Manual
  • Fonctions Ctype
  • Vérifie qu'une chaîne est en majuscules

ctype_upper

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_upper — Vérifie qu'une chaîne est en majuscules

Description

ctype_upper ( mixed $text ) : bool

ctype_upper() vérifie si tous les caractères de la chaîne text sont des majuscules.

Liste de paramètres

text

La chaîne testée.

Note:

Si un entier dans l'intervalle -128 et 255 inclus est fourni, il sera interprété comme la valeur ASCII d'un seul caractère (les valeurs négatives se verront ajouter 256 afin d'autoriser les caractères dans l'intervalle ASCII étendue). Tout autre entier sera interprété comme une chaîne de caractères contenant les décimales de l'entier.

Valeurs de retour

Retourne true si tous les caractères de text sont en majuscules dans la locale courante.

Exemples

Exemple #1 Exemple avec ctype_upper() (en utilisant la locale courante)

<?php
$strings = array('AKLWC139', 'LMNSDO', 'akwSKWsm');
foreach ($strings as $testcase) {
  if (ctype_upper($testcase)) {
    echo "La chaîne $testcase ne contient que des majuscules.\n";
  } else {
    echo "La chaîne $testcase ne contient pas que des majuscules.\n";
  }
}
?>

L'exemple ci-dessus va afficher :

La chaîne AKLWC139 ne contient pas que des majuscules.
La chaîne LMNSDO ne contient que des majuscules.
La chaîne akwSKWsm ne contient pas que des majuscules.

Voir aussi

  • ctype_alpha() - Vérifie qu'une chaîne est alphabétique
  • ctype_lower() - Vérifie qu'une chaîne est en minuscules
  • setlocale() - Modifie les informations de localisation

User Contributed Notes

Anonymous 06-Jan-2016 07:25
// after screwing around with function.ctype-upper
// I found this simple solution

if (strtolower($string) != $string)// its so simple!
{
  echo "uppercase letters found in $string";
}

source: http://stackoverflow.com/questions/4426327/how-to-detect-if-string-contains-1-uppercase-letter-in-php
chris at theothernews dot co dot nz 11-Jun-2014 02:32
Underscores in the string will result in false, so you have to remove them first.


Vérifie qu'un caractère représente un nombre hexadécimal

  • « ctype_upper
  • Filter »
  • PHP Manual
  • Fonctions Ctype
  • Vérifie qu'un caractère représente un nombre hexadécimal

ctype_xdigit

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_xdigit — Vérifie qu'un caractère représente un nombre hexadécimal

Description

ctype_xdigit ( mixed $text ) : bool

ctype_xdigit() vérifie si tous les caractères de la chaîne text sont des chiffres hexadécimaux.

Liste de paramètres

text

La chaîne testée.

Note:

Si un entier dans l'intervalle -128 et 255 inclus est fourni, il sera interprété comme la valeur ASCII d'un seul caractère (les valeurs négatives se verront ajouter 256 afin d'autoriser les caractères dans l'intervalle ASCII étendue). Tout autre entier sera interprété comme une chaîne de caractères contenant les décimales de l'entier.

Valeurs de retour

Retourne true si tous les caractères de text sont des chiffres hexadécimaux, c'est-à-dire un chiffre ou une des lettres [A-Fa-f], false sinon.

Exemples

Exemple #1 Exemple avec ctype_xdigit()

<?php
$strings = array('AB10BC99', 'AR1012', 'ab12bc99');
foreach ($strings as $testcase) {
  if (ctype_xdigit($testcase)) {
    echo "La chaîne $testcase ne contient que des chiffres hexadécimaux.\n";
  } else {
    echo "La chaîne $testcase ne contient pas que des chiffres hexadécimaux.\n";
  }
}
?>

L'exemple ci-dessus va afficher :

La chaîne AB10BC99 ne contient que des chiffres hexadécimaux.
La chaîne AR1012 ne contient pas que des chiffres hexadécimaux.
La chaîne ab12bc99 ne contient que des chiffres hexadécimaux.

Voir aussi

  • ctype_digit() - Vérifie qu'une chaîne est un entier

User Contributed Notes

tom at hgmail dot com 14-Jan-2006 12:36
This function shows its usefulness on a web site where a user is asked to entered a hexidecimal color code for a color. To prevent breaking W3C standard and having them enter in "neon-green" or the wrong type of code like 355511235.

In conjunction with strlen()  you could create a function like this:

function check_valid_colorhex($colorCode) {
    // If user accidentally passed along the # sign, strip it off
    $colorCode = ltrim($colorCode, '#');

    if (
          ctype_xdigit($colorCode) &&
          (strlen($colorCode) == 6 || strlen($colorCode) == 3))
               return true;

    else return false;
}


Filtrage des données

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Types de filtres
    • Filtres de validation
    • Filtres de nettoyage
    • Autres filtres
    • Drapeaux des filtres
  • Constantes pré-définies
  • Exemples
    • Validation
    • Nettoyage
  • Filter Fonctions
    • filter_has_var — Vérifie si une variable d'un type spécifique existe
    • filter_id — Retourne l'identifiant d'un filtre nommé
    • filter_input_array — Récupère plusieurs valeurs externes et les filtre
    • filter_input — Récupère une variable externe et la filtre
    • filter_list — Retourne une liste de tous les filtres supportés
    • filter_var_array — Récupère plusieurs variables et les filtre
    • filter_var — Filtre une variable avec un filtre spécifique

User Contributed Notes

There are no user contributed notes for this page.


Introduction

Cette extension filtre les données soit en les validant, soit en les nettoyant. C'est particulièrement utile lorsque les sources contiennent des données inconnues, comme les données utilisateurs. Par exemple, les données pourraient provenir d'un formulaire HTML.

Il y a deux moyens de filtre : la validation et le nettoyage.

La Validation sert à vérifier si une donnée passe certains critères. Par exemple, passer les critères de FILTER_VALIDATE_EMAIL va déterminer si une donnée est une adresse courriel valide, mais ne va pas modifier la donnée elle-même.

Le nettoyage va nettoyer les données ; par exemple en retirant les caractères indésirables. Par exemple, passer une donnée à FILTER_SANITIZE_EMAIL va faire disparaître les caractères inappropriés dans une adresse courriel. D'un autre coté, la donnée n'est pas validée.

Des options sont éventuellement utilisées par la validation et le nettoyage, pour adapter leur comportement à des besoins spécifiques. Par exemple, avec l'option FILTER_FLAG_PATH_REQUIRED pour filter une URL, il faut indiquer le chemin utilisé (tel que http://example.org/foo).

User Contributed Notes

There are no user contributed notes for this page.


Installation

L'extension filter est activée par défaut depuis PHP 5.2.0. Pour désactiver l'extension filter, utilisez --disable-filter.

Avant PHP 5.2 une extension PECL expérimentale pouvait être utilisée. La version PECL n'est actuellement plus maintenue.

User Contributed Notes

There are no user contributed notes for this page.


Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration pour Filter
Nom | Défaut | Modifiable | Historique
filter.default | "unsafe_raw" | PHP_INI_PERDIR | PHP_INI_ALL en filter <= 0.9.4. Disponible à partir de PHP 5.2.0.
filter.default_flags | NULL | PHP_INI_PERDIR | PHP_INI_ALL en filter <= 0.9.4. Disponible à partir de PHP 5.2.0.
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.

Voici un éclaircissement sur l'utilisation des directives de configuration.

filter.default string

Filtre toutes les données transmises via $_GET, $_POST, $_COOKIE, $_REQUEST et $_SERVER avec ce filtre. Les données originales peut être à l'aide de la fonction input_get().

Accepte le nom du filtre que vous voulez utiliser par défaut. Voir la liste des filtres existants pour en connaître les noms.

Note:

Attention aux drapeaux par défaut des filtres par défaut. Vous devriez explicitement indiquer leur valeur par défaut. Par exemple, pour configurer le filtre par défaut pour agir exactement comme htmlspecialchars() vous devez passer son drapeau à 0, comme dans l'exemple ci-après.

Exemple #1 Configurer le filtre par défaut pour qu'il agisse comme htmlspecialchars

filter.default = full_special_chars
filter.default_flags = 0

filter.default_flags int

Drapeau par défaut à appliquer lorsque le filtre par défaut est défini. La valeur par défaut est FILTER_FLAG_NO_ENCODE_QUOTES pour des raisons de compatibilité. Voir la liste des drapeaux pour connaître les noms des drapeaux.

User Contributed Notes

warbaby67 at gmail dot com 14-Dec-2010 10:04
filter.default sets the default FILTER by name.
filter.default_flags sets default FLAGS for the default filter.

The values for filter.default should be a string "name" of a valid FILTER:

"int"      FILTER_VALIDATE_INT
"boolean"  FILTER_VALIDATE_BOOLEAN

The irony of the entire list I typed being blocked by the SPAM filter is not lost on me.  Perhaps I'm not the first.


Types de filtres

Sommaire

  • Filtres de validation
  • Filtres de nettoyage
  • Autres filtres
  • Drapeaux des filtres

User Contributed Notes

There are no user contributed notes for this page.


Filtres de validation

Liste des filtre de validation
ID | Nom | Options | Drapeaux | Description
FILTER_VALIDATE_BOOLEAN | "boolean" | default | FILTER_NULL_ON_FAILURE | Retourne true pour "1", "true", "on" et "yes". Retourne false sinon. Si FILTER_NULL_ON_FAILURE est active, false n'est retourné que pour les valeurs "0", "false", "off", "no", "", et null est retourné pour les valeurs non-booléennes.
FILTER_VALIDATE_DOMAIN | "validate_domain" | default | FILTER_FLAG_HOSTNAME | Valide si les longueurs d'étiquettes de nom de domaine sont valides. Valide les noms de domaine par rapport aux RFC 1034, RFC 1035, RFC 952, RFC 1123, RFC 2732, RFC 2181 et RFC 1123. L'indicateur facultatif FILTER_FLAG_HOSTNAME ajoute la capacité de valider spécifiquement les noms d'hôte (ils doivent commencer par un caractère alphanumériques et contenir uniquement des caractères alphanumériques ou des traits d'union).
FILTER_VALIDATE_EMAIL | "validate_email" | default | FILTER_FLAG_EMAIL_UNICODE | Valide une adresse de courriel. En général, ceci valide l'adresse de courriel selon la syntaxe défini par la RFC 822, à l'exception des commentaires, du remplissage par des espaces et les noms de domaine sans point qui ne sont pas pris en charge.
FILTER_VALIDATE_FLOAT | "float" | default, decimal, min_range, max_range | FILTER_FLAG_ALLOW_THOUSAND | Valide un nombre décimal, optionellement dans l'intervalle fourni, et le converti en nombre décimal en cas de succès.
FILTER_VALIDATE_INT | "int" | default, min_range, max_range | FILTER_FLAG_ALLOW_OCTAL, FILTER_FLAG_ALLOW_HEX | Valide un entier, éventuellement dans un intervalle donné et le converti en entier en cas de succès.
FILTER_VALIDATE_IP | "validate_ip" | default | FILTER_FLAG_IPV4, FILTER_FLAG_IPV6, FILTER_FLAG_NO_PRIV_RANGE, FILTER_FLAG_NO_RES_RANGE | Valide une adresse IP, éventuellement IPv4 ou IPv6, éventuellement hors des plages privées ou réservées.
FILTER_VALIDATE_MAC | "validate_mac_address" | default |  | Valide la valeur comme une adresse MAC.
FILTER_VALIDATE_REGEXP | "validate_regexp" | default, regexp |  | Valide une valeur avec une expression rationnelle regexp, compatible Perl.
FILTER_VALIDATE_URL | "validate_url" | default | FILTER_FLAG_SCHEME_REQUIRED, FILTER_FLAG_HOST_REQUIRED, FILTER_FLAG_PATH_REQUIRED, FILTER_FLAG_QUERY_REQUIRED | Valide une URL (selon » http://www.faqs.org/rfcs/rfc2396), éventuellement avec des composants requis. Attention, une URL valide peut ne pas spécifier le protocole HTTP http://, aussi, des validations ultérieures supplémentaires seront requises pour déterminer si l'URL utilise un protocole attendu, i.e. ssh:// ou mailto:. Cette fonction ne trouvera que des URLs ASCII valides, les domaines internationnalisés (contenant des caractères non-ASCII) ne fonctionneront pas.

Note:

Depuis PHP 5.4.11, les nombres +0 et -0 sont validés comme des entiers, mais aussi comme des nombres à virgule flottante (en utilisant les constantes FILTER_VALIDATE_FLOAT et FILTER_VALIDATE_INT). Avant PHP 5.4.11, ils n'étaient validés que comme des nombres à virgule flottante (en utilisant la constante FILTER_VALIDATE_FLOAT).

Lorsque le paramètre default est défini comme option, la valeur passée est utilisée si la valeur n'est pas validée.

Historique

Version | Description
7.4.0 | Ajout des options min_range et max_range pour FILTER_VALIDATE_FLOAT.
7.0.0 | Ajout de FILTER_FLAG_HOSTNAME et FILTER_VALIDATE_DOMAIN.
5.5.0 | Ajout de FILTER_VALIDATE_MAC.
5.2.1 | FILTER_VALIDATE_URL utilise maintenant implicitement FILTER_FLAG_SCHEME_REQUIRED et FILTER_FLAG_HOST_REQUIRED.

User Contributed Notes

andrew dot purkett at gmail dot com 13-May-2020 05:20
Please note that the FILTER_FLAG_NO_PRIV_RANGE flag does not exclude IPv4 private addresses in the IPv6 namespace, such as ::ffff:169.254.169.254.
carlosv775 at gmail dot com 05-May-2020 07:47
Looks like FILTER_VALIDATE_DOMAIN isn't available on PHP < 7:

https://3v4l.org/eOPLM
MR Yekta 02-Apr-2020 10:17
since php 7.4
you can use these 3 beautiful conditions for from validation for validation less, great or in range

<?php
/**
 * less_than_equal_to
 */
$x = 50;
if (filter_var($x, FILTER_VALIDATE_FLOAT, ["options" => ["max_range" => 100]]) !== false) {
    echo "result : $x is less than OR equal to 100";
} else {
    echo "result : $x is NOT less than OR equal to 100";
}
?>
result : 50 is less than OR equal to 100

<?php
/**
 * greater_than_equal_to
 */
$x = 50;
if (filter_var($x, FILTER_VALIDATE_FLOAT, ["options" => ["min_range" => 100]]) !== false) {
    echo "result : $x is greater than OR equal to 100";
} else {
    echo "result : $x is NOT greater than OR equal to 100";
}
?>
result : 50 is NOT greater than OR equal to 100

<?php
/**
 * less_than_equal_to && greater_than_equal_to
 */
$x = 50;
if (filter_var($x, FILTER_VALIDATE_FLOAT, ["options" => ["min_range" => 0 , "max_range"=> 100]]) !== false) {
    echo "result : $x is in range of 0 to 100";
} else {
    echo "result : $x in NOT range of 0 to 100";
}
?>
result : 50 is in range of 0 to 100
Vee W. 12-Aug-2019 10:09
`FILTER_FLAG_EMAIL_UNICODE` was added in PHP 7.1
gee2711 at googlemail dot com 30-Jan-2018 06:36
FILTER_FLAG_QUERY_REQUIRED is failing URLs that are encoded e.g.

http://example.com/page.php?q=growing+big

Fails whilst

http://example.com/page.php?q=big

So anything more than one word encoded fails.

Tested on PHP version 7.1
luca at accomazzi dot net 04-May-2017 02:47
A word to the wise regarding floats.

$t = '312041.25 &euro; instead of 896.70 &euro;';
echo filter_var ($t, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);

will return
312041.25896.70
which is likely not what you were expecting. In 2007 someone suggested it's not acceptable (see https://bugs.php.net/bug.php?id=40156&edit=2) but it was flagged "not a bug" because these kind of filters are only supposed to filter out illegal characters.
Of course if you were to use FILTER_VALIDATE_FLOAT it would just return that the input is not valid.
kizge 30-Jun-2016 08:18
FILTER_VALIDATE_INT first casts its value to string which produces unexpected result for bool and float (https://bugs.php.net/bug.php?id=72490):

<?php

// Prints int(1).
var_dump(filter_var(true, FILTER_VALIDATE_INT));

// ...but this prints bool(false).
var_dump(filter_var(false, FILTER_VALIDATE_INT));

// --------

// Prints bool(false).
var_dump(filter_var(1.1, FILTER_VALIDATE_INT));

// ...but this prints int(0).
var_dump(filter_var(0.0, FILTER_VALIDATE_INT));

// ...but this again is bool(false).
var_dump(filter_var('0.0', FILTER_VALIDATE_INT));

// Also bool(false).
var_dump(filter_var('-0.0', FILTER_VALIDATE_INT));

?>

Live sample: https://3v4l.org/CZW0W

The docs are not clear on how exactly this casting affects the result for certain input values.
sebastian dot piskorski at gmail dot com 05-Jan-2016 12:48
FILTER_VALIDATE_EMAIL not only doesn't support whitespace folding and comments. It only checks Addr-spec part of email address. Otherwise it should mark such address as valid: 'Test Example <test@example.com>' because it is valid according to RFC 822.

Also address "test@localhost" should be valid. Which is mentioned in another note.

You can test it with this code:
<?php

$emails = array(
    'Test Example <test@example.com>',
    'test@localhost',
    'test@localhost.com'
);

foreach ($emails as $email) {
    echo (filter_var($email, FILTER_VALIDATE_EMAIL)) ?
        "[+] Email '$email' is valid\n" :
        "[-] Email '$email' is NOT valid\n";
}
?>

Output for PHP 5.3.21 - 7.0.1 :
[-] Email 'Test Example <test@example.com>' is NOT valid
[-] Email 'test@localhost' is NOT valid
[+] Email 'test@localhost.com' is valid
rsnell at usgs dot gov 25-Nov-2015 05:18
Note that if using FILTER_NULL_ON_FAILURE as a flag with the FILTER_VALIDATE_BOOLEAN id then NULL is no longer returned if the variable name is not set in the external variable array. It will instead return FALSE. In the description is says that when using the FILTER_NULL_ON_FAILURE flag that ' FALSE is returned only for "0", "false", "off", "no", and ""' an makes no mention of this additional state that can also return false. The behavior is mentioned on the filter_input documentation page under Return Values but that is not overly helpful if one is just looking here.

If FILTER_NULL_ON_FAILURE is not used then NULL is returned when the variable name is not set in the external variable array, TRUE is returned for "1", "true", "on" and "yes" and FALSE is returned for everything else.
Lech 05-Sep-2015 08:41
The description for FILTER_VALIDATE_URL seems incorrect/misleading. "Beware a valid URL may not specify the HTTP protocol" implies a valid URL cannot specify the HTTP protocol. I think "Beware a valid URL need not specify..." would be better.
Wrinkled Cheese 09-Jun-2015 03:33
When validating a URL, as documented, the protocol is not validated.  However, it is required to be present.

For example:

I don't expect a protocol to be present.  To validate expected input I have to add a "protocol" as a prefix, and return true or false, and further validate the input.

$r = filter_var(''this.doesnt.matter.so.why.is.it.required://'.$host, FILTER_VALIDATE_URL);
return ($r != '' && $r !== false) ? true : false;
Darth Killer 02-Jun-2015 08:54
Contrary to what documentation implies, the FILTER_NULL_ON_FAILURE seem to affect any validation filter, not just FILTER_VALIDATE_BOOLEAN. I've been using that since PHP 5.2, and as of PHP 5.6.8 it still works. I have no clue if it's a blug or if it is as intended, in which case the documentation needs to be fixed.

When the flag is used on a validation filter other than FILTER_VALIDATE_BOOLEAN, as expected the filter will return NULL instead of FALSE upon failure. This is quite useful when filtering a POST form with filter_input_array(), where you don't want to check what field is invalid and what field is missing. Just check if NULL is among the returned elements and you're done.

<?php
$definition = array(
   'login' => array(
      'filter' => FILTER_VALIDATE_STRING,
      'flags' => FILTER_NULL_ON_FAILURE
   ),
   'pwd' => FILTER_UNSAFE_RAW
);
$form_data = filter_input_array(INPUT_POST, $definition);
if(in_array(null, $form_data, true)) {
   // invalid form
} else {
   // valid form, let's proceed
}
?>

Of course, if you want more precise error messages that approach won't work. But it's still good to know, i believe.
Luuk 25-May-2015 10:23
@2:
$value = " 0 ";
$filtered = filter_var($value, FILTER_VALIDATE_INT);
if($filtered || $filtered === 0)
{
    // validated as an int
}

I think next code is better:

$value = "0";
if(filter_var($value, FILTER_VALIDATE_INT) !== false)
{
  .....
Anonymous 22-May-2015 08:02
FILTER_VALIDATE_FLOAT, decimal option mean decimal notation['.', ','].
maruerru at gmail dot com 26-Mar-2015 11:09
Often I see some code like the following:
$value = "12";
if( filter_var($value, FILTER_VALIDATE_INT) )
{
    // validated as an int
}

The above works as intended, except when $value is "0". In the above case it will be interpreted as FALSE.

For the correct behavior,  you have not only to check if it is equal (==) to false, but also identic (===) to FALSE:
$value = " 0 ";
if( filter_var($value, FILTER_VALIDATE_INT)  === FALSE )
{
    // validated as an int
}

I hope, I could help.
bryanwayb at gmail dot com 22-Mar-2015 04:18
It's good to remember that using filter_var is primarily for filtering input values when doing boolean logic comparisons. Take the following:

$value = "12";
if(filter_var($value, FILTER_VALIDATE_INT))
{
    // validated as an int
}

The above works as intended, except when $value = "0". In which case filter_var returns a 0, aka false when used as a boolean.

For the correct behavior, do a zero check.

$value = " 0 ";
$filtered = filter_var($value, FILTER_VALIDATE_INT);
if($filtered || $filtered === 0)
{
    // validated as an int
}
Bastien 24-Sep-2013 08:05
Rejection of so-called partial domains because of "missing" dot is not following section 2.3.5 of RFC 5321.

It says FQDNs are permitted, and com, org, or va are (well, may be) valids FQDNs. It depends on DNS, not on syntax.

Some TDLs (although few of them) have MX RRs, the for example "abuse@va" is correct.
rowan dot collins at gmail dot com 17-Mar-2013 08:22
Regarding "partial" addresses with no . in the domain part, a comment in the source code (in ext/filter/logical_filters.c) justifies this rejection thus:

     * The regex below is based on a regex by Michael Rushton.
     * However, it is not identical.  I changed it to only consider routeable
     * addresses as valid.  Michael's regex considers a@b a valid address
     * which conflicts with section 2.3.5 of RFC 5321 which states that:
     *
     *   Only resolvable, fully-qualified domain names (FQDNs) are permitted
     *   when domain names are used in SMTP.  In other words, names that can
     *   be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed
     *   in Section 5) are permitted, as are CNAME RRs whose targets can be
     *   resolved, in turn, to MX or address RRs.  Local nicknames or
     *   unqualified names MUST NOT be used.
boy at relaxnow dot nl 19-Oct-2012 02:06
FILTER_VALIDATE_URL does not work with URNs, examples of valid URIs according to RFC3986 and if they are accepted by FILTER_VALIDATE_URL:

[PASS] ftp://ftp.is.co.za.example.org/rfc/rfc1808.txt
[PASS] gopher://spinaltap.micro.umn.example.edu/00/Weather/California/Los%20Angeles
[PASS] http://www.math.uio.no.example.net/faq/compression-faq/part1.html
[PASS] mailto:mduerst@ifi.unizh.example.gov
[PASS] news:comp.infosystems.www.servers.unix
[PASS] telnet://melvyl.ucop.example.edu/
[PASS] http://www.ietf.org/rfc/rfc2396.txt
[PASS] ldap://[2001:db8::7]/c=GB?objectClass?one
[PASS] mailto:John.Doe@example.com
[PASS] news:comp.infosystems.www.servers.unix
[FAIL] tel:+1-816-555-1212
[PASS] telnet://192.0.2.16:80/
[FAIL] urn:oasis:names:specification:docbook:dtd:xml:4.1.2
bee kay two at em ee dot com 06-May-2012 04:45
Notably missing is a way to validate text entry as printable,
printable multiline,
or printable and safe (tag free)

FILTER_VALIDATE_TEXT, which validates no special characters
perhaps with FILTER_FLAG_ALLOW_NEWLINE
and FILTER_FLAG_NOTAG to disallow tag starters
php at sethsyberg dot com 07-Apr-2011 01:00
When validating floats, you must use the Identical/Not identical operators for proper validation of zeros:

This will not work as expected:
<?php
$x = 0;
if (!filter_var($x, FILTER_VALIDATE_FLOAT)) {
    echo "$x is a valid float";
} else {
    echo "$x is NOT a valid float";
}
?>

This will work as expected:
<?php
$x = 0;
if (filter_var($x, FILTER_VALIDATE_FLOAT)!== false) {
    echo "$x is a valid float";
} else {
    echo "$x is NOT a valid float";
}
?>
php dot net at piskvor dot org 11-Feb-2011 08:57
FILTER_VALIDATE_EMAIL is discarding valid e-mail addresses containing IDN. Since there are real, live IDNs on the Internet, that means the filtered output is too strict, leading to false negatives.

Punycode-encoded IDN addresses pass the filter correctly; so before checking for validity, it is necessary to convert the e-mail address to punycode.
Clifton 05-Jan-2011 08:00
FILTER_VALIDATE_EMAIL does NOT allow incomplete e-mail addresses to be validated as mentioned by Tomas.

Using the following code:

<?php
$email = "clifton@example"; //Note the .com missing
echo "PHP Version: ".phpversion().'<br>';
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
    echo $email.'<br>';
    var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
}else{
    var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
}
?>

Returns:
PHP Version: 5.2.14 //On MY server, may be different depending on which version you have installed.
bool(false)

While the following code:

<?php
$email = "clifton@example.com"; //Note the .com added
echo "PHP Version: ".phpversion().'<br>';
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
    echo $email.'<br>';
    var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
}else{
    var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));
}
?>

Returns:
PHP Version: 5.2.14 //On MY server, may be different depending on which version you have installed.
clifton@example.com
string(16) "clifton@example.com"

This feature is only available for PHP Versions (PHP 5 >= 5.2.0) according to documentation. So make sure your version is correct.

Cheers,
Clifton


Filtres de nettoyage

Liste des filtres de nettoyage
ID | Nom | Flags | Description
FILTER_SANITIZE_EMAIL | "email" |  | Supprime tous les caractères sauf les lettres, chiffres, et !#$%&'*+-=?^_`{|}~@.[].
FILTER_SANITIZE_ENCODED | "encoded" | FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_STRIP_BACKTICK, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH | Applique l'encodage URL, et supprime ou encode les caractères spéciaux.
FILTER_SANITIZE_MAGIC_QUOTES | "magic_quotes" |  | Applique addslashes().
FILTER_SANITIZE_NUMBER_FLOAT | "number_float" | FILTER_FLAG_ALLOW_FRACTION, FILTER_FLAG_ALLOW_THOUSAND, FILTER_FLAG_ALLOW_SCIENTIFIC | Supprime tous les caractères, sauf les chiffres, +- et éventuellement .,eE.
FILTER_SANITIZE_NUMBER_INT | "number_int" |  | Supprime tous les caractères sauf les chiffres, et les signes plus et moins.
FILTER_SANITIZE_SPECIAL_CHARS | "special_chars" | FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_STRIP_BACKTICK, FILTER_FLAG_ENCODE_HIGH | Transforme en entité HTML les caractères '"<>& et les caractères ASCII de valeur inférieur à 32, et supprime ou encode les autres caractères spéciaux.
FILTER_SANITIZE_FULL_SPECIAL_CHARS | "full_special_chars" | FILTER_FLAG_NO_ENCODE_QUOTES, | Équivaut à appeler la fonction htmlspecialchars() avec le jeu ENT_QUOTES. L'encodage des guillemets peut être désactivé en utilisant la constante FILTER_FLAG_NO_ENCODE_QUOTES. Comme la fonction htmlspecialchars(), ce filtre tient compte du default_charset et si une séquence d'octets est détectée contenant un caractère invalide dans le jeu de caractères courant, alors la chaîne entière sera rejetée et une chaîne vide sera retournée.
FILTER_SANITIZE_STRING | "string" | FILTER_FLAG_NO_ENCODE_QUOTES, FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_STRIP_BACKTICK, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH, FILTER_FLAG_ENCODE_AMP | Supprime les balises, et supprime ou encode les caractères spéciaux.
FILTER_SANITIZE_STRIPPED | "stripped" |  | Alias du filtre "string".
FILTER_SANITIZE_URL | "url" |  | Supprime tous les caractères sauf les lettres, chiffres et $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=.
FILTER_UNSAFE_RAW | "unsafe_raw" | FILTER_FLAG_STRIP_LOW, FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_STRIP_BACKTICK, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_ENCODE_HIGH, FILTER_FLAG_ENCODE_AMP | Ne fait rien, supprime ou encode les caractères spéciaux. Ce filtre est aussi un alias pour FILTER_DEFAULT.

Avertissement

Lorsque vous utilisez ces filtres comme filtres par défaut, le drapeau par défaut est réglé sur FILTER_FLAG_NO_ENCODE_QUOTES. Vous devez mettre filter.default_flags à 0 explicitement pour que les quotes soient encodées par défaut. Comme ceci:

Exemple #1 Configurer le filtre par défaut pour agir comme htmlspecialchars

filter.default = full_special_chars
filter.default_flags = 0

Historique

Version | Description
5.2.11/5.3.1 | Les slashes (/) sont supprimés par FILTER_SANITIZE_EMAIL. Avant cette version, ils ne l'étaient pas.

User Contributed Notes

ipse at sergiosantos dot me 02-Dec-2020 04:49
Although it's specifically mentioned in the above documentation, because many seem to find this unintuitive it's worth pointing out that FILTER_SANITIZE_NUMBER_FLOAT will remove the decimal character unless you specify FILTER_FLAG_ALLOW_FRACTION:

<?php
$number_string = '12.34';

echo filter_var( $number_string, FILTER_SANITIZE_NUMBER_FLOAT ); // 1234

echo filter_var( $number_string, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ); // 12.34
?>
Anonymous 20-Jul-2020 05:29
<?php
 /*
     filter all ascii and save juste 0-9 a-Z and @ . _
*/

echo alphanum('abcdefghABCDEFGH0123456789/!:;@._');
// return abcdefghABCDEFGH0123456789@._

function alphanum( $string , $x=''){
        $h=strlen($string);
        for($a=0; $a<$h; $a++) {
            $i = ord($string[$a]);
            if(
                ($i==46) || // .
                ($i==64) || // @
                ($i==95) || // _
                ($i > 47 && $i < 58) || //0123456789
                ($i > 64 && $i < 91) || //ABCDEFGH..Z
                ($i > 96 && $i < 123)   //abcdefgh..z
             ) { $x .= $string[$a]; }
        }
        return $x;
    }

?>
Rodrigo Guariento 13-Feb-2020 11:55
To get ONLY numbers from a string use this code:
    echo preg_replace('/[^0-9]/', '', '123456-789');
anonymous 31-Jan-2020 12:55
In the "FILTER_SANITIZE_URL" section where it says, "Remove all characters except letters, digits and $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=." is there a reason why there is a double backslash (\\)? Shouldn't there only be one backslash if it's saying that backslashes are allowed?
darren at daz-web dot com 12-Nov-2018 12:31
For those looking for a simple way around filtering POST forms that have textarea elements in them. If you also need tab for example you can extend quite easily.

<?php
//create an array of all relevant textareas
$textareas = array("ta1");

foreach($_POST as $k => $v)
    {
        $v = trim($v);//so we are sure it is whitespace free at both ends

        //preserve newline for textarea answers
        if(in_array($k,$textareas))$v=str_replace("\n","[NEWLINE]",$v);

        //sanitise string
        $v = filter_var($v, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK);

        //now replace the placeholder with the original newline
        $_POST[$k] = str_replace("[NEWLINE]","\n",$v);
    }

//simple form for testing submital

?><!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Filter test</title>
</head>

<body>

<form action="" method="post">
    <p>
        <textarea name="ta1" cols="30" rows="10"><?php echo $_POST['ta1']; ?></textarea>
    </p>
    <p>
        <input type="text" name="txt1" size="30" value="<?php echo $_POST['txt1']; ?>" />
    </p>
    <p>
        <input type="submit" />
    </p>
    </form>

</body>

</html>
AntonioPrimera 04-Aug-2016 01:12
Please be aware that when using filter_var() with FILTER_SANITIZE_NUMBER_FLOAT and FILTER_SANITIZE_NUMBER_INT the result will be a string, even if the input value is actually a float or an int.

Use FILTER_VALIDATE_FLOAT and FILTER_VALIDATE_INT, which will convert the result to the expected type.
Ruth 03-Jun-2016 02:59
This is an example for a form having a group of checkboxes besides a lot of other inputs:

$args = array(
    'details' => array(
        'name' => 'details[]',
        'filter' => FILTER_SANITIZE_STRING,
        'flags'  => FILTER_REQUIRE_ARRAY
    )
    // ,
    // a lot of other stuff here (all the form’s elements)
);
$myInputs = filter_input_array( INPUT_GET, $args, true );

where the checkboxes are (their form is in a page that reloads itself):

<label>
    <input type="checkbox" name="details[]" value=“A” <?php if (in_array( “A”, $myInputs['details'] )) { echo 'checked'; } ?>>
    Show A
</label>
<label>
    <input type="checkbox" name="details[]" value=“B” <?php if (in_array( “B”, $myInputs['details'] )) { echo 'checked'; } ?>>
    Show B
</label>
<label>
    <input type="checkbox" name="details[]" value=“C” <?php if (in_array( “C”, $myInputs['details'] )) { echo 'checked'; } ?>>
    Show C
</label>
<label>
    <input type="checkbox" name="details[]" value=“D” <?php if (in_array( “D”, $myInputs['details'] )) { echo 'checked'; } ?>>
    Show D
</label>
Willscrlt 10-Mar-2016 10:11
To include multiple flags, simply separate the flags with vertical pipe symbols.

For example, if you want to use filter_var() to sanitize $string with FILTER_SANITIZE_STRING and pass in FILTER_FLAG_STRIP_HIGH and FILTER_FLAG_STRIP_LOW, just call it like this:

$string = filter_var($string, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW);

The same goes for passing a flags field in an options array in the case of using callbacks.

$var = filter_var($string, FILTER_SANITIZE_SPECIAL_CHARS,
array('flags' => FILTER_FLAG_STRIP_LOW | FILTER_FLAG_ENCODE_HIGH));

Thanks to the Brain Goo blog at popmartian.com/tipsntricks/for this info.
Anonymous 22-Oct-2015 03:56
FILTER_SANITIZE_STRING doesn't behavior the same as strip_tags function.    strip_tags allows less than symbol inferred from context, FILTER_SANITIZE_STRING strips regardless.
<?php
$smaller = "not a tag < 5";
echo strip_tags($smaller);    // -> not a tag < 5
echo filter_var ( $smaller, FILTER_SANITIZE_STRING); // -> not a tag
?>
david dot drakulovski at gmail dot com 25-Feb-2014 07:54
Here is a simpler and a better presented ASCII list for the <32 or 127> filters
(if wikipedia confused the hell out of you):

http://www.danshort.com/ASCIImap/
galvao at galvao dot eti dot br 02-Mar-2013 06:04
Just to clarify, since this may be unknown for a lot of people:

ASCII characters above 127 are known as "Extended" and they represent characters such as greek letters and accented letters in latin alphabets, used in languages such as pt_BR.

A good ASCII quick reference (aside from the already mentioned Wikipedia article) can be found at: http://www.asciicodes.com/
Anonymous 15-Feb-2013 07:42
Support for FILTER_SANITIZE_FULL_SPECIAL_CHARS was added from version 5.3.3
googlybash24 at aol dot com 19-Sep-2012 05:39
Remember to trim() the $_POST before your filters are applied:

<?php

// We trim the $_POST data before any spaces get encoded to "%20"

// Trim array values using this function "trim_value"
function trim_value(&$value)
{
    $value = trim($value);    // this removes whitespace and related characters from the beginning and end of the string
}
array_filter($_POST, 'trim_value');    // the data in $_POST is trimmed

$postfilter =    // set up the filters to be used with the trimmed post array
    array(
            'user_tasks'                        =>    array('filter' => FILTER_SANITIZE_STRING, 'flags' => !FILTER_FLAG_STRIP_LOW),    // removes tags. formatting code is encoded -- add nl2br() when displaying
            'username'                            =>    array('filter' => FILTER_SANITIZE_ENCODED, 'flags' => FILTER_FLAG_STRIP_LOW),    // we are using this in the url
            'mod_title'                            =>    array('filter' => FILTER_SANITIZE_ENCODED, 'flags' => FILTER_FLAG_STRIP_LOW),    // we are using this in the url
        );

$revised_post_array = filter_var_array($_POST, $postfilter);    // must be referenced via a variable which is now an array that takes the place of $_POST[]
echo (nl2br($revised_post_array['user_tasks']));    //-- use nl2br() upon output like so, for the ['user_tasks'] array value so that the newlines are formatted, since this is our HTML <textarea> field and we want to maintain newlines
?>
googlybash24 at aol dot com 13-Sep-2012 08:39
This should help with most simple "textarea" fields in post forms.

Removing user html tags while maintaining text formatting such as newlines and carriage returns involves using the FILTER_SANITIZE_STRING filter ID with the flag !FILTER_FLAG_STRIP_LOW. The formatting text (the low ASCII values under decimal 32) are encoded because of the included FILTER_FLAG_ENCODE_LOW flag, but you are now preventing these from being removed. When you want to display the value on the page back in its intended format, use nl2br() so the encoded newlines are formatted properly on the page.

This example cleans $_POST data from a textarea field with the name "user_tasks" on a previous html form, stripping tags but maintaining formatting (at least for newlines):

<?php
$postfilter =
    array(
            'user_tasks'    =>    array('filter' => FILTER_SANITIZE_STRING, 'flags' => !FILTER_FLAG_STRIP_LOW),    // removes tags. formatting code is encoded -- add nl2br() when displaying
        );

$revised_post_array = filter_input_array(INPUT_POST, $postfilter);    // must be referenced via a variable which is now an array that takes the place of $_POST[]
echo (nl2br($revised_post_array['user_tasks']));    // here we use nl2br() for the displayed value, for the ['user_tasks'] array value so that the newlines are formatted
?>
adellemfrank at hotmail dot com 09-Jul-2012 07:07
A good list of which ASCII characters are < 32 and > 127 can be found at: http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters
scamber256 at hotmail dot de 06-Aug-2011 02:37
Just a hint I tested,

You can obtain all the chars <32 (so newline and c.return), by using not operator > !FILTER_FLAG_STRIP_LOW as the last argument.

Example:
filter_input(INPUT_GET,'test',FILTER_SANITIZE_STRING,!FILTER_FLAG_STRIP_LOW);

The filter keeps working as before removing anything else as before apart from FILTER_FLAG_STRIP_LOW.
Just filter those "bad" chars <32 manually you don't want.
Dmitry Snytkine 11-Apr-2011 04:17
Beware that FILTER_FLAG_STRIP_LOW strips NEWLINE and TAG and CARRIAGE RETURN chars. If you have a form that accepts user input in plaintext format, all the submitted text will lose all the line breaks, making it appear all on one line. This basically renders this filter useless for parsing user-submitted text, even in plain text.
marcus at synchromedia dot co dot uk 27-Nov-2009 01:07
It's not entirely clear what the LOW and HIGH ranges are. LOW is characters below 32, HIGH is those above 127, i.e. outside the ASCII range.

<?php
$a = "\tcafé\n";
//This will remove the tab and the line break
echo filter_var($a, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
//This will remove the é.
echo filter_var($a, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
?>


Autres filtres

Liste de filtres divers
ID | Nom | Options | Flags | Description
FILTER_CALLBACK | "callback" | Fonction ou méthode de rappel (type callable) | Tous les drapeaux sont ignorés | Appelle une fonction utilisateur pour filtrer les données.

User Contributed Notes

shaman_master at list dot ru 20-Jun-2020 04:46
NOTE: dont wrap PHP function in closure as writed in "top" comment
<?php
$str = filter_input(INPUT_GET, 'str', FILTER_CALLBACK, ['options' => 'trim']);
?>
commonpike 24-Sep-2018 09:56
Some useful custom filters:

<?php

    function sanitizeOptions($array,$default) {
        return function($value = null) use ($array,$default) {
            if (in_array($value, $array)) return $value;
            return $default;
        };
    }

    function sanitizeKey($value) {
        return strtolower(preg_replace('/[^a-zA-Z0-9-_\.]/','', $value));
    }

    /*usage */

    filter_var($format, FILTER_CALLBACK, array(
           "options" => sanitizeOptions(['html','json','blob'],'json')
        ));

    filter_var($format,FILTER_CALLBACK, array(
           "options" =>  'sanitizeKey'
        ));

?>
johnk at riceball dot com 18-Feb-2018 03:12
Here's how to create callable functions with parameters.  These are functions that return closures.  When you call them, you supply the known parameters, and it returns a function that will accept the value from filter_input() or filter_input_array().

<?php

function filter_sanitize_int_range_generator($low, $high) {
        return function($value = null) use ($low, $high) {
                $v = intval($value);
                if ($v < $low) return false;
                if ($v > $high) return false;
                return $v;
        };
}

function filter_sanitize_string_in_array_generator($array) {
        return function($value = null) use ($array) {
                if (!is_string($value)) return false;
                if (in_array($value, $array)) return $value;
                return false;
        };
}

echo "TESTING RANGE\n";
$fun = filter_sanitize_int_range_generator(1,10);
var_dump($fun(5)); // 5
var_dump((filter_sanitize_int_range_generator(1,10))(0)); // false
var_dump((filter_sanitize_int_range_generator(1,10))(1)); // 1
var_dump((filter_sanitize_int_range_generator(1,10))(10)); // 10
var_dump((filter_sanitize_int_range_generator(1,10))(11)); // false
var_dump($fun()); // false

echo "TESTING IN ARRAY\n";
$fun = filter_sanitize_string_in_array_generator(['cat','dog','bird']);
var_dump($fun('cat')); // cat
var_dump($fun('dog')); // dog
var_dump($fun('bird')); // bird
var_dump($fun('fish')); // false
var_dump($fun()); // false

// use it like this
filter_input(INPUT_GET, 'month', FILTER_CALLBACK, array( "callable" => filter_sanitize_int_range_generator(1,12) ) );
Vufi 28-Jan-2016 07:50
Are you also struggling with how to send arguments into the FILTER_CALLBACK.

Lets say you like to have a collection of custom filters that you can use in filter_var, filter_var_array and so on, but you want be able to call the new filters with different arguments, as you can in filter_var.

The easiest way to do this is to make a new class with all your custom filters. Then construct the class with your arguments inside filter_var argument array and enter the method in your class you like to run after.

If you send the argument as an array it is easy to make default values. But you can pass as many arguments you want and in any type, with this solution.

Example:
<?php
/**
 * Class CustomFilters
 * Custom filters for filter_var, filter_var_array, filter_input, filter_input_array
 */
class CustomFilters {
    private $options = array();

    public function __construct(array $options=array()){
        $this->options = $options;
    }

    /**
     * Returns the default options merged with the construction options
     * @param array $defaults
     * @return array
     */
    private function get_options(array $defaults){
        return array_merge($defaults, $this->options);
    }

    /**
     * Checks if a value is in a range
     * @param mixed $val Value provided by filter_var
     * @return mixed
     */
    public function FILTER_STEP_RANGE($val){
        $options = $this->get_options(
            // default options
            array(
                "min_range" => 1,
                "max_range" => 10,
                "step"      => 1,
                "default"   => null,    // Value to return on fail
                "strict"    => false,   // Check value for correct type
                "cast"      => false    // Cast the value in a certain type
            )
        );

        if(in_array( $val, range($options["min_range"], $options["max_range"], $options["step"]), $options["strict"])){

            // Return default if the value cant be cast as the right type
            if( $options["cast"] && !settype($val, $options["cast"])) {
                return $options["default"];
            }

            return $val;
        }else{
            return $options["default"];
        }
    }

    /**
     * Checks if a value is in array
     * @param mixed $val Value provided by filter_var
     * @return mixed
     */
    public function FILTER_ENUM($val){
        $options = $this->get_options(
        // default options
            array(
                "values"  => array(),
                "strict"    => false, // Value to return on fail
                "default"   => null,  // Check value for correct type
                "cast"      => false  // Cast the value in a certain type
            )
        );

        if(in_array($val, $options["values"], $options["strict"])){

            // Return default if the value cant be cast as the right type
            if( $options["cast"] && !settype($val, $options["cast"])){
                return $options["default"];
            }

            return $val;
        }else{
            return $options["default"];
        }
    }
}

$data = array(
    "range1" => "200",
    "range2" => 25,
    "enum" => "yes"
);

$args = array(
    "range1" => array(
        "filter" => FILTER_CALLBACK,
        "options" => array(
            new CustomFilters(array( "min_range" => 10, "max_range" => 600, "step" => 10, "default" => 120,
                "cast" => "integer")),
            'FILTER_STEP_RANGE'
            )
        ),

    "range2" => array(
        "filter" => FILTER_CALLBACK,
        "options" => array(
            new CustomFilters(array( "min_range" => 0, "max_range" => 1, "step" => .1, "default" => .5,
                "cast" => "float")),
            'FILTER_STEP_RANGE'
        )
    ),
    "enum" => array(
        "filter" => FILTER_CALLBACK,
        "options" => array(
            new CustomFilters(array( "values" => array("yes", "no", "Yes","No"), "cast" => "string")),
            'FILTER_ENUM'
        )
    )
);

var_dump( filter_var_array($data, $args) );
?>

Returns:
array(3) {
  ["range1"] => int(200)
  ["range2"] => float(0.5)
  ["enum"] => string(3) "yes"
}
christof at himalayasystemsNOSPAM dot be 11-Aug-2015 10:47
The supplied callback function may also be a class method. (since 5.4.0 ?)
To use a method you need to set the options param to an array with two values: the first is the object and the second is the method name.

<?php
/**
 * @property-read $language
 */
class GetInputStore {
    private $allowed_languages = array('en', 'fr', 'de', 'nl' /*, ... */);
    private $language;

    public function __construct(){
        $this->language = filter_input(INPUT_GET, 'language', FILTER_CALLBACK, array('options' => array($this, 'get_language_code')));
    }

    public function __get($name){
         switch($name){
             case 'language' : return $this->language;
             default : throw new Exception("The GetInputStore class doesn't support GET param \"$name\"");
         }
    }

    private function get_language_code($code){
        if(in_array($code, $this->allowed_languages)){
            return $code;
        } else {
            return 'en';
        }
    }
}
?>
thatindividual dot zhang at gmail dot com 23-Sep-2014 07:05
Here is an example, since I cannot find one through out php.net"

<?php

/**
 * Strip whitespace (or other non-printable characters) from the beginning and end of a string
 * @param string $value
 */
function trimString($value)
{
    return trim($value);
}

$loginname = filter_input(INPUT_POST, 'loginname', FILTER_CALLBACK, array('options' => 'trimString'));


Drapeaux des filtres

Liste de drapeaux de filtres
ID | Utilisé avec | Description
FILTER_FLAG_STRIP_LOW | FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_UNSAFE_RAW | Supprime les caractères dont la valeur numérique est <32.
FILTER_FLAG_STRIP_HIGH | FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_UNSAFE_RAW | Supprime les caractères dont la valeur numérique est >127.
FILTER_FLAG_STRIP_BACKTICK | FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_UNSAFE_RAW | Supprime les caractères "accent grave".
FILTER_FLAG_ALLOW_FRACTION | FILTER_SANITIZE_NUMBER_FLOAT | Autorise un point (.) comme séparateur fractionnaire pour les nombres.
FILTER_FLAG_ALLOW_THOUSAND | FILTER_SANITIZE_NUMBER_FLOAT, FILTER_VALIDATE_FLOAT | Autorise une virgule (,) comme séparateur fractionnaire pour les nombres.
FILTER_FLAG_ALLOW_SCIENTIFIC | FILTER_SANITIZE_NUMBER_FLOAT | Autorise un e ou un E pour la notation scientifique dans les nombres.
FILTER_FLAG_NO_ENCODE_QUOTES | FILTER_SANITIZE_STRING | Si ce drapeau est présent, les simples quotes (') et les doubles (") ne seront pas encodées.
FILTER_FLAG_ENCODE_LOW | FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_STRING, FILTER_SANITIZE_RAW | Encode tous les caractères dont la valeur numérique est <32.
FILTER_FLAG_ENCODE_HIGH | FILTER_SANITIZE_ENCODED, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_SANITIZE_STRING, FILTER_SANITIZE_RAW | Encode tous les caractères dont la valeur numérique est >127.
FILTER_FLAG_ENCODE_AMP | FILTER_SANITIZE_STRING, FILTER_SANITIZE_RAW | Encode les &.
FILTER_NULL_ON_FAILURE | FILTER_VALIDATE_BOOLEAN | Retourne null pour les valeurs booléennes non reconnues.
FILTER_FLAG_ALLOW_OCTAL | FILTER_VALIDATE_INT | Prend en compte les nombres octals précédés d'un zéro (0). Ceci ne fonctionne que pour les chiffres 0-7.
FILTER_FLAG_ALLOW_HEX | FILTER_VALIDATE_INT | Prend en compte les nombres héxadécimaux précédés de 0x ou 0X. Ceci ne fonctionne que pour a-fA-F0-9.
FILTER_FLAG_EMAIL_UNICODE | FILTER_VALIDATE_EMAIL | Permet à la partie locale de l'adresse électronique de contenir des caractères Unicode.
FILTER_FLAG_IPV4 | FILTER_VALIDATE_IP | Autorise une adresse IP au format IPv4.
FILTER_FLAG_IPV6 | FILTER_VALIDATE_IP | Autorise une adresse IP au format IPv6.
FILTER_FLAG_NO_PRIV_RANGE | FILTER_VALIDATE_IP | Echoue la validation pour les intervales privés IPv4: 10.0.0.0/8, 172.16.0.0/12 et 192.168.0.0/16. Echoue la validation pour les adresses IPv6 commençant par FD ou FC.
FILTER_FLAG_NO_RES_RANGE | FILTER_VALIDATE_IP | Echoue la validation pour les intervales IPv4 réservés : 0.0.0.0/8, 169.254.0.0/16, 127.0.0.0/8 et 240.0.0.0/4. Ce drapeau ne concerne pas les adresses IPv6. Echoue la validation pour les intervales IPv6 réservés : ::1/128, ::/128, ::ffff:0:0/96 and fe80::/10.
FILTER_FLAG_SCHEME_REQUIRED | FILTER_VALIDATE_URL | Requière de l'URL qu'elle contienne une partie schéma.
FILTER_FLAG_HOST_REQUIRED | FILTER_VALIDATE_URL | Requière de l'URL qu'elle contienne une partie hôte.
FILTER_FLAG_PATH_REQUIRED | FILTER_VALIDATE_URL | Oblige URL à contenir un chemin.
FILTER_FLAG_QUERY_REQUIRED | FILTER_VALIDATE_URL | Oblige URL à contenir une chaine de requête.
FILTER_REQUIRE_SCALAR |  | Oblige la valeur à être un scalaire.
FILTER_REQUIRE_ARRAY |  | Oblige la valeur à être un tableau.
FILTER_FORCE_ARRAY |  | Si la valeur est un scalaire, elle sera traitée comme un tableau avec les valeurs scalaires comme seul élément.

Historique

Version | Description
7.3.0 | L'usage explicite de FILTER_FLAG_SCHEME_REQUIRED et FILTER_FLAG_HOST_REQUIRED ont été déprécié.
7.1.0 | FILTER_FLAG_EMAIL_UNICODE a été ajouté.
5.3.2 | FILTER_FLAG_STRIP_BACKTICK a été ajouté.
5.2.10 | FILTER_FLAG_NO_RES_RANGE prend également en charge les adresses IPv6.

User Contributed Notes

shaman_master at list dot ru 18-Jun-2020 04:01
Missing constant of default flag: FILTER_FLAG_NONE


Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

INPUT_POST (entier)
variables POST.
INPUT_GET (entier)
variables GET.
INPUT_COOKIE (entier)
variables COOKIE.
INPUT_ENV (entier)
variables ENV.
INPUT_SERVER (entier)
variables SERVER.
INPUT_SESSION (entier)
variables SESSION. (pas encore implémenté)
INPUT_REQUEST (entier)
variables REQUEST. (pas encore implémenté)
FILTER_FLAG_NONE (entier)
Aucun drapeau.
FILTER_REQUIRE_SCALAR (entier)
Drapeau utilisé pour requérir un scalaire en entrée.
FILTER_REQUIRE_ARRAY (entier)
Requière un tableau en entrée.
FILTER_FORCE_ARRAY (entier)
Retourne toujours un tableau.
FILTER_NULL_ON_FAILURE (entier)
Utilisation de null au lieu de false si une erreur survient.
FILTER_VALIDATE_INT (entier)
ID du filtre "int".
FILTER_VALIDATE_BOOLEAN (entier)
ID du filtre "boolean".
FILTER_VALIDATE_FLOAT (entier)
ID du filtre "float".
FILTER_VALIDATE_REGEXP (entier)
ID du filtre "validate_regexp".
FILTER_VALIDATE_URL (entier)
ID du filtre "validate_url".
FILTER_VALIDATE_DOMAIN (int)
ID du filtre "validate_domain". (Disponible depuis PHP 7.0.0)
FILTER_VALIDATE_EMAIL (entier)
ID du filtre "validate_email".
FILTER_VALIDATE_IP (entier)
ID du filtre "validate_ip".
FILTER_VALIDATE_MAC (int)
ID du filtre "validate_mac_address". (Disponible depuis PHP 5.5.0)
FILTER_DEFAULT (entier)
ID du filtre par défaut ("unsafe_raw"). Ceci est équivalent à la constante FILTER_UNSAFE_RAW.
FILTER_UNSAFE_RAW (entier)
ID du filtre "unsafe_raw".
FILTER_SANITIZE_STRING (entier)
ID du filtre "string".
FILTER_SANITIZE_STRIPPED (entier)
ID du filtre "stripped".
FILTER_SANITIZE_ENCODED (entier)
ID du filtre "encoded".
FILTER_SANITIZE_SPECIAL_CHARS (entier)
ID du filtre "special_chars".
FILTER_SANITIZE_EMAIL (entier)
ID du filtre "email".
FILTER_SANITIZE_URL (entier)
ID du filtre "url".
FILTER_SANITIZE_NUMBER_INT (entier)
ID du filtre "number_int".
FILTER_SANITIZE_NUMBER_FLOAT (entier)
ID du filtre "number_float".
FILTER_SANITIZE_MAGIC_QUOTES (entier)
ID du filtre "magic_quotes". (Obsolète depuis PHP 7.3.0, utilisez plutôt FILTER_SANITIZE_ADD_SLASHES.)
FILTER_SANITIZE_ADD_SLASHES (int)
ID du filtre "add_slashes". (Disponible depuis PHP 7.3.0)
FILTER_CALLBACK (entier)
ID du filtre de rappel.
FILTER_FLAG_ALLOW_OCTAL (entier)
Alloue une notation octale (0[0-7]+) dans le filtre "int".
FILTER_FLAG_ALLOW_HEX (entier)
Alloue une notation hexadécimale (0x[0-9a-fA-F]+) dans le filtre "int".
FILTER_FLAG_STRIP_LOW (entier)
Supprime les caractères dont les valeurs ASCII sont inférieures à 32.
FILTER_FLAG_STRIP_HIGH (entier)
Supprime les caractères dont les valeurs ASCII sont supérieures à 127.
FILTER_FLAG_STRIP_BACKTICK (int)
Supprime les accents grâves. (Disponible depuis PHP 5.3.2)
FILTER_FLAG_ENCODE_LOW (entier)
Encode les caractères dont les valeurs ASCII sont inférieures à 32.
FILTER_FLAG_ENCODE_HIGH (entier)
Encode les caractères dont les valeurs ASCII sont supérieures à 127.
FILTER_FLAG_ENCODE_AMP (entier)
Encode &.
FILTER_FLAG_NO_ENCODE_QUOTES (entier)
N'encode pas ', ni ".
FILTER_FLAG_EMPTY_STRING_NULL (entier)
(Non utilisé actuellement.)
FILTER_FLAG_ALLOW_FRACTION (entier)
Alloue une partie fractionnelle dans le filtre "number_float".
FILTER_FLAG_ALLOW_THOUSAND (entier)
Alloue le séparateur des milliers (,) dans le filtre "number_float".
FILTER_FLAG_ALLOW_SCIENTIFIC (entier)
Alloue une notation scientifique (e, E) dans le filtre "number_float".
FILTER_FLAG_PATH_REQUIRED (entier)
Chemin requis dans le filtre "validate_url".
FILTER_FLAG_QUERY_REQUIRED (entier)
Requête requise dans le filtre "validate_url".
FILTER_FLAG_SCHEME_REQUIRED (int)
Requière un schéma dans le filtre "validate_url". (Obsolète depuis PHP 7.3 car déjà présent dans le filtre)
FILTER_FLAG_HOST_REQUIRED (int)
Requière un hôte dans le filtre "validate_url". (Obsolète depuis PHP 7.3 car déjà présent dans le filtre)
FILTER_FLAG_HOSTNAME (int)
Demande à ce que les noms d'hôtes commencent avec un caractère alphanumérique et contiennent que les caractères alphanumériques ou des traits d'union (Disponible depuis PHP 7.0.0)
FILTER_FLAG_IPV4 (entier)
N'autorise que les adresses IPv4 dans le filtre "validate_ip".
FILTER_FLAG_IPV6 (entier)
N'autorise que les adresses IPv6 dans le filtre "validate_ip".
FILTER_FLAG_NO_RES_RANGE (entier)
N'autorise pas les adresses réservées dans le filtre "validate_ip".
FILTER_FLAG_NO_PRIV_RANGE (entier)
N'autorise pas les adresses privées dans le filtre "validate_ip".
FILTER_FLAG_EMAIL_UNICODE (int)
Accepte des caractères Unicode dans la partie locale du filtre "validate_email". (Disponible depuis PHP 7.1.0)

User Contributed Notes

jcastromail at yahoo dot es 07-Jan-2021 06:46
INPUT_REQUEST was implemented in PHP < 8 (it was equal to 99) but it was removed in PHP 8.0

While INPUT_SESSION,FILTER_SANITIZE_MAGIC_QUOTES,FILTER_FLAG_SCHEME_REQUIRED,FILTER_FLAG_HOST_REQUIRED and a few others were removed in PHP 8.0.
shaman_master at list dot ru 17-Jun-2020 11:48
Note: FILTER_NULL_ON_FAILURE, FILTER_REQUIRE_SCALAR, FILTER_REQUIRE_ARRAY and FILTER_FORCE_ARRAY dont have prefix "FILTER_FLAG_" but they are FLAGS!
sixd at php dot net 23-Dec-2010 10:37
Rasmus added FILTER_SANITIZE_FULL_SPECIAL_CHARS to PHP 5.3.3.  See
http://svn.php.net/viewvc/php/php-src/branches/PHP_5_3/
ext/filter/filter.c?r1=297245&r2=297244&pathrev=297245
His earlier commit to the PHP source code trunk commented that this "Added the full htmlspecialchars() functionality which includes utf-8 validation as a default filter."


Exemples

Sommaire

  • Validation
  • Nettoyage

User Contributed Notes

There are no user contributed notes for this page.


Validation

Exemple #1 Validation d'adresses email avec filter_var()

<?php
$email_a = 'joe@example.com';
$email_b = 'bogus';

if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) {
    echo "L'adresse email '$email_a' est considérée comme valide.";
}
if (filter_var($email_b, FILTER_VALIDATE_EMAIL)) {
    echo "L'adresse email '$email_b' est considérée comme valide.";
} else {
    echo "L'adresse email '$email_b' est considérée comme invalide.";
}
?>

L'exemple ci-dessus va afficher :

L'adresse email 'joe@example.com' est considérée comme valide.
L'adresse email 'bogus' est considérée comme invalide.

Exemple #2 Validation d'adresses IP avec filter_var()

<?php
$ip_a = '127.0.0.1';
$ip_b = '42.42';

if (filter_var($ip_a, FILTER_VALIDATE_IP)) {
    echo "L'adresse IP '$ip_a' est considérée comme valide.";
}
if (filter_var($ip_b, FILTER_VALIDATE_IP)) {
    echo "L'adresse IP '$ip_b' est considérée comme valide.";
}
?>

L'exemple ci-dessus va afficher :

L'adresse IP '127.0.0.1' est considérée comme valide.

Exemple #3 Passage d'options à la fonction filter_var()

<?php
$int_a = '1';
$int_b = '-1';
$int_c = '4';
$options = array(
    'options' => array(
        'min_range' => 0,
        'max_range' => 3,
    )
);
if (filter_var($int_a, FILTER_VALIDATE_INT, $options) !== FALSE) {
    echo "L'entier A 'int_a' est considéré comme valide (entre 0 et 3).\n";
}
if (filter_var($int_b, FILTER_VALIDATE_INT, $options) !== FALSE) {
    echo "L'entier B 'int_b' est considéré comme valide (entre 0 et 3).\n";
}
if (filter_var($int_c, FILTER_VALIDATE_INT, $options) !== FALSE) {
    echo "L'entier C 'int_c' est considéré comme valide (entre 0 et 3).\n";
}

$options['options']['default'] = 1;
if (($int_c = filter_var($int_c, FILTER_VALIDATE_INT, $options)) !== FALSE) {
    echo "L'entier C 'int_c' est considéré comme valide (entre 0 et 3).";
}
?>

L'exemple ci-dessus va afficher :

L'entier A '1' est considéré comme valide (entre 0 et 3).
L'entier C '1' est considéré comme valide (entre 0 et 3).

User Contributed Notes

dows 04-May-2018 08:26
It considers umlauts-domains as invalid.

test@täst.de -> false
täst@test.de -> false
Anonymous 21-Nov-2017 07:34
the problem listed before with the e-mail address: gnix@lineone.netsteve.gynes@lane4.co.uk being flagged as valid seems to not be a problem anymore, at least not on 5.6.30


Nettoyage

Exemple #1 Nettoyage et validation d'adresses email

<?php
$a = 'joe@example.org';
$b = 'bogus - at - example dot org';
$c = '(bogus@example.org)';

$sanitized_a = filter_var($a, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_a, FILTER_VALIDATE_EMAIL)) {
    echo "Cette (a) adresse email nettoyée est considérée comme valide.";
}

$sanitized_b = filter_var($b, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_b, FILTER_VALIDATE_EMAIL)) {
    echo "Cette (b) adresse email nettoyée est considérée comme valide.";
} else {
    echo "Cette (b) adresse email nettoyée est considérée comme invalide.";
}

$sanitized_c = filter_var($c, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_c, FILTER_VALIDATE_EMAIL)) {
    echo "Cette (c) adresse email nettoyée est considérée comme valide.";
    echo "Avant : $c\n";
    echo "Après :  $sanitized_c\n";
}
?>

L'exemple ci-dessus va afficher :

Cette (a) adresse email nettoyée est considérée comme valide.
Cette (b) adresse email nettoyée est considérée comme invalide.
Cette (c) adresse email nettoyée est considérée comme valide.
Avant : (bogus@example.org)
Après :  bogus@example.org

Exemple #2 Configurer le filtre par défaut

filter.default = full_special_chars
filter.default_flags = 0

User Contributed Notes

Chris 14-Apr-2015 07:42
While it may seem to be good practice to set the defaults in php.ini you should not assume that the end users server has the same settings as your server. Because of this you should not presume that default filtering will work out of the box for the end user.

You should ensure that all filters are declared at the site of use regardless of your own default settings. A move to a new host even for your own personal application may break due to different settings.
zeeshan dot karamat dot abbas at gmail dot com 05-Feb-2015 01:59
If we omit using a filter then PHP by default puts a filter which is FILTER_DEFAULT which will use default filter. Now the question is what is a default filter. A default filter is unsafe_raw which will allow the unsafe raw data passed on to the server. This value is available in php.ini file. It is suggested that a developer should update this value inside php.ini file as under:
filter.default = full_special_chars
filter.default_flags = 0

Whereas in php.ini file above values are by default, set as under:
;filter.default = unsafe_raw
;filter.default_flags =

Above semicolons are commented out lines so surely one needs to remove those semicolons to apply the changes made. If we do not do above things then what will happen. In that case PHP will use default filter which would surely be FILTER_UNSAFE_RAW and one can see that unsafe raw data can then be passed onto server which can make the life a hacker easier.


Filter Fonctions

Sommaire

  • filter_has_var — Vérifie si une variable d'un type spécifique existe
  • filter_id — Retourne l'identifiant d'un filtre nommé
  • filter_input_array — Récupère plusieurs valeurs externes et les filtre
  • filter_input — Récupère une variable externe et la filtre
  • filter_list — Retourne une liste de tous les filtres supportés
  • filter_var_array — Récupère plusieurs variables et les filtre
  • filter_var — Filtre une variable avec un filtre spécifique

User Contributed Notes

fumble1 at web dot de 12-Aug-2007 10:54
I recommend you to use the FILTER_REQUIRE_SCALAR (or FILTER_REQUIRE_ARRAY) flags, since you can use array-brackets both to access string offsets and array-element -- however, not only this can lead to unexpected behaviour. Look at this example:

<?php
$image = basename(filter_input(INPUT_GET, 'src', FILTER_UNSAFE_RAW, FILTER_FLAG_STRIP_LOW));
// further checks
?>

/script.php?src[0]=foobar will cause a warning. :-(
Hence my recommendation:

<?php
$image = basename(filter_input(INPUT_GET, 'src', FILTER_UNSAFE_RAW, FILTER_REQUIRE_SCALAR | FILTER_FLAG_STRIP_LOW));
// further checks
?>
Richard Davey rich at corephp dot co dot uk 13-Jun-2007 11:15
There is an undocumented filter flag for FILTER_VALIDATE_BOOLEAN. The documentation implies that it will return NULL if the value doesn't match the allowed true/false values. However this doesn't happen unless you give it the FILTER_NULL_ON_FAILURE flag like this:

<?php
$value = 'car';
$result = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
?>

In the above $result will equal NULL. Without the extra flag it would equal FALSE, which isn't usually a desired result for this specific filter.
ckroll at rightmedia dot com 08-May-2007 08:02
Beware, the FILTER_SANITIZE_STRING flag functions much like strip_tags, so < will get filtered from input regardless of it's actually part of a tag.  We were getting unexepected results with a graphic library we wrote when trying to print < on a dynamic button.  The url came in something like ?string=%3C (<) but after filter ran it was empty.  To get around this, you could use FILTER_UNSAFE_RAW on that one param.
user 02-Feb-2007 12:15
Below is some code using filter API to restrict access to LAN by IPv4 private address range.

These notes may save someone else a little time:

filter_input_array() is useless for running multiple filters on the same key.
No way to chain or negate filters.

<?php

/* Merciful comment! */
function FILTER_NEGATE_HACK($_){ return (bool)!$_; }

function client_is_private_ipv4(){
  return (filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) &&
            FILTER_NEGATE_HACK(filter_input(INPUT_SERVER, 'REMOTE_ADDR', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE));
}

if (! client_is_private_ipv4())
  exit('This application is restricted to local network users');

?>
vojtech at x dot cz 21-Dec-2006 06:38
Also notice that filter functions are using only the original variable values passed to the script even if you change the value in super global variable ($_GET, $_POST, ...) later in the script.

<?php
echo filter_input(INPUT_GET, 'var'); // print 'something'
echo $_GET['var']; // print 'something'
$_GET['var'] = 'changed';
echo filter_input(INPUT_GET, 'var'); // print 'something'
echo $_GET['var']; // print 'changed'
?>

In fact, external data are duplicated in SAPI before the script is processed and filter functions don't use super globals anymore (as explained in Filter tutorial bellow, section 'How does it work?').
vojtech at x dot cz 21-Dec-2006 05:13
Just to note that "server and env support may not work in all sapi, for filter 0.11.0 or php 5.2.0" as mentioned in Filter tutorial bellow.

The workaround is obvious:
Instead of
<?php
$var = filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_DEFAULT);
?>
use
<?php
$var = filter_var(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : NULL, FILTER_DEFAULT);
?>


Vérifie si une variable d'un type spécifique existe

  • « Filter Fonctions
  • filter_id »
  • PHP Manual
  • Filter Fonctions
  • Vérifie si une variable d'un type spécifique existe

filter_has_var

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_has_var — Vérifie si une variable d'un type spécifique existe

Description

filter_has_var ( int $input_type , string $var_name ) : bool

Liste de paramètres

input_type

Une constante parmi INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER ou INPUT_ENV.

var_name

Nom de la variable à vérifier.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

User Contributed Notes

dezlov 30-Jul-2015 01:12
For people who are wondering whether "magic_quotes_gpc" has any affect on "filter_input" operation, here is an extract from a PHP source file:

* As the input filter acts on input data before the magic quotes function mangles data, all access through the filter() function will not have any quotes or slashes added - it will be the pure data as send by the browser.

So when using this function, there is no need to strip the slashes when "magic_quotes_gpc" is enabled.
nanhe dot kumar at gmail dot com 06-Mar-2013 02:15
Through this example i think you can better understand

    if ( !filter_has_var(INPUT_GET, 'email') ) {
        echo "Email Not Found";
    }else{
        echo "Email Found";
    }
    Output

    localhost/nanhe/test.php?email=1 //Email Found
    localhost/nanhe/test.php?email //Email Found
    http://localhost/nanhe/test.php //Email Not Found

Consider on second example

http://localhost/nanhe/test.php
$_GET['email']="info@nanhe.in";
if ( !filter_has_var(INPUT_GET, 'email') ) {
        echo "Email Not Found";
    }else{
        echo "Email Found";
    }
But output will be Email Not Found
drm at melp dot nl 16-Jan-2009 01:54
Please note that the function does not check the live array, it actually checks the content received by php:

<?php
$_GET['test'] = 1;
echo filter_has_var(INPUT_GET, 'test') ? 'Yes' : 'No';
?>

would say "No", unless the parameter was actually in the querystring.

Also, if the input var is empty, it will say Yes.


Retourne l'identifiant d'un filtre nommé

  • « filter_has_var
  • filter_input_array »
  • PHP Manual
  • Filter Fonctions
  • Retourne l'identifiant d'un filtre nommé

filter_id

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_id — Retourne l'identifiant d'un filtre nommé

Description

filter_id ( string $name ) : int|false

Liste de paramètres

name

Nom du filtre à récupérer.

Valeurs de retour

Identifiant du filtre en cas de succès, ou false si le filtre n'existe pas.

Voir aussi

  • filter_list() - Retourne une liste de tous les filtres supportés

User Contributed Notes

w0n4b3 at gmail dot com 23-Jun-2011 02:47
[To get a list of filters and their IDs:]

<?php
$filters = filter_list();
foreach($filters as $filter_name) {
    echo $filter_name .": ".filter_id($filter_name) ."<br>";
}
?>
Will result in:
boolean: 258
float: 259
validate_regexp: 272
validate_url: 273
validate_email: 274
validate_ip: 275
string: 513
stripped: 513
encoded: 514
special_chars: 515
unsafe_raw: 516
email: 517
url: 518
number_int: 519
number_float: 520
magic_quotes: 521
callback: 1024


Récupère plusieurs valeurs externes et les filtre

  • « filter_id
  • filter_input »
  • PHP Manual
  • Filter Fonctions
  • Récupère plusieurs valeurs externes et les filtre

filter_input_array

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_input_array — Récupère plusieurs valeurs externes et les filtre

Description

filter_input_array ( int $type , array|int $options = FILTER_DEFAULT , bool $add_empty = true ) : array|false|null

Cette fonction est utile pour récupérer plusieurs valeurs sans avoir à appeler plusieurs fois la fonction filter_input().

Liste de paramètres

type

Une constante parmi INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER ou INPUT_ENV.

options

Un tableau définissant les arguments. Une clé valide est une chaîne de caractères contenant le nom de la variable et une valeur valide est soit le type d'un filtre, soit un tableau spécifiant le filtre, les drapeaux et les options. Si la valeur est un tableau, les clés valides sont filter qui spécifie le type du filtre, flags qui spécifie tous les drapeaux à appliquer au filtre, et options qui spécifie toutes les options à appliquer au filtre. Voir l'exemple ci-dessous pour une meilleure compréhension.

Ce paramètre peut également être un entier contenant une constante de filtre. Ensuite, toutes les valeurs du tableau d'entrée seront filtrées par ce filtre.

add_empty

Ajout des clés manquantes à la valeur null dans la valeur retournée.

Valeurs de retour

Un tableau contenant les valeurs des variables demandées en cas de succès. Si le tableau d'entrée désigné par type n'est pas populé, la fonction retourne null si le drapeau FILTER_NULL_ON_FAILURE n'est pas donnée, sinon false dans le cas contraire. Pour les autres échecs, false est retourné.

Un tableau de valeurs peut valoir false si le filtre échoue, ou null si la variable n'est pas définie. Ou, si le drapeau FILTER_NULL_ON_FAILURE est utilisé, la fonction retournera false si la variable n'est pas définie et null si le filtre échoue. Si le paramètre add_empty est false, aucun élément du tableau sera ajouté pour les variables non définie.

Exemples

Exemple #1 Exemple avec filter_input_array()

<?php
error_reporting(E_ALL | E_STRICT);
/* les données arrivent depuis POST
$_POST = array(
    'product_id' => 'libgd<script>',
    'component'  => array('10'),
    'version'    => '2.0.33',
    'testarray'  => array('2', '23', '10', '12'),
    'testscalar' => '2',
);
*/

$args = array(
    'product_id'   => FILTER_SANITIZE_ENCODED,
    'component'    => array('filter'    => FILTER_VALIDATE_INT,
                            'flags'     => FILTER_REQUIRE_ARRAY,
                            'options'   => array('min_range' => 1, 'max_range' => 10)
                           ),
    'version'      => FILTER_SANITIZE_ENCODED,
    'doesnotexist' => FILTER_VALIDATE_INT,
    'testscalar'   => array(
                            'filter' => FILTER_VALIDATE_INT,
                            'flags'  => FILTER_REQUIRE_SCALAR,
                           ),
    'testarray'    => array(
                            'filter' => FILTER_VALIDATE_INT,
                            'flags'  => FILTER_REQUIRE_ARRAY,
                           )

);

$myinputs = filter_input_array(INPUT_POST, $args);

var_dump($myinputs);
echo "\n";
?>

L'exemple ci-dessus va afficher :

array(6) {
  ["product_id"]=>
  string(17) "libgd%3Cscript%3E"
  ["component"]=>
  array(1) {
    [0]=>
    int(10)
  }
  ["version"]=>
  string(6) "2.0.33"
  ["doesnotexist"]=>
  NULL
  ["testscalar"]=>
  int(2)
  ["testarray"]=>
  array(4) {
    [0]=>
    int(2)
    [1]=>
    int(23)
    [2]=>
    int(10)
    [3]=>
    int(12)
  }
}

Notes

Note:

Il n'y a pas de clé REQUEST_TIME dans le tableau INPUT_SERVER car elle est insérée dans la variable $_SERVER plus tard.

Voir aussi

  • filter_input() - Récupère une variable externe et la filtre
  • filter_var_array() - Récupère plusieurs variables et les filtre
  • Types de filtres

User Contributed Notes

sdupuis at blax dot ca 21-Jan-2014 09:36
Note that although you can provide a default filter for the entire input array there is no way to provide a flag for that filter without building the entire definition array yourself.

So here is a small function that can alleviate this hassle!

<?php
function filter_input_array_with_default_flags($type, $filter, $flags, $add_empty = true) {
    $loopThrough = array();
    switch ($type) {
        case INPUT_GET : $loopThrough = $_GET; break;
        case INPUT_POST : $loopThrough = $_POST; break;
        case INPUT_COOKIE : $loopThrough = $_COOKIE; break;
        case INPUT_SERVER : $loopThrough = $_SERVER; break;
        case INPUT_ENV : $loopThrough = $_ENV; break;
    }

    $args = array();
    foreach ($loopThrough as $key=>$value) {
        $args[$key] = array('filter'=>$filter, 'flags'=>$flags);
    }

    return filter_input_array($type, $args, $add_empty);
}
?>
CertaiN 10-Jan-2014 04:40
[New Version]

Example Usage:
<?php
$_GET['A']['a'] = '  CORRECT(including some spaces)    ';
$_GET['A']['b'] = '  CORRECT(including some spaces)    ';
$_GET['A']['c'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['A']['d']['invalid_structure'] = 'INVALID';

$_GET['B']['a'] = '  CORRECT(including some spaces)    ';
$_GET['B']['b'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['B']['c']['invalid_structure'] = 'INVALID';
$_GET['B']["Invalid UTF-8 sequence: \xe3\xe3\xe3"] = 'INVALID';

$_GET['C']['a'] = '  CORRECT(including some spaces)    ';
$_GET['C']['b'] = "Invalid UTF-8 sequence: \xe3\xe3\xe3";
$_GET['C']['c']['invalid_structure'] = 'INVALID';
$_GET['C']["Invalid UTF-8 sequence: \xe3\xe3\xe3"] = 'INVALID';

$_GET['unneeded_item'] = 'UNNEEDED';

var_dump(filter_struct_utf8(INPUT_GET, array(
    'A' => array(
        'a' => '',
        'b' => FILTER_STRUCT_TRIM,
        'c' => '',
        'd' => '',
    ),
    'B' => FILTER_STRUCT_FORCE_ARRAY,
    'C' => FILTER_STRUCT_FORCE_ARRAY | FILTER_STRUCT_TRIM,
)));
?>

Example Result:
array(3) {
  ["A"]=>
  array(4) {
    ["a"]=>
    string(36) "  CORRECT(including some spaces)    "
    ["b"]=>
    string(30) "CORRECT(including some spaces)"
    ["c"]=>
    string(0) ""
    ["d"]=>
    string(0) ""
  }
  ["B"]=>
  array(3) {
    ["a"]=>
    string(36) "  CORRECT(including some spaces)    "
    ["b"]=>
    string(0) ""
    ["c"]=>
    string(0) ""
  }
  ["C"]=>
  array(3) {
    ["a"]=>
    string(30) "CORRECT(including some spaces)"
    ["b"]=>
    string(0) ""
    ["c"]=>
    string(0) ""
  }
}
CertaiN 10-Jan-2014 04:39
[New Version]
This function is very useful for filtering complicated array structure.
Also, Some integer bitmasks and invalid UTF-8 sequence detection are available.

Code:
<?php
/**
 * @param  integer $type    Constant like INPUT_XXX.
 * @param  array   $default Default structure of the specified super global var.
 *                          Following bitmasks are available:
 *  + FILTER_STRUCT_FORCE_ARRAY - Force 1 dimensional array.
 *  + FILTER_STRUCT_TRIM        - Trim by ASCII control chars.
 *  + FILTER_STRUCT_FULL_TRIM   - Trim by ASCII control chars,
 *                                full-width and no-break space.
 * @return array            The value of the filtered super global var.
 */
define('FILTER_STRUCT_FORCE_ARRAY', 1);
define('FILTER_STRUCT_TRIM', 2);
define('FILTER_STRUCT_FULL_TRIM', 4);
function filter_struct_utf8($type, array $default) {
    static $func = __FUNCTION__;
    static $trim = "[\\x0-\x20\x7f]";
    static $ftrim = "[\\x0-\x20\x7f\xc2\xa0\xe3\x80\x80]";
    static $recursive_static = false;
    if (!$recursive = $recursive_static) {
        $types = array(
            INPUT_GET => $_GET,
            INPUT_POST => $_POST,
            INPUT_COOKIE => $_COOKIE,
            INPUT_REQUEST => $_REQUEST,
        );
        if (!isset($types[(int)$type])) {
            throw new LogicException('unknown super global var type');
        }
        $var = $types[(int)$type];
        $recursive_static = true;
    } else {
        $var = $type;
    }
    $ret = array();
    foreach ($default as $key => $value) {
        if ($is_int = is_int($value)) {
            if (!($value | (
                FILTER_STRUCT_FORCE_ARRAY |
                FILTER_STRUCT_FULL_TRIM |
                FILTER_STRUCT_TRIM
            ))) {
                $recursive_static = false;
                throw new LogicException('unknown bitmask');
            }
            if ($value & FILTER_STRUCT_FORCE_ARRAY) {
                $tmp = array();
                if (isset($var[$key])) {
                    foreach ((array)$var[$key] as $k => $v) {
                        if (!preg_match('//u', $k)){
                            continue;
                        }
                        $value &= FILTER_STRUCT_FULL_TRIM | FILTER_STRUCT_TRIM;
                        $tmp += array($k => $value ? $value : '');
                    }
                }
                $value = $tmp;
            }
        }
        if ($isset = isset($var[$key]) and is_array($value)) {
            $ret[$key] = $func($var[$key], $value);
        } elseif (!$isset || is_array($var[$key])) {
            $ret[$key] = null;
        } elseif ($is_int && $value & FILTER_STRUCT_FULL_TRIM) {
            $ret[$key] = preg_replace("/\A{$ftrim}++|{$ftrim}++\z/u", '', $var[$key]);
        } elseif ($is_int && $value & FILTER_STRUCT_TRIM) {
            $ret[$key] = preg_replace("/\A{$trim}++|{$trim}++\z/u", '', $var[$key]);
        } else {
            $ret[$key] = preg_replace('//u', '', $var[$key]);
        }
        if ($ret[$key] === null) {
            $ret[$key] = $is_int ? '' : $value;
        }
    }
    if (!$recursive) {
        $recursive_static = false;
    }
    return $ret;
}
?>
CertaiN 29-Jul-2013 10:22
This function is very useful for filtering complicated array structure.

Code:
<?php
function filter_request($var, $default_structure) {

    $ret = array();

    foreach ($default_structure as $key => $value) {
        if (!isset($var[$key])) {
            $ret[$key] = $value;
        } elseif (is_array($value)) {
            $ret[$key] = filter_request($var[$key], $value);
        } elseif (is_array($var[$key])) {
            $ret[$key] = $value;
        } else {
            $ret[$key] = $var[$key];
        }
    }

    return $ret;

}
?>

Sample Usage:
<?php
$_GET['a']['wrong_structure'] = 'foo';
$_GET['b']['c'] = 'CORRECT';
$_GET['b']['d']['wrong_structure'] = 'bar';
$_GET['unneeded_item'] = 'baz';

var_dump(filter_request($_GET, array(
    'a' => 'DEFAULT',
    'b' => array(
        'c' => 'DEFAULT',
        'd' => 'DEFAULT',
    ),
)));
?>

Sample Result:
array(2) {
  ["a"]=>
  string(21) "DEFAULT"
  ["b"]=>
  array(2) {
    ["c"]=>
    string(12) "CORRECT"
    ["d"]=>
    string(21) "DEFAULT"
  }
}
Anonymous 22-Apr-2010 12:12
Beware: if none of the arguments is set, this function returns NULL, not an array of NULL values.

/* No POST vars set in request
$_POST = array();
*/

$args = array('some_post_var' => FILTER_VALIDATE_INT);
$myinputs = filter_input_array(INPUT_POST, $args);
var_dump($myinputs);

Expected Output: array(1) { ["some_post_var"]=> NULL }

Actual Output: NULL
ville at N0SPAM dot zydo dot com 13-Mar-2010 03:18
While filtering input arrays, be careful of what flags you set besides FILTER_REQUIRE_ARRAY. For example, setting the flags like so:

<?php
$filter = array(
'myInputArr' => array('filter' => FILTER_SANITIZE_STRING,
                      'flags' => array('FILTER_FLAG_STRIP_LOW', 'FILTER_REQUIRE_ARRAY'))
);

$form_inputs = filter_input_array(INPUT_POST, $filter);
?>

.. will result in a blank $form_inputs['myInputArr'] regardless of what $_POST['myInputArr'] contains.
kibblewhite at live dot com 26-Jan-2009 07:35
If you are trying to handling multiple form inputs with same name, then you must assign the `'flags'  => FILTER_REQUIRE_ARRAY` to the definitions entry.

Example, you have a html form as such:
<form>
 <input name="t1[]" value="Some string One" />
 <input name="t1[]" value="Another String Two" />
</form>

Your definitions array will look a little like this:
$args = array(
  't1'    => array(
      'name' => 't1',
      'filter' => FILTER_SANITIZE_STRING,
      'flags'  => FILTER_REQUIRE_ARRAY)
);
kdeloach at gmail dot com 12-Aug-2008 12:42
@iam4webwork

This is not specific to filter_input.  If you have an element in HTML called names[], it can be accessed by calling $_POST['names'].
Kevin 08-Jul-2008 06:37
Looks like filter_input_array isn't aware of changes to the input arrays that were made before calling filter_input_array. Instead, it always looks at the originally submitted input arrays.

So this will not work:

$_POST['my_float_field'] = str_replace(',','.',$_POST['my_float_field']);
$args = array('my_float_field',FILTER_VALIDATE_FLOAT);
$result = filter_input_array(INPUT_POST, $args);
phpnotes dot 20 dot zsh at spamgourmet dot com 10-Sep-2007 10:32
The above example will actually output "NULL" because of the undefined variable doesnotexist - see http://bugs.php.net/bug.php?id=42608.
Sinured 22-Aug-2007 10:10
extract() is a very convenient way of copying all those variables to the local scope. (see http://www.php.net/extract)
iam4webwork at NOSPAM dot hotmail dot com 08-Jun-2007 01:02
The above example raises other questions such as how one would validate an html array.  In the input form each input tag that refers to an html array would be named for example testarray[].  However, after the form is submitted, the syntax for validating the values is different from  the expected $_POST['testarray[]']. Instead one has to drop the braces and validate as follows, assuming that testarray[] is supposed to be an html array of numerical values:

Valid test:

echo '*';
echo filter_input(
INPUT_POST,
'testarray',
FILTER_VALIDATE_INT,
FILTER_REQUIRE_ARRAY
);
echo '*';

But the following is an invalid test that results in 2 consequtive asterisks only!

echo '*';
echo filter_input(INPUT_POST,
'testarray[]',
FILTER_VALIDATE_INT,
FILTER_REQUIRE_ARRAY
);
echo '*';

So, there is a naming inconsistency going on, as after the form is submitted, one has to forget about the original name of the submitted array by dropping its braces. Maybe when the PECL/Filter extension is reviewed again, the great ones might consider making the syntax a little more forgiving.


Récupère une variable externe et la filtre

  • « filter_input_array
  • filter_list »
  • PHP Manual
  • Filter Fonctions
  • Récupère une variable externe et la filtre

filter_input

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_input — Récupère une variable externe et la filtre

Description

filter_input ( int $type , string $var_name , int $filter = FILTER_DEFAULT , array|int $options = 0 ) : mixed

Liste de paramètres

type

Une constante parmi INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER ou INPUT_ENV.

var_name

Nom de la variable à récupérer.

filter

L'ID du filtre à appliquer. La Types de filtres page du manuel liste les filtres disponibles.

Si non spécifié, FILTER_DEFAULT sera utilisé, ce qui est équivalent à FILTER_UNSAFE_RAW. Cela reviendra à n'avoir aucun filtre en place par défaut.

options

Tableau associatif d'options ou des drapeaux. Si le filtre accepte les options, les drapeaux peuvent être fournis dans le champ "flags" du tableau.

Valeurs de retour

Valeur de la variable demandée en cas de succès, false si le filtre échoue, ou null si la variable var_name n'est pas définie. Si le drapeau FILTER_NULL_ON_FAILURE est utilisé, la fonction retournera false si la variable n'est pas définie et null si le filtre échoue.

Exemples

Exemple #1 Exemple avec filter_input()

<?php
$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo "Vous avez recherché $search_html.\n";
echo "<a href='?search=$search_url'>Nouvelle recherche.</a>";
?>

Résultat de l'exemple ci-dessus est similaire à :

Vous avez recherché Me &#38; son.
<a href='?search=Me%20%26%20son'>Nouvelle recherche.</a>

Voir aussi

  • filter_var() - Filtre une variable avec un filtre spécifique
  • filter_input_array() - Récupère plusieurs valeurs externes et les filtre
  • filter_var_array() - Récupère plusieurs variables et les filtre
  • Types de filtres

User Contributed Notes

Enrique 08-Sep-2018 09:21
Para obtener el IP de cliente en sustitución de $_SERVER("REMOTE_ADDR") no se puede usar filter_input(INPUT_SERVER,'REMOTE_ADDR',FILTER_VALIDATE_IP) pues devuelve null, la formula que funciona es:

$REMOTE_ADDR = filter_input(INPUT_ENV, 'REMOTE_ADDR', FILTER_VALIDATE_IP);
DoubleT 17-Aug-2018 07:44
Discovered interesting behavior when modifying super-globals directly.
$_GET['p'] = 1;
filter_input(INPUT_GET,'p'); //value is NULL

Is this expected?
John Smith 21-Nov-2014 04:48
1. The description of the options parameter is misleading. In order to pass the options (e.g. default, min_range and max_range) you must pass an associative array with a key called "options", which itself is an associative array containing option name => option value pairs.

2. The return values section does not mention that if you specify the "default" option then the function will return the specified default value instead of returning FALSE or NULL (when filter fails or variable is absent).
rimelek at rimelek dot hu 20-Oct-2014 08:44
If your $_POST contains an array value:
<?php
$_POST  = array(
    'var' => array('more', 'than', 'one', 'values')
);
?>
you should use FILTER_REQUIRE_ARRAY option:
<?php
var_dump(filter_input(INPUT_POST, 'var', FILTER_DEFAULT , FILTER_REQUIRE_ARRAY));
?>
Otherwise it returns false.
viaujoc at videotron dot ca 04-Oct-2014 04:14
filter_input() does not seem to support multiple values for a single variable name.

Here is the code comparing the behavior of bare $_GET superglobal vs filter_input(INPUT_GET,...):
<?php
print("Bare \$_GET:\n");
var_dump($_GET);
print("filter_input():\n");
var_dump(filter_input(INPUT_GET,"var"));
?>

When calling: /..../script.php?var=123 (there is only one value for variable 'var')
Output is:
Bare $_GET:
array(1) {
  ["var"]=>
  string(3) "123"
}
filter_input():
string(3) "123"

When calling: /..../script.php?var[]=123&var[]=999 (there are two  values for variable 'var')
Output is:
Bare $_GET:
array(1) {
  ["var"]=>
  array(2) {
    [0]=>
    string(3) "123"
    [1]=>
    string(3) "999"
  }
}
filter_input():
bool(false)

As expected, $_GET['var'] became an array. But filter_input() seems to be unable to process multiple values and returns false.
CertaiN 23-May-2014 01:22
This function provides us the extremely simple solution for type filtering.

Without this function...
<?php
if (!isset($_GET['a'])) {
    $a = null;
} elseif (!is_string($_GET['a'])) {
    $a = false;
} else {
    $a = $_GET['a'];
}
$b = isset($_GET['b']) && is_string($_GET['b']) ? $_GET['b'] : '';
?>

With this function...
<?php
$a = filter_input(INPUT_GET, 'a');
$b = (string)filter_input(INPUT_GET, 'b');
?>

Yes, FILTER_REQUIRE_SCALAR seems to be set as a default option.
It's very helpful for eliminating E_NOTICE, E_WARNING and E_ERROR.
This fact should be documented.
descartavel1+php at gmail dot com 21-Apr-2014 06:50
contrary to what is stated here on the comments on thow to use the options for filters, there is no range option or default... in fact, there is not much option AT ALL. It is not mentioned in the manual anywhere, and the provided code on that comment does nothing with php-5.4.4..

<?php
get(GET, 'p', FILTER_VALIDATE_INT, array('options'=>array('default'=>5, 'min_range'=>0, 'max_range'=>9)) );
// ?p=30 => 30
// ?p="123" => 123
// ?p=-23 => -23
// ?p=asdf => null
?>
Stefan Weinzierl 16-Feb-2014 04:31
Here is an example how to work with the options-parameter. Notice the 'options' in the 'options'-Parameter!

<?php
$options=array('options'=>array('default'=>5, 'min_range'=>0, 'max_range'=>9));

$priority=filter_input(INPUT_GET, 'priority', FILTER_VALIDATE_INT, $options);
?>

$priority will be 5 if the priority-Parameter isn't set or out the given range.
akshay dot leadindia at gmail dot com 29-Aug-2013 02:17
The beauty of using this instead of directly using filter_var( $_GET['search'] ) is that you don't need to check if( isset( $_GET['search'] ) ) as if you pass that to filter_var and the key is not set then it will result in a warning. This function simplifies this and will return the relevant result to you (as per your options set) if the key has not been set in the user input.

If the type of filter you are using also supports a 'default' argument then this function will also stuff your missing input key with that value, again saving your efforts
west {:a7} jsausa {:d0t}~ com 28-Nov-2012 08:30
It's worth noting that the names for variables in filter input obey the same rules as variable naming in PHP (must start with an underscore or letter).  We were allowing users to build custom forms but hashing the names to prevent them from putting arbitrary content into the dom.  Turns out the hash function occasionally produced entirely numeric values for the field name... which doesn't work with filter_input but worked fine if you read directly from $_GET, $_POST, or $_REQUEST.  A workaround is to always prefix an underscore to the field name.
chris at chlab dot ch 20-Mar-2012 09:46
To use a class method for a callback function, as usual, provide an array with an instance of the class and the method name.
Example:

<?php
class myValidator
{
  public function username($value)
  {
    // return username or boolean false
  }
}

$myValidator = new myValidator;
$options = array('options' => array($myValidator, 'username'));
$username = filter_input(INPUT_GET, 'username', FILTER_CALLBACK, $options);
var_dump($username);
?>
ss23 at ss23 dot geek dot nz 28-Jul-2010 11:37
Note that this function doesn't (or at least doesn't seem to) actually filter based on the current values of $_GET etc. Instead, it seems to filter based off the original values.
<?php
$_GET['search'] = 'foo'; // This has no effect on the filter_input

$search_html = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
$search_url = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_ENCODED);
echo "You have searched for $search_html.\n";
echo "<a href='?search=$search_url'>Search again.</a>";
?>

If you need to set a default input value and filter that, use filter_var on your required input variable instead
travismowens at gmail dot com 28-Jul-2010 09:21
I wouldn't recommend people use this function to store their data in a database.  It's best not to encode data when storing it, it's better to store it raw and convert in upon the time of need.

One main reason for this is because if you have a short CHAR(16) field and the text contains encoded characters (quotes, ampersand) you can easily take a 12 character entry which obviously fits, but because of encoding it no longer fits.

Also, while not as common, if you need to use this data in another place, such as a non webpage (perhaps in a desktop app, or to a cell phone SMS or to a pager) the HTML encoded data will appear raw, and now you have to decode the data.

In summary, the best way to architect your system, is to store data as raw, and encode it only the moment you need to.  So this means in your PHP upon doing a SQL query, instead of merely doing an   echo $row['title']  you need to run htmlentities() on your echos, or better yet, an abstract function.
Maksym Karazeev 03-Mar-2009 01:13
Just a tip.

Note how to setup default filter for filter_var_array

When I tried to use filter_var_array and didn't mentioned all array indexes in definition it filtered it with some filter and broke values so using this tip corrected everything

<?php
$def = array_map(create_function('', 'return array("filter"=>FILTER_UNSAFE_RAW);'), $input);
?>
anthony dot parsons at manx dot net 23-Aug-2007 02:10
FastCGI seems to cause strange side-effects with unexpected null values when using INPUT_SERVER and INPUT_ENV with this function. You can use this code to see if it affects your server:
<?php
var_dump($_SERVER);
foreach ( array_keys($_SERVER) as $b ) {
    var_dump($b, filter_input(INPUT_SERVER, $b));
}
echo '<hr>';
var_dump($_ENV);
foreach ( array_keys($_ENV) as $b ) {
    var_dump($b, filter_input(INPUT_ENV, $b));
}
?>
If you want to be on the safe side, using the superglobal $_SERVER and $_ENV variables will always work. You can still use the filter_* functions for Get/Post/Cookie without a problem, which is the important part!


Retourne une liste de tous les filtres supportés

  • « filter_input
  • filter_var_array »
  • PHP Manual
  • Filter Fonctions
  • Retourne une liste de tous les filtres supportés

filter_list

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_list — Retourne une liste de tous les filtres supportés

Description

filter_list ( ) : array

Valeurs de retour

Retourne un tableau de noms de tous les filtres supportés, un tableau vide s'il n'y a pas de filtre. Les index de ce tableau ne sont pas les identifiants des filtres, ils peuvent être obtenus avec la fonction filter_id() à partir du nom.

Exemples

Exemple #1 Exemple avec filter_list()

<?php
print_r(filter_list());
?>

Résultat de l'exemple ci-dessus est similaire à :

Array
(
    [0] => int
    [1] => boolean
    [2] => float
    [3] => validate_regexp
    [4] => validate_url
    [5] => validate_email
    [6] => validate_ip
    [7] => string
    [8] => stripped
    [9] => encoded
    [10] => special_chars
    [11] => unsafe_raw
    [12] => email
    [13] => url
    [14] => number_int
    [15] => number_float
    [16] => magic_quotes
    [17] => callback
)

User Contributed Notes

shaman_master at list dot ru 18-Mar-2020 09:13
2 strings, but it's faster (-2 calls) and not the longest
<?php
$filters = filter_list();
$filters =  array_combine($filters, array_map('filter_id',  $filters));
?>
also I use id's as values: $filters[$filter] - get filter id by name
El diablo 07-Mar-2018 08:43
Get filter_list() with filter_id() as key.

<?php
print_r(array_flip(array_map('filter_id', array_combine(filter_list(), filter_list()))));
?>

Array
(
    [257] => int
    [258] => boolean
    [259] => float
    [272] => validate_regexp
    [277] => validate_domain
    [273] => validate_url
    [274] => validate_email
    [275] => validate_ip
    [276] => validate_mac
    [513] => stripped
    [514] => encoded
    [515] => special_chars
    [522] => full_special_chars
    [516] => unsafe_raw
    [517] => email
    [518] => url
    [519] => number_int
    [520] => number_float
    [521] => magic_quotes
    [1024] => callback
)
larry at weblabsperth dot com dot au 05-Sep-2016 09:42
Output a table of Filter IDs as Integers with corresponding Constant IDs:

<?php

echo '<table>';
echo '<tr>';
echo '<th>Filter Name</th>';
echo '<th>Filter Int ID</th>';
echo '<th>Filter Const ID</th>';
echo '</tr>';

foreach (filter_list() as $id =>$filter) {
    $const = 'FILTER_';
    switch($filter) {
        case 'int':
        case 'boolean':
        case 'float':
            $const .= 'VALIDATE_' . $filter;
        break;

        case 'string':
        case 'stripped':
        case 'encoded':
        case 'special_chars':
        case 'full_special_chars':
        case 'unsafe_raw':
        case 'email':
        case 'url':
        case 'number_int':
        case 'number_float':
        case 'magic_quotes':
            $const .= 'SANITIZE_' . $filter;
        break;
    }

    if (substr($filter,0,8)=='validate' || $filter=='callback')
        $const .= $filter;

    echo '<tr><td>' . $filter . '</td><td align="center">' . filter_id($filter) . '</td><td>' . strtoupper($const) . '</td></tr>';
}

echo '</table>';

?>
vb dot jyoti at gmail dot com 13-Aug-2008 11:57
<?php
echo "<pre>";
print_r(filter_list());
echo "</pre>";
foreach (filter_list() as $key => $value)
{
echo "<br>".$key."=".$value.'='.filter_id($value);
}
?>

0=int=257
1=boolean=258
2=float=259
3=validate_regexp=272
4=validate_url=273
5=validate_email=274
6=validate_ip=275
7=string=513
8=stripped=513
9=encoded=514
10=special_chars=515
11=unsafe_raw=516
12=email=517
13=url=518
14=number_int=519
15=number_float=520
16=magic_quotes=521
17=callback=1024


Récupère plusieurs variables et les filtre

  • « filter_list
  • filter_var »
  • PHP Manual
  • Filter Fonctions
  • Récupère plusieurs variables et les filtre

filter_var_array

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_var_array — Récupère plusieurs variables et les filtre

Description

filter_var_array ( array $array , array|int $options = FILTER_DEFAULT , bool $add_empty = true ) : array|false|null

Cette fonction est utile pour récupérer plusieurs valeurs sans appeler plusieurs fois la fonction filter_var().

Liste de paramètres

array

Un tableau avec les clés contenant les données à filtrer.

options

Un tableau définissant les arguments. Une clé valide est une chaîne de caractères contenant le nom de la variable et une valeur valide est soit le type d'un filtre, soit un tableau spécifiant le filtre, les drapeaux et les options. Si la valeur est un tableau, les clés valides sont filter qui spécifie le type du filtre, flags qui spécifie tous les drapeaux à appliquer au filtre, et options qui spécifie toutes les options à appliquer au filtre. Voir l'exemple ci-dessous pour une meilleure compréhension.

Ce paramètre peut également être un entier contenant une constante de filtre. Ensuite, toutes les valeurs du tableau d'entrée seront filtrées par ce filtre.

add_empty

Ajout des clés manquantes à la valeur null dans la valeur retournée.

Valeurs de retour

Un tableau contenant les valeurs des variables demandées en cas de succès, ou false si une erreur survient. Un tableau de valeurs peut valoir false si le filtre échoue, ou null si la variable n'est pas définie.

Exemples

Exemple #1 Exemple avec filter_var_array()

<?php
error_reporting(E_ALL | E_STRICT);
$data = array(
    'product_id'    => 'libgd<script>',
    'component'     => '10',
    'versions'      => '2.0.33',
    'testscalar'    => array('2', '23', '10', '12'),
    'testarray'     => '2',
);

$args = array(
    'product_id'   => FILTER_SANITIZE_ENCODED,
    'component'    => array('filter'    => FILTER_VALIDATE_INT,
                            'flags'     => FILTER_FORCE_ARRAY,
                            'options'   => array('min_range' => 1, 'max_range' => 10)
                           ),
    'versions'     => FILTER_SANITIZE_ENCODED,
    'doesnotexist' => FILTER_VALIDATE_INT,
    'testscalar'   => array(
                            'filter' => FILTER_VALIDATE_INT,
                            'flags'  => FILTER_REQUIRE_SCALAR,
                           ),
    'testarray'    => array(
                            'filter' => FILTER_VALIDATE_INT,
                            'flags'  => FILTER_FORCE_ARRAY,
                           )

);

$myinputs = filter_var_array($data, $args);

var_dump($myinputs);
echo "\n";
?>

L'exemple ci-dessus va afficher :

array(6) {
  ["product_id"]=>
  string(17) "libgd%3Cscript%3E"
  ["component"]=>
  array(1) {
    [0]=>
    int(10)
  }
  ["versions"]=>
  string(6) "2.0.33"
  ["doesnotexist"]=>
  NULL
  ["testscalar"]=>
  bool(false)
  ["testarray"]=>
  array(1) {
    [0]=>
    int(2)
  }
}

Voir aussi

  • filter_input_array() - Récupère plusieurs valeurs externes et les filtre
  • filter_var() - Filtre une variable avec un filtre spécifique
  • filter_input() - Récupère une variable externe et la filtre
  • Types de filtres

User Contributed Notes

Vee W. 19-Jun-2019 04:37
$emails = [
    'a' => 'email1@domain.com',
    'b' => '<email2>@domain.com',
];

$result = filter_var_array($emails, FILTER_SANITIZE_EMAIL);
print_r($result);

// the result will be...
// array('a' => 'email1@domain.com', 'b' => 'email2@domain.com')
tongcheong77 at gmail dot com 12-Jul-2017 05:44
an update to previous post.

using regular expressions along with another filter in filter var array

$data = array(

  'regxp' =>  "`\tcafé\n`"

  );

$args = array(

  'regxp'  =>  array(

  'filter'=>FILTER_VALIDATE_REGEXP | FILTER_SANITIZE_STRING,
  'flags'=>FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_BACKTICK,
  'options'=>array('regexp'=>"/t(.*)/"),

  ));

$output=filter_var_array($data,$args);

var_dump($output); // array(1) { ["regxp"]=> string(3) "caf" }

-bruce tong
tongcheong77 at gmail dot com 10-Jul-2017 06:10
for those who would like to know how to use regular expressions with filter var array. taken from w3 schools.

$data = array(

  'regxp' =>  'michael'

  );

$args = array(

  'regxp'  =>  array(

  'filter'=>FILTER_VALIDATE_REGEXP | FILTER_SANITIZE_STRING,
  'options'=>array('regexp'=>"/^michael$/"),

  ));

$output=filter_var_array($data,$args);

var_dump($output); // array(1) { ["regxp"]=> string(7) "michael" }

- bruce tong
eguvenc at gmail dot com 06-Jun-2009 03:45
<?php
//an example of simply sanitize an array..

$data = array(
                '<b>bold</b>',
                '<script>javascript</script>',
                'P*}i@893746%%%p*.i.*}}|.dw<?php echo "echo works!!";?>');

$myinputs = filter_var_array($data,FILTER_SANITIZE_STRING);

var_dump($myinputs);

//OUTPUT:
//formarray(3) { [0]=> string(4) "bold" [1]=> string(10) "javascript" [2]=> string(26) "P*}i@893746%%%p*.i.*}}|.dw" }
?>


Filtre une variable avec un filtre spécifique

  • « filter_var_array
  • Gestion des fonctions »
  • PHP Manual
  • Filter Fonctions
  • Filtre une variable avec un filtre spécifique

filter_var

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

filter_var — Filtre une variable avec un filtre spécifique

Description

filter_var ( mixed $value , int $filter = FILTER_DEFAULT , array|int $options = 0 ) : mixed

Liste de paramètres

value

Valeur à filtrer. Notez que les valeurs scalaires sont converties en chaîne de caractères en interne avant qu'elles ne soient filtrées.

filter

L'ID du filtre à appliquer. La Types de filtres page du manuel liste les filtres disponibles.

Si non spécifié, FILTER_DEFAULT sera utilisé, ce qui est équivalent à FILTER_UNSAFE_RAW. Cela reviendra à n'avoir aucun filtre en place par défaut.

options

Tableau associatif d'options ou des drapeaux. Si le filtre accepte les options, les drapeaux peuvent être fournis dans le champ "flags" du tableau. Pour les fonctions de rappel, le type callable devra être passé. La fonction de rappel doit accepter un seul argument ; la valeur à filtrer et retournera la valeur, une fois le filtre appliqué.

<?php
// Pour les filtres acceptant les options, utilisez ce format
$options = array(
    'options' => array(
        'default' => 3, // valeur à retourner si le filtre échoue
        // autres options ici...
        'min_range' => 0
    ),
    'flags' => FILTER_FLAG_ALLOW_OCTAL,
);
$var = filter_var('0755', FILTER_VALIDATE_INT, $options);

// Pour les filtres qui n'acceptent que des drapeaux,
// vous pouvez les passer directement
$var = filter_var('oops', FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);

// Pour les filtres qui n'acceptent que des drapeaux,
// vous pouvez également les passer sous forme de tableau
$var = filter_var('oops', FILTER_VALIDATE_BOOLEAN,
                  array('flags' => FILTER_NULL_ON_FAILURE));

// Fonction de rappel du filtre
function foo($value)
{
    // Format attendu: Surname, GivenNames
    if (strpos($value, ", ") === false) return false;
    list($surname, $givennames) = explode(", ", $value, 2);
    $empty = (empty($surname) || empty($givennames));
    $notstrings = (!is_string($surname) || !is_string($givennames));
    if ($empty || $notstrings) {
        return false;
    } else {
        return $value;
    }
}
$var = filter_var('Doe, Jane Sue', FILTER_CALLBACK, array('options' => 'foo'));
?>

Valeurs de retour

Retourne les données filtrées, ou false si le filtre échoue.

Exemples

Exemple #1 Exemple avec filter_var()

<?php
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED));
?>

L'exemple ci-dessus va afficher :

string(15) "bob@example.com"
bool(false)

Voir aussi

  • filter_var_array() - Récupère plusieurs variables et les filtre
  • filter_input() - Récupère une variable externe et la filtre
  • filter_input_array() - Récupère plusieurs valeurs externes et les filtre
  • Types de filtres

User Contributed Notes

marcelo dot espindola at gmail dot com 20-Dec-2020 03:56
To remove multiple consecutive spaces replacing just one:

preg_replace('/\s\s+/', ' ', $value);
Robert Vlach 08-Apr-2020 06:33
I won't recommend using this function to validate email addresses on a normal website. The problem is that in accordance with RFC 3696 (Application Techniques for Checking and Transformation of Names) the following email addresses would be considered as valid:

customer/department=shipping@example.com
$A12345@example.com
!def!xyz%abc@example.com
_somename@example.com
"Abc@def"@example.com

Hardly something I would accept in a live web app in 2020 :-/
yactouat at hotmail dot com 18-May-2019 02:47
While getting familiar with filter_var( $var, FILTER_VALIDATE_INT ), I found interesting that 0 will be filtered out and therefore wont be considered as an int. Hope that helps someone not to be stuck ;)

N.B.: if you need to accept 0's, you could use is_int()
Steve 15-Oct-2018 01:47
The note from "hek" about HTML5 having patterns thus alleviating the need to filter in PHP is completely wrong:  You still must filter input on the server side.  The HTML5 form inputs are client-side, meaning they are completely under the user's control.  Only when you receive the data in PHP is it server-side and under your control.  Once the data is under your control, then you must filter/sanitize it properly.

This is true regardless of server-side language.  I would encourage the moderators to remove the note from "hek" because it will mislead people with horrible consequences.

Steve
Anonymous 06-Sep-2018 07:31
Replying to Andi:

This is NOT a valid URL, as the characters are not encoded

http://example.com/"><script>alert(document.cookie)</script>

This is a valid URL:

http://example.com/%22%3E%3Cscript%3Ealert%28document.cookie%29%3C%2Fscript%3E
mpyw628 at gmail dot com 22-Jul-2018 10:40
I wrote a JavaScript email validator fully compatible with PHP's filter_var() implementation.

mpyw/FILTER_VALIDATE_EMAIL.js: Email validation compatible with PHP's filter_var($value, FILTER_VALIDATE_EMAIL)
https://github.com/mpyw/FILTER_VALIDATE_EMAIL.js
ccbsschucko at gmail dot com 15-Jun-2018 12:59
<?php
    class Sanitizer {
        /**
        * @param str => $email = email a ser sanitizado
        */
        public static function email($email){
            return filter_var($email, FILTER_SANITIZE_EMAIL);
        }

        /**
        * @param str => $valor = valor a ser sanitizado
        * @param bol => $allow_accents = permitir acentos
        * @param bol => $allow_spaces = permitir espaços
        */
        public static function alfabetico($valor, bool $allow_accents = true, bool $allow_spaces = false){
            $valor = str_replace(array('"', "'", '`', '´', '¨'), '', trim($valor));
            if(!$allow_accents && !$allow_spaces){
                return preg_replace('#[^A-Za-z]#', '', $valor);
            }
            if($allow_accents && !$allow_spaces){
                return preg_replace('#[^A-Za-zà-zÀ-Z]#', '', $valor);
            }
            if(!$allow_accents && $allow_spaces){
                return preg_replace('#[^A-Za-z ]#', '', $valor);
            }
            if($allow_accents && $allow_spaces){
                return preg_replace('#[^A-Za-zà-zÀ-Z ]#', '', $valor);
            }
        }

        /**
        * @param str => $valor = valor a ser sanitizado
        */
        public static function alfanumerico($valor, bool $allow_accents = true, bool $allow_spaces = false){
            $valor = str_replace(array('"', "'", '`', '´', '¨'), '', trim($valor));
            if(!$allow_accents && !$allow_spaces){
                return preg_replace('#[^A-Za-z0-9]#', '', $valor);
            }
            if($allow_accents && !$allow_spaces){
                return preg_replace('#[^A-Za-zà-zÀ-Z0-9]#', '', $valor);
            }
            if(!$allow_accents && $allow_spaces){
                return preg_replace('#[^A-Za-z0-9 ]#', '', $valor);
            }
            if($allow_accents && $allow_spaces){
                return preg_replace('#[^A-Za-zà-zÀ-Z0-9 ]#', '', $valor);
            }
        }

        /**
        * @param str => $valor = valor a ser sanitizado
        */
        public static function numerico($valor){
            return preg_replace('/\D/', '', $valor);
        }

        /**
        * @param str => $valor = valor a ser sanitizado
        */
        public static function integer($valor){
            return (int)$valor;
        }

        /**
        * @param str => $valor = valor a ser sanitizado
        */
        public static function float($valor){
            return (float)$valor;
        }

        /**
        * @param str => $valor = valor a ser sanitizado
        */
        public static function money($valor){
            $valor = preg_replace('/\D/', '', $valor);
            if(strlen($valor) < 3){
                $valor = substr($valor, 0, strlen($valor)).'.00';
                return (float)$valor;
            }
            if(strlen($valor) > 2){
                $valor = substr($valor, 0, (strlen($valor)-2)).'.'.substr($valor, (strlen($valor)-2));
                return (float)$valor;
            }
        }

        /**
        * @param str => $valor = valor a ser sanitizado
        */
        public static function url($valor){
            $valor = strip_tags(str_replace(array('"', "'", '`', '´', '¨'), '', trim($valor)));
            return filter_var($valor, FILTER_SANITIZE_URL);
        }
    }
    // ex:
    var_dump(Sanitizer::numerico('bgusybd458ad8964sdfsd'));
    // 4588964
?>
crisp at tweakers dot net 09-Jan-2018 10:31
Note that only using FILTER_VALIDATE_URL to validate url's input may result in XSS:

$url = 'javascript://%0Aalert(document.cookie)';

if (filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_SCHEME_REQUIRED)) {
    echo '<a href="' . $url . '">click</a>';
}

You should at least additionally check the actually used scheme.
divinity76 at gmail dot com 22-Jun-2017 11:00
note that FILTER_VALIDATE_BOOLEAN tries to be smart, recognizing words like Yes, No, Off, On, both string and native types of true and false, and is not case-sensitive when validating strings.

<?php
$vals=array('on','On','ON','off','Off','OFF','yes','Yes','YES',
'no','No','NO',0,1,'0','1','true',
'True','TRUE','false','False','FALSE',true,false,'foo','bar');
foreach($vals as $val){
    echo var_export($val,true).': ';   var_dump(filter_var($val,FILTER_VALIDATE_BOOLEAN,FILTER_NULL_ON_FAILURE));
}
?>

outputs:
'on': bool(true)
'On': bool(true)
'ON': bool(true)
'off': bool(false)
'Off': bool(false)
'OFF': bool(false)
'yes': bool(true)
'Yes': bool(true)
'YES': bool(true)
'no': bool(false)
'No': bool(false)
'NO': bool(false)
0: bool(false)
1: bool(true)
'0': bool(false)
'1': bool(true)
'true': bool(true)
'True': bool(true)
'TRUE': bool(true)
'false': bool(false)
'False': bool(false)
'FALSE': bool(false)
true: bool(true)
false: bool(false)
'foo': NULL
'bar': NULL
alice at deviant dot email 02-May-2016 12:19
Many people, myself included, have found that the FILTER_VALIDATE_EMAIL does not actually properly work.

Below is a wrapper that I believe validates every legal routable address.

<?php

/*******************************************
 *
 * These are the function
 *
 *  check_username is called by check_email
 *  - it compensates for bugs in the php
 *    filter_var function.
 *  - returns boolean
 *
 *  check_email is the function to use.
 *  First argument is string, address to
 *    check
 *  Second argument is optional boolean,
 *    whether or not to use DNS to validate
 *    the domain name. Defaults to true
 *  Returns boolean
 *
 */

function check_username($uname) {
  //Only UTF-8 addresses are legal
  if (iconv('UTF-8', 'UTF-8', $input) != $input) {
      return FALSE;
  }
  //replace all characters above U+007F with letter U for simplicity of checking
  $uname = preg_replace('/[\x{007F}-\x{FFFF}]/u', 'U', $uname);

  //remove comments - only legal in format (comment) at beginning or end of username
  $s[] = '/^\([^\)]*\)/'; $s[] = '/\([^\)]*\)$/';
  $uname = preg_replace($s, '', $uname);
  //make sure we have something left
  if(strlen(trim($uname)) == 0) {
    return FALSE;
  }
  // check for legal dot usage
  if(substr_count($uname, '..') > 0) {
    return FALSE;
  }
  // convert \\ and \" to an A for simplicity
  $s[] = '/[\\\][\\\]/';
  $s[] = '/\\\"/';
  $uname = preg_replace($s, 'A', $uname);
  // check for illegal use of quotes
  if(preg_match('/[^.]+"[^.]+/', $uname)) {
    return FALSE;
  }
  // compensate for characters legal when in quotes
  $uname = preg_replace_callback('/"(.*)"/', function ($m) {
    $s[]="/[ \(\),\:;<>@\[\] ]/";
    return preg_replace($s,'Q',$m[1]);
    }, $uname);
  // check what we have left with filter_var
  return filter_var($uname . '@example.org', FILTER_VALIDATE_EMAIL);
}

function check_email($email, $dns_check=true) {
  $array = explode('@', $email);
  if(count($array) < 2) {
    return FALSE;
  }
  $domain = end($array);
  array_pop($array);
  if(function_exists('idn_to_ascii')) {
    //php filter no workie with unicode characters
    $domain = idn_to_ascii($domain);
  }
  $ipcheck = preg_replace(array('/^\[ipv6\:/i', '/^\[/', '/\]$/'), '', $domain);
  if(filter_var($ipcheck, FILTER_VALIDATE_IP)) {
    // it's an IP address
    if(! filter_var($ipcheck, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
      return FALSE;
    }
  } else {
    // it's a domain name
    //   php bug - FILTER_VALIDATE_EMAIL doesn't like naked TLD
    if(! filter_var('user@a.' . $domain, FILTER_VALIDATE_EMAIL)) {
      return FALSE;
    }
    if($dns_check) {
      if(! dns_get_record($domain)) {
        return FALSE;
      }
    }
  }
  //now check legal username
  return check_username(implode('@', $array));
}
?>
It evaluates the address in two parts, first evaluating the host and if that legal it then evaluates the user name.

If there is a DNS problem *and* the default $dns_check value of true is used, valid will fail. If it is an international domain name, you have to have the php-intl package installed.

Enjoy.
buttflattery at gmail dot com 18-Jan-2016 03:15
FILTER_VALIDATE_URL validates a url like http://www.
amy at anvilzephyr dot com 10-Jan-2016 08:14
It might be wise to trim or sanitize (FILTER_SANITIZE_EMAIL) your email variable before validating to remove spaces:
filter_var(trim($email), FILTER_VALIDATE_EMAIL)
Ant 14-Dec-2015 02:20
Note: filter_var with filter=FILTER_VALIDATE_URL used parse_url function
dan at spiral8 dot net 08-Dec-2015 02:23
Here's a simple test using filter_var with FILTER_VALIDATE_URL.
(If you're using file_get_contents after this you will run into a problem, I was using: PHP 5.5.12 (cli))

<?php
$url = 'a://google.com';

$result = filter_var($url, FILTER_VALIDATE_URL);

if($result){
    echo 'Valid URL'.PHP_EOL;
}

var_dump($result);
?>

The result is:
Valid URL
string(14) "a://google.com"
yoanlin93 at gmail dot com 22-Nov-2015 06:34
Some boolean conversions:

<?php
var_dump(filter_var('oops', FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// NULL

var_dump(filter_var('false', FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(false)

var_dump(filter_var('true', FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(true)

var_dump(filter_var(0, FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(false)

var_dump(filter_var(1, FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(true)

var_dump(filter_var('TRUE', FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(true)

var_dump(filter_var('', FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(false)

var_dump(filter_var('FALSE', FILTER_VALIDATE_BOOLEAN, array('flags' => FILTER_NULL_ON_FAILURE)));
// bool(false)
Anonymous 04-Nov-2015 11:20
FILTER_VALIDATE_URL allows:

filter_var('javascript://comment%0Aalert(1)', FILTER_VALIDATE_URL);

Where the %0A (URL encoded newline), in certain contexts, will split the comment from the JS code.

This can result in an XSS vulnerability.
joe at bloe dot com 13-Jul-2014 03:04
"(comment)localpart@example.com"
is an invalid E-Mail address per RFC5322 (Appendix A.6.3):
"Also, the comments and white space throughout addresses, dates, and message identifiers are all part of the obsolete syntax."
george at NOSPAM dot crownvalleysoftware dot com 30-Apr-2014 10:08
In the options, "logical disjunction" means "or" - for example:
filter_var($somestring ,FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
Tom 18-Nov-2013 10:23
It is important to note that though the data type of the first parameter of the function is stated as "mixed", this is only one half of the truth.

While it accepts any data type, the first parameter will always be cast to string before being validated or sanitized.

It seems that this function was designed strictly to be used on user input strings. For example: from an online-form. When using it for anything other than that, you may see issues. So read the documentation very carefully!

Especially note that there is an (to date) unresolved issue (#49510) concerning the Boolean filter while using the FILTER_NULL_ON_FAILURE flag. Note that both (string) FALSE and FALSE are not recognized as boolean values and will return NULL (not FALSE as you might expect).

I thus personally suggest that (to date) the best way to take the filter_var()-functions beyond their original purpose (and allow future extension and customization) is to wrap them in your own classes. This will allow you to work-around unexpected behavior on non-string input and add your custom checks, or back-port filters or sanitizers that may be added in later versions of PHP.
(Especially since PHP currently still lacks filters and sanitizers for some of the more exotic HTML5 input types, like "color". Thus there actually is a chance that we may see a need for custom filters or backports at some point in the future.)
CertaiN 01-Aug-2013 10:35
E-mail validator function that supports IPv6 and checking length.
This also supports Japanese old feature phone E-mail address by sending second argument $strict as FALSE.

<?php

function validate_email($email, $strict = true) {
    $dot_string = $strict ?
        '(?:[A-Za-z0-9!#$%&*+=?^_`{|}~\'\\/-]|(?<!\\.|\\A)\\.(?!\\.|@))' :
        '(?:[A-Za-z0-9!#$%&*+=?^_`{|}~\'\\/.-])'
    ;
    $quoted_string = '(?:\\\\\\\\|\\\\"|\\\\?[A-Za-z0-9!#$%&*+=?^_`{|}~()<>[\\]:;@,. \'\\/-])';
    $ipv4_part = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
    $ipv6_part = '(?:[A-fa-f0-9]{1,4})';
    $fqdn_part = '(?:[A-Za-z](?:[A-Za-z0-9-]{0,61}?[A-Za-z0-9])?)';
    $ipv4 = "(?:(?:{$ipv4_part}\\.){3}{$ipv4_part})";
    $ipv6 = '(?:' .
        "(?:(?:{$ipv6_part}:){7}(?:{$ipv6_part}|:))" . '|' .
        "(?:(?:{$ipv6_part}:){6}(?::{$ipv6_part}|:{$ipv4}|:))" . '|' .
        "(?:(?:{$ipv6_part}:){5}(?:(?::{$ipv6_part}){1,2}|:{$ipv4}|:))" . '|' .
        "(?:(?:{$ipv6_part}:){4}(?:(?::{$ipv6_part}){1,3}|(?::{$ipv6_part})?:{$ipv4}|:))" . '|' .
        "(?:(?:{$ipv6_part}:){3}(?:(?::{$ipv6_part}){1,4}|(?::{$ipv6_part}){0,2}:{$ipv4}|:))" . '|' .
        "(?:(?:{$ipv6_part}:){2}(?:(?::{$ipv6_part}){1,5}|(?::{$ipv6_part}){0,3}:{$ipv4}|:))" . '|' .
        "(?:(?:{$ipv6_part}:){1}(?:(?::{$ipv6_part}){1,6}|(?::{$ipv6_part}){0,4}:{$ipv4}|:))" . '|' .
        "(?::(?:(?::{$ipv6_part}){1,7}|(?::{$ipv6_part}){0,5}:{$ipv4}|:))" .
    ')';
    $fqdn = "(?:(?:{$fqdn_part}\\.)+?{$fqdn_part})";
    $local = "({$dot_string}++|(\"){$quoted_string}++\")";
    $domain = "({$fqdn}|\\[{$ipv4}]|\\[{$ipv6}]|\\[{$fqdn}])";
    $pattern = "/\\A{$local}@{$domain}\\z/";
    return preg_match($pattern, $email, $matches) &&
        (
            !empty($matches[2]) && !isset($matches[1][66]) && !isset($matches[0][256]) ||
            !isset($matches[1][64]) && !isset($matches[0][254])
        )
    ;
}

?>
gt at kani dot hu 21-Jun-2013 02:31
I found some addresses that FILTER_VALIDATE_EMAIL rejects, but RFC5321 permits:
<?php
foreach (array(
        'localpart.ending.with.dot.@example.com',
        '(comment)localpart@example.com',
        '"this is v@lid!"@example.com',
        '"much.more unusual"@example.com',
        'postbox@com',
        'admin@mailserver1',
        '"()<>[]:,;@\\"\\\\!#$%&\'*+-/=?^_`{}| ~.a"@example.org',
        '" "@example.org',
    ) as $address) {
    echo "<p>$address is <b>".(filter_var($address, FILTER_VALIDATE_EMAIL) ? '' : 'not')." valid</b></p>";
}
?>
Results:

localpart.ending.with.dot.@example.com is not valid
(comment)localpart@example.com is not valid
"this is v@lid!"@example.com is not valid
"much.more unusual"@example.com is not valid
postbox@com is not valid
admin@mailserver1 is not valid
"()<>[]:,;@\"\\!#$%&'*+-/=?^_`{}| ~.a"@example.org is not valid
" "@example.org is not valid

The documentation does not saying that FILTER_VALIDATE_EMAIL should pass the RFC5321, however you can meet with these examples (especially with the first one). So this is a note, not a bug report.
drew_mirage at hotmail dot com 18-Jun-2013 07:14
One key thing to remember about filtering integers is that the value for the option max_range must be less than or equal to the value of PHP_INT_MAX.

filter_var($someVariable, FILTER_VALIDATE_INT, array('options' => array('min_range' => 1, 'max_range' => SOME_VALUE_GREATER_THAN_PHP_INT_MAX)));

This will fail even if $someVariable is a valid integer in the expected range.

This can show up when you are attempting to validate a potential key for an unsigned MySQL INT type (whose maximum value is 4294967295) on a 32-bit system, where the value of PHP_INT_MAX is 2147483647.
cabrinosimone at gmail dot com 02-Apr-2013 03:19
Pay attention that the function will not validate "not latin" domains.

if (filter_var('??????@??.??', FILTER_VALIDATE_EMAIL)) {
    echo 'VALID';
} else {
    echo 'NOT VALID';
}
alex4home at gmail dot com 10-Jan-2013 12:18
Keep in mind that FILTER_VALIDATE_EMAIL will validate the email address according to standards.
However, giving the fact that organizations are free to restrict the forms of their own email addresses, using ONLY this filter can you a lot of bounces.

gmail, yahoo, hotmail, aol have special rules

For example :
<?php

$email_a = '0hot\'mail_check@hotmail.com';
if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) {
    echo "This (email_a) email address is considered valid.";
   //reported as valid
}

//there can be no  "0hotmail_check@hotmail.com"
//because hotmail will say "Your email address needs to start with a letter. Please try again." even if you remove the '
?>
marcus at synchromedia dot co dot uk 03-Sep-2012 09:13
It's very likely that you actually want to detect all reserved ranges, not just private IPs, and there's another constant for them that should be bitwise-OR'd with it.
<?php
function is_private_ip($ip) {
    return !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
}
?>
Martin L 27-Jul-2012 10:35
FILTER_SANITIZE_EMAIL header injection test.

<?php
$InjString = "\r\n|\n|%0A|%0D|bcc:|to:|cc:|Content-Type:|Mime-Type:|";
echo filter_var($InjString, FILTER_SANITIZE_EMAIL);
?>

||%0A|%0D|bcc|to|cc|Content-Type|Mime-Type|
Andi, info at pragmamx dot org 23-May-2012 06:07
And this is also a valid url

http://example.com/"><script>alert(document.cookie)</script>
keevitaja at gmail dot com 28-Jan-2012 08:05
please note FILTER_VALIDATE_URL passes following url

http://example.ee/sdsf"f
joelhy 06-Jul-2011 02:44
For those looking for private ip checking, there it is:
<?php
 function is_private_ip($ip)
{
     return !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE);
}
?>
php at maisqi dot com 27-May-2011 07:11
FILTER_VALIDATE_URL does not support internationalized domain name (IDN). Valid or not, no domain name with Unicode chars on it will pass validation.

We can circumvent this with a home grown solutions, but C code is C code, so I've gone for the code bellow, which builds on filter_var().

<?php
$res = filter_var ($uri, FILTER_VALIDATE_URL);
if ($res) return $res;
// Check if it has unicode chars.
$l = mb_strlen ($uri);
if ($l !== strlen ($uri)) {
    // Replace wide chars by “X”.
    $s = str_repeat (' ', $l);
    for ($i = 0; $i < $l; ++$i) {
        $ch = mb_substr ($uri, $i, 1);
        $s [$i] = strlen ($ch) > 1 ? 'X' : $ch;
    }
    // Re-check now.
    $res = filter_var ($s, FILTER_VALIDATE_URL);
    if ($res) {    $uri = $res; return 1;    }
}
?>

The logic is simple. A non-ascii char is more than one byte long. We replace every one of those chars by "X" and check again.

An alternative will be to punycode the URI before calling filter_var(), but PHP lacks native support for punycode. I think my approach is effective. Please e-mail me if you think otherwise or see room for improvement.
drtebi at yahoo 24-Nov-2009 11:55
Notice that filter_var with FILTER_VALIDATE_EMAIL does not work if you are trying to get a String from an XML document e.g. via xpath.

I often use XML files as configuration files and use a function that returns a string from the config file via xpath. While this worked fine before 5.2.11, it doesn't anymore (and shouldn't, since it's an XML Element, not a String).

To overcome this problem, $variable can be type-casted:

<?php
$variable = fancyXmlGetFunction('from');
filter_var((String) $variable, FILTER_VALIDATE_EMAIL);
?>
jon dot bertsch at ucop dot edu 24-Mar-2009 07:49
Here's an actual example of the filter syntax with a flag since there doesn't appear to be a one liner for this anywhere:

'hours' => array('filter'=>FILTER_SANITIZE_NUMBER_FLOAT, 'flags' => FILTER_FLAG_ALLOW_FRACTION, 'options'=> '.')
dyer85 at gmail dot com 03-Nov-2008 02:00
Note that when using FILTER_VALIDATE_INT along with the FILTER_FLAG_ALLOW_HEX flag, the string "2f", for example, is not validated successfully, because you must use the "0x" prefix, otherwise, it treats the data as base 10.

The range options are also smart enough to recognize when the boundaries are exceeded in different bases.

Here's an example:

<?php

$foo = '256';
$bar = '0x100';
var_dump(validate_int($foo)); // false, too large
var_dump(validate_int($bar)); // false, too large

function validate_int($input)
{
  return filter_var(
    $input,
    FILTER_VALIDATE_INT,

    // We must pass an associative array
    // to include the range check options.
    array(
      'flags'   => FILTER_FLAG_ALLOW_HEX,
      'options' => array('min_range' => 1, 'max_range' => 0xff)
    )
  );
}

?>
dale dot liszka at gmail dot com 09-Jul-2008 10:15
Here is how to use multiple flags (for those who learn better by example, like me):

<?php
echo "|asdf".chr(9).chr(128)."_123|";
echo "\n";
// "bitwise conjunction" means logic OR / bitwise |
echo filter_var("|asdf".chr(9).chr(128)."_123\n|" ,FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);

/*
Results:
|asdf    ?_123|
|asdf_123|
*/
?>
dale dot liszka at gmail dot com 09-Jul-2008 09:54
Using the FILTER_CALLBACK requires an array to be passed as the options:

<?php
function toDash($x){
   return str_replace("_","-",$x);
}

echo filter_var("asdf_123",FILTER_CALLBACK,array("options"=>"toDash"));
// returns 'asdf-123'
?>
John 26-Jul-2007 12:35
I managed to get this to work with PHP 5.1.6 on CentOS 5 with minor difficulty.

1) Download the PECL filter package
2) Extract the tarball
3) phpize the directory
4) ./configure
5) make
6) filter-0.11.0/logical_filters.c:25:31: error: ext/pcre/php_pcre.h: No such file or directory
7) find / -name php_pcre.h
8) Make sure php-devel is installed
9) Edit filter-0.11.0/logical_filters.c and replace "ext/pcre/php_pcre.h" with the absolute path of php_pcre.h
10) make
11) make install
12) add "extension=filter.so" to php.ini
13) Restart Apache


Gestion des fonctions

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Fonctions sur la gestion des fonctions
    • call_user_func_array — Appelle une fonction de rappel avec les paramètres rassemblés en tableau
    • call_user_func — Appelle une fonction de rappel fournie par le premier argument
    • create_function — Crée une fonction anonyme
    • forward_static_call_array — Appelle une méthode statique et passe les arguments en tableau
    • forward_static_call — Appelle une méthode statique
    • func_get_arg — Retourne un élément de la liste des arguments
    • func_get_args — Retourne les arguments d'une fonction sous la forme d'un tableau
    • func_num_args — Retourne le nombre d'arguments passés à la fonction
    • function_exists — Indique si une fonction est définie
    • get_defined_functions — Liste toutes les fonctions définies
    • register_shutdown_function — Enregistre une fonction de rappel pour exécution à l'extinction
    • register_tick_function — Enregistre une fonction exécutée à chaque tick
    • unregister_tick_function — Annule la fonction exécutée à chaque tick

User Contributed Notes

There are no user contributed notes for this page.


Introduction

Ces fonctions effectuent les manipulations liées à la gestion des fonctions.

User Contributed Notes

There are no user contributed notes for this page.


Fonctions sur la gestion des fonctions

Sommaire

  • call_user_func_array — Appelle une fonction de rappel avec les paramètres rassemblés en tableau
  • call_user_func — Appelle une fonction de rappel fournie par le premier argument
  • create_function — Crée une fonction anonyme
  • forward_static_call_array — Appelle une méthode statique et passe les arguments en tableau
  • forward_static_call — Appelle une méthode statique
  • func_get_arg — Retourne un élément de la liste des arguments
  • func_get_args — Retourne les arguments d'une fonction sous la forme d'un tableau
  • func_num_args — Retourne le nombre d'arguments passés à la fonction
  • function_exists — Indique si une fonction est définie
  • get_defined_functions — Liste toutes les fonctions définies
  • register_shutdown_function — Enregistre une fonction de rappel pour exécution à l'extinction
  • register_tick_function — Enregistre une fonction exécutée à chaque tick
  • unregister_tick_function — Annule la fonction exécutée à chaque tick

User Contributed Notes

php dot spamguard at pulseforce dot com 27-Jan-2009 06:31
PHP is great in how it allows you to send a variable-length argument list to a function by using the func_* functions. However, unfortunately (and this has been brought up numerous time in PHP bug reports/feature requests), it doesn't support passing arguments by reference which would have greatly simplified processing multiple variables at once by simply doing: somefunction($a, $b, $c) and having them processed, without having to do any additional assignment.

However, I've discovered a way to leverage several features of PHP and created a very good example that shows how you can process multiple variables in one fell swoop!

The usage is (with my example function/class):
"list($a, $b, $c, $d, $e) = TextEscape::escape_multi($a, $b, $c, $d, $e);"

If PHP had ACTUALLY been capable of passing variables by reference when using variable-length argument lists, that could have been reduced to:
"TextEscape::escape_multi($a, $b, $c, $d, $e);"

It's extremely close though, both in simplicity and speed. Just be VERY sure to ALWAYS have the SAME NUMBER AND ORDER of arguments on both sides of that statement.

The use of a static class was just to make the code cleaner and easier to look at. This can be applied to any functions!

Now, onto the code, enjoy the sheer brilliance and enjoy modifying multiple variables at once in just ONE statement! ;-)

<?php

class TextEscape
{
    public static function escape_string($sString)
    {
        /* can be anything, using htmlspecialchars() in this example */
        return htmlspecialchars($sString);
    }

    public static function escape_multi()
    {
        /* get all variables passed to the function */
        $aVariables = func_get_args();

        /* loop through the array, escaping each variable */
        foreach ($aVariables as $iKey => $sValue)
        {
            $aVariables[$iKey] = TextEscape::escape_string($sValue);
        }

        /* return the escaped values */
        return $aVariables;
    }
}

// Create test variables
$a = "A<bar";
$b = "B>bar";
$c = "C<bar";
$d = "D>bar";
$e = "E<bar";

// Variables Before:
// Array
// (
//    [0] => A<bar
//    [1] => B>bar
//    [2] => C<bar
//    [3] => D>bar
//    [4] => E<bar
// )
print_r(array($a, $b, $c, $d, $e));

// Process every variable at once,
// we're exploiting both how list() and
// variable-length argument lists work
// to make the usage this smooth! ;-)
list($a, $b, $c, $d, $e) = TextEscape::escape_multi($a, $b, $c, $d, $e);

// Variables After:
// Array
// (
//    [0] => A&lt;bar
//    [1] => B&gt;bar
//    [2] => C&lt;bar
//    [3] => D&gt;bar
//    [4] => E&lt;bar
// )
print_r(array($a, $b, $c, $d, $e));

?>

That's the CLEAN LOOKING version of the code, which illustrates exactly what is HAPPENING.

I also made a speedfreak edition of the function, but didn't want to post it as the main example since it's harder to read.

But it's faster, much faster! It passes by reference where it can and loops in a more efficient way.

Just replace the above function with this one, the outcome is the same but the speed is better:

<?php

class TextEscape
{
    public static function escape_string(&$sString) // CHANGED: we now pass by reference to the actual text processing function
    {
        /* can be anything, using htmlspecialchars() in this example */
        $sString = htmlspecialchars($sString);
    }

    public static function escape_multi()
    {
        /* get all variables passed to the function */
        $aVariables = func_get_args();

        /* loop through the array, escaping each variable */
        for ($i=(count($aVariables)-1); $i>=0; $i--) // CHANGED: a more efficient for-loop is used instead of a foreach; and for anyone wondering about the counter declaration, this is a common optimization trick which makes it so that the size of the array only has to be checked ONCE, by initializing the counter to the index of the last element (which is size of array minus 1) and then iterating downwards until we reach 0 (the first element)
        {
            TextEscape::escape_string($aVariables[$i]); // CHANGED: this has been changed to modify the variable by reference instead
        }

        /* return the escaped values */
        return $aVariables;
    }
}

?>

Enjoy!
Michael T. McGrew 12-May-2005 09:56
An interesting way to use functions is by putting other things than PHP in them, i.e. HTML CSS. This can be useful if you will be using a format for many pages. Yes, the include function can be used also, but by defining them in functions can make them more portable in a way and keep you from having to make many include files. You could use include() when one will be putting big portions of PHP, HTML, and/or CSS and will be using them in many pages. Then you could use PHP, HTML, and/or CSS in a function when it is smaller portions of code and only want it to be on a few pages.

I have been using include() for HTML and CSS in my early days of PHP coding, but I will be using functions for that a lot more now.

<?php function a() {  ?>
<style type="text/css">
table {
border: 1px dashed black;
background: #95EAFE;
text-align:left;
width:610px;
}
.linkbar {
font-family:sans-serif;
line-height:40px;
top:1px;
text-align:center;
width:200px;
height:10px;
}
</style>
<?php }  ?>

Now doing:
<?php a(); ?>
will return all of the CSS just as if you had wrote it on the actual page, or used include() . The same thing goes for HTML code inside a function. The possibilities are endless...
michael dot bommarito at gmail dot com 30-Jan-2005 11:28
I've developed an easy-to-use hack using these functions to emulate overloaded functions.  It's especially handy for constructors and/or C++ style templating.

Here's a little example to get you going.  This does the trick for most circumstances, and if you need more intelligent parsing, it's not too hard to implement with regex or a more suitable classification scheme.

N.B. Note the lack of whitespace between variable types in case strings.

class Matrix {

...

function Matrix() {
  $args = func_get_args();
  $argmatch = implode(",", array_map('gettype', $args));

  switch( $argmatch ) {
    case 'integer,integer':
      //initialize m x n matrix
      break;

    case 'integer,integer,integer':
      //initialize m x n matrix with constant c
      break;

    case 'integer,integer,float':
      //initialize m x n matrix with constant c
      break;

    case 'array':
      //initialize from array (2D....)
      break;

    case 'array,integer':
      //intialize from array (1D packed with m rows)
      break;

    default:
      //(void) overload?
      //error handling?
      break;
  }
}

...

}
php-note-2003-june-18 at ryandesign dot com 18-Jun-2003 08:22
Xavier's example is rather complicated, and his task would be much more simply accomplished by using classes. Define a base class to do the basic functions open, dump, and close, and create extension classes to override whatever behavior.

class foo {
  function open() {
    // Default functionality for open()
  }
  function dump() {
    // Default functionality for dump()
  }
  function close() {
    // Default functionality for close()
  }
}

class bar extends foo {
  function open() {
    // Override functionality of open()
  }
  // dump() and close() remain as in class foo
}
xmontero at dsitelecom dot com 23-Aug-2002 02:49
You can do some kind of overloading functions in PHP using "function_exists".

Let's suppose you want a script to call plugins that are php files and you want the plugins to "override" behaviours that if not overriden are used by default.

You might for example write a "mySQL table viewer" which displays a table and it "opens a table", "dumps the header", "dumps row-by-row" and then "closes the table".

Let's suppose you want a plugin for "Stocks" which prints negative stocks in red, so you want to override the "dumping row-by-row" to do that behaviour. Instead you do not want to have all the "default behaviour" repeated in the plugin.

You may then do the following:

1) Define a default plugin (ex: "default.php"

2) Write all your functions in default.php to open, dump and close, but add them a suffix:

open_table_default()
dump_header_default()
dump_row_default()
close_table_default()

3) Call your functions with a wrapper: Insetad of this:
open_table() or open_table_default() write this:

plugincall("open_table");

4) Then write a function called plugincall which uses function_exists() to see if you call one or the other function:

function plugincall($desired_function_name)
{

if( function_exists( $desired_function_name))
{
    //Call the plugin
    //Note the $ before the name
    $desired_function_name()
}
else
{
  $desired_function_name = $desired_function_name . "_default";
  if( function_exists($desired_function_name))
  {
      //Call the default
      //Note the $ before the name
      $desired_function_name()
  }
  else
  {
      // Nor the plugin nor the default were defined
  }
}

So, now, if the require_once(plugin.php) contains a function called "open_table()", it will be used. Instaed, "open_table_default()" will be used.

It's not like overloading functions, but it is very useful to write scripts ampliable by other programmers: If they write a function, it is used, if not, the default is used.

See ya!
Xavier Montero.


Appelle une fonction de rappel avec les paramètres rassemblés en tableau

  • « Fonctions sur la gestion des fonctions
  • call_user_func »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Appelle une fonction de rappel avec les paramètres rassemblés en tableau

call_user_func_array

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

call_user_func_array — Appelle une fonction de rappel avec les paramètres rassemblés en tableau

Description

call_user_func_array ( callable $callback , array $args ) : mixed

Appelle la fonction de rappel callback fournie avec les paramètres args, rassemblés dans un tableau.

Liste de paramètres

callback

La fonction de rappel à appeler.

args

Les paramètres à passer à la fonction de rappel, sous la forme d'un tableau indexé.

Valeurs de retour

Retourne la valeur retournée par la fonction de rappel, ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec call_user_func_array()

<?php
function foobar($arg, $arg2) {
    echo __FUNCTION__, " got $arg and $arg2\n";
}
class foo {
    function bar($arg, $arg2) {
        echo __METHOD__, " got $arg and $arg2\n";
    }
}

// Appel de la fonction foobar() avec 2 arguments
call_user_func_array("foobar", array("one", "two"));

// Appel de la méthode $foo->bar() avec 2 arguments
$foo = new foo;
call_user_func_array(array($foo, "bar"), array("three", "four"));
?>

Résultat de l'exemple ci-dessus est similaire à :

foobar got one and two
foo::bar got three and four

Exemple #2 Exemple avec call_user_func_array() en utilisant un espace de nom

<?php

namespace Foobar;

class Foo {
    static public function test($name) {
        print "Bonjour {$name}!\n";
    }
}

// Depuis PHP 5.3.0
call_user_func_array(__NAMESPACE__ .'\Foo::test', array('Hannes'));

// Depuis PHP 5.3.0
call_user_func_array(array(__NAMESPACE__ .'\Foo', 'test'), array('Philip'));

?>

L'exemple ci-dessus va afficher :

Bonjour Hannes!
Bonjour Philip!

Exemple #3 Utilisation d'une fonction lambda

<?php

$func = function($arg1, $arg2) {
    return $arg1 * $arg2;
};

var_dump(call_user_func_array($func, array(2, 4))); /* Depuis PHP 5.3.0 */

?>

L'exemple ci-dessus va afficher :

int(8)

Exemple #4 En passant une valeur par référence

<?php

function mega(&$a){
    $a = 55;
    echo "function mega \$a=$a\n";
}
$bar = 77;
call_user_func_array('mega',array(&$bar));
echo "global \$bar=$bar\n";

?>

L'exemple ci-dessus va afficher :

function mega $a=55
global $bar=55

Notes

Note:

Avant PHP 5.4, les variables référencées dans le paramètre args sont passées dans la fonction par référence, indépendamment du fait que la fonction s'attend à ce que le paramètre soit passé par référence. Le fait d'utiliser ce mode pour passer les valeurs au paramètre n'émet pas de notice, mais c'est tout de même obsolète et a été supprimé depuis PHP 5.4. En outre, ceci ne s'applique pas aux fonctions internes, qui voient leurs signatures de fonctions honorées. Le fait de passer une valeur lorsque la fonction s'attend à un paramètre passé par référence produit une alerte et la fonction call_user_func() retournera false (il y a, cependant, une exception pour les valeurs passées par référence count = 1, comme en litéral, vu qu'elle peut être converti en référence sans problème, mais aussi parceque l'écriture sur ces valeurs n'a aucun effet - ne vous fiez pas à ce détail, sachant que son comportement est discutable).

Note:

Notez que les fonctions de rappel enregistrées avec des fonctions comme call_user_func() et call_user_func_array() ne seront pas appelées si une exception n'est pas interceptée alors qu'elle a été lancée dans une précédente fonction de rappel.

Voir aussi

  • call_user_func() - Appelle une fonction de rappel fournie par le premier argument
  • ReflectionFunction::invokeArgs() - Invoque les arguments d'une fonction
  • ReflectionMethod::invokeArgs() - Invoque les arguments

User Contributed Notes

simopelle04 at gmail dot com 18-Jan-2021 09:27
Since PHP 5.6 you can use the spread operator (argument unpacking) instead of call_user_func_array().

    public function __call($name, $arguments) {
        if(method_exists($this->foo, $name))
            return call_user_func_array(array($this->foo, $name), $arguments);    //calls function from inside $this->foo
        else
            throw new BadMethodCallException('Call to undefined method ' . static::class . "::$name()", 0);    //the method does not exist on $this->foo
    }

is the same as

    public function __call($name, $arguments) {
        if(method_exists($this->foo, $name))
            return $this->foo->$name(...$arguments);    //calls function from inside $this->foo
        else
            throw new BadMethodCallException('Call to undefined method ' . static::class . "::$name()", 0);    //the method does not exist on $this->foo
    }
Anonymous 21-Nov-2019 12:10
<?php

namespace Foobar;

class Foo {

    public $email;
    public $name;
    public $age;

    public function setEmail($email) {
        $this->email = $email;
    }
    public function setName($name) {
        $this->name = $name;
    }
    public function setAge($age) {
        $this->age = $age;
    }
}

function getFields() {
    return [
        "age" => 112,
        "email" => "lol@lol.fr",
        "name" => "lol"
    ];
}

$foo = new Foo();

$callables = ["email" => $email,"name" => $name,"age" => $age] = getFields();

foreach ($callables as $func => $value) {
    call_user_func(array($foo,sprintf("set%s",ucfirst($func))),$value));
}

var_dump($foo);
Aurelien Marchand 24-Oct-2019 03:24
In response to  admin at torntech dot com and as shown on https://gist.github.com/nikic/6390366, there is no good reason to use argument unpacking anymore for PHP 7.0.17, 7.1.3, 7.2.7

7.0.17
cufa with 0 args took 0.081735849380493
unpack with 0 args took 0.072259902954102
cufa with 100 args took 0.39941906929016
unpack with 100 args took 0.419842004776

7.1.3
cufa with 0 args took 0.074923992156982
unpack with 0 args took 0.07165002822876
cufa with 100 args took 0.37423300743103
unpack with 100 args took 0.41387891769409

7.2.7
cufa with 0 args took 0.064092874526978
unpack with 0 args took 0.048593997955322
cufa with 100 args took 0.35412693023682
unpack with 100 args took 0.36837601661682
ben at benhunt dot com 29-Nov-2018 04:23
If you're thinking call_user_func_array has changed the array of multiple parameters to a string, remember that it does not pass the array through to the called function as a single argument (array), but creates one argument for each element in the array.
zonkiie 01-Jul-2017 04:38
An implementation where parameters are submitted by their name.
This function calls class functions, class methods, functions and anonymous functions.

/**
    * Calls a method, function or closure. Parameters are supplied by their names instead of their position.
    * @param $call_arg like $callback in call_user_func_array()
    * Case1: {object, method}
    * Case2: {class, function}
    * Case3: "class::function"
    * Case4: "function"
    * Case5: closure
    * @param array $param_array A key-value array with the parameters
    * @return result of the method, function or closure
    * @throws \Exception when wrong arguments are given or required parameters are not given.
    */
function call_user_function_named_param($call_arg, array $param_array)
{
    $Func = null;
    $Method = null;
    $Object = null;
    $Class = null;
    // The cases. f means function name
    // Case1: f({object, method}, params)
    // Case2: f({class, function}, params)
    if(is_array($call_arg) && count($call_arg) == 2)
    {
        if(is_object($call_arg[0]))
        {
            $Object = $call_arg[0];
            $Class = get_class($Object);
        }
        else if(is_string($call_arg[0]))
        {
            $Class = $call_arg[0];
        }
        if(is_string($call_arg[1]))
        {
            $Method = $call_arg[1];
        }
    }
    // Case3: f("class::function", params)
    else if(is_string($call_arg) && strpos($call_arg, "::") !== FALSE)
    {
        list($Class, $Method) = explode("::", $call_arg);
    }
    // Case4: f("function", params)
    else if(is_string($call_arg) && strpos($call_arg, "::") === FALSE)
    {
        $Method = $call_arg;
    }
    // Case5: f(closure, params)
    else if(is_object($call_arg) && $call_arg instanceof \Closure)
    {
        $Method = $call_arg;
    }
    else throw new \Exception("Case not allowed! Invalid Data supplied!");
    if($Class) $Func = new \ReflectionMethod($Class, $Method);
    else $Func = new \ReflectionFunction($Method);
    $params = array();
    foreach($Func->getParameters() as $Param)
    {
        if($Param->isDefaultValueAvailable()) $params[$Param->getPosition()] = $Param->getDefaultValue();
        if(array_key_exists($Param->name, $param_array)) $params[$Param->getPosition()] = $param_array[$Param->name];
        if(!$Param->isOptional() && !isset($params[$Param->getPosition()])) die("No Defaultvalue available and no Value supplied!\r\n");
    }
    if($Func instanceof \ReflectionFunction) return $Func->invokeArgs($params);
    if($Func->isStatic()) return $Func->invokeArgs(null, $params);
    else return $Func->invokeArgs($Object, $params);
}

//Test code:

function func($arg1, $arg2 = "Jane")
{
    return $arg1 . "," . $arg2;
}

class tc1
{
    public static function func1($Arg1, $Arg2 = "HH")
    {
        return $Arg1 . " " . $Arg2;
    }
}

$func2 = function($a1, $a2)
{
   return "a1:" . $a1 . ", a2:" . $a2;
};

$ret = call_user_function_named_param('func', array("arg1"=>"Hello", "arg2"=>"Joe"));
echo "Call Return:" . print_r($ret, true) . PHP_EOL;
$ret = call_user_function_named_param(array(new tc1(), 'func1'), array("Arg1"=>"Hello", "Arg2"=>"Joe"));
echo "Call2 Return:" . print_r($ret, true) . PHP_EOL;
$ret = call_user_function_named_param($func2, array("a1"=>"Hello", "a2"=>"Joe"));
echo "Call3 Return:" . print_r($ret, true) . PHP_EOL;
gmail@asmqb7 08-Jan-2017 04:31
Note that call_user_func() will completely trash debug_backtrace().

Solution:

<?php

your_function(...call_user_func())

?>

Note the 3 dots (array unpacking syntax).
jim at commercebyte dot com 02-Jan-2017 05:42
Before PHP 7.1.0, if you call a function without passing required arguments, a warning was generated, and the missing arguments defaulted to NULL.
In PHP 7.1.0, an ArgumentCountError is being thrown instead. (A little bit of nuisance IMHO, because it causes compatibility issues).
When you use <? call_user_func_array()  ?>, same behavior applies - the exception is thrown if you missed arguments.
Here's a quick and dirty fix for it:
<?
function call_user_func_array_i($callbk,$args) {
    while(true) {
        try {
            return call_user_func_array($callbk,$args);
        } catch(ArgumentCountError $e) {
            $args[] = NULL;
        }
    }
}
?>
Replace your calls to <? call_user_func_array() ?> with <? call_user_func_array_i() ?>, and the good old behavior is back (except that it doesn't issue a warning, but you probably didn't need it anyway).
wriver4 at gmail dot com 02-Jul-2016 03:05
Kris dot Craig at gmail dot com dispatch table does not work currently, but this does.
<?php
define("YOUR_MOTHER", 1);
define("YOUR_FATHER", 2);
define("YOUR_BROTHER", 3);
define("YOUR_SISTER", 4);

class MyFamily
{

    static $dispatch = array(
        YOUR_MOTHER => "mom",
        YOUR_FATHER => "getPrisonInmate",
        YOUR_BROTHER => "replaceName",
        YOUR_SISTER => "lazyGirl");
    static $args = array(
        YOUR_MOTHER => array(),
        YOUR_FATHER => array(
            "55170-054",
            TRUE,
            3),
        YOUR_BROTHER => array(),
        YOUR_SISTER => array());

    function getDispatch($fromwhere)
    {
        return call_user_func_array(array(
            get_class(),
            self::$dispatch[$fromwhere]), self::$args[$fromwhere]);
    }

    function mom()
    {
        return "Mommy loves you!";
    }

    function getPrisonInmate($PrisonerID, $GoodBehavior, $remaining,
            $notes = null)
    {
        //Check prison records for his ID, then....

        if ($GoodBehavior)
        {
            $parole = "APPROVED";
        }
        else
        {
            $parole = "DENIED";
        }

        return "Your father (#$PrisonerID) has $remaining years left in his sentence.  His most recent parole application has been:  $parole";
    }

    function replaceName()
    {
        return "Her name is Sally now.";
    }

    function lazyGirl()
    {
        print "Your sister needs to get out more....";

        //sleep(pow(60, 2) * 18);  //You can sleep later!

        die("Nah, I'm too tired.");
    }

}
print "Status on family member: ".MyFamily::GetDispatch(YOUR_FATHER).'<br><br>';
james dot patrick at lifeshop dot vn 14-Oct-2015 04:00
I've found the solution to resolve my need while writing the str_replace function for processing the multi array as first two arguments of str_replace built-in function(although its pass each array of argument 1 & 2)

<?php
// custom the str_replace function
function p_str_replace($argFind, $agrReplace, $theString) {
  $needle_replace = $theString; // handle the string need to be replace
  array_walk($argFind, function($val, $key) use(&$needle_replace, $agrReplace) {
    $needle_replace = call_user_func_array('str_replace', array($val, $agrReplace[$key], $needle_replace));
  });
  return $needle_replace;
}

// test
$the_str = array(
  'coa' => ':col: :op1: :val: AND :col: :op2: :val:'
);
$ope = array('>=', '<=');
$colsdata = array('date_start', '2015-10-14');

echo p_str_replace(array(
          array(':col:', ':val:'),
          array(':op1:', ':op2:')
        ), array(
            $colsdata,
            $ope
        ), $the_str['coa']);

echo '-------------------------------' . "\n";

// more complexity
$complex = '(:col: :op1: :val: AND :col: :op2: :val:) AND (:col2: :op1: :val2: AND :col2: :op1: :val2:)';

echo p_str_replace(array(
  array(':col:', ':val:'),
  array(':col2:', ':val2:'),
  array(':op1:', ':op2:')
), array(
  array('date_start', '2015-10-01'),
  array('date_end', '2015-10-14'),
  array('>', '<')
), $complex);

?>

Sorry about my bad English :)
Hope this help someone.
Anonymous 11-Aug-2015 09:51
$param_arr may be empty, though it can't be null.

<?php
function foo( $first = 'default1', $second = 'default2' ) {
    echo "first: '$first', second: '$second'\n";
}
call_user_func_array( 'foo', array( 'one', 'two' ) );
call_user_func_array( 'foo', array( 'only one' ) );
call_user_func_array( 'foo', array() );
call_user_func_array( 'foo', null );
?>

Output:
first: 'one', second: 'two'
first: 'only one', second: 'default2'
first: 'default1', second: 'default2'
/* error message or nothing printed depending on version */
admin at torntech dot com 15-Jul-2015 02:06
As of PHP 5.6 you can utilize argument unpacking as an alternative to call_user_func_array, and is often 3 to 4 times faster.

<?php
function foo ($a, $b) {
     return $a + $b;
}

$func = 'foo';
$values = array(1, 2);
call_user_func_array($func, $values);
//returns 3

$func(...$values);
//returns 3
?>

Benchmarks from https://gist.github.com/nikic/6390366
cufa   with 0 args took 0.43453288078308
switch with 0 args took 0.24134302139282
unpack with 0 args took 0.12418699264526
cufa   with 5 args took 0.73408579826355
switch with 5 args took 0.49595499038696
unpack with 5 args took 0.18640494346619
cufa   with 100 args took 5.0327250957489
switch with 100 args took 5.291127204895
unpack with 100 args took 1.2362589836121
stanislav dot eckert at vizson dot de 10-Aug-2014 12:48
Please note, that when calling call_user_func_array() to redirect parameters between inherited classes, you should not use $this, because $this always refers to the class which has been instantiated. The following code even seems to crash PHP (PHP does not report error but the process simply terminates), because the the parameters are redirected only one level up (to class foo_bar2):

<?php

    class foo_bar1
    {
        public function __construct()
        {
            echo __CLASS__ . PHP_EOL;

            if (func_num_args() > 0)
            {
                $constructorArgs = func_get_args();
                call_user_func_array(array($this, 'parent::__construct'), $constructorArgs);
            }
            else
            {
                parent::__construct();
            }
        }
    }

    class foo_bar2 extends foo_bar1
    {
        public function __construct()
        {
            echo __CLASS__ . PHP_EOL;

            if (func_num_args() > 0)
            {
                $constructorArgs = func_get_args();
                call_user_func_array(array($this, 'parent::__construct'), $constructorArgs);
            }
            else
            {
                parent::__construct();
            }
        }
    }

    class foo_bar3 extends foo_bar2
    {
        public function __construct()
        {
            echo __CLASS__ . PHP_EOL;

            if (func_num_args() > 0)
            {
                $constructorArgs = func_get_args();
                call_user_func_array(array($this, 'parent::__construct'), $constructorArgs);
            }
            else
            {
                parent::__construct();
            }
        }
    }

    $f = new foo_bar3("abc");

?>

Instead, use the direct name of the class as string or, better, the magic constant __CLASS__ in call_user_func_array(), like:

    call_user_func_array(array(__CLASS__, 'parent::__construct'), $constructorArgs);

Then the parameters will be correctly redirected to the lowest base class.
jaxxed 10-Jul-2012 04:42
For anyone looking for the means to test for the first parameter before passing to this function, look at the is_callable (http://php.net/manual/en/function.is-callable.php) variable handler.

<?php

$handler = array( 'MyClass', 'MyMethod');
$params = array(1,2,3,4);

if ( is_callable($handler) ) { call_user_func_array( $handler , $params ); }

?>
Brad Proctor 06-Nov-2010 09:07
This function is relatively slow (as of PHP 5.3.3) and if you are calling a method with a known number of parameters it is much faster to call it this way:

$class->{$method}($param1, $param2);

vs

call_user_func_array (array($class, $method), array($param1, $param2));

But if you don't know how many parameters...

The wrapper function below is slightly faster, but the problem now is that you are making two function calls.  One to the wrapper and one to the function.

However, If you are able to take this code out of the function and use it inline it is nearly twice as fast (in most cases) as calling call_user_func_array natively.

<?php
function wrap_call_user_func_array($c, $a, $p) {
    switch(count($p)) {
        case 0: $c->{$a}(); break;
        case 1: $c->{$a}($p[0]); break;
        case 2: $c->{$a}($p[0], $p[1]); break;
        case 3: $c->{$a}($p[0], $p[1], $p[2]); break;
        case 4: $c->{$a}($p[0], $p[1], $p[2], $p[3]); break;
        case 5: $c->{$a}($p[0], $p[1], $p[2], $p[3], $p[4]); break;
        default: call_user_func_array(array($c, $a), $p);  break;
    }
}
?>
Kris dot Craig at gmail dot com 16-Jun-2010 03:28
Many people have wondered how to effectively implement dispatch tables in PHP.  Here's my answer to that (if you'll forgive my creative flair):

<?php

/*
 * Using dispatch tables in PHP.
 *
 * --Kris Craig
 */

define( "YOUR_MOTHER",  1 );
define( "YOUR_FATHER",  2 );
define( "YOUR_BROTHER", 3 );
define( "YOUR_SISTER",  4 );

class MyFamily
{
    static $dispatch = array( YOUR_MOTHER => "Mom", YOUR_FATHER => "GetPrisonInmate", YOUR_BROTHER => "ReplaceName", YOUR_SISTER => "LazyGirl" );
    static $args = array( YOUR_MOTHER => array(), YOUR_FATHER => array( "55170-054", TRUE ), YOUR_BROTHER => array(), YOUR_SISTER => array() );

    function GetDispatch( $fromwhere )
    {
        return call_user_func_array( array( self, self::$dispatch[$fromwhere] ), self::$args[$fromwhere] );
    }

    function Mom()
    {
        return "Mommy loves you!";
    }

    function GetPrisonInmate( $PrisonerID, $GoodBehavior )
    {
        //Check prison records for his ID, then....

        if ( $GoodBehavior )
        {
            $parole = "APPROVED";
        }
        else
        {
            $parole = "DENIED";
        }

        return "Your father (#$PrisonerID) has $remaining years left in his sentence.  His most recent parole application has been:  $parole";
    }

    function ReplaceName()
    {
        return "Her name is Sally now.";
    }

    function LazyGirl()
    {
        print "Your sister needs to get out more....";

        //sleep( pow( 60, 2 ) * 18 );  //You can sleep later!

        die( "Nah, I'm too tired." );
    }
}

print "Status on family member: " . MyFamily::GetDispatch( YOUR_FATHER );

?>
noone at example dot com 21-Apr-2010 03:03
For those of you that have to consider performance: it takes about 3 times as long to call the function this way than via a straight statement, so whenever it is feasible to avoid this method it's a wise idea to do so.

Note that eval() is about 10 times slower than a straight statement to call a function with arguments, so this is definitely a better option than using eval() even if you only consider performance.
aj at ajbrown dot org 22-Dec-2009 07:30
Just a heads up, the second parameter MUST be an array if it's specified,  but that doesn't seem to be enforced until ~5.3.

I just pulled my hair out with an old installation of CakePHP because it was passing NULL instead of an empty array.
mrextreme at freemail dot hu 07-Dec-2009 08:34
If you are using PHP < 5.3 and want to call the parent class' __construct() with a variable parameter list, use this:

<?php
public function __construct()
{
    $vArgs = func_get_args(); // you can't just put func_get_args() into a function as a parameter
    call_user_func_array(array('parent', '__construct'), $vArgs);
}
?>
dmitry dot revenko at businessmedia dot ru 25-Sep-2009 05:28
Just hope this note helps someone (I killed the whole day on issue).

If you use something like this in PHP < 5.3:
<?php call_user_func_array(array($this, 'parent::func'), $args); ?>
Such a script will cause segmentation fault in your webserver.

In 5.3 you should write it:
<?php call_user_func_array('parent::func', $args); ?>
Damin 13-Jun-2009 12:06
Those having the passing by reference issue can use this simple hack.
I´m really not sure WHY this works, but it does, and it does not make use of EVAL or other questionable functions.
<?php
    function executeHook($name, $type='hooks'){
        $args = func_get_args();
        array_shift($args);
        array_shift($args);
        //Rather stupid Hack for the call_user_func_array();
        $Args = array();
        foreach($args as $k => &$arg){
            $Args[$k] = &$arg;
        }
        //End Hack
        $hooks = &$this->$type;
        if(!isset($hooks[$name])) return false;
        $hook = $hooks[$name];
        call_user_func_array($hook, $Args);
    }
?>

All it´s doing is copying the args ($args) into a new array ($Args) by reference, which i would think would be identical to the original array in every way (that matters).

Note the code here is an example of usage. The actual hack is denoted by comments.
If someone knows a better alternative, by all means, i would love to see it.
Freek (at) Gruntjes.net 07-Apr-2009 01:53
I just noticed that when you use this function with parameters that need to be passed by reference it will not work.

<?php
function refFunc(&$var)
{
  $var .= 'bar';
}

$var = 'foo';
?>

call_user_func_array('refFunc', array($var));
echo $var;

will output 'foo' and not  'foobar'. Witch is logical since you are declaring a new variable with array($var) however not so obvious.
thiago dot henrique dot mata at gmail dot com 22-Jul-2008 02:17
<?php
Class Delegate
{
    private $arrInstances = array();

    protected function addObject( $oElement )
    {
        // add one element on the end of the stack  //
        $this->arrInstances[] = $oElement;
    }

    public function __call( $strMethod, $arrParams )
    {
        // for each element in instance //
        foreach( $this->arrInstances as $oElement )
        {
            // get the class of the element //
            $strClass = get_class( $oElement );
            // get all methods of the class  //
            $arrMethods = get_class_methods( $strClass );
            // case the method exists into this class  //
            if( in_array( $strMethod , $arrMethods ) )
            {
                // prepare caller //
                $arrCaller = Array( $strClass , $strMethod );
                // return the result of the method into the object  //
                return call_user_func_array( $arrCaller, $arrParams );
            }
        }
        // any object has the method //
        // throw a exception //
        throw new Exception( " Method " . $strMethod . " not exist in this class " . get_class( $this ) . "." );
    }
}

class Log
{
    public function sayHi()
    {
        print "hi!" . "<br/>\n";
    }

    public function sayMyName()
    {
        print "log" . "<br/>\n";
    }
}

class Other
{
    public function sayHello()
    {
        print "hello there!" . "<br/>\n";
    }

    public function sayMyName()
    {
        print "other" . "<br/>\n";
    }
}

class Example extends Delegate
{
    public function __construct()
    {
        $this->addObject( new Log() );
        $this->addObject( new Other() );
    }
}

$oExample = new Example();
$oExample->sayHi();
$oExample->sayHello();
$oExample->sayMyName();

/*
    hi!<br/>
    hello there!<br/>
    log<br/>
*/
?>
dnhuff at acm.org 07-Jun-2008 11:57
It appears that when PHP executes something like:

$a = array(1,2,3);
$b =& $a[1];

both $b and $a[1] are converted into references to a common value -- makes sense until you transfer that to a call_user_func:

call_user_func_array('foo', $a);

suddenly, inside foo, the second parameter is passed by reference!

And you can't call this wrong, only another subtly of references.

Note it appears that ksort($a) will remove the reference as well as put the elements in key order so you (probably) get what you expect. (see below on the use of a foreach ($a as &v).)
aeolianmeson at 8n54tvv dot blitzeclipse dot com 27-May-2008 08:48
There's a possibility that call_user_func_array(), call_user_func(), and Exception::getTrace() will cause a trace entry to not have the 'file' or 'line' elements.

Dustin Oprea
richard_harrison at rjharrison dot org 11-Apr-2007 02:31
If you are thinking of using call_user_func_array to instantiate an object (see comments below using Reflection) then since v5.1.3 you can use the Reflection::newInstanceArgs() method.

<?php

// arguments you wish to pass to constructor of new object
$args = array('a', 'b');

// class name of new object
$className = 'myCommand';

// make a reflection object
$reflectionObj = new ReflectionClass($className);

// use Reflection to create a new instance, using the $args
$command = $reflectionObj->newInstanceArgs($args);

// this is the same as: new myCommand('a', 'b');
?>
levi at alliancesoftware dot com dot au 08-Feb-2007 02:50
Regarding the comments below about calling parent constructors:

PHP5 with E_STRICT no longer allows calls as below:

<?php
// Causes an error with E_STRICT
call_user_func_array(array('parent', '__construct'), $args);
?>

It gives an error because you are trying to call a nonstatic function as if it was static. The correct syntax is

<?php
// Works fine
call_user_func_array(array($this, 'parent::__construct'), $args);
?>
15-May-2006 02:43
For those wishing to implement call-by-name functionality in PHP, such as implemented e.g. in DB apis, here's a quick-n-dirty version for PHP 5 and up
<?php
/**
 * Call a user function using named instead of positional parameters.
 * If some of the named parameters are not present in the original function, they
 * will be silently discarded.
 * Does no special processing for call-by-ref functions...
 * @param string $function name of function to be called
 * @param array $params array containing parameters to be passed to the function using their name (ie array key)
 */
function call_user_func_named($function, $params)
{
    // make sure we do not throw exception if function not found: raise error instead...
    // (oh boy, we do like php 4 better than 5, don't we...)
    if (!function_exists($function))
    {
        trigger_error('call to unexisting function '.$function, E_USER_ERROR);
        return NULL;
    }
    $reflect = new ReflectionFunction($function);
    $real_params = array();
    foreach ($reflect->getParameters() as $i => $param)
    {
        $pname = $param->getName();
        if ($param->isPassedByReference())
        {
            /// @todo shall we raise some warning?
        }
        if (array_key_exists($pname, $params))
        {
            $real_params[] = $params[$pname];
        }
        else if ($param->isDefaultValueAvailable()) {
            $real_params[] = $param->getDefaultValue();
        }
        else
        {
            // missing required parameter: mark an error and exit
            //return new Exception('call to '.$function.' missing parameter nr. '.$i+1);
            trigger_error(sprintf('call to %s missing parameter nr. %d', $function, $i+1), E_USER_ERROR);
            return NULL;
        }
    }
    return call_user_func_array($function, $real_params);
}
?>
eugene at artprime dot ru 23-Dec-2005 02:59
<?php
  return call_user_func_array(
    array(new ReflectionClass($className), 'newInstance'),
    $functionParameters
  );
?>

Look here: http://www.zend.com/zend/week/week182.php#Heading1
crocodile2u at yandex dot ru 20-Dec-2005 05:06
Here is another version of createObjArray() function written here earlier by taylor.

Believing that using 'eval()' is at least "dirty", I came to the following solution (with a help of panchous - at phpclub dot ru forums ). This solution utilizes the new Reflection API.

<?php
function & createObjArray($type, $args = array()) {
    $reflection = new ReflectionClass($type);
    $output     = call_user_func_array(array(&$reflection, 'newInstance'), $args);
    return $output;
}
?>
Egor 15-Nov-2005 09:35
Note that, despite the name, this does work on builtin functions (and object methods with the array(&$obj, $method) syntax), not just user-defined functions and methods.
rrant (at) gmail (dot) com 10-Nov-2005 03:50
Just an extra for the post of amer at o2 dot pl:

If you need to call the PARENT method:
call_user_func_array(array('parent', 'method'), $args);

With that, if you need to call a constructor and/or add some extra code to the instantiation process:

<?php
function __construct() {
    // Get the arguments
    $args = func_get_args();
    // Initialize parent with arguments
    call_user_func_array(array('parent', '__construct'), $args);
    // ... Your Code Here ...
}
?>

Note that your constructor pass all the arguments to the parent constructor and it doesn't matter how many arguments you pass.

This is pretty useful for constructors with a variable number of arguments.
taylor 02-Jun-2005 05:51
I came up with a better solution to the problem that I solve below with createObjArray that maintains parameter type:

<?php

function createObjArray($type,$args=array()) {
     $paramstr = '';
     for ($i = 0; $i < count($args); $i++) {
           $paramstr .= '$args['.$i.'],';
     }
     $paramstr = rtrim($paramstr,',');

     return eval("return new $type($paramstr);");
}

?>

Would be good to add error checking, but it works.
amer at o2 dot pl 20-Jan-2005 02:44
PLS notice that "patripaq at hotmail dot com" 's code will be valid if B EXTENDS A...
<?php
class B extends A{
...
}
?>
there>>"What I wanted to do is create an object that can manage any number and any kind of parameters."

BUT IT IS NOT A POINT AT ALL

If you need to call just function with parameters:
call_user_func_array('Foo',$args);

If you need to call CLASS method (NOT object):
call_user_func_array(array('class', 'Foo'),$args);

If you need to call OBJECT method:
call_user_func_array(array(&$Object, 'Foo'),$args);

If you need to call method of object of object:
call_user_func_array(array(&$Object->Object, 'Foo'),$args);

If you need to call object method from within the very same object (NOT CLASS!):
call_user_func_array(array(&$this, 'Foo'),args);

The call_user_func_array ITSELF can manage any number and any kind of parameters. It can handle ANY FUNCTION too as it is defined and that maybe partipaq wanted to manage.

What You actually need is object composition not inheritance. Make an instance from arguments.
<?php
...
class B{
   function __construct() {
      $args = func_get_args(); // Get arguments
      $this->OBJ = new A($args);
      call_user_func_array(array(&$this->OBJ, 'A'), $args );
   }
}
?>
Then there can be any number and any type of created object B parameters
james at gogo dot co dot nz 21-Nov-2004 05:19
Be aware the call_user_func_array always returns by value, as demonstrated here...

<?php
    function &foo(&$a)
    {
      return $a;
    }

    $b = 2;
    $c =& call_user_func_array('foo', array(&$b));
    $c++;
    echo $b . ' ' . $c;
?>

outputs "2 3", rather than the expected "3 3".

Here is a function you can use in place of call_user_func_array which returns a reference to the result of the function call.

<?php
    function &ref_call_user_func_array($callable, $args)
    {
        if(is_scalar($callable))
        {
            // $callable is the name of a function
            $call = $callable;
        }
        else
        {
            if(is_object($callable[0]))
            {
                // $callable is an object and a method name
                $call = "\$callable[0]->{$callable[1]}";
            }
            else
            {
                // $callable is a class name and a static method
                $call = "{$callable[0]}::{$callable[1]}";
            }
        }

        // Note because the keys in $args might be strings
        // we do this in a slightly round about way.
        $argumentString = array();
        $argumentKeys = array_keys($args);
        foreach($argumentKeys as $argK)
        {
            $argumentString[] = "\$args[$argumentKeys[$argK]]";
        }
        $argumentString = implode($argumentString, ', ');
        // Note also that eval doesn't return references, so we
        // work around it in this way...
        eval("\$result =& {$call}({$argumentString});");
        return $result;
    }
?>
hong dot nguyen at k-edge dot com 02-Apr-2004 09:37
call_user_func_array can pass parameters as reference:

<?php
call_user_func_array(array(&$obj,$method),array(&$arg1,$arg2,$arg3))
?>

Use it as work-around for "Call-time pass-by-reference has been deprecated".
adamh at densi dot com 31-Jul-2003 11:58
call_user_func_array() is nifty for calling PHP functions which use variable argument length. For example:

<?php
$array = array(
 array("foo", "bar"),
 array("bat", "rat"),
);

$values = call_user_func_array("array_merge", $array);

var_dump($values);
?>

/* output:
array(4) {
  [0]=>
  string(3) "foo"
  [1]=>
  string(3) "bar"
  [2]=>
  string(3) "bat"
  [3]=>
  string(3) "rat"
}
*/

The neat feature is that $array could have any number of arrays inside it.


Appelle une fonction de rappel fournie par le premier argument

  • « call_user_func_array
  • create_function »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Appelle une fonction de rappel fournie par le premier argument

call_user_func

(PHP 4, PHP 5, PHP 7, PHP 8)

call_user_func — Appelle une fonction de rappel fournie par le premier argument

Description

call_user_func ( callable $callback , mixed ...$args ) : mixed

Appelle une fonction de rappel callback fournie par le paramètre callback où les autres arguments seront passés en paramètre.

Liste de paramètres

callback

La fonction de rappel à appeler.

args

0 ou plus de paramètres à passer à la fonction de rappel.

Note:

Notez que les paramètres pour call_user_func() ne sont pas passés par référence.

Exemple #1 Exemple avec call_user_func() par référence

<?php
function increment(&$var)
{
    $var++;
}

$a = 0;
call_user_func('increment', $a);
echo $a."\n";

// Vous pouvez utiliser ceci à la place
call_user_func_array('increment', array(&$a));
echo $a."\n";
?>

L'exemple ci-dessus va afficher :

Warning: Parameter 1 to increment() expected to be a reference, value given in …
0
1

Valeurs de retour

Retourne la valeur retournée par la fonction de rappel.

Exemples

Exemple #2 Exemple avec call_user_func()

<?php
function barber($type)
{
    echo "Vous voulez une coupe $type, aucun problème";
}
call_user_func('barber', "au bol");
call_user_func('barber', "au rasoir");
?>

L'exemple ci-dessus va afficher :

Vous voulez une coupe au bol, aucun problème
Vous voulez une coupe au rasoir, aucun problème

Exemple #3 Exemple avec call_user_func() en utilisant un espace de noms

<?php

namespace Foobar;

class Foo {
    static public function test() {
        print "Hello world!\n";
    }
}

call_user_func(__NAMESPACE__ .'\Foo::test'); // As of PHP 5.3.0
call_user_func(array(__NAMESPACE__ .'\Foo', 'test')); // As of PHP 5.3.0
?>

L'exemple ci-dessus va afficher :

Hello world!
Hello world!

Exemple #4 Utilisation d'une méthode de classe avec call_user_func()

<?php

class maclasse {
    static function dit_bonjour()
    {
        echo "Bonjour!\n";
    }
}

$classname = "maclasse";

call_user_func(array($classname, 'dit_bonjour'));
call_user_func($classname .'::dit_bonjour');    // Depuis 5.2.3

$monobjet = new maclasse();

call_user_func(array($monobjet, 'dit_bonjour'));

?>

L'exemple ci-dessus va afficher :

Bonjour!
Bonjour!
Bonjour!

Exemple #5 Utilisation d'une fonction lambda avec call_user_func()

<?php
call_user_func(function($arg) { print "[$arg]\n"; }, 'test'); /* Depuis PHP 5.3.0 */
?>

L'exemple ci-dessus va afficher :

[test]

Notes

Note:

Notez que les fonctions de rappel enregistrées avec des fonctions comme call_user_func() et call_user_func_array() ne seront pas appelées si une exception n'est pas interceptée alors qu'elle a été lancée dans une précédente fonction de rappel.

Voir aussi

  • call_user_func_array() - Appelle une fonction de rappel avec les paramètres rassemblés en tableau
  • is_callable() - Détermine si l'argument peut être appelé comme fonction
  • ReflectionFunction::invoke() - Invoque une fonction
  • ReflectionMethod::invoke() - Invoque

User Contributed Notes

James at enfsolar dot com 11-Dec-2019 12:08
<?php

class MyClass{

    public function hello($str)

    {

        echo 'hello ' . $str;

    }

}

$obj = new MyClass();

[$obj, 'hello']('World'); // the array can be called as a function
luciano_closs at hotmail dot com 13-Dec-2018 11:42
Actually, as PHP 7.0, when you want to call a static method, you must call:

<?php

namespace Foobar;

class Foo {
   static public some() {
      echo 'Hello World!';
   }
}

call_user_func( array( __NAMESPACE__ . '\\Foo', 'some' ) );

?>

This will output:

Hello World!
slinstj at gmail dot com 09-May-2018 02:00
Updating "insta at citiesunlimited dot com"'s benchmarking for PHP 7.1.17 we have an INVERSION of results between using variables and call_user_func():

// RESULTS

Variable functions took 0.0020599365234375 seconds.
call_user_func took 0.00094509124755859 seconds.
eval took 0.024421215057373 seconds.

So, call_user_func() is now actually the way to go in PHP 7.1+.

<?php

function fa () { return 1; }
function fb () { return 1; }
function fc () { return 1; }

$calla = 'fa';
$callb = 'fb';
$callc = 'fc';

$time = microtime( true );
for( $i = 5000; $i--; ) {
    $x = 0;
    $x += $calla();
    $x += $callb();
    $x += $callc();
    if( $x != 3 ) die( 'Bad numbers' );
}
echo( "Variable functions took " . (microtime( true ) - $time) . " seconds.<br />" );

$time = microtime( true );
for( $i = 5000; $i--; ) {
    $x = 0;
    $x += call_user_func('fa', '');
    $x += call_user_func('fb', '');
    $x += call_user_func('fc', '');
    if( $x != 3 ) die( 'Bad numbers' );
}
echo( "call_user_func took " . (microtime( true ) - $time) . " seconds.<br />" );

$time = microtime( true );
for( $i = 5000; $i--; ) {
    $x = 0;
    eval( '$x += ' . $calla . '();' );
    eval( '$x += ' . $callb . '();' );
    eval( '$x += ' . $callc . '();' );
    if( $x != 3 ) die( 'Bad numbers' );
}
echo( "eval took " . (microtime( true ) - $time) . " seconds.<br />" );

?>
fab2s at marsatak dot org 02-Mar-2017 12:35
@insta at citiesunlimited dot com & @Maresa

call_user_func() alleged slowness is quite over estimated when it comes to real use cases. we are talking about loosing fraction of a second every million calls, which by the way would take less than half a sec to execute in the worst case.

I don't know of many processes that would actually suffer from this kind of overhead.

Iterations: 100 000
Averaged over: 10
PHP 5.6.30 (cli) (built: Jan 18 2017 19:47:28)
Overall Average
+------------------------+----------+-----------+--------+
| Invocation             | Time (s) | Delta (s) | %      |
+------------------------+----------+-----------+--------+
| directFunction         | 0.0089   | -0.0211   | -70.19 |
| directStatic           | 0.0098   | -0.0202   | -67.39 |
| directLambda           | 0.0109   | -0.0191   | -63.52 |
| directInstance         | 0.0116   | -0.0184   | -61.31 |
| directClosure          | 0.0150   | -0.0150   | -50.15 |
| Invoke                 | 0.0282   | -0.0018   | -6.13  |
| call_user_func         | 0.0300   |           |        |
| ClosureFactory         | 0.0316   | +0.0016   | +5.20  |
| assignedClosureFactory | 0.0328   | +0.0028   | +9.28  |
| call_user_func_array   | 0.0399   | +0.0099   | +33.02 |
| InvokeCallUserFunc     | 0.0418   | +0.0118   | +39.17 |
| directImplementation   | 0.0475   | +0.0175   | +58.28 |
+------------------------+----------+-----------+--------+

Iterations: 100 000
Averaged over: 10
PHP 7.1.2 (cli) (built: Feb 14 2017 21:24:45)
Overall Average
+------------------------+----------+-----------+--------+
| Invocation             | Time (s) | Delta (s) | %      |
+------------------------+----------+-----------+--------+
| directFunction         | 0.0043   | -0.0096   | -68.92 |
| directStatic           | 0.0050   | -0.0089   | -64.04 |
| directInstance         | 0.0058   | -0.0081   | -58.22 |
| directLambda           | 0.0063   | -0.0075   | -54.44 |
| directClosure          | 0.0081   | -0.0058   | -41.57 |
| call_user_func         | 0.0139   |           |        |
| call_user_func_array   | 0.0147   | +0.0008   | +5.84  |
| Invoke                 | 0.0187   | +0.0048   | +34.61 |
| ClosureFactory         | 0.0207   | +0.0069   | +49.43 |
| assignedClosureFactory | 0.0219   | +0.0080   | +57.75 |
| directImplementation   | 0.0232   | +0.0094   | +67.53 |
| InvokeCallUserFunc     | 0.0264   | +0.0126   | +90.67 |
+------------------------+----------+-----------+--------+

If you want more details : https://github.com/fab2s/call_user_func
fab2s at marsatak dot org 02-Mar-2017 12:18
The "Example #1 call_user_func() example and references" has become misleading since it will throw an exception starting from at least php 5.6.30:
<?php
//  Parameter 1 to increment() expected to be a reference, value given
?>

The crash occurs when call_user_func() is called as it does not provide increment() with a reference.

Also note that :

<?php
call_user_func('increment', &$a);
?>

will also  throw an exception :
<?php
// Call-time pass-by-reference has been removed
?>
developer at nabtron dot com 28-Dec-2016 11:30
We can achieve the same dynamically without call_user_func like this

<?php

class myclass {
    public function say_hello()
    {
        echo "Hello!\n";
    }
}

$classname = "myclass";

$myobject = new myclass();
$var = "say_hello";

(new myclass)->{$var}();
call_user_func(array(new myclass(), $var));
jcastro at eftec dot cl 07-Jun-2016 09:29
Lets say that $a1 is an object and fn is a function then:

echo $a1->fn('hello world');
echo $a1->{"fn"}('hello world');
echo call_user_func(array($a1, 'fn'),'hello world');

Are three valid ways to do the same.
blakerenton09 at yahoo dot com 06-Jun-2011 04:45
call_user_func may also be used to call a closure or anonymous function that has been passed into a user-defined function.

<?php
function Benchmark()
{
    foreach(func_get_args() as $function)
    {
        $st = microtime(true);
        call_user_func($function);
        $et = microtime(true);
        echo sprintf("Time: %f", $et - $st) . '<br />';
    }
}

Benchmark(function()
{
    for ( $i = 0; $i <= 10000; $i++ )
    { }
},
function()
{
    $i = 0;
    while ( $i <= 10000 )
    {
        $i++;
    }
});
?>

Returns:
Time: 0.001652
Time: 0.001458
romainbessuges at gmail dot com 09-May-2011 05:50
I made a wrapper for call_user_func_array which is really simple and convenient. It takes advantage of the __invoke() magic method :

<?php
class Func {

    public static function fromFunction($name){
        return new Func($name);
    }

    public static function fromClassMethod($class, $name){
        return new Func(array($class, $name));
    }

    public static function fromObjectMethod($object, $name){
        return new Func(array($object, $name));
    }

    public $function;

    public function  __construct($function) {
        $this->function = $function;
    }

    public function __invoke(){
        return call_user_func_array($this->function, func_get_args());
    }
}
?>

Example :

<?php
$func = Func::fromObjectMethod($myArrayObject, "offsetGet");

echo $func(3);
?>
gskluzacek dot nospam at gmail dot com 11-Sep-2010 10:38
if you simply want to dynamically call a method on an object it is not necessary to use call_user_function but instead you can do the following:

<?php

$method_name = "AMethodName";

$obj = new ClassName();

$obj->{$method_name}();

?>

I've used the above so I know it works.

Regards,
-- Greg
moisadoru at gmail dot com 13-May-2010 08:49
Actually, when calling a static method of some class, the params are sent by reference:
<?php
class Foo {
    private $x = 0;
    public function getX(){
        return $this->x;
    }
    public function setX($val){
        $this->x = $val;
    }
}

class Bar {
    static function incStatic(Foo $f){
        $f->setX($f->getX()+1);
        global $foo;
        if($f === $foo) echo '<span style="color: blue">' . __METHOD__ . '() objects are equal</span><br />';
        else  echo '<span style="color: red">' . __METHOD__ . '() objects are not equal</span><br />';
    }
    public function incNonStatic(Foo $f){
        $f->setX($f->getX()+1);
        if($f === $foo) echo '<span style="color: blue">' . __METHOD__ . '() objects are equal</span><br />';
        else  echo '<span style="color: red">' . __METHOD__ . '() objects are not equal</span><br />';
    }
}

function inc(Foo $f){
    $f->setX($f->getX()+1);
    if($f === $foo) echo '<span style="color: blue">' . __FUNCTION__ . '() objects are equal</span><br />';
    else  echo '<span style="color: red">' . __FUNCTION__ . '() objects are not equal</span><br />';
}

$foo = new Foo;
$bar = new Bar;

call_user_func('inc', $foo);
call_user_func('Bar::incStatic', $foo);
call_user_func(array($bar, 'incNonStatic'), $foo);
?>

The results on PHP 5.2.6 (macosx 10.5):

inc() objects are not equal
Bar::incStatic() objects are equal
Bar::incNonStatic() objects are not equal

Hope it helps sombody.
Nitrogen 04-Oct-2009 04:08
A good use for call_user_func(); is for recursive functions.
If you're distributing code, you will often come across users who will rename functions and break the code..
Use this: call_user_func(__FUNCTION__, ... ); inside a function to call itself with whatever parameters you want.

<?php
// example, an extremely simplified factorial calculator..
// it's quite obvious when someone renames the function, it'll spit out an error because it wants to call itself.
function Factorial($i=1) {
  return($i==1?1:$i*Factorial($i-1));
}

// you can give this function whatever name you want, it'll always work, of course if you initially call it using the name you gave it.
function qwertyuiop($i=1) {
  return($i==1?1:$i*call_user_func(__FUNCTION__,$i-1));
}
?>

Just that I didn't see any reference to recursive functions when user_call_func(); really helps.
edgar dot klerks at gmail dot com 17-Mar-2009 07:18
An entirely OO solution to add dynamicly methods to classes, I used in a project:
<?php
class ProductPart {

        protected $data;
        protected $plugins = array();
        function __construct($data){

                $this->data = $data;

        }
        public function register(ProductPlugin $plugin){

                if(!in_array($plugin, $this->plugins)){

                        $this->plugins[$plugin->toString()] = $plugin;
                } else {
                        throw new Exception('Function allready defined');
                }
        }
        public function unregister(ProductPlugin $plugin){
                if(isset($this->plugins[$plugin->toString()])){
                        unset($this->plugins[$plugin->toString()]);
                } else {
                        throw new Exception('No such function');
                }

        }

        protected function __call($method, $args) {
              if(isset($this->plugins[$method])){
                array_unshift(&$args, $this->data);
                array_unshift(&$args, $this);
                return $this->plugins[$method]->run($args[0], $args[1], $args[2]);

              } else {
                throw new Exception('No such function');
              }
        }
} ?>

I simplified the class somewhat for clearity.

With this class, you can dynamicly add and remove classes by calling register or unregister. Register will store the object in an associative array by calling toString (as defined by ProductPlugin) and saving the method under the returned string in the array. (In this case the name of the method the class adds.)

When a method is called, which isn't standard in the object, _call will lookup the called method in the array. If found, __call run the method of the plugin with the provided arguments. I restricted the user provided argument to 1, because I want to force the user to use associative arrays.

Because I chose an array to store my classes, removing a function is quite simple. However the unregister function isn't optimal, I better pass a string instead of a plugin object. I didn't test it yet on performance.

The ProductPlugin class:

<?php

abstract class ProductPlugin {
        protected $name = null;
        abstract public function run($obj, $data, $args);
        public function __construct($data = null) {

                if($this->name === null){
                        throw new Exception('Name must be defined');
                }
                $this->init($data);
        }
        protected function init($data){

        }
        public function toString(){
                return $this->name;
        }
}

?>

And at last some demonstration code:

<?php
$bla = new ProductPart(array('HelloWorld' => 'Hello world'));
$hello = new helloPlugin();
$bla->register($hello);
$bla->HelloWorld();
$bla->unregister($hello);
$bla->HelloWorld();

?>
dead,screamer@seznam,cz 21-Dec-2008 08:50
<?php call_user_func()?> and <?php call_user_func_array()?> hide some errors (notices, warnings and maybe errors), even if is display_errors turned on and error_Reporting is set to E_ALL|E_STRICT
Maxdamantus 03-Nov-2007 10:26
Note that the parser can interpret variables in function syntax, which means you can pass all variables normally (eg: reference).

<?php
function myfunction($string, &$int){
    echo $string."\n";
    $int++;
}
$function_name = "myfunction";
$x = 1336;
$function_name("Hello World", $x);
echo $x;
?>
---
Hello World
1337
Knightnet 07-Sep-2007 05:31
You don't need to use this function to call a variable class function. Instead you can do the following:

$this->{$fnname}();

The example works in PHP 5 from within the class. It is the {} that do the trick.

Regards,
Julian.
Typer85 at gmail dot com 12-Sep-2006 03:57
I would just like to say at first that I prefer variable function calls over the use of this function.

However I found that at some times, the use of this function is needed in situtations where variable function calls can not be used. And in those same situations, the use of this function is also better than using eval.

The situation I ran into is this:

I wanted to call object methods dynamically from within the object but with arguments given for possible parameters that the method I will call requires.

The parameters themselves are dynamic, meaning I have no prior knowledge of how many their are, their values, or if they even exist.

Also because object methods are dynamic, meaning I have no prior knowledge which object method will actually be called, I can not simply use variable function calls, call the method and pass any parameters.

So what I simply do is call the object method with an array of parameters, something that, to the best of my knowledge, can not be done with variable function calls, since variable function calls, even though they themeselves are dynamic, passing parameters to them is not.
rlansky at webroot dot com 14-Jul-2006 04:17
Based on the previous posts, it appears that using call_user_func can be serveral times slower than using variable substitution. I think these results are somewhat misleading.

I set up a similar test in which a static method of an object was called repeatedly in a loop. I got similar results to those seen; when calling the method using call_user_func the execution was twice that of calling the method directly. However, I then started adding some "meat" to the method in question. In my case, I found that what was constant was not the percentage change, but rather that there is a fixed cost to using call_user_func.

In my case, this fixed cost was 2 microseconds per call. When executing a method that performs no operations, this is a large percentage of the execution time for that method. However, when using this on a method that actually performs some work, the 2 microsecond cost is almost impossible to measure.

It seems to me that if you want to use call_user_func to call a very fast executing method, and you need to do this thousands of times, then you may want to reconsider. However, if you are using this to call methods that are not executed thousands of times, the small fixed cost of using php call_user_func is probably not an issue.
Maresa 13-Apr-2006 03:41
I tested the same code that insta at citiesunlimited dot com pasted on the following machines:

www1 machine:
OS:  FreeBSD 5.2.1-RELEASE
CPU: 2 x Intel(R) Xeon(TM) CPU 2.66GHz (2657.82-MHz 686-class CPU) with Hyperthreading
MEM: 1073217536 (1023 MB)
PHP 5.1.2 (cli)
PHP 4.4.1 (Web)

www2 machine:
OS:  Linux version 2.6.14-gentoo-r5 Gentoo 3.4.3-r1, ssp-3.4.3-0, pie-8.7.7)
CPU: 2 x Dual Core AMD Opteron(tm) Processor 265 stepping 02 1808.357 MHz
MEM: 2060388k total
PHP 5.1.2 (cli)
PHP Version 4.4.0-pl1-gentoo (web)

dev machine:
OS:  Linux version 2.6.15-gentoo-r1 Gentoo 3.3.5.20050130-r1, ssp-3.3.5.20050130-1, pie-8.7.7.1
CPU: Intel(R) Pentium(R) 4 CPU 2.00GHz stepping 04
MEM: 516384k total,
PHP 4.4.0-pl1-gentoo (cli)
PHP Version 4.4.0-pl1-gentoo (web)

The result are as follows:

www1 - CLI
Variable functions took 0.012186050415 seconds.
call_user_func took 0.0300550460815 seconds.
eval took 0.17235994339 seconds.

www1 - Web
Variable functions took 0.017616 seconds.
call_user_func took 0.034926 seconds.
eval took 0.149618 seconds

www2 - CLI
Variable functions took 0.0065491199493408 seconds.
call_user_func took 0.019452095031738 seconds.
eval took 0.10734891891479 seconds.

www2 - Web
Variable functions took 0.01565 seconds.
call_user_func took 0.02613 seconds.
eval took 0.132258 seconds.

dev - CLI
Variable functions took 0.025176 seconds.
call_user_func took 0.047402 seconds.
eval took 0.168196 seconds.

dev - Web
Variable functions took 0.025465 seconds.
call_user_func took 0.049713 seconds.
eval took 0.20154 seconds.

On www1 - CLI, eval is about 14 times slower than calling function by using variable.
On www1 - Web, eval is about 8.5 times slower (hmm interesting. Perhaps PHP4 is faster calculating eval than PHP5)

On www2 - CLI, eval is about 16 times slower than calling function by using variable.
On www2 - Web, eval is about 8.5 times slower (about same result as www1)

On dev - CLI, eval is about 6.6 times slower than calling function by using variable.
On dev - Web, eval is about 8 times slower (about same result as www1)

On the dev machine, CLI and web version of PHP is the same. and their speed difference between calling function using variable or eval does not differ that much compare to PHP5 VS PHP5
insta at citiesunlimited dot com 06-Feb-2006 12:15
I benchmarked the comparison in speed between variable functions, call_user_func, and eval.  My results are below:

Variable functions took 0.125958204269 seconds.
call_user_func took 0.485446929932 seconds.
eval took 2.78526711464 seconds.

This was run on a Compaq Proliant server, 180MHz Pentium Pro 256MB RAM.  Code is as follows:

<?php

function fa () { return 1; }
function fb () { return 1; }
function fc () { return 1; }

$calla = 'fa';
$callb = 'fb';
$callc = 'fc';

$time = microtime( true );
for( $i = 5000; $i--; ) {
    $x = 0;
    $x += $calla();
    $x += $callb();
    $x += $callc();
    if( $x != 3 ) die( 'Bad numbers' );
}
echo( "Variable functions took " . (microtime( true ) - $time) . " seconds.<br />" );

$time = microtime( true );
for( $i = 5000; $i--; ) {
    $x = 0;
    $x += call_user_func('fa', '');
    $x += call_user_func('fb', '');
    $x += call_user_func('fc', '');
    if( $x != 3 ) die( 'Bad numbers' );
}
echo( "call_user_func took " . (microtime( true ) - $time) . " seconds.<br />" );

$time = microtime( true );
for( $i = 5000; $i--; ) {
    $x = 0;
    eval( '$x += ' . $calla . '();' );
    eval( '$x += ' . $callb . '();' );
    eval( '$x += ' . $callc . '();' );
    if( $x != 3 ) die( 'Bad numbers' );
}
echo( "eval took " . (microtime( true ) - $time) . " seconds.<br />" );

?>
Marco 05-Oct-2005 01:42
>phil at gettcomm dot com
>22-May-2002 04:51
>if you need to get a reference back from a method, you can work around
>call_user_func()'s shortcomings like this:
>
Naaa! Having back a reference is a real problem, but it can be solved by mean of eval(), instead of using call_user_func:

<?php
  class Node {
    var $name;
    var $child;
    function Node ( $name ) { $this->name = $name; }
    function &getChild () { return $this->child; }
  }
  $p = new Node ( 'Father' );
  $c = new Node ( 'Child' );
  $p->child = &$c;

  eval ( "\\$cref = &\\$p->getChild ();" );
  $cref->name = 'Another Child';

  // Prints out 'Another Child'
  echo "****** After eval c = " . $c->name . "\\n\\n";

?>
info at webseiteselberpflegen dot de 18-May-2005 01:00
It seems like call_user_func() can not be used to create Objects via the new Command.

The Following example dosen't work:

<?php
  include_once(class_".$type.".php");
  $object = new call_user_func ('bdv_'.$type);
?>

But this works:

<?php
    include_once(class_".$type.".php");
    $constr = 'bdv_'.$type;
    $object = new $constr();
?>
24-Feb-2005 07:46
<?php
/*
    A very simple event handler dispose and change the latest one I did
*/

class Duke
{
//public:
    var $m_pRaiser;
    var $m_strRaiserFun;
    var $m_objArgs;
//public:
    function Duke(  $pRaiser,
            $strRaiserFun,
            $objArgs )
    {
        $this ->m_pRaiser      = $pRaiser;
        $this ->m_strRaiserFun = $strRaiserFun;
        $this ->m_objArgs      = $objArgs;

    }//end of constructor

}//end of class Duke

class A
{
//protected:
    function OnEventHandler( $sender, $args )//virtual
    {
        $sender ->SayHello();
    }//end of OnEventHandler( $sender, $args )

//public:
    function OnEvent( $pDuke = null )
    {
        if( $pDuke == null )
        {
            call_user_func( array( &$this, "OnEventHandler" ), $this, null );
            return;
        }

        call_user_func( array( $pDuke ->m_pRaiser, $pDuke ->m_strRaiserFun ), $pDuke ->m_pRaiser, $pDuke ->m_objArgs );

    }//end of  OnEvent( $pDuke )

    function SayHello()//virtual
    {
        echo "A::SayHello" . "<br>";
    }//end of SayHello()

}//end of class A

class B extends A
{
//public:
    function SayHello()//override
    {
        echo "B::SayHello" . "<br>";
    }//end of SayHello()

}//end of class B

//////////////////////////////////////////////////////////////////////
//Main import to test
//
$a = &new A();
$b = &new B();

$pDuke = &new Duke( $b, "OnEventHandler", null );

$b ->OnEvent();
$b ->OnEvent( $pDuke );
?>
zxy at estec-jp dot com 24-Feb-2005 02:57
A simple event handler dispose released by useful callback in PHP 4.x

<?php
class Duke
{
//public:
    var $m_pRaiser;
    var $m_strRaiserFun;
    var $m_objArgs;
//public:
    function Duke(  $pRaiser,
            $strRaiserFun,
            $objArgs )
    {
        $this ->m_pRaiser      = $pRaiser;
        $this ->m_strRaiserFun = $strRaiserFun;
        $this ->m_objArgs      = $objArgs;

    }//end of constructor

}//end of class Duke

class A
{
//protected:
    function OnEventHandler( $sender, $args )//virtual
    {
        $sender ->SayHello();
    }//end of OnEventHandler( $sender, $args )

//public:
    function OnEvent( $pDuke )
    {
        call_user_func( array( $pDuke ->m_pRaiser, $pDuke ->m_strRaiserFun ), $pDuke ->m_pRaiser, $pDuke ->m_objArgs );
    }//end of  OnEvent( $pDuke )

    function SayHello()//virtual
    {
        echo "A::SayHello" . "<br>";
    }//end of SayHello()

}//end of class A

class B extends A
{
//public:
    function SayHello()//override
    {
        echo "B::SayHello" . "<br>";
    }//end of SayHello()

}//end of class B

///////////////////////////////////////////////////////////
//Main import to test
//
$a = &new A();
$b = &new B();

$pDuke = &new Duke( $b, "SayHello", null );
$b ->OnEvent( $pDuke );
?>
arjini at mac dot com 29-Mar-2004 05:04
Some of the wierder examples below confused me, and made me think that the following would work (but it does!).

<?php

class barber{
    function shop($one,$two,$three,$four='quartet'){
        echo $one.','.$two.','.$three.','.$four;
    }
}

$bsq = new barber;
call_user_func(array(&$bsq,'shop'),'one','two','three');

/* Output = one,two,three,quartet */

class bigBarber{
    var $quartet;
    function bigBarber(){
        $this->quartet = 'four';
    }
    function shop($one,$two,$three,$five='quintet'){
        echo $one.','.$two.','.$three.','.$this->quartet.','.$five;
    }
}

$bbsq = new bigBarber();
call_user_func(array(&$bbsq,'shop'),'one','two','three');

/* Output = one,two,three,four,quintet */

?>
Kris Koskelin 22-Jan-2004 03:21
I was trying to use this function to call a method of an already-instantiated object.  I needed to do this with the object itself, not simply call the class' method.

To accomplish this, I really avoided this particular function altogether like this:

<?php
if ( method_exists($my_obj, $action) ){
     return $my_obj->{$action}();
}
?>

I hope someone else finds this useful.  Note that doing this allows you to pass params to the function more-or-less in the same way you would to any other class method.
Michele.Manzato at verona.miz.it 29-Sep-2003 08:49
With overload()ed classes call_user_func_* calls real class methods only. If the method does not exist then PHP does not try with the "__call()" magic method (at least until PHP 4.3.3). See this:

<?php
class A
{
    function A() {}

    function __call($method, $args, &$ret) {
        echo "__call(): You called '{$method}()'<br>\n";
        return true;
    }

    function regular() {
        echo "You called 'regular()'<br>\n";
    }
};
overload("A");

$a = new A;

$a->regular();                          // Works, calls regular()
call_user_func(array(&$a, "regular"));  // Works, calls regular()

$a->hello();                            // Works, calls __call()
call_user_func(array(&$a, "hello"));    // Does NOT work!
?>
Carl 28-Jul-2003 11:53
I had a problem where I wanted to parameterize a callback. The end called was in an external class, but I needed to save some state for the callback that didn't make sense to keep in the original object, as it might change from call to call...

<?php
class foo
{
    function foo()
    {
        $str = "Hello There";

        $str2 = "Carl";

        $that =& new holder($str);

        call_user_func(array(&$that, 'callback'), $str2);
    }
}

class holder
{
    function holder($aParam)
    {
        $this->param = $aParam;
    }

    function callback($aStr)
    {
        echo "A=$this->param, B=$aStr\n";
    }
}
?>
dougqh at hotmail dot com 07-Mar-2002 05:16
The previous note I posted had an error in the source code.  That has been corrected in this note.

Note, that returning by reference does not work properly when the function
is called using call_user_func.

This example illustrates the problem...

<?php
$globalVar = 0;

function &staticFunction()
{
   global $globalVar;

   return $globalVar;
}

$result =& call_user_func( "staticFunction" );

$result = 3;

print "result:" . $result . "<br/>\n";
print "globalVar: " . $globalVar . "<br/>\n";

$result2 =& staticFunction();

$result2 = 3;

print "result2: " . $result2 . "<br/>\n";
print "globalVar: " . $globalVar . "<br/>\n";
?>

The above code results in the following output ...
Note that $result is not a reference to $globalVar.

result:0
globalVar: 0
result2: 3
globalVar: 3

Also, the use of call_user_method is now deprecated in favor of passing
array( &$object, $method ) as the function to call_user_func.  This is
reported when error reporting is set to E_ALL in the latest versions of
PHP.
danyloco at yahoo dot com 17-Jul-2001 04:31
I was trying to call multiple functions within a class, and after a brain frying experience this is what came out... hope it helps:

<?php
class Foo {
 function hey1($id){echo "In hey1";}
 function hey2($id){echo "In hey2";}
 #... and so forth ...
 function runtest($id) {
   #the fun part :)
   for($i=1; $i<=2; $i++) {
     $fp = "hey".$i;
     $this->$fp($id);
}
}
}
?>

It worked like a charm :).


Crée une fonction anonyme

  • « call_user_func
  • forward_static_call_array »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Crée une fonction anonyme

create_function

(PHP 4 >= 4.0.1, PHP 5, PHP 7)

create_function — Crée une fonction anonyme

Avertissement

Cette fonctionnalité est OBSOLÈTE à partir de PHP 7.2.0 et a été SUPPRIMÉE à partir de PHP 8.0.0.

Description

create_function ( string $args , string $code ) : string

create_function() crée une fonction anonyme, à partir des paramètres passés, et retourne un nom de fonction unique.

Attention

Cette fonction, en interne, utilise la fonction eval() et donc les exigences en terme de sécurité sont identiques à celles de la fonction eval(). De plus, les performances ne sont pas au rendez-vous et l'usage mémoire est significatif.

Si vous utilisez PHP 5.3.0 ou supérieur, une fonction anonyme native doit être utilisée à la place.

Liste de paramètres

Généralement, les arguments args sont présentés sous la forme d'une chaîne à guillemets simples, et la même recommandation vaut pour code. La raison de l'utilisation des guillemets simples est de protéger les noms de variables du remplacement par leur valeur. Si vous utilisez les guillemets doubles, n'oubliez pas d'échapper les noms de variables (i.e. \$avar).

args

Les arguments de la fonction.

code

Le code de la fonction.

Valeurs de retour

Retourne un nom de fonction unique, sous la forme d'une chaîne de caractères, ou false si une erreur survient.

Exemples

Exemple #1 Création d'une fonction anonyme avec create_function()

Vous pouvez utiliser cette fonction pour (par exemple) créer une fonction à partir d'informations récoltées durant l'exécution :

<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "Nouvelle fonction anonyme  : $newfunc\n";
echo $newfunc(2, M_E) . "\n";
// affichera :
// Nouvelle fonction anonyme : lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>

Ou, pour pouvoir appliquer une fonction générique à une liste d'arguments.

Exemple #2 Traitement générique par fonction avec create_function()

<?php
function process($var1, $var2, $farr)
{
    foreach ($farr as $f) {
        echo $f($var1, $var2) . "\n";
    }
}

// Création d'une série de fonctions mathématiques
$f1 = 'if ($a >=0) {return "b*a^2 = ".$b*sqrt($a);} else {return false;}';
$f2 = "return \"min(b^2+a, a^2,b) = \".min(\$a*\$a+\$b,\$b*\$b+\$a);";
$f3 = 'if ($a > 0 && $b != 0) {return "ln(a)/b = ".log($a)/$b; } else { return false; }';
$farr = array(
    create_function('$x,$y', 'return "un peu de trigo : ".(sin($x) + $x*cos($y));'),
    create_function('$x,$y', 'return "une hypoténuse : ".sqrt($x*$x + $y*$y);'),
    create_function('$a,$b', $f1),
    create_function('$a,$b', $f2),
    create_function('$a,$b', $f3)
    );

echo "\nUtilisation de la première liste de fonctions anonymes\n";
echo "paramétres : 2.3445, M_PI\n";
process(2.3445, M_PI, $farr);

// Maintenant une liste de fonctions sur chaîne de caractères
$garr = array(
    create_function('$b,$a', 'if (strncmp($a, $b, 3) == 0) return "** \"$a\" '.
    'and \"$b\"\n** Look the same to me! (looking at the first 3 chars)";'),
    create_function('$a,$b', '; return "CRCs : " . crc32($a) . ", ".crc32($b);'),
    create_function('$a,$b', '; return "similarité (a,b) = " . similar_text($a, $b, &$p) . "($p%)";')
    );
echo "\nUtilisation de la seconde liste de fonctions anonymes\n";
process("Twas brilling and the slithy toves", "Twas the night", $garr);
?>

L'exemple ci-dessus va afficher :

Utilisation de la première liste de fonctions anonymes
paramètres : 2.3445, M_PI
un peu de trigo : -1.6291725057799
une hypoténuse : 3.9199852871011
b*a^2 = 4.8103313314525
min(b^2+a, a^2,b) = 8.6382729035898
ln(a)/b = 0.27122299212594

Utilisation de la seconde liste de fonctions anonymes
** "Twas the night" and "Twas brilling and the slithy toves"
** Ces chaînes se ressemblent ! (regardez les trois premiers caractères)
CRCs: -725381282, 342550513
similarité (a,b) = 11(45.833333333333%)

Mais l'utilisation la plus courante des fonctions lambda est la fonction de rappel, par exemple, lors de l'utilisation de array_walk() ou usort()

Exemple #3 Utilisation de fonctions anonymes comme fonction de rappel

<?php
$av = array("la ", "une ", "cette ", "une certaine ");
array_walk($av, create_function('&$v,$k', '$v = $v . "maison";'));
print_r($av);
?>

L'exemple ci-dessus va afficher :

Array
(
  [0] => la maison
  [1] => une maison
  [2] => cette maison
  [3] => une certaine maison
)

un tableau de chaînes de caractères ordonnées de la plus courte à la plus longue

<?php

$sv = array("petite", "longue", "une très longue chaîne", "une phrase toute entière");
print_r($sv);

?>

L'exemple ci-dessus va afficher :

Array
(
  [0] => petite
  [1] => longue
  [2] => une très longue chaîne
  [3] => une phrase toute entière
)

ordonnées de la plus longue à la plus courte

<?php

usort($sv, create_function('$a,$b','return strlen($b) - strlen($a);'));
print_r($sv);

?>

L'exemple ci-dessus va afficher :

Array
(
  [0] => une phrase toute entière
  [1] => une très longue chaîne
  [2] => longue
  [3] => petite
)

Voir aussi

  • Fonctions anonymes

User Contributed Notes

tomas dot vot at gmail dot com 16-Dec-2018 01:17
If you need to upgrade more than one `create_function` to anonymous function, I'm working on a tool that makes dev's life much easier and adaptable for new versions of anything in PHP.

It's tested on 30+ various (and really weird :)) cases, like:

    -$callback = create_function('$a', 'return "<cas:proxy>$a</cas:proxy>";');
    +$callback = function ($a) {
    +    return "<cas:proxy>{$a}</cas:proxy>";
    +};

Includes concat (.), string quotes and inclined function calls:

    -$func = create_function('$atts, $content = null','return "<div class=\"' . $class_list . '\">" . do_shortcode($content) . "</div>";' );
    +$func = function ($atts, $content = null) use ($class_list) {
    +    return "<div class=\"{$class_list}\">" . do_shortcode($content) . "</div>";
    +};

Do you want to automate the hard work?

1. Instal Rector

    composer require rector/rector --dev

2. Create config

    # rector.yml
    services:
        Rector\Php\Rector\FuncCall\CreateFunctionToAnonymousFunctionRector: ~

3. Upgrade your Code

    vendor/bin/rector process src --config rector.yml --dry-run
    vendor/bin/rector process src --config rector.yml
tamagochi_man 09-Oct-2018 07:44
Whilst it was correct 11 years ago, the statement of Dan D is not so correct any more? Anonymous functions are now objects of a class Closure and are safely collected by garbage collector.
kexianbin at diyism dot com 10-Jun-2014 04:52
I use this create_closure() in my work to seperate callbacks into Classes:
<?php
function create_closure($fun, $args, $uses)
         {$params=explode(',', $args.','.$uses);
          $str_params='';
          foreach ($params as $v)
                  {$v=trim($v, ' &$');
                   $str_params.='\''.$v.'\'=>&$'.$v.', ';
                  }
          return "return function({$args}) use ({$uses}) {{$fun}(array({$str_params}));};";
         }
?>

example:
<?php
$loop->addPeriodicTimer(1, eval(create_closure('pop_message', '$timer', '$cache_key, $n, &$response, &$redis_client')));

function pop_message($params)
         {extract($params, EXTR_REFS);
          $redis_client->ZRANGE($cache_key, 0, $n)
                            ->then(//normal
                                   function($data) use ($cache_key, $n, &$timer, &$response, &$redis_client)
                                   {//...
                                   },
                                   //exception
                                   function ($e) use (&$timer, &$response, &$redis_client)
                                   {//...
                                   }
                                  );
         }
?>
coleyeder at gmail dot com 01-Oct-2013 04:29
Default values works:

<?php

$f = create_function('$a,$b=3', 'var_dump($a, $b);');
$f(1);

// output:

// int(1)
// int(3)

?>
CertaiN 19-Sep-2013 11:49
Best wapper:

<?php

function create_lambda($args, $code) {
    static $func;
    if (!isset($func[$args][$code])) {
        $func[$args][$code] = create_function($args, $code);
    }
    return $func[$args][$code];
}
ionix at NOSPAM dot post dot com 05-Sep-2013 04:56
I experimented a bit in creating a lambda function using a variable amount of arguments. While I couldn't find an efficient way to create a random bit of code, I was able to get it to behave as a front end for existing functions (as well as user-defined of course).

The code required me to use the dreaded eval() function to get it to use a variable amount of parameters, so be sure that all input is thoroughly cleaned if derived from the user.

<?php

    function run_function( $function )
    {
        // Get Arguments, Unset Exisitng Parameter
        $params = func_get_args();
        unset( $params[0] );

        if( ( $count = count( $params ) ) > 0 )
        {
            $args = '$a';
            $inc = 'b';

            // Create Argument String - Formats as '$a, $b, $c' Per Number of Arguments
            for( $x = 1; $x < $count; $x++ )
            {
                $args .= ', $' . $inc;
                $inc++;
            }

            // Create Lambda Function and Format Paramters
            $lambda = create_function( $args, 'return ' . $function . '(' . $args . ');' );
            $params = "'" . implode('\', \'', $params) . "'";

            // Build and Evaluate Function with Parameters
            $eval = '$return = $lambda(' . $params . ');';
            eval($eval);

            return $return;
        }
        else
        {
            return false;
        }
    }
?>

For most applications you would be better off calling the function normally. Perhaps this little proof of concept may find some use if adapted to work by someone who requires it.
CertaiN 25-Aug-2013 06:20
How to save memory-space:

<?php

function create_lambda($args, $code) {
    static $list = array();
    $i = "{$args}\0{$code}";
    if (!isset($list[$i])) {
        $list[$i] = create_function($args, $code);
    }
    return $list[$i];
}
kak dot serpom dot po dot yaitsam at gmail dot com 27-Jun-2012 12:17
Try this to boost performance of your scripts (increase maxCacheSize):

<?php
runkit_function_copy('create_function', 'create_function_native');
runkit_function_redefine('create_function', '$arg,$body', 'return __create_function($arg,$body);');

function __create_function($arg, $body) {
    static $cache = array();
    static $maxCacheSize = 64;
    static $sorter;

    if ($sorter === NULL) {
        $sorter = function($a, $b) {
            if ($a->hits == $b->hits) {
                return 0;
            }

            return ($a->hits < $b->hits) ? 1 : -1;
        };
    }

    $crc = crc32($arg . "\\x00" . $body);

    if (isset($cache[$crc])) {
        ++$cache[$crc][1];
        return $cache[$crc][0];
    }

    if (sizeof($cache) >= $maxCacheSize) {
        uasort($cache, $sorter);
        array_pop($cache);
    }

    $cache[$crc] = array($cb = eval('return function('.$arg.'){'.$body.'};'), 0);
    return $cb;
}
?>
131 dot php at cloudyks dot org 01-Jun-2012 10:54
For those who want to create closure with create_function, don't bother, you can't.
Use create_closure instead :p

<?php
//same thing as create_function, but returns a closure..( 5.4)
function create_closure($args, $body){
  return eval("return function($args){ {$body}  };");
}
?>
Dave H 24-Mar-2011 06:47
The following function is very useful for creating an alias of a user function.
For built-in functions, it is less useful because default values are not available, so function aliases for built-in functions must have all parameters supplied, whether optional or not.

<?php
function create_function_alias($function_name, $alias_name)
{
    if(function_exists($alias_name))
        return false;
    $rf = new ReflectionFunction($function_name);
    $fproto = $alias_name.'(';
    $fcall = $function_name.'(';
    $need_comma = false;

    foreach($rf->getParameters() as $param)
    {
        if($need_comma)
        {
            $fproto .= ',';
            $fcall .= ',';
        }

        $fproto .= '$'.$param->getName();
        $fcall .= '$'.$param->getName();

        if($param->isOptional() && $param->isDefaultValueAvailable())
        {
            $val = $param->getDefaultValue();
            if(is_string($val))
                $val = "'$val'";
            $fproto .= ' = '.$val;
        }
        $need_comma = true;
    }
    $fproto .= ')';
    $fcall .= ')';

    $f = "function $fproto".PHP_EOL;
    $f .= '{return '.$fcall.';}';

    eval($f);
    return true;
}
?>
phenno7 [a_t] yahoo dot com 15-Sep-2010 01:53
The function takes as arguments the tree array, the category id on which i want the retrieval, and the depth level for which i would like the subcategories ids returned.

this saves me a LOT of time on large adjacency list trees.

<?php
$ctg_tree = array(
'1'=>array('parent_id'=>0,
           'children'=>array(
          '2'=>array('parent_id'=>1,
                      'children'=>array(
                      '3'=>array('parent_id'=>2))),
           '4'=>array('parent_id'=>1,
                      'children'=>array(
                      '5'=>array('parent_id'=>4),
                      '6'=>array('parent_id'=>4))))));

function getSubCategories($ctg_tree, $id, $level = null) {

        $getBranchIds =
create_function(
'$tree, $ctg_id, $level = null, $arr = null,'.
' $push = false, $getBranchIds','
            if(!$arr) {
                $arr = array();
            }
            if(intval($level) && $push){
                $level--;
            }

            foreach($tree as $key=>$ctg) {
                if($push) {
                    $arr[] = $key;
                }
                if($ctg_id == $key) {
                    $start = true;
                    $push = true;
                }
if(count($ctg[\'children\']) && (intval($level) || $level === null)) {
$getBranchIds(
$ctg[\'children\'],$ctg_id,$level,&$arr,$push,$getBranchIds
);
                }
                if($start) return $arr;
            }

            return $arr;');

return $getBranchIds(
$ctg_tree, $id, $level, null, false, $getBranchIds
);
    }

print_r(getSubCategories($ctg_tree, 4, 1));
?>

Array
(
    [0] => 5
    [1] => 6
)

print_r(getSubCategories($ctg_tree, 1, 1));

Array
(
    [0] => 2
    [1] => 4
)

<?php
print_r(getSubCategories($ctg_tree, 1));
?>

Array
(
    [0] => 2
    [1] => 3
    [2] => 4
    [3] => 5
    [4] => 6
)
Its Will 01-Sep-2010 08:27
If you create a function that will only be used from an object context (i.e. you want a dynamic method that can then call methods from the original object, still maintaining access to the object's runtime values) then you can use the following functions I have created (ob_lambda_func and ob_lambda) to enable the dynamic function to easily call *public* methods on the object, in their runtime contexts:

<?php
/* the OB Lambda functions allow a lambda function to call a method from its callee's object */
if(!function_exists('ob_lambda_func')){
function ob_lambda_func($method, $args) {
   if((phpversion()+0)<5.1 || (substr(phpversion(),2)+0)<1.1)
       die("\nError: This script requires PHP v5.1.1+!\n");
   $bt=debug_backtrace();
   foreach($bt as $xsp) {
       if(isset($xsp['object'])) {
           if(!method_exists($xsp['object'], $method)) continue;
           return call_user_func_array(array($xsp['object'], $method), $args);
       }
   }
   if(!function_exists($method))
       die("\nOB: Internal Error! ($method)");
   return call_user_func_array($method, $args);
}}
if(!function_exists('ob_lambda')){
function ob_lambda($method) {
   return create_function('','$args=func_get_args(); return ob_lambda_func('.var_export($method, true).',$args);');
}}

/* Usage:
 *   For each callable method, store the results of ob_lambda('method_name')
 *   When a lambda function you call wants to access one of these methods,
 *    you need to pass it the result of ob_lambda for that method, the easiest
 *    way is to have one of the lambda functions arguments accept the result
 *       i.e.:  $myFunc=ob_lambda('myMethod');
 *              $lf1=create_function('$func', '$func( ... args ... )');
 *              $lf1($myFunc);
 *    because create_function prepends a \0 to the function name, it is difficult
 *    to pass the result of ob_lambda to the target function without using an argument
 */
/* here is an example -- lambda function Foo::test can call Foo::Bar and Foo::Baz, and these  */
class Foo {
    private $bar, $baz, $test;
    private $runtimeValue=0;
    function __construct() {
        $this->runtimeValue=rand();
        $this->bar=ob_lambda('Bar');
        $this->baz=ob_lambda('Baz');
        $this->test=create_function(
            '$bar, $baz',
            '$bar("Hello, World!"); $baz();'
        );
    }
    function Test() {
        $fn=$this->test;
        $fn($this->bar, $this->baz);
    }
    function Bar($a) {
        echo "$a: Bar ($this->runtimeValue)\n";
    }
    function Baz() {
        echo "and another! Baz ($this->runtimeValue)\n";
    }
}

$foo=new Foo();
// Foo::Bar("Testing Other Method"); <-- this causes fatal error
//  (using $this when not in object context)
$foo->Test();

?>

This snippet (with test) shows how the lambda function $foo->test can call Foo::Bar and Foo::Baz without an explicit reference to the original object. The methods are run from their object context, and so can access the runtime-modified variable $foo->runtimeValue, which is set to a random number on construction.
The function definition for $foo->test is the following:
function ($bar, $baz) {
    $bar("Hello, World!");
    $baz;
}
As you can see, it is clean and simple, with no obvious artifacts from the use of OB Lambda

The expected output should be:
Hello, World!: Bar (440048505)
and another! Baz (440048505)

Or any other random number in place of 440048505
Make sure, before you change your code, that your target server has PHP 5.1.1+, or these functions won't work and will return an error!
Hope this helps anyone as much as it has me! :)
julius _email _me _at grantzau _dot _com 16-Jul-2010 09:59
To avoid memory problems, when creating a dynamic function within loops, register it as a global variable, and check if it has already been set;

<?php
global $my_func;
if (!isset($my_func))
{
    $my_func = create_function($args, $code);
}

$my_func();
?>

That way you don't end up creating the same function twice (or a couple of million of times, as it happened to me...)
v dot churakov at i2d dot ru 20-Feb-2010 04:56
<?

function is_function( &$mixed )
{
    if ( is_object( $mixed ) ) {
        return ( $mixed instanceof Closure );
    } elseif( is_string( $mixed ) ) {
        return function_exists( $mixed );
    } else {
        return false;
    }
}

function myfunc(){}

$test = 123;
echo  is_function( $test ); //will return false

$test = 'isset';
echo  is_function( $test ); //will return false... it's not work with reserved :( ...

$test = 'myfunc';
echo  is_function( $test ); //will return true

$test = create_function( '', 'echo 123;' );
echo  is_function( $test ); //will return true

$test = function () { echo 123; };
echo  is_function( $test ); //will return true

?>
edgar at goodforall dot eu 02-Jul-2009 07:45
Just a little toy I thought up, I would like to share. Creates an anonymous function, which let you use a class  as a function.

In php 5.3 there is support for real functors  (trough __invoke):

<?php
function createFunctor($className){
        $content = "
                static \$class;
                if(!\$class){
                        \$class = new $className;
                }
                return \$class->run(\$args);
        ";
        $f = create_function('$args', $content);
        return $f;

}
class test {
        public function run($args){
                print $args;
        }
}
$test = createFunctor('test');
$test('hello world');
?>
Stefan Scheld 23-Sep-2008 07:48
Workaround is as follows:

<?php
class Foo {
    function setHandler($handlerName, $handlerCode) {
        $this->handlerFunctions[$handlerName] = create_function('&$self, $dataArr', $handlerCode);
// NOTE: $this not allowed here, using $self as replacement
    }

    function executeHandler($handlerName, $dataArr) {
        if($this->handlerFunctions[$handlerName]) {
                $this->handlerFunctions[$handlerName](&$this, $dataArr);
            }
     }

    function getConstantInfo($what) {
        return($what);
    }
}

$bla = new Foo;

$bla->setHandler("load", 'echo($self->getConstantInfo("name")."\n");');
$bla->executeHandler("load", array("foo" => "bar"));
?>
neo at nowhere dot com 28-Aug-2008 01:56
In response to kkaiser at revolution-records dot net's note, even tho PHP will allow you to use
<?
$myfunc = create_function('$this', $code);
?>
You can NOT use a reference to "$this" inside of the anonymous function, as PHP will complain that you are using a reference to "$this" in a non-object context.

Currently, I have not found a work-around for this...
Alan FUNG 07-Aug-2008 12:24
$f = create_function('','echo "function defined by create_function";');
$f();

result:
function defined by create_function

You may define no return in function body while you are using create_function.
Rene Saarsoo 06-Feb-2008 02:31
Here has been some discussion about the "memory leak" create_function() can create.

What create_function() actually does, is creating an ordinary function with name chr(0).lambda_n where n is some number:

<?php
$f = create_function('', 'return 1;');

function lambda_1() { return 2; }

$g = "lambda_1";
echo $g(); // outputs: 2

$h = chr(0)."lambda_1";
echo $h(); // outputs: 1
?>
colin dot mckinnon at gmail dot com 20-Aug-2007 05:51
In response to koyama at hoge dot org (14-Dec-2000):

This does NOT create a new method - try adding this at the end:

<?php
if (function_exists($h->lamda)) {
   print "Its a function\n";
} else {
   print "No it isnt";
}
?>

It creates a function which $h->lamda points to.

Under PHP4 you could simply add an argument $this which meant it *behaved* like a method (though it existed in global scope) but with PHP5, you can't have a variable named $this in a function (which is rather irksome).

(and methinks the ant-bot challenge is taking the mickey - min(three, four)?  !).
TSE-WebDesign 18-Aug-2007 09:55
Here's how to call a runtime-created function from another runtime-created function:
<?php
        $get_func = create_function('$func', 'return substr($func,1);');
        $get_value = create_function('$index','return pow($index,$index);');
        $another_func = create_function('$a', '$func="\x00"."'.$get_func($get_value).'";return $func($a);');
        echo $another_func(2); # result is 4
?>
kkaiser at revolution-records dot net 13-Apr-2007 01:10
In the process of migrating a PHP4 codebase to PHP5, I ran into a peculiar problem. In the library, every class was derived from a generic class called 'class_container'. 'class_container' contained an array called runtime_functions and a method called class_function that was as follows:

<?php
function class_function($name,$params,$code) {

  $this->runtime_functions[$name] = create_function($params,$code);

}
?>

In a subclass of class_container, there was a function that utilized class_function() to store some custom lambda functions that were self-referential:

<?php
function myfunc($name,$code) {

  $this->class_function($name,'$theobj','$this=&$theobj;'.$code);

}
?>

In PHP4, this worked just fine. The idea was to write blocks of code at the subclass level, such as "echo $this->id;", then simply $MYOBJ->myfunc("go","echo $this->id;"); and later call it like $MYOBJ->runtime_functions["go"]();

It essentially worked exactly like binding anonymous functions to objects in Javascript.

Note how the "$this" keyword had to be manually redefined for the $code block to work.

In PHP5, however, you can't redeclare $this without getting a fatal error, so the code had to be updated to:

<?php
function myfunc($name,$code) {

  $this->class_function($name,'$this',$code);

}
?>

Apparently create_function() allows you to set $this via a function argument, allowing you to bind anonymous functions to instantiated objects. Thought it might be useful to somebody.
Dan D 23-Oct-2006 07:22
Beware when using anonymous functions in PHP as you would in languages like Python, Ruby, Lisp or Javascript.  As was stated previously, the allocated memory is never released; they are not objects in PHP -- they are just dynamically named global functions -- so they don't have scope and are not subject to garbage collection.

So, if you're developing anything remotely reusable (OO or otherwise), I would avoid them like the plague.  They're slow, inefficient and there's no telling if your implementation will end up in a large loop.  Mine ended up in an iteration over ~1 million records and quickly exhasted my 500MB-per-process limit.
Phlyst 06-Oct-2006 05:10
In reply to info at adaniels dot nl:

You may not be able to use __FUNCTION__ in a lambda (thanks for pointing it out; I was having that problem just now), but you can use $GLOBALS to work around it if you're assigning the function to a variable. I reimplemented array_walk_recursive() in PHP4 like this:

<?php
$array_walk_recursive = create_function('&$array, $callback',
    'foreach($array as $element) {
        if(is_array($element)) {
            $funky = $GLOBALS["array_walk_recursive"];
            $funky($element, $callback);
        }
        else {
            $callback($element);
        }
    }');
?>
Josh J 27-Sep-2006 12:45
In regards to the recursion issue by info at adaniels dot nl

Anon function recursion by referencing the function variable in the correct scope.
<?php
$fn2 = create_function('$a', 'echo $a; if ($a < 10) call_user_func($GLOBALS["fn2"], ++$a);');
$fn2(1);
?>
info at adaniels dot nl 10-May-2006 03:42
Note that using __FUNCTION__ in a an anonymous function, will always result '__lambda_func'.

<?php
    $fn = create_function('', 'echo __FUNCTION__;');
    $fn();
    // Result: __lambda_func
    echo $fn;
    // Result: ºlambda_2 (the actual first character cannot be displayed)
?>

This means that a anonymous function can't be used recursively. The following code (recursively counting to 10) results in an error:
<?php
    $fn2 = create_function('$a', 'echo $a; if ($a < 10) call_user_func(__FUNCTION__, $a++);');
    $fn2(1);
    // Warning: call_user_func(__lambda_func) [function.call-user-func]: First argument is expected to be a valid callback in T:/test/test.php(21) : runtime-created function on line 1
?>
josh at janrain dot com 03-Mar-2006 10:21
Beware! This is merely a convenience function that generates a unique name for a regular function. It is *not* a closure or even an anonymous function. It is just a regular function that gets named for you.
Joshua E Cook 19-Jan-2006 04:43
Functions created by create_function() cannot return a value by reference.  The function below creates a function that can.  The arguments are the same as create_function().  Note that these arguments are passed, unmodified, to eval(), so be sure that data passed in is sanitized.

<?php
/**
 * create_ref_function
 * Create an anonymous (lambda-style) function
 * which returns a reference
 * see http://php.net/create_function
 */
function
create_ref_function( $args, $code )
{
    static $n = 0;

    $functionName = sprintf('ref_lambda_%d',++$n);

    $declaration = sprintf('function &%s(%s) {%s}',$functionName,$args,$body);

    eval($declaration);

    return $functionName;
}
?>
boards at gmail dot com 31-Dec-2005 11:18
If you were checking to see if a function is made properly, this would be a better way of checking:

<?php
$fnc = @create_function('$arg1,$arg2,$arg3', 'return true;');
# make that function whatever you want
if (empty($fnc)) {
  die('Could not create function $fnc.');
}

# although, the follow will NOT work
if (empty(create_function('$arg', 'return $arg;'))) {
  die('Could not create anonymous function.');
}
# you would get an error regarding not being able to use a
# return value in writeable context (i.e. a return value is
# a const in C, and the function empty() doesn't use a
# const void* parameter
?>
david [at] davelee.com.au 13-Apr-2005 02:15
<?php
# dynamically create html helper functions which take the args
# $string_contents, $optional_hash_of_options
# and return the contents wrapped in a tag

$html_funcs = Array(
    'table',
    'tr',
    'th',
    'td',
    'div',
    'span',
    'pre',
    'strong',
    'em'
);
$args = '$html, $options=Array()';
$code = '
  $o = "";
  foreach ($options as $a => $b) {
    $o .= " $a=\"$b\"";
  }
  return "<$tag$o>$html</$tag>";
';
foreach ($html_funcs as $key => $tag) {
    ${$tag} = create_function($args, "\$tag = '$tag'; $code");
}

# usage example:

print $table(
  $tr($th('heading').$td('this is the cell content')),
  Array('style'=>'border: 1px solid silver;')
);
?>
MagicalTux at FF.ST 09-Mar-2004 10:25
neo at gothic-chat d0t de wrote :
Beware of memory-leaks, the garbage-collection seems to 'oversee' dynamically created functions!

Not really...

In fact, PHP can not "unassign" functions. So if you create a function, it won't be deleted until the end of the script, even if you unset the variable containing its name.

If you need to change a part of a function everytime you run a loop, think of a way to make a more general function or try using eval :) (functions are made to be re-used. If you need to run your own piece of code once, eval is much better).
neo at gothic-chat d0t de 20-Jan-2004 08:54
Beware of memory-leaks, the garbage-collection seems to 'oversee' dynamically created functions!

I used a function like this to replace special characters in links with their htmlentities:
<?php
$text = preg_replace_callback (
    "/(<(frame src|a href|form action)=\")([^\"]+)(\"[^>]*>)/i",
    create_function (
        '$matches',
        'return $matches[1] . htmlentities ($matches[3]) . $matches[4];'
    ),
    $text);
?>

After 1000 calls, the process used about 5MB more than before. In my situation this boosted up the memory-size of one PHP-process up to over 100MB!

In such cases, better store the function in a global variable.
nospam at fiderallalla dot de 08-Aug-2003 06:39
Sometimes it may be useful to create functions in a dynamic environment
(f. e. in a daemon-like php script).

Normally declaring a function must be done once, which results in the problem,
that in this special case modifying a function wouldn't have an effect until the script is reloaded.

Maybe this code snipplet is useful 4 u.

File: "functions.inc"

<?php
function test($str) {
    echo $str;
}
?>

Dynamic FunctionHandler:

<?php
$FileName = "functions.inc";
$FileHandle = fopen($FileName,"r");
$FileContent = fread($FileHandle,filesize($FileName));
fclose($FileHandle);

preg_match_all("#function\ ?([a-zA-Z0-9-_]*)\ ?\((.*?)\)\ ?\{(.*?)\}#mixse",$FileContent,$Matches);
if ( is_array($Matches) && isset($Matches[0]) && count($Matches[0]) > 0  ) {
     foreach ( $Matches[0] as $key=>$val ) {
        $$Matches[1][$key] = create_function($Matches[2][$key],$Matches[3][$key]);
    }
}
?>

The Test:
<?php echo $test("test"); ?>
.. will echo "test";

Hans Kuhlen
DB on music_ml at yahoo dot com dot ar 02-Apr-2003 04:58
[EDIT by danbrown AT php DOT net: Combined user-corrected post with previous (incorrect) post.]

You can't refer to a class variable from an anonymous function inside a class method using $this.  Anonymous functions don't inherit the method scope.  You'll have to do this:

<?php
class AnyClass {

 var $classVar = 'some regular expression pattern';

 function classMethod() {

   $_anonymFunc = create_function( '$arg1, $arg2', 'if ( eregi($arg2, $arg1) ) { return true; } else { return false; } ' );

   $willWork = $_anonymFunc('some string', $classVar);

 }

}
?>
ben-php at bacarisse dot btinternet dot co dot uk 26-Jul-2001 01:33
A nice technique for building complex search patterns on lists, files or whatever is to build function combining functions like this:

<?php
function _not_($f) {
  return create_function('$x',
    "return !$f(\$x);");
}

function _and_($f, $g) {
  return create_function('$x',
    "return $f(\$x) && $g(\$x);");
}
?>

(similarly for _or_ and others...).  Once you've built your matching primitives you can then build more complex matches into your script.

Unfortunately, as explained in (closed) bug #10721, the function names returned by create_function have a null byte at the front and this causes a parse error.

You can fix the definition like this:

<?php
function _not_($f) {
  $f = substr($f, 1);
  return create_function('$x',
    "return !call_user_func(chr(0).'$f', \$x)");
}
?>

The expression that re-builds the function name avoid the null being literally in the parsed string.  If there is a better fix, please let me know.
x-empt[a_t]ispep.cx 05-Jul-2001 11:41
Create_function enables the ability to change the scope of functions.  You might have a class where it needs to define a GLOBAL function.  This is possible, like:

<?php
        class blah {
                function blah() {
                        $z=create_function('$arg1string','return "function-z-".$arg1string;');
                        $GLOBALS['z']=$z;
                }
        }
        $blah_object=new blah;

        $result=$GLOBALS['z']('Argument 1 String');
        echo $result;
?>

Making a function escape it's defined scope can be useful in many situations.
maxim at maxim dot cx 27-Apr-2001 03:26
for those who want to assign it's own name to a function consider this code:

<?php
$fname = 'hello';

$func = sprintf('
    function %s($v="") {
        Return "$v<BR>";
    }
',
$fname
);

eval($func);
echo $fname('Please print it.... please....');
?>

what it does is,
: Creats a function as a string;
: Replaces the function name with $fname value;
: Converts the string into a REAL php code with eval()
: Calls the function using the variable function as declared before ($fname);

Simple, isn't it?

Can work well as an abstraction layer for portability and/or compatibility purposes

Maxim Maletsky
maxim@maxim.cx // PHPBeginner.com
mrben at free dot fr 20-Feb-2001 08:33
Here is another tricky but usefull techynote, good for adding "plugin" to a existing class :

<?php

class Hoge {
    var $lamda;
    var $text;

    function set($lamda)
    {
        $this->lamda = $lamda;
    }

    function callLamda()
    {
        $func = $this->lamda;
        return $func($this);
    }

    function get()
    {
        return $this->text;
    }
}

$newfunc = create_function('&$class', 'echo $class->get();' );

$h = new Hoge;
$h->text = "Hi there !";
$h->set($newfunc);
$h->callLamda();

?>
koyama at hoge dot org 14-Dec-2000 04:22
How do you use function which is created by create_function() as class method?

<?php
class Hoge {
  var $lamda;
  function set($lamda) {
    $this->lamda = $lamda;
  }
  function callLamda() {
    $func = $this->lamda;
    return $func();
  }
}

$newfunc = create_function('', 'echo "hoge<br>\n";');

$h = new Hoge;
$h->set( $newfunc );
$h->callLamda();
?>

It works fine. :-)


Appelle une méthode statique et passe les arguments en tableau

  • « create_function
  • forward_static_call »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Appelle une méthode statique et passe les arguments en tableau

forward_static_call_array

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

forward_static_call_array — Appelle une méthode statique et passe les arguments en tableau

Description

forward_static_call_array ( callable $callback , array $args ) : mixed

Appelle une fonction ou une méthode utilisateur, nommée callback, avec les arguments rassemblés dans un tableau. Cette fonction doit être appelée depuis une méthode, et ne peut pas être utilisée hors d'une classe. Elle utilise le liage statique. Tous les arguments transmis sont passés par valeur dans un tableau, similairement à call_user_func_array().

Liste de paramètres

callback

La fonction ou la méthode appelée. Ce paramètre peut être un tableau, avec le nom de la classe et de la méthode, ou une chaîne, avec le nom de la fonction.

parameter

Un paramètre, rassemblant tous les paramètres dans un tableau.

Note:

Notez que les paramètres sont passés par valeur par forward_static_call_array().

Valeurs de retour

Retourne le résultat de la fonction, et false en cas d'erreur.

Exemples

Exemple #1 Exemple avec forward_static_call_array()

<?php

class A
{
    const NAME = 'A';
    public static function test() {
        $args = func_get_args();
        echo static::NAME, " ".join(',', $args)." \n";
    }
}

class B extends A
{
    const NAME = 'B';

    public static function test() {
        echo self::NAME, "\n";
        forward_static_call_array(array('A', 'test'), array('encore', 'args'));
        forward_static_call_array( 'test', array('autres', 'args'));
    }
}

B::test('foo');

function test() {
        $args = func_get_args();
        echo "C ".join(',', $args)." \n";
    }

?>

L'exemple ci-dessus va afficher :

B
B encore,args
C autres,args

Voir aussi

  • forward_static_call() - Appelle une méthode statique
  • call_user_func() - Appelle une fonction de rappel fournie par le premier argument
  • call_user_func_array() - Appelle une fonction de rappel avec les paramètres rassemblés en tableau
  • is_callable() - Détermine si l'argument peut être appelé comme fonction

User Contributed Notes

israfilov93 at gmal dot com 15-Aug-2018 07:04
one of academic example, when forward_static_call() can be useful

<?php

class A
{
    public static function test()
    {
        var_dump('we were here');
        return static::class;
    }
}

class B extends A
{
    public static function test()
    {
        return self::class;
    }
}

class C extends B
{
    public static function test()
    {
        $grandParent = get_parent_class(parent::class); // $grandParent is A
        return forward_static_call([$grandParent, __FUNCTION__]); // calls A::test()
    }
}

// prints
// string(12) "we were here"
// string(1) "C"
var_dump(C::test());
nino dot skopac at gmail dot com 30-Jul-2016 02:49
Regarding namespaces:

Be sure to include fully namespaced class path:

<?php
forward_static_call_array(
    array('NAMESPACE\CLASS_NAME', 'STATIC_METHOD'),
    $params
);


Appelle une méthode statique

  • « forward_static_call_array
  • func_get_arg »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Appelle une méthode statique

forward_static_call

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

forward_static_call — Appelle une méthode statique

Description

forward_static_call ( callable $callback , mixed ...$args ) : mixed

Appelle une fonction ou une méthode utilisateur, nommée callback, avec les arguments qui suivent. Cette fonction doit être appelée depuis une méthode, et ne peut pas être utilisée hors d'une classe. Elle utilise le liage statique.

Liste de paramètres

callback

La fonction ou la méthode appelée. Ce paramètre peut être un tableau, avec le nom de la classe et de la méthode, ou une chaîne, avec le nom de la fonction.

args

Zéro ou plusieurs paramètres à passer à la fonction.

Valeurs de retour

Retourne le résultat de la fonction, ou bien false en cas d'erreur.

Exemples

Exemple #1 Exemple avec forward_static_call()

<?php

class A
{
    const NAME = 'A';
    public static function test() {
        $args = func_get_args();
        echo static::NAME, " ".join(',', $args)." \n";
    }
}

class B extends A
{
    const NAME = 'B';

    public static function test() {
        echo self::NAME, "\n";
        forward_static_call(array('A', 'test'), 'encore', 'args');
        forward_static_call( 'test', 'autres', 'args');
    }
}

B::test('foo');

function test() {
        $args = func_get_args();
        echo "C ".join(',', $args)." \n";
    }

?>

L'exemple ci-dessus va afficher :

B
B encore,args
C autres,args

Voir aussi

  • forward_static_call_array() - Appelle une méthode statique et passe les arguments en tableau
  • call_user_func_array() - Appelle une fonction de rappel avec les paramètres rassemblés en tableau
  • call_user_func() - Appelle une fonction de rappel fournie par le premier argument
  • is_callable() - Détermine si l'argument peut être appelé comme fonction

User Contributed Notes

jhibbard at gmail dot com 19-Jun-2012 07:55
Example usage via calls outside of the class and within an object:

<?php
/**
 * @author Jonathon Hibbard
 */
class foo {
  # used to verify we're actually setting something..
  private static $value = '';

  /**
   * Simple setter for the static method setValue...
   */
  public static function set($method_identifier, $value_to_pass = '') {
    # make sure we have the right method format...
    # another semi-useful example is like this (useful for REST-like requests...): str_replace(" ", "", ucwords(str_replace("_", " ",  $method_identifier)));
    $static_method = 'set' . ucfirst(strtolower(trim($method_identifier)));

    if(method_exists(__CLASS__, $static_method)) {
      //Note:  this will not work and will throw PHP Parse error:  syntax error, unexpected '::'
      //__CLASS__::$static_method($value_to_pass);

      foo::$static_method($value_to_pass);

      echo "\tCalling forward_static_call with pure string and value param:\n";
      forward_static_call(__CLASS__ . "::" . $static_method, $value_to_pass);

      echo "\tCalling forward_static_call with class, method array and value param:\n";
      forward_static_call(array(__CLASS__, $static_method), $value_to_pass);
    }
  }

  /**
   * Set self::$value to something?
   */
  public static function setValue($value_recieved = '') {
    echo "\t\tsetValue called with param of " . var_export($value_recieved, true) . "!\n";

    echo "\t\tSetting Private 'value'...\n";

    self::$value = $value_recieved;

    echo "\t\tChecking the Private 'value':\n";
    if(!empty(self::$value)) {
      echo "\t\t\tPrivate 'value' was set to '" . self::$value . "' as expected!\n";
    } else {
      echo "\t\t\tPrivate 'value' was not set!\n";
    }

    # Reset...
    self::$value = '';
  }

  /**
   * Create an object and test calling the static method from within this realm...
   */
  public function __construct() {
    echo "\tCalling from within constructor..\n";
    foo::set('value','Something else from within the instance!');
  }
}

echo "\n============ Calling by static method first ============\n";
foo::set('value','Something from outside of the foo class!');

echo "\n============ Calling by static method without a value next ============\n";
foo::set('value');

echo "\n============ Calling by createing an instance next ============\n";
new foo();
?>
arthur dot techarts at gmail dot com 12-Jul-2011 07:39
Example to understand this function and difference with call_user_func:

<?php
class Beer {
    const NAME = 'Beer!';
    public static function printed(){
        echo 'static Beer:NAME = '. static::NAME . PHP_EOL;
    }
}

class Ale extends Beer {
    const NAME = 'Ale!';
    public static function printed(){
        forward_static_call(array('parent','printed'));
        call_user_func(array('parent','printed'));

        forward_static_call(array('Beer','printed'));
        call_user_func(array('Beer','printed'));
    }
}

Ale::printed();
echo '</pre>';
?>


Retourne un élément de la liste des arguments

  • « forward_static_call
  • func_get_args »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Retourne un élément de la liste des arguments

func_get_arg

(PHP 4, PHP 5, PHP 7, PHP 8)

func_get_arg — Retourne un élément de la liste des arguments

Description

func_get_arg ( int $arg_num ) : mixed

Récupère un élément de la liste des arguments d'une fonction utilisateur.

func_get_arg() peut être utilisé
conjointement à func_num_args() et
func_get_args() pour permettre aux fonctions
utilisateurs d'accepter un nombre variable d'arguments.

Liste de paramètres

arg_num

La position de l'argument. Les arguments de la fonction sont comptés en commençant à partir de 0.

Valeurs de retour

Retourne l'argument spécifié, ou false si une erreur survient.

Erreurs / Exceptions

Générera une alerte si elle est appelée hors d'une fonction utilisateur, ou si arg_num est plus grand que le nombre d'arguments passés.

Exemples

Exemple #1 Exemple avec func_get_arg()

<?php
function foo()
{
     $numargs = func_num_args();
     echo "Nombre d'arguments : $numargs\n";
     if ($numargs >= 2) {
         echo "Le second argument est : " . func_get_arg(1) . "\n";
     }
}

foo(1, 2, 3);
?>

L'exemple ci-dessus va afficher :

Nombre d'arguments : 3
Le second argument est : 2

Exemple #2 Exemple avec func_get_arg() avant et après PHP 5.3

test.php
<?php
function foo() {
    include './fga.inc';
}

foo('First arg', 'Second arg');
?>

fga.inc
<?php

$arg = func_get_arg(1);
var_export($arg);

?>

Affiche, avant PHP 5.3 :

'Second arg'

Affiche, en PHP 5.3 et suivants :

Warning: func_get_arg():  Called from the global scope - no function
context in /home/torben/Desktop/code/ml/fga.inc on line 3
false

Exemple #3 Exemple func_get_arg() avec des arguments par référence et par valeur

<?php
function byVal($arg) {
    echo 'Tel que passé     : ', var_export(func_get_arg(0)), PHP_EOL;
    $arg = 'baz';
    echo 'Après changement  : ', var_export(func_get_arg(0)), PHP_EOL;
}

function byRef(&$arg) {
    echo 'Tel que passé     : ', var_export(func_get_arg(0)), PHP_EOL;
    $arg = 'baz';
    echo 'Après changement  : ', var_export(func_get_arg(0)), PHP_EOL;
}

$arg = 'bar';
byVal($arg);
byRef($arg);
?>

Résultat de l'exemple ci-dessus en PHP 7 :

Tel que passé : 'bar'
Après changement : 'baz'
Tel que passé : 'bar'
Après changement : 'baz'

Résultat de l'exemple ci-dessus en PHP 5 :

Tel que passé : 'bar'
Après changement : 'bar'
Tel que passé : 'bar'
Après changement : 'baz'

Notes

Note:

Parce que cette fonction dépend de la portée courante pour déterminer les détails des paramètres, ils ne peuvent pas être utilisés en tant que paramètre d'une fonction dans les versions de PHP antérieures à 5.3.0. Si cette valeur doit être passée, le résultat doit être assigné à une variable et cette variable doit être passée.

Note:

Si les arguments sont passés par référence, toutes leurs modifications seront reflétées dans les valeurs retournées par cette fonction. À partir de PHP 7, les valeurs courantes seront aussi retournées si les arguments sont passés par leur valeur.

Note: Cette fonction retourne uniquement une copie des arguments passés, et ne compte pas en tant qu'arguments par défaut (non passés).

Voir aussi

  • La syntaxe ... en PHP 5.6+
  • func_get_args()
  • func_num_args()

User Contributed Notes

gordon at abetz-rouse dot com dot au 23-Mar-2020 11:30
This function may work differently from php5 to php7, in the latter it seems to reference the variable, while in php5 it returns the original argument.
I have confirmed with the versions below, but this will require further confirmation as to whether this is a 5 versus 7 issue.

function test( $test ){

    $test = '123';

    echo func_get_arg(0);

}

test( '321' );

//in php 5.5.9, this script will write '321'
//in php 7.0.33, this script will write '123'
beta3designs [at] gmail [dot] com 06-Jul-2009 06:34
This functions seems so powerful... just when i saw it i thought about writing a fast average of n numbers function so here it is, it is very simple... example usage included.

<?php

//Calculate the average of the numbers given

function avg(){
    $sum = 0;
    for($i = 0; $i < func_num_args(); $i++){
        $sum += func_get_arg($i);
    }
    $avg = $sum / func_num_args();
    return $avg;
}

echo sprintf("%.2f",avg(2,1,2,1,3,4,5,1,3,6));
?>
mw atto lanfear dotto com 07-Dec-2004 02:56
func_get_arg() does not appear to be allowed to be used as a function argument itself within class constructors in PHP 5.0.2 (wonk-ay!!!):

<?php

class ABC
{
    function __construct()
    {
        foreach (func_get_args() as $name => $value)
        {
    echo <<<EOT
    <br/>
    $name : $value <br/>
    <br/>

EOT;
        }
    }
}

class DEF extends ABC
{
    function __construct()
    {
        parent::__construct(func_get_arg(0),
                                    func_get_arg(1),
                                    func_get_arg(2));
    }
}

$def = new DEF(123123, "asdfasdf", "blahblahblah");

?>

The above script generates:

Fatal error: func_get_arg(): Can't be used as a function parameter in c:\Inetpub\wwwroot\phpwasrc\chapter10\xxx.php on line 23

There are, however, no problems when passing these as parameters to regular functions.
anders at ingemann dot fakestuff dot de 03-Jun-2004 06:16
I actually think that there is need for such "do absolutely everything" functions. I use them mostly as tools for rapid prototyping.
And there is a method with which you may be able to pass several strings to a function: ereg();
Another use for such functions is to create little code snippets for other people out there. They won't have to edit the function any longer if they do not use a parameter. They just don't name it when calling the function.
This results in allrounder functions that are very robust in their use.Normally you just have a little code snippet (e.g. ip-blocking snippets). Through this type of programming you have whole functions.
mightye (at) mightye (dot) org 12-Mar-2004 09:45
func_get_arg() returns a *copy* of the argument, to my knowledge there is no way to retrieve references to a variable number of arguments.

I have a module system in my game at http://lotgd.net where I'd like to be able to pass a variable number of arguments to functions in a module, and pass them by reference if the module asks for it by reference, but you can't accept optional parameters as references, nor can you retrieve the reference on a variable number of arguments.  Looks like my modules will have to do with out the ability to accept parameters to their functions by reference.


Retourne les arguments d'une fonction sous la forme d'un tableau

  • « func_get_arg
  • func_num_args »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Retourne les arguments d'une fonction sous la forme d'un tableau

func_get_args

(PHP 4, PHP 5, PHP 7, PHP 8)

func_get_args — Retourne les arguments d'une fonction sous la forme d'un tableau

Description

func_get_args ( ) : array

Récupère les arguments d'une fonction sous la forme d'un tableau.

func_get_arg() peut être utilisé conjointement à func_num_args() et func_get_args() pour permettre aux fonctions utilisateurs d'accepter un nombre variable d'arguments.

Valeurs de retour

Retourne un tableau dont chaque élément est une copie du membre correspondant de la liste d'arguments de la fonction.

Erreurs / Exceptions

Générera une alerte si elle est appelée hors d'une fonction.

Exemples

Exemple #1 Exemple avec func_get_args()

<?php
function foo()
{
    $numargs = func_num_args();
    echo "Nombre d'arguments : $numargs \n";
    if ($numargs >= 2) {
        echo "Le second argument est : " . func_get_arg(1) . "\n";
    }
    $arg_list = func_get_args();
    for ($i = 0; $i < $numargs; $i++) {
        echo "L'argument $i est : " . $arg_list[$i] . "\n";
    }
}

foo(1, 2, 3);
?>

L'exemple ci-dessus va afficher :

Nombre d'arguments : 3
Le second argument est : 2
L'argument 0 est : 1
L'argument 1 est : 2
L'argument 2 est : 3

Exemple #2 Exemples func_get_args() avant et après PHP 5.3

test.php
<?php
function foo() {
    include './fga.inc';
}

foo('Argument 1', 'Argument 2');
?>

fga.inc
<?php

$args = func_get_args();
var_export($args);

?>

Sortie avant PHP 5.3:

array (
  0 => 'Argument 1',
  1 => 'Argument 2',
)

Sortie depuis PHP 5.3

Warning: func_get_args():  Called from the global scope - no function
context in /home/torben/Desktop/code/ml/fga.inc on line 3
false

Exemple #3 Exemple func_get_args() avec des arguments par référence et par valeur

<?php
function byVal($arg) {
    echo 'Tel que passé     : ', var_export(func_get_args()), PHP_EOL;
    $arg = 'baz';
    echo 'Après changement  : ', var_export(func_get_args()), PHP_EOL;
}

function byRef(&$arg) {
    echo 'Tel que passé     : ', var_export(func_get_args()), PHP_EOL;
    $arg = 'baz';
    echo 'Après changement  : ', var_export(func_get_args()), PHP_EOL;
}

$arg = 'bar';
byVal($arg);
byRef($arg);
?>

Résultat de l'exemple ci-dessus en PHP 7 :

Tel que passé : array (
0 => 'bar',
)
Après changement : array (
0 => 'baz',
)
Tel que passé : array (
0 => 'bar',
)
Après changement : array (
0 => 'baz',
)

Résultat de l'exemple ci-dessus en PHP 5 :

Tel que passé : array (
0 => 'bar',
)
Après changement : array (
0 => 'bar',
)
Tel que passé : array (
0 => 'bar',
)
Après changement : array (
0 => 'baz',
)

Notes

Note:

Parce que cette fonction dépend de la portée courante pour déterminer les détails des paramètres, ils ne peuvent pas être utilisés en tant que paramètre d'une fonction dans les versions de PHP antérieures à 5.3.0. Si cette valeur doit être passée, le résultat doit être assigné à une variable et cette variable doit être passée.

Note:

Si les arguments sont passés par référence, toutes leurs modifications seront reflétées dans les valeurs retournées par cette fonction. À partir de PHP 7, les valeurs courantes seront aussi retournées si les arguments sont passés par leur valeur.

Note: Cette fonction retourne uniquement une copie des arguments passés, et ne compte ne traite pas les arguments par défaut (non passés).

Voir aussi

  • La syntaxe ... en PHP 5.6+
  • func_get_arg()
  • func_num_args()
  • ReflectionFunctionAbstract::getParameters()

User Contributed Notes

cobrattila at gmail dot com 20-Nov-2019 04:17
If you want to get the arguments by reference, instead of func_get_args() you can simply use

<?php
function args_byref(&...$args) {
    // Modify the $args array here
}
?>

Credits should go to Markus Malkusch for pointing this out on Stackoverflow.
https://stackoverflow.com/a/29181826/1426064
foxkeys at gmail dot com 17-Mar-2016 06:18
Merge func_get_args() with function defaults
<?php
class utils {
  /**
   * @param mixed[] $args
   * @param ReflectionMethod $reflectionMethod
   *
   * @return array
   */
  public static function mergeArgsWithDefaults( $args, \ReflectionMethod $reflectionMethod ) {
    foreach ( array_slice( $reflectionMethod->getParameters(), count( $args ) ) as $param ) {
      /**
       * @var ReflectionParameter $param
       */
      $args[] = $param->getDefaultValue();
    }
    return $args;
  }
}

class  sampleParent {
  const USER_FILE_TYPE_FILE = 'FILE';
  public function select( $idUserFile = null, $idUserFileType = self::USER_FILE_TYPE_FILE ) {
    echo '[$idUserFile=>' . $idUserFile . ', $idUserFileType=>' . $idUserFileType, ']<br/>' . PHP_EOL;
  }
}

class sample extends sampleParent {
  const USER_FILE_TYPE_IMG = 'IMG';
  public function select( $idUserFile = null, $idUserFileType = self::USER_FILE_TYPE_IMG ) {
    return call_user_func_array( 'parent::select', \utils::mergeArgsWithDefaults( func_get_args(), new ReflectionMethod( __CLASS__, __FUNCTION__ ) ) );
  }
}

$sample1 = new sampleParent();
$sample1->select();//Prints "" / self::USER_FILE_TYPE_FILE
$sample1->select(1);//Prints 1 / self::USER_FILE_TYPE_FILE
$sample1->select(2, 'test 1');//Prints 2 / "test 1"
echo '<br/>' . PHP_EOL;
$sample2 = new sample();
$sample2->select();//Prints "" / self::USER_FILE_TYPE_IMG
$sample2->select(3);//Prints 3 / self::USER_FILE_TYPE_IMG
$sample2->select(4, 'test 2');//Prints 4 / "test 2"
?>
maarten at ba dot be 13-Sep-2012 11:58
it seems that this function only returns a copy and loses it's byref information, use this dirty non-efficient workaround instead:

at the moment of writing it currently returns all of them as references, instead of only the ones who are passed that way...

<?php
function func_get_args_byref() {
        $trace = debug_backtrace();
        return $trace[1]['args'];
}
?>
OpenTechnologist 30-Dec-2011 07:54
please note that optional parameters are not seen/passed by func_get_args(), as well as func_get_arg().

ex:

<?php
function testfunc($optional = 'this argument is optional..') {
    $args = func_get_args();
    var_dump($args);
    echo $optional;
}
?>

test case #1:
testfunc('argument no longer optional..');

result for #1:
array(1) {
    [0]=>  string(20) "argument no longer optional.."
}
argument no longer optional..

test case #2:
testfunc('argument no longer optional..','this is an extra argument');

result for #2:
array(2) {
    [0]=>  string(29) "argument no longer optional.."
    [1]=>  string(25) "this is an extra argument"
}
argument no longer optional..

test case #3: -- RESULTS IN AN EMPTY ARRAY
testfunc();

result for #3:
array(0) {
}
this argument is optional..
mitko at edabg dot com 06-Apr-2009 03:48
<?php
/*
This example demonstrate how to use unknown variable arguments by reference.
func_get_args() don't return arguments by reference, but
debug_backtrace() "args" is by reference.
In PHP 5 this have no particular sense, because calling with arguments by reference
is depreciated and produce warning.
*/

class foo {

    var $bar = "default bar";

    function foo(/*variable arguments*/) {
// func_get_args returns copy of arguments
//        $args = func_get_args();
// debug_backtrace returns arguments by reference
        $stack = debug_backtrace();
        $args = array();
        if (isset($stack[0]["args"]))
            for($i=0; $i < count($stack[0]["args"]); $i++)
                $args[$i] = & $stack[0]["args"][$i];
        call_user_func_array(array(&$this, 'bar'), $args);
    }

    function bar($bar = NULL) {
        if (isset($bar))
            $this->bar = & $bar;
    }
}

$global_bar = "bar global";
$foo = & new foo();
echo "foo->bar:    ".$foo->bar."</br>\n";
$foo->bar = "new bar";
echo "global_bar:  ".$global_bar."</br>\n";
/*
Result:
foo->bar:    default bar</br>
global_bar:  bar global</br>
*/

$foo = & new foo(&$global_bar);
echo "foo->bar:    ".$foo->bar."</br>\n";
$foo->bar = "new bar";
echo "global_bar:  ".$global_bar."</br>\n";
/*
Result:
foo->bar:    bar global</br>
global_bar:  new bar</br>
*/

?>
anderson at francotecnologia dot com 26-Aug-2008 11:25
How to create a polymorphic/"overloaded" function

<?php
function select()
{
    $t = '';
    $args = func_get_args();
    foreach ($args as &$a) {
        $t .= gettype($a) . '|';
        $a = mysql_real_escape_string($a);
    }
    if ($t != '') {
        $t = substr($t, 0, - 1);
    }
    $sql = '';
    switch ($t) {
        case 'integer':
            // search by ID
            $sql = "id = {$args[0]}";
            break;
        case 'string':
            // search by name
            $sql = "name LIKE '%{$args[0]}%'";
            break;
        case 'string|integer':
            // search by name AND status
            $sql = "name LIKE '%{$args[0]}%' AND status = {$args[1]}";
            break;
        case 'string|integer|integer':
            // search by name with limit
            $sql = "name LIKE '%{$args[0]}%' LIMIT {$args[1]},{$args[2]}";
            break;
        default:
            // :P
            $sql = '1 = 2';
    }
    return mysql_query('SELECT * FROM table WHERE ' . $sql);
}
$res = select(29); // by ID
$res = select('Anderson'); // by name
$res = select('Anderson', 1); // by name and status
$res = select('Anderson', 0, 5); // by name with limit
?>
ario [a] mail [dot] utexas [dot] edu 07-May-2007 02:50
"Because this function depends on the current scope to determine parameter details, it cannot be used as a function parameter. If you must pass this value, assign the results to a variable, and pass the variable."

This means that the following code generates an error:

<?php

function foo($list)
{
  echo implode(', ', $list);
}

function foo2()
{
  foo(func_get_args());
}

foo2(1, 2, 3);

?>

However, you can easily get around this by doing the following:

<?php

function foo($list)
{
  echo implode(', ', $list);
}

function foo2()
{
  foo($args = func_get_args());
}

foo2(1, 2, 3);

?>

This captures the context from foo2(), making this legal.  You get the expected output:

"1, 2, 3"
T.M. 04-Nov-2004 07:24
Simple function to calculate average value using dynamic arguments:
<?php
function average(){
    return array_sum(func_get_args())/func_num_args();
}
print average(10, 15, 20, 25); // 17.5
?>
daveNO at ovumSPAMdesign dot com 17-Sep-2001 11:29
<?php
// How to simulate named parameters in PHP.
// By Dave Benjamin <dave@ovumdesign.com>

// Turns the array returned by func_get_args() into an array of name/value
// pairs that can be processed by extract().
function varargs($args) {
    $count = count($args);
    for ($i = 0; $i < $count; $i += 2) {
        $result[$args[$i]] = $args[$i + 1];
    }

    return $result;
}

// Example
function test(&$ref1, &$ref2) {
    // Default arguments go here.
    $foo = "oof";

    // Do some magic.
    extract(varargs(func_get_args()));

    echo nl2br("\n\$var1 = $var1");
    echo nl2br("\n\$var2 = $var2");
    echo nl2br("\n\$foo = $foo\n\n");

    // Modify some variables that were passed by reference.
    // Note that func_get_args() doesn't pass references, so they
    // need to be explicitly declared in the function definition.
    $ref1 = 42;
    $ref2 = 84;
}

$a = 5;
$b = 6;

echo nl2br("Before calling test(): \$a = $a\n");
echo nl2br("Before calling test(): \$b = $b\n");

// Try removing the 'foo, "bar"' from the following line.
test($a, $b, var1, "abc", var2, "def", foo, "bar");

echo nl2br("After calling test(): \$a = $a\n");
echo nl2br("After calling test(): \$b = $b\n");
?>
04-Jun-2001 07:44
You can pass a variable number of arguments to a function whilst keeping references intact by using an array. The disadvantage of course, is that the called function needs to be aware that it's arguments are in an array.

<?php
// Prints "hello mutated world"
function mutator($args=null) {
$n=count($args);
while($i<$n) $args[$i++] = "mutated";
}
$a = "hello";
$b = "strange";
$c = "world";
mutator(array($a, &$b, $c));
echo "$a $b $c";
?>


Retourne le nombre d'arguments passés à la fonction

  • « func_get_args
  • function_exists »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Retourne le nombre d'arguments passés à la fonction

func_num_args

(PHP 4, PHP 5, PHP 7, PHP 8)

func_num_args — Retourne le nombre d'arguments passés à la fonction

Description

func_num_args ( ) : int

Récupère le nombre d'arguments passés à la fonction.

func_get_arg() peut être utilisé
conjointement à func_num_args() et
func_get_args() pour permettre aux fonctions
utilisateurs d'accepter un nombre variable d'arguments.

Valeurs de retour

Retourne le nombre d'arguments passés à la fonction utilisateur courante.

Erreurs / Exceptions

Génère une alerte si elle est appelée hors d'une fonction utilisateur.

Exemples

Exemple #1 Exemple avec func_num_args()

<?php
function foo()
{
    $numargs = func_num_args();
    echo "Nombre d'arguments : $numargs\n";
}

foo(1, 2, 3);    // affiche ''
?>

L'exemple ci-dessus va afficher :

Nombre d'arguments: 3

Exemple #2 Exemples func_num_args() avant et après PHP 5.3

test.php
 <?php
 function foo() {
     include './fna.inc';
 }

 foo('Argument 1', 'Argument 2');
 ?>

 fna.php
 <?php

 $num_args = func_num_args();
 var_export($num_args);

 ?>

Sortie avant PHP 5.3:

 2

L'affichage depuis PHP 5.3 ressemble à quelque chose comme :

 Warning: func_num_args():  Called from the global scope - no function
 context in /home/torben/Desktop/code/ml/fna.inc on line 3
 -1

Notes

Note:

Parce que cette fonction dépend de la portée courante pour déterminer les détails des paramètres, ils ne peuvent pas être utilisés en tant que paramètre d'une fonction dans les versions de PHP antérieures à 5.3.0. Si cette valeur doit être passée, le résultat doit être assigné à une variable et cette variable doit être passée.

Voir aussi

  • La syntaxe ... en PHP 5.6+
  • func_get_arg()
  • func_get_args()
  • ReflectionFunctionAbstract::getNumberOfParameters()

User Contributed Notes

tongcheong77 at gmail dot com 20-Jun-2017 06:12
If you are using PHP 7 and func_num_args is in your base class which you extended, you can pass your arguments with the 'spat' operator.

class Sql {

public function doGetWhere(...$args) {

$num_args = func_num_args();
      $args_list = func_get_args();

      echo '<pre>';
      var_dump($args_list);
      echo '<pre>';
  }
}

class Member extends Sql {

public function getWhere(...$args) {

   $this->doGetWhere(...$args);

      }
}

$member = new Member();
$member->getWhere('first_name','last_name','userlevel','email','where','email','=',$sub_email);

However, take note that if you 'new up' the 'Sql' class in your 'Member' class above, instead of extending it, you will not need to pass your arguments as a variable. Just my two cents. -Bruce tong
luisguillermo dot quevedovelez at gmail dot com 13-Mar-2012 07:32
I had defined a function function_name(){ ...} as a drupal callback.
I try to get how many params where passed

I got a Error and my Site falls down

I've replaced func_get_args() instead func_num_args() and my Site was restored.

I conclude you can not use  func_num_args() in callbacks.

Hope it helps.
Dennis Robinson from basnetworks dot net 29-Jun-2009 09:29
This function comes in handy, and I believe is the only solution, when you have an optional parameter that can take any type of data.

For example:

<?php

// $data can be of any type, including null
function my_function($name, $data = null)
{
    if ($data !== null)
    {
        // Do something with $data
        // If you call my_function('something'), this WILL NOT be reached
        // If you call my_function('something', null), this WILL NOT be reached
    }
}

?>

The problem with the above function is that you will never be able to use null as the value for $data.  To fix this, use func_num_args() like so:

<?php

// $data can be of any type, including null
function my_function($name, $data = null)
{
    if (func_num_args() >= 2)
    {
        // Do something with $data
        // If you call my_function('something'), this WILL NOT be reached
        // If you call my_function('something', null), this WILL be reached
    }
}

?>

This solution works because func_num_args() reports exactly how many arguments were passed when the function was called.  It does not take into account when default argument values are used.
jared at ws-db dot com 06-Sep-2005 09:46
Just a note for anyone wondering. This function doesn't include params that have a default value, unless you pass one in to overwrite the default param value. Not sure if that makes sense, so here's an example:

<?php
function helloWorld($ArgA, $ArgB="HelloWorld!") {
  return func_num_args();
}

// The following will return 1
$Returns1 = helloWorld("HelloWorld!");

// The following will return 2
$Returns2 = helloWorld("HelloWorld!", "HowdyWorld!");
?>
andy at arakka dot co dot th 11-May-2005 07:16
func_num_args() can be used in conjunction with named arguments, also. For example:

<?php
function DebugShow( $label, $value ) {
  echo "# " . $label ;
  if ( func_num_args() > 1 ) echo " = " . $value ;
  echo "<br>";
}
?>
ashley at dcs dot warwick dot ac dot uk 17-Apr-2002 04:40
If you want to pass the parameters on intact to another function, use func_get_args and call_user_func_array (careful - this one is only available in recent PHP versions).  For example:

<?php
/* Print an HTML tag.  This accepts a variable number of arguments:
   the first should be the name of the tag, followed by pairs of
   arguments that describe keys and values.  The values are printed
   with surrounding double quote characters.  */
function printTag() {
  $numArgs = func_num_args();
  if ($numArgs < 1) die("printTag given no arguments");

  echo "<" . func_get_arg(0);
  for ($i = 1; $i < $numArgs; $i+=2) {
    echo " " . func_get_arg($i);
    if ($i+1 < $numArgs)
      echo "=\"" . func_get_arg($i+1) . "\"";
  }
  echo ">";

}

/* Print an HTML tag with a newline on the end */
function printTagNL() {
  $args = func_get_args();
  call_user_func_array("printTag", $args);
  echo "\n";
}

printTagNL("input", "type", "hidden", "name", "SORTORDER", "value", $columnNo);
?>
thalis at NOSPAMcs dot pitt dot edu 29-Mar-2002 12:05
The idea of func_get_args() is to construct functions of variable number of parameters like

<?php
function var_param_func(){
    if(func_num_args()==0){
        //do one thing
    }
    if(func_num_args()==1)
        //do another thing
        //get the args with func_get_args()
    }
}
?>


Indique si une fonction est définie

  • « func_num_args
  • get_defined_functions »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Indique si une fonction est définie

function_exists

(PHP 4, PHP 5, PHP 7, PHP 8)

function_exists — Indique si une fonction est définie

Description

function_exists ( string $function_name ) : bool

Vérifie la liste des fonctions définies par l'utilisateur ainsi que celles internes à php afin d'y trouver function_name.

Liste de paramètres

function_name

Le nom de la fonction, sous la forme d'une chaîne de caractères.

Valeurs de retour

Retourne true si la fonction function_name existe et est une fonction, false sinon.

Note:

Notez également que function_exists() retournera false pour les instructions comme include_once et echo.

Exemples

Exemple #1 Exemple avec function_exists()

<?php
if (function_exists('imap_open')) {
    echo "Les fonctions IMAP sont disponibles.<br />\n";
} else {
    echo "Les fonctions IMAP ne sont pas disponibles.<br />\n";
}
?>

Notes

Note:

Un nom de fonction peut exister même si la fonction elle-même n'est pas utilisable à cause d'une configuration ou d'une option de compilation (avec les fonctions image par exemple).

Voir aussi

  • method_exists() - Vérifie si la méthode existe pour une classe
  • is_callable() - Détermine si l'argument peut être appelé comme fonction
  • get_defined_functions() - Liste toutes les fonctions définies
  • class_exists() - Vérifie si une classe a été définie
  • extension_loaded() - Détermine si une extension est chargée ou non

User Contributed Notes

ayyappan dot ashok at gmail dot com 31-Mar-2016 10:03
PHP supports nested function based on certain criteria.

Please look over the code.

function Media(){ }

function Audio()
{
    echo "Plugged Audo 5.1:<br/>";
    function Volume()
    {
    echo "Volume controls:<br/>";
    function Equalizer()
    {
        echo "Equalize Bands:<br/>";
    }
   }
}
//Call to nested functions
Audio();
Volume();
Equalizer();

if(function_exists('Volume')):
echo "TRUE";
else:
echo "FALSE";
endif;

Case 1:  //Result :Works Well
--------
Audio();
Volume();
Equalizer();

Case 2:  //Results Notice Error. Root function Audio must be called first.
--------
Volume();

Case 3:  //Results Error. Root function Volume must be called.
--------
Audio();
Equalizer();

Note :
The nested function should be called based on their order used.
In our example when Audio is not called and instantly when we try to call Volume puts under error.

Even though there is an possibility to use nested functions in PHP. It looks overhead to do so. Better to avoid in logical ground of script.

Tested on PHP 5.5.32
michael at squiloople dot com 01-Sep-2015 08:28
It should be noted that the function_exists check is not relative to the root namespace. This means that the namespace should be appended to the check:

<?php

  namespace test;

  if (!function_exists(__NAMESPACE__ . '\example'))
  {

    function example()
    {

    }

  }

?>
BruceB 21-Aug-2015 03:55
This is not going to go down as you might expect it should (even if you play smart and require/include_once):

<?php
if(function_exists('my_function'))
{
   throw new Exception("'my_function' is already defined!");
}

function my_function()
{
   // Do the work here
}
?>

This, however does work:

<?php
if( ! function_exists('my_function'))
{
   function my_function()
   {
      // Do the work here
   }
}
else
{
   throw new Exception("'my_function' is already defined!");
}
?>

Does it have anything to do with PHP parse/execute phases or global/local scope or those curly brackets or something else, I have no idea, but the latter ugly son works, while the former bombs out claiming that 'my_function' is already defined.

Thought this might save someone a few minutes of debugging time...
b dot g dot dariush at gmail dot com 07-Feb-2014 05:50
function_exists() does not cache its query internally.

by executing the following code

        $funcs = \array_shift(\get_defined_functions());
        $l = new \core\utiles\loadTime;
        $times = 0;
        $l->start();
        for($index = 0; $index<count($funcs); $index++)
        {
            foreach($funcs as $func)
            {
                $times++;
                if(\function_exists($func)) ;
            }
        }
        $s = $l->stop();
        echo "<span style='color:green'>$times</span> took : $s";
        # the output would be
         $> 2365444 took : 0.70324

By executing the

        $funcs = \array_shift(\get_defined_functions());
        $l = new \core\utiles\loadTime;
        $times = 0;
        $l->start();
        static $func_check = array();
        for($index = 0; $index<count($funcs); $index++)
        {
            foreach($funcs as $func)
            {
                $times++;
                if(!isset($func_check[$func]))
                {
                    if(\function_exists($func)) ;
                    $func_check[$func] = 1;
                }
                else $func_check[$func];
            }
        }
        $s = $l->stop();
        echo "<span style='color:green'>$times</span> took : $s";
        # the output would be
        $> 2365444 took : 0.53446

There is a 0.16878 seconds improvement, when you use static array to cache methods existence.
kitchin 25-Sep-2012 12:49
You can use this function to conditionally define functions, see: http://php.net/manual/en/functions.user-defined.php

For instance Wordpress uses it to make functions "pluggable." If a plugin has already defined a pluggable function, then the WP code knows not to try to redefine it.

But function_exists() will always return true unless you wrap any later function definition in a conditional clause, like if(){...}. This is a subtle matter in PHP parsing. Some examples:

<?php
if (function_exists('foo')) {
  print "foo defined\\n";
} else {
  print "foo not defined\\n";
}
function foo() {}

if (function_exists('bar')) {
  print "bar defined\\n";
} else {
  print "defining bar\\n";
  function bar() {}
}
print "calling bar\\n";
bar(); // ok to call function conditionally defined earlier

print "calling baz\\n";
baz(); // ok to call function unconditionally defined later
function baz() {}

qux(); // NOT ok to call function conditionally defined later
if (!function_exists('qux')) {
  function qux() {}
}
?>
Prints:
  foo defined
  defining bar
  calling bar
  calling baz
  PHP Fatal error: Call to undefined function qux()

Any oddities are probably due to the order in which you include/require files.
admin at gk-root dot com 22-Mar-2012 02:51
// If you want to chack if the function is enabled or disable in php.ini you can use this function:

<?php
function func_enabled($func) {
    $disabled = explode(',', ini_get('disable_functions'));
    foreach ($disabled as $disableFunction) {
        $is_disabled[] = trim($disableFunction);
    }
    if (in_array($func,$is_disabled)) {
        $it_is_disabled["m"] = $func.'() has been disabled for security reasons in php.ini';
        $it_is_disabled["s"] = 0;
    } else {
        $it_is_disabled["m"] = $func.'() is allow to use';
        $it_is_disabled["s"] = 1;
    }
    return $it_is_disabled;
}
?>

// An example of how to use:

<?php
$if_is_disabled = func_enabled('exec'); // return Arrey
echo $if_is_disabled["m"]; // return text value
echo '<br/>';
echo $if_is_disabled["s"]; // return 1 or 0
?>
zach at bygeekz dot com 20-Sep-2008 06:20
to php at fluidthoughts dot com

you aren't comparing against false, that if compares against true, so it's going to return that, as false != true
true being 1, True, (bool)True, etc.
false being 0, False, Null, etc
<?php

$foo=null;
if ($foo) { echo 'yay'; } //does not echo yay, because null is not True

$foo=false;
if ($foo) { echo 'yay'; } //does not echo yay, because false is not True

$foo=null;
if (!$foo) { echo 'yay'; } //echoes yay!

$foo=false;
if (!$foo) { echo 'yay'; } //echoes yay!

?>

This..
<?php
    if (!function_exists('')) {
                echo "empty string function doesnt exist as compared as negative\n";
        }

        if (!function_exists(NULL)) {
                echo "NULL function doesnt exist as compared as negative\n";
        }
?>
Works.

Alternatively, to enter upon existance..

Use your code. Since they dont exist, it wont enter..
php at fluidthoughts dot com 19-Mar-2008 10:18
function_exists returns false on NULL and empty string:

<?php
        if (function_exists('')) {
                echo "empty string function exists\n";
        }

        if (function_exists(NULL)) {
                echo "NULL function exists\n";
        }
?>

Neither of the echo statements happen when I run this.
webmaster at mamo-net dot de 22-Sep-2007 05:43
If you use suhosin.executor.func.blacklist instead of disabled_functions in your php.ini, function_exists will return true for a disabled function. I used this to have the same beahviour with suhosin.executor.func.blacklist and disabled_functions:

<?php
function suhosin_function_exists($func) {
    if (extension_loaded('suhosin')) {
        $suhosin = @ini_get("suhosin.executor.func.blacklist");
        if (empty($suhosin) == false) {
            $suhosin = explode(',', $suhosin);
            $suhosin = array_map('trim', $suhosin);
            $suhosin = array_map('strtolower', $suhosin);
            return (function_exists($func) == true && array_search($func, $suhosin) === false);
        }
    }
    return function_exists($func);
}
?>
White-Gandalf 13-Sep-2007 07:26
I stumbled over the same problem as "eddiec" (users not able or not willing to use "_once"-suffixes).

A possible alternative explanation for the behavior:

If a file is included, it is possibly parsed every include-time.(?)
While parsing, every function in global scope is tried to register. THIS gets wrong, when multiple times included, and it produces an error.

If functions are defined within block scopes, their registration seems to be delayed until execution of such a block. Thus, not the function "function_exists" functions wrong, but simply the philosophy of the interpreter produces such results.

Thus, the same effect can be achieved by simply putting block braces around the contents of an include_once file:

if (function_exists('function_in_question')) return;
{
    function function_in_question(...)
    {
        ...
    }
    ...other stuff
}

...which is equivalent to...

if (!function_exists('function_in_question'))
{
    function function_in_question(...)
    {
        ...
    }
    ...other stuff
}
dieter at edarta dot be 16-Feb-2007 03:09
to brooklynphil at hotmail dot com:

Your post is misleading, namely the 3rd and last speedtest you describe is an unfair comparison:

<?php
is_callable('test','test');
?>

The value of the 2nd parameter $syntax_only is 'test' and this evaluates to boolean true. In other words, this is exactly the same as calling the function like this:

<?php
is_callable('test',true);
?>

Of course this will be faster because is_callable only does a very basic syntaxcheck. From the documentation: 'It will only reject simple variables that are not strings, or an array that does not have a valid structure to be used as a callback.'

If you omit this erroneous 3rd test, then according to your examples function_exists is 2 to 4 times faster.

I hope you can see that loop-testing functions is not so simple. :)

rtfm
eddiec at stararcher dot com 09-Feb-2007 09:58
Note that function_exists will return TRUE in the following situation, presumably because the function "testfunc" was defined when the script was PARSED/ITERPRETED, before the function_exists call was made at RUNTIME:

<?php
if (function_exists('testfunc')) return;
function testfunc() { }
?>

So, this construction is not useful for preventing testfunc from being multiply defined if the script is muliply included or required.

However, the following construction DOES work to prevent multiple defines of testfunc:

<?php
if (!function_exists('testfunc')) {
  function testfunc() { }
}
?>

CONTRAST this with similar uses of defined() which is completely runtime evaluated.  These both work:

<?php
if (defined('testfunc_defined')) return;
define('testfunc_defined', 1);
function testfunc() { }
?>

AND...

<?php
if (!defined('testfunc_defined')) {
define('testfunc_defined', 1);
function testfunc() { }
}
brooklynphil at hotmail dot com 30-Jan-2007 11:02
to bob at thethirdshift dot net
regarding is_callable vs function_exists.

using your code
is_callable = TRUE, function_exists = FALSE

Did 10000 is_callables in 0.0443360805511 seconds
Did 10000 function_exists in 0.0111110210419 seconds

then we replace
is_callable(array('test','test'));
with
$callarray = array('test','test'); // place this outside for-loop
is_callable($callarray);

is_callable = TRUE, function_exists = FALSE

Did 10000 is_callables in 0.0314660072327 seconds
Did 10000 function_exists in 0.0120670795441 seconds

then we replace
is_callable(array('test','test'));
with
is_callable('test','test');

is_callable = TRUE, function_exists = FALSE

Did 10000 is_callables in 0.00991606712341 seconds
Did 10000 function_exists in 0.0113790035248 seconds

I hope you can see that loop-testing functions is not so simple. :)
Dan 17-Jul-2006 08:49
I would like to comment on the following post:

A note of caution: function_exists() appears to be case-insensitive (at least as of PHP 4.3.8).  e.g.:

<?php
   function MyCasedFunction() {
       return true;
   }

   // Will return true, even though casing is "wrong"
   if (function_exists("mYcAsEdFuNcTiOn"))
       echo "I see it!";
?>

I believe that function calls itself are case insensitve, so this function is returning a valid truth. PHP doesn't care about cases.
andi at splitbrain dot org 07-Jul-2006 03:48
function_exists will return false for functions disabled with the disable_functions ini directive. However those functions are still declared so trying to define them yourself will fail.

<?php
if(!function_exists('readfile')){
  function readfile($file){
    $handle=@fopen($cache,"r");
    echo @fread($handle,filesize($file));
    @fclose($handle);
  }
}
?>

The above will issue a "Cannot redeclare readfile()" fatal error if readfile was disabled with disable_functions.
neelam_ab2003 at yahoo dot co dot in 11-May-2006 12:06
<?php
/*PHP doesn't Support nested functions. I have tried following in PHP_VERSION - 5.1.2*/

function A(){}

function B(){
    function C(){
        function D(){}
    }
}

IsFunctionExist('A');
IsFunctionExist('B');
IsFunctionExist('C');
IsFunctionExist('D');

function IsFunctionExist($funcName){
    echo function_exists($funcName)?" $funcName exist <br>":" $funcName doesn't exist <br>";
}
?>

/*O U T P U T
A exist
B exist
C doesn't exist
D doesn't exist
*/
chaumo 16-Jul-2005 05:46
to avoid direct calls this can be better than function_exists
in the parent file:
<?php
define("IN_MODULE",true);
?>
and in the target file:
<?php
if(!defined("IN_MODULE")) die("Can't access the file directly");
?>
fili at fili dot nl 08-Jun-2005 09:24
To prevent direct calls to included files i use the following technique.

In the main file create an empty function with a random name. Like so:

<?php
function hjudejdjiwe() { return true; }
?>

Then check for the existence of this function within your include:

<?php
if (!function_exists('hjudejdjiwe')) { die('!'); }
?>

Simple but effective.
bob at thethirdshift dot net 23-Jun-2004 09:55
I, too, was wondering whether is_callable or function exists is faster when checking class methods.  So, I setup the following test:

<?php
function doTimes($start, $end)
  {
    $start_time = explode (" ", $start);
    $start_time = $start_time[1] + $start_time[0];
    $end_time = explode (" ", $end);
    $end_time = $end_time[1] + $end_time[0];
    $time = $end_time - $start_time;
    return $time;
  }

class test
  {
      function test()
      {
          return true;
      }
  }

$callableIsTrue = false;
$startIsCallable = microtime();
for($i = 0; $i < 10000; $i++)
  {
      if(is_callable(array('test', 'test'))) { $callableIsTrue = true; }
  }
$endIsCallable = microtime();

$existsIsTrue = false;
$startExists = microtime();
for($i = 0; $i < 10000; $i++)
  {
      if(function_exists('test::test')) { $existsIsTrue = true; }
  }
$endExists = microtime();

$timeIsCallable = doTimes($startIsCallable, $endIsCallable);
$timeExists     = doTimes($startExists, $endExists);

echo "<b>is_callable = ".($callableIsTrue ? "TRUE" : "FALSE")."</b>, \n";
echo "<b>function_exists = ".($existsIsTrue ? "TRUE" : "FALSE")."</b><br>\n";

echo "<br>Did 10000 is_callables in ".$timeIsCallable." seconds";
echo "<br>Did 10000 function_exists in ".$timeExists." seconds";
?>

This gives the output :

is_callable = TRUE, function_exists = FALSE

Did 10000 is_callables in 0.0640790462494 seconds
Did 10000 function_exists in 0.0304429531097 seconds

So the fact that function_exists is twice as fast is slightly over shadowed by the fact that it doesn't work on class methods, at least not as far as I can tell.
ckrack at i-z dot de 09-Mar-2004 12:22
i was wondering whether is_callable or function exists is faster when checking class methods.

is_callable(array('foo', 'bar'));
function_exists('foo::bar');

my results when doing each operation 10000 times with a simple test class were the following:

is_callable: 0.28671383857727 seconds
function_exists: 0.14569997787476 seconds

(following tests have proved this to be true).

thus you can see, function_exists is twice as fast as is_callable.
breadman 29-Jul-2003 05:17
Functions within a function are better off as anonymous returns from create_function(), unless you want to be able to call it elsewhere.

However, I have used this in skinning:  I use alert_box() to display certain errors, like a faulty SQL query.  This simply calls display_alert(), which is defined in my skin scripts.  However, alert_box() is sometimes called before I know which skin to load, so it has its own functionality which it uses if function_exists('display_alert') returns false.
dshearin at excite dot com 08-Jul-2003 03:15
This can be used to conditionally define a user function. In this sense, it can act as a sort of inline include_once().

For example, suppose you have a function A that calls function B. B is only used inside function A and is never called from anywhere else in the script. It's logical (and perfectly legal in PHP) to define B inside of A's definition, like so:

<?php
function A($inputArray)
{
   if (!function_exists('B'))
   {
      function B($item)
      {
           // Do something with $item
         // and return result
          return $result;
      }
   }
   foreach ($inputArray as $nextItem) $outputArray[] = B($nextItem);
   return $outputArray;
}
?>

Without the function_exists test, you would get a fatal error the second time you called A, as PHP would think you were trying to redefine B (not legal in PHP). The placement of the test is also important. Since the if block is executed sequentially, like any other block of code, it must come before any call to the function defined within.


Liste toutes les fonctions définies

  • « function_exists
  • register_shutdown_function »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Liste toutes les fonctions définies

get_defined_functions

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

get_defined_functions — Liste toutes les fonctions définies

Description

get_defined_functions ( bool $exclude_disabled = false ) : array

Liste toutes les fonctions définies.

Liste de paramètres

exclude_disabled

Si les fonctions désactivé doivent être exclus de la valeur de retour.

Valeurs de retour

Retourne un tableau multidimensionnel, contenant la liste de toutes les fonctions définies, aussi bien les fonctions internes à PHP que celle déjà définie par l'utilisateur. Les noms des fonctions internes sont accessibles via $arr["internal"], et les fonctions utilisateur sont accessibles via $arr["user"].

Historique

Version | Description
7.0.15, 7.1.1 | Le paramètre exclude_disabled a été ajouté.

Exemples

Exemple #1 Exemple avec get_defined_functions()

<?php
function myrow($id, $data)
{
    return "<tr><th>$id</th><td>$data</td></tr>\n";
}

$arr = get_defined_functions();

print_r($arr);
?>

Résultat de l'exemple ci-dessus est similaire à :

Array
(
    [internal] => Array
        (
            [0] => zend_version
            [1] => func_num_args
            [2] => func_get_arg
            [3] => func_get_args
            [4] => strlen
            [5] => strcmp
            [6] => strncmp
            ...
            [750] => bcscale
            [751] => bccomp
        )

    [user] => Array
        (
            [0] => myrow
        )

)

Voir aussi

  • function_exists() - Indique si une fonction est définie
  • get_defined_vars() - Liste toutes les variables définies
  • get_defined_constants() - Retourne la liste des constantes et leurs valeurs
  • get_declared_classes() - Liste toutes les classes définies dans PHP

User Contributed Notes

Muneeb Aslam 27-Oct-2015 12:30
This is rather a simple non-confusing script to get the function names linked to its manual page on php.net. Hope it helps someone. Commented script is self explainatory

<?php

    /*declare a variable to php manual of functions.
    change the $lng to the region you want it for,
    i-e en/es/de etc etc */
    $lng = "es";
    $url = "http://www.php.net/manual/".$lng."/function.";

    // get defined functions in a variable (it will be a 2D array)
    $functions = get_defined_functions();

    // Run nested foreach to get the function names
    foreach($functions as $function){
        foreach ($function as $functionName){

            /* Since php manual is using hyphens instead of underscores
            for functions, we will convert underscores to hyphen whereever
            there is one. */
            if(strpos($functionName,"_") !== false){
                $functionForURL = str_replace("_","-",$functionName);
            } else {
                $functionForURL = $functionName;
            }

            /* echo the link */
            echo "<a href='".$url.$functionForURL.".php'>".$functionName."</a><br />";
        }
    }

?>
Muneeb Aslam 26-Oct-2015 07:46
We can also get the function names with this simple foreach

<?php

    //Since its a two dimensional array
    $functions = get_defined_functions();

    //We can use nested foreach to get the function names
    foreach($functions as $function){
         foreach($function as $thisFunc){
             echo $thisFunc . "<br />";
         }
     }

?>
kkuczok at gmail dot com 22-May-2013 08:14
You can list all arguments using ReflectionFunction class. It's not necessary to parse selected files/files as suggested by Nguyet.Duc.

http://php.net/manual/pl/class.reflectionfunction.php

Example:
<?php
function foo(&$bar, $big, $small = 1) {}
function bar($foo) {}
function noparams() {}
function byrefandopt(&$the = 'one') {}

$functions = get_defined_functions();
$functions_list = array();
foreach ($functions['user'] as $func) {
        $f = new ReflectionFunction($func);
        $args = array();
        foreach ($f->getParameters() as $param) {
                $tmparg = '';
                if ($param->isPassedByReference()) $tmparg = '&';
                if ($param->isOptional()) {
                        $tmparg = '[' . $tmparg . '$' . $param->getName() . ' = ' . $param->getDefaultValue() . ']';
                } else {
                        $tmparg.= '&' . $param->getName();
                }
                $args[] = $tmparg;
                unset ($tmparg);
        }
        $functions_list[] = 'function ' . $func . ' ( ' . implode(', ', $args) . ' )' . PHP_EOL;
}
print_r($functions_list);
?>

Output:
Array
(
    [0] => function foo ( &&bar, &big, [$small = 1] )

    [1] => function bar ( &foo )

    [2] => function noparams (  )

    [3] => function byrefandopt ( [&$the = one] )

)
Nguyet.Duc 30-Jul-2011 01:22
get_defined_functions() just returns a list of function names without function arguments. Here is the code to list user-defined function names plus arguments:

<?php
    $content = file_get_contents('example.php');
    preg_match_all("/(function )(\S*\(\S*\))/", $content, $matches);
    foreach($matches[2] as $match) {
        $function[] = "// " . trim($match) . "<br />\n";
    }
    natcasesort($function);
    $functionlist .= "/* Functions in this file */<br />\n";
    $functionlist .= "/**************************/<br />\n\n";
    $functionlist .= implode('', $function);
    echo $functionlist;
?>

Output:

/* Functions in this file */
/**************************/
// add_data($data)
// add_files($list)
// archive($name)
// bzip_file($name)
rob at webdimension dot co dot uk 01-Apr-2011 08:48
A quick way of using this function:

<?php
// ALL USER DEFINED FUNCTIONS
$arr = get_defined_functions();
foreach ($arr['user'] as $key => $value){
echo $value.'<br />';
}
// ALL USER DEFINED FUNCTIONS

// ALL INTERNAL FUNCTIONS
$arr = get_defined_functions();
foreach ($arr['internal'] as $key => $value){
echo $value.'<br />';
}
// ALL INTERNAL FUNCTIONS
?>
ChaosKaizer 10-Jul-2008 07:13
for user defined function

<?php
/**
 * @param string $function_name The user function name, as a string.
 * @return Returns TRUE if function_name  exists and is a function, FALSE otherwise.
 */
function user_func_exists($function_name = 'do_action') {

    $func = get_defined_functions();

    $user_func = array_flip($func['user']);

    unset($func);

    return ( isset($user_func[$function_name]) );
}
?>
strrev xc.noxeh@ellij 04-Jun-2008 05:31
Please note that functions created with create_function() are not returned.
(However that might change in a later version)
spudinski at gmail dot com 01-Apr-2008 06:13
To search for a function.
<html>
<head>
<title>List of all Internal functions</title>
<style type="text/css">
body {
    background-color: #FFFFFF;
    color: #222222;
    font-size: 11px;
    font-family: arial, tahoma;
}
table {
    color: #222222;
    font-size: 11px;
    font-family: arial, tahoma;
}
tr.found {
    background-color: #66EE00;
    font-weight: bold;
}
a:link {
    color: #222222;
}
a:visited {
    color: #CCCCCC;
}
a:active {
    color: #444444;
}
a:hover {
    text-decoration: underline;
}
</style>
</head>
<body>
<p>
    <form method="GET">
    Search: <input type="text" name="search"><br>
    <input type="submit">
    </form>
</p>
<?php
    if (!empty($_GET['search'])) {
        echo '<p>' . '<a href="#' . $_GET['search'] . '">' .
        'Goto ' . $_GET['search'] . '</a>' .
        '<script type="text/javascript">
            window.onload = function() {
                document.location += "#' . $_GET['search'] . '";
                return true;
            }
        </script>
        </p>';
    }
?>
<p>
    <table>
<?php
    $country = 'us';
    $functions = get_defined_functions();
    $functions = $functions['internal'];
    $num = 0;
    foreach($functions as $function) {
        $num++;
        echo '<tr ' . (($_GET['search'] == $function) ? 'class="found"' : '') . '><td>' .
        number_format($num) . '</td><td>' . '<a name="' . $function . '" href="http://' . $country . '.php.net/' .
        $function . '">' . $function . '</a>' . '</td></tr>';
    }
?>
    </table>
</p>
</body>
</html>
berchentreff at berchentreff dot de 31-Mar-2006 05:46
look at here, list all the defined function on your php-Version and give as well formatted output width links onto the php-manual:

<html><head>
<style type="text/css"><!--
li{font-family:Verdana,Arail,sans-serif;width:500px;margin-top:7px;}
a{padding:4px;}
a.a1{font-size:12px;background-color:#CCCCCC;color:#663300;}
a.a1:hover{background-color:#663300;color:#CCCCCC;}
a.a1:visited{background-color:#fff;color:#999;}
a.a1:visited:hover{background-color:#fff;color:#999;}
a.a0{font-size:12px;background-color:#CCCCFF;color:#663399;}
a.a0:hover{background-color:#663399;color:#CCCCFF;}
a.a0:visited{background-color:#ffC;color:#999;}
a.a0:visited:hover{background-color:#ffC;color:#999;}
--></style>
</head><body style="background-color:#999;">
<?php
$arr = get_defined_functions();

foreach($arr as $zeile){
sort($zeile);$s=0;
foreach($zeile as $bzeile){
$s=($s)?0:1;
echo "<li><a class='a".$s."'  href='http://de.php.net/".$bzeile."'>".$bzeile."</a></li>";}
}
?>
</body>
</html>
mIHATESPAMduskis at bates dot edu 21-Nov-2002 02:47
At least with PHP 4.2.3 on a GNU/Linux/Apache platform, get_defined_functions() returns user-defined functions as all-lower case strings regardless of how the functions are capitalized when they are defined.

Threw me for a loop.
peten at spam dot me dot not dot frontiernet dot net 02-Jun-2002 10:28
Here's a useful trick with the get_defined_functions function - show all available functions with a link to the documentation (you can even change the mirror it goes to):

<?php
  // the php mirror
  $php_host = "http://us2.php.net/";

  // the number of cols in our table
  $num_cols = 3;

  $ar = get_defined_functions();
  $int_funct = $ar[internal];
  sort($int_funct);
  $count = count($int_funct);
?>
<html>
 <head>
  <title>
   Available PHP Functions
  </title>
 </head>
 <body>
  <p>
   <?php print $count; ?> functions
    available on
    <?php
      print $_SERVER[SERVER_NAME];
     ?>
   (<a href="<?php print $php_host;?>"
    target="phpwin">php</a>
    version
    <?php print phpversion(); ?>)
  </p>
  <table align="center" border="2">
   <tr>
<?php
  for($i=0;$i<$count;$i++) {
    $doc = $php_host
     . "manual/en/function."
     . strtr($int_funct[$i], "_", "-")
     . ".php";
    print "    <td><a href=\"" . $doc
     . "\" target=\"phpwin\">"
     . $int_funct[$i]
     . "</a></td>\n";
    if(($i > 1)
     && (($i+$num_cols)%$num_cols==($num_cols-1)))
      print "   </tr>\n   <tr>\n";
    }
  for($i=($num_cols-($count%$num_cols));$i>0;$i--)
    print "    <td>&nbsp;</td>\n";
?>
  </table>
 </body>
</html>


Enregistre une fonction de rappel pour exécution à l'extinction

  • « get_defined_functions
  • register_tick_function »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Enregistre une fonction de rappel pour exécution à l'extinction

register_shutdown_function

(PHP 4, PHP 5, PHP 7, PHP 8)

register_shutdown_function — Enregistre une fonction de rappel pour exécution à l'extinction

Description

register_shutdown_function ( callable $callback , mixed ...$args ) : void

Enregistre une fonction de rappel callback pour exécution à l'extinction ou lorsque exit() est appelé.

Plusieurs appels à register_shutdown_function() sont possibles dans le même script, et les fonctions seront appelées dans le même ordre que celui dans lequel elles sont enregistrées. Si vous appelez exit() durant l'une des fonctions d'extinction, le processus sera définitivement arrêté, sans que les autres fonctions soient appelées.

Liste de paramètres

callback

La fonction de rappel à enregistrer.

La fonction de rappel est exécuté comme faisant parti de la requête, aussi, il est possible d'envoyer quelque à la sortie depuis cette dernière, puis d'accéder aux buffers de sortie.

args

Il est possible de passer des paramètres aux fonctions d'extinction en configurant ces paramètres supplémentaires.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

Si la fonction de rappel ne peut être appelée pour diverses raisons, une alerte de niveau E_WARNING sera émise.

Exemples

Exemple #1 Exemple avec register_shutdown_function()

<?php
function shutdown()
{
    // Voici notre fonction shutdown
    // dans laquelle nous pouvons faire
    // toutes les dernières opérations
    // avant la fin du script.

    echo 'Script exécuté avec succès', PHP_EOL;
}

register_shutdown_function('shutdown');
?>

Notes

Note:

Le dossier de travail du script peut changer dans la fonction d'extinction sous quelques serveurs web, e.g. Apache.

Note:

Les fonctions d'extinction ne seront pas exécutées si le processus est tué avec un signal SIGTERM ou SIGKILL. Bien que vous ne pouvez pas intercepter un SIGKILL, vous pouvez utiliser la fonction pcntl_signal() pour installer un gestionnaire pour un SIGTERM qui utilisera la fonction exit() pour mettre fin proprement.

Voir aussi

  • auto_append_file
  • exit() - Affiche un message et termine le script courant
  • La section sur la gestion des connexions

User Contributed Notes

ohcc at 163 dot com 09-Jun-2020 04:06
As of PHP 7.4, an exception thrown within the user-defined shutdown function can be caught by the user-defined exception handler.

<?php
    set_error_handler(
        function($level, $error, $file, $line){
            if(0 === error_reporting()){
                return false;
            }
            throw new ErrorException($error, -1, $level, $file, $line);
        },
        E_ALL
    );

    register_shutdown_function(function(){
        $error = error_get_last();
        if($error){
            throw new ErrorException($error['message'], -1, $error['type'], $error['file'], $error['line']);
        }
    });

    set_exception_handler(function($exception){
        // ... more code ...
    });

    require 'NotExists.php';
Anonymous 16-Mar-2019 10:08
warning: in addition to SIGTERM and SIGKILL, the shutdown functions won't run in response to SIGINT either. (observed on php 7.1.16 on windows 7 SP1 x64 + cygwin  and php 7.2.15 on Ubuntu 18.04)
marcelotpcruz at gmail dot com 28-Nov-2018 09:58
I elaborated following functions, so you can close your connection if you can't count on fastcgi_finish_request.

You'll use puts instead of echo, so you can close the connection whenever you want as long as you don't touch echo when you use those functions.
It works it compression and is easy to adapt:

function connsettings($name, $val=null){
    static $settings = array();

    if(!isset($settings[$name]))
        $settings[$name] = false;
    if($val !== null)
        $settings[$name] = $val;

    return $settings[$name];
};//Just saving compression and init var to check if it's true or false

function puts(){
//Using args so it works like echo with comma ands dots
    $numargs = func_num_args();
    $arg_list = func_get_args();
    $string = '';

    if($numargs === 0)
        return;
    else if($numargs > 1)
        for($i = 0; $i < $numargs; $i++)
            $string .= $arg_list[$i];
    else
        $string = $arg_list[0];

    if(connsettings('init') === false)
    {
        // buffer all upcoming output - make sure we care about compression:
        if(ob_start("ob_gzhandler"))
            connsettings('compression', true);
        else
            ob_start();

        connsettings('init', true);
        register_shutdown_function('puts', null, true);
    }
    echo $string;
}
function close(){
    if(!headers_sent())//it may work without this verification when no compression but may lead to uncomplete data
    {
        // send headers to tell the browser to close the connection
        ob_end_flush(); // Order here matter, it won't work if it goes after Content-Length
        if(connsettings('compression') === false)
            header("Content-Encoding: none");
        header('Content-Length: ' . ob_get_length());
        header('Connection: close');
        // flush all output
        //ob_end_flush();
        ob_flush();
        flush();
        // close current session
        if (session_id()) session_write_close();
        set_time_limit(0);
        ignore_user_abort(true);
    }
}
raat1979 at gmail dot com 08-Feb-2017 07:31
I wanted to set the exit code for a CLI application from a shutdown function by using a class property,

Unfortunataly (as per manual)  "If you call exit() within one registered shutdown function, processing will stop completely and no other registered shutdown functions will be called."

As a result if I call exit in my shutdown function I will break other shutdown functions (like one that logs fatal errors to syslog)

However! (as per manual)  "Multiple calls to register_shutdown_function() can be made, and each will be called in the same order as they were registered."

As luck would have it you are also able to register a shutdown function from within a shutdown function (at least in PHP 7.0.15 and 5.6.30)

in other words if you register a shutdown function inside a shutdown function it is appended to the shutdown function queue.

<?php
class SomeApplication{
    private $exitCode = null;

    public function __construct(){
        register_shutdown_function(function(){
        echo "some registered shutdown function";
            register_shutdown_function(function(){
                echo "last registered shutdown function";
                // one might even consider another register shutdown_function if one expects other shutdown functions to do the same...
                exit($this->exitCode === null ? 0 : $this->exitCode);
            });
        });
    }
}
?>
xcl_rockman at qq dot com 25-Sep-2015 06:02
for static call
register_shutdown_function(function () {
                demo::shutdownFunc();
});
m dot agkopian at gmail dot com 30-Apr-2014 10:29
Use this small snippet inside your bootstrap in order to always have a way to know reliably what was the last page of your site that the user have visited, without having to use $_SERVER['HTTP_REFERER'].

<?php
session_start();

// Get current page
$current_page = htmlspecialchars($_SERVER['SCRIPT_NAME'], ENT_QUOTES, 'UTF-8');
$current_page .= $_SERVER['QUERY_STRING'] ? '?'.htmlspecialchars($_SERVER['QUERY_STRING'], ENT_QUOTES, 'UTF-8') : '';

// Set previous page at the end
register_shutdown_function(function ($current_page) {
    $_SESSION['previous_page'] = $current_page;
}, $current_page);
?>
Tim 01-Nov-2013 04:35
register_shutdown_function seems to be immune to whatever value was set with set_time_limit or the max_execution_time value defined in php.ini.
<?php
function asdf() {
    echo microtime(true) . '<br>';
    sleep(1);
    echo microtime(true) . '<br>';
    sleep(1);
    echo microtime(true) . '<br>';
}
register_shutdown_function('asdf');
set_time_limit(1);

while(true) {}
?>
The output is three lines.
matteosistisette at gmail dot com 13-Apr-2013 05:42
In PHP 5.1.6 things don't work as described here.

The truth is that connection_status() just always returns 0 whether or not the client has aborted (e.g. the user hit the stop button), and that (consistently with this) the registered shutdown function will only be called on exit, but NOT when the connection is aborted from the user.

That is, PHP does NOT detect when the connection is aborted.
alexyam at live dot com 08-Apr-2012 03:50
When using php-fpm, fastcgi_finish_request() should be used instead of register_shutdown_function() and exit()

For example, under nginx and php-fpm 5.3+, this will make browsers wait 10 seconds to show output:

<?php
    echo "You have to wait 10 seconds to see this.<br>";
    register_shutdown_function('shutdown');
    exit;
    function shutdown(){
        sleep(10);
        echo "Because exit() doesn't terminate php-fpm calls immediately.<br>";
    }
?>

This doesn't:

<?php
    echo "You can see this from the browser immediately.<br>";
    fastcgi_finish_request();
    sleep(10);
    echo "You can't see this form the browser.";
?>
david dot schueler at tel-billig dot de 11-Nov-2010 04:51
I had a problem when forking a child process and accessing the variables by using the "global" keyword in the shutdown function.
So i used another way for getting the variables to the shutdown function: I passed them by reference.

Example:
<?php
function shutdown_function (&$test) {
    echo __FUNCTION__.'(): $test = '.$test."\n";
}

$test = 1;
register_shutdown_function('shutdown_function', &$test);
echo '$test = '.$test."\n";

// do some stuff and change the variable values
$test = 2;

// now the shutdown function gets called
exit(0);
?>

Maybe tis helps someone. (I'm using PHP 5.2.11)
emanueledelgrande ad email dot it 19-Sep-2010 07:53
A lot of useful services may be delegated to this useful trigger.
It is very effective because it is executed at the end of the script but before any object destruction, so all instantiations are still alive.

Here's a simple shutdown events manager class which allows to manage either functions or static/dynamic methods, with an indefinite number of arguments without using any reflection, availing on a internal handling through func_get_args() and call_user_func_array() specific functions:

<?php
// managing the shutdown callback events:
class shutdownScheduler {
    private $callbacks; // array to store user callbacks

    public function __construct() {
        $this->callbacks = array();
        register_shutdown_function(array($this, 'callRegisteredShutdown'));
    }
    public function registerShutdownEvent() {
        $callback = func_get_args();

        if (empty($callback)) {
            trigger_error('No callback passed to '.__FUNCTION__.' method', E_USER_ERROR);
            return false;
        }
        if (!is_callable($callback[0])) {
            trigger_error('Invalid callback passed to the '.__FUNCTION__.' method', E_USER_ERROR);
            return false;
        }
        $this->callbacks[] = $callback;
        return true;
    }
    public function callRegisteredShutdown() {
        foreach ($this->callbacks as $arguments) {
            $callback = array_shift($arguments);
            call_user_func_array($callback, $arguments);
        }
    }
    // test methods:
    public function dynamicTest() {
        echo '_REQUEST array is '.count($_REQUEST).' elements long.<br />';
    }
    public static function staticTest() {
        echo '_SERVER array is '.count($_SERVER).' elements long.<br />';
    }
}
?>

A simple application:

<?php
// a generic function
function say($a = 'a generic greeting', $b = '') {
    echo "Saying {$a} {$b}<br />";
}

$scheduler = new shutdownScheduler();

// schedule a global scope function:
$scheduler->registerShutdownEvent('say', 'hello!');

// try to schedule a dyamic method:
$scheduler->registerShutdownEvent(array($scheduler, 'dynamicTest'));
// try with a static call:
$scheduler->registerShutdownEvent('scheduler::staticTest');

?>

It is easy to guess how to extend this example in a more complex context in which user defined functions and methods should be handled according to the priority depending on specific variables.

Hope it may help somebody.
Happy coding!
clover at fromru dot com 01-Jun-2010 02:17
If you register function that needs to be running last (for example, close database connection) - just register another shutdown function from shutdown function:
<?php
function test1(){
  register_shutdown_function('test_last');
}

function test2(){/*...*/}
function test3(){/*...*/}
function test_last(){/*...*/}

register_shutdown_function('test1');
register_shutdown_function('test2');
register_shutdown_function('test3');
?>

the script will call functions in correct order: test1, test2, test3, test_last
sander @ unity-x 12-May-2010 03:42
simple method to disconnect the client and continue processing:

<?php
function endOutput($endMessage){
    ignore_user_abort(true);
    set_time_limit(0);
    header("Connection: close");
    header("Content-Length: ".strlen($endMessage));
    echo $endMessage;
    echo str_repeat("\r\n", 10); // just to be sure
    flush();
}

// Must be called before any output
endOutput("thank you for visiting, have a nice day');

sleep(100);
mail("you@yourmail.com", "ping", "i'm here");
?>
jawsper at aximax dot nl 20-Apr-2010 05:21
Something found out during testing:

the ini auto_append_file will be included BEFORE the registered function(s) will be called.
ravenswd at gmail dot com 21-Dec-2009 01:43
You may get the idea to call debug_backtrace or debug_print_backtrace from inside a shutdown function, to trace where a fatal error occurred. Unfortunately, these functions will not work inside a shutdown function.
Ant P. 02-Oct-2009 12:13
As of PHP 5.3.0, the last note about unpredictable working directory also applies to FastCGI, when previously it didn't.
Anonymous 17-Sep-2009 05:29
Note that if the handler function is private static it will never be called! It must be public!
Filip Dalge 16-Aug-2009 08:35
The following function register_close_function should reproduce the former php behavior of closing the connection before executing the shutdown handler, based on the code posted by sts at mail dot xubion dot hu. It does not work on any machine.

<?php
function register_close_function($func) {
  register_close_function::$func = $func;
  register_shutdown_function(array("register_close_function", "close"));
  ob_start();
}
class register_close_function {
  // just a container
  static $func;
  function close() {
    header("Connection: close");
    $size = ob_get_length();
    header("Content-Length: $size");
    ob_end_flush();
    flush();
    call_user_func(register_close_function::$func);
  }
}
?>
pgl at yoyo dot org 02-Aug-2009 02:25
You definitely need to be careful about using relative paths in after the shutdown function has been called, but the current working directory doesn't (necessarily) get changed to the web server's ServerRoot - I've tested on two different servers and they both have their CWD changed to '/' (which isn't the ServerRoot).

This demonstrates the behaviour:

<?php
function echocwd() { echo 'cwd: ', getcwd(), "\n"; }

register_shutdown_function('echocwd');
echocwd() and exit;
?>

Outputs:

cwd: /path/to/my/site/docroot/test
cwd: /

NB: CLI scripts are unaffected, and keep their CWD as the directory the script was called from.
cFreed at orange dot fr 14-Mar-2009 09:36
May be obvious for most people, but I spent time to clearly understand something which is only INDIRECTLY mentioned by the manual, so I hope this useful for someones.

Pay attention to the function prototype: the $function argument is a callback one (follow the link for more information).
This means that you must write this argument differently depending on the $function context:
. function-name, as a string, when it is a built-in or user-defined function
. array(class-name, method-name), when it is an object method
SonOfTron 05-Oct-2008 06:24
You can achieve similar results by using auto_append_file in the php.ini or .htaccess file:
(php.ini)
auto_append_file = /my-auto-append-file.php
(.htaccess)
php_value auto_append_file /my-auto-append-file.php
RLK 14-Sep-2008 02:26
Contrary to the the note that "headers are always sent" and some of the comments below - You CAN use header() inside of a shutdown function as you would anywhere else; when headers_sent() is false. You can do custom fatal handling this way:

<?php
ini_set('display_errors',0);
register_shutdown_function('shutdown');

$obj = new stdClass();
$obj->method();

function shutdown()
{
  if(!is_null($e = error_get_last()))
  {
    header('content-type: text/plain');
    print "this is not html:\n\n". print_r($e,true);
  }
}
?>
Fuzika 13-Aug-2007 05:27
Sinured's example of how to use a static method did not work for me.
But this did:

<?php
register_shutdown_function(array('theClass','theStaticMethod'));
?>

Hope this helps someone.

[EDIT by danbrown AT php DOT net: This example did not work for the author of this note because it is written for PHP 5.  The author was using PHP 4.]
Sinured 10-Aug-2007 06:26
You can use a static method of a class as a shutdown function without passing an instance. I think that doesn't make too much sense, however it's possible.

<?php
register_shutdown_function('someClass::someMethod');
?>

If this method is *NOT* static, then PHP will complain about an invalid callback instead of just emitting an E_STRICT error.
buraks78 at gmail dot com 01-Jul-2007 05:51
Read the post regarding the change of working directory to ServerRoot carefully. This means that require_once "path/to/script" (or similar constructs) with relative paths will not work in shutdown functions.
Ldkronos 25-Jan-2007 09:55
It's already been discussed on the zlib page ( http://www.php.net/zlib ), but hasn't been mention here...

When zlib compression is enabled, register_shutdown_function doesn't work properly. Anything output from your shutdown function will not be readable by the browser. Firefox just ignores it. IE6 will show you a blank page.

The workaround that worked for me is to add the following to the top of the script.
ini_set('zlib.output_compression', 0);
dweingart at pobox dot com 13-Mar-2006 08:53
I have discovered a change in behavior from PHP 5.0.4 to PHP 5.1.2 when using a shutdown function in conjunction with an output buffering callback.

In PHP 5.0.4 (and earlier versions I believe) the shutdown function is called after the output buffering callback.

In PHP 5.1.2 (not sure when the change occurred) the shutdown function is called before the output buffering callback.

Test code:
<?php
function ob_callback($buf) {
    $buf .= '<li>' . __FUNCTION__ .'</li>';
    return $buf;
}

function shutdown_func() {
    echo '<li>' . __FUNCTION__ .'</li>';
}

ob_start('ob_callback');
register_shutdown_function('shutdown_func');
echo '<ol>';
?>

PHP 5.0.4:

1. ob_callback
2. shutdown_func

PHP 5.1.2:

1. shutdown_func
2. ob_callback
me at thomaskeller dot biz 11-Mar-2006 02:27
Well, it might be obvious, but one should remember that one cannot send any HTTP header in the shutdown callback.

Something like

<?php

function redirect()
{
     header("Location: myuri.php");
}

register_shutdown_function("redirect");

// do something useful here

?>

doesn't work and PHP sends out the popular "headers already sent" warning.

I tried to set a redirection target somewhere in the script, but wanted to make sure that it was only set/executed at the very end of the script, since my custom redirect function also cleaned any output buffers at that point. Well, no luck here =)
kenneth dot kalmer at gmail dot com 27-Jan-2006 09:26
I performed two tests on the register_shutdown_function() to see under what conditions it was called, and if a can call a static method from a class. Here are the results:

<?php
/**
 * Tests the shutdown function being able to call a static methods
 */
class Shutdown
{
    public static function Method ($mixed = 0)
    {
        // we need absolute
        $ap = dirname (__FILE__);
        $mixed = time () . " - $mixed\n";
        file_put_contents ("$ap/shutdown.log", $mixed, FILE_APPEND);
    }
}
// 3. Throw an exception
register_shutdown_function (array ('Shutdown', 'Method'), 'throw');
throw new Exception ('bla bla');

// 2. Use the exit command
//register_shutdown_function (array ('Shutdown', 'Method'), 'exit');
//exit ('exiting here...')

// 1. Exit normally
//register_shutdown_function (array ('Shutdown', 'Method'));
?>

To test simply leave one of the three test lines uncommented and execute. Executing bottom-up yielded:

1138382480 - 0
1138382503 - exit
1138382564 - throw

HTH
sezer yalcin 26-Dec-2005 09:11
re:codeslinger at compsalot dot com

fork() is actually creating 2 processes from one. So there is no surprise register_shutdown_function will be executed per each process.

I think you have reported this as a bug and now in php 5.1.0 when you exit from child process, it does not execute it. Well, what are you going to do if you have something to register for forked process?

I hope php will be more stable near soon!

codeslinger at compsalot dot com
03-Feb-2005 09:22
Here is a nice little surprise to keep in mind...

If you register a shutdown function for your main program.  And then you fork() a child.

Guess What?
When the child exits it will run the code that was intended for the main program.  This can be a really bad thing  ;-)

Happily there is a simple work-around.  All you need to do is to create a global variable such as:

$IamaChild = [TRUE | FALSE];

and have your shutdown function check the value...
http://livejournal.com/~sinde1/ 02-Dec-2005 04:49
If you want to do something with files in function, that registered in register_shutdown_function(), use ABSOLUTE paths to files instead of relative. Because when script processing is complete current working directory chages to ServerRoot (see httpd.conf)
Niels Ganser <php dot comment at depoll dot de> 22-Sep-2005 07:58
Just a quick note: from 5.0.5 on objects will be unloaded _before_ your shutdown function is called which means you can't use previously initiated objects (such as mysqli).

See bug 33772 for more information.
codeslinger at compsalot dot com 03-Feb-2005 09:22
Here is a nice little surprise to keep in mind...

If you register a shutdown function for your main program.  And then you fork() a child.

Guess What?
When the child exits it will run the code that was intended for the main program.  This can be a really bad thing  ;-)

Happily there is a simple work-around.  All you need to do is to create a global variable such as:

$IamaChild = [TRUE | FALSE];

and have your shutdown function check the value...
astrolox at lawyersonline dot co dot uk 18-Mar-2004 11:57
When using the register_shutdown_function command in php 4. The registered functions are called in the order that you register them.

This is important to note if you are doing database work using classes that register shutdown functions for themselves.

You must register the shutdown_functions in the order that you want things to shutdown. ( ie the database needs to shutdown last )

Example of what will not work but what you might expect to work :

<?php
class database {

        function database() {
                echo "connect to sql server -- (database :: constructor)<br>\n";
                register_shutdown_function( array( &$this, "phpshutdown" ) );
                $this->connected = 1;
        }

        function do_sql( $sql ) {
                if ( $this->connected == 1 ) {
                        echo "performing sql -- (database :: do_sql)<br>\n";
                } else {
                        echo " ERROR -- CAN NOT PERFORM SQL -- NOT CONNECTED TO SERVER -- (database :: do_sql)<br>\n";
                }
        }

        function phpshutdown() {
                echo "close connection to sql server -- <b>(database :: shutdown)</b><br>\n";
                $this->connected = 0;
        }
}

class table {

        function table( &$database, $name ) {
                $this->database =& $database;
                $this->name = $name;
                echo "read table data using database class -- name=$this->name -- (table :: constructor)<br>\n";
                register_shutdown_function( array( &$this, "phpshutdown" ) );
                $this->database->do_sql( "read table data" );
        }

        function phpshutdown() {
                echo "save changes to database -- name=$this->name -- <b>(table :: shutdown)</b><br>\n";
                $this->database->do_sql( "save table data" );
        }
}

$db =& new database();

$shoppingcard =& new table( &$db, "cart " );
?>

Output of the above example is :-

connect to sql server -- (database :: constructor)
read table data using database class -- name=cart -- (table :: constructor)
performing sql -- (database :: do_sql)
close connection to sql server -- (database :: shutdown)
save changes to database -- name=cart -- (table :: shutdown)
ERROR -- CAN NOT PERFORM SQL -- NOT CONNECTED TO SERVER -- (database :: do_sql)
Jim Smith 15-Mar-2004 04:17
I was trying to figure out how to pass parameters to the register_shutdown_function() since you cannot register a function with parameters and passing through globals is not appropriate. E.g. what I was trying to do was  <? register_shutdown_function("anotherfunction('parameter')") ?>
Turns out, the trick is to use create_function() to create a "function" that calls the desired function with static parameters.

<?php
$funtext="mail('u@ho.com','mail test','sent after shutdown');";
register_shutdown_function(create_function('',$funtext));
?>

Here's another example showing in-line logging and a post-execution version:

Before: in-process logging

<?php
function logit($message) {
   $oF=fopen('TEST.log', 'a');
   fwrite($oF,"$message\n");
   fclose($oF);
   sleep(5);  // so you can see the delay
}
print "loging";
logit("traditional execution");
print "logged";
exit;
?>
After:

<?php
function logit($message) {
   $forlater=create_function('',"loglater('$message');");
   register_shutdown_function($forlater);
}
function loglater($message) {
   $oF=fopen('TEST.log', 'a');
   fwrite($oF,"$message\n");
   fclose($oF);
   sleep(5);  // so you can see the delay
}
print "loging";
logit("delayed execution");
print "logged";
exit;
?>

In the 'before' example, the file is written (and the delay occurs) before the "logged" appears. In the 'after' example, the file is written after execution terminates.

Maybe it would be nice to add a parameter to the register_shutdown_function that does this automatically?
sts at mail dot xubion dot hu 15-Mar-2004 02:56
If you need the old (<4.1) behavior of register_shutdown_function you can achieve the same with "Connection: close" and "Content-Length: xxxx" headers if you know the exact size of the sent data (which can be easily caught with output buffering).
An example:
<?php
header("Connection: close");
ob_start();
phpinfo();
$size=ob_get_length();
header("Content-Length: $size");
ob_end_flush();
flush();
sleep(13);
error_log("do something in the background");
?>

The same will work with registered functions.
According to http spec, browsers should close the connection when they got the amount of data specified in Content-Length header. At least it works fine for me in IE6 and Opera7.
James Wyse (James [at] tastyspoon.com) 12-Feb-2004 08:49
Just a note to say that if your function uses paths relative to the script you are running (ie. for reading files, "../dir/" etc) then your function may not work correctly when registered as a shutdown function. I'm not sure where the 'working dir' IS when running a shutdown function but I find it best to use absolute paths ("/home/www/dir/").
phpmanual at NO_SPHAMnetebb dot com 15-Nov-2003 08:31
Given this code:

<?php
class CallbackClass {
    function CallbackFunction() {
        // refers to $this
    }

    function StaticFunction() {
        // doesn't refer to $this
    }
}

function NonClassFunction() {
}
?>

there appear to be 3 ways to set a callback function in PHP (using register_shutdown_function() as an example):

1: register_shutdown_function('NonClassFunction');

2: register_shutdown_function(array('CallbackClass', 'StaticFunction'));

3: $o =& new CallbackClass();
   register_shutdown_function(array($o, 'CallbackFunction'));

The following may also prove useful:

<?php
class CallbackClass {
    function CallbackClass() {
        register_shutdown_function(array(&$this, 'CallbackFunction')); // the & is important
    }

    function CallbackFunction() {
        // refers to $this
    }
}
?>
jules at sitepointAASASZZ dot com 01-Jul-2003 12:41
If your script exceeds the maximum execution time, and terminates thusly:

Fatal error: Maximum execution time of 20 seconds exceeded in - on line 12

The registered shutdown functions will still be executed.

I figured it was important that this be made clear!
php at spandex dot deleteme dot nildram dot co dot uk 28-Apr-2003 01:43
I've had immense trouble getting any of the examples of emulated destructors to work.  They always seemed to have a copy of the object just after initialisation.  Many people mention that the register_shutdown_function will take a copy of the object rather than a reference... and this can be cured with an ampersand.  If you look in the PEAR docs for the way they emulate destructors you'll find that you also need one before the "new" statement when you create an instance of your object.  There's an editors note above that mentions this too... but I thought I'd collect it all here in one example that really works.  Honest... I'm using it (PHP 4.3.1):

<?php
class Object {
    var $somevar = "foo";

    function Object() {
        $somevar = "bar";
        register_shutdown_function(array(&$this, 'MyDestructor'));
    }

    function MyDestructor() {
        # Do useful destructor stuff here...
    }
}

# Now create the object as follows and then 'MyDestructor'
# will be called on shutdown and will be able to operate on
# the object as it ended up... not as it started!
$my_object =& new Object;
?>
kwazy at php dot net 29-Jan-2003 07:53
One more note to add about register_shutdown_function and objects.

It is possible to self-register the object from the constructor, but even using the syntax:
register_shutdown_function(array(&$this,'shutdown'))

will only result in the function being called with the object in the "just initialized" state, any changes made to the object after construction will not be there when the script actually exits.

But if you use:

<?php
$obj = new object();
register_shutdown_function(array(&$obj,'shutdown'));
?>

the object method 'shutdown' will be called with the current state of the object intact.

[Editor's note: The explanation for this behavior is really simple.
"$obj = new object()" creates a copy of the object which you can refer with $this in the object's constructor.
To solve this "problem" you should use "$obj = &new object()" which assign the reference to the current object.]
23-Oct-2002 09:35
When using CLI ( and perhaps command line without CLI - I didn't test it) the shutdown function doesn't get called if the process gets a SIGINT or SIGTERM. only the natural exit of PHP calls the shutdown function.
To overcome the problem compile the command line interpreter with --enable-pcntl and add this code:

<?php
function sigint()
{
    exit;
}
pcntl_signal(SIGINT, 'sigint');
pcntl_signal(SIGTERM, 'sigint');
?>

This way when the process recieves one of those signals, it quits normaly, and the shutdown function gets called.
Note: using the pcntl function in web server envoirment is considered problematic, so if you are writing a script that runs both from the command line and from the server, you should put some conditional code around that block that identifies wheater this is a command line envoirment or not.
adam at saki dot com dot au 20-Aug-2002 03:38
When using objects the syntax register_shutdown_function(array($object, 'function')) will take a copy of the object at the time of the call.  This means you cannot do this in the constructor and have it correctly destruct objects.  The alternative is to use register_shutdown_function(array(&$object, 'function')) where the ampersand passes the reference and not the copy.  This appears to work fine.
priebe at mi-corporation dot com 14-Mar-2002 08:25
Note that register_shutdown_function() does not work under Apache on Windows platforms.  Your shutdown function will be called, but the connection will not close until the processing is complete.  Zend tells me that this is due to a difference between Apache for *nix and Apache for Windows.

I'm seeing similar behavior under IIS (using php4isapi).


Enregistre une fonction exécutée à chaque tick

  • « register_shutdown_function
  • unregister_tick_function »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Enregistre une fonction exécutée à chaque tick

register_tick_function

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

register_tick_function — Enregistre une fonction exécutée à chaque tick

Description

register_tick_function ( callable $callback , mixed ...$args ) : bool

register_tick_function() enregistre la fonction callback pour être exécutée à chaque fois qu'un tick survient.

Liste de paramètres

callback

La fonction à enregistrer.

args

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec register_tick_function()

<?php
declare(ticks=1);

// Utilisation d'une fonction de callback
register_tick_function('my_function', true);

// Utilisation d'une méthode d'objet
$object = new my_class();
register_tick_function(array(&$object, 'my_method'), true);
?>

Notes

Avertissement

register_tick_function() ne doit pas être utilisé avec les serveurs web threadé, en PHP 5.2 et plus anciens.

Voir aussi

  • declare
  • unregister_tick_function() - Annule la fonction exécutée à chaque tick

User Contributed Notes

Peter Featherstone 08-Jun-2017 09:03
Due to an implementation bug, the declare(ticks=1) directive leaked into different compilation units prior to PHP 7.0. This is not how declare() directives, which are per-file or per-scope, are supposed to work.

Therefore there are different implementations between PHP 5.6 and the correct implementation has been added in PHP 7.0. This means the below script will return different results

#index.php

<?php

declare(ticks=1);
$count = 0;

register_tick_function('ticker');
function ticker() {
  global $count;
  $count++;
}

?>

#inc.php

<?php

$baz = "baz";
$qux = "qux";

?>

Running php index.php in the terminal gives:

    PHP 5.6 - 7
    PHP 7.0 - 5
Carlos Granados 04-Jan-2017 05:59
A working example with variable input for validating the asymptotic analysis of your algorithm:

<?php

$n = 1000; // Size of your input

declare(ticks=1);

class Counter {
    private $counter = 0;

    public function increase()
    {
        $this->counter++;
    }

    public function print()
    {
        return $this->counter;
    }
}

$obj = new Counter;

register_tick_function([&$obj, 'increase'], true);

for ($i = 0; $i < 100; $i++)
{
    $a = 3;
}

// unregister_tick_function([&$obj, 'increase']);
// Not sure how to de-register, you can use static methods and members in the Counter instead.

var_dump("Number of basic low level operations: " . $obj->print());

?>
Ahmad Samiei 30-Aug-2013 03:41
put in in your index to find where your code exited. find die o exit

function shutdown_find_exit()
{
var_dump($GLOBALS['dbg_stack']);
}
register_shutdown_function('shutdown_find_exit');
function write_dbg_stack()
{
$GLOBALS['dbg_stack'] = debug_backtrace();
}
register_tick_function('write_dbg_stack');
declare(ticks=1);
rob dot eyre at gmail dot com 22-Jul-2011 05:19
It looks like register_tick_function() can accept an anonymous function, but unregister_tick_function() cannot
Jeremy 21-Jun-2007 11:03
I tried the following on an IIS 6/PHP 5 machine:

<?php

    set_time_limit(0);

    function profiler($return = false)
    {
        static $m = 0;
        if($return) return $m . " bytes";
        if(($mem = memory_get_usage()) > $m) $m = $mem;
    }

    register_tick_function('profiler');
    declare(ticks = 1);

    $numbers = array();
    for($i=0; $i<1000000; $i++)
    {
        print($i . "<br />");
    }

    print(profiler(true));

?>

...and got the following errors:

1) PHP has encountered an Unhandled Exception Code -1073741674 at 0435EC5A
2) PHP has encountered an Access Violation at 02727891
3) PHP has encountered an Access Violation at 02727879
4) PHP has encountered an Access Violation at 00000000

So far the code hasn't crashed the web server, but like the warning says, "register_tick_function() should not be used with threaded web server modules. Ticks are not working in ZTS mode and may crash your web server."

Strangely enough, the code does execute successfully every once in a while.


Annule la fonction exécutée à chaque tick

  • « register_tick_function
  • Quickhash »
  • PHP Manual
  • Fonctions sur la gestion des fonctions
  • Annule la fonction exécutée à chaque tick

unregister_tick_function

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

unregister_tick_function — Annule la fonction exécutée à chaque tick

Description

unregister_tick_function ( callable $callback ) : void

Annule l'exécution automatique de function à chaque tick.

Liste de paramètres

callback

La fonction à annuler.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • register_tick_function() - Enregistre une fonction exécutée à chaque tick

User Contributed Notes

ElectricHeart at ya dot ru 04-May-2016 09:14
You can unregister closure-function:

declare(ticks = 1000);
$startTime = microtime(true);
$tick = true;
$closure = function () use ($startTime, &$tick) {
    if (((microtime(true) - $startTime) > 5) && $tick) {
        $tick = false;
        throw new \Exception('Time to run code left');
    }
};

try {
            register_tick_function($closure);
            //do your code
            $result = 1;
            return $result;
        } catch (\Exception $e) {
            throw $e;
        } finally {
            unregister_tick_function($closure);
}
Greg 27-Jul-2012 12:02
It's not so clear, but, at least as of PHP 5.3.13, you cannot use this inside of the handler itself as it will throw an error:

<?php

declare(ticks=2);

function tick_handler()
{
    unregister_tick_function('tick_handler');
}

register_tick_function('tick_handler');

set_time_limit(0);
usleep(500000);

?>

results in:

warning: unregister_tick_function(): Unable to delete tick function executed at the moment in [filename]

So if you want to unregister it must be done outside of the handler.
rob dot eyre at gmail dot com 22-Jul-2011 05:22
Note that unregister_tick_function() can also accept a callback in the form of an array (either static, like array($className, $methodName) or instance, like array(&$this, $methodName)).

It cannot accept an anonymous function, however.


Quickhash

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
  • Constantes pré-définies
  • Exemples
  • QuickHashIntSet — La classe QuickHashIntSet
    • QuickHashIntSet::add — Ajoute une nouvelle entrée à l'ensemble
    • QuickHashIntSet::__construct — Créer un nouvel objet QuickHashIntSet
    • QuickHashIntSet::delete — Supprime une entrée de l'ensemble
    • QuickHashIntSet::exists — Vérifie qu'une clé existe dans l'ensemble
    • QuickHashIntSet::getSize — Retourne le nombre d'éléments dans l'ensemble
    • QuickHashIntSet::loadFromFile — Créer un ensemble depuis un fichier
    • QuickHashIntSet::loadFromString — Créer un nouvel ensemble depuis une chaine
    • QuickHashIntSet::saveToFile — Stocke un ensemble sur le disque
    • QuickHashIntSet::saveToString — Retourne une version sérialisée de l'ensemble
  • QuickHashIntHash — La classe QuickHashIntHash
    • QuickHashIntHash::add — Ajoute une nouvelle entrée au hash
    • QuickHashIntHash::__construct — Créer un nouvel objet QuickHashIntHash
    • QuickHashIntHash::delete — Supprime une entrée du hash
    • QuickHashIntHash::exists — Vérifie qu'une clé existe dans le hash
    • QuickHashIntHash::get — Récupère la valeur correspondant à une clé dans le hash
    • QuickHashIntHash::getSize — Retourne le nombre d'éléments dans le hash
    • QuickHashIntHash::loadFromFile — Créer un hash depuis un fichier
    • QuickHashIntHash::loadFromString — Créer un hash depuis une chaine
    • QuickHashIntHash::saveToFile — Stocke un hash sur le disque
    • QuickHashIntHash::saveToString — Retourne une version sérialisée du hash
    • QuickHashIntHash::set — Met à jour une entrée dans le hash ou l'ajoute si elle n'existait pas
    • QuickHashIntHash::update — Met à jour une entrée dans le hash
  • QuickHashStringIntHash — The QuickHashStringIntHash class
    • QuickHashStringIntHash::add — Ajoute une nouvelle entrée dans la table de hachage
    • QuickHashStringIntHash::__construct — Crée un nouvel objet QuickHashStringIntHash
    • QuickHashStringIntHash::delete — Supprime une entrée de la table de hachage
    • QuickHashStringIntHash::exists — Vérifie si une clé fait partie de la table de hachage
    • QuickHashStringIntHash::get — Récupère une valeur depuis la table de hachage par sa clé
    • QuickHashStringIntHash::getSize — Retourne le nombre d'éléments dans la table de hachage
    • QuickHashStringIntHash::loadFromFile — Crée une table de hachage depuis un fichier
    • QuickHashStringIntHash::loadFromString — Crée une table de hachage depuis une chaîne
    • QuickHashStringIntHash::saveToFile — Sauvegarde une table de hachage en mémoire sur le disque
    • QuickHashStringIntHash::saveToString — Retourne une version linéarisée de la table de hachage
    • QuickHashStringIntHash::set — Met à jour une entrée de la table de hachage avec une nouvelle valeur ou l'ajout si elle n'existe pas
    • QuickHashStringIntHash::update — Mets à jour une entrée de la table de hachage avec une nouvelle valeur
  • QuickHashIntStringHash — The QuickHashIntStringHash class
    • QuickHashIntStringHash::add — Cette méthode ajoute une nouvelle entrée à la table de hachage
    • QuickHashIntStringHash::__construct — Crée un nouvel objet QuickHashIntStringHash
    • QuickHashIntStringHash::delete — Supprime une entrée de la table de hachage
    • QuickHashIntStringHash::exists — Vérifie si une clé existe dans la table de hachage
    • QuickHashIntStringHash::get — Récupère une valeur depuis la table de hachage par sa clé
    • QuickHashIntStringHash::getSize — Retourne le nombre d'éléments de la table de hachage
    • QuickHashIntStringHash::loadFromFile — Crée une table de hachage depuis un fichier
    • QuickHashIntStringHash::loadFromString — Crée une table de hachage depuis une chaîne
    • QuickHashIntStringHash::saveToFile — Stocke une table de hachage en mémoire sur le disque
    • QuickHashIntStringHash::saveToString — Retourne une version linéarisée de la table de hachage
    • QuickHashIntStringHash::set — Met à jour une entrée depuis la table de hachage avec une nouvelle valeur, ou l'ajoute si l'entrée n'existe pas
    • QuickHashIntStringHash::update — Met à jour une entrée de la table de hachage avec une nouvelle valeur

User Contributed Notes

There are no user contributed notes for this page.


Introduction

L'extension quickhash contient un ensemble de classes à types gérant des implémentations spécifiques des hash et des ensembles.

User Contributed Notes

There are no user contributed notes for this page.


Pré-requis

Cette extension ne requière aucune bibliothèque additionnelle.

User Contributed Notes

There are no user contributed notes for this page.


Installation

Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » https://pecl.php.net/package/quickhash

User Contributed Notes

There are no user contributed notes for this page.


Exemples

Exemple #1 Exemple avec Quickhash

<?php
$set = new QuickHashIntSet( 1024, QuickHashIntSet::CHECK_FOR_DUPES );
$set->add( 1 );
$set->add( 3 );

var_dump( $set->exists( 3 ) );
var_dump( $set->exists( 4 ) );

$set->saveToFile( "/tmp/test-set.set" );

$newSet = QuickHashIntSet::loadFromFile(
    "/tmp/test-set.set"
);

var_dump( $newSet->exists( 3 ) );
var_dump( $newSet->exists( 4 ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(true)
bool(false)
bool(true)
bool(false)

Exemple #2 Exemple avec Quickhash utilisant ArrayAccess

<?php
$hash = new QuickHashIntHash( 64 );

// Ajout et mise à jour des entrées.
$hash[3] = 145926;
$hash[3] = 1415926;
$hash[2] = 72;

// Vérification si la clé existe
var_dump( isset( $hash[3] ) );

// Suppression d'entées
unset( $hash[2] );

// Récupération des valeurs stockées pour un hash
echo $hash[3], "\n";
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(true)
1415926

Exemple #3 Exemple avec Quickhash utilisant Iterator

<?php
$hash = new QuickHashIntHash( 64 );

// Ajout d'entrées
$hash[1] = 145926;
$hash[2] = 1415926;
$hash[3] = 72;
$hash[4] = 712314;
$hash[5] = -4234;

foreach( $hash as $key => $value )
{
    echo $key, ' => ', $value, "\n";
}
?>

Résultat de l'exemple ci-dessus est similaire à :

5 => -4234
4 => 712314
1 => 145926
2 => 1415926
3 => 72

Exemple #4 Example avec Quickhash et des valeurs chaines de caractères

<?php
$hash = new QuickHashIntStringHash( 64 );

// Ajout d'entrées
$hash[1] = "one million four hundred fifteen thousand nine hundred twenty six";
$hash->add( 2, "one more" );

foreach( $hash as $key => $value )
{
    echo $key, ' => ', $value, "\n";
}
?>

Résultat de l'exemple ci-dessus est similaire à :

1 => one million four hundred fifteen thousand nine hundred twenty six
2 => one more

User Contributed Notes

There are no user contributed notes for this page.


La classe QuickHashIntSet

(PECL quickhash >= Unknown)

Introduction

Cette classe est un conteneur pour un ensemble contenant des nombres entiers.

Les ensembles peuvent aussi être parcourus via l'interface Iterator. L'ordre dans lequel les éléments ressortent n'est pas garanti.

Synopsis de la classe

QuickHashIntSet {
/* Constantes */
const int CHECK_FOR_DUPES = 1 ;
const int DO_NOT_USE_ZEND_ALLOC = 2 ;
const int HASHER_NO_HASH = 256 ;
const int HASHER_JENKINS1 = 512 ;
const int HASHER_JENKINS2 = 1024 ;
/* Méthodes */
public add ( int $key ) : bool
public __construct ( int $size , int $options = ? )
public delete ( int $key ) : bool
public exists ( int $key ) : bool
publicgetSize ( ) : int
public static loadFromFile ( string $filename , int $size = ? , int $options = ? ) : QuickHashIntSet
public static loadFromString ( string $contents , int $size = ? , int $options = ? ) : QuickHashIntSet
public saveToFile ( string $filename ) : void
public saveToString ( ) : string
}

Constantes pré-définies

QuickHashIntSet::CHECK_FOR_DUPES

Si activé, l'ajout d'éléments déja existants dans l'ensemble (via add() ou loadFromFile()) fera que ces éléments seront supprimés de l'ensemble. Ceci prendra du temps, utilisez uniquement lorsque nécessaire.

QuickHashIntSet::DO_NOT_USE_ZEND_ALLOC

Désactive l'utilisation du gestionnaire de mémoire interne à PHP. Si cette option est activée, les allocations internes ne compteront pas dans le paramètre memory_limit.

QuickHashIntSet::HASHER_NO_HASH

Utilise un modulo et non pas une fonction de hachage pour trouver un élément dans l'index. Ce n'est pas plus rapide que le hachage classique, et le risque de collision est plus élevé.

QuickHashIntSet::HASHER_JENKINS1

Fonction de hachage par défaut qui transforme les hash entiers en éléments indexés en liste.

QuickHashIntSet::HASHER_JENKINS2

Sélectionne un algorithme de hachage différent.

Sommaire

  • QuickHashIntSet::add — Ajoute une nouvelle entrée à l'ensemble
  • QuickHashIntSet::__construct — Créer un nouvel objet QuickHashIntSet
  • QuickHashIntSet::delete — Supprime une entrée de l'ensemble
  • QuickHashIntSet::exists — Vérifie qu'une clé existe dans l'ensemble
  • QuickHashIntSet::getSize — Retourne le nombre d'éléments dans l'ensemble
  • QuickHashIntSet::loadFromFile — Créer un ensemble depuis un fichier
  • QuickHashIntSet::loadFromString — Créer un nouvel ensemble depuis une chaine
  • QuickHashIntSet::saveToFile — Stocke un ensemble sur le disque
  • QuickHashIntSet::saveToString — Retourne une version sérialisée de l'ensemble

User Contributed Notes

There are no user contributed notes for this page.


Ajoute une nouvelle entrée à l'ensemble

  • « QuickHashIntSet
  • QuickHashIntSet::__construct »
  • PHP Manual
  • QuickHashIntSet
  • Ajoute une nouvelle entrée à l'ensemble

QuickHashIntSet::add

(PECL quickhash >= Unknown)

QuickHashIntSet::add — Ajoute une nouvelle entrée à l'ensemble

Description

public QuickHashIntSet::add ( int $key ) : bool

Ajoute une nouvelle entrée à l'ensemble et retourne des informations sur l'ajout. Les entrées sont toutes ajoutées à la suite par défaut, sauf si QuickHashIntHash::CHECK_FOR_DUPES a été utilisé lors de la création de l'ensemble.

Liste de paramètres

key

La clé de l'entrée à ajouter.

Valeurs de retour

true si l'entrée a été ajoutée, false sinon.

Exemples

Exemple #1 Exemple QuickHashIntSet::add()

<?php
echo "Sans vérification de duplication\n";
$set = new QuickHashIntSet( 1024 );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );

echo "\navec vérification de duplication\n";
$set = new QuickHashIntSet( 1024, QuickHashIntSet::CHECK_FOR_DUPES );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

Sans vérification de duplication
bool(false)
bool(true)
bool(true)
bool(true)

avec vérification de duplication
bool(false)
bool(true)
bool(true)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Créer un nouvel objet QuickHashIntSet

  • « QuickHashIntSet::add
  • QuickHashIntSet::delete »
  • PHP Manual
  • QuickHashIntSet
  • Créer un nouvel objet QuickHashIntSet

QuickHashIntSet::__construct

(PECL quickhash >= Unknown)

QuickHashIntSet::__construct — Créer un nouvel objet QuickHashIntSet

Description

public QuickHashIntSet::__construct ( int $size , int $options = ? )

La taille est le nombre de listes d'élements à créer. Plus il y a de listes, moins il y a de risques de collisions.

Liste de paramètres

size

Le nombre de listes à configurer. Le nombre sera arrondi à la puissance de deux supérieure. Les limites sont de 64 à 4194304.

options

Les options disponibles sont: QuickHashIntSet::CHECK_FOR_DUPES, qui vérifie qu'aucun doublon n'est ajouté dans le hash; QuickHashIntSet::DO_NOT_USE_ZEND_ALLOC qui désactive le gestionnaire de mémoire interne de PHP et une des options QuickHashIntSet::HASHER_NO_HASH, QuickHashIntSet::HASHER_JENKINS1 ou QuickHashIntSet::HASHER_JENKINS2. Ces trois dernières configurent l'algorithme à utiliser. Les options peuvent être combinées avec des masques.

Valeurs de retour

Retourne un nouvel objet QuickHashIntSet.

Exemples

Exemple #1 Exemple QuickHashIntSet::__construct()

<?php
var_dump( new QuickHashIntSet( 1024 ) );
var_dump( new QuickHashIntSet( 1024, QuickHashIntSet::CHECK_FOR_DUPES ) );
var_dump(
    new QuickHashIntSet(
        1024,
        QuickHashIntSet::DO_NOT_USE_ZEND_ALLOC | QuickHashIntSet::HASHER_JENKINS2
    )
);
?>

User Contributed Notes

There are no user contributed notes for this page.


Supprime une entrée de l'ensemble

  • « QuickHashIntSet::__construct
  • QuickHashIntSet::exists »
  • PHP Manual
  • QuickHashIntSet
  • Supprime une entrée de l'ensemble

QuickHashIntSet::delete

(PECL quickhash >= Unknown)

QuickHashIntSet::delete — Supprime une entrée de l'ensemble

Description

public QuickHashIntSet::delete ( int $key ) : bool

Supprime une entrée de l'ensemble et retourne des informations concernant la suppression. Les structures mémoires associées ne vont pas être libérées immédiatement, mais quand l'ensemble lui-même sera libéré.

Liste de paramètres

key

La clé de l'entrée à supprimer.

Valeurs de retour

true si l'entrée a été supprimée, false sinon.

Exemples

Exemple #1 Exemple QuickHashIntSet::delete()

<?php
$set = new QuickHashIntSet( 1024 );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );
var_dump( $set->delete( 4 ) );
var_dump( $set->exists( 4 ) );
var_dump( $set->delete( 4 ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(false)
bool(true)
bool(true)
bool(false)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Vérifie qu'une clé existe dans l'ensemble

  • « QuickHashIntSet::delete
  • QuickHashIntSet::getSize »
  • PHP Manual
  • QuickHashIntSet
  • Vérifie qu'une clé existe dans l'ensemble

QuickHashIntSet::exists

(PECL quickhash >= Unknown)

QuickHashIntSet::exists — Vérifie qu'une clé existe dans l'ensemble

Description

public QuickHashIntSet::exists ( int $key ) : bool

Vérifie qu'une clé existe dans l'ensemble.

Liste de paramètres

key

La clé de l'entrée à vérifier.

Valeurs de retour

Retourne true si l'entrée est trouvée, false sinon.

Exemples

Exemple #1 Exemple QuickHashIntSet::exists()

<?php
//génère 200000 elements
$array = range( 0, 199999 );
$existingEntries = array_rand( array_flip( $array ), 180000 );
$testForEntries = array_rand( array_flip( $array ), 1000 );
$foundCount = 0;

echo "Creating set: ", microtime( true ), "\n";
$set = new QuickHashIntSet( 100000 );
echo "Adding elements: ", microtime( true ), "\n";
foreach( $existingEntries as $key )
{
     $set->add( $key );
}

echo "Doing 1000 tests: ", microtime( true ), "\n";
foreach( $testForEntries as $key )
{
     $foundCount += $set->exists( $key );
}
echo "Done, $foundCount found: ", microtime( true ), "\n";
?>

Résultat de l'exemple ci-dessus est similaire à :

Creating set: 1263588703.0748
Adding elements: 1263588703.0757
Doing 1000 tests: 1263588703.7851
Done, 898 found: 1263588703.7897

User Contributed Notes

There are no user contributed notes for this page.


Retourne le nombre d'éléments dans l'ensemble

  • « QuickHashIntSet::exists
  • QuickHashIntSet::loadFromFile »
  • PHP Manual
  • QuickHashIntSet
  • Retourne le nombre d'éléments dans l'ensemble

QuickHashIntSet::getSize

(PECL quickhash >= Unknown)

QuickHashIntSet::getSize — Retourne le nombre d'éléments dans l'ensemble

Description

publicQuickHashIntSet::getSize ( ) : int

Retourne le nombre d'éléments dans l'ensemble

Liste de paramètres

key

La clé de l'entrée à ajouter.

Valeurs de retour

Le nombre d'éléments dans l'ensemble.

Exemples

Exemple #1 Exemple QuickHashIntSet::getSize()

<?php
$set = new QuickHashIntSet( 8 );
var_dump( $set->add( 2 ) );
var_dump( $set->add( 3 ) );
var_dump( $set->getSize() );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(true)
bool(true)
int(2)

User Contributed Notes

There are no user contributed notes for this page.


Créer un ensemble depuis un fichier

  • « QuickHashIntSet::getSize
  • QuickHashIntSet::loadFromString »
  • PHP Manual
  • QuickHashIntSet
  • Créer un ensemble depuis un fichier

QuickHashIntSet::loadFromFile

(PECL quickhash >= Unknown)

QuickHashIntSet::loadFromFile — Créer un ensemble depuis un fichier

Description

public static QuickHashIntSet::loadFromFile ( string $filename , int $size = ? , int $options = ? ) : QuickHashIntSet

Cette méthode de fabrique crée un nouveau hash depuis un fichier. Chaque élément correspond à deux entiers signés, le premier est la clé, le second la valeur.

Liste de paramètres

filename

Le fichier depuis lequel lire l'ensemble.

size

Le nombre de paquets à configurer. Le nombre passé ici sera automatiquement arrondi à la puissance de deux supérieure. Il est également automatiquement limité à l'intervalle 4 à 4194304.

options

Les mêmes options que le constructeur de la classe accepte, sauf l'option de taille, qui sera ignorée. La taille est calculée automatiquement pour correspondre au nombre d'entrées dans le hash, arrondie à la puissance de deux supérieure (limite maximale de 4194304).

Valeurs de retour

Retourne un nouveau QuickHashIntSet.

Exemples

Exemple #1 Exemple QuickHashIntSet::loadFromFile()

<?php
$file = dirname( __FILE__ ) . "/simple.set";
$set = QuickHashIntSet::loadFromFile(
    $file,
    QuickHashIntSet::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
    printf( "Key %3d (%2x) is %s\n",
        $key, $key,
        $set->exists( $key ) ? 'set' : 'unset'
    );
}
?>

Résultat de l'exemple ci-dessus est similaire à :

Key   0 ( 0) is unset
Key   1 ( 1) is set
Key   2 ( 2) is set
Key   3 ( 3) is set
Key   4 ( 4) is unset
Key   5 ( 5) is set
Key   6 ( 6) is unset
Key   7 ( 7) is set
Key   8 ( 8) is unset
Key   9 ( 9) is unset
Key  10 ( a) is unset
Key  11 ( b) is set
Key  12 ( c) is unset
Key  13 ( d) is set
Key  14 ( e) is unset
Key  15 ( f) is unset

User Contributed Notes

There are no user contributed notes for this page.


Créer un nouvel ensemble depuis une chaine

  • « QuickHashIntSet::loadFromFile
  • QuickHashIntSet::saveToFile »
  • PHP Manual
  • QuickHashIntSet
  • Créer un nouvel ensemble depuis une chaine

QuickHashIntSet::loadFromString

(PECL quickhash >= Unknown)

QuickHashIntSet::loadFromString — Créer un nouvel ensemble depuis une chaine

Description

public static QuickHashIntSet::loadFromString ( string $contents , int $size = ? , int $options = ? ) : QuickHashIntSet

Cette méthode de fabrique crée un nouvel ensemble hash depuis une chaine de caractères. Le format correspond à des entiers signés sur 32bits empaquetés selon le boutisme de la machine courante. Chaque élément correspond à deux entiers signés, le premier est la clé, le second la valeur.

Liste de paramètres

contents

La chaine sérialisée de l'ensemble.

size

Le nombre de paquets à configurer. Le nombre passé ici sera automatiquement arrondi à la puissance de deux supérieure. Il sera également automatiquemement limité à l'intervalle 4 à 4194304.

options

Les mêmes options que le constructeur de la classe accepte, sauf l'option de taille, qui sera ignorée. La taille est calculée automatiquement pour correspondre au nombre d'entrées dans le hash, arrondie à la puissance de deux supérieure (limite maximale de 4194304).

Valeurs de retour

Retourne un nouveau QuickHashIntSet.

Exemples

Exemple #1 Exemple QuickHashIntSet::loadFromString()

<?php
$contents = file_get_contents( dirname( __FILE__ ) . "/simple.set" );
$set = QuickHashIntSet::loadFromString(
    $contents,
    QuickHashIntSet::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
    printf( "Key %3d (%2x) is %s\n",
        $key, $key,
        $set->exists( $key ) ? 'set' : 'unset'
    );
}
?>

Résultat de l'exemple ci-dessus est similaire à :

Key   0 ( 0) is unset
Key   1 ( 1) is set
Key   2 ( 2) is set
Key   3 ( 3) is set
Key   4 ( 4) is unset
Key   5 ( 5) is set
Key   6 ( 6) is unset
Key   7 ( 7) is set
Key   8 ( 8) is unset
Key   9 ( 9) is unset
Key  10 ( a) is unset
Key  11 ( b) is set
Key  12 ( c) is unset
Key  13 ( d) is set
Key  14 ( e) is unset
Key  15 ( f) is unset

User Contributed Notes

There are no user contributed notes for this page.


Stocke un ensemble sur le disque

  • « QuickHashIntSet::loadFromString
  • QuickHashIntSet::saveToString »
  • PHP Manual
  • QuickHashIntSet
  • Stocke un ensemble sur le disque

QuickHashIntSet::saveToFile

(PECL quickhash >= Unknown)

QuickHashIntSet::saveToFile — Stocke un ensemble sur le disque

Description

public QuickHashIntSet::saveToFile ( string $filename ) : void

Stocke sur le disque une version sérialisée de l'ensemble dans un format lisible par loadFromFile().

Liste de paramètres

filename

Le fichier dans lequel stocker le hash.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple QuickHashIntSet::saveToFile()

<?php
$set = new QuickHashIntSet( 1024 );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );

$set->saveToFile( '/tmp/test.set' );
?>

User Contributed Notes

There are no user contributed notes for this page.


Retourne une version sérialisée de l'ensemble

  • « QuickHashIntSet::saveToFile
  • QuickHashIntHash »
  • PHP Manual
  • QuickHashIntSet
  • Retourne une version sérialisée de l'ensemble

QuickHashIntSet::saveToString

(PECL quickhash >= Unknown)

QuickHashIntSet::saveToString — Retourne une version sérialisée de l'ensemble

Description

public QuickHashIntSet::saveToString ( ) : string

Retourne une version sérialisée de l'ensemble dans un format lisible par loadFromString().

Valeurs de retour

Retourne une version sérialisée de l'ensemble. Chaque élément est stocké sur quatre octets dont le boutsime est celui du système courant.

Exemples

Exemple #1 Exemple QuickHashIntSet::saveToString()

<?php
$set = new QuickHashIntSet( 1024 );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );
var_dump( $set->exists( 4 ) );
var_dump( $set->add( 4 ) );

var_dump( $set->saveToString() );
?>

User Contributed Notes

There are no user contributed notes for this page.


La classe QuickHashIntHash

(PECL quickhash >= Unknown)

Introduction

Cette classe est un conteneur pour un hash contenant des nombres entiers, alors que les valeurs sont elles aussi des entiers. Les hash sont aussi disponibles au travers de l'interface ArrayAccess.

Les hash peuvent aussi être parcourus via l'interface Iterator. L'ordre dans lequel les éléments ressortent n'est pas garanti.

Synopsis de la classe

QuickHashIntHash {
/* Constantes */
const int CHECK_FOR_DUPES = 1 ;
const int DO_NOT_USE_ZEND_ALLOC = 2 ;
const int HASHER_NO_HASH = 256 ;
const int HASHER_JENKINS1 = 512 ;
const int HASHER_JENKINS2 = 1024 ;
/* Méthodes */
public add ( int $key , int $value = ? ) : bool
public __construct ( int $size , int $options = ? )
public delete ( int $key ) : bool
public exists ( int $key ) : bool
public get ( int $key ) : int
public getSize ( ) : int
public static loadFromFile ( string $filename , int $options = ? ) : QuickHashIntHash
public static loadFromString ( string $contents , int $options = ? ) : QuickHashIntHash
public saveToFile ( string $filename ) : void
public saveToString ( ) : string
public set ( int $key , int $value ) : bool
public update ( int $key , int $value ) : bool
}

Constantes pré-définies

QuickHashIntHash::CHECK_FOR_DUPES

Si activé, l'ajout d'éléments déja existants dans l'ensemble (via add() ou loadFromFile()) fera que ces éléments seront supprimés de l'ensemble. Ceci prendra du temps, utilisez uniquement lorsque nécessaire.

QuickHashIntHash::DO_NOT_USE_ZEND_ALLOC

Désactive l'utilisation du gestionnaire de mémoire interne à PHP. Si cette option est activée, les allocations internes ne compteront pas dans le paramètre memory_limit.

QuickHashIntHash::HASHER_NO_HASH

Utilise un modulo et non pas une fonction de hachage pour trouver un élément dans l'index. Ce n'est pas plus rapide que le hachage classique, et le risque de collision est plus élevé.

QuickHashIntHash::HASHER_JENKINS1

Fonction de hachage par défaut qui transforme les hash entiers en éléments indexés en liste.

QuickHashIntHash::HASHER_JENKINS2

Sélectionne un algorithme de hachage différent.

Sommaire

  • QuickHashIntHash::add — Ajoute une nouvelle entrée au hash
  • QuickHashIntHash::__construct — Créer un nouvel objet QuickHashIntHash
  • QuickHashIntHash::delete — Supprime une entrée du hash
  • QuickHashIntHash::exists — Vérifie qu'une clé existe dans le hash
  • QuickHashIntHash::get — Récupère la valeur correspondant à une clé dans le hash
  • QuickHashIntHash::getSize — Retourne le nombre d'éléments dans le hash
  • QuickHashIntHash::loadFromFile — Créer un hash depuis un fichier
  • QuickHashIntHash::loadFromString — Créer un hash depuis une chaine
  • QuickHashIntHash::saveToFile — Stocke un hash sur le disque
  • QuickHashIntHash::saveToString — Retourne une version sérialisée du hash
  • QuickHashIntHash::set — Met à jour une entrée dans le hash ou l'ajoute si elle n'existait pas
  • QuickHashIntHash::update — Met à jour une entrée dans le hash

User Contributed Notes

There are no user contributed notes for this page.


Ajoute une nouvelle entrée au hash

  • « QuickHashIntHash
  • QuickHashIntHash::__construct »
  • PHP Manual
  • QuickHashIntHash
  • Ajoute une nouvelle entrée au hash

QuickHashIntHash::add

(PECL quickhash >= Unknown)

QuickHashIntHash::add — Ajoute une nouvelle entrée au hash

Description

public QuickHashIntHash::add ( int $key , int $value = ? ) : bool

Ajoute une nouvelle entrée au hash et retourne des informations sur l'ajout. Les entrées sont toutes ajoutées à la suite par défaut, sauf si QuickHashIntHash::CHECK_FOR_DUPES a été utilisé lors de la création du hash.

Liste de paramètres

key

La clé de l'entrée à ajouter.

value

La valeur (optionnelle) pour l'entrée. Si aucune valeur n'est passée, 1 sera utilisé.

Valeurs de retour

true si l'entrée a été ajoutée, false sinon.

Exemples

Exemple #1 Exemple QuickHashIntHash::add()

<?php
echo "Sans vérification de duplication\n";
$hash = new QuickHashIntHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, 22 ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, 12 ) );

echo "\navec vérification de duplication\n";
$hash = new QuickHashIntHash( 1024, QuickHashIntHash::CHECK_FOR_DUPES );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, 78 ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, 9 ) );

echo "\ndefault value\n";
var_dump( $hash->add( 5 ) );
var_dump( $hash->get( 5 ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

Sans vérification de duplication
bool(false)
bool(false)
bool(true)
bool(true)
int(22)
bool(true)

aans vérification de duplication
bool(false)
bool(false)
bool(true)
bool(true)
int(78)
bool(false)

default value
bool(true)
int(1)

User Contributed Notes

There are no user contributed notes for this page.


Créer un nouvel objet QuickHashIntHash

  • « QuickHashIntHash::add
  • QuickHashIntHash::delete »
  • PHP Manual
  • QuickHashIntHash
  • Créer un nouvel objet QuickHashIntHash

QuickHashIntHash::__construct

(PECL quickhash >= Unknown)

QuickHashIntHash::__construct — Créer un nouvel objet QuickHashIntHash

Description

public QuickHashIntHash::__construct ( int $size , int $options = ? )

La taille est le nombre de listes d'élements à créer. Plus il y a de listes, moins il y a de risques de collisions.

Liste de paramètres

size

Le nombre de listes à configurer. Le nombre sera arrondi à la puissance de deux supérieure. Les limites sont de 64 à 4194304.

options

Les options disponibles sont: QuickHashIntHash::CHECK_FOR_DUPES, qui vérifie qu'aucun doublon n'est ajouté dans le hash; QuickHashIntHash::DO_NOT_USE_ZEND_ALLOC qui désactive le gestionnaire de mémoire interne de PHP et une des options QuickHashIntHash::HASHER_NO_HASH, QuickHashIntHash::HASHER_JENKINS1 ou QuickHashIntHash::HASHER_JENKINS2. Ces trois dernières configurent l'algorithme à utiliser. Les options peuvent être combinées avec des masques.

Valeurs de retour

Retourne un nouvel objet QuickHashIntHash.

Exemples

Exemple #1 Exemple QuickHashIntHash::__construct()

<?php
var_dump( new QuickHashIntHash( 1024 ) );
var_dump( new QuickHashIntHash( 1024, QuickHashIntHash::CHECK_FOR_DUPES ) );
var_dump(
    new QuickHashIntHash(
        1024,
        QuickHashIntHash::DO_NOT_USE_ZEND_ALLOC | QuickHashIntHash::HASHER_JENKINS2
    )
);
?>

User Contributed Notes

There are no user contributed notes for this page.


Supprime une entrée du hash

  • « QuickHashIntHash::__construct
  • QuickHashIntHash::exists »
  • PHP Manual
  • QuickHashIntHash
  • Supprime une entrée du hash

QuickHashIntHash::delete

(PECL quickhash >= Unknown)

QuickHashIntHash::delete — Supprime une entrée du hash

Description

public QuickHashIntHash::delete ( int $key ) : bool

Supprime une entrée du hash et retourne des informations concernant la suppression. Les structures mémoires associées ne vont pas être libérées immédiatement, mais quand le hash lui-même sera libéré.

Les éléments ne peuvent être supprimés lorsque le hash est utilisé dans un itérateur. La méthode n'enverra pas une exception mais retournera simplement false tout comme pour tout problème dû à la suppression.

Liste de paramètres

key

La clé de l'entrée à supprimer.

Valeurs de retour

true si l'entrée a été supprimée, false sinon.

Exemples

Exemple #1 Exemple QuickHashIntHash::delete()

<?php
$hash = new QuickHashIntHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, 5 ) );
var_dump( $hash->delete( 4 ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->delete( 4 ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(false)
bool(true)
bool(true)
bool(false)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Vérifie qu'une clé existe dans le hash

  • « QuickHashIntHash::delete
  • QuickHashIntHash::get »
  • PHP Manual
  • QuickHashIntHash
  • Vérifie qu'une clé existe dans le hash

QuickHashIntHash::exists

(PECL quickhash >= Unknown)

QuickHashIntHash::exists — Vérifie qu'une clé existe dans le hash

Description

public QuickHashIntHash::exists ( int $key ) : bool

Vérifie qu'une clé existe dans le hash.

Liste de paramètres

key

La clé de l'entrée à vérifier.

Valeurs de retour

Retourne true si l'entrée est trouvée, false sinon.

Exemples

Exemple #1 Exemple QuickHashIntHash::exists()

<?php
//genère 200000 éléments
$array = range( 0, 199999 );
$existingEntries = array_rand( array_flip( $array ), 180000 );
$testForEntries = array_rand( array_flip( $array ), 1000 );
$foundCount = 0;

echo "Creating hash: ", microtime( true ), "\n";
$hash = new QuickHashIntHash( 100000 );
echo "Adding elements: ", microtime( true ), "\n";
foreach( $existingEntries as $key )
{
     $hash->add( $key, 56 );
}

echo "Doing 1000 tests: ", microtime( true ), "\n";
foreach( $testForEntries as $key )
{
     $foundCount += $hash->exists( $key );
}
echo "Done, $foundCount found: ", microtime( true ), "\n";
?>

Résultat de l'exemple ci-dessus est similaire à :

Creating hash: 1263588703.0748
Adding elements: 1263588703.0757
Doing 1000 tests: 1263588703.7851
Done, 898 found: 1263588703.7897

User Contributed Notes

There are no user contributed notes for this page.


Récupère la valeur correspondant à une clé dans le hash

  • « QuickHashIntHash::exists
  • QuickHashIntHash::getSize »
  • PHP Manual
  • QuickHashIntHash
  • Récupère la valeur correspondant à une clé dans le hash

QuickHashIntHash::get

(PECL quickhash >= Unknown)

QuickHashIntHash::get — Récupère la valeur correspondant à une clé dans le hash

Description

public QuickHashIntHash::get ( int $key ) : int

Récupère la valeur correspondant à une clé dans le hash

Liste de paramètres

key

La clé pour l'entrée à récupérer.

Valeurs de retour

La valeur si la clé existe, null sinon.

Exemples

Exemple #1 Exemple QuickHashIntHash::get()

<?php
$hash = new QuickHashIntHash( 8 );
var_dump( $hash->get( 1 ) );

var_dump( $hash->add( 2 ) );
var_dump( $hash->get( 2 ) );

var_dump( $hash->add( 3, 5 ) );
var_dump( $hash->get( 3 ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(false)
bool(true)
int(1)
bool(true)
int(5)

User Contributed Notes

There are no user contributed notes for this page.


Retourne le nombre d'éléments dans le hash

  • « QuickHashIntHash::get
  • QuickHashIntHash::loadFromFile »
  • PHP Manual
  • QuickHashIntHash
  • Retourne le nombre d'éléments dans le hash

QuickHashIntHash::getSize

(PECL quickhash >= Unknown)

QuickHashIntHash::getSize — Retourne le nombre d'éléments dans le hash

Description

public QuickHashIntHash::getSize ( ) : int

Retourne le nombre d'éléments dans le hash.

Liste de paramètres

key

La clé de l'entrée à ajouter.

Valeurs de retour

Le nombre d'éléments dans le hash

Exemples

Exemple #1 Exemple QuickHashIntHash::getSize()

<?php
$hash = new QuickHashIntHash( 8 );
var_dump( $hash->add( 2 ) );
var_dump( $hash->add( 3, 5 ) );
var_dump( $hash->getSize() );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(true)
bool(true)
int(2)

User Contributed Notes

There are no user contributed notes for this page.


Créer un hash depuis un fichier

  • « QuickHashIntHash::getSize
  • QuickHashIntHash::loadFromString »
  • PHP Manual
  • QuickHashIntHash
  • Créer un hash depuis un fichier

QuickHashIntHash::loadFromFile

(PECL quickhash >= Unknown)

QuickHashIntHash::loadFromFile — Créer un hash depuis un fichier

Description

public static QuickHashIntHash::loadFromFile ( string $filename , int $options = ? ) : QuickHashIntHash

Cette méthode de fabrique crée un nouveau hash depuis un fichier. Le format du fichier contient une signature,'QH\0x11\0' le nombre d'éléments sur un entier signé 32bits suivi d'entiers signés 32bits dans le boutisme de la machine courante. Chaque élément correspond à deux entiers signés, le premier est la clé, le second la valeur. Voici un exemple :

Exemple #1 Format du fichier QuickHash IntHash

00000000  51 48 11 00 02 00 00 00  01 00 00 00 01 00 00 00  |QH..............|
00000010  03 00 00 00 09 00 00 00                           |........|
00000018

Exemple #2 Format du fichier QuickHash IntHash

header signature ('QH'; key type: 1; value type: 1; filler: \0x00)
00000000  51 48 11 00

number of elements:
00000004  02 00 00 00

data string:
00000000  01 00 00 00 01 00 00 00  03 00 00 00 09 00 00 00

key/value 1 (key = 1, value = 1)
01 00 00 00  01 00 00 00

key/value 2 (key = 3, value = 9)
03 00 00 00  09 00 00 00

Liste de paramètres

filename

Le fichier depuis lequel lire le hash.

options

Les mêmes options que le constructeur de la classe accepte, sauf l'option de taille, qui sera ignorée. La taille est calculée automatiquement pour correspondre au nombre d'entrées dans le hash, arrondie à la puissance de deux supérieure (limite maximale de 4194304).

Valeurs de retour

Retourne un nouveau QuickHashIntHash.

Exemples

Exemple #3 Exemple QuickHashIntHash::loadFromFile()

<?php
$file = dirname( __FILE__ ) . "/simple.hash";
$hash = QuickHashIntHash::loadFromFile(
    $file,
    QuickHashIntHash::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
    printf( "Key %3d (%2x) is %s\n",
        $key, $key,
        $hash->exists( $key ) ? 'set' : 'unset'
    );
}
?>

Résultat de l'exemple ci-dessus est similaire à :

Key   0 ( 0) is unset
Key   1 ( 1) is set
Key   2 ( 2) is set
Key   3 ( 3) is set
Key   4 ( 4) is unset
Key   5 ( 5) is set
Key   6 ( 6) is unset
Key   7 ( 7) is set
Key   8 ( 8) is unset
Key   9 ( 9) is unset
Key  10 ( a) is unset
Key  11 ( b) is set
Key  12 ( c) is unset
Key  13 ( d) is set
Key  14 ( e) is unset
Key  15 ( f) is unset

User Contributed Notes

There are no user contributed notes for this page.


Créer un hash depuis une chaine

  • « QuickHashIntHash::loadFromFile
  • QuickHashIntHash::saveToFile »
  • PHP Manual
  • QuickHashIntHash
  • Créer un hash depuis une chaine

QuickHashIntHash::loadFromString

(PECL quickhash >= Unknown)

QuickHashIntHash::loadFromString — Créer un hash depuis une chaine

Description

public static QuickHashIntHash::loadFromString ( string $contents , int $options = ? ) : QuickHashIntHash

Cette méthode de fabrique crée un nouveau hash depuis une chaine de caractères. Le format correspond à des entiers signés sur 32bits empaquetés selon le boutisme de la machine courante. Chaque élément correspond à deux entiers signés, le premier est la clé, le second la valeur.

Liste de paramètres

contents

La chaine sérialisée du hash.

options

Les mêmes options que le constructeur de la classe accepte, sauf l'option de taille, qui sera ignorée. La taille est calculée automatiquement pour correspondre au nombre d'entrées dans le hash, arrondie à la puissance de deux supérieure (limite maximale de 4194304).

Valeurs de retour

Retourne un nouveau QuickHashIntHash.

Exemples

Exemple #1 Exemple QuickHashIntHash::loadFromString()

<?php
$contents = file_get_contents( dirname( __FILE__ ) . "/simple.hash" );
$hash = QuickHashIntHash::loadFromString(
    $contents,
    QuickHashIntHash::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
    printf( "Key %3d (%2x) is %s\n",
        $key, $key,
        $hash->exists( $key ) ? 'set' : 'unset'
    );
}
?>

Résultat de l'exemple ci-dessus est similaire à :

Key   0 ( 0) is unset
Key   1 ( 1) is set
Key   2 ( 2) is set
Key   3 ( 3) is set
Key   4 ( 4) is unset
Key   5 ( 5) is set
Key   6 ( 6) is unset
Key   7 ( 7) is set
Key   8 ( 8) is unset
Key   9 ( 9) is unset
Key  10 ( a) is unset
Key  11 ( b) is set
Key  12 ( c) is unset
Key  13 ( d) is set
Key  14 ( e) is unset
Key  15 ( f) is unset

User Contributed Notes

There are no user contributed notes for this page.


Stocke un hash sur le disque

  • « QuickHashIntHash::loadFromString
  • QuickHashIntHash::saveToString »
  • PHP Manual
  • QuickHashIntHash
  • Stocke un hash sur le disque

QuickHashIntHash::saveToFile

(PECL quickhash >= Unknown)

QuickHashIntHash::saveToFile — Stocke un hash sur le disque

Description

public QuickHashIntHash::saveToFile ( string $filename ) : void

Stocke sur le disque une version sérialisée du hash dans un format lisible par loadFromFile().

Liste de paramètres

filename

Le fichier dans lequel stocker le hash.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple QuickHashIntHash::saveToFile()

<?php
$hash = new QuickHashIntHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, 43 ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, 52 ) );

$hash->saveToFile( '/tmp/test.hash' );
?>

User Contributed Notes

There are no user contributed notes for this page.


Retourne une version sérialisée du hash

  • « QuickHashIntHash::saveToFile
  • QuickHashIntHash::set »
  • PHP Manual
  • QuickHashIntHash
  • Retourne une version sérialisée du hash

QuickHashIntHash::saveToString

(PECL quickhash >= Unknown)

QuickHashIntHash::saveToString — Retourne une version sérialisée du hash

Description

public QuickHashIntHash::saveToString ( ) : string

Retourne une version sérialisée du hash dans un format lisible par loadFromString().

Valeurs de retour

Retourne une version sérialisée du hash. Chaque élément est stocké sur quatre octets dont le boutsime est celui du système courant.

Exemples

Exemple #1 Exemple QuickHashIntHash::saveToString()

<?php
$hash = new QuickHashIntHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, 34 ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, 55 ) );

var_dump( $hash->saveToString() );
?>

User Contributed Notes

There are no user contributed notes for this page.


Met à jour une entrée dans le hash ou l'ajoute si elle n'existait pas

  • « QuickHashIntHash::saveToString
  • QuickHashIntHash::update »
  • PHP Manual
  • QuickHashIntHash
  • Met à jour une entrée dans le hash ou l'ajoute si elle n'existait pas

QuickHashIntHash::set

(PECL quickhash >= Unknown)

QuickHashIntHash::set — Met à jour une entrée dans le hash ou l'ajoute si elle n'existait pas

Description

public QuickHashIntHash::set ( int $key , int $value ) : bool

Cette méthode met à jour une entrée ou l'ajoute si elle n'existait pas. Elle retourne des informations sur cette mise à jour. S'il y a des clés dupliquées, seul le premier élément trouvé sera mis à jour. Utilisez QuickHashIntHash::CHECK_FOR_DUPES lors de la création du hash pour éviter les clés dupliquées.

Liste de paramètres

key

La clé de l'entrée à mettre à jour.

value

La nouvelle valeur.

Valeurs de retour

2 si l'entrée est trouvée et mise à jour, 1 si l'entrée a été ajoutée ou 0 s'il y a eu une erreur.

Exemples

Exemple #1 Exemple QuickHashIntHash::set()

<?php
$hash = new QuickHashIntHash( 1024 );

echo "Set->Add\n";
var_dump( $hash->get( 46692 ) );
var_dump( $hash->set( 46692, 16091 ) );
var_dump( $hash->get( 46692 ) );

echo "Set->Update\n";
var_dump( $hash->set( 46692, 29906 ) );
var_dump( $hash->get( 46692 ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(false)
int(2)
int(16091)
Set->Update
int(1)
int(29906)

User Contributed Notes

There are no user contributed notes for this page.


Met à jour une entrée dans le hash

  • « QuickHashIntHash::set
  • QuickHashStringIntHash »
  • PHP Manual
  • QuickHashIntHash
  • Met à jour une entrée dans le hash

QuickHashIntHash::update

(PECL quickhash >= Unknown)

QuickHashIntHash::update — Met à jour une entrée dans le hash

Description

public QuickHashIntHash::update ( int $key , int $value ) : bool

Cette méthode met à jour une entrée et retourne des informations sur cette mise à jour. S'il y a des clés dupliquées, seul le premier élément trouvé sera mis à jour. Utilisez QuickHashIntHash::CHECK_FOR_DUPES lors de la création du hash pour éviter les clés dupliquées.

Liste de paramètres

key

La clé de l'entrée à mettre à jour.

value

La nouvelle valeur.

Valeurs de retour

true si l'entrée est trouvée et mise à jour et false si l'entrée n'a pas été trouvée.

Exemples

Exemple #1 Exemple QuickHashIntHash::update()

<?php
$hash = new QuickHashIntHash( 1024 );

var_dump( $hash->add( 141421, 173205 ) );
var_dump( $hash->update( 141421, 223606 ) );
var_dump( $hash->get( 141421 ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(true)
bool(true)
int(223606)

User Contributed Notes

There are no user contributed notes for this page.


The QuickHashStringIntHash class

(No version information available, might only be in Git)

Introduction

Cette classe est un conteneur pour un hash contenant des chaines, alors que les valeurs sont elles, des nombres entiers. Les hash sont aussi disponibles au travers de l'interface ArrayAccess.

Les hash peuvent aussi être parcourus via l'interface Iterator. L'ordre dans lequel les éléments ressortent n'est pas garanti.

Synopsis de la classe

QuickHashStringIntHash {
/* Constantes */
const int CHECK_FOR_DUPES = 1 ;
const int DO_NOT_USE_ZEND_ALLOC = 2 ;
/* Méthodes */
public add ( string $key , int $value ) : bool
public __construct ( int $size , int $options = 0 )
public delete ( string $key ) : bool
public exists ( string $key ) : bool
public get ( string $key ) : mixed
public getSize ( ) : int
public static loadFromFile ( string $filename , int $size = 0 , int $options = 0 ) : QuickHashStringIntHash
public static loadFromString ( string $contents , int $size = 0 , int $options = 0 ) : QuickHashStringIntHash
public saveToFile ( string $filename ) : void
public saveToString ( ) : string
public set ( string $key , int $value ) : int
public update ( string $key , int $value ) : bool
}

Constantes pré-définies

QuickHashStringIntHash::CHECK_FOR_DUPES

Si activé, l'ajout d'éléments déja existants dans l'ensemble (via add() ou loadFromFile()) fera que ces éléments seront supprimés de l'ensemble. Ceci prendra du temps, utilisez uniquement lorsque nécessaire.

QuickHashStringIntHash::DO_NOT_USE_ZEND_ALLOC

Désactive l'utilisation du gestionnaire de mémoire interne à PHP. Si cette option est activée, les allocations internes ne compteront pas dans le paramètre memory_limit.

Sommaire

  • QuickHashStringIntHash::add — Ajoute une nouvelle entrée dans la table de hachage
  • QuickHashStringIntHash::__construct — Crée un nouvel objet QuickHashStringIntHash
  • QuickHashStringIntHash::delete — Supprime une entrée de la table de hachage
  • QuickHashStringIntHash::exists — Vérifie si une clé fait partie de la table de hachage
  • QuickHashStringIntHash::get — Récupère une valeur depuis la table de hachage par sa clé
  • QuickHashStringIntHash::getSize — Retourne le nombre d'éléments dans la table de hachage
  • QuickHashStringIntHash::loadFromFile — Crée une table de hachage depuis un fichier
  • QuickHashStringIntHash::loadFromString — Crée une table de hachage depuis une chaîne
  • QuickHashStringIntHash::saveToFile — Sauvegarde une table de hachage en mémoire sur le disque
  • QuickHashStringIntHash::saveToString — Retourne une version linéarisée de la table de hachage
  • QuickHashStringIntHash::set — Met à jour une entrée de la table de hachage avec une nouvelle valeur ou l'ajout si elle n'existe pas
  • QuickHashStringIntHash::update — Mets à jour une entrée de la table de hachage avec une nouvelle valeur

User Contributed Notes

There are no user contributed notes for this page.


Ajoute une nouvelle entrée dans la table de hachage

  • « QuickHashStringIntHash
  • QuickHashStringIntHash::__construct »
  • PHP Manual
  • QuickHashStringIntHash
  • Ajoute une nouvelle entrée dans la table de hachage

QuickHashStringIntHash::add

(No version information available, might only be in Git)

QuickHashStringIntHash::add — Ajoute une nouvelle entrée dans la table de hachage

Description

public QuickHashStringIntHash::add ( string $key , int $value ) : bool

Cette méthode ajoute une nouvelle entrée dans la table de hachage, et retourne le fait que l'entrée ait bien été ajouté. Les entrées sont par défaut toujours ajoutées tant que l'option QuickHashStringIntHash::CHECK_FOR_DUPES ne soit passée lors de la création de la table de hachage.

Liste de paramètres

key

La clé de l'entrée à ajouter.

value

La valeur de l'entrée à ajouter.

Valeurs de retour

true lorsque l'entrée a bien été ajoutée, et false si l'entrée n'a pas été ajoutée.

Exemples

Exemple #1 Exemple avec QuickHashStringIntHash::add()

<?php
echo "sans vérification des doublons\n";
$hash = new QuickHashStringIntHash( 1024 );
var_dump( $hash );
var_dump( $hash->exists( "four" ) );
var_dump( $hash->get( "four" ) );
var_dump( $hash->add( "four", 22 ) );
var_dump( $hash->exists( "four" ) );
var_dump( $hash->get( "four" ) );
var_dump( $hash->add( "four", 12 ) );

echo "\navec vérification des doublons\n";
$hash = new QuickHashStringIntHash( 1024, QuickHashStringIntHash::CHECK_FOR_DUPES );
var_dump( $hash );
var_dump( $hash->exists( "four" ) );
var_dump( $hash->get( "four" ) );
var_dump( $hash->add( "four", 78 ) );
var_dump( $hash->exists( "four" ) );
var_dump( $hash->get( "four" ) );
var_dump( $hash->add( "four", 9 ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

sans vérification des doublons
object(QuickHashStringIntHash)#1 (0) {
}
bool(false)
bool(false)
bool(true)
bool(true)
int(22)
bool(true)

avec vérification des doublons
object(QuickHashStringIntHash)#2 (0) {
}
bool(false)
bool(false)
bool(true)
bool(true)
int(78)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Crée un nouvel objet QuickHashStringIntHash

  • « QuickHashStringIntHash::add
  • QuickHashStringIntHash::delete »
  • PHP Manual
  • QuickHashStringIntHash
  • Crée un nouvel objet QuickHashStringIntHash

QuickHashStringIntHash::__construct

(No version information available, might only be in Git)

QuickHashStringIntHash::__construct — Crée un nouvel objet QuickHashStringIntHash

Description

public QuickHashStringIntHash::__construct ( int $size , int $options = 0 )

Ce constructeur crée un nouvel objet QuickHashStringIntHash. La taille correspond à la quantité de listes à créer. Plus il y a de listes, le moins de collisions se produira. Les options sont aussi autorisées.

Liste de paramètres

size

La quantité de listes à configurer. Le nombre passé sera automatiquement arrondi à la prochaine puissance de deux. Il sera également automatiquement limité à l'intervalle 64 à 4194304.

options

Les options que vous pouvez passer sont : QuickHashStringIntHash::CHECK_FOR_DUPES, qui s'assure qu'aucun doublon ne sera ajouté à la table de hachage et QuickHashStringIntHash::DO_NOT_USE_ZEND_ALLOC pour ne pas utiliser le gestionnaire de mémoire interne à PHP.

Valeurs de retour

Retourne un nouvel objet QuickHashStringIntHash.

Exemples

Exemple #1 Exemple avec QuickHashStringIntHash::__construct()

<?php
var_dump( new QuickHashStringIntHash( 1024 ) );
var_dump( new QuickHashStringIntHash( 1024, QuickHashStringIntHash::CHECK_FOR_DUPES ) );
?>

User Contributed Notes

There are no user contributed notes for this page.


Supprime une entrée de la table de hachage

  • « QuickHashStringIntHash::__construct
  • QuickHashStringIntHash::exists »
  • PHP Manual
  • QuickHashStringIntHash
  • Supprime une entrée de la table de hachage

QuickHashStringIntHash::delete

(No version information available, might only be in Git)

QuickHashStringIntHash::delete — Supprime une entrée de la table de hachage

Description

public QuickHashStringIntHash::delete ( string $key ) : bool

Cette méthode supprime une entrée depuis la table de hachage et retourne le fait que l'entrée ait bien été supprimé ou non. Les structures mémoires associées ne seront pas libérées immédiatement, mais plutôt lorsque la table de hachage elle-même sera libérée.

Les éléments ne peuvent pas être supprimés lorsque la table de hachage est utilisé par un itérateur. La méthode n'émettra pas d'exception, mais retournera simplement false, comme c'est le cas pour toutes les fonctionnalités de suppression.

Liste de paramètres

key

La clé de l'entrée à supprimer.

Valeurs de retour

true lorsque l'entrée a été supprimée, et false si elle ne l'a pas été.

Exemples

Exemple #1 Exemple avec QuickHashStringIntHash::delete()

<?php
$hash = new QuickHashStringIntHash( 1024 );
var_dump( $hash->exists( 'four' ) );
var_dump( $hash->add( 'four', 5 ) );
var_dump( $hash->get( 'four' ) );
var_dump( $hash->delete( 'four' ) );
var_dump( $hash->exists( 'four' ) );
var_dump( $hash->get( 'four' ) );
var_dump( $hash->delete( 'four' ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(false)
bool(true)
int(5)
bool(true)
bool(false)
bool(false)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si une clé fait partie de la table de hachage

  • « QuickHashStringIntHash::delete
  • QuickHashStringIntHash::get »
  • PHP Manual
  • QuickHashStringIntHash
  • Vérifie si une clé fait partie de la table de hachage

QuickHashStringIntHash::exists

(No version information available, might only be in Git)

QuickHashStringIntHash::exists — Vérifie si une clé fait partie de la table de hachage

Description

public QuickHashStringIntHash::exists ( string $key ) : bool

Cette méthode vérifie si une entrée avec la clé fournie existe dans la table de hachage.

Liste de paramètres

key

La clé de l'entrée dont on souhaite vérifier l'existance dans la table de hachage.

Valeurs de retour

Retourne true lorsque l'entrée a été trouvée, ou false sinon.

User Contributed Notes

There are no user contributed notes for this page.


Récupère une valeur depuis la table de hachage par sa clé

  • « QuickHashStringIntHash::exists
  • QuickHashStringIntHash::getSize »
  • PHP Manual
  • QuickHashStringIntHash
  • Récupère une valeur depuis la table de hachage par sa clé

QuickHashStringIntHash::get

(No version information available, might only be in Git)

QuickHashStringIntHash::get — Récupère une valeur depuis la table de hachage par sa clé

Description

public QuickHashStringIntHash::get ( string $key ) : mixed

Cette méthode récupère une valeur depuis la table de hachage par sa clé.

Liste de paramètres

key

La clé de l'entrée à récupérer.

Valeurs de retour

La valeur, si la clé existe, ou null si la clé ne fait pas partie de la table de hachage.

Exemples

Exemple #1 Exemple avec QuickHashStringIntHash::get()

<?php
$hash = new QuickHashStringIntHash( 8 );
var_dump( $hash->get( "one" ) );

var_dump( $hash->add( "two", 2 ) );
var_dump( $hash->get( "two" ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(false)
bool(true)
int(2)

User Contributed Notes

There are no user contributed notes for this page.


Retourne le nombre d'éléments dans la table de hachage

  • « QuickHashStringIntHash::get
  • QuickHashStringIntHash::loadFromFile »
  • PHP Manual
  • QuickHashStringIntHash
  • Retourne le nombre d'éléments dans la table de hachage

QuickHashStringIntHash::getSize

(No version information available, might only be in Git)

QuickHashStringIntHash::getSize — Retourne le nombre d'éléments dans la table de hachage

Description

public QuickHashStringIntHash::getSize ( ) : int

Retourne le nombre d'éléments dans la table de hachage.

Liste de paramètres

key

Valeurs de retour

Le nombre d'éléments dans la table de hachage.

Exemples

Exemple #1 Exemple avec QuickHashStringIntHash::getSize()

<?php
$hash = new QuickHashStringIntHash( 8 );
var_dump( $hash->add( "two", 2 ) );
var_dump( $hash->add( "three", 5 ) );
var_dump( $hash->getSize() );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(true)
bool(true)
int(2)

User Contributed Notes

There are no user contributed notes for this page.


Crée une table de hachage depuis un fichier

  • « QuickHashStringIntHash::getSize
  • QuickHashStringIntHash::loadFromString »
  • PHP Manual
  • QuickHashStringIntHash
  • Crée une table de hachage depuis un fichier

QuickHashStringIntHash::loadFromFile

(No version information available, might only be in Git)

QuickHashStringIntHash::loadFromFile — Crée une table de hachage depuis un fichier

Description

public static QuickHashStringIntHash::loadFromFile ( string $filename , int $size = 0 , int $options = 0 ) : QuickHashStringIntHash

Cette méthode factorielle crée une nouvelle table de hachage depuis un fichier de définition localisé sur le disque. Le format du fichier consiste en une signature 'QH\0x21\0', le nombre d'éléments sous la forme d'un entier signé sur 32 bit en système Endianness, un entier non-signé sur 32 bits contenant le nombre d'éléments de données qui suivent en caractères. Cet élément de données contient toutes les chaînes. Suit un autre entier signé sur 32 bits contenant le nombre de listes. Après l'en-tête et les chaînes, les éléments suivent. Ils sont ordonnés par liste, faisant ainsi que la clé n'a pas besoin d'être haché afin de restaurer le hachage. Pour chaque liste, les informations suivantes sont stockées (toutes sous la forme d'entiers sur 32 bits) : l'index de la liste, le nombre d'éléments de la liste, puis, des paires de deux entiers non-signés sur 32 bits contenant les éléments, où le premier est l'index de la liste contenant les clés, et le second, la valeur. Voici un exemple :

Exemple #1 QuickHash StringIntHash file format

00000000  51 48 21 00 02 00 00 00  09 00 00 00 40 00 00 00  |QH!.........@...|
00000010  4f 4e 45 00 4e 49 4e 45  00 07 00 00 00 01 00 00  |ONE.NINE........|
00000020  00 00 00 00 00 01 00 00  00 2f 00 00 00 01 00 00  |........./......|
00000030  00 04 00 00 00 03 00 00  00                       |.........|
00000039

Exemple #2 Format de fichier QuickHash IntHash

header signature ('QH'; key type: 2; value type: 1; filler: \0x00)
00000000  51 48 21 00

number of elements:
00000004  02 00 00 00

length of string values (9 characters):
00000008  09 00 00 00

number of hash bucket lists (this is configured for hashes as argument to the
constructor normally, 64 in this case):
0000000C  40 00 00 00

string values:
00000010  4f 4e 45 00 4e 49 4e 45  00

bucket lists:
  bucket list 1 (with key 7, and 1 element):
    header:
    07 00 00 00 01 00 00 00
    elements (key index: 0 ('ONE'), value = 0):
    00 00 00 00 01 00 00 00
  bucket list 2 (with key 0x2f, and 1 element):
    header:
    2f 00 00 00 01 00 00 00
    elements (key index: 4 ('NINE'), value = 3):
    04 00 00 00 03 00 00 00

Liste de paramètres

filename

Le nom du fichier à utiliser pour construire la table de hachage.

size

La quantité de listes à configurer. Le nombre passé sera automatiquement arrondi à la puissance de deux supérieure. Il sera également automatiquement limité à l'intervalle 4 - 4194304.

options

Les mêmes options que le constructeur de la classe ; sauf que l'option sur la taille est ignoré. Il sera lu depuis le format du fichier (contrairement aux classes QuickHashIntHash et QuickHashIntStringHash, où il est automatiquement calculé depuis le nombre d'entrées de la table de hachage).

Valeurs de retour

Retourne un nouvel objet QuickHashStringIntHash.

Exemples

Exemple #3 Exemple avec QuickHashStringIntHash::loadFromFile()

<?php
$file = dirname( __FILE__ ) . "/simple.hash.string";
$hash = QuickHashStringIntHash::loadFromFile(
    $file,
    QuickHashStringIntHash::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
    $i = 48712 + $key * 1631;
    $k = base_convert( $i, 10, 36 );
    echo $k, ' => ', $hash->get( $k ), "\n";
}
?>

Résultat de l'exemple ci-dessus est similaire à :

11l4 => 48712
12uf => 50343
143q => 51974
15d1 => 53605
16mc => 55236
17vn => 56867
194y => 58498
1ae9 => 60129
1bnk => 61760
1cwv => 63391
1e66 => 65022
1ffh => 66653
1gos => 68284
1hy3 => 69915
1j7e => 71546
1kgp => 73177

User Contributed Notes

There are no user contributed notes for this page.


Crée une table de hachage depuis une chaîne

  • « QuickHashStringIntHash::loadFromFile
  • QuickHashStringIntHash::saveToFile »
  • PHP Manual
  • QuickHashStringIntHash
  • Crée une table de hachage depuis une chaîne

QuickHashStringIntHash::loadFromString

(No version information available, might only be in Git)

QuickHashStringIntHash::loadFromString — Crée une table de hachage depuis une chaîne

Description

public static QuickHashStringIntHash::loadFromString ( string $contents , int $size = 0 , int $options = 0 ) : QuickHashStringIntHash

Cette méthode factorielle créer une nouvelle table de hachage depuis une définition contenu dans une chaîne de caractères. Le format est identique à celui utilisé par la fonction "loadFromFile".

Liste de paramètres

contents

La chaîne contenant un format linéarisé de la table de hachage.

size

La quantité de listes à configurer. Le nombre passé sera automatiquement arrondi à la prochaine puissance de deux. Il sera également automatiquement limité à l'intervalle 4 - 4194304.

options

Les mêmes options que le constructeur de la classe ; sauf que l'option relative à la taille sera ignorée. En effet, elle sera automatiquement calculée pour être identique au nombre d'entrées dans la table de hachage, arrondie à la valeur la plus proche d'une puissance de deux, avec une limite maximale à 4194304.

Valeurs de retour

Retourne un nouvel objet QuickHashStringIntHash.

Exemples

Exemple #1 Exemple avec QuickHashStringIntHash::loadFromString()

<?php
$contents = file_get_contents( dirname( __FILE__ ) . "/simple.hash.string" );
$hash = QuickHashStringIntHash::loadFromString(
    $contents,
    QuickHashStringIntHash::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
    $i = 48712 + $key * 1631;
    $k = base_convert( $i, 10, 36 );
    echo $k, ' => ', $hash->get( $k ), "\n";
}
?>

Résultat de l'exemple ci-dessus est similaire à :

11l4 => 48712
12uf => 50343
143q => 51974
15d1 => 53605
16mc => 55236
17vn => 56867
194y => 58498
1ae9 => 60129
1bnk => 61760
1cwv => 63391
1e66 => 65022
1ffh => 66653
1gos => 68284
1hy3 => 69915
1j7e => 71546
1kgp => 73177

User Contributed Notes

There are no user contributed notes for this page.


Sauvegarde une table de hachage en mémoire sur le disque

  • « QuickHashStringIntHash::loadFromString
  • QuickHashStringIntHash::saveToString »
  • PHP Manual
  • QuickHashStringIntHash
  • Sauvegarde une table de hachage en mémoire sur le disque

QuickHashStringIntHash::saveToFile

(No version information available, might only be in Git)

QuickHashStringIntHash::saveToFile — Sauvegarde une table de hachage en mémoire sur le disque

Description

public QuickHashStringIntHash::saveToFile ( string $filename ) : void

Cette méthode sauvegarde une table de hachage existante dans un fichier du disque, dans un format lisible par la fonction loadFromFile().

Liste de paramètres

filename

Le nom du fichier à utiliser pour la sauvegarde.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec QuickHashStringIntHash::saveToFile()

<?php
$hash = new QuickHashStringIntHash( 1024 );
var_dump( $hash->add( "fourty three", 42 ) );
var_dump( $hash->add( "fifty two", 52 ) );

$hash->saveToFile( '/tmp/test.hash.string' );
?>

User Contributed Notes

There are no user contributed notes for this page.


Retourne une version linéarisée de la table de hachage

  • « QuickHashStringIntHash::saveToFile
  • QuickHashStringIntHash::set »
  • PHP Manual
  • QuickHashStringIntHash
  • Retourne une version linéarisée de la table de hachage

QuickHashStringIntHash::saveToString

(No version information available, might only be in Git)

QuickHashStringIntHash::saveToString — Retourne une version linéarisée de la table de hachage

Description

public QuickHashStringIntHash::saveToString ( ) : string

Cette méthode retourne une version linéarisée de la table de hachage dans un format lisible par la fonction loadFromString().

Valeurs de retour

Cette méthode retourne un format linéarisé d'une table de hachage existante, dans un format lisible par la fonction loadFromString().

Exemples

Exemple #1 Exemple avec QuickHashStringIntHash::saveToString()

<?php
$hash = new QuickHashStringIntHash( 1024 );
var_dump( $hash->add( "fourty three", 42 ) );
var_dump( $hash->add( "fifty two", 52 ) );

var_dump( $hash->saveToString() );
?>

User Contributed Notes

There are no user contributed notes for this page.


Met à jour une entrée de la table de hachage avec une nouvelle valeur ou l'ajout si elle n'existe pas

  • « QuickHashStringIntHash::saveToString
  • QuickHashStringIntHash::update »
  • PHP Manual
  • QuickHashStringIntHash
  • Met à jour une entrée de la table de hachage avec une nouvelle valeur ou l'ajout si elle n'existe pas

QuickHashStringIntHash::set

(No version information available, might only be in Git)

QuickHashStringIntHash::set — Met à jour une entrée de la table de hachage avec une nouvelle valeur ou l'ajout si elle n'existe pas

Description

public QuickHashStringIntHash::set ( string $key , int $value ) : int

Cette méthode tente de mettre à jour une entrée avec une nouvelle valeur. Dans le cas où l'entrée n'existe pas, elle sera ajoutée. La fonction retourne le fait que l'entrée a été ajoutée ou mise à jour. S'il y a des doublons de clés, seul le premier élément recevra la nouvelle valeur. Utilisez QuickHashStringIntHash::CHECK_FOR_DUPES lors de la création de la table de hachage pour prévenir les doublons de clés.

Liste de paramètres

key

La clé de l'entrée à ajouter ou mettre à jour.

value

La valeur de l'entrée à ajouter ou mettre à jour. Si une non-chaîne est passée, elle sera automatiquement convertie en chaîne, si possible.

Valeurs de retour

2 si l'entrée a été trouvée et mise à jour, 1 si l'entrée a été nouvellement ajoutée, ou 0 si une erreur survient.

Exemples

Exemple #1 Exemple avec QuickHashStringIntHash::set()

<?php
$hash = new QuickHashStringIntHash( 1024 );

echo "Set->Add\n";
var_dump( $hash->get( "fourty six thousand six hundred ninety two" ) );
var_dump( $hash->set( "fourty six thousand six hundred ninety two", 16091 ) );
var_dump( $hash->get( "fourty six thousand six hundred ninety two" ) );

echo "Set->Update\n";
var_dump( $hash->set( "fourty six thousand six hundred ninety two", 29906 ) );
var_dump( $hash->get( "fourty six thousand six hundred ninety two" ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

Set->Add
bool(false)
int(2)
int(16091)
Set->Update
int(1)
int(29906)

User Contributed Notes

There are no user contributed notes for this page.


Mets à jour une entrée de la table de hachage avec une nouvelle valeur

  • « QuickHashStringIntHash::set
  • QuickHashIntStringHash »
  • PHP Manual
  • QuickHashStringIntHash
  • Mets à jour une entrée de la table de hachage avec une nouvelle valeur

QuickHashStringIntHash::update

(No version information available, might only be in Git)

QuickHashStringIntHash::update — Mets à jour une entrée de la table de hachage avec une nouvelle valeur

Description

public QuickHashStringIntHash::update ( string $key , int $value ) : bool

Cette méthode met à jour une entrée avec une nouvelle valeur, et retourne le fait que l'entrée a bien été mise à jour ou non. S'il y a des doublons de clés, seul le premier élément recevra la nouvelle valeur. Utilisez QuickHashStringIntHash::CHECK_FOR_DUPES lors de la création de la table de hachage pour prévenir les doublons de clés.

Liste de paramètres

key

La clé de l'entrée à mettre à jour.

value

La nouvelle valeur pour l'entrée. Si une non-chaîne est passée, elle sera automatiquement convertie en chaîne, si possible.

Valeurs de retour

true lorsque l'entrée a été trouvée et mise à jour, et false si l'entrée n'est pas contenue dans la table de hachage.

Exemples

Exemple #1 Exemple avec QuickHashStringIntHash::update()

<?php
$hash = new QuickHashStringIntHash( 1024 );

$hash->add( 'six', 314159265 );
$hash->add( "a lot", 314159265 );

echo $hash->get( 'six' ), "\n";
echo $hash->get( 'a lot' ), "\n";

var_dump( $hash->update( 'a lot', 314159266 ) );
var_dump( $hash->update( "a lot plus one", 314159999 ) );

echo $hash->get( 'six' ), "\n";
echo $hash->get( 'a lot' ), "\n";
?>

Résultat de l'exemple ci-dessus est similaire à :

314159265
314159265
bool(true)
bool(false)
314159265
314159266

User Contributed Notes

There are no user contributed notes for this page.


The QuickHashIntStringHash class

(PECL quickhash >= Unknown)

Introduction

Cette classe est un conteneur pour un hash contenant des nombres entiers, alors que les valeurs sont elles, des chaines. Les hash sont aussi disponibles au travers de l'interface ArrayAccess.

Les hash peuvent aussi être parcourus via l'interface Iterator. L'ordre dans lequel les éléments ressortent n'est pas garanti.

Synopsis de la classe

QuickHashIntStringHash {
/* Constantes */
const int CHECK_FOR_DUPES = 1 ;
const int DO_NOT_USE_ZEND_ALLOC = 2 ;
const int HASHER_NO_HASH = 256 ;
const int HASHER_JENKINS1 = 512 ;
const int HASHER_JENKINS2 = 1024 ;
/* Méthodes */
public add ( int $key , string $value ) : bool
public __construct ( int $size , int $options = 0 )
public delete ( int $key ) : bool
public exists ( int $key ) : bool
public get ( int $key ) : mixed
public getSize ( ) : int
public static loadFromFile ( string $filename , int $size = 0 , int $options = 0 ) : QuickHashIntStringHash
public static loadFromString ( string $contents , int $size = 0 , int $options = 0 ) : QuickHashIntStringHash
public saveToFile ( string $filename ) : void
public saveToString ( ) : string
public set ( int $key , string $value ) : int
public update ( int $key , string $value ) : bool
}

Constantes pré-définies

QuickHashIntStringHash::CHECK_FOR_DUPES

Si activé, l'ajout d'éléments déja existants dans l'ensemble (via add() ou loadFromFile()) fera que ces éléments seront supprimés de l'ensemble. Ceci prendra du temps, utilisez uniquement lorsque nécessaire.

QuickHashIntStringHash::DO_NOT_USE_ZEND_ALLOC

Désactive l'utilisation du gestionnaire de mémoire interne à PHP. Si cette option est activée, les allocations internes ne compteront pas dans le paramètre memory_limit.

QuickHashIntStringHash::HASHER_NO_HASH

Utilise un modulo et non pas une fonction de hachage pour trouver un élément dans l'index. Ce n'est pas plus rapide que le hachage classique, et le risque de collision est plus élevé.

QuickHashIntStringHash::HASHER_JENKINS1

Fonction de hachage par défaut qui transforme les hash entiers en éléments indexés en liste.

QuickHashIntStringHash::HASHER_JENKINS2

Sélectionne un algorithme de hachage différent.

Sommaire

  • QuickHashIntStringHash::add — Cette méthode ajoute une nouvelle entrée à la table de hachage
  • QuickHashIntStringHash::__construct — Crée un nouvel objet QuickHashIntStringHash
  • QuickHashIntStringHash::delete — Supprime une entrée de la table de hachage
  • QuickHashIntStringHash::exists — Vérifie si une clé existe dans la table de hachage
  • QuickHashIntStringHash::get — Récupère une valeur depuis la table de hachage par sa clé
  • QuickHashIntStringHash::getSize — Retourne le nombre d'éléments de la table de hachage
  • QuickHashIntStringHash::loadFromFile — Crée une table de hachage depuis un fichier
  • QuickHashIntStringHash::loadFromString — Crée une table de hachage depuis une chaîne
  • QuickHashIntStringHash::saveToFile — Stocke une table de hachage en mémoire sur le disque
  • QuickHashIntStringHash::saveToString — Retourne une version linéarisée de la table de hachage
  • QuickHashIntStringHash::set — Met à jour une entrée depuis la table de hachage avec une nouvelle valeur, ou l'ajoute si l'entrée n'existe pas
  • QuickHashIntStringHash::update — Met à jour une entrée de la table de hachage avec une nouvelle valeur

User Contributed Notes

There are no user contributed notes for this page.


Cette méthode ajoute une nouvelle entrée à la table de hachage

  • « QuickHashIntStringHash
  • QuickHashIntStringHash::__construct »
  • PHP Manual
  • QuickHashIntStringHash
  • Cette méthode ajoute une nouvelle entrée à la table de hachage

QuickHashIntStringHash::add

(PECL quickhash >= Unknown)

QuickHashIntStringHash::add — Cette méthode ajoute une nouvelle entrée à la table de hachage

Description

public QuickHashIntStringHash::add ( int $key , string $value ) : bool

Cette méthode ajoute une nouvelle entrée à la table de hachage, et informe en retourne si l'entrée a bien été ajoutée. Par défaut, les entrées sont toujours ajoutées, à moins que QuickHashIntStringHash::CHECK_FOR_DUPES ait été passé lors de la création de la table de hachage.

Liste de paramètres

key

La clé de l'entrée à ajouter.

value

La valeur de l'entrée à ajouter. Si la valeur passée n'est pas une chaîne, elle sera convertie en chaîne automatiquement si cela est possible.

Valeurs de retour

true lorsque l'entrée a été ajoutée, et false si l'entrée n'a pas été ajoutée.

Exemples

Exemple #1 Exemple avec QuickHashIntStringHash::add()

<?php
echo "sans vérification de doublon\n";
$hash = new QuickHashIntStringHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, "twenty two" ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, "twelve" ) );

echo "\navec vérification de doublon\n";
$hash = new QuickHashIntStringHash( 1024, QuickHashIntStringHash::CHECK_FOR_DUPES );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, "seventy eight" ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->get( 4 ) );
var_dump( $hash->add( 4, "nine" ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

sans vérification de doublon
bool(false)
bool(false)
bool(true)
bool(true)
string(10) "twenty two"
bool(true)

avec vérification de doublon
bool(false)
bool(false)
bool(true)
bool(true)
string(13) "seventy eight"
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Crée un nouvel objet QuickHashIntStringHash

  • « QuickHashIntStringHash::add
  • QuickHashIntStringHash::delete »
  • PHP Manual
  • QuickHashIntStringHash
  • Crée un nouvel objet QuickHashIntStringHash

QuickHashIntStringHash::__construct

(PECL quickhash >= Unknown)

QuickHashIntStringHash::__construct — Crée un nouvel objet QuickHashIntStringHash

Description

public QuickHashIntStringHash::__construct ( int $size , int $options = 0 )

Ce constructeur crée un nouvel objet QuickHashIntStringHash. La taille représente la quantité de listes à créer. Le plus il y aura de listes, le moins il y aura de collisions. Des options sont également supportées.

Liste de paramètres

size

La quantité de listes à configurer. Le nombre passé sera automatiquement arrondi à la prochaine puissance de 2. Il est également automatiquement limité dans l'intervalle 64 à 4194304.

options

Les options que vous pouvez passer sont : QuickHashIntStringHash::CHECK_FOR_DUPES, qui s'assure qu'aucune entrée en doublon ne sera ajoutée à la table de hachage ; QuickHashIntStringHash::DO_NOT_USE_ZEND_ALLOC pour ne pas utiliser le gestionnaire de mémoire interne à PHP, mais aussi QuickHashIntStringHash::HASHER_NO_HASH, QuickHashIntStringHash::HASHER_JENKINS1 ou QuickHashIntStringHash::HASHER_JENKINS2 qui permettent de choisir l'algorithme de hachage à utiliser. Toutes les options peuvent être combinées en utilisant un masque.

Valeurs de retour

Retourne un nouvel objet QuickHashIntStringHash.

Exemples

Exemple #1 Exemple avec QuickHashIntStringHash::__construct()

<?php
var_dump( new QuickHashIntStringHash( 1024 ) );
var_dump( new QuickHashIntStringHash( 1024, QuickHashIntStringHash::CHECK_FOR_DUPES ) );
var_dump(
    new QuickHashIntStringHash(
        1024,
        QuickHashIntStringHash::DO_NOT_USE_ZEND_ALLOC | QuickHashIntStringHash::HASHER_JENKINS2
    )
);
?>

User Contributed Notes

There are no user contributed notes for this page.


Supprime une entrée de la table de hachage

  • « QuickHashIntStringHash::__construct
  • QuickHashIntStringHash::exists »
  • PHP Manual
  • QuickHashIntStringHash
  • Supprime une entrée de la table de hachage

QuickHashIntStringHash::delete

(PECL quickhash >= Unknown)

QuickHashIntStringHash::delete — Supprime une entrée de la table de hachage

Description

public QuickHashIntStringHash::delete ( int $key ) : bool

Cette méthode supprime une entrée de la table de hachage, et informe sur le fait que l'entrée a bien été supprimée ou non. Les structures mémoires internes ne seront pas libérées immédiatement, mais plutôt lorsque le hachage en tant que tel sera libéré.

Les éléments ne peuvent pas être supprimés lorsque le hachage est utilisé par un itérateur. La méthode n'émettra pas d'exception, mais retournera simplement false, comme elle l'aurait fait pour toute autre erreur de suppression.

Liste de paramètres

key

La clé de l'entrée à supprimer.

Valeurs de retour

true lorsque l'entrée a été supprimée avec succès, et false si l'entrée n'a pas été supprimée.

Exemples

Exemple #1 Exemple avec QuickHashIntStringHash::delete()

<?php
$hash = new QuickHashIntStringHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, "five" ) );
var_dump( $hash->delete( 4 ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->delete( 4 ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(false)
bool(true)
bool(true)
bool(false)
bool(false)

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si une clé existe dans la table de hachage

  • « QuickHashIntStringHash::delete
  • QuickHashIntStringHash::get »
  • PHP Manual
  • QuickHashIntStringHash
  • Vérifie si une clé existe dans la table de hachage

QuickHashIntStringHash::exists

(PECL quickhash >= Unknown)

QuickHashIntStringHash::exists — Vérifie si une clé existe dans la table de hachage

Description

public QuickHashIntStringHash::exists ( int $key ) : bool

Cette méthode vérifie si une entrée avec la clé fournie existe ou non dans la table de hachage.

Liste de paramètres

key

La clé de l'entrée dont on doit vérifier l'existance.

Valeurs de retour

Retourne true lorsque l'entrée a été trouvée, ou false si l'entrée n'a pas été trouvée.

User Contributed Notes

There are no user contributed notes for this page.


Récupère une valeur depuis la table de hachage par sa clé

  • « QuickHashIntStringHash::exists
  • QuickHashIntStringHash::getSize »
  • PHP Manual
  • QuickHashIntStringHash
  • Récupère une valeur depuis la table de hachage par sa clé

QuickHashIntStringHash::get

(PECL quickhash >= Unknown)

QuickHashIntStringHash::get — Récupère une valeur depuis la table de hachage par sa clé

Description

public QuickHashIntStringHash::get ( int $key ) : mixed

Cette méthode récupère une valeur depuis la table de hachage par sa clé.

Liste de paramètres

key

La clé de l'entrée à récupérer.

Valeurs de retour

La valeur si la clé existe, ou null si la clé ne fait pas partie de la table de hachage.

Exemples

Exemple #1 Exemple avec QuickHashIntStringHash::get()

<?php
$hash = new QuickHashIntStringHash( 8 );
var_dump( $hash->get( 1 ) );

var_dump( $hash->add( 2, "two" ) );
var_dump( $hash->get( 2 ) );

var_dump( $hash->add( 3, 5 ) );
var_dump( $hash->get( 3 ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(false)
bool(true)
string(3) "two"
bool(true)
string(1) "5"

User Contributed Notes

There are no user contributed notes for this page.


Retourne le nombre d'éléments de la table de hachage

  • « QuickHashIntStringHash::get
  • QuickHashIntStringHash::loadFromFile »
  • PHP Manual
  • QuickHashIntStringHash
  • Retourne le nombre d'éléments de la table de hachage

QuickHashIntStringHash::getSize

(PECL quickhash >= Unknown)

QuickHashIntStringHash::getSize — Retourne le nombre d'éléments de la table de hachage

Description

public QuickHashIntStringHash::getSize ( ) : int

Retourne le nombre d'éléments de la table de hachage.

Valeurs de retour

Le nombre d'éléments de la table de hachage.

Exemples

Exemple #1 Exemple avec QuickHashIntStringHash::getSize()

<?php
$hash = new QuickHashIntStringHash( 8 );
var_dump( $hash->add( 2, "two" ) );
var_dump( $hash->add( 3, 5 ) );
var_dump( $hash->getSize() );
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(true)
bool(true)
int(2)

User Contributed Notes

There are no user contributed notes for this page.


Crée une table de hachage depuis un fichier

  • « QuickHashIntStringHash::getSize
  • QuickHashIntStringHash::loadFromString »
  • PHP Manual
  • QuickHashIntStringHash
  • Crée une table de hachage depuis un fichier

QuickHashIntStringHash::loadFromFile

(PECL quickhash >= Unknown)

QuickHashIntStringHash::loadFromFile — Crée une table de hachage depuis un fichier

Description

public static QuickHashIntStringHash::loadFromFile ( string $filename , int $size = 0 , int $options = 0 ) : QuickHashIntStringHash

Cette méthode factorielle crée une nouvelle table de hachage depuis un fichier de définition se trouvant sur le disque. Le format consiste en une signature 'QH\0x12\0', le nombre d'éléments sous la forme d'un entier signé sur 32 bits en système Endianness, un entier non-signé sur 32 bits contenant le nombre d'éléments de données suivants les caractères. Cette élément de données contient toutes les chaînes. Après l'ent-tête et les chaînes, les éléments suivent, sous la forme d'une paire de 2 entiers non-signés sur 32 bits, où le premier est la clé, et le second, l'index de l'élément de données. Voici un exemple :

Exemple #1 Format de fichier QuickHash IntString

00000000  51 48 12 00 02 00 00 00  09 00 00 00 4f 4e 45 00  |QH..........ONE.|
00000010  4e 49 4e 45 00 01 00 00  00 00 00 00 00 03 00 00  |NINE............|
00000020  00 04 00 00 00                                    |.....|
00000025

Exemple #2 Format de fichier QuickHash IntString

header signature ('QH'; key type: 1; value type: 2; filler: \0x00)
00000000  51 48 12 00

number of elements:
00000004  02 00 00 00

length of string values (9 characters):
00000008  09 00 00 00

string values:
0000000C  4f 4e 45 00 4e 49 4e 45  00

data string:
00000015  01 00 00 00 00 00 00 00  03 00 00 00 04 00 00 00

key/value 1 (key = 1, string index = 0 ("ONE")):
01 00 00 00  00 00 00 00

key/value 2 (key = 3, string index = 4 ("NINE")):
03 00 00 00  04 00 00 00

Liste de paramètres

filename

Le nom du fichier depuis lequel la table de hachage sera lue.

size

La quantité de listes à créer. Le nombre passé sera automatiquement arrondi à la prochaine puissance de 2. Il sera également automatiquement limité à l'intervalle 4 - 4194304.

options

Les mêmes options que le constructeur de la classe ; sauf l'option taille qui sera ignorée. Elle sera automatiquement calculée pour correspondre au nombre d'entrées dans la table de hachage, arrondi à la puissance de 2 le plus proche avec une limite maximale de 4194304.

Valeurs de retour

Returns a new QuickHashIntStringHash.

Exemples

Exemple #3 Exemple avec QuickHashIntStringHash::loadFromFile()

<?php
$file = dirname( __FILE__ ) . "/simple.string.hash";
$hash = QuickHashIntStringHash::loadFromFile(
    $file,
    QuickHashIntStringHash::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
    printf( "Key %3d (%2x) is %s\n",
        $key, $key,
        $hash->exists( $key ) ? 'set' : 'unset'
    );
}
?>

Résultat de l'exemple ci-dessus est similaire à :

Key   0 ( 0) is unset
Key   1 ( 1) is set
Key   2 ( 2) is set
Key   3 ( 3) is set
Key   4 ( 4) is unset
Key   5 ( 5) is set
Key   6 ( 6) is unset
Key   7 ( 7) is set
Key   8 ( 8) is unset
Key   9 ( 9) is unset
Key  10 ( a) is unset
Key  11 ( b) is set
Key  12 ( c) is unset
Key  13 ( d) is set
Key  14 ( e) is unset
Key  15 ( f) is unset

User Contributed Notes

There are no user contributed notes for this page.


Crée une table de hachage depuis une chaîne

  • « QuickHashIntStringHash::loadFromFile
  • QuickHashIntStringHash::saveToFile »
  • PHP Manual
  • QuickHashIntStringHash
  • Crée une table de hachage depuis une chaîne

QuickHashIntStringHash::loadFromString

(PECL quickhash >= Unknown)

QuickHashIntStringHash::loadFromString — Crée une table de hachage depuis une chaîne

Description

public static QuickHashIntStringHash::loadFromString ( string $contents , int $size = 0 , int $options = 0 ) : QuickHashIntStringHash

Cette méthode factorielle crée une nouvelle table de hachage depuis une définition se trouvant dans une chaîne. Le format est identique à celui utilisé par la fonction "loadFromFile".

Liste de paramètres

contents

La chaîne contenant un format linéarisé de la table de hachage.

size

La quantité de liste à configurer. Le nombre passé sera automatiquement arrondi à la prochaine puissance de 2. Il sera également limité à l'intervalle 4 - 4194304.

options

Les mêmes options que pour le constructeur de la classe ; sauf l'option taille est ignorée. Elle est automatiquement calculé de façon à être identique au nombre d'entrées dans la table de hachage, arrondi à la puissance de 2 la plus proche, avec une limite maximale de 4194304.

Valeurs de retour

Retourne un nouvel objet QuickHashIntStringHash.

Exemples

Exemple #1 Exemple avec QuickHashIntStringHash::loadFromString()

<?php
$contents = file_get_contents( dirname( __FILE__ ) . "/simple.hash" );
$hash = QuickHashIntStringHash::loadFromString(
    $contents,
    QuickHashIntStringHash::DO_NOT_USE_ZEND_ALLOC
);
foreach( range( 0, 0x0f ) as $key )
{
    printf( "Key %3d (%2x) is %s\n",
        $key, $key,
        $hash->exists( $key ) ? 'set' : 'unset'
    );
}
?>

Résultat de l'exemple ci-dessus est similaire à :

Key   0 ( 0) is unset
Key   1 ( 1) is set
Key   2 ( 2) is set
Key   3 ( 3) is set
Key   4 ( 4) is unset
Key   5 ( 5) is set
Key   6 ( 6) is unset
Key   7 ( 7) is set
Key   8 ( 8) is unset
Key   9 ( 9) is unset
Key  10 ( a) is unset
Key  11 ( b) is set
Key  12 ( c) is unset
Key  13 ( d) is set
Key  14 ( e) is unset
Key  15 ( f) is unset

User Contributed Notes

There are no user contributed notes for this page.


Stocke une table de hachage en mémoire sur le disque

  • « QuickHashIntStringHash::loadFromString
  • QuickHashIntStringHash::saveToString »
  • PHP Manual
  • QuickHashIntStringHash
  • Stocke une table de hachage en mémoire sur le disque

QuickHashIntStringHash::saveToFile

(PECL quickhash >= Unknown)

QuickHashIntStringHash::saveToFile — Stocke une table de hachage en mémoire sur le disque

Description

public QuickHashIntStringHash::saveToFile ( string $filename ) : void

Cette méthode stocke une table de hachage existante dans un fichier du disque, dans un format lisible par la fonction loadFromFile().

Liste de paramètres

filename

Le nom du fichier utilisé pour y stocker la table de hachage.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec QuickHashIntStringHash::saveToFile()

<?php
$hash = new QuickHashIntStringHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, "fourty three" ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, "fifty two" ) );

$hash->saveToFile( '/tmp/test.string.hash' );
?>

User Contributed Notes

There are no user contributed notes for this page.


Retourne une version linéarisée de la table de hachage

  • « QuickHashIntStringHash::saveToFile
  • QuickHashIntStringHash::set »
  • PHP Manual
  • QuickHashIntStringHash
  • Retourne une version linéarisée de la table de hachage

QuickHashIntStringHash::saveToString

(PECL quickhash >= Unknown)

QuickHashIntStringHash::saveToString — Retourne une version linéarisée de la table de hachage

Description

public QuickHashIntStringHash::saveToString ( ) : string

Cette méthode retourne une version linéarisée de la table de hachage dans un format que la fonction loadFromString() peut lire.

Valeurs de retour

Cette méthode retourne une chaîne contenant un format linéarisé de la table de hachage. Chaque élément est stocké sous la forme d'une valeur sous 4 octets en Endianness que le système courant utilise.

Exemples

Exemple #1 Exemple avec QuickHashIntStringHash::saveToString()

<?php
$hash = new QuickHashIntStringHash( 1024 );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 4, "thirty four" ) );
var_dump( $hash->exists( 4 ) );
var_dump( $hash->add( 5, "fifty five" ) );

var_dump( $hash->saveToString() );
?>

User Contributed Notes

There are no user contributed notes for this page.


Met à jour une entrée depuis la table de hachage avec une nouvelle valeur, ou l'ajoute si l'entrée n'existe pas

  • « QuickHashIntStringHash::saveToString
  • QuickHashIntStringHash::update »
  • PHP Manual
  • QuickHashIntStringHash
  • Met à jour une entrée depuis la table de hachage avec une nouvelle valeur, ou l'ajoute si l'entrée n'existe pas

QuickHashIntStringHash::set

(PECL quickhash >= Unknown)

QuickHashIntStringHash::set — Met à jour une entrée depuis la table de hachage avec une nouvelle valeur, ou l'ajoute si l'entrée n'existe pas

Description

public QuickHashIntStringHash::set ( int $key , string $value ) : int

Cette méthode tente de mettre à jour une entrée avec une nouvelle valeur. Dans le cas où l'entrée n'existe pas, elle va l'ajouter. Elle informe en retour si l'entrée a été mise à jour ou bien ajouté. Si il y a des doublons de clés, seul le premier élément recevra la nouvelle valeur. Utilisez QuickHashIntStringHash::CHECK_FOR_DUPES lors de la création de la table de hachage pour prévenir le doublon de clés.

Liste de paramètres

key

La clé de l'entrée à ajouter ou mettre à jour.

value

La valeur de l'entrée à ajouter ou mettre à jour. Si une non-chaîne est passée, elle sera convertie en chaîne automatiquement si possible.

Valeurs de retour

Retournera 2 si l'entrée a été trouvée et mise à jour, 1 si l'entrée a été ajoutée, ou 0 si une erreur survient.

Exemples

Exemple #1 Exemple avec QuickHashIntStringHash::set()

<?php
$hash = new QuickHashIntStringHash( 1024 );

echo "Set->Add\n";
var_dump( $hash->get( 46692 ) );
var_dump( $hash->set( 46692, "sixteen thousand ninety one" ) );
var_dump( $hash->get( 46692 ) );

echo "Set->Update\n";
var_dump( $hash->set( 46692, "twenty nine thousand nine hundred six" ) );
var_dump( $hash->get( 46692 ) );
?>

Résultat de l'exemple ci-dessus est similaire à :

Set->Add
bool(false)
int(2)
string(27) "sixteen thousand ninety one"
Set->Update
int(1)
string(37) "twenty nine thousand nine hundred six"

User Contributed Notes

There are no user contributed notes for this page.


Met à jour une entrée de la table de hachage avec une nouvelle valeur

  • « QuickHashIntStringHash::set
  • Réflection »
  • PHP Manual
  • QuickHashIntStringHash
  • Met à jour une entrée de la table de hachage avec une nouvelle valeur

QuickHashIntStringHash::update

(PECL quickhash >= Unknown)

QuickHashIntStringHash::update — Met à jour une entrée de la table de hachage avec une nouvelle valeur

Description

public QuickHashIntStringHash::update ( int $key , string $value ) : bool

Cette méthode met à jour une entrée avec une nouvelle valeur, et retourne le fait que l'entrée a bien été mise à jour ou non. Si il y a des clés dupliquées, seul le premier élément trouvé recevra la valeur mise à jour. Utilisez QuickHashIntStringHash::CHECK_FOR_DUPES lors de la création de la table de hachage pour prévenir les doublons de clés.

Liste de paramètres

key

La clé de l'entrée à mettre à jour.

value

La nouvelle valeur de l'entrée. Si une non-chaîne est passée, elle sera convertie en une chaîne automatiquement, si possible.

Valeurs de retour

true lorsque l'entrée a été trouvée et mise à jour, et false si l'entrée ne fait pas partie de la table de hachage.

Exemples

Exemple #1 Exemple avec QuickHashIntStringHash::update()

<?php
$hash->add( 161803398, "--" );
$hash->add( 314159265, "a lot" );

echo $hash->get( 161803398 ), "\n";
echo $hash->get( 314159265 ), "\n";

var_dump( $hash->update( 314159265, "a lot plus one" ) );
var_dump( $hash->update( 314159999, "a lot plus one" ) );

echo $hash->get( 161803398 ), "\n";
echo $hash->get( 314159265 ), "\n";
?>

Résultat de l'exemple ci-dessus est similaire à :

--
a lot
bool(true)
bool(false)
--
a lot plus one

User Contributed Notes

There are no user contributed notes for this page.


Réflection

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Exemples
  • Étendre la classe
  • Reflection — La classe Reflection
    • Reflection::export — Exporte
    • Reflection::getModifierNames — Récupère les nom des modificateurs
  • ReflectionClass — La classe ReflectionClass
    • ReflectionClass::__construct — Construit une ReflectionClass
    • ReflectionClass::export — Exporte une classe
    • ReflectionClass::getConstant — Récupère une constante
    • ReflectionClass::getConstants — Récupère les constantes
    • ReflectionClass::getConstructor — Récupère le constructeur d'une classe
    • ReflectionClass::getDefaultProperties — Récupère les propriétés par défaut
    • ReflectionClass::getDocComment — Récupère les commentaires de documentation
    • ReflectionClass::getEndLine — Récupère la fin d'une ligne
    • ReflectionClass::getExtension — Récupère un objet ReflectionExtension pour l'extension qui définit la classe
    • ReflectionClass::getExtensionName — Récupère le nom de l'extension qui définit la classe
    • ReflectionClass::getFileName — Récupère le nom du fichier où la classe a été déclaré
    • ReflectionClass::getInterfaceNames — Récupère les noms des interfaces
    • ReflectionClass::getInterfaces — Récupère les interfaces
    • ReflectionClass::getMethod — Récupère un ReflectionMethod pour une méthode de classe
    • ReflectionClass::getMethods — Récupère un tableau des méthodes
    • ReflectionClass::getModifiers — Récupère les modificateurs de classe
    • ReflectionClass::getName — Récupère le nom de la classe
    • ReflectionClass::getNamespaceName — Récupère l'espace de noms
    • ReflectionClass::getParentClass — Récupère la classe parente
    • ReflectionClass::getProperties — Récupère les propriétés
    • ReflectionClass::getProperty — Récupère une ReflectionProperty pour une propriété d'une classe
    • ReflectionClass::getReflectionConstant — Récupère un ReflectionClassConstant pour une constante d'une classe
    • ReflectionClass::getReflectionConstants — Récupère les constantes de classe
    • ReflectionClass::getShortName — Récupère le nom court d'une classe
    • ReflectionClass::getStartLine — Récupère le numéro de ligne de départ
    • ReflectionClass::getStaticProperties — Récupère les propriétés statiques
    • ReflectionClass::getStaticPropertyValue — Récupère la valeur d'une propriété statique
    • ReflectionClass::getTraitAliases — Retourne un tableau des alias du trait
    • ReflectionClass::getTraitNames — Retourne un tableau de noms des traits utilisés par cette classe
    • ReflectionClass::getTraits — Retourne un tableau des traits utilisés par cette classe
    • ReflectionClass::hasConstant — Vérifie si une constante est définie
    • ReflectionClass::hasMethod — Vérifie si une méthode est définie
    • ReflectionClass::hasProperty — Vérifie si une propriété est définie
    • ReflectionClass::implementsInterface — Vérifie si une classe implémente une interface
    • ReflectionClass::inNamespace — Vérifie si une classe est définie dans un espace de noms
    • ReflectionClass::isAbstract — Vérifie si une classe est abstraite
    • ReflectionClass::isAnonymous — Vérifie si la classe est anonyme
    • ReflectionClass::isCloneable — Renseigne à propos de la propriété de duplication de la classe
    • ReflectionClass::isFinal — Vérifie si une classe est finale
    • ReflectionClass::isInstance — Vérifie si une classe est une instance d'une autre classe
    • ReflectionClass::isInstantiable — Vérifie si une classe est instanciable
    • ReflectionClass::isInterface — Vérifie si une classe est une interface
    • ReflectionClass::isInternal — Vérifie si une classe est définie comme interne par une extension
    • ReflectionClass::isIterable — Vérifie si cette classe est itérable
    • ReflectionClass::isIterateable — Alias de ReflectionClass::isIterable
    • ReflectionClass::isSubclassOf — Vérifie si la classe est une sous-classe
    • ReflectionClass::isTrait — Renseigne s'il s'agit d'un trait
    • ReflectionClass::isUserDefined — Vérifie si une classe a été définie dans l'espace utilisateur
    • ReflectionClass::newInstance — Créer une nouvelle instance de la classe en utilisant les arguments fournis
    • ReflectionClass::newInstanceArgs — Créer une nouvelle instance en utilisant les arguments fournis
    • ReflectionClass::newInstanceWithoutConstructor — Crée une nouvelle instance de la classe sans invoquer le constructeur
    • ReflectionClass::setStaticPropertyValue — Définit la valeur d'une propriété statiques
    • ReflectionClass::__toString — Crée une représentation textuelle de l'objet
  • ReflectionClassConstant — La classe ReflectionClassConstant
    • ReflectionClassConstant::__construct — Construit une ReflectionClassConstant
    • ReflectionClassConstant::export — Exporte
    • ReflectionClassConstant::getDeclaringClass — Récupère la classe déclarante
    • ReflectionClassConstant::getDocComment — Récupère le commentaire de documentation
    • ReflectionClassConstant::getModifiers — Récupère les modificateurs de la constante de classe
    • ReflectionClassConstant::getName — Récupère le nom de la constante
    • ReflectionClassConstant::getValue — Récupère la valeur
    • ReflectionClassConstant::isPrivate — Vérifie si la constante de classe est privée
    • ReflectionClassConstant::isProtected — Vérifie si la constante de classe est protégée
    • ReflectionClassConstant::isPublic — Vérifie si la constante de classe est publique
    • ReflectionClassConstant::__toString — Retourne la représentation sous forme de chaîne de caractères de l'objet ReflectionClassConstant
  • ReflectionZendExtension — La classe ReflectionZendExtension
    • ReflectionZendExtension::__clone — Gestionnaire de clonage
    • ReflectionZendExtension::__construct — Constructeur
    • ReflectionZendExtension::export — Export
    • ReflectionZendExtension::getAuthor — Récupère l'auteur
    • ReflectionZendExtension::getCopyright — Récupère le copyright
    • ReflectionZendExtension::getName — Récupère le nom
    • ReflectionZendExtension::getURL — Récupère l'URL
    • ReflectionZendExtension::getVersion — Récupère la version
    • ReflectionZendExtension::__toString — Gestionnaire de conversion en chaîne de caractères
  • ReflectionExtension — La classe ReflectionExtension
    • ReflectionExtension::__clone — Clonage
    • ReflectionExtension::__construct — Construit un nouvel objet ReflectionExtension
    • ReflectionExtension::export — Exportation
    • ReflectionExtension::getClasses — Récupère les classes
    • ReflectionExtension::getClassNames — Récupère les noms des classes
    • ReflectionExtension::getConstants — Récupère les constantes
    • ReflectionExtension::getDependencies — Récupère les dépendances
    • ReflectionExtension::getFunctions — Récupère les fonctions d'une extension
    • ReflectionExtension::getINIEntries — Récupère les entrées ini de l'extension
    • ReflectionExtension::getName — Récupère le nom de l'extension
    • ReflectionExtension::getVersion — Récupère la version de l'extension
    • ReflectionExtension::info — Affiche des informations sur l'extension
    • ReflectionExtension::isPersistent — Vérifie si l'extension est persistante
    • ReflectionExtension::isTemporary — Vérifie si l'extension est temporaire
    • ReflectionExtension::__toString — Récupère une représentation textuelle
  • ReflectionFunction — La classe ReflectionFunction
    • ReflectionFunction::__construct — Construit un nouvel objet ReflectionFunction
    • ReflectionFunction::export — Exporte une fonction
    • ReflectionFunction::getClosure — Retourne une fermeture créée dynamiquement pour la fonction
    • ReflectionFunction::invoke — Invoque une fonction
    • ReflectionFunction::invokeArgs — Invoque les arguments d'une fonction
    • ReflectionFunction::isDisabled — Vérifie si une fonction est désactivée
    • ReflectionFunction::__toString — Récupère une représentation textuelle
  • ReflectionFunctionAbstract — La classe ReflectionFunctionAbstract
    • ReflectionFunctionAbstract::__clone — Clone une fonction
    • ReflectionFunctionAbstract::getClosureScopeClass — Retourne le contexte associé à la closure
    • ReflectionFunctionAbstract::getClosureThis — Retourne le pointeur lié à la fermeture
    • ReflectionFunctionAbstract::getDocComment — Récupère un commentaire
    • ReflectionFunctionAbstract::getEndLine — Récupère le numéro de la dernière ligne
    • ReflectionFunctionAbstract::getExtension — Récupère les informations d'une extension
    • ReflectionFunctionAbstract::getExtensionName — Récupère le nom de l'extension
    • ReflectionFunctionAbstract::getFileName — Récupère le nom du fichier
    • ReflectionFunctionAbstract::getName — Récupère le nom d'une fonction
    • ReflectionFunctionAbstract::getNamespaceName — Récupère l'espace de noms
    • ReflectionFunctionAbstract::getNumberOfParameters — Récupère le nombre de paramètres
    • ReflectionFunctionAbstract::getNumberOfRequiredParameters — Récupère le nombre de paramètres requis
    • ReflectionFunctionAbstract::getParameters — Récupère les paramètres
    • ReflectionFunctionAbstract::getReturnType — Récupère le type de retour définit pour une fonction
    • ReflectionFunctionAbstract::getShortName — Récupère le nom court d'une fonction
    • ReflectionFunctionAbstract::getStartLine — Récupère le numéro de ligne de départ
    • ReflectionFunctionAbstract::getStaticVariables — Récupère les variables statiques
    • ReflectionFunctionAbstract::hasReturnType — Vérifie si la fonction a un type de retour définit
    • ReflectionFunctionAbstract::inNamespace — Vérifie si une fonction est dans un espace de noms
    • ReflectionFunctionAbstract::isClosure — Vérifie si c'est une fermeture
    • ReflectionFunctionAbstract::isDeprecated — Vérifie si la fonction est obsolète
    • ReflectionFunctionAbstract::isGenerator — Vérifie si la fonction est un générateur
    • ReflectionFunctionAbstract::isInternal — Vérifie si la fonction est une fonction interne
    • ReflectionFunctionAbstract::isUserDefined — Vérifie si la fonction est définie dans l'espace utilisateur
    • ReflectionFunctionAbstract::isVariadic — Vérifie si la fonction est variadique
    • ReflectionFunctionAbstract::returnsReference — Vérifie si la fonction retourne une référence
    • ReflectionFunctionAbstract::__toString — Récupère une représentation textuelle
  • ReflectionMethod — La classe ReflectionMethod
    • ReflectionMethod::__construct — Construit un nouvel objet ReflectionMethod
    • ReflectionMethod::export — Exportation d'une méthode de reflection
    • ReflectionMethod::getClosure — Retourne une fermeture créée dynamiquement pour la méthode
    • ReflectionMethod::getDeclaringClass — Récupère la déclaration de la classe de la méthode réfléchie
    • ReflectionMethod::getModifiers — Récupère les modificateurs de la méthode
    • ReflectionMethod::getPrototype — Récupère le prototype de la méthode (s'il existe)
    • ReflectionMethod::invoke — Invoque
    • ReflectionMethod::invokeArgs — Invoque les arguments
    • ReflectionMethod::isAbstract — Vérifie si la méthode est abstraite
    • ReflectionMethod::isConstructor — Vérifie si la méthode est un constructeur
    • ReflectionMethod::isDestructor — Vérifie si la méthode est un destructeur
    • ReflectionMethod::isFinal — Vérifie si la méthode est finale
    • ReflectionMethod::isPrivate — Vérifie si la méthode est privée
    • ReflectionMethod::isProtected — Vérifie si la méthode est protégée
    • ReflectionMethod::isPublic — Vérifie si la méthode est publique
    • ReflectionMethod::isStatic — Vérifie si la méthode est statique
    • ReflectionMethod::setAccessible — Définit l'accessibilité de la méthode
    • ReflectionMethod::__toString — Retourne une représentation textuelle de la méthode
  • ReflectionNamedType — La classe ReflectionNamedType
    • ReflectionNamedType::getName — Récupère le texte de la déclaration de type
    • ReflectionNamedType::isBuiltin — Vérifie si c'est un type intégré
  • ReflectionObject — La classe ReflectionObject
    • ReflectionObject::__construct — Construit un nouvel objet ReflectionObject
    • ReflectionObject::export — Exportation
  • ReflectionParameter — La classe ReflectionParameter
    • ReflectionParameter::allowsNull — Vérifie si la valeur null est autorisée comme valeur du paramètre
    • ReflectionParameter::canBePassedByValue — Vérifie si le paramètre peut être passé par valeur
    • ReflectionParameter::__clone — Clonage
    • ReflectionParameter::__construct — Constructeur
    • ReflectionParameter::export — Exportation
    • ReflectionParameter::getClass — Récupère la classe de typage d'objets
    • ReflectionParameter::getDeclaringClass — Récupère la classe déclarante
    • ReflectionParameter::getDeclaringFunction — Récupère la fonction déclarante
    • ReflectionParameter::getDefaultValue — Récupère la valeur par défaut du paramètre
    • ReflectionParameter::getDefaultValueConstantName — Retourne le nom de la constante de la valeur par défaut si la valeur est une constante ou null
    • ReflectionParameter::getName — Récupère le nom du paramètre
    • ReflectionParameter::getPosition — Récupère la position d'un paramètre
    • ReflectionParameter::getType — Récupère le type du paramètre
    • ReflectionParameter::hasType — Vérifie si un paramètre a un type
    • ReflectionParameter::isArray — Vérifie si le paramètre attend un tableau
    • ReflectionParameter::isCallable — Vérifie si le paramètre est de type callable
    • ReflectionParameter::isDefaultValueAvailable — Vérifie si une valeur par défaut est disponible pour le paramètre
    • ReflectionParameter::isDefaultValueConstant — Vérifie si la valeur par défaut du paramètre est une constante
    • ReflectionParameter::isOptional — Vérifie si le paramètre est optionnel
    • ReflectionParameter::isPassedByReference — Vérifie si le paramètre est passé par référence
    • ReflectionParameter::isVariadic — Vérifie si le paramètre est variadique
    • ReflectionParameter::__toString — Récupère une représentation textuelle
  • ReflectionProperty — La classe ReflectionProperty
    • ReflectionProperty::__clone — Clonage
    • ReflectionProperty::__construct — Construit un nouvel objet ReflectionProperty
    • ReflectionProperty::export — Exporte
    • ReflectionProperty::getDeclaringClass — Récupère la classe déclarante
    • ReflectionProperty::getDefaultValue — Returns the default value declared for a property
    • ReflectionProperty::getDocComment — Récupère le commentaire de documentation d'une propriété
    • ReflectionProperty::getModifiers — Récupère les modificateurs de propriété
    • ReflectionProperty::getName — Récupère le nom de la proriété
    • ReflectionProperty::getType — Récupère le type d'une propriété
    • ReflectionProperty::getValue — Récupère la valeur de la propriété
    • ReflectionProperty::hasDefaultValue — Checks if property has a default value declared
    • ReflectionProperty::hasType — Vérifie si la propriété à un type
    • ReflectionProperty::isDefault — Vérifie si la propriété est celle par défaut
    • ReflectionProperty::isInitialized — Vérifie si une propriété est initialisée
    • ReflectionProperty::isPrivate — Vérifie si la propriété est privée
    • ReflectionProperty::isProtected — Vérifie si la propriété est protégée
    • ReflectionProperty::isPublic — Vérifie si la propriété est publique
    • ReflectionProperty::isStatic — Vérifie si la propriété est statique
    • ReflectionProperty::setAccessible — Définit l'accessibilité d'une propriété
    • ReflectionProperty::setValue — Définit la valeur de la propriété
    • ReflectionProperty::__toString — Récupère une représentation textuelle
  • ReflectionType — La classe ReflectionType
    • ReflectionType::allowsNull — Vérifie si null est permit
    • ReflectionType::__toString — To string
  • ReflectionUnionType — The ReflectionUnionType class
    • ReflectionUnionType::getTypes — Returns the types included in the union type
  • ReflectionGenerator — La classe ReflectionGenerator
    • ReflectionGenerator::__construct — Construit un objet ReflectionGenerator
    • ReflectionGenerator::getExecutingFile — Récupère le nom de fichier du générateur actuellement exécuté
    • ReflectionGenerator::getExecutingGenerator — Récupère l'objet Generator exécuté
    • ReflectionGenerator::getExecutingLine — Récupère la ligne actuellement exécutée du générateur
    • ReflectionGenerator::getFunction — Récupère le nom de fonction du générateur
    • ReflectionGenerator::getThis — Récupère la valeur de $this du générateur
    • ReflectionGenerator::getTrace — Récupère la trace du générateur exécutant
  • ReflectionReference — The ReflectionReference class
    • ReflectionReference::fromArrayElement — Create a ReflectionReference from an array element
    • ReflectionReference::getId — Get unique ID of a reference
  • Reflector — L'interface Reflector
    • Reflector::export — Exporte
    • Reflector::__toString — Conversion en chaîne de caractères
  • ReflectionException — La classe ReflectionException

User Contributed Notes

There are no user contributed notes for this page.


Introduction

PHP fournit une API de réflection complète qui permet de faire une introspection sur les classes, interfaces, fonctions, méthodes et les extensions. De plus, l'API de réflection offre la possibilité de récupérer les commentaires de documentation des fonctions, classes et méthodes.

Il est à noter que certaines parties de l'API interne ne fournissent pas le code nécessaire afin de faire fonctionner l'extension Reflection. Par exemple, une classe PHP interne peut manquer des données de réflection pour les propriétés. Ces quelques cas sont considérés comme des bogues, cependant, ils doivent être découvert et corrigés.

User Contributed Notes

There are no user contributed notes for this page.


Constantes pré-définies

Chaque classe décrit ses propres constantes.

User Contributed Notes

sadisticnepal3339 at gmail dot com 27-Mar-2018 11:35
PHP user-defined constant can be like this:

define('APP',
[
  'name'=>'Sadish',
  'hobby'=>'Coding',
   'occupation'=>'student'
]);

Here, APP is the user-defined constant which is defined using define() function available in PHP.

Also, Simply anything, like this :
  define('APP','Demo PHP');
 is a user-defined constant, which basically replaces any code available in PHP named as APP with the value 'Demo PHP'.


Exemples

Plusieurs exemples existent dans la documentation Reflection, typiquement, dans la documentation __construct, pour chaque classe.

Exemple #1 Exemple avec Reflection depuis un Shell (un Terminal)

$ php --rf strlen
$ php --rc finfo
$ php --re json
$ php --ri dom

Résultat de l'exemple ci-dessus est similaire à :

Function [ <internal:Core> function strlen ] {

  - Parameters [1] {
    Parameter #0 [ <required> $str ]
  }
}

Class [ <internal:fileinfo> class finfo ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [0] {
  }

  - Methods [4] {
    Method [ <internal:fileinfo, ctor> public method finfo ] {

      - Parameters [2] {
        Parameter #0 [ <optional> $options ]
        Parameter #1 [ <optional> $arg ]
      }
    }

    Method [ <internal:fileinfo> public method set_flags ] {

      - Parameters [1] {
        Parameter #0 [ <required> $options ]
      }
    }

    Method [ <internal:fileinfo> public method file ] {

      - Parameters [3] {
        Parameter #0 [ <required> $filename ]
        Parameter #1 [ <optional> $options ]
        Parameter #2 [ <optional> $context ]
      }
    }

    Method [ <internal:fileinfo> public method buffer ] {

      - Parameters [3] {
        Parameter #0 [ <required> $string ]
        Parameter #1 [ <optional> $options ]
        Parameter #2 [ <optional> $context ]
      }
    }
  }
}

Extension [ <persistent> extension #23 json version 1.2.1 ] {

  - Constants [10] {
    Constant [ integer JSON_HEX_TAG ] { 1 }
    Constant [ integer JSON_HEX_AMP ] { 2 }
    Constant [ integer JSON_HEX_APOS ] { 4 }
    Constant [ integer JSON_HEX_QUOT ] { 8 }
    Constant [ integer JSON_FORCE_OBJECT ] { 16 }
    Constant [ integer JSON_ERROR_NONE ] { 0 }
    Constant [ integer JSON_ERROR_DEPTH ] { 1 }
    Constant [ integer JSON_ERROR_STATE_MISMATCH ] { 2 }
    Constant [ integer JSON_ERROR_CTRL_CHAR ] { 3 }
    Constant [ integer JSON_ERROR_SYNTAX ] { 4 }
  }

  - Functions {
    Function [ <internal:json> function json_encode ] {

      - Parameters [2] {
        Parameter #0 [ <required> $value ]
        Parameter #1 [ <optional> $options ]
      }
    }
    Function [ <internal:json> function json_decode ] {

      - Parameters [3] {
        Parameter #0 [ <required> $json ]
        Parameter #1 [ <optional> $assoc ]
        Parameter #2 [ <optional> $depth ]
      }
    }
    Function [ <internal:json> function json_last_error ] {

      - Parameters [0] {
      }
    }
  }
}

dom

DOM/XML => enabled
DOM/XML API Version => 20031129
libxml Version => 2.7.3
HTML Support => enabled
XPath Support => enabled
XPointer Support => enabled
Schema Support => enabled
RelaxNG Support => enabled

User Contributed Notes

paulo dot castro48 at gmail dot com 19-Feb-2017 02:18
Note: This is useful when you're manually parsing php by file before to get work done, wich is impossible to do without getting files externally.
Now you can parse without getting the file contents by using refection objects.
spectrum at bigmir dot net 28-Dec-2010 02:11
Simple table generation using Reflection:

<?php

class A
{
    public    $name = 'Vasiliy';
    public    $text = 'Once upon a time';
}

class B
{
    public    $name = 'Had bought a cat';
    public    $text = 'named Valentine';
}

class grid
{
    public function build(  $dataSource, $headers, $fields  )
    {
        $result = '<table border="1">';
        $result .= $this -> make_head( $headers );

        foreach ($dataSource as $source):
            $class_name = get_class($source);
            if ( $class_name != FALSE ):
                $reflector = new ReflectionClass($source);
                echo 'Class "'. $class_name .'" found.<br />';
                $result .= $this -> make_row( $reflector, $fields, $source );
            endif;
        endforeach;

        $result .= '</table>';
        return $result;
    }

    private function make_head( $headers )
    {
        $result = '<tr>';
        foreach ( $headers as $header):
            $result .= "<th>$header</th>";
        endforeach;
        $result .= '</tr>';
        return $result;
    }

    private function make_row( $reflector, $fields, $source )
    {
        $result = '<tr>';
        foreach ( $fields as $field ):
            if ( $reflector -> hasProperty($field) ):
                $property = $reflector -> getProperty($field);
                $result .= '<td>'. $property -> getValue($source) .'</td>';
            endif;
        endforeach;
        $result .= '</tr>';
        return $result;
    }
}

$A = new A;
$B = new B;
$C = 'Test';

$dataSource = array( $A, $B, $C );
$headers = array( 'H1', 'H2' );
$fields = array( 'name', 'text' );

$grid = new grid;
$table = $grid -> build( $dataSource, $headers, $fields );
echo $table;

?>
Kovin 18-May-2009 02:00
If you want to use method closures and don't have PHP 5.3, perhaps you find useful the following function
<?php
    function get_method_closure($object,$method_name){
        if(method_exists(get_class($object),$method_name)){
            $func            = create_function( '',
                            '
                                $args            = func_get_args();
                                static $object    = NULL;

                                /*
                                * Check if this function is being called to set the static $object, which
                                * containts scope information to invoke the method
                                */
                                if(is_null($object) && count($args) && get_class($args[0])=="'.get_class($object).'"){
                                    $object = $args[0];
                                    return;
                                }

                                if(!is_null($object)){
                                    return call_user_func_array(array($object,"'.$method_name.'"),$args);
                                }else{
                                    return FALSE;
                                }'
                            );

            //Initialize static $object
            $func($object);

            //Return closure
            return $func;
        }else{
            return false;
        }
    }
?>
Here is how you would use it:
<?php
class foo{
    public function bar($foo){
        return strtolower($foo);
    }
}

$foo = new foo();
$f = get_method_closure($foo,'bar');
echo $f("BAR");//Prints 'bar'
?>


Étendre la classe

Si vous voulez créer une version spéciale de la classe interne (par exemple, pour créer une portion HTML mis en évidence lors de l'export, pour avoir un accès facile aux variables des membres au lieu des variables des méthodes, ou bien pour avoir des méthodes utiles), vous pouvez étendre la classe principale.

Exemple #1 Étendre les classes internes

<?php
/**
 * Mon classe Reflection_Method
 */
class My_Reflection_Method extends ReflectionMethod
{
    public $visibility = array();

    public function __construct($o, $m)
    {
        parent::__construct($o, $m);
        $this->visibility = Reflection::getModifierNames($this->getModifiers());
    }
}

/**
 * Demo classe #1
 *
 */
class T {
    protected function x() {}
}

/**
 * Demo classe #2
 *
 */
class U extends T {
    function x() {}
}

// Affichage des informations
var_dump(new My_Reflection_Method('U', 'x'));
?>

Résultat de l'exemple ci-dessus est similaire à :

object(My_Reflection_Method)#1 (3) {
  ["visibility"]=>
  array(1) {
    [0]=>
    string(6) "public"
  }
  ["name"]=>
  string(1) "x"
  ["class"]=>
  string(1) "U"
}
Attention

Si vous écrasez le constructeur, souvenez-vous d'appeler le constructeur parent avant d'insérer le moindre code. Si vous ne le faîtes pas, voici ce qui arrivera : Fatal error: Internal error: Failed to retrieve the reflection object

User Contributed Notes

khelaz at gmail dot com 28-Apr-2011 11:12
Extending class ReflectionFunction to get source code of function

<?php
class Custom_Reflection_Function extends ReflectionFunction {

    public function getSource() {
        if( !file_exists( $this->getFileName() ) ) return false;

        $start_offset = ( $this->getStartLine() - 1 );
        $end_offset   = ( $this->getEndLine() - $this->getStartLine() ) + 1;

        return join( '', array_slice( file( $this->getFileName() ), $start_offset, $end_offset ) );
    }
}
?>


La classe Reflection

(PHP 5, PHP 7)

Introduction

La classe Reflection.

Synopsis de la classe

Reflection {
/* Méthodes */
public static export ( Reflector $reflector , bool $return = false ) : string
public static getModifierNames ( int $modifiers ) : array
}

Sommaire

  • Reflection::export — Exporte
  • Reflection::getModifierNames — Récupère les nom des modificateurs

User Contributed Notes

apmithani at yahoo dot com 26-Aug-2010 09:05
Here is a code snippet for some of us who are just beginning with reflection. I have a simple class below with two properties and two methods. We will use reflection classes to populate the properties dynamically and then print them:

<?php

class A
{
    public $one = '';
    public $two = '';

    //Constructor
    public function __construct()
    {
        //Constructor
    }

    //print variable one
    public function echoOne()
    {
        echo $this->one."\n";
    }

    //print variable two
    public function echoTwo()
    {
        echo $this->two."\n";
    }
}

//Instantiate the object
$a = new A();

//Instantiate the reflection object
$reflector = new ReflectionClass('A');

//Now get all the properties from class A in to $properties array
$properties = $reflector->getProperties();

$i =1;
//Now go through the $properties array and populate each property
foreach($properties as $property)
{
    //Populating properties
    $a->{$property->getName()}=$i;
    //Invoking the method to print what was populated
    $a->{"echo".ucfirst($property->getName())}()."\n";

    $i++;
}

?>


Exporte

  • « Reflection
  • Reflection::getModifierNames »
  • PHP Manual
  • Reflection
  • Exporte

Reflection::export

(PHP 5, PHP 7)

Reflection::export — Exporte

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 7.4.0. Dépendre de cette fonction est fortement déconseillé.

Description

public static Reflection::export ( Reflector $reflector , bool $return = false ) : string

Exporte une rélection.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

reflector

La réflection à exporter.

return

Le fait de le définir à true retournera l'export plutôt que l'émission. Le définir à false (par défaut) fera l'inverse.

Valeurs de retour

Si le paramètre return est défini à true, l'export sera retourné sous la forme d'une chaîne de caractères, sinon, null sera retourné.

Voir aussi

  • Reflection::getModifierNames() - Récupère les nom des modificateurs

User Contributed Notes

There are no user contributed notes for this page.


Récupère les nom des modificateurs

  • « Reflection::export
  • ReflectionClass »
  • PHP Manual
  • Reflection
  • Récupère les nom des modificateurs

Reflection::getModifierNames

(PHP 5, PHP 7)

Reflection::getModifierNames — Récupère les nom des modificateurs

Description

public static Reflection::getModifierNames ( int $modifiers ) : array

Récupère les nom des modificateurs.

Liste de paramètres

modifiers

Champs bit (bitfield) des modificateurs à récupérer.

Valeurs de retour

Un tableau des noms de modificateurs.

Exemples

Exemple #1 Exemple Reflection::getModifierNames()

<?php
class Testing
{
    final public static function foo()
    {
        return;
    }

    public function bar()
    {
        return;
    }
}

$foo = new ReflectionMethod('Testing', 'foo');

echo "Modifiers for method foo():\n";
echo $foo->getModifiers() . "\n";
echo implode(' ', Reflection::getModifierNames($foo->getModifiers())) . "\n";

$bar = new ReflectionMethod('Testing', 'bar');

echo "Modifiers for method bar():\n";
echo $bar->getModifiers() . "\n";
echo implode(' ', Reflection::getModifierNames($bar->getModifiers()));

Résultat de l'exemple ci-dessus est similaire à :

Modifiers for method foo():
261
final public static
Modifiers for method bar():
65792
public

Voir aussi

  • ReflectionClass::getModifiers() - Récupère les modificateurs de classe
  • ReflectionClassConstant::getModifiers() - Récupère les modificateurs de la constante de classe
  • ReflectionMethod::getModifiers() - Récupère les modificateurs de la méthode
  • ReflectionProperty::getModifiers() - Récupère les modificateurs de propriété

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionClass

(PHP 5, PHP 7)

Introduction

La classe ReflectionClass rapporte des informations sur une classe.

Synopsis de la classe

ReflectionClass implements Reflector {
/* Constantes */
const int IS_IMPLICIT_ABSTRACT = 16 ;
const int IS_EXPLICIT_ABSTRACT = 32 ;
const int IS_FINAL = 64 ;
/* Propriétés */
public $name ;
/* Méthodes */
public __construct ( object|string $objectOrClass )
public static export ( mixed $argument , bool $return = false ) : string
public getConstant ( string $name ) : mixed
public getConstants ( int|null $filter = null ) : array
public getConstructor ( ) : ReflectionMethod|null
public getDefaultProperties ( ) : array
public getDocComment ( ) : string|false
public getEndLine ( ) : int|false
public getExtension ( ) : ReflectionExtension|null
public getExtensionName ( ) : string|false
public getFileName ( ) : string|false
public getInterfaceNames ( ) : array
public getInterfaces ( ) : array
public getMethod ( string $name ) : ReflectionMethod
public getMethods ( int|null $filter = null ) : array
public getModifiers ( ) : int
public getName ( ) : string
public getNamespaceName ( ) : string
public getParentClass ( ) : ReflectionClass|false
public getProperties ( int|null $filter = null ) : array
public getProperty ( string $name ) : ReflectionProperty
public getReflectionConstant ( string $name ) : ReflectionClassConstant|false
public getReflectionConstants ( int|null $filter = null ) : array
public getShortName ( ) : string
public getStartLine ( ) : int|false
public getStaticProperties ( ) : array|null
public getStaticPropertyValue ( string $name , mixed &$def_value = ? ) : mixed
public getTraitAliases ( ) : array
public getTraitNames ( ) : array
public getTraits ( ) : array
public hasConstant ( string $name ) : bool
public hasMethod ( string $name ) : bool
public hasProperty ( string $name ) : bool
public implementsInterface ( ReflectionClass|string $interface ) : bool
public inNamespace ( ) : bool
public isAbstract ( ) : bool
public isAnonymous ( ) : bool
public isCloneable ( ) : bool
public isFinal ( ) : bool
public isInstance ( object $object ) : bool
public isInstantiable ( ) : bool
public isInterface ( ) : bool
public isInternal ( ) : bool
public isIterable ( ) : bool
public isSubclassOf ( ReflectionClass|string $class ) : bool
public isTrait ( ) : bool
public isUserDefined ( ) : bool
public newInstance ( mixed ...$args ) : object
public newInstanceArgs ( array $args = [] ) : object
public newInstanceWithoutConstructor ( ) : object
public setStaticPropertyValue ( string $name , mixed $value ) : void
public __toString ( ) : string
}

Propriétés

name

Nom de la classe. En lecture seule, émets ReflectionException lors d'une tentative d'écriture.

Constantes pré-définies

Modificateurs de ReflectionClass

ReflectionClass::IS_IMPLICIT_ABSTRACT

Indique si la classe est abstraite en raison du fait qu'elle contient quelques méthodes abstraites.

ReflectionClass::IS_EXPLICIT_ABSTRACT

Indique si la classe est abstraite en raison de sa définition.

ReflectionClass::IS_FINAL

Indique si la classe est finale.

Sommaire

  • ReflectionClass::__construct — Construit une ReflectionClass
  • ReflectionClass::export — Exporte une classe
  • ReflectionClass::getConstant — Récupère une constante
  • ReflectionClass::getConstants — Récupère les constantes
  • ReflectionClass::getConstructor — Récupère le constructeur d'une classe
  • ReflectionClass::getDefaultProperties — Récupère les propriétés par défaut
  • ReflectionClass::getDocComment — Récupère les commentaires de documentation
  • ReflectionClass::getEndLine — Récupère la fin d'une ligne
  • ReflectionClass::getExtension — Récupère un objet ReflectionExtension pour l'extension qui définit la classe
  • ReflectionClass::getExtensionName — Récupère le nom de l'extension qui définit la classe
  • ReflectionClass::getFileName — Récupère le nom du fichier où la classe a été déclaré
  • ReflectionClass::getInterfaceNames — Récupère les noms des interfaces
  • ReflectionClass::getInterfaces — Récupère les interfaces
  • ReflectionClass::getMethod — Récupère un ReflectionMethod pour une méthode de classe
  • ReflectionClass::getMethods — Récupère un tableau des méthodes
  • ReflectionClass::getModifiers — Récupère les modificateurs de classe
  • ReflectionClass::getName — Récupère le nom de la classe
  • ReflectionClass::getNamespaceName — Récupère l'espace de noms
  • ReflectionClass::getParentClass — Récupère la classe parente
  • ReflectionClass::getProperties — Récupère les propriétés
  • ReflectionClass::getProperty — Récupère une ReflectionProperty pour une propriété d'une classe
  • ReflectionClass::getReflectionConstant — Récupère un ReflectionClassConstant pour une constante d'une classe
  • ReflectionClass::getReflectionConstants — Récupère les constantes de classe
  • ReflectionClass::getShortName — Récupère le nom court d'une classe
  • ReflectionClass::getStartLine — Récupère le numéro de ligne de départ
  • ReflectionClass::getStaticProperties — Récupère les propriétés statiques
  • ReflectionClass::getStaticPropertyValue — Récupère la valeur d'une propriété statique
  • ReflectionClass::getTraitAliases — Retourne un tableau des alias du trait
  • ReflectionClass::getTraitNames — Retourne un tableau de noms des traits utilisés par cette classe
  • ReflectionClass::getTraits — Retourne un tableau des traits utilisés par cette classe
  • ReflectionClass::hasConstant — Vérifie si une constante est définie
  • ReflectionClass::hasMethod — Vérifie si une méthode est définie
  • ReflectionClass::hasProperty — Vérifie si une propriété est définie
  • ReflectionClass::implementsInterface — Vérifie si une classe implémente une interface
  • ReflectionClass::inNamespace — Vérifie si une classe est définie dans un espace de noms
  • ReflectionClass::isAbstract — Vérifie si une classe est abstraite
  • ReflectionClass::isAnonymous — Vérifie si la classe est anonyme
  • ReflectionClass::isCloneable — Renseigne à propos de la propriété de duplication de la classe
  • ReflectionClass::isFinal — Vérifie si une classe est finale
  • ReflectionClass::isInstance — Vérifie si une classe est une instance d'une autre classe
  • ReflectionClass::isInstantiable — Vérifie si une classe est instanciable
  • ReflectionClass::isInterface — Vérifie si une classe est une interface
  • ReflectionClass::isInternal — Vérifie si une classe est définie comme interne par une extension
  • ReflectionClass::isIterable — Vérifie si cette classe est itérable
  • ReflectionClass::isIterateable — Alias de ReflectionClass::isIterable
  • ReflectionClass::isSubclassOf — Vérifie si la classe est une sous-classe
  • ReflectionClass::isTrait — Renseigne s'il s'agit d'un trait
  • ReflectionClass::isUserDefined — Vérifie si une classe a été définie dans l'espace utilisateur
  • ReflectionClass::newInstance — Créer une nouvelle instance de la classe en utilisant les arguments fournis
  • ReflectionClass::newInstanceArgs — Créer une nouvelle instance en utilisant les arguments fournis
  • ReflectionClass::newInstanceWithoutConstructor — Crée une nouvelle instance de la classe sans invoquer le constructeur
  • ReflectionClass::setStaticPropertyValue — Définit la valeur d'une propriété statiques
  • ReflectionClass::__toString — Crée une représentation textuelle de l'objet

User Contributed Notes

featherbits 27-Jan-2021 04:10
In order to get class attributes look here (php8)
https://www.php.net/manual/en/language.attributes.reflection.php
YoungOfCthulhu 21-Sep-2015 02:20
It is also possible to do reflection from within the class and get the methods for instance.

<?php

class test
{
    private $test = "";

    public function setTest($test)
    {
        $this->test = $test;
        return $this;
    }

    public function getTest()
    {
        return $this->test;
    }

    public function run(){
        $class = new ReflectionClass('test');
        $methods = $class->getMethods();
        var_dump($methods);
    }
}

Called from another php file you get the proper result:
array(3) {
  [0]=>
  &object(ReflectionMethod)#3 (2) {
    ["name"]=>
    string(8) "setTest"
    ["class"]=>
    string(4) "test"
  }
  [1]=>
  &object(ReflectionMethod)#4 (2) {
    ["name"]=>
    string(8) "getTest"
    ["class"]=>
    string(4) "test"
  }
  [2]=>
  &object(ReflectionMethod)#5 (2) {
    ["name"]=>
    string(3) "run"
    ["class"]=>
    string(4) "test"
  }
}
Anonymous 17-May-2013 06:45
Reflecting an alias will give you a reflection of the resolved class.

<?php

class X {

}

class_alias('X','Y');
class_alias('Y','Z');
$z = new ReflectionClass('Z');
echo $z->getName(); // X

?>
Anonymous 11-Nov-2011 09:58
Unserialized reflection class cause error.

<?php
/**
 * abc
 */
class a{}

$ref = new ReflectionClass('a');
$ref = unserialize(serialize($ref));
var_dump($ref);
var_dump($ref->getDocComment());

// object(ReflectionClass)#2 (1) {
//   ["name"]=>
//   string(1) "a"
// }
// PHP Fatal error:  ReflectionClass::getDocComment(): Internal error: Failed to retrieve the reflection object
?>
danbettles at yahoo dot co dot uk 29-Mar-2009 02:48
To reflect on a namespaced class in PHP 5.3, you must always specify the fully qualified name of the class - even if you've aliased the containing namespace using a "use" statement.

So instead of:

<?php
use App\Core as Core;
$oReflectionClass = new ReflectionClass('Core\Singleton');
?>

You would type:

<?php
use App\Core as Core;
$oReflectionClass = new ReflectionClass('App\Core\Singleton');
?>


Construit une ReflectionClass

  • « ReflectionClass
  • ReflectionClass::export »
  • PHP Manual
  • ReflectionClass
  • Construit une ReflectionClass

ReflectionClass::__construct

(PHP 5, PHP 7)

ReflectionClass::__construct — Construit une ReflectionClass

Description

public ReflectionClass::__construct ( object|string $objectOrClass )

Construit un nouvel objet ReflectionClass.

Liste de paramètres

objectOrClass

Soit une chaîne de caractères contenant le nom de la classe à refléter, ou un objet.

Valeurs de retour

Retourne une instance contruite de ReflectionClass.

Erreurs / Exceptions

Lance une ReflectionException si la classe à refléter n'existe pas.

Exemples

Exemple #1 Utilisation simple de ReflectionClass

<?php
Reflection::export(new ReflectionClass('Exception'));
?>

Résultat de l'exemple ci-dessus est similaire à :

Class [ <internal:Core> class Exception ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [7] {
    Property [ <default> protected $message ]
    Property [ <default> private $string ]
    Property [ <default> protected $code ]
    Property [ <default> protected $file ]
    Property [ <default> protected $line ]
    Property [ <default> private $trace ]
    Property [ <default> private $previous ]
  }

  - Methods [10] {
    Method [ <internal:Core> final private method __clone ] {
    }

    Method [ <internal:Core, ctor> public method __construct ] {

      - Parameters [3] {
        Parameter #0 [ <optional> $message ]
        Parameter #1 [ <optional> $code ]
        Parameter #2 [ <optional> $previous ]
      }
    }

    Method [ <internal:Core> final public method getMessage ] {
    }

    Method [ <internal:Core> final public method getCode ] {
    }

    Method [ <internal:Core> final public method getFile ] {
    }

    Method [ <internal:Core> final public method getLine ] {
    }

    Method [ <internal:Core> final public method getTrace ] {
    }

    Method [ <internal:Core> final public method getPrevious ] {
    }

    Method [ <internal:Core> final public method getTraceAsString ] {
    }

    Method [ <internal:Core> public method __toString ] {
    }
  }
}

Voir aussi

  • ReflectionObject::__construct() - Construit un nouvel objet ReflectionObject
  • Les constructeurs

User Contributed Notes

danbettles at yahoo dot co dot uk 22-May-2015 06:47
To reflect on a namespaced class in PHP 5.3, you must always specify the fully qualified name of the class - even if you've aliased the containing namespace using a "use" statement.

So instead of:

<?php
use App\Core as Core;
$oReflectionClass = new ReflectionClass('Core\Singleton');
?>

You would type:

<?php
use App\Core as Core;
$oReflectionClass = new ReflectionClass('App\Core\Singleton');
?>
nulled 18-Dec-2013 03:42
if (is_file($classfile))
            require_once $classfile;

if (! class_exists($classname, false))
            exit('ERROR: ' . $classname . ' is not defined as a Class');

The above code is useful to tell if the class was defined.  You could also use another commentors method using Try Catch Exceptions.  But, if you do not use try blocks much, the above function based method works just fine.

From there, you can than call:

$class = new ReflectionClass($classname);

        if (! $class->isSubclassOf('PanelCommon'))
            exit("ERROR: {$classname} must extends PanelCommon");

        if (! $class->isUserDefined())
            exit("ERROR: {$classname} must be user defined and not internal to PHP");

        if (! $class->IsInstantiable())
            exit("ERROR: {$classname} must be IsInstantiable and not an Interface or Abstract class");

        if (! $class->hasMethod('home'))
            exit("ERROR: {$classname} lacks required method/function home()");

Forforth and so on.
me [at] klay [dot] me 28-Oct-2013 11:09
Example of usage:

    public static function getClassData($class)
    {
        // Trying to create a new object of ReflectionClass class
        $class = new ReflectionClass($class);

        $details = sprintf('%s - %s%s%s%s%s%s%s%s',
            $class->getName(),
            $class->isInternal()     ? 'internal class,' : 'user-defined class,',
            $class->isTrait()        ? '  is trait,'  : '',
            $class->isInterface()    ? '  is interface,'  : '',
            $class->isAbstract()     ? '  is abstract,'  : '',
            $class->isFinal()        ? '  is final,'  : '',
            $class->isCloneable()    ? '  is cloneable,'  : '',
            $class->isInstantiable() ? ' is instantiable,'  : '',
            $class->isIterateable()  ? ' is iterable  : ''
        );

        return '<pre class="debug">' . rtrim($details, ',') . '</pre>';
    }
gafisher at griasolutions dot com 30-Jan-2012 01:23
Running the following code on Windows Vista (I know, I know), PHP 5.3.9, the ReflectionClass constructor actually throws a ReflectionException when the desired class cannot be instantiated:

<?php
    try {
        $ReflectedClass = new ReflectionClass('NonExist');
    } catch (LogicException $Exception) {
        die('Not gonna make it in here...');
    } catch (ReflectionException $Exception) {
        die('Your class does not exist!');
    }
?>
cspray at gmail dot com 12-Jun-2011 07:14
Useful to know that if you pass a string into the construct and the class cannot be instantiated for some reason a SPL LogicException will be thrown.

This code was ran on a Mac OS X 10.6.7, AMP, PHP 5.3+

<?php

    //  index.php
    try {
        $ReflectedClass = new ReflectionClass('NonExist');
    } catch (LogicException $logicDuh) {
        print_r($logicDuh);
    }

?>

Will return a deeply nested array full of useful information about the error.
ivo at jansch dot nl 24-Jan-2010 04:16
It's very useful to know that you can also use the ReflectionClass to inspect interfaces, even thouth Interfaces are not classes. Example:

<?php

  interface Edible
  {
    public function eat();
  }

  $refl = new ReflectionClass("Edible");
  $methods = $refl->getMethods();
?>

[Edit by danbrown AT php DOT net - Contains a bugfix by (dbl AT bnet DOT com) on 18-AUG-2010 with the following message: "underline had to be removed for it to work ( new Reflection_Class -> new ReflectionClass )"]


Exporte une classe

  • « ReflectionClass::__construct
  • ReflectionClass::getConstant »
  • PHP Manual
  • ReflectionClass
  • Exporte une classe

ReflectionClass::export

(PHP 5, PHP 7)

ReflectionClass::export — Exporte une classe

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 7.4.0. Dépendre de cette fonction est fortement déconseillé.

Description

public static ReflectionClass::export ( mixed $argument , bool $return = false ) : string

Exporte une classe reflétée.

Liste de paramètres

argument

La réflection à exporter.

return

Le fait de le définir à true retournera l'export plutôt que l'émission. Le définir à false (par défaut) fera l'inverse.

Valeurs de retour

Si le paramètre return est défini à true, l'export sera retourné sous la forme d'une chaîne de caractères, sinon, null sera retourné.

Exemples

Exemple #1 Utilisation basique de ReflectionClass::export()

<?php
class Apple {
    public $var1;
    public $var2 = 'Orange';

    public function type() {
        return 'Apple';
    }
}
ReflectionClass::export('Apple');
?>

Résultat de l'exemple ci-dessus est similaire à :

Class [ <user> class Apple ] {
  @@ php shell code 1-8

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [2] {
    Property [ <default> public $var1 ]
    Property [ <default> public $var2 ]
  }

  - Methods [1] {
    Method [ <user> public method type ] {
      @@ php shell code 5 - 7
    }
  }
}

Voir aussi

  • ReflectionClass::getName() - Récupère le nom de la classe
  • ReflectionClass::__toString() - Crée une représentation textuelle de l'objet

User Contributed Notes

There are no user contributed notes for this page.


Récupère une constante

  • « ReflectionClass::export
  • ReflectionClass::getConstants »
  • PHP Manual
  • ReflectionClass
  • Récupère une constante

ReflectionClass::getConstant

(PHP 5, PHP 7)

ReflectionClass::getConstant — Récupère une constante

Description

public ReflectionClass::getConstant ( string $name ) : mixed

Récupère une constante définie.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

name

Le nom de la constante de classe à récupérer.

Valeurs de retour

Valeur de la constante avec le nom name. Retourne false si la constante n'a pas été trouvée dans la classe.

Exemples

Exemple #1 Utilisation de ReflectionClass::getConstant()

<?php

class Example {
    const C1 = false;
    const C2 = 'I am a constant';
}

$reflection = new ReflectionClass('Example');

var_dump($reflection->getConstant('C1'));
var_dump($reflection->getConstant('C2'));
var_dump($reflection->getConstant('C3'));
?>

L'exemple ci-dessus va afficher :

bool(false)
string(15) "I am a constant"
bool(false)

Voir aussi

  • ReflectionClass::getConstants() - Récupère les constantes

User Contributed Notes

aurelien dot tisserand at wavesoftware dot ch 08-Nov-2013 03:27
If the $name constant doesn't exist in the targetted class the function returns bool(false), not empty nor null but false (you to test with "==="

$constFounded = false ;
$this->currentlangClass = new ReflectionClass($langFile);
$this->currentlangClass->getConstant($constant);
if($myConst !== false){
              $constFounded = true ;
}
Bhimsen 31-May-2012 05:46
The "getconstant" method can be used to get the value associated with a constant
of a particular class that you are examining.
The following code snippet shows this:

<?php
    class Test{
        const ONE = "Number one";
        const TWO = "Number two";
    }

    $obj = new ReflectionClass( "Test" );
    echo $obj->getconstant( "ONE" )."\n";
    echo $obj->getconstant( "TWO" )."\n";

?>

output:
Number one
Number two


Récupère les constantes

  • « ReflectionClass::getConstant
  • ReflectionClass::getConstructor »
  • PHP Manual
  • ReflectionClass
  • Récupère les constantes

ReflectionClass::getConstants

(PHP 5, PHP 7)

ReflectionClass::getConstants — Récupère les constantes

Description

public ReflectionClass::getConstants ( int|null $filter = null ) : array

Récupère toutes les constantes définies d'une classe, quelle que soit leur visibilité.

Liste de paramètres

filter

Le filtre optionnel, pour filter les constantes avec la visibilité désiré. C'est configuré en utilisant les constantes ReflectionClassConstant, et par défaut récupère toutes les constantes peut importe la visibilité.

Valeurs de retour

Un tableau de constantes, où les clés détiennent le nom et les valeurs la valeur des constantes.

Historique

Version | Description
8.0.0 | filter a été ajouté.

Voir aussi

  • ReflectionClass::getConstant() - Récupère une constante

User Contributed Notes

dmitrochenkooleg at gmail dot com 05-Apr-2019 10:12
Get the latest constants declared.

abstract class AbstractEnum
{
    /**
     * ?????????? ??? ????????? ?????? || Return all constants
     *
     * @return array
     */
    static function getConstants()
    {
        $rc = new \ReflectionClass(get_called_class());

        return $rc->getConstants();
    }

    /**
     * ?????????? ?????? ???????? ???????????? ? ?????????? ??????  || Return last constants
     *
     * @return array
     */
    static function lastConstants()
    {
        $parentConstants = static::getParentConstants();

        $allConstants = static::getConstants();

        return array_diff($allConstants, $parentConstants);
    }

    /**
     * ?????????? ??? ????????? ???????????? ??????? || Return parent constants
     *
     * @return array
     */
    static function getParentConstants()
    {
        $rc = new \ReflectionClass(get_parent_class(static::class));
        $consts = $rc->getConstants();

        return $consts;
    }
}

======
class Roles extends AbstractEnum
{
    const ROOT = 'root';
    const ADMIN = 'admin';
    const USER = 'user';
}

// Output:
All: root, admin, user
Last: root, admin, user

class NewRoles extends Roles
{
    const CLIENT = 'client';
    const MODERATOR = 'moderator';
    const SUPERMODERATOR = 'super'.self::USER;
}

// Output:
All: client, moderator, superuser, root, admin, user
Last: client, moderator, superuser

class AdditionalRoles extends Roles
{
    const VIEWER = 'viewer';
    const CHECKER = 'checker';
    const ROOT = 'rooter';
}

All: viewer, checker, rooter, client, moderator, superuser, admin, user
Last: viewer, checker, rooter
Panni 17-Nov-2018 09:21
If you want to define a static getConstants() function which works with inheritance you can do the following:

<?php

abstract class AbstractClass
{
    const TEST = "test";

    public static function getConstants()
    {
        // "static::class" here does the magic
        $reflectionClass = new ReflectionClass(static::class);
        return $reflectionClass->getConstants();
    }
}

class ChildClass extends AbstractClass
{
    const TYPE_A = 1;
    const TYPE_B = 'hello';
}

$example = new ChildClass();
var_dump($example->getConstants());

// Result:
array(3) {
  'TYPE_A' => int(1)
  'TYPE_B' => string(5) "hello"
  'TEST' => string(4) "test"
}

?>
Sandor Toth 21-Nov-2016 02:50
You can pass $this as class for the ReflectionClass. __CLASS__ won't help if you extend the original class, because it is a magic constant based on the file itself.

<?php

class Example {
  const TYPE_A = 1;
  const TYPE_B = 'hello';

  public function getConstants()
  {
    $reflectionClass = new ReflectionClass($this);
    return $reflectionClass->getConstants();
  }
}

$example = new Example();
var_dump($example->getConstants());

// Result:
array ( size = 2)
  'TYPE_A' => int 1
  'TYPE_B' => (string) 'hello'
davide dot renzi at gmail dot com 16-Jul-2014 11:21
If you want to return the constants defined inside a class then you can also define an internal method as follows:

<?php
class myClass {
    const NONE = 0;
    const REQUEST = 100;
    const AUTH = 101;

    // others...

    static function getConstants() {
        $oClass = new ReflectionClass(__CLASS__);
        return $oClass->getConstants();
    }
}
?>
shgninc at gmail dot com 20-Nov-2013 10:00
I use a functions to do somthing base on the class constant name as below. This example maybe helpful for everybody.
<?php
public function renderData($question_type = NULL, $data = array()) {
        $types = array();
        $qt = new ReflectionClass(questionType);
        $types = $qt->getConstants();
        if ($type = array_search($question_type, $types)){
                //.....Do somthing
}
}
?>
djhob1972 at yahoo dot com dot au 16-Dec-2009 05:42
I was trying to determine how to get a var_dump of constants that are within an interface.  Thats right, not using any classes but the interface itself.

Along my travels I found it quite interesting that the ReflectionClass along with a direct call to the interface will also dump its constants.  Perfect!!!!

This was using PHP 5.3.1 and my example as below:-

1st File:

constants.php

<?php
<?php>

interface MyConstants
{
    // --------------------------
    // Programmatic Level
    // --------------------------
    const DEBUG_MODE_ACTIVE       = FALSE;
    const PHP_VERSION_REQUIREMENT = "5.1.2";
}
?>

=======
Second file:
=======

test.php

<?php>
include_once ("constants.php");

$oClass = new ReflectionClass ('MyConstants');
$array = $oClass->getConstants ();
var_dump ($array);
unset ($oClass);
?>

what you would get from the command line:-

?:\???\htdocs\????>php test.php
array(2) {
  ["DEBUG_MODE_ACTIVE"]=> bool(false)
  ["PHP_VERSION_REQUIREMENT"]=> string(5) "5.1.2"

But as you can see this can work quite well to your advantage in many ways so I truely hope this helps someone else with a similar headache in the future to come!

Enjoy!


Récupère le constructeur d'une classe

  • « ReflectionClass::getConstants
  • ReflectionClass::getDefaultProperties »
  • PHP Manual
  • ReflectionClass
  • Récupère le constructeur d'une classe

ReflectionClass::getConstructor

(PHP 5, PHP 7)

ReflectionClass::getConstructor — Récupère le constructeur d'une classe

Description

public ReflectionClass::getConstructor ( ) : ReflectionMethod|null

Récupère le constructeur d'une classe.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un objet ReflectionMethod reflétant le constructeur de la classe, ou null si la classe n'a pas de constructeur.

Exemples

Exemple #1 Utilisation simple de ReflectionClass::getConstructor()

<?php
$class = new ReflectionClass('ReflectionClass');
$constructor = $class->getConstructor();
var_dump($constructor);
?>

L'exemple ci-dessus va afficher :

object(ReflectionMethod)#2 (2) {
  ["name"]=>
  string(11) "__construct"
  ["class"]=>
  string(15) "ReflectionClass"
}

Voir aussi

  • ReflectionClass::getName() - Récupère le nom de la classe

User Contributed Notes

martin dot melka at gmail dot com 01-Jul-2019 09:03
This method will return the parent's constructor, if the current class does not override it.

NULL will only be returned when the class has no constructor AND none of its parents have a constructor either.
jochem at drecomm dot nl 13-May-2011 08:13
Old constructors also count as contructor:

<?php

class SomeClass {

    function SomeClass($some_arg) {
    }

}

$refl = new ReflectionClass('SomeClass');

var_dump($refl->isInstantiable()); // bool(true)

echo $refl->getConstructor();

/* OUTPUT:
Method [ <user, ctor> public method SomeClass ] {
  @@ /var/www/vhosts/api.example.com/httpdocs/testRefl.php 5 - 6

  - Parameters [1] {
    Parameter #0 [ <required> $some_arg ]
  }
}
*/

?>

Some more behavior:

<?php

class SomeClass {

   function funcA($arg1, $arg2) {

   }

}

$refl = new ReflectionClass('SomeClass');

var_dump($refl->isInstantiable()); // bool(true)

var_dump($refl->getConstructor()); // NULL

/* --------------- */

class AnotherClass {

   private function __construct() {
   }

   function funcB($arg1, $arg2) {

   }

}

$refl = new ReflectionClass('AnotherClass');

var_dump($refl->isInstantiable()); // bool(false)

echo $refl->getConstructor();
/*
Method [ <user, ctor> private method __construct ] {
  @@ /testRefl.php 22 - 23
}
*/

?>

Tested on PHP 5.2.4
Rob McVey 16-Jul-2010 07:47
Just posting some example code for anyone wanting to mess around with this stuff:

<?php

class Say
{
    private $what_to_say;
    public function __construct($no_default, $word = "Hello World", $options = array('a', 'b'))
    {
        $this->what_to_say = $word;
    }

    public function speak()
    {
        echo $this->what_to_say;
    }
}

$class = new ReflectionClass('Say');

$constructor = $class->getConstructor();

echo $constructor;

/*     OUTPUTS:

Method [ <user, ctor> public method __construct ] {
  @@ /reflect.php 6 - 9

  - Parameters [3] {
    Parameter #0 [ <required> $no_default ]
    Parameter #1 [ <optional> $word = 'Hello World' ]
    Parameter #2 [ <optional> $options = Array ]
  }
}

*/

$parameters = $constructor->getParameters();

var_export($parameters);

/*    OUTPUT:

array (
  0 =>
  ReflectionParameter::__set_state(array(
     'name' => 'no_default',
  )),
  1 =>
  ReflectionParameter::__set_state(array(
     'name' => 'word',
  )),
  2 =>
  ReflectionParameter::__set_state(array(
     'name' => 'options',
  )),
)

*/

$nl = "\n";
echo "$nl\tParameters$nl";
foreach($parameters as $param)
{
    echo "****** $" . $param->name . " ******$nl";
    echo "Nullable:\t\t" . $param->allowsNull() . $nl
         ."Default Value:\t\t";
    echo ($param->isDefaultValueAvailable()) ? $param->getDefaultValue() : "None";
    echo $nl ."Is Array:\t\t";
    echo ($param->isArray()) ? "Yes" : "No";
    echo $nl . "Optional:\t\t";
    echo ($param->isOptional()) ? "Yes" : "No";
    echo $nl;
}

/*    OUTPUT:

    Parameters
****** $no_default ******
Nullable:        1
Default Value:    None
Is Array:        No
Optional:        No
****** $word ******
Nullable:        1
Default Value:    Hello World
Is Array:        No
Optional:        Yes
****** $options ******
Nullable:        1
Default Value:    Array
Is Array:        No
Optional:        Yes

*/

?>

To clarify the possibly confusing behavior of ReflectionParemeter::isArray(), it will return true if the parameter has type hinting:

<?php
...
public function __construct($no_default, $word = "Hello World", array $options = array('a', 'b'))
...
?>

Calling isArray() will now return true for the $options parameter


Récupère les propriétés par défaut

  • « ReflectionClass::getConstructor
  • ReflectionClass::getDocComment »
  • PHP Manual
  • ReflectionClass
  • Récupère les propriétés par défaut

ReflectionClass::getDefaultProperties

(PHP 5, PHP 7)

ReflectionClass::getDefaultProperties — Récupère les propriétés par défaut

Description

public ReflectionClass::getDefaultProperties ( ) : array

Récupère les propriétés par défaut d'une classe (incluant les propriétés héritées).

Note:

Cette méthode fonctionne uniquement pour les propriétés statiques lorsqu'utilisées sur des classes internes. La valeur par défaut d'une propriété de classe statique ne peut pas être surveillée lors de l'utilisation de cette méthode sur des classes définies par l'utilisateur.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un tableau des propriétés par défaut dont la clé est le nom de la propriété et la valeur est la valeur par défaut de la propriété ou null si la propriété n'a pas de valeur par défaut. La fonction ne fait pas la distinction entre les propriétés statiques et non statiques et ne prend pas en compte la visibilité.

Exemples

Exemple #1 Exemple avec ReflectionClass::getDefaultProperties()

<?php
class Bar {
    protected $inheritedProperty = 'inheritedDefault';
}

class Foo extends Bar {
    public $property = 'propertyDefault';
    private $privateProperty = 'privatePropertyDefault';
    public static $staticProperty = 'staticProperty';
    public $defaultlessProperty;
}

$reflectionClass = new ReflectionClass('Foo');
var_dump($reflectionClass->getDefaultProperties());
?>

L'exemple ci-dessus va afficher :

array(5) {
   ["staticProperty"]=>
   string(14) "staticProperty"
   ["property"]=>
   string(15) "propertyDefault"
   ["privateProperty"]=>
   string(22) "privatePropertyDefault"
   ["defaultlessProperty"]=>
   NULL
   ["inheritedProperty"]=>
   string(16) "inheritedDefault"
}

Voir aussi

  • ReflectionClass::getProperties() - Récupère les propriétés
  • ReflectionClass::getStaticProperties() - Récupère les propriétés statiques
  • ReflectionClass::getProperty() - Récupère une ReflectionProperty pour une propriété d'une classe

User Contributed Notes

articice at ua dot fm 17-Mar-2016 12:15
runaurufu is not quite right, get_class_vars() does not return protected params, while this one does.

Thus it's extremely useful when having an abstract parent class and protected properties overriding in children.
For example, I use a class factory and one of the children has some static test methods that still need to output a paramether name, like $this->name, etc. With this example code, one can use static::getNotStaticProperty('name'), but not get_class_vars('name').

Try it:

trait static_reflector {
    /*
     * a purely static function that returns default properties of the non-static instance of the same class
     */
    static protected function getNonStaticProperty($key) {
        $me = get_class();
        $reflectionClass = new \ReflectionClass($me);
        $properties_list = $reflectionClass->getDefaultProperties();
        if (isset($properties_list[$key]))
            return $var_name = $properties_list[$key];
        else throw new RuntimeException("BUG: Unable to reflect non-static property '{$key}' from default properties of class {$me}");
    }
}

class a {

    use \static_reflector;

    protected $key_a = 'test ok';

    public static function test() {
        echo static::getNonStaticProperty('key_a')."\n";

        try {
            print static::getNonStaticProperty('key_b');
            echo "FAIL No exception thrown";
        } catch (RuntimeException $e) {
            echo "OK ".$e->getMessage();
        }

    }
}

echo get_class_vars('a')['key_a'];
a::test();

this will return:
Notice: Undefined index: key_a in ...
test ok
OK BUG: Unable to reflect non-static property 'key_b' from default properties of class a

ps: Yes, this is copied from a unit test.
runaurufu AT gmail.com 04-Aug-2011 01:02
Worth noting that it will not return private parameters of parent class...
so it works exactly as get_class_vars or get_object_vars
captainjester at hotmail dot com 20-Jan-2010 03:20
This will return all properties in a class and any parent classes.  The array will have keys set to the property names and empty values.


Récupère les commentaires de documentation

  • « ReflectionClass::getDefaultProperties
  • ReflectionClass::getEndLine »
  • PHP Manual
  • ReflectionClass
  • Récupère les commentaires de documentation

ReflectionClass::getDocComment

(PHP 5, PHP 7)

ReflectionClass::getDocComment — Récupère les commentaires de documentation

Description

public ReflectionClass::getDocComment ( ) : string|false

Récupère les commentaires de documentation depuis une classe. Les commentaires de documentation commencent avec /**. S'il y a plusieurs commentaires de documentation au-dessus de la définition de la classe, celle qui est la plus proche de la classe sera prise.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le commentaire de documentation, s'il existe, false sinon.

Exemples

Exemple #1 Exemple avec ReflectionClass::getDocComment()

<?php
/**
* Une classe de test
*
* @param  foo bar
* @return baz
*/
class TestClass { }

$rc = new ReflectionClass('TestClass');
var_dump($rc->getDocComment())
?>

L'exemple ci-dessus va afficher :

string(55) "/**
* Une classe de test
*
* @param  foo bar
* @return baz
*/"

Voir aussi

  • ReflectionClass::getName() - Récupère le nom de la classe

User Contributed Notes

bohwaz 15-Feb-2019 10:41
Please note that doc comments are handled differently than regular comments by PHP and the OpCache.

Doc comments are actually kept by the OpCache and accessible by this reflection API, unless disabled by the "opcache.save_comments" INI directive, see http://php.net/manual/en/opcache.configuration.php#ini.opcache.save-comments
i at hyurl dot com 23-Jul-2017 04:35
Not only this method can find a document by a given method name of a class, like this
 <?php
class Foo{
    /**
     * something describes this method
     */
    function bar(){
        /** code here... */
    }
}
$ref = new ReflectionClass('Foo');
print_r($ref->getMethod('bar')->getDocComment()); //will print out the method document as expected.
?>
But, also, if there is no method document in the defination, and the class extends from some other class, the program will automatically
try to find document from the parent class., like this:
<?php
class Foo2 extends Foo{}

$ref = new ReflectionClass('Foo');
print_r($ref->getMethod('bar')->getDocComment()); //will print out the method document as expected.
?>
geoffreybans at gmail dot com 07-Jan-2016 02:15
This code can help you get the contents of a docBlock in array format beginning with the @symbol and ignoring the (*) asterists.

class Home {

    /**
     *This method loads the homepage
     *@param int $id The user id
     *@throws \Exception If the user id doesn't exist
     *@return void
     */
    public function index( $id)
    {

         #...your code here

      }

}

$object = new Home();

//get the comment string
$comment_string= (new ReflectionClass($object))->getMethod('index')->getdoccomment();

//define the regular expression pattern to use for string matching
$pattern = "#(@[a-zA-Z]+\s*[a-zA-Z0-9, ()_].*)#";

//perform the regular expression on the string provided
preg_match_all($pattern, $comment_string, $matches, PREG_PATTERN_ORDER);

echo "<pre>"; print_r($matches);

//this outputs
Array
(
    [0] => Array
        (
            [0] => @param int $id The user id
            [1] => @throws \Exception If the user id doesn't exist
            [2] => @return void
        )

    [1] => Array
        (
            [0] => @param int $id The user id
            [1] => @throws \Exception If the user id doesn't exist
            [2] => @return void
        )

)

//you can then be able to access the particular string values by index
gabe at fijiwebdesign dot com 23-Aug-2014 11:46
You can also get the docblock definitions for the defined methods of a class as such:

<?php
/**
 * This is an Example class
 */
class Example
{
    /**
     * This is an example function
     */
    public function fn()
    {
        // void
    }
}

$reflector = new ReflectionClass('Example');

// to get the Class DocBlock
echo $reflector->getDocComment()

// to get the Method DocBlock
$reflector->getMethod('fn')->getDocComment();

?>
sun 28-Jun-2014 02:11
Note that \ReflectionClass::getDocComment() ignores all other PHP code and all white-space between the last encountered T_DOC_COMMENT and the class/element definition.

The only exceptions appear to be T_NAMESPACE declarations and T_FUNCTION definitions.

<?php
/**
 * Before namespace.
 */
namespace Foo;

 /**
 * After namespace.
   */

// ^^ contains excessive leading + trailing white-space.
use Bar\Baz;
const FOO = 'BAR';
$ns = 'bar';
# function foo() {}
$a = 2 + 1;
#/** what? */
// ^^ A single-line T_DOC_COMMENT is invisible when commented out.
count(array());

class Foo {
}

$reflector = new \ReflectionClass('Foo\Foo');
var_dump($reflector->getDocComment());
?>
yields, despite all the garbage in between:

string(28) "/**
 * After namespace.
   */"

To sum up:

1. If there are multiple doc comments, the last encountered applies.

2. Removing the "After namespace." docblock yields FALSE.
   (The namespace delimits the scope.)

3. Uncommenting the function definition yields FALSE.
   (The doc comment applies to the function instead.)

4. Despite being an own language construct, the "const" constant declaration does not delimit the scope.

5. Any leading and trailing white-space before and after the T_DOC_COMMENT ("/**...*/") is ignored, but the entire string content within (including all white-space) is consumed literally/verbatim.

[PHP 5.4.29]
uramihsayibok, gmail, com 15-Sep-2010 09:50
According to what I can find in the PHP (5.3.2) source code, getDocComment will return the doc comment as the parser found it.
The doc comment (T_DOC_COMMENT) must begin with a /** - that's two asterisks, not one. The comment continues until the first */. A normal multi-line comment /*...*/ (T_COMMENT) does not count as a doc comment.

The doc comment itself includes those five characters, so <?php substr($doccomment, 3, -2) ?> will get you what's inside. A call to trim() after is recommended.
joe dot scylla at gmail dot com 14-Oct-2009 08:23
If you're using a bytecode cache like eAccelerator this method will return FALSE even if there is a properly formatted Docblock. It looks like the information required by this method gets stripped out by the bytecode cache.


Récupère la fin d'une ligne

  • « ReflectionClass::getDocComment
  • ReflectionClass::getExtension »
  • PHP Manual
  • ReflectionClass
  • Récupère la fin d'une ligne

ReflectionClass::getEndLine

(PHP 5, PHP 7)

ReflectionClass::getEndLine — Récupère la fin d'une ligne

Description

public ReflectionClass::getEndLine ( ) : int|false

Récupère le numéro de la dernière ligne depuis une définition de classe, définie par l'utilisateur.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le numéro de la dernière ligne depuis une définition de classe, définie par l'utilisateur, ou false s'il est inconnu.

Exemples

Exemple #1 Exemple avec ReflectionClass::getEndLine()

<?php
// Classe de test
class TestClass { }

$rc = new ReflectionClass('TestClass');

echo $rc->getEndLine();
?>

L'exemple ci-dessus va afficher :

3

Voir aussi

  • ReflectionClass::getStartLine() - Récupère le numéro de ligne de départ

User Contributed Notes

There are no user contributed notes for this page.


Récupère un objet ReflectionExtension pour l'extension qui définit la classe

  • « ReflectionClass::getEndLine
  • ReflectionClass::getExtensionName »
  • PHP Manual
  • ReflectionClass
  • Récupère un objet ReflectionExtension pour l'extension qui définit la classe

ReflectionClass::getExtension

(PHP 5, PHP 7)

ReflectionClass::getExtension — Récupère un objet ReflectionExtension pour l'extension qui définit la classe

Description

public ReflectionClass::getExtension ( ) : ReflectionExtension|null

Récupère un objet ReflectionExtension pour l'extension qui définit la classe.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un objet ReflectionExtension représentant l'extension qui définit la classe, ou null pour les classes définies par l'utilisateur.

Exemples

Exemple #1 Utilisation simple de ReflectionClass::getExtension()

<?php
$class = new ReflectionClass('ReflectionClass');
$extension = $class->getExtension();
var_dump($extension);
?>

L'exemple ci-dessus va afficher :

object(ReflectionExtension)#2 (1) {
  ["name"]=>
  string(10) "Reflection"
}

Voir aussi

  • ReflectionClass::getExtensionName() - Récupère le nom de l'extension qui définit la classe

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom de l'extension qui définit la classe

  • « ReflectionClass::getExtension
  • ReflectionClass::getFileName »
  • PHP Manual
  • ReflectionClass
  • Récupère le nom de l'extension qui définit la classe

ReflectionClass::getExtensionName

(PHP 5, PHP 7)

ReflectionClass::getExtensionName — Récupère le nom de l'extension qui définit la classe

Description

public ReflectionClass::getExtensionName ( ) : string|false

Récupère le nom de l'extension qui définit la classe.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le nom de l'extension qui définit la classe, ou false pour les classes définies par l'utilisateur.

Exemples

Exemple #1 Utilisation simple de ReflectionClass::getExtensionName()

<?php
$class = new ReflectionClass('ReflectionClass');
$extension = $class->getExtensionName();
var_dump($extension);
?>

L'exemple ci-dessus va afficher :

string(10) "Reflection"

Voir aussi

  • ReflectionClass::getExtension() - Récupère un objet ReflectionExtension pour l'extension qui définit la classe

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom du fichier où la classe a été déclaré

  • « ReflectionClass::getExtensionName
  • ReflectionClass::getInterfaceNames »
  • PHP Manual
  • ReflectionClass
  • Récupère le nom du fichier où la classe a été déclaré

ReflectionClass::getFileName

(PHP 5, PHP 7)

ReflectionClass::getFileName — Récupère le nom du fichier où la classe a été déclaré

Description

public ReflectionClass::getFileName ( ) : string|false

Récupère le nom du fichier où la classe a été déclaré.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Récupère le nom du fichier où la classe a été déclaré. Si la classe est déclarée dans le cœur de PHP ou dans une extension PHP, false est retourné.

Voir aussi

  • ReflectionClass::getExtensionName() - Récupère le nom de l'extension qui définit la classe

User Contributed Notes

robot at znframework dot com 25-Nov-2017 06:47
<?php

$a = new \ReflectionClass('ZN\Database\InternalDB');

var_dump($a->getFileName());

// Output:  C:\xampp7\htdocs\develop\Internal\Database\DB\InternalDB.php


Récupère les noms des interfaces

  • « ReflectionClass::getFileName
  • ReflectionClass::getInterfaces »
  • PHP Manual
  • ReflectionClass
  • Récupère les noms des interfaces

ReflectionClass::getInterfaceNames

(PHP 5 >= 5.2.0, PHP 7)

ReflectionClass::getInterfaceNames — Récupère les noms des interfaces

Description

public ReflectionClass::getInterfaceNames ( ) : array

Récupère les noms des interfaces.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un tableau numérique dont les valeurs sont les noms des interfaces.

Exemples

Exemple #1 Exemple avec ReflectionClass::getInterfaceNames()

<?php
interface Foo { }

interface Bar { }

class Baz implements Foo, Bar { }

$rc1 = new ReflectionClass("Baz");

print_r($rc1->getInterfaceNames());
?>

Résultat de l'exemple ci-dessus est similaire à :

Array
(
    [0] => Foo
    [1] => Bar
)

Voir aussi

  • ReflectionClass::getInterfaces() - Récupère les interfaces

User Contributed Notes

pvdhurk 23-Jul-2020 12:43
For the record, it will return the full name (not the short name) for each Interface

Example with namespace would've helped.
pinpin 27-Mar-2011 04:11
It seems the interface names are actually listed in a defined order:
- "extends" takes precedence over "implements" (i.e. first will be interfaces from (implemented in) the parent class (if any), then interfaces implemented in the class itself)
- when multiple interfaces are implemented at one time/level, it can be:
+ from an "implements" : they're listed in the defined order
+ from an "extends" (a class extends another class which implements multiple interfaces; or an interface extends multiple interfaces) : they're listed in REVERSE order

<?php
interface Foo {}
interface Bar {}
interface Other {}
interface Foobar extends Foo, Bar {}
interface Barfoo extends Bar, Foo {}

class Test1 implements Foo, Bar {}
class Test2 implements Bar, Foo {}

class Test3 extends Test1 {}
class Test4 extends Test2 {}

class Test5 extends Test1 implements Other {}

class Test6 implements Foobar, Other {}
class TestO implements Other {}
class Test7 extends TestO implements Barfoo {}

$r=new ReflectionClass('Test1');
print_r($r->getInterfaceNames()); // Foo, Bar

$r=new ReflectionClass('Test2');
print_r($r->getInterfaceNames()); // Bar, Foo

$r=new ReflectionClass('Test3');
print_r($r->getInterfaceNames()); // Bar, Foo

$r=new ReflectionClass('Test4');
print_r($r->getInterfaceNames()); // Foo, Bar

$r=new ReflectionClass('Test5');
print_r($r->getInterfaceNames()); // Bar, Foo, Other

$r=new ReflectionClass('Test6');
print_r($r->getInterfaceNames()); // Foobar, Bar, Foo, Other

$r=new ReflectionClass('Test7');
print_r($r->getInterfaceNames()); // Other, Barfoo, Foo, Bar
?>


Récupère les interfaces

  • « ReflectionClass::getInterfaceNames
  • ReflectionClass::getMethod »
  • PHP Manual
  • ReflectionClass
  • Récupère les interfaces

ReflectionClass::getInterfaces

(PHP 5, PHP 7)

ReflectionClass::getInterfaces — Récupère les interfaces

Description

public ReflectionClass::getInterfaces ( ) : array

Récupère les interfaces.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un tableau associatif contenant les interfaces, dont les clés sont les noms des interfaces, et les valeurs les objets ReflectionClass.

Exemples

Exemple #1 >Exemple avec ReflectionClass::getInterfaces()

<?php
interface Foo { }

interface Bar { }

class Baz implements Foo, Bar { }

$rc1 = new ReflectionClass("Baz");

print_r($rc1->getInterfaces());
?>

Résultat de l'exemple ci-dessus est similaire à :

Array
(
    [Foo] => ReflectionClass Object
        (
            [name] => Foo
        )

    [Bar] => ReflectionClass Object
        (
            [name] => Bar
        )

)

Voir aussi

  • ReflectionClass::getInterfaceNames() - Récupère les noms des interfaces

User Contributed Notes

There are no user contributed notes for this page.


Récupère un ReflectionMethod pour une méthode de classe

  • « ReflectionClass::getInterfaces
  • ReflectionClass::getMethods »
  • PHP Manual
  • ReflectionClass
  • Récupère un ReflectionMethod pour une méthode de classe

ReflectionClass::getMethod

(PHP 5, PHP 7)

ReflectionClass::getMethod — Récupère un ReflectionMethod pour une méthode de classe

Description

public ReflectionClass::getMethod ( string $name ) : ReflectionMethod

Récupère un ReflectionMethod pour une méthode de classe.

Liste de paramètres

name

Le nom de la méthode à refléter.

Valeurs de retour

Un objet ReflectionMethod.

Erreurs / Exceptions

Une exception ReflectionException si la méthode n'existe pas.

Exemples

Exemple #1 Utilisation simple de ReflectionClass::getMethod()

<?php
$class = new ReflectionClass('ReflectionClass');
$method = $class->getMethod('getMethod');
var_dump($method);
?>

L'exemple ci-dessus va afficher :

object(ReflectionMethod)#2 (2) {
  ["name"]=>
  string(9) "getMethod"
  ["class"]=>
  string(15) "ReflectionClass"
}

Voir aussi

  • ReflectionClass::getMethods() - Récupère un tableau des méthodes

User Contributed Notes

Jarrod Nettles 22-Dec-2010 12:58
If you ever need to get the type hint of a parameter in a method use this.

<?php

//Target our class
$reflector = new ReflectionClass('MyClass');

//Get the parameters of a method
$parameters = $reflector->getMethod('FireCannon')->getParameters();

//Loop through each parameter and get the type
foreach($parameters as $param)
{
     //Before you call getClass() that class must be defined!
     echo $param->getClass()->name;
}

?>


Récupère un tableau des méthodes

  • « ReflectionClass::getMethod
  • ReflectionClass::getModifiers »
  • PHP Manual
  • ReflectionClass
  • Récupère un tableau des méthodes

ReflectionClass::getMethods

(PHP 5, PHP 7)

ReflectionClass::getMethods — Récupère un tableau des méthodes

Description

public ReflectionClass::getMethods ( int|null $filter = null ) : array

Récupère un tableau des méthodes d'une classe.

Liste de paramètres

filter

Filtre les résultats pour inclure uniquement les méthodes avec certains attributs. Par défaut, aucun filtrage.

Toute disjonction au niveau du bit de
ReflectionMethod::IS_STATIC,
ReflectionMethod::IS_PUBLIC,
ReflectionMethod::IS_PROTECTED,
ReflectionMethod::IS_PRIVATE,
ReflectionMethod::IS_ABSTRACT et
ReflectionMethod::IS_FINAL,
de sorte que toutes les méthodes avec n'importe quel des attributs fournis seront retournées.

Note: Notez que d'autres opérations au niveau du bit, par exemple ~ ne fonctionneront pas comme prévu. En d'autres termes, il n'est pas possible de récupérer toutes les méthodes non statiques, par exemple.

Valeurs de retour

Un tableau d'objets ReflectionMethod reflétant chaque méthode.

Historique

Version | Description
7.2.0 | filter est désormais nullable.

Exemples

Exemple #1 Utilisation simple de ReflectionClass::getMethods()

<?php
class Apple {
    public function firstMethod() { }
    final protected function secondMethod() { }
    private static function thirdMethod() { }
}

$class = new ReflectionClass('Apple');
$methods = $class->getMethods();
var_dump($methods);
?>

L'exemple ci-dessus va afficher :

array(3) {
  [0]=>
  object(ReflectionMethod)#2 (2) {
    ["name"]=>
    string(11) "firstMethod"
    ["class"]=>
    string(5) "Apple"
  }
  [1]=>
  object(ReflectionMethod)#3 (2) {
    ["name"]=>
    string(12) "secondMethod"
    ["class"]=>
    string(5) "Apple"
  }
  [2]=>
  object(ReflectionMethod)#4 (2) {
    ["name"]=>
    string(11) "thirdMethod"
    ["class"]=>
    string(5) "Apple"
  }
}

Exemple #2 Filtrage des résultats depuis ReflectionClass::getMethods()

<?php
class Apple {
    public function firstMethod() { }
    final protected function secondMethod() { }
    private static function thirdMethod() { }
}

$class = new ReflectionClass('Apple');
$methods = $class->getMethods(ReflectionMethod::IS_STATIC | ReflectionMethod::IS_FINAL);
var_dump($methods);
?>

L'exemple ci-dessus va afficher :

array(2) {
  [0]=>
  object(ReflectionMethod)#2 (2) {
    ["name"]=>
    string(12) "secondMethod"
    ["class"]=>
    string(5) "Apple"
  }
  [1]=>
  object(ReflectionMethod)#3 (2) {
    ["name"]=>
    string(11) "thirdMethod"
    ["class"]=>
    string(5) "Apple"
  }
}

Voir aussi

  • ReflectionClass::getMethod() - Récupère un ReflectionMethod pour une méthode de classe
  • get_class_methods() - Retourne les noms des méthodes d'une classe

User Contributed Notes

tom at r dot je 11-Jun-2014 05:40
ReflectionClass::getMethods() sorts the methods by class (lowest in the inheritance tree first) then by the order they are defined in the class definition:

<?php
class A {
    public function method1() {

    }

    public function method2() {

    }
}

class B extends A {

    public function method3() {

    }

    public function method4() {

    }
}

$class = new ReflectionClass('B');
print_r($class->getMethods());
?>

This will output:

Array
(
    [0] => ReflectionMethod Object
        (
            [name] => method3
            [class] => B
        )

    [1] => ReflectionMethod Object
        (
            [name] => method4
            [class] => B
        )

    [2] => ReflectionMethod Object
        (
            [name] => method1
            [class] => A
        )

    [3] => ReflectionMethod Object
        (
            [name] => method2
            [class] => A
        )

)
x_atrix at yahoo dot com 10-Jul-2013 05:00
Note, for ReflectionClass::getMethods() not all methods in a final class are final, just the ones that have explicit modifier.
If you want to use an and operator for the filter, here is a simple implementation
<?php
final class Apple {
    public function publicMethod() { }
    public final function publicFinalMethod() { }
    protected final function protectedFinalMethod() { }
    private static function privateStaticMethod() { }
}

class MyReflection extends ReflectionClass {
    public function __construct($argument) {
        parent::__construct($argument);
    }

    /**
     * (non-PHPdoc)
     * @see ReflectionClass::getMethods()
     */
    public function getMethods($filter = null, $useAndOperator = true) {
        if ($useAndOperator !== true) {
            return parent::getMethods($filter);
        }

        $methods = parent::getMethods($filter);
        $results = array();

        foreach ($methods as $method) {
            if (($method->getModifiers() & $filter) === $filter) {
                $results[] = $method;
            }
        }

        return $results;
    }
}

$class = new MyReflection('Apple');
$methods = $class->getMethods(ReflectionMethod::IS_FINAL | ReflectionMethod::IS_PUBLIC);
var_dump($methods);

$methods = $class->getMethods(ReflectionMethod::IS_FINAL | ReflectionMethod::IS_PUBLIC, false);
var_dump($methods);
?>

Result:
array(1) {
  [0]=>
  object(ReflectionMethod)#4 (2) {
    ["name"]=>
    string(17) "publicFinalMethod"
    ["class"]=>
    string(5) "Apple"
  }
}

array(3) {
  [0]=>
  &object(ReflectionMethod)#5 (2) {
    ["name"]=>
    string(12) "publicMethod"
    ["class"]=>
    string(5) "Apple"
  }
  [1]=>
  &object(ReflectionMethod)#3 (2) {
    ["name"]=>
    string(17) "publicFinalMethod"
    ["class"]=>
    string(5) "Apple"
  }
  [2]=>
  &object(ReflectionMethod)#6 (2) {
    ["name"]=>
    string(20) "protectedFinalMethod"
    ["class"]=>
    string(5) "Apple"
  }
}
deminy at deminy dot net 22-Jun-2011 09:24
Method ReflectionClass::getMethods doesn't work constantly across different versions of PHP. For following code piece

<?php
class Dummy implements Iterator
{
    public function current () {}
    public function next () {}
    public function key () {}
    public function valid () {}
    public function rewind () {}
}

$reflection = new ReflectionClass('Dummy');
$aMethods = $reflection->getMethods();
echo '# of methods: ', count($aMethods), "\n";
?>

, it outputs "# of methods: 10" on PHP 5.2.14 and PHP 5.2.17, including all methods defined in the class itself and in the interface no matter if a method has been implemented or overridden; however, it returns "# of methods: 5" on PHP 5.3.5. Based on some other tests did by my colleagues, I assume it also returns "# of methods: 5" on PHP 5.2.10 and PHP 5.3.6.


Récupère les modificateurs de classe

  • « ReflectionClass::getMethods
  • ReflectionClass::getName »
  • PHP Manual
  • ReflectionClass
  • Récupère les modificateurs de classe

ReflectionClass::getModifiers

(PHP 5, PHP 7)

ReflectionClass::getModifiers — Récupère les modificateurs de classe

Description

public ReflectionClass::getModifiers ( ) : int

Retourne un champ de bit des modificateurs d'accès pour cette classe.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un masque de bits des constantes de modificateurs.

Voir aussi

  • ReflectionClass::getProperties() - Récupère les propriétés
  • Reflection::getModifierNames() - Récupère les nom des modificateurs

User Contributed Notes

Nicola Pietroluongo 26-Feb-2015 01:17
It's the amount of memory allocation in bit.
By default many systems allocate 1048576 bit (1 Megabit).

/* Example 1 */

class Test {}
$classTest = new Test();
$reflectionClass = new \ReflectionClass('Test');
$classModifiers = $reflectionClass->getModifiers();
var_export($classModifiers);

//output
1048576

/* Example 2 */

class Test {}
//the constructor is missing
$reflectionClass = new \ReflectionClass('Test');
$classModifiers = $reflectionClass->getModifiers();
var_export($classModifiers);

//output
0


Récupère le nom de la classe

  • « ReflectionClass::getModifiers
  • ReflectionClass::getNamespaceName »
  • PHP Manual
  • ReflectionClass
  • Récupère le nom de la classe

ReflectionClass::getName

(PHP 5, PHP 7)

ReflectionClass::getName — Récupère le nom de la classe

Description

public ReflectionClass::getName ( ) : string

Récupère le nom de la classe.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le nom de la classe.

Exemples

Exemple #1 Exemple avec ReflectionClass::getName()

<?php
namespace A\B;

class Foo { }

$function = new \ReflectionClass('stdClass');

var_dump($function->inNamespace());
var_dump($function->getName());
var_dump($function->getNamespaceName());
var_dump($function->getShortName());

$function = new \ReflectionClass('A\\B\\Foo');

var_dump($function->inNamespace());
var_dump($function->getName());
var_dump($function->getNamespaceName());
var_dump($function->getShortName());
?>

L'exemple ci-dessus va afficher :

bool(false)
string(8) "stdClass"
string(0) ""
string(8) "stdClass"

bool(true)
string(7) "A\B\Foo"
string(3) "A\B"
string(3) "Foo"

Voir aussi

  • ReflectionClass::getNamespaceName() - Récupère l'espace de noms

User Contributed Notes

There are no user contributed notes for this page.


Récupère l'espace de noms

  • « ReflectionClass::getName
  • ReflectionClass::getParentClass »
  • PHP Manual
  • ReflectionClass
  • Récupère l'espace de noms

ReflectionClass::getNamespaceName

(PHP 5 >= 5.3.0, PHP 7)

ReflectionClass::getNamespaceName — Récupère l'espace de noms

Description

public ReflectionClass::getNamespaceName ( ) : string

Récupère l'espace de noms.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

L'espace de noms.

Exemples

Exemple #1 Exemple avec ReflectionClass::getNamespaceName()

<?php
namespace A\B;

class Foo { }

$class = new \ReflectionClass('stdClass');

var_dump($class->inNamespace());
var_dump($class->getName());
var_dump($class->getNamespaceName());
var_dump($class->getShortName());

$class = new \ReflectionClass('A\\B\\Foo');

var_dump($class->inNamespace());
var_dump($class->getName());
var_dump($class->getNamespaceName());
var_dump($class->getShortName());
?>

L'exemple ci-dessus va afficher :

bool(false)
string(8) "stdClass"
string(0) ""
string(8) "stdClass"

bool(true)
string(7) "A\B\Foo"
string(3) "A\B"
string(3) "Foo"

Voir aussi

  • ReflectionClass::getParentClass() - Récupère la classe parente
  • Les espaces de noms

User Contributed Notes

francois 14-Aug-2011 04:08
If the object does not belong to a namespace, an empty string is returned


Récupère la classe parente

  • « ReflectionClass::getNamespaceName
  • ReflectionClass::getProperties »
  • PHP Manual
  • ReflectionClass
  • Récupère la classe parente

ReflectionClass::getParentClass

(PHP 5, PHP 7)

ReflectionClass::getParentClass — Récupère la classe parente

Description

public ReflectionClass::getParentClass ( ) : ReflectionClass|false

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un objet ReflectionClass ou false s'il n'y a pas de parent.

Voir aussi

  • ReflectionClass::__construct() - Construit une ReflectionClass

User Contributed Notes

isaac dot z dot foster at gmail dot com 15-Jun-2013 09:02
Quick correction, the code for getting all parent classes below has a "typo", you need to reset the $class variable to the parent class instance, otherwise it just endlessly loops:

        $class = new ReflectionClass('classname');

        $parents = array();

        while ($parent = $class->getParentClass()) {
            $parents[] = $parent->getName();
            $class = $parent;
        }

        echo "Parents: " . implode(", ", $parents);
havelangep at hotmail dot com 16-Dec-2010 01:26
Here is a "replacement" for is_a that will additionally look both into the extended classes and in the implemented interfaces

<?php
/**
     * Check if a class extends or implements a specific class/interface
     * @param string $search The class or interface name to look for
     * @param string $className The class name of the object to compare to
     * @return bool
     */
    function IsExtendsOrImplements( $search, $className ) {
        $class = new ReflectionClass( $className );
        if( false === $class ) {
            return false;
        }
        do {
            $name = $class->getName();
            if( $search == $name ) {
                return true;
            }
            $interfaces = $class->getInterfaceNames();
            if( is_array( $interfaces ) && in_array( $search, $interfaces )) {
                return true;
            }
            $class = $class->getParentClass();
        } while( false !== $class );
        return false;
    }
?>
jochem at drecomm dot nl 18-Nov-2010 04:34
When you want to find all parents (parent, parent of parent, parent of parent's parent and so on) try:

<?php
$class = new ReflectionClass('whatever');

$parents = array();

while ($parent = $class->getParentClass()) {
    $parents[] = $parent->getName();
}

echo "Parents: " . implode(", ", $parents);
?>

ReflectionClass::getParentClass() can return a ReflectionClass object of the parent class or false if no parent.

(PHP Version 5.1.6)


Récupère les propriétés

  • « ReflectionClass::getParentClass
  • ReflectionClass::getProperty »
  • PHP Manual
  • ReflectionClass
  • Récupère les propriétés

ReflectionClass::getProperties

(PHP 5, PHP 7)

ReflectionClass::getProperties — Récupère les propriétés

Description

public ReflectionClass::getProperties ( int|null $filter = null ) : array

Récupère les propriétés reflétées.

Liste de paramètres

filter

Le filtre, optionnel, pour filtrer les types de propriétés désirées. Ce filtre est configuré en utilisant les constantes ReflectionProperty, et par défaut, tous les types de propriétés sont retournés.

Valeurs de retour

Un tableau d'objets ReflectionProperty.

Historique

Version | Description
7.2.0 | filter est désormais nullable.

Exemples

Exemple #1 Exemple avec ReflectionClass::getProperties()

Cet exemple montre l'utilisation du paramètre optionnel filter, qui permet ici de filtrer les propriétés privées.

<?php
class Foo {
    public    $foo  = 1;
    protected $bar  = 2;
    private   $baz  = 3;
}

$foo = new Foo();

$reflect = new ReflectionClass($foo);
$props   = $reflect->getProperties(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED);

foreach ($props as $prop) {
    print $prop->getName() . "\n";
}

var_dump($props);

?>

Résultat de l'exemple ci-dessus est similaire à :

foo
bar
array(2) {
  [0]=>
  object(ReflectionProperty)#3 (2) {
    ["name"]=>
    string(3) "foo"
    ["class"]=>
    string(3) "Foo"
  }
  [1]=>
  object(ReflectionProperty)#4 (2) {
    ["name"]=>
    string(3) "bar"
    ["class"]=>
    string(3) "Foo"
  }
}

Voir aussi

  • ReflectionClass::getProperty() - Récupère une ReflectionProperty pour une propriété d'une classe
  • ReflectionProperty
  • Les constantes de modificateurs de ReflectionProperty

User Contributed Notes

kelunik at php dot net 21-Jan-2018 10:58
Note that inherited properties are returned, but no private properties of parent classes. Depending on the use case, you need to check that, too.

do {
    foreach ($reflectionClass->getProperties() as $property) {
        /* ... */
    }
} while ($reflectionClass = $reflectionClass->getParentClass());
postmaster at greg0ire dot fr 08-Jul-2014 09:23
The code in the first example actually does get inherited properties with at least php 5.5.9 . I don't know if / when this behavior changed.

Here is the output:
    array(2) {
     [0] =>
     class ReflectionProperty#2 (2) {
       public $name =>
       string(2) "a2"
       public $class =>
       string(2) "AA"
     }
     [1] =>
     class ReflectionProperty#3 (2) {
       public $name =>
       string(2) "a1"
       public $class =>
       string(1) "A"
     }
    }
Yzmir Ramirez 16-Oct-2010 08:53
Looks like you can access public, protected, private variables by casting the object to an array (useful for Unit Testing).  However casting to an array still won't allow you access to protected and private static variables.

In PHP 5.3.0+ use ReflectionProperty::setAccessable(true);

<?php

echo "PHP Version: ".phpversion()."\n";

class Foo {
    public    $foo  = 'public';
    protected $bar  = 'protected';
    private   $baz  = 'private';

    public static    $sfoo  = 'public static';
    protected static $sbar  = 'protected static';
    private static   $sbaz  = 'private static';

    const COO = 'const';

}

$obj = new Foo;

$arr = (array)$obj;

print_r($arr);

echo "Accessing Public Static: ".Foo::$sfoo."\n";
// echo Foo::$sbar."\n"; // Fatal error: Cannot access protected property Foo::$sbar
// echo Foo::$sbaz."\n"; // Fatal error: Cannot access private property Foo::$sbaz
echo "Accessing Constant: ".Foo::COO."\n";
?>

PHP Version: 5.2.12
Array
(
    [foo] => public
    [*bar] => protected
    [Foobaz] => private
)
Accessing Public Static: public static
Accessing Constant: const

PHP Version: 5.1.6
Array
(
    [foo] => public
    [*bar] => protected
    [Foobaz] => private
)
Accessing Public Static: public static
Accessing Constant: const
mcurtis 28-Jan-2009 02:41
It should be noted that the 'filter' parameter in the getProperties(filter) method is expected to be of type long.  Not sure why, but it doesn't function as a way of passing in a string to fetch a subset of properties by string match.
muratyaman at gmail dot com 22-Jan-2009 07:47
Some may find this useful.

<?php
/**
 * Recursive function to get an associative array of class properties by property name => ReflectionProperty() object
 * including inherited ones from extended classes
 * @param string $className Class name
 * @param string $types Any combination of <b>public, private, protected, static</b>
 * @return array
 */
function getClassProperties($className, $types='public'){
    $ref = new ReflectionClass($className);
    $props = $ref->getProperties();
    $props_arr = array();
    foreach($props as $prop){
        $f = $prop->getName();

        if($prop->isPublic() and (stripos($types, 'public') === FALSE)) continue;
        if($prop->isPrivate() and (stripos($types, 'private') === FALSE)) continue;
        if($prop->isProtected() and (stripos($types, 'protected') === FALSE)) continue;
        if($prop->isStatic() and (stripos($types, 'static') === FALSE)) continue;

        $props_arr[$f] = $prop;
    }
    if($parentClass = $ref->getParentClass()){
        $parent_props_arr = getClassProperties($parentClass->getName());//RECURSION
        if(count($parent_props_arr) > 0)
            $props_arr = array_merge($parent_props_arr, $props_arr);
    }
    return $props_arr;
}

//USAGE

class A{
  public $a1;

    function abc(){
        //do something
    }
}

class AA extends A{
    public $a2;

    function edf(){
        //do something
    }
}

class AAA extends AA{
  //may not have extra properties, but may have extra methods
    function ghi(){
        //ok
    }
}

//$ref = new ReflectionClass('AAA'); $props = $ref->getProperties();//This will get no properties!
$props_arr = getClassProperties('AAA', 'public');//Use this
var_dump($props_arr);
/*
OUTPUT on PHP5.2.6:
array
  'a1' =>
    object(ReflectionProperty)[4]
      public 'name' => string 'a1' (length=2)
      public 'class' => string 'AAA' (length=3)
  'a2' =>
    object(ReflectionProperty)[3]
      public 'name' => string 'a2' (length=2)
      public 'class' => string 'AAA' (length=3)

*/

?>
david dot thalmann at gmail dot com 05-Jan-2009 08:19
With PHP 5.3 protected or private properties are easy to access with setAccessible(). However, it's sometimes needed (e.g. Unit Tests) and here is a workaround for getValue():

<?php

$class = new ReflectionClass('SomeClass');
$props = $class->getProperties();
// $propsStatic = $class->getStaticProperties();

$myPrivatePropertyValue = $props['aPrivateProperty'];

?>

Note that it wont work if you access the property directly with getProperty().


Récupère une ReflectionProperty pour une propriété d'une classe

  • « ReflectionClass::getProperties
  • ReflectionClass::getReflectionConstant »
  • PHP Manual
  • ReflectionClass
  • Récupère une ReflectionProperty pour une propriété d'une classe

ReflectionClass::getProperty

(PHP 5, PHP 7)

ReflectionClass::getProperty — Récupère une ReflectionProperty pour une propriété d'une classe

Description

public ReflectionClass::getProperty ( string $name ) : ReflectionProperty

Récupère une ReflectionProperty pour une propriété d'une classe.

Liste de paramètres

name

Le nom de la propriété.

Valeurs de retour

Un objet ReflectionProperty.

Exemples

Exemple #1 Exemple avec ReflectionClass::getProperty()

<?php
$class = new ReflectionClass('ReflectionClass');
$property = $class->getProperty('name');
var_dump($property);
?>

L'exemple ci-dessus va afficher :

object(ReflectionProperty)#2 (2) {
  ["name"]=>
  string(4) "name"
  ["class"]=>
  string(15) "ReflectionClass"
}

Voir aussi

  • ReflectionClass::getProperties() - Récupère les propriétés

User Contributed Notes

dohpaz42 16-Jun-2015 04:16
Accessing private properties is possible, but care must be taken if that private property was defined lower into the inheritance chain. For example, if class A extends class B, and class B defines a private property called 'foo', getProperty will throw a ReflectionException.

Instead, you can loop over getParentClass until it returns false to look for the private property, at which point you can access and/or modify its value as needed.
eric at naeseth dot com 02-Aug-2011 03:38
If the class doesn't have a property with the given name, a ReflectionException will be raised.


Récupère un ReflectionClassConstant pour une constante d'une classe

  • « ReflectionClass::getProperty
  • ReflectionClass::getReflectionConstants »
  • PHP Manual
  • ReflectionClass
  • Récupère un ReflectionClassConstant pour une constante d'une classe

ReflectionClass::getReflectionConstant

(PHP 7 >= 7.1.0)

ReflectionClass::getReflectionConstant — Récupère un ReflectionClassConstant pour une constante d'une classe

Description

public ReflectionClass::getReflectionConstant ( string $name ) : ReflectionClassConstant|false

Récupère un ReflectionClassConstant pour une propriété de classe.

Liste de paramètres

name

Le nom de la constante de classe.

Valeurs de retour

Un ReflectionClassConstant, ou false si une erreur survient.

Voir aussi

  • ReflectionClass::getReflectionConstants() - Récupère les constantes de classe
  • ReflectionClassConstant

User Contributed Notes

There are no user contributed notes for this page.


Récupère les constantes de classe

  • « ReflectionClass::getReflectionConstant
  • ReflectionClass::getShortName »
  • PHP Manual
  • ReflectionClass
  • Récupère les constantes de classe

ReflectionClass::getReflectionConstants

(PHP 7 >= 7.1.0)

ReflectionClass::getReflectionConstants — Récupère les constantes de classe

Description

public ReflectionClass::getReflectionConstants ( int|null $filter = null ) : array

Récupère les constantes réfléchies.

Liste de paramètres

filter

Le filtre optionnel, pour filter les constantes avec la visibilité désiré. C'est configuré en utilisant les constantes ReflectionClassConstant, et par défaut récupère toutes les constantes peut importe la visibilité.

Valeurs de retour

Un tableau d'objets ReflectionClassConstant.

Historique

Version | Description
8.0.0 | filter a été ajouté.

Exemples

Exemple #1 Exemple basique de ReflectionClass::getReflectionConstants()

<?php
class Foo {
    public    const FOO  = 1;
    protected const BAR  = 2;
    private   const BAZ  = 3;
}

$foo = new Foo();

$reflect = new ReflectionClass($foo);
$consts  = $reflect->getReflectionConstants();

foreach ($consts as $const) {
    print $const->getName() . "\n";
}

var_dump($consts);

?>

Résultat de l'exemple ci-dessus est similaire à :

FOO
BAR
BAZ
array(3) {
  [0]=>
  object(ReflectionClassConstant)#3 (2) {
    ["name"]=>
    string(3) "FOO"
    ["class"]=>
    string(3) "Foo"
  }
  [1]=>
  object(ReflectionClassConstant)#4 (2) {
    ["name"]=>
    string(3) "BAR"
    ["class"]=>
    string(3) "Foo"
  }
  [2]=>
  object(ReflectionClassConstant)#5 (2) {
    ["name"]=>
    string(3) "BAZ"
    ["class"]=>
    string(3) "Foo"
  }
}

Voir aussi

  • ReflectionClass::getReflectionConstant() - Récupère un ReflectionClassConstant pour une constante d'une classe
  • ReflectionClassConstant

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom court d'une classe

  • « ReflectionClass::getReflectionConstants
  • ReflectionClass::getStartLine »
  • PHP Manual
  • ReflectionClass
  • Récupère le nom court d'une classe

ReflectionClass::getShortName

(PHP 5 >= 5.3.0, PHP 7)

ReflectionClass::getShortName — Récupère le nom court d'une classe

Description

public ReflectionClass::getShortName ( ) : string

Récupère le nom court d'une classe, c'est-à-dire, la partie sans l'espace de noms.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le nom court de la classe.

Exemples

Exemple #1 Exemple avec ReflectionClass::getShortName()

<?php
namespace A\B;

class Foo { }

$function = new \ReflectionClass('stdClass');

var_dump($function->inNamespace());
var_dump($function->getName());
var_dump($function->getNamespaceName());
var_dump($function->getShortName());

$function = new \ReflectionClass('A\\B\\Foo');

var_dump($function->inNamespace());
var_dump($function->getName());
var_dump($function->getNamespaceName());
var_dump($function->getShortName());
?>

L'exemple ci-dessus va afficher :

bool(false)
string(8) "stdClass"
string(0) ""
string(8) "stdClass"

bool(true)
string(7) "A\B\Foo"
string(3) "A\B"
string(3) "Foo"

Voir aussi

  • ReflectionClass::getName() - Récupère le nom de la classe

User Contributed Notes

There are no user contributed notes for this page.


Récupère le numéro de ligne de départ

  • « ReflectionClass::getShortName
  • ReflectionClass::getStaticProperties »
  • PHP Manual
  • ReflectionClass
  • Récupère le numéro de ligne de départ

ReflectionClass::getStartLine

(PHP 5, PHP 7)

ReflectionClass::getStartLine — Récupère le numéro de ligne de départ

Description

public ReflectionClass::getStartLine ( ) : int|false

Récupère le numéro de ligne de départ.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le numéro de ligne de départ, en tant que int, ou false is inconnue.

Voir aussi

  • ReflectionClass::getEndLine() - Récupère la fin d'une ligne

User Contributed Notes

There are no user contributed notes for this page.


Récupère les propriétés statiques

  • « ReflectionClass::getStartLine
  • ReflectionClass::getStaticPropertyValue »
  • PHP Manual
  • ReflectionClass
  • Récupère les propriétés statiques

ReflectionClass::getStaticProperties

(PHP 5, PHP 7)

ReflectionClass::getStaticProperties — Récupère les propriétés statiques

Description

public ReflectionClass::getStaticProperties ( ) : array|null

Récupère les propriétés statiques.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Les propriétés statiques, en tant que array, ou null en cas d'échec.

Voir aussi

  • ReflectionClass::getStaticPropertyValue() - Récupère la valeur d'une propriété statique
  • ReflectionClass::setStaticPropertyValue() - Définit la valeur d'une propriété statiques

User Contributed Notes

joao dot felipe dot c dot b at gmail dot com 24-Mar-2016 01:06
getStaticProperties return a set of the property itself. It's diferente from getProperties(ReflectionProperty::IS_STATIC) because it return a set of ReflectionProperty class.
jlennox @ google mail 08-May-2010 10:03
I had the need to recursive merge the results from a subclass with all of it's parents, and this was the resulting code:

<?php
function GetStaticPropertiesRecursive($class) {
    $currentClass = $class;
    $joinedProperties = array();
    do {
        $reflection = new ReflectionClass($class);
        $staticProperties = $reflection->getStaticProperties();
        foreach ($staticProperties as $name => $value) {
            if (is_array($value)) {
                if (isset($joinedProperties[$name]))
                    $joinedProperties[$name] = array_merge($value, $joinedProperties[$name]);
                else
                    $joinedProperties[$name] = $value;
            } else {
                if (isset($joinedProperties[$name]))
                    $joinedProperties[$name][] = $value;
                else
                    $joinedProperties[$name] = array($value);
            }
        }
    } while ($class = get_parent_class($class));
    return $joinedProperties;
}

Using this function:
class base {
    public static $Test = array("foo1", "foo2");
}
class sub extends base {
    public static $Test = "sub";
}

print_r(GetStaticPropertiesRecursive("sub"));
?>

That outputs:
Array
(
    [Test] => Array
        (
            [0] => foo1
            [1] => foo2
            [2] => sub
        )

)

The merge follows the rules of array_merge on duplicate keys.


Récupère la valeur d'une propriété statique

  • « ReflectionClass::getStaticProperties
  • ReflectionClass::getTraitAliases »
  • PHP Manual
  • ReflectionClass
  • Récupère la valeur d'une propriété statique

ReflectionClass::getStaticPropertyValue

(PHP 5 >= 5.1.2, PHP 7)

ReflectionClass::getStaticPropertyValue — Récupère la valeur d'une propriété statique

Description

public ReflectionClass::getStaticPropertyValue ( string $name , mixed &$def_value = ? ) : mixed

Récupère la valeur d'une propriété statique de la classe.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

name

Le nom de la propriété statique pour laquelle nous souhaitons récupérer la valeur.

def_value

Une valeur par défaut à retourner lorsque la classe ne déclare pas une propriété statique avec le nom fourni name. Si la propriété n'existe pas, et que cet argiment est omis, une exception de type ReflectionException sera émise.

Valeurs de retour

La valeur de la propriété statique.

Exemples

Exemple #1 Exemple avec ReflectionClass::getStaticPropertyValue()

<?php
class Apple {
    public static $color = 'Red';
}

$class = new ReflectionClass('Apple');
var_dump($class->getStaticPropertyValue('color'));
?>

L'exemple ci-dessus va afficher :

string(3) "Red"

Voir aussi

  • ReflectionClass::getStaticProperties() - Récupère les propriétés statiques
  • ReflectionClass::setStaticPropertyValue() - Définit la valeur d'une propriété statiques

User Contributed Notes

Antares 16-Aug-2011 07:11
It seems this method has a security level different from the getStaticProperties method.

If you make two classes A and B looking like

<?php
class A{
        protected static $static_var='foo';

        public function getStatic(){
           $class=new ReflectionClass($this);
           return $class->getStaticPropertyValue('static_var');
        }

        public function getStatic2(){
            $class=new ReflectionClass($this);
            $staticProps=$class->getStaticProperties();
            return $staticProps['static_var'];
        }

        public function __construct(){
              echo $this->getStatic2();
              echo $this->getStatic();
        }
}

class B extends A{
        protected static $static_var='foo2';

}
?>

Then the output will be an exception for the getStatic() call, when the getStatic2() will correctly return 'foo2';
Mauro Gabriel Titimoli 21-Jan-2010 12:05
If you want to change a static property of a variable class...

PHP 5.2
<?php
$reflection = new ReflectionClass($className);
$staticPropertyReference = & $reflection->getStaticPropertyValue($staticPropertyName);

$staticPropertyReference = 'new value';
?>

PHP 5.3
<?php
$className::$$classProperty
?>


Retourne un tableau des alias du trait

  • « ReflectionClass::getStaticPropertyValue
  • ReflectionClass::getTraitNames »
  • PHP Manual
  • ReflectionClass
  • Retourne un tableau des alias du trait

ReflectionClass::getTraitAliases

(PHP 5 >= 5.4.0, PHP 7)

ReflectionClass::getTraitAliases — Retourne un tableau des alias du trait

Description

public ReflectionClass::getTraitAliases ( ) : array

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un tableau avec les nouveaux noms de méthodes en clés et les noms originaux en valeurs (au format "TraitName::original"). Retourne null en cas d'erreur.

User Contributed Notes

dhairya dot coder at gmail dot com 10-Feb-2016 11:43
trait A {
    public function smallTalk() {
        echo 'a';
    }
    public function bigTalk() {
        echo 'A';
    }
}

class Apple{

    use A {
        A::bigTalk as talk;
    }
}

$obj=new ReflectionClass('Apple');
echo "<pre>";
var_dump($obj->getTraitAliases());
echo "</pre>";


Retourne un tableau de noms des traits utilisés par cette classe

  • « ReflectionClass::getTraitAliases
  • ReflectionClass::getTraits »
  • PHP Manual
  • ReflectionClass
  • Retourne un tableau de noms des traits utilisés par cette classe

ReflectionClass::getTraitNames

(PHP 5 >= 5.4.0, PHP 7)

ReflectionClass::getTraitNames — Retourne un tableau de noms des traits utilisés par cette classe

Description

public ReflectionClass::getTraitNames ( ) : array

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un tableau de noms des traits en valeurs. Retourne null en cas d'erreur.

User Contributed Notes

emulienfou at gmail dot com 30-Nov-2013 03:55
This remote return only the trait names from the current class.

If your class extends another class using your trait, you can't get the names. However, you can do something like :

<?php
$traitsNames = [];
$recursiveClasses = function ($class) use(&$recursiveClasses, &$traitsNames) {
    if ($class->getParentClass() != false) {
        $recursiveClasses($class->getParentClass());
    }
    else {
        $traitsNames = array_merge($traitsNames, $class->getTraitNames());
    }
};
$recursiveClasses($controllerClass);


Retourne un tableau des traits utilisés par cette classe

  • « ReflectionClass::getTraitNames
  • ReflectionClass::hasConstant »
  • PHP Manual
  • ReflectionClass
  • Retourne un tableau des traits utilisés par cette classe

ReflectionClass::getTraits

(PHP 5 >= 5.4.0, PHP 7)

ReflectionClass::getTraits — Retourne un tableau des traits utilisés par cette classe

Description

public ReflectionClass::getTraits ( ) : array

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un tableau avec le nom du trait en clé et des instances ReflectionClass des traits en question en valeurs. Retourne null en cas d'erreur.

User Contributed Notes

Anonymous 15-Jan-2015 04:03
Note that getTraits will NOT return any traits inherited from a parent.

This is currently viewed as the desired behavior.  See https://bugs.php.net/bug.php?id=61554


Vérifie si une constante est définie

  • « ReflectionClass::getTraits
  • ReflectionClass::hasMethod »
  • PHP Manual
  • ReflectionClass
  • Vérifie si une constante est définie

ReflectionClass::hasConstant

(PHP 5 >= 5.1.2, PHP 7)

ReflectionClass::hasConstant — Vérifie si une constante est définie

Description

public ReflectionClass::hasConstant ( string $name ) : bool

Vérifie si une constante spécifique est définie dans une classe.

Liste de paramètres

name

Nom de la constante à vérifier.

Valeurs de retour

true si la constante est définie, false sinon.

Exemples

Exemple #1 Exemple avec ReflectionClass::hasConstant()

<?php
class Foo {
    const c1 = 1;
}

$class = new ReflectionClass("Foo");

var_dump($class->hasConstant("c1"));
var_dump($class->hasConstant("c2"));
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(true)
bool(false)

Voir aussi

  • ReflectionClass::hasMethod() - Vérifie si une méthode est définie
  • ReflectionClass::hasProperty() - Vérifie si une propriété est définie

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si une méthode est définie

  • « ReflectionClass::hasConstant
  • ReflectionClass::hasProperty »
  • PHP Manual
  • ReflectionClass
  • Vérifie si une méthode est définie

ReflectionClass::hasMethod

(PHP 5 >= 5.1.2, PHP 7)

ReflectionClass::hasMethod — Vérifie si une méthode est définie

Description

public ReflectionClass::hasMethod ( string $name ) : bool

Vérifie si une méthode spécifique est définie dans une classe.

Liste de paramètres

name

Nom de la méthode à vérifier.

Valeurs de retour

true si la méthode est définie, false sinon.

Exemples

Exemple #1 Exemple avec ReflectionClass::hasMethod()

<?php
Class C {
    public function publicFoo() {
        return true;
    }

    protected function protectedFoo() {
        return true;
    }

    private function privateFoo() {
        return true;
    }

    static function staticFoo() {
        return true;
    }
}

$rc = new ReflectionClass("C");

var_dump($rc->hasMethod('publicFoo'));

var_dump($rc->hasMethod('protectedFoo'));

var_dump($rc->hasMethod('privateFoo'));

var_dump($rc->hasMethod('staticFoo'));

// C should not have method bar
var_dump($rc->hasMethod('bar'));

// Method names are case insensitive
var_dump($rc->hasMethod('PUBLICfOO'));
?>

L'exemple ci-dessus va afficher :

bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)

Voir aussi

  • ReflectionClass::hasConstant() - Vérifie si une constante est définie
  • ReflectionClass::hasProperty() - Vérifie si une propriété est définie

User Contributed Notes

dn dot permyakov at gmail dot com 08-May-2019 11:32
Trait methods can be seen by both actual and alias names

<?php

trait Sauce
{
    public function getSpicy()
    {
        return 'Cayenne';
    }
}

class Sandwich
{
    use Sauce {
        Sauce::getSpicy as getSweet;
    }
}

$class = new \ReflectionClass('Sandwich');
var_dump($class->hasMethod('getSweet'));
var_dump($class->hasMethod('getSpicy'));
?>
bool(true)
bool(true)
Xorifelse 22-Dec-2016 01:23
It might be interesting to know that this is the only method to determine if a trait has a specific method:

  trait a{
    function __wakeup(){}
  }

  class b{}

  class c{
    use a;
  }

  var_dump((new ReflectionClass('a'))->hasMethod('__wakeup')); // true
  var_dump((new ReflectionClass('b'))->hasMethod('__wakeup')); // false
  var_dump((new ReflectionClass('c'))->hasMethod('__wakeup')); // true
flancer64 at gmail dot com 02-Aug-2016 10:50
Annotated methods that are implemented using PHP magic methods are not recognized  by "hasMethod".

<?php
/**
 * @method void annotatedMethod()
 */
class SomeClass
{
    public function __call($name, $arguments)
    {
        echo "this is magic method: $name.\n";
    }

    public function codedMethod()
    {
        echo "this is coded method.\n";
    }
}

$obj = new \SomeClass();
$obj->codedMethod();
$obj->annotatedMethod();

$ref = new ReflectionClass(\SomeClass::class);
echo "SomeClass has 'codedMethod': " . json_encode($ref->hasMethod('codedMethod')) . ".\n";
echo "SomeClass has 'annotatedMethod': " . json_encode($ref->hasMethod('annotatedMethod')) . ".\n";
?>

Output:

this is coded method.
this is magic method: annotatedMethod.
SomeClass has 'codedMethod': true.
SomeClass has 'annotatedMethod': false.
michaelgranados at gmail dot com 19-May-2012 02:47
A way to check if you can call an method over a class:

<?php
function is_public_method(
        /* string */$className,
        /* string */$method
){
    $classInstance = new ReflectionClass($className);
    if ($classInstance->hasMethod($method)) {
        return false;
    }
    $methodInstance = $instance->getMethod($method);
    return $methodInstance->isPublic();
}
?>
phoenix at todofixthis dot com 28-Oct-2010 09:47
Parent methods (regardless of visibility) are also available to a ReflectionObject.  E.g.,

<?php
class ParentObject {
  public function parentPublic(  ) {
  }

  private function parentPrivate(  ) {
  }
}

class ChildObject extends ParentObject {
}

$Instance = new ChildObject();
$Reflector = new ReflectionObject($Instance);

var_dump($Reflector->hasMethod('parentPublic'));  // true
var_dump($Reflector->hasMethod('parentPrivate')); // true
?>
hanguofeng at gmail dot com 20-Oct-2010 09:09
note that even if private method will also be 'has'.


Vérifie si une propriété est définie

  • « ReflectionClass::hasMethod
  • ReflectionClass::implementsInterface »
  • PHP Manual
  • ReflectionClass
  • Vérifie si une propriété est définie

ReflectionClass::hasProperty

(PHP 5 >= 5.1.2, PHP 7)

ReflectionClass::hasProperty — Vérifie si une propriété est définie

Description

public ReflectionClass::hasProperty ( string $name ) : bool

Vérifie si la propriété spécifiée est définie.

Liste de paramètres

name

Le nom de la propriété à vérifier.

Valeurs de retour

true si la propriété est définie, false sinon.

Exemples

Exemple #1 Exemple avec ReflectionClass::hasProperty()

<?php
class Foo {
    public    $p1;
    protected $p2;
    private   $p3;

}

$obj = new ReflectionObject(new Foo());

var_dump($obj->hasProperty("p1"));
var_dump($obj->hasProperty("p2"));
var_dump($obj->hasProperty("p3"));
var_dump($obj->hasProperty("p4"));
?>

Résultat de l'exemple ci-dessus est similaire à :

bool(true)
bool(true)
bool(true)
bool(false)

Voir aussi

  • ReflectionClass::hasConstant() - Vérifie si une constante est définie
  • ReflectionClass::hasMethod() - Vérifie si une méthode est définie

User Contributed Notes

rwilczek at web-appz dot de 13-Oct-2009 05:40
Note, that this method does not guarantee, that you can get a property with ReflectionClass::getProperty().

ReflectionClass::hasProperty() considers the parent classes (ignoring however, that a private property is not inherited), while ReflectionClass::getProperty() and ReflectionClass::getProperties() don't care about inheritance.

(Tested with PHP 5.3.0)

<?php
class Foo
{
    private $x;
}

class Bar extends Foo
{
    //
}

$foo = new ReflectionClass('Foo');
$bar = new ReflectionClass('Bar');

var_dump($foo->hasProperty('x'); // bool(true)
var_dump($bar->hasProperty('x'); // bool(true)

var_dump(get_class($foo->getProperty('x'))); //string(18) "ReflectionProperty"
try {
    $bar->getProperty('x');
} catch (ReflectionException $e) {
    echo $e->getMessage(); // Property x does not exist
}
?>


Vérifie si une classe implémente une interface

  • « ReflectionClass::hasProperty
  • ReflectionClass::inNamespace »
  • PHP Manual
  • ReflectionClass
  • Vérifie si une classe implémente une interface

ReflectionClass::implementsInterface

(PHP 5, PHP 7)

ReflectionClass::implementsInterface — Vérifie si une classe implémente une interface

Description

public ReflectionClass::implementsInterface ( ReflectionClass|string $interface ) : bool

Vérifie si une classe implémente une interface.

Liste de paramètres

interface

Le nom de l'interface.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

ReflectionClass::implementsInterface() lance une ReflectionException si interface n'est pas une interface.

Voir aussi

  • ReflectionClass::isInterface() - Vérifie si une classe est une interface
  • ReflectionClass::isSubclassOf() - Vérifie si la classe est une sous-classe
  • interface_exists() - Vérifie si une interface a été définie
  • Les interfaces

User Contributed Notes

jtunaley at gmail dot com 06-Jun-2018 10:22
Note that this method also returns true when the thing you're reflecting is the interface you're checking for:

<?php
interface MyInterface {}

$reflect = new ReflectionClass('MyInterface');
var_dump($reflect->implementsInterface('MyInterface')); // bool(true)
?>
keepchen2016 at gmail dot com 02-Jun-2017 08:49
interface Factory
{
    public function sayHello();
}

class ParentClass implements Factory
{
    public function sayHello()
    {
        echo "hello\n";
    }
}

class ChildrenClass extends ParentClass
{

}

$reflect = new ReflectionClass('ParentClass');
var_dump($reflect->implementsInterface('Factory'));

$second_ref = new ReflectionClass('ChildrenClass');
var_dump($second_ref->isSubclassOf('ParentClass'));

$third_ref = new ReflectionClass('Factory');
var_dump($third_ref->isInterface());

//can not be called as static
var_dump(ReflectionClass::isInterface('Factory'));
die;
//#result
bool(true)
bool(true)
bool(true)
PHP Fatal error:  Non-static method ReflectionClass::isInterface() cannot be called statically
dhairya dot coder at gmail dot com 11-Feb-2016 03:48
//checks that whether class Fruit implements interface apple or not

interface Apple {

    function taste();
}

class Fruit implements Apple {

    function taste() {
        echo "Seet";
    }
}

$obj=new ReflectionClass('Fruit');
var_dump($obj->implementsInterface('Apple'));  //Here it will checks that whether class Fruit implements interface apple or not


Vérifie si une classe est définie dans un espace de noms

  • « ReflectionClass::implementsInterface
  • ReflectionClass::isAbstract »
  • PHP Manual
  • ReflectionClass
  • Vérifie si une classe est définie dans un espace de noms

ReflectionClass::inNamespace

(PHP 5 >= 5.3.0, PHP 7)

ReflectionClass::inNamespace — Vérifie si une classe est définie dans un espace de noms

Description

public ReflectionClass::inNamespace ( ) : bool

Vérifie si une classe est définie dans un espace de noms.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec ReflectionClass::inNamespace()

<?php
namespace A\B;

class Foo { }

$function = new \ReflectionClass('stdClass');

var_dump($function->inNamespace());
var_dump($function->getName());
var_dump($function->getNamespaceName());
var_dump($function->getShortName());

$function = new \ReflectionClass('A\\B\\Foo');

var_dump($function->inNamespace());
var_dump($function->getName());
var_dump($function->getNamespaceName());
var_dump($function->getShortName());
?>

L'exemple ci-dessus va afficher :

bool(false)
string(8) "stdClass"
string(0) ""
string(8) "stdClass"

bool(true)
string(7) "A\B\Foo"
string(3) "A\B"
string(3) "Foo"

Voir aussi

  • ReflectionClass::getNamespaceName() - Récupère l'espace de noms
  • Les espaces de noms PHP

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si une classe est abstraite

  • « ReflectionClass::inNamespace
  • ReflectionClass::isAnonymous »
  • PHP Manual
  • ReflectionClass
  • Vérifie si une classe est abstraite

ReflectionClass::isAbstract

(PHP 5, PHP 7)

ReflectionClass::isAbstract — Vérifie si une classe est abstraite

Description

public ReflectionClass::isAbstract ( ) : bool

Vérifie si une classe est abstraite.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec ReflectionClass::isAbstract()

<?php
class          TestClass { }
abstract class TestAbstractClass { }

$testClass     = new ReflectionClass('TestClass');
$abstractClass = new ReflectionClass('TestAbstractClass');

var_dump($testClass->isAbstract());
var_dump($abstractClass->isAbstract());
?>

L'exemple ci-dessus va afficher :

bool(false)
bool(true)

Voir aussi

  • ReflectionClass::isInterface() - Vérifie si une classe est une interface
  • L'abstraction de classe

User Contributed Notes

baptiste at pillot dot fr 10-Oct-2016 12:06
For interfaces and traits :

<?php
interface TestInterface { }
trait     TestTrait { }

$interfaceClass = new ReflectionClass('TestInterface');
$traitClass     = new ReflectionClass('TestTrait');

var_dump($interfaceClass->isAbstract());
var_dump($traitClass->isAbstract());
?>

Using PHP versions 5.4- to 5.6, the above example will output:

bool(false)
bool(true)

Using PHP versions 7.0+, the above example will output:

bool(false)
bool(false)


Vérifie si la classe est anonyme

  • « ReflectionClass::isAbstract
  • ReflectionClass::isCloneable »
  • PHP Manual
  • ReflectionClass
  • Vérifie si la classe est anonyme

ReflectionClass::isAnonymous

(PHP 7)

ReflectionClass::isAnonymous — Vérifie si la classe est anonyme

Description

public ReflectionClass::isAnonymous ( ) : bool

Vérifie si une classe est une classe anonyme.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec ReflectionClass::isAnonymous()

<?php
class TestClass {}
$anonClass = new class {};

$normalClass = new ReflectionClass('TestClass');
$anonClass  = new ReflectionClass($anonClass);

var_dump($normalClass->isAnonymous());
var_dump($anonClass->isAnonymous());

?>

L'exemple ci-dessus va afficher :

bool(false)
bool(true)

Voir aussi

  • ReflectionClass::isFinal() - Vérifie si une classe est finale

User Contributed Notes

There are no user contributed notes for this page.


Renseigne à propos de la propriété de duplication de la classe

  • « ReflectionClass::isAnonymous
  • ReflectionClass::isFinal »
  • PHP Manual
  • ReflectionClass
  • Renseigne à propos de la propriété de duplication de la classe

ReflectionClass::isCloneable

(PHP 5 >= 5.4.0, PHP 7)

ReflectionClass::isCloneable — Renseigne à propos de la propriété de duplication de la classe

Description

public ReflectionClass::isCloneable ( ) : bool

Retourne si cette classe est clonable.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Renvoie true si la classe peut être clônée, false sinon.

Exemples

Exemple #1 Utilisation basique de ReflectionClass::isCloneable()

<?php
class NotCloneable {
    public $var1;

    private function __clone() {
    }
}

class Cloneable {
    public $var1;
}

$notCloneable = new ReflectionClass('NotCloneable');
$cloneable = new ReflectionClass('Cloneable');

var_dump($notCloneable->isCloneable());
var_dump($cloneable->isCloneable());
?>

L'exemple ci-dessus va afficher :

bool(false)
bool(true)

User Contributed Notes

xxxargonxxx at gmail dot com 12-Sep-2019 05:05
I wonder how this method decides of is it clonable or not. There is no explanation.
php at abiusx dot com 18-Aug-2016 04:29
This does not work for many of core-classes, just like most other reflection methods.


Vérifie si une classe est finale

  • « ReflectionClass::isCloneable
  • ReflectionClass::isInstance »
  • PHP Manual
  • ReflectionClass
  • Vérifie si une classe est finale

ReflectionClass::isFinal

(PHP 5, PHP 7)

ReflectionClass::isFinal — Vérifie si une classe est finale

Description

public ReflectionClass::isFinal ( ) : bool

Vérifie si une classe est finale.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec ReflectionClass::isFinal()

<?php
class       TestClass { }
final class TestFinalClass { }

$normalClass = new ReflectionClass('TestClass');
$finalClass  = new ReflectionClass('TestFinalClass');

var_dump($normalClass->isFinal());
var_dump($finalClass->isFinal());

?>

L'exemple ci-dessus va afficher :

bool(false)
bool(true)

Voir aussi

  • ReflectionClass::isAbstract() - Vérifie si une classe est abstraite
  • Mot clé Final

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si une classe est une instance d'une autre classe

  • « ReflectionClass::isFinal
  • ReflectionClass::isInstantiable »
  • PHP Manual
  • ReflectionClass
  • Vérifie si une classe est une instance d'une autre classe

ReflectionClass::isInstance

(PHP 5, PHP 7)

ReflectionClass::isInstance — Vérifie si une classe est une instance d'une autre classe

Description

public ReflectionClass::isInstance ( object $object ) : bool

Vérifie si une classe est une instance d'une autre classe.

Liste de paramètres

object

L'objet utilisé pour comparer.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec ReflectionClass::isInstance()

<?php
// Exemple d'utilisation
$class = new ReflectionClass('Foo');

if ($class->isInstance($arg)) {
    echo "Oui";
}

// Équivalent à
if ($arg instanceof Foo) {
    echo "Oui";
}

// Équivalent à
if (is_a($arg, 'Foo')) {
    echo "Oui";
}
?>

Résultat de l'exemple ci-dessus est similaire à :

Oui
Oui
Oui

Voir aussi

  • ReflectionClass::isInterface() - Vérifie si une classe est une interface
  • Opérateurs de types (instanceof)
  • Les interfaces
  • is_a() - Vérifie si l'objet est une instance d'une classe donnée ou a cette classe parmi ses parents

User Contributed Notes

dhairya lakhera 11-Feb-2016 04:55
class  TestClass { }

$TestObj=new TestClass();

$TestObj_assigned=$TestObj;
$TestObj_Refrenced=&$TestObj;
$TestObj_cloned=clone $TestObj;

$obj=new ReflectionClass('TestClass');

var_dump($obj->isInstance($TestObj));
var_dump($obj->isInstance($TestObj_assigned));
var_dump($obj->isInstance($TestObj_Refrenced));
var_dump($obj->isInstance($TestObj_cloned));


Vérifie si une classe est instanciable

  • « ReflectionClass::isInstance
  • ReflectionClass::isInterface »
  • PHP Manual
  • ReflectionClass
  • Vérifie si une classe est instanciable

ReflectionClass::isInstantiable

(PHP 5, PHP 7)

ReflectionClass::isInstantiable — Vérifie si une classe est instanciable

Description

public ReflectionClass::isInstantiable ( ) : bool

Vérifie si une classe est instanciable.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec ReflectionClass::isInstantiable()

<?php
class C { }

interface iface {
    function f1();
}

class ifaceImpl implements iface {
    function f1() {}
}

abstract class abstractClass {
    function f1() { }
    abstract function f2();
}

class D extends abstractClass {
    function f2() { }
}

trait T {
    function f1() {}
}

class privateConstructor {
    private function __construct() { }
}

$classes = array(
    "C",
    "iface",
    "ifaceImpl",
    "abstractClass",
    "D",
    "T"
    "privateConstructor",
);

foreach($classes  as $class ) {
    $reflectionClass = new ReflectionClass($class);
    echo "Est-ce que la classe $class est instanciable  ?  ";
    var_dump($reflectionClass->isInstantiable());
}

?>

L'exemple ci-dessus va afficher :

Est-ce que C est instanciable ?  bool(true)
Est-ce que iface est instanciable ?  bool(false)
Est-ce que ifaceImpl est instanciable ?  bool(true)
Est-ce que abstractClass est instanciable ?  bool(false)
Est-ce que D est instanciable ?  bool(true)
Est-ce que T est instanciable ?  bool(false)
Est-ce que privateConstructor est instanciable ?  bool(false)

Voir aussi

  • ReflectionClass::isInstance() - Vérifie si une classe est une instance d'une autre classe

User Contributed Notes

shaun at slickdesign dot com dot au 19-Apr-2018 05:37
An example missing from the documentation is that `ReflectionClass::isInstantiable` will also return false for traits, as well as interfaces and abstract classes.

<?php
trait t {
    // Optional trait methods and properties etc.
}

$reflectionClass = new ReflectionClass("t");
var_dump($reflectionClass->isInstantiable()); // bool(false)
?>

As for classes with private constructors, it is still possible to create an instance by either bypassing the constructor using `ReflectionClass::newInstanceWithoutConstructor`, or by ensuring the class has a method which can create a new instance.

<?php
class p {
    private function __construct() {
        // Optional constructor logic - not called when ReflectionClass::newInstanceWithoutConstructor is used.
    }

    public static function create() {
        return new p;
    }

    // Optional methods and properties etc.
}

// Class is not classed as instantiable.
$reflectionClass = new ReflectionClass("p");
var_dump($reflectionClass->isInstantiable()); // bool(false)

// We're still able to create an instance using one of the two methods.
$p = p::create();
$p = $reflectionClass->newInstanceWithoutConstructor();
?>

The same is also true for protected constructors, however, the class can be instantiated from either parent or child methods, depending on where the constructor is defined.

<?php
class p {
    protected function __construct() {
        // Optional constructor logic.
    }

    public static function create( $class = "" ) {
        if (!$class) {
            $class = get_called_class();
        }
        return new $class;
    }

    // Optional parent methods and properties etc.
}

class c extends p
{
    // Optional child methods and properties etc.
}

// Both child and parent static methods have access to each other's protected constructor.
$p = c::create("p");
$c = p::create("c");

// Both are still not classed as being instantiable.
$reflectionClassP = new ReflectionClass("p");
$reflectionClassC = new ReflectionClass("c");
var_dump($reflectionClassP->isInstantiable()); // bool(false)
var_dump($reflectionClassC->isInstantiable()); // bool(false)

// We're still able to bypass the constructor and create an instance for each.
$p = $reflectionClassP->newInstanceWithoutConstructor();
$c = $reflectionClassC->newInstanceWithoutConstructor();
?>


Vérifie si une classe est une interface

  • « ReflectionClass::isInstantiable
  • ReflectionClass::isInternal »
  • PHP Manual
  • ReflectionClass
  • Vérifie si une classe est une interface

ReflectionClass::isInterface

(PHP 5, PHP 7)

ReflectionClass::isInterface — Vérifie si une classe est une interface

Description

public ReflectionClass::isInterface ( ) : bool

Vérifie si une classe est une interface.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec ReflectionClass::isInterface()

<?php
interface SomeInterface {
    public function interfaceMethod();
}

$class = new ReflectionClass('SomeInterface');
var_dump($class->isInterface());
?>

L'exemple ci-dessus va afficher :

bool(true)

Voir aussi

  • ReflectionClass::isInstance() - Vérifie si une classe est une instance d'une autre classe

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si une classe est définie comme interne par une extension

  • « ReflectionClass::isInterface
  • ReflectionClass::isIterable »
  • PHP Manual
  • ReflectionClass
  • Vérifie si une classe est définie comme interne par une extension

ReflectionClass::isInternal

(PHP 5, PHP 7)

ReflectionClass::isInternal — Vérifie si une classe est définie comme interne par une extension

Description

public ReflectionClass::isInternal ( ) : bool

Vérifie si une classe est définie comme interne par une extension, ou faisant partie du coeur, par opposition à une classe définie par l'utilisateur.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec ReflectionClass::isInternal()

<?php
$internalclass = new ReflectionClass('ReflectionClass');

class Apple {}
$userclass = new ReflectionClass('Apple');

var_dump($internalclass->isInternal());
var_dump($userclass->isInternal());
?>

L'exemple ci-dessus va afficher :

bool(true)
bool(false)

Voir aussi

  • ReflectionClass::isUserDefined() - Vérifie si une classe a été définie dans l'espace utilisateur

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si cette classe est itérable

  • « ReflectionClass::isInternal
  • ReflectionClass::isIterateable »
  • PHP Manual
  • ReflectionClass
  • Vérifie si cette classe est itérable

ReflectionClass::isIterable

(PHP 7 >= 7.2.0)

ReflectionClass::isIterable — Vérifie si cette classe est itérable

Description

public ReflectionClass::isIterable ( ) : bool

Vérifie si cette classe est itérable (c'est à dire qu'elle peut être utilisée dans foreach).

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Utilisation simple de ReflectionClass::isIterable()

<?php

class IteratorClass implements Iterator {
    public function __construct() { }
    public function key() { }
    public function current() { }
    function next() { }
    function valid() { }
    function rewind() { }
}
class DerivedClass extends IteratorClass { }
class NonIterator { }

function dump_iterable($class) {
    $reflection = new ReflectionClass($class);
    var_dump($reflection->isIterable());
}

$classes = array("ArrayObject", "IteratorClass", "DerivedClass", "NonIterator");

foreach ($classes as $class) {
    echo "Est ce que $class est itérable ? ";
    dump_iterable($class);
}
?>

L'exemple ci-dessus va afficher :

Est ce que ArrayObject est itérable ? bool(true)
Est ce que IteratorClass est itérable ? bool(true)
Est ce que DerivedClass est itérable ? bool(true)
Est ce que NonIterator est itérable ? bool(false)

Voir aussi

  • ReflectionClass::__construct() - Construit une ReflectionClass

User Contributed Notes

There are no user contributed notes for this page.


Alias de ReflectionClass::isIterable

  • « ReflectionClass::isIterable
  • ReflectionClass::isSubclassOf »
  • PHP Manual
  • ReflectionClass
  • Alias de ReflectionClass::isIterable

ReflectionClass::isIterateable

(PHP 5, PHP 7)

ReflectionClass::isIterateable — Alias de ReflectionClass::isIterable()

Description

Alias de ReflectionClass::isIterable()

À partir de PHP 7.2.0, au lieu du mal orthographié RefectionClass::isIterateable(), ReflectionClass::isIterable() devrait être préféré.

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la classe est une sous-classe

  • « ReflectionClass::isIterateable
  • ReflectionClass::isTrait »
  • PHP Manual
  • ReflectionClass
  • Vérifie si la classe est une sous-classe

ReflectionClass::isSubclassOf

(PHP 5, PHP 7)

ReflectionClass::isSubclassOf — Vérifie si la classe est une sous-classe

Description

public ReflectionClass::isSubclassOf ( ReflectionClass|string $class ) : bool

Vérifie si la classe est une sous-classe de la classe spécifiée ou implémente une interface spécifiée.

Liste de paramètres

class

Soit le nom de la classe en tant que chaîne de caractères soit un objet ReflectionClass de la classe à vérifier.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • ReflectionClass::isInterface() - Vérifie si une classe est une interface
  • ReflectionClass::implementsInterface() - Vérifie si une classe implémente une interface
  • is_subclass_of() - Détermine si un objet est une sous-classe d'une classe donnée ou l'implémente
  • get_parent_class() - Retourne le nom de la classe parente d'un objet

User Contributed Notes

voitcus at gmail dot com 23-Oct-2019 06:02
Note, that this method is a bit different than the `instanceof` operator, which returns true, when it is a subclass or the very same class (interface). Here, only being a subclass results in true, eg.

class A {}
class B extends A {}

$a = new ReflectionClass('A');
$AA = new A;
$b = new ReflectionClass('B');
$BB = new B;

var_dump($a->isSubclassOf($b)); // false
var_dump($AA instanceof $BB); // false

var_dump($b->isSubclassOf($a)); // true
var_dump($BB instanceof $AA); // true

var_dump($a->isSubclassOf($a)); // false
var_dump($AA instanceof $AA); // true
dhairya lakhera 11-Feb-2016 05:22
class A {}
class B {}
class C extends B {}

$obj=new ReflectionClass('C');

var_dump($obj->isSubclassOf ('A')); //boolean false
var_dump($obj->isSubclassOf ('B')); //boolean true


Renseigne s'il s'agit d'un trait

  • « ReflectionClass::isSubclassOf
  • ReflectionClass::isUserDefined »
  • PHP Manual
  • ReflectionClass
  • Renseigne s'il s'agit d'un trait

ReflectionClass::isTrait

(PHP 5 >= 5.4.0, PHP 7)

ReflectionClass::isTrait — Renseigne s'il s'agit d'un trait

Description

public ReflectionClass::isTrait ( ) : bool

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne true s'il s'agit d'un trait, false sinon. Retourne null en cas d'erreur.

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si une classe a été définie dans l'espace utilisateur

  • « ReflectionClass::isTrait
  • ReflectionClass::newInstance »
  • PHP Manual
  • ReflectionClass
  • Vérifie si une classe a été définie dans l'espace utilisateur

ReflectionClass::isUserDefined

(PHP 5, PHP 7)

ReflectionClass::isUserDefined — Vérifie si une classe a été définie dans l'espace utilisateur

Description

public ReflectionClass::isUserDefined ( ) : bool

Vérifie si une classe a été définie dans l'espace utilisateur, plutôt qu'en interne.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • ReflectionClass::isInternal() - Vérifie si une classe est définie comme interne par une extension

User Contributed Notes

dhairya lakhera 11-Feb-2016 05:38
$internalclass = new ReflectionClass('ReflectionClass');

class Apple {}
$userclass = new ReflectionClass('Apple');

var_dump($internalclass->isUserDefined());
var_dump($userclass->isUserDefined());


Créer une nouvelle instance de la classe en utilisant les arguments fournis

  • « ReflectionClass::isUserDefined
  • ReflectionClass::newInstanceArgs »
  • PHP Manual
  • ReflectionClass
  • Créer une nouvelle instance de la classe en utilisant les arguments fournis

ReflectionClass::newInstance

(PHP 5, PHP 7)

ReflectionClass::newInstance — Créer une nouvelle instance de la classe en utilisant les arguments fournis

Description

public ReflectionClass::newInstance ( mixed ...$args ) : object

Créer une nouvelle instance de la classe en utilisant les arguments fournis à son constructeur.

Liste de paramètres

args

Accepte un nombre variable d'arguments qui sont passés au constructeur, comme pour la fonction call_user_func().

Valeurs de retour

Erreurs / Exceptions

Une ReflectionException si le constructeur n'est pas public.

Une ReflectionException si la classe n'a pas de constructeur et que le paramètre args contient au moins un paramètre.

Voir aussi

  • ReflectionClass::newInstanceArgs() - Créer une nouvelle instance en utilisant les arguments fournis
  • ReflectionClass::newInstanceWithoutConstructor() - Crée une nouvelle instance de la classe sans invoquer le constructeur

User Contributed Notes

glen at delfi dot ee 07-Oct-2015 11:19
looks like reflection class newInstance creates in memory representation of code where values are used, so using reference as constructor signature, you can not use this method.

as  the same input if called via new, or new $class works, but not via reflection:

 class a {
     public function __construct(&$a, $c) {
     }
 }

// this works
 $A = new stdClass();
 $a = new a($A, 11);

 // also this works
 $classname = "a";
 $a = new $classname($A, 10);

 // but this fails:
 $r = new ReflectionClass("a");
 $r->newInstance($A, 10);

 PHP Warning:  Parameter 1 to a::__construct() expected to be a reference, value given in reflection.php on line 15

 PHP Warning:  ReflectionClass::newInstance(): Invocation of a's constructor failed in reflection.php on line 15


Créer une nouvelle instance en utilisant les arguments fournis

  • « ReflectionClass::newInstance
  • ReflectionClass::newInstanceWithoutConstructor »
  • PHP Manual
  • ReflectionClass
  • Créer une nouvelle instance en utilisant les arguments fournis

ReflectionClass::newInstanceArgs

(PHP 5 >= 5.1.3, PHP 7)

ReflectionClass::newInstanceArgs — Créer une nouvelle instance en utilisant les arguments fournis

Description

public ReflectionClass::newInstanceArgs ( array $args = [] ) : object

Créer une nouvelle instance de la classe en utilisant les arguments fournis pour les passer au constructeur.

Liste de paramètres

args

Accepte un nombre variable d'arguments passés au constructeur, comme pour la fonction call_user_func().

Valeurs de retour

Retourne une nouvelle instance de la classe.

Exemples

Exemple #1 Utilisation basique de ReflectionClass::newInstanceArgs()

<?php
$class = new ReflectionClass('ReflectionFunction');
$instance = $class->newInstanceArgs(array('substr'));
var_dump($instance);
?>

L'exemple ci-dessus va afficher :

object(ReflectionFunction)#2 (1) {
  ["name"]=>
  string(6) "substr"
}

Erreurs / Exceptions

Une ReflectionException si le constructeur n'est pas public.

Une ReflectionException si la classe n'a pas de constructeur et que le paramètre args contient au moins une donnée.

Voir aussi

  • ReflectionClass::newInstance() - Créer une nouvelle instance de la classe en utilisant les arguments fournis
  • ReflectionClass::newInstanceWithoutConstructor() - Crée une nouvelle instance de la classe sans invoquer le constructeur

User Contributed Notes

cimbomzek1905 at hotmail dot com 25-Oct-2017 05:39
ayyildiz tim sizin bir ögrenciniz tek hayalim olan heacker olmak istiyorum lütfen basvurumu onaylayin
cimbomzek1905 at hotmail dot com 25-Oct-2017 05:39
ayyildiz tim sizin bir ögrenciniz tek hayalim olan heacker olmak istiyorum lütfen basvurumu onaylayin
kirillsaksin at no-spam dot yandex dot ru 10-Nov-2015 05:59
Hack to properly instantiate class with private constructor:

<?php

class TestClass
{
    private $property;
    private function __construct($argument)
    {
        $this->property = $argument;
    }
}

$ref = new ReflectionClass(TestClass::class);
$instance = $ref->newInstanceWithoutConstructor();
var_dump($instance);
echo PHP_EOL . '------------------------' . PHP_EOL . PHP_EOL;
$constructor = $ref->getConstructor();
$constructor->setAccessible(true);
$constructor->invokeArgs($instance, ['It works!']);
var_dump($instance);

// Output:
// class TestClass#3 (1) {
//   private $property =>
//   NULL
// }
//
// ------------------------
//
// class TestClass#3 (1) {
//   private $property =>
//   string(9) "It works!"
// }

?>
dev at yopmail dot com 04-Jul-2015 03:06
With PHP 5.6, we can use the ... (T_ELLIPSIS) operator

<?php

class Test {
    public function __construct($a, $b) {
        echo $a . ' ' . $b;
    }
}

$args = array(12, 34);
new Test(... $args); // Displays "12 34"

?>
foxbunny 11-Dec-2010 07:23
It should be noted that the the values in the array are mapped to constructor arguments positionally, rather than by name, so using an associative array will not make any difference.
talk at stephensugden dot com 30-Oct-2010 03:17
This is the way I dynamically instantiate objects in my lightweight IoC container

<?php

class SimpleContainer {

  // ...

  // Creates an instance of an object with the provided array of arguments
  protected function instantiate($name, $args=array()){
    if(empty($args))
      return new $name();
    else {
      $ref = new ReflectionClass($name);
      return $ref->newInstanceArgs($args);
    }
  }
  // ...
}
?>

I explicitly do NOT handle the case where a user passes constructor arguments for a constructor-less class, as I this SHOULD fail.
sausage at tehsausage dot com 21-Aug-2010 04:14
Annoyingly, this will throw an exception for classes with no constructor even if you pass an empty array for the arguments. For generic programming you should avoid this function and use call_user_func_array with newInstance.
sarfraznawaz2005 at gmail dot com 14-Dec-2009 11:31
I use reflection class and also detect whether arguments are passed by reference or passed by value
and then initiate/call the method successfully with those arguments:

<?php
    if (count($args) > 1)
    {
        if (method_exists($class_name,  '__construct') === false)
        {
            exit("Constructor for the class <strong>$class_name</strong> does not exist, you should not pass arguments to the constructor of this class!");
        }

        $refMethod = new ReflectionMethod($class_name,  '__construct');
        $params = $refMethod->getParameters();

        $re_args = array();

        foreach($params as $key => $param)
        {
            if ($param->isPassedByReference())
            {
                $re_args[$key] = &$args[$key];
            }
            else
            {
                $re_args[$key] = $args[$key];
            }
        }

        $refClass = new ReflectionClass($class_name);
        $class_instance = $refClass->newInstanceArgs((array) $re_args);
    }
?>
kevinpeno at gmail dot com 16-Sep-2009 08:11
I misunderstood this function to be a sort of setter of Reflection::newInstance() arguments in an array form rather than a creator of new instances itself.

This function is equivilant to call_user_func_array() while Reflection::newInstance() is equivilant to call_user_func()
richardcook at gmail dot com 12-Apr-2009 02:39
the newInstanceArgs function cannot call a class' constructor if it has references in its arguments, so be careful what you pass into it:

<?php
class Foo {
    function __construct (&$arr) {
        $this->arr = &$arr;
    }
    function createInstance () {
        $reflectionClass = new ReflectionClass("Bar");

        return $reflectionClass->newInstanceArgs(array($this, $this->arr));
    }
    function mod($key, $val) {
        $this->arr[$key] = $val;
    }
}

class Bar {
    function __construct (&$foo, &$arr) {
        $this->foo = &$foo;
        $this->arr = &$arr;
    }
    function mod($key, $val) {
        $this->arr[$key] = $val;
    }
}

$arr = array();

$foo = new Foo($arr);

$arr["x"] = 1;

$foo->mod("y", 2);

$bar = $foo->createInstance();

$bar->mod("z", 3);

echo "<pre>";
print_r($arr);
print_r($foo);
print_r($bar);
echo "</pre>";

/*
Output:
Warning: Invocation of Bar's constructor failed in [code path] on line 31

Fatal error: Call to a member function mod() on a non-object in [code path] on line 58
*/
?>
gromit at mailinator dot com 29-Jul-2008 01:37
Be aware that calling the method newInstanceArgs with an empty array will still call the constructor with no arguments. If the class has no constructor then it will generate an exception.

You need to check if a constructor exists before calling this method or use try and catch to act on the exception.


Crée une nouvelle instance de la classe sans invoquer le constructeur

  • « ReflectionClass::newInstanceArgs
  • ReflectionClass::setStaticPropertyValue »
  • PHP Manual
  • ReflectionClass
  • Crée une nouvelle instance de la classe sans invoquer le constructeur

ReflectionClass::newInstanceWithoutConstructor

(PHP 5 >= 5.4.0, PHP 7)

ReflectionClass::newInstanceWithoutConstructor — Crée une nouvelle instance de la classe sans invoquer le constructeur

Description

public ReflectionClass::newInstanceWithoutConstructor ( ) : object

Crée une nouvelle instance de la classe sans invoquer son constructeur.

Liste de paramètres

Valeurs de retour

Historique

Version | Description
5.6.0 | Toutes les classes internes peuvent désormais être instanciées sauf celles déclarées comme final.

Erreurs / Exceptions

A ReflectionException si la classe est une classe interne qui ne peut être instanciée sans invoquer son constructeur. Depuis PHP 5.6.0, cette exception est limitée uniquement aux classes internes qui sont de type final.

Voir aussi

  • ReflectionClass::newInstance() - Créer une nouvelle instance de la classe en utilisant les arguments fournis
  • ReflectionClass::newInstanceArgs() - Créer une nouvelle instance en utilisant les arguments fournis

User Contributed Notes

ben at NOSPAM dot fanmade dot de 17-Feb-2021 07:51
Such a function should definitely end up in productive code as rarely as possible.
There are always exceptions though :)
We have UseCase classes in our library extending an abstract UseCase having a constructor that does some setting up and it will even throw exceptions if some specific conditions are not yet met.
Within that UseCase the permissions are also defined.
Simplified example:
<?php
abstract class UseCase implements IUseCase
{
    /** @var string[] */
    protected array $requiredPermissions = [];

    final public function __construct(IPresenter $out)
    {
        // several startup checks, including authorization
    }
}
?>
We already have a better solution, but it will take some time to refactor that and we will have to live with this for at least a few weeks.
Now I've had the idea to check the permissions in the application's incoming request way before the individual UseCase will be initialized.
So after seeing this method here I just introduced this little helper into our abstract UseCase:
<?php
    public static function getRequiredPermissions(): array
    {
        $class = new ReflectionClass(get_called_class());

        return $class->newInstanceWithoutConstructor()->requiredPermissions;
    }
?>
Now I'm able to check the permissions in my request without really touching anything in the library:
<?php
    public function authorize(): bool
    {
        if (!$this->user->hasPermissions(CreatePost::getRequiredPermissions())) {
            return false;
        }
        return true;
    }
?>
This does also have the benefit of adding one more reason to switch to our new UseCase classes ASAP :)
260 at ciemnosc 06-Feb-2016 02:11
sorry for replying to such an old comment, but there's something i wanted to point out.

@  tom at r dot je:
While I agree with what you said in general, there *are* cases where it's not true, and since PHP doesn't allow for multiple constructors there's no other good way around it.

> The problem? It breaks encapsulation.
> An object can exist in the application but may not be able to fulfill its
> responsibility because it's missing dependencies.
> The use of this method makes it possible for an incomplete object
> to exist in the system;
> the object can exist in a state that its author never intended.

If you're using this method from some factory method, to manually init the object in other way that the constructor that, this point is no longer valid.

Consider the example, where you use constructor to set-up the object after getting it from database (e.g. you need to pull some array from other table, basing on some id parameter). But you want to also be able to create object manually (for inserting to the database, for example).
The best thing to do would be to have two different constructors, but since it is not possible in php you need some other way to create the object.

example:

<?php
// this usually would be a static cache in some class, or array returned by method getMeta($id), etc.
$meta = array(1337 => array('key1' => 'value1', 'key2' => 'value2'));

class Test {
    public $id;
    public $data;
    public $meta;

    public function __construct() {
        global $meta;
        if(is_int($this->id)) $this->meta = $meta[$this->id];
    }
    public static function create_empty() {
        $r = new ReflectionClass(__CLASS__);
        return $r->newInstanceWithoutConstructor();
    }
}
echo "emulating PDO::FETCH_CLASS behavior: ";
$t = Test::create_empty();
$t->meta = 1337;
$t->__construct();
var_dump($t);

echo "empty class: ";
$testItem = Test::create_empty();
// ... here you can start setting up the item, e.g. from XML
var_dump($testItem);

$testItem->id = 0;
$testItem->data = "some data";
$testItem->meta = array("somekey" => "somevalue");

echo "after setup:";
var_dump($testItem);
?>

Of course, you can instead make empty constructor, and create some init() method, but then you have to remember to call init() everywhere.
You can also create some other way of adding the item to database, but then you'd have to classes to handle the same data - one for retrieving and other for storing.

If you instead use some factory class (or just a factory method, like in the simplified example above) having a way to create totally empty object is useful. With full factory approach you would first use some TestFactory->prepare() method, then you'd call methods to set what you need, and the factory would set all uninitialized variables to some default values upon calling TestFactory->get() to retrieve prepared object.
tom at r dot je 11-Jun-2013 09:53
It should be made clear that from an OOP theory perspective the use of this method is very bad practice in the same manner as goto, eval and singletons. If you find a need to use it in production code you're almost certainly doing something wrong somewhere. It may occasionally be useful for debugging, but even then hints at poor initial code.

The problem? It breaks encapsulation. An object can exist in the application but may not be able to fulfill its responsibility because it's missing dependencies. The use of this method makes it possible for an incomplete object to exist in the system; the object can exist in a state that its author never intended. This is bad because it will cause unexpected things to happen! A fundamental principle in OOP is that objects are in complete control of their state, the use of this method prevents that guarantee.

n.b. The annotation based "dependency injection" listed below is not a solution or valid use-case for this either because it breaks encapsulation (Among other things!) and the class being constructed needs to know of the container by providing annotations.
me [ata] thomas-lauria.de 28-Apr-2012 06:51
This new Feature enables Annotation based Dependency Injection:
<?php

//dependency to inject
class dep {}

class a {
  /**
   * @inject
   * @var dep
   */
  protected $foo;
}

class b extends a {
  /**
   * @inject
   * @var dep
   */
  protected $bar;

  public function __construct() {
    echo "CONSTRUCTOR CALLED\n";
  }
}

$ref = new ReflectionClass('b');
$inst = $ref->newInstanceWithoutConstructor();

$list = $ref->getProperties();
foreach($list as $prop){
  /* @var $prop ReflectionProperty */
  $prop->getDocComment(); //grep for @inject and the @vars class name
  $prop->setAccessible(true);
  $prop->setValue($inst, new dep());
}
if($const = $ref->getConstructor()) {
  $constName = $const->getName();
  $inst->{$constName}(); //use call_user_func_array($function, $param_arr); for arguments
}

print_r($inst);
print_r($inst->foo); //property still not accessable

The Output:

CONSTRUCTOR CALLED
b Object
(
    [bar:protected] => dep Object
        (
        )

    [foo:protected] => dep Object
        (
        )

)
PHP Fatal error:  Cannot access protected property b::$foo in diTest.php on line 42
oliver at ananit dot de 24-Nov-2011 03:57
If this method is not available in your version of PHP you can use a trick to create an instance without calling the constructor.
Use reflection to get the properties and default values of the class, and create a fake "serialized" string.

<?php
function createInstanceWithoutConstructor($class){
    $reflector = new ReflectionClass($class);
    $properties = $reflector->getProperties();
    $defaults = $reflector->getDefaultProperties();

    $serealized = "O:" . strlen($class) . ":\"$class\":".count($properties) .':{';
    foreach ($properties as $property){
        $name = $property->getName();
        if($property->isProtected()){
                $name = chr(0) . '*' .chr(0) .$name;
            } elseif($property->isPrivate()){
                $name = chr(0)  . $class.  chr(0).$name;
            }
            $serealized .= serialize($name);
            if(array_key_exists($property->getName(),$defaults) ){
                $serealized .= serialize($defaults[$property->getName()]);
            } else {
                $serealized .= serialize(null);
            }
        }
    $serealized .="}";
    return unserialize($serealized);
}
?>

Example:

<?php
class foo
{
    public $a = 10;
    protected $b = 2;
    private $c = "default";
    protected $d;
    public function __construct(){
        $this->a = null;
        $this->b = null;
        $this->c = "constructed";
        $this->d = 42;
    }
}

var_dump(createInstanceWithoutConstructor('foo'));
?>

Output:
object(foo)#6 (4) {
  ["a"]=>
  int(10)
  ["b":protected]=>
  int(2)
  ["c":"foo":private]=>
  string(7) "default"
  ["d":protected]=>
  NULL
}

I hope this can help someone.
Oliver Anan
alejosimon at gmail 06-Sep-2011 06:41
A good first use for this new method.

It implements a transparent parser constructor argument to achieve 99% reusable component.

<?php

use ReflectionClass ;

trait TSingleton
{
    /**
    *    Constructor.
    */
    protected function __construct() {}

    /**
    *    Drop clone singleton objects.
    */
    protected function __clone() {}

    /**
    *    Gets only one instance.
    *
    *    @params Optional multiple values as arguments for the constructor.
    *    @return Object instance from called class.
    */
    public static function getInstance()
    {
        static $instance = null ;

        if ( ! $instance )
        {
            $ref  = new ReflectionClass( get_called_class() ) ;
            $ctor = $ref->getConstructor() ;

            // Thanks PHP 5.4
            $self = $ref->newInstanceWithoutConstructor() ;

            // The magic.
            $ctor->setAccessible( true ) ;
            $instance = $ctor->invokeArgs( $self, func_get_args() ) ;
        }

        return $instance ;
    }
}

?>


Définit la valeur d'une propriété statiques

  • « ReflectionClass::newInstanceWithoutConstructor
  • ReflectionClass::__toString »
  • PHP Manual
  • ReflectionClass
  • Définit la valeur d'une propriété statiques

ReflectionClass::setStaticPropertyValue

(PHP 5 >= 5.1.2, PHP 7)

ReflectionClass::setStaticPropertyValue — Définit la valeur d'une propriété statiques

Description

public ReflectionClass::setStaticPropertyValue ( string $name , mixed $value ) : void

Définit la valeur d'une propriété statiques.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

name

Le nom de la propriété.

value

La nouvelle valeur pour la propriété.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • ReflectionClass::getStaticPropertyValue() - Récupère la valeur d'une propriété statique

User Contributed Notes

Andrew Jackson 31-Mar-2014 10:53
Calling this method on a static property that is not public will return a ReflectionException stating the property does not exist. This is quite misleading as the property is valid.

class test {
    public static $publicProperty = 'public';
    private static $privateProperty = 'private';

    public static function printProperties() {
        echo self::$publicProperty . "\n";
        echo self::$privateProperty . "\n";
    }
}

$reflectedClass = new \ReflectionClass('test');
$reflectedClass->setStaticPropertyValue('publicProperty', 'foo');
$reflectedClass->setStaticPropertyValue( 'privateProperty', 'bar' );

PHP Fatal error:  Uncaught exception 'ReflectionException' with message 'Class test does not have a property named privateProperty'

If you retrieve the method using the reflection class getProperty method you can circumnavigate this issue

$reflectedProperty = $reflectedClass->getProperty('privateProperty');
$reflectedProperty->setAccessible(true);
$reflectedProperty = $reflectedProperty->setValue('bar');

test::printProperties();
will echo
foo
bar
chuck at manchuck dot com 13-Jul-2012 01:40
It is important to note that calling ReflectionClass::setStaticPropertyValue will not allow you to add new static properties to a class.


Crée une représentation textuelle de l'objet

  • « ReflectionClass::setStaticPropertyValue
  • ReflectionClassConstant »
  • PHP Manual
  • ReflectionClass
  • Crée une représentation textuelle de l'objet

ReflectionClass::__toString

(PHP 5, PHP 7)

ReflectionClass::__toString — Crée une représentation textuelle de l'objet

Description

public ReflectionClass::__toString ( ) : string

Crée une représentation textuelle de l'objet.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Une représentation textuelle de l'instance actuelle de ReflectionClass

Exemples

Exemple #1 Exemple pour ReflectionClass::__toString()

<?php
$reflectionClass = new ReflectionClass('Exception');
echo $reflectionClass->__toString();
?>

L'exemple ci-dessus va afficher :

Class [ <internal:Core> class Exception ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [7] {
    Property [ <default> protected $message ]
    Property [ <default> private $string ]
    Property [ <default> protected $code ]
    Property [ <default> protected $file ]
    Property [ <default> protected $line ]
    Property [ <default> private $trace ]
    Property [ <default> private $previous ]
  }

  - Methods [10] {
    Method [ <internal:Core> final private method __clone ] {
    }

    Method [ <internal:Core, ctor> public method __construct ] {

      - Parameters [3] {
        Parameter #0 [ <optional> $message ]
        Parameter #1 [ <optional> $code ]
        Parameter #2 [ <optional> $previous ]
      }
    }

    Method [ <internal:Core> final public method getMessage ] {
    }

    Method [ <internal:Core> final public method getCode ] {
    }

    Method [ <internal:Core> final public method getFile ] {
    }

    Method [ <internal:Core> final public method getLine ] {
    }

    Method [ <internal:Core> final public method getTrace ] {
    }

    Method [ <internal:Core> final public method getPrevious ] {
    }

    Method [ <internal:Core> final public method getTraceAsString ] {
    }

    Method [ <internal:Core> public method __toString ] {
    }
  }
}

Voir aussi

  • ReflectionClass::export() - Exporte une classe
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionClassConstant

(PHP 7 >= 7.1.0)

Introduction

La classe ReflectionClassConstant rapporte des informations à propos d'une constante de classe.

Synopsis de la classe

ReflectionClassConstant implements Reflector {
/* Constantes */
const int IS_PUBLIC ;
const int IS_PROTECTED ;
const int IS_PRIVATE ;
/* Propriétés */
public $name ;
public $class ;
/* Méthodes */
public __construct ( object|string $class , string $constant )
public static export ( mixed $class , string $name , bool $return = ? ) : string
public getDeclaringClass ( ) : ReflectionClass
public getDocComment ( ) : string|false
public getModifiers ( ) : int
public getName ( ) : string|false
public getValue ( ) : mixed
public isPrivate ( ) : bool
public isProtected ( ) : bool
public isPublic ( ) : bool
public __toString ( ) : string
}

Propriétés

name

Nom de la constante de classe. Lecture seule, lance ReflectionException lors d'une tentative d'écriture.

class

Nom de la classe où la constante de classe est définit. Lecture seule, lance ReflectionException lors d'une tentative d'écriture.

Constantes pré-définies

Modificateur ReflectionClassConstant

ReflectionClassConstant::IS_PUBLIC

Indique les constantes public.

ReflectionClassConstant::IS_PROTECTED

Indique les constantes protected.

ReflectionClassConstant::IS_PRIVATE

Indique les constantes private.

Sommaire

  • ReflectionClassConstant::__construct — Construit une ReflectionClassConstant
  • ReflectionClassConstant::export — Exporte
  • ReflectionClassConstant::getDeclaringClass — Récupère la classe déclarante
  • ReflectionClassConstant::getDocComment — Récupère le commentaire de documentation
  • ReflectionClassConstant::getModifiers — Récupère les modificateurs de la constante de classe
  • ReflectionClassConstant::getName — Récupère le nom de la constante
  • ReflectionClassConstant::getValue — Récupère la valeur
  • ReflectionClassConstant::isPrivate — Vérifie si la constante de classe est privée
  • ReflectionClassConstant::isProtected — Vérifie si la constante de classe est protégée
  • ReflectionClassConstant::isPublic — Vérifie si la constante de classe est publique
  • ReflectionClassConstant::__toString — Retourne la représentation sous forme de chaîne de caractères de l'objet ReflectionClassConstant

User Contributed Notes

There are no user contributed notes for this page.


Construit une ReflectionClassConstant

  • « ReflectionClassConstant
  • ReflectionClassConstant::export »
  • PHP Manual
  • ReflectionClassConstant
  • Construit une ReflectionClassConstant

ReflectionClassConstant::__construct

(PHP 7 >= 7.1.0)

ReflectionClassConstant::__construct — Construit une ReflectionClassConstant

Description

public ReflectionClassConstant::__construct ( object|string $class , string $constant )

Construit un nouvel objet ReflectionClassConstant.

Liste de paramètres

class

Soit une chaîne de caractères contenant le nom de la classe a refléter, soit un objet.

constant

Le nom de la constante de classe.

Valeurs de retour

Retourne une instance construite de ReflectionClassConstant.

Erreurs / Exceptions

Lance une Exception dans le cas où la constante de classe fournit n'existe pas.

Voir aussi

  • Constructors

User Contributed Notes

There are no user contributed notes for this page.


Exporte

  • « ReflectionClassConstant::__construct
  • ReflectionClassConstant::getDeclaringClass »
  • PHP Manual
  • ReflectionClassConstant
  • Exporte

ReflectionClassConstant::export

(PHP 7 >= 7.1.0)

ReflectionClassConstant::export — Exporte

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 7.4.0. Dépendre de cette fonction est fortement déconseillé.

Description

public static ReflectionClassConstant::export ( mixed $class , string $name , bool $return = ? ) : string

Exporte une réflection.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

class

La réflection à exporter.

name

Le nom de la constante de classe.

return

Le fait de le définir à true retournera l'export plutôt que l'émission. Le définir à false (par défaut) fera l'inverse.

Valeurs de retour

Voir aussi

  • ReflectionClassConstant::__toString() - Retourne la représentation sous forme de chaîne de caractères de l'objet ReflectionClassConstant

User Contributed Notes

There are no user contributed notes for this page.


Récupère la classe déclarante

  • « ReflectionClassConstant::export
  • ReflectionClassConstant::getDocComment »
  • PHP Manual
  • ReflectionClassConstant
  • Récupère la classe déclarante

ReflectionClassConstant::getDeclaringClass

(PHP 7 >= 7.1.0)

ReflectionClassConstant::getDeclaringClass — Récupère la classe déclarante

Description

public ReflectionClassConstant::getDeclaringClass ( ) : ReflectionClass

Récupère la classe déclarante.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un objet ReflectionClass.

User Contributed Notes

There are no user contributed notes for this page.


Récupère le commentaire de documentation

  • « ReflectionClassConstant::getDeclaringClass
  • ReflectionClassConstant::getModifiers »
  • PHP Manual
  • ReflectionClassConstant
  • Récupère le commentaire de documentation

ReflectionClassConstant::getDocComment

(PHP 7 >= 7.1.0)

ReflectionClassConstant::getDocComment — Récupère le commentaire de documentation

Description

public ReflectionClassConstant::getDocComment ( ) : string|false

Récupère le commentaire de documentation d'une constante de classe.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le commentaire de documentation s'il existe, sinon false

User Contributed Notes

There are no user contributed notes for this page.


Récupère les modificateurs de la constante de classe

  • « ReflectionClassConstant::getDocComment
  • ReflectionClassConstant::getName »
  • PHP Manual
  • ReflectionClassConstant
  • Récupère les modificateurs de la constante de classe

ReflectionClassConstant::getModifiers

(PHP 7 >= 7.1.0)

ReflectionClassConstant::getModifiers — Récupère les modificateurs de la constante de classe

Description

public ReflectionClassConstant::getModifiers ( ) : int

Retourne un champ de bits des modificateurs d'accès pour cette constante de classe.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Une représentation numérique des modificateurs. La signification véridique de ses modificateurs est décrite dans les constantes prédéfinies.

Voir aussi

  • Reflection::getModifierNames() - Récupère les nom des modificateurs

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom de la constante

  • « ReflectionClassConstant::getModifiers
  • ReflectionClassConstant::getValue »
  • PHP Manual
  • ReflectionClassConstant
  • Récupère le nom de la constante

ReflectionClassConstant::getName

(PHP 7 >= 7.1.0)

ReflectionClassConstant::getName — Récupère le nom de la constante

Description

public ReflectionClassConstant::getName ( ) : string|false

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le nom de la constante, ou false si une erreur survient.

User Contributed Notes

There are no user contributed notes for this page.


Récupère la valeur

  • « ReflectionClassConstant::getName
  • ReflectionClassConstant::isPrivate »
  • PHP Manual
  • ReflectionClassConstant
  • Récupère la valeur

ReflectionClassConstant::getValue

(PHP 7 >= 7.1.0)

ReflectionClassConstant::getValue — Récupère la valeur

Description

public ReflectionClassConstant::getValue ( ) : mixed

Récupère la valeur de la constante de classe.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

La valeur de la constante de classe.

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la constante de classe est privée

  • « ReflectionClassConstant::getValue
  • ReflectionClassConstant::isProtected »
  • PHP Manual
  • ReflectionClassConstant
  • Vérifie si la constante de classe est privée

ReflectionClassConstant::isPrivate

(PHP 7 >= 7.1.0)

ReflectionClassConstant::isPrivate — Vérifie si la constante de classe est privée

Description

public ReflectionClassConstant::isPrivate ( ) : bool

Vérifie si la constante de classe est privée.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la constante de classe est privée, sinon false

Voir aussi

  • ReflectionClassConstant::isPublic() - Vérifie si la constante de classe est publique
  • ReflectionClassConstant::isProtected() - Vérifie si la constante de classe est protégée

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la constante de classe est protégée

  • « ReflectionClassConstant::isPrivate
  • ReflectionClassConstant::isPublic »
  • PHP Manual
  • ReflectionClassConstant
  • Vérifie si la constante de classe est protégée

ReflectionClassConstant::isProtected

(PHP 7 >= 7.1.0)

ReflectionClassConstant::isProtected — Vérifie si la constante de classe est protégée

Description

public ReflectionClassConstant::isProtected ( ) : bool

Vérifie si la constante de classe est protégée.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la constante de classe est protégée, sinon false

Voir aussi

  • ReflectionClassConstant::isPublic() - Vérifie si la constante de classe est publique
  • ReflectionClassConstant::isPrivate() - Vérifie si la constante de classe est privée

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la constante de classe est publique

  • « ReflectionClassConstant::isProtected
  • ReflectionClassConstant::__toString »
  • PHP Manual
  • ReflectionClassConstant
  • Vérifie si la constante de classe est publique

ReflectionClassConstant::isPublic

(PHP 7 >= 7.1.0)

ReflectionClassConstant::isPublic — Vérifie si la constante de classe est publique

Description

public ReflectionClassConstant::isPublic ( ) : bool

Vérifie si la constante de classe est publique.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la constante de classe est publique, sinon false

Voir aussi

  • ReflectionClassConstant::isPrivate() - Vérifie si la constante de classe est privée
  • ReflectionClassConstant::isProtected() - Vérifie si la constante de classe est protégée

User Contributed Notes

There are no user contributed notes for this page.


Retourne la représentation sous forme de chaîne de caractères de l'objet ReflectionClassConstant

  • « ReflectionClassConstant::isPublic
  • ReflectionZendExtension »
  • PHP Manual
  • ReflectionClassConstant
  • Retourne la représentation sous forme de chaîne de caractères de l'objet ReflectionClassConstant

ReflectionClassConstant::__toString

(PHP 7 >= 7.1.0)

ReflectionClassConstant::__toString — Retourne la représentation sous forme de chaîne de caractères de l'objet ReflectionClassConstant

Description

public ReflectionClassConstant::__toString ( ) : string

Retourne la représentation sous forme de chaîne de caractères de l'objet ReflectionClassConstant.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

La représentation sous forme de chaîne de caractères de cette instance de ReflectionClassConstant.

Voir aussi

  • ReflectionClassConstant::export() - Exporte
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionZendExtension

(PHP 5 >= 5.4.0, PHP 7)

Introduction

Synopsis de la classe

ReflectionZendExtension implements Reflector {
/* Propriétés */
public $name ;
/* Méthodes */
public __construct ( string $name )
final private __clone ( ) : void
public static export ( string $name , bool $return = ? ) : string
public getAuthor ( ) : string
public getCopyright ( ) : string
public getName ( ) : string
public getURL ( ) : string
public getVersion ( ) : string
public __toString ( ) : string
}

Propriétés

name

Nom de l'extension. En lecture seule, émets ReflectionException lors d'une tentative d'écriture.

Sommaire

  • ReflectionZendExtension::__clone — Gestionnaire de clonage
  • ReflectionZendExtension::__construct — Constructeur
  • ReflectionZendExtension::export — Export
  • ReflectionZendExtension::getAuthor — Récupère l'auteur
  • ReflectionZendExtension::getCopyright — Récupère le copyright
  • ReflectionZendExtension::getName — Récupère le nom
  • ReflectionZendExtension::getURL — Récupère l'URL
  • ReflectionZendExtension::getVersion — Récupère la version
  • ReflectionZendExtension::__toString — Gestionnaire de conversion en chaîne de caractères

User Contributed Notes

There are no user contributed notes for this page.


Gestionnaire de clonage

  • « ReflectionZendExtension
  • ReflectionZendExtension::__construct »
  • PHP Manual
  • ReflectionZendExtension
  • Gestionnaire de clonage

ReflectionZendExtension::__clone

(PHP 5 >= 5.4.0, PHP 7)

ReflectionZendExtension::__clone — Gestionnaire de clonage

Description

final private ReflectionZendExtension::__clone ( ) : void

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Constructeur

  • « ReflectionZendExtension::__clone
  • ReflectionZendExtension::export »
  • PHP Manual
  • ReflectionZendExtension
  • Constructeur

ReflectionZendExtension::__construct

(PHP 5 >= 5.4.0, PHP 7)

ReflectionZendExtension::__construct — Constructeur

Description

public ReflectionZendExtension::__construct ( string $name )

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

name

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Export

  • « ReflectionZendExtension::__construct
  • ReflectionZendExtension::getAuthor »
  • PHP Manual
  • ReflectionZendExtension
  • Export

ReflectionZendExtension::export

(PHP 5 >= 5.4.0, PHP 7)

ReflectionZendExtension::export — Export

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 7.4.0. Dépendre de cette fonction est fortement déconseillé.

Description

public static ReflectionZendExtension::export ( string $name , bool $return = ? ) : string

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

name

return

Valeurs de retour

Voir aussi

  • ReflectionClassConstant::__toString() - Retourne la représentation sous forme de chaîne de caractères de l'objet ReflectionClassConstant

User Contributed Notes

There are no user contributed notes for this page.


Récupère l'auteur

  • « ReflectionZendExtension::export
  • ReflectionZendExtension::getCopyright »
  • PHP Manual
  • ReflectionZendExtension
  • Récupère l'auteur

ReflectionZendExtension::getAuthor

(PHP 5 >= 5.4.0, PHP 7)

ReflectionZendExtension::getAuthor — Récupère l'auteur

Description

public ReflectionZendExtension::getAuthor ( ) : string

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Récupère le copyright

  • « ReflectionZendExtension::getAuthor
  • ReflectionZendExtension::getName »
  • PHP Manual
  • ReflectionZendExtension
  • Récupère le copyright

ReflectionZendExtension::getCopyright

(PHP 5 >= 5.4.0, PHP 7)

ReflectionZendExtension::getCopyright — Récupère le copyright

Description

public ReflectionZendExtension::getCopyright ( ) : string

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom

  • « ReflectionZendExtension::getCopyright
  • ReflectionZendExtension::getURL »
  • PHP Manual
  • ReflectionZendExtension
  • Récupère le nom

ReflectionZendExtension::getName

(PHP 5 >= 5.4.0, PHP 7)

ReflectionZendExtension::getName — Récupère le nom

Description

public ReflectionZendExtension::getName ( ) : string

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Récupère l'URL

  • « ReflectionZendExtension::getName
  • ReflectionZendExtension::getVersion »
  • PHP Manual
  • ReflectionZendExtension
  • Récupère l'URL

ReflectionZendExtension::getURL

(PHP 5 >= 5.4.0, PHP 7)

ReflectionZendExtension::getURL — Récupère l'URL

Description

public ReflectionZendExtension::getURL ( ) : string

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Récupère la version

  • « ReflectionZendExtension::getURL
  • ReflectionZendExtension::__toString »
  • PHP Manual
  • ReflectionZendExtension
  • Récupère la version

ReflectionZendExtension::getVersion

(PHP 5 >= 5.4.0, PHP 7)

ReflectionZendExtension::getVersion — Récupère la version

Description

public ReflectionZendExtension::getVersion ( ) : string

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Gestionnaire de conversion en chaîne de caractères

  • « ReflectionZendExtension::getVersion
  • ReflectionExtension »
  • PHP Manual
  • ReflectionZendExtension
  • Gestionnaire de conversion en chaîne de caractères

ReflectionZendExtension::__toString

(PHP 5 >= 5.4.0, PHP 7)

ReflectionZendExtension::__toString — Gestionnaire de conversion en chaîne de caractères

Description

public ReflectionZendExtension::__toString ( ) : string

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionExtension

(PHP 5, PHP 7)

Introduction

La classe ReflectionExtension rapporte des informations sur une extension.

Synopsis de la classe

ReflectionExtension implements Reflector {
/* Propriétés */
public $name ;
/* Méthodes */
public ReflectionClass::__construct ( object|string $objectOrClass )
final private __clone ( ) : void
public static export ( string $name , string $return = false ) : string
public getClasses ( ) : array
public getClassNames ( ) : array
public getConstants ( ) : array
public getDependencies ( ) : array
public getFunctions ( ) : array
public getINIEntries ( ) : array
public getName ( ) : string
public getVersion ( ) : string|null
public info ( ) : void
public isPersistent ( ) : bool
public isTemporary ( ) : bool
public __toString ( ) : string
}

Propriétés

name

Nom de l'extension, identique à l'appel de la méthode ReflectionExtension::getName()

Sommaire

  • ReflectionExtension::__clone — Clonage
  • ReflectionExtension::__construct — Construit un nouvel objet ReflectionExtension
  • ReflectionExtension::export — Exportation
  • ReflectionExtension::getClasses — Récupère les classes
  • ReflectionExtension::getClassNames — Récupère les noms des classes
  • ReflectionExtension::getConstants — Récupère les constantes
  • ReflectionExtension::getDependencies — Récupère les dépendances
  • ReflectionExtension::getFunctions — Récupère les fonctions d'une extension
  • ReflectionExtension::getINIEntries — Récupère les entrées ini de l'extension
  • ReflectionExtension::getName — Récupère le nom de l'extension
  • ReflectionExtension::getVersion — Récupère la version de l'extension
  • ReflectionExtension::info — Affiche des informations sur l'extension
  • ReflectionExtension::isPersistent — Vérifie si l'extension est persistante
  • ReflectionExtension::isTemporary — Vérifie si l'extension est temporaire
  • ReflectionExtension::__toString — Récupère une représentation textuelle

User Contributed Notes

Anonymous 20-Mar-2016 03:01
<?php
  // Create an instance of the ReflectionProperty class
  $ext= new ReflectionExtension('standard');

  // Print out basic information
  printf(
      "Name        : %s\n".
      "Version     : %s\n".
      "Functions   : [%d] %s\n".
      "Constants   : [%d] %s\n".
      "INI entries : [%d] %s\n",
      $ext->getName(),
      $ext->getVersion() ? $ext->getVersion() : 'NO_VERSION',
      sizeof($ext->getFunctions()),
      var_export($ext->getFunctions(), 1),
      sizeof($ext->getConstants()),
      var_export($ext->getConstants(), 1),
      sizeof($ext->getINIEntries()),
      var_export($ext->getINIEntries(), 1)
  );
?>
Lubaev.K 20-Jun-2013 03:01
<?php
// The demonstration for the class "ReflectionExtension".

function REData(ReflectionExtension $re, $return=false) {

    defined('UNDEFINED') || define('UNDEFINED','%undefined%');
    $_data = [];

    $_data['getName:'] = $re->getName() ?: UNDEFINED;
    $_data['getVersion:'] = $re->getVersion() ?: UNDEFINED;
    $_data['info:'] = $re->info() ?: UNDEFINED;
    $_data['getClassName:'] = PHP_EOL.implode(", ",$re->getClassNames()) ?: UNDEFINED;
    foreach ($re->getConstants() as $key => $value) $_data['getConstants:'] .= "\n{$key}:={$value}";
    $_data['getDependencies:'] = $re->getDependencies() ?: UNDEFINED;
    $_data['getFunctions:'] = PHP_EOL.implode(", ",array_keys($re->getFunctions())) ?: UNDEFINED;
    $_data['getINIEntries:'] = $re->getINIEntries() ?: UNDEFINED;
    $_data['isPersistent:'] = $re->isPersistent() ?: UNDEFINED;
    $_data['isTemporary:'] = $re->isTemporary() ?: UNDEFINED;

    return print_r($_data, $return);
}

REData( new ReflectionExtension( 'Reflection' ) );
REData( new ReflectionExtension( 'zlib' ) );

// Reflection
// Reflection => enabled
// Version => $Id: 60f1e547a6dd00239162151e701566debdcee660 $
/*
Array
(
    [getName:] => Reflection
    [getVersion:] => $Id: 60f1e547a6dd00239162151e701566debdcee660 $
    [info:] => %undefined%
    [getClassName:] =>
ReflectionException, Reflection, Reflector, ReflectionFunctionAbstract, Reflecti
onFunction, ReflectionParameter, ReflectionMethod, ReflectionClass, ReflectionOb
ject, ReflectionProperty, ReflectionExtension, ReflectionZendExtension
    [getDependencies:] => %undefined%
    [getFunctions:] =>

    [getINIEntries:] => %undefined%
    [isPersistent:] => 1
    [isTemporary:] => %undefined%
)
*/
// zlib
// ZLib Support => enabled
// Stream Wrapper => compress.zlib://
// Stream Filter => zlib.inflate, zlib.deflate
// Compiled Version => 1.2.7
// Linked Version => 1.2.7
// Directive => Local Value => Master Value
// zlib.output_compression => Off => Off
// zlib.output_compression_level => -1 => -1
// zlib.output_handler => no value => no value
/*
Array
(
    [getName:] => zlib
    [getVersion:] => 2.0
    [info:] => %undefined%
    [getClassName:] =>

    [getConstants:] =>
FORCE_GZIP:=31
FORCE_DEFLATE:=15
ZLIB_ENCODING_RAW:=-15
ZLIB_ENCODING_GZIP:=31
ZLIB_ENCODING_DEFLATE:=15
    [getDependencies:] => %undefined%
    [getFunctions:] =>
readgzfile, gzrewind, gzclose, gzeof, gzgetc, gzgets, gzgetss, gzread, gzopen, g
zpassthru, gzseek, gztell, gzwrite, gzputs, gzfile, gzcompress, gzuncompress, gz
deflate, gzinflate, gzencode, gzdecode, zlib_encode, zlib_decode, zlib_get_codin
g_type, ob_gzhandler
    [getINIEntries:] => Array
        (
            [zlib.output_compression] =>
            [zlib.output_compression_level] => -1
            [zlib.output_handler] =>
        )

    [isPersistent:] => 1
    [isTemporary:] => %undefined%
)
*/


Clonage

  • « ReflectionExtension
  • ReflectionExtension::__construct »
  • PHP Manual
  • ReflectionExtension
  • Clonage

ReflectionExtension::__clone

(PHP 5, PHP 7)

ReflectionExtension::__clone — Clonage

Description

final private ReflectionExtension::__clone ( ) : void

La méthode clone empêche un objet d'être cloné. Les objets de réflexion ne peuvent pas être clonés.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur retournée, si appellé une erreur fatale se produira.

Voir aussi

  • ReflectionExtension::__construct() - Construit un nouvel objet ReflectionExtension
  • Clonage d'objet

User Contributed Notes

There are no user contributed notes for this page.


Construit un nouvel objet ReflectionExtension

  • « ReflectionExtension::__clone
  • ReflectionExtension::export »
  • PHP Manual
  • ReflectionExtension
  • Construit un nouvel objet ReflectionExtension

ReflectionExtension::__construct

(PHP 5, PHP 7)

ReflectionExtension::__construct — Construit un nouvel objet ReflectionExtension

Description

public ReflectionExtension::__construct ( string $name )

Construit un objet ReflectionExtension.

Liste de paramètres

name

Nom de l'extension.

Valeurs de retour

Un objet ReflectionExtension.

Exemples

Exemple #1 Exemple avec ReflectionExtension

<?php
$ext = new ReflectionExtension('Reflection');

printf('Extension: %s (version: %s)', $ext->getName(), $ext->getVersion());
?>

Résultat de l'exemple ci-dessus est similaire à :

Extension: Reflection (version: $Revision$)

Voir aussi

  • ReflectionExtension::info() - Affiche des informations sur l'extension
  • Les constructeurs

User Contributed Notes

There are no user contributed notes for this page.


Exportation

  • « ReflectionExtension::__construct
  • ReflectionExtension::getClasses »
  • PHP Manual
  • ReflectionExtension
  • Exportation

ReflectionExtension::export

(PHP 5, PHP 7)

ReflectionExtension::export — Exportation

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 7.4.0. Dépendre de cette fonction est fortement déconseillé.

Description

public static ReflectionExtension::export ( string $name , string $return = false ) : string

Exporte une extension reflétée. Le format de retour de cette fonction est identique à l'argument CLI --re [extension].

Liste de paramètres

name

La réflection à exporter.

return

Le fait de le définir à true retournera l'export plutôt que l'émission. Le définir à false (par défaut) fera l'inverse.

Valeurs de retour

Si le paramètre return est défini à true, l'export sera retourné sous la forme d'une chaîne de caractères, sinon, null sera retourné.

Voir aussi

  • ReflectionExtension::info() - Affiche des informations sur l'extension
  • ReflectionExtension::__toString() - Récupère une représentation textuelle

User Contributed Notes

There are no user contributed notes for this page.


Récupère les classes

  • « ReflectionExtension::export
  • ReflectionExtension::getClassNames »
  • PHP Manual
  • ReflectionExtension
  • Récupère les classes

ReflectionExtension::getClasses

(PHP 5, PHP 7)

ReflectionExtension::getClasses — Récupère les classes

Description

public ReflectionExtension::getClasses ( ) : array

Récupère une liste des classes d'une extension.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un tableau d'objets ReflectionClass, un par classes définies dans l'extension. Si aucune classe n'est définie, un tableau vide sera retourné.

Exemples

Exemple #1 Exemple avec ReflectionExtension::getClasses()

<?php
$ext = new ReflectionExtension('XMLWriter');
var_dump($ext->getClasses());
?>

Résultat de l'exemple ci-dessus est similaire à :

array(1) {
  ["XMLWriter"]=>
  object(ReflectionClass)#2 (1) {
    ["name"]=>
    string(9) "XMLWriter"
  }
}

Voir aussi

  • ReflectionExtension::getClassNames() - Récupère les noms des classes

User Contributed Notes

There are no user contributed notes for this page.


Récupère les noms des classes

  • « ReflectionExtension::getClasses
  • ReflectionExtension::getConstants »
  • PHP Manual
  • ReflectionExtension
  • Récupère les noms des classes

ReflectionExtension::getClassNames

(PHP 5, PHP 7)

ReflectionExtension::getClassNames — Récupère les noms des classes

Description

public ReflectionExtension::getClassNames ( ) : array

Récupère une liste des noms de classes définies dans l'extension.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un tableau des noms de classes, comme définies dans l'extension. Si aucune classe n'est définie, un tableau vide sera retourné.

Exemples

Exemple #1 Exemple avec ReflectionExtension::getClassNames()

<?php
$ext = new ReflectionExtension('XMLWriter');
var_dump($ext->getClassNames());
?>

Résultat de l'exemple ci-dessus est similaire à :

array(1) {
  [0]=>
  string(9) "XMLWriter"
}

Voir aussi

  • ReflectionExtension::getClasses() - Récupère les classes
  • ReflectionExtension::getName() - Récupère le nom de l'extension

User Contributed Notes

There are no user contributed notes for this page.


Récupère les constantes

  • « ReflectionExtension::getClassNames
  • ReflectionExtension::getDependencies »
  • PHP Manual
  • ReflectionExtension
  • Récupère les constantes

ReflectionExtension::getConstants

(PHP 5, PHP 7)

ReflectionExtension::getConstants — Récupère les constantes

Description

public ReflectionExtension::getConstants ( ) : array

Récupère les constantes d'une extension.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un tableau associatif dont les clés sont les noms des constantes.

Exemples

Exemple #1 Exemple avec ReflectionExtension::getConstants()

<?php
$ext = new ReflectionExtension('DOM');

print_r($ext->getConstants());
?>

Résultat de l'exemple ci-dessus est similaire à :

Array
(
    [XML_ELEMENT_NODE] => 1
    [XML_ATTRIBUTE_NODE] => 2
    [XML_TEXT_NODE] => 3
    [XML_CDATA_SECTION_NODE] => 4
    [XML_ENTITY_REF_NODE] => 5
    [XML_ENTITY_NODE] => 6
    [XML_PI_NODE] => 7
    [XML_COMMENT_NODE] => 8
    [XML_DOCUMENT_NODE] => 9
    [XML_DOCUMENT_TYPE_NODE] => 10
    [XML_DOCUMENT_FRAG_NODE] => 11
    [XML_NOTATION_NODE] => 12
    [XML_HTML_DOCUMENT_NODE] => 13
    [XML_DTD_NODE] => 14
    [XML_ELEMENT_DECL_NODE] => 15
    [XML_ATTRIBUTE_DECL_NODE] => 16
    [XML_ENTITY_DECL_NODE] => 17
    [XML_NAMESPACE_DECL_NODE] => 18
    [XML_LOCAL_NAMESPACE] => 18
    [XML_ATTRIBUTE_CDATA] => 1
    [XML_ATTRIBUTE_ID] => 2
    [XML_ATTRIBUTE_IDREF] => 3
    [XML_ATTRIBUTE_IDREFS] => 4
    [XML_ATTRIBUTE_ENTITY] => 6
    [XML_ATTRIBUTE_NMTOKEN] => 7
    [XML_ATTRIBUTE_NMTOKENS] => 8
    [XML_ATTRIBUTE_ENUMERATION] => 9
    [XML_ATTRIBUTE_NOTATION] => 10
    [DOM_PHP_ERR] => 0
    [DOM_INDEX_SIZE_ERR] => 1
    [DOMSTRING_SIZE_ERR] => 2
    [DOM_HIERARCHY_REQUEST_ERR] => 3
    [DOM_WRONG_DOCUMENT_ERR] => 4
    [DOM_INVALID_CHARACTER_ERR] => 5
    [DOM_NO_DATA_ALLOWED_ERR] => 6
    [DOM_NO_MODIFICATION_ALLOWED_ERR] => 7
    [DOM_NOT_FOUND_ERR] => 8
    [DOM_NOT_SUPPORTED_ERR] => 9
    [DOM_INUSE_ATTRIBUTE_ERR] => 10
    [DOM_INVALID_STATE_ERR] => 11
    [DOM_SYNTAX_ERR] => 12
    [DOM_INVALID_MODIFICATION_ERR] => 13
    [DOM_NAMESPACE_ERR] => 14
    [DOM_INVALID_ACCESS_ERR] => 15
    [DOM_VALIDATION_ERR] => 16
)

Voir aussi

  • ReflectionExtension::getINIEntries() - Récupère les entrées ini de l'extension

User Contributed Notes

There are no user contributed notes for this page.


Récupère les dépendances

  • « ReflectionExtension::getConstants
  • ReflectionExtension::getFunctions »
  • PHP Manual
  • ReflectionExtension
  • Récupère les dépendances

ReflectionExtension::getDependencies

(PHP 5 >= 5.1.3, PHP 7)

ReflectionExtension::getDependencies — Récupère les dépendances

Description

public ReflectionExtension::getDependencies ( ) : array

Récupère les dépendances, en listant à la fois les dépendances requises ainsi que les dépendances en conflits.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un tableau associatif dont les clés sont les dépendances et comme valeurs, soit Required, Optional ou Conflicts.

Exemples

Exemple #1 Exemple avec ReflectionExtension::getDependencies()

<?php
$dom = new ReflectionExtension('dom');

print_r($dom->getDependencies());
?>

Résultat de l'exemple ci-dessus est similaire à :

Array
(
    [libxml] => Required
    [domxml] => Conflicts
)

Voir aussi

  • ReflectionClass::getVersion()

User Contributed Notes

There are no user contributed notes for this page.


Récupère les fonctions d'une extension

  • « ReflectionExtension::getDependencies
  • ReflectionExtension::getINIEntries »
  • PHP Manual
  • ReflectionExtension
  • Récupère les fonctions d'une extension

ReflectionExtension::getFunctions

(PHP 5, PHP 7)

ReflectionExtension::getFunctions — Récupère les fonctions d'une extension

Description

public ReflectionExtension::getFunctions ( ) : array

Récupère les fonctions d'une extension.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un tableau associatif d'objets ReflectionFunction, pour chaque fonction définie dans l'extension, dont les clés sont les noms des fonctions. Si aucune fonction n'est définie, un tableau vide sera retourné.

Exemples

Exemple #1 Exemple avec ReflectionExtension::getFunctions()

<?php
$dom = new ReflectionExtension('SimpleXML');

print_r($dom->getFunctions());
?>

Résultat de l'exemple ci-dessus est similaire à :

Array
(
    [simplexml_load_file] => ReflectionFunction Object
        (
            [name] => simplexml_load_file
        )

    [simplexml_load_string] => ReflectionFunction Object
        (
            [name] => simplexml_load_string
        )

    [simplexml_import_dom] => ReflectionFunction Object
        (
            [name] => simplexml_import_dom
        )

)

Voir aussi

  • ReflectionExtension::getClasses() - Récupère les classes
  • get_extension_funcs() - Liste les fonctions d'une extension

User Contributed Notes

There are no user contributed notes for this page.


Récupère les entrées ini de l'extension

  • « ReflectionExtension::getFunctions
  • ReflectionExtension::getName »
  • PHP Manual
  • ReflectionExtension
  • Récupère les entrées ini de l'extension

ReflectionExtension::getINIEntries

(PHP 5, PHP 7)

ReflectionExtension::getINIEntries — Récupère les entrées ini de l'extension

Description

public ReflectionExtension::getINIEntries ( ) : array

Récupère les entrées ini de l'extension.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un tableau associatif dont les clés sont les entrées ini, et les valeurs les valeurs de ces entrées.

Exemples

Exemple #1 Exemple avec ReflectionExtension::getINIEntries()

<?php
$ext = new ReflectionExtension('mysql');

print_r($ext->getINIEntries());
?>

Résultat de l'exemple ci-dessus est similaire à :

Array
(
    [mysql.allow_persistent] => 1
    [mysql.max_persistent] => -1
    [mysql.max_links] => -1
    [mysql.default_host] =>
    [mysql.default_user] =>
    [mysql.default_password] =>
    [mysql.default_port] =>
    [mysql.default_socket] =>
    [mysql.connect_timeout] => 60
    [mysql.trace_mode] =>
    [mysql.allow_local_infile] => 1
    [mysql.cache_size] => 2000
)

Voir aussi

  • ini_get_all() - Lit toutes les valeurs de configuration
  • ReflectionExtension::getConstants() - Récupère les constantes

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom de l'extension

  • « ReflectionExtension::getINIEntries
  • ReflectionExtension::getVersion »
  • PHP Manual
  • ReflectionExtension
  • Récupère le nom de l'extension

ReflectionExtension::getName

(PHP 5, PHP 7)

ReflectionExtension::getName — Récupère le nom de l'extension

Description

public ReflectionExtension::getName ( ) : string

Récupère le nom de l'extension.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le nom de l'extension.

Exemples

Exemple #1 Exemple avec ReflectionExtension::getName()

<?php
$ext = new ReflectionExtension('mysqli');
var_dump($ext->getName());
?>

Résultat de l'exemple ci-dessus est similaire à :

string(6) "mysqli"

Voir aussi

  • ReflectionExtension::getClassNames() - Récupère les noms des classes

User Contributed Notes

There are no user contributed notes for this page.


Récupère la version de l'extension

  • « ReflectionExtension::getName
  • ReflectionExtension::info »
  • PHP Manual
  • ReflectionExtension
  • Récupère la version de l'extension

ReflectionExtension::getVersion

(PHP 5, PHP 7)

ReflectionExtension::getVersion — Récupère la version de l'extension

Description

public ReflectionExtension::getVersion ( ) : string|null

Récupère la version de l'extension.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

La version de l'extension, ou null si l'extension n'a pas de version.

Exemples

Exemple #1 Exemple avec ReflectionExtension::getVersion()

<?php
$ext = new ReflectionExtension('mysqli');
var_dump($ext->getVersion());
?>

Résultat de l'exemple ci-dessus est similaire à :

string(3) "0.1"

Voir aussi

  • ReflectionExtension::info() - Affiche des informations sur l'extension

User Contributed Notes

There are no user contributed notes for this page.


Affiche des informations sur l'extension

  • « ReflectionExtension::getVersion
  • ReflectionExtension::isPersistent »
  • PHP Manual
  • ReflectionExtension
  • Affiche des informations sur l'extension

ReflectionExtension::info

(PHP 5 >= 5.2.4, PHP 7)

ReflectionExtension::info — Affiche des informations sur l'extension

Description

public ReflectionExtension::info ( ) : void

Affiche l'extrait "phpinfo()" de l'extension fournit.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Informations sur l'extension.

Exemples

Exemple #1 Exemple avec ReflectionExtension::info()

<?php
$ext = new ReflectionExtension('mysqli');
$ext->info();
?>

Résultat de l'exemple ci-dessus est similaire à :

mysqli

MysqlI Support => enabled
Client API library version => mysqlnd 5.0.5-dev - 081106 - $Revision$
Active Persistent Links => 0
Inactive Persistent Links => 0
Active Links => 0
Persistent cache => enabled
put_hits => 0
put_misses => 0
get_hits => 0
get_misses => 0
size => 2000
free_items => 2000
references => 2

Directive => Local Value => Master Value
mysqli.max_links => Unlimited => Unlimited
mysqli.max_persistent => Unlimited => Unlimited
mysqli.allow_persistent => On => On
mysqli.default_host => no value => no value
mysqli.default_user => no value => no value
mysqli.default_pw => no value => no value
mysqli.default_port => 3306 => 3306
mysqli.default_socket => no value => no value
mysqli.reconnect => Off => Off
mysqli.allow_local_infile => On => On
mysqli.cache_size => 2000 => 2000

Voir aussi

  • ReflectionExtension::getName() - Récupère le nom de l'extension
  • phpinfo() - Affiche de nombreuses informations sur la configuration de PHP

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si l'extension est persistante

  • « ReflectionExtension::info
  • ReflectionExtension::isTemporary »
  • PHP Manual
  • ReflectionExtension
  • Vérifie si l'extension est persistante

ReflectionExtension::isPersistent

(PHP 5 >= 5.4.0, PHP 7)

ReflectionExtension::isPersistent — Vérifie si l'extension est persistante

Description

public ReflectionExtension::isPersistent ( ) : bool

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne true pour les extensions chargées par le mécanisme des extensions, false sinon.

Voir aussi

  • ReflectionExtension::isTemporary() - Vérifie si l'extension est temporaire

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si l'extension est temporaire

  • « ReflectionExtension::isPersistent
  • ReflectionExtension::__toString »
  • PHP Manual
  • ReflectionExtension
  • Vérifie si l'extension est temporaire

ReflectionExtension::isTemporary

(PHP 5 >= 5.4.0, PHP 7)

ReflectionExtension::isTemporary — Vérifie si l'extension est temporaire

Description

public ReflectionExtension::isTemporary ( ) : bool

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne true pour les extensions chargées par la fonction dl(), false sinon.

Voir aussi

  • ReflectionExtension::isPersistent() - Vérifie si l'extension est persistante

User Contributed Notes

There are no user contributed notes for this page.


Récupère une représentation textuelle

  • « ReflectionExtension::isTemporary
  • ReflectionFunction »
  • PHP Manual
  • ReflectionExtension
  • Récupère une représentation textuelle

ReflectionExtension::__toString

(PHP 5, PHP 7)

ReflectionExtension::__toString — Récupère une représentation textuelle

Description

public ReflectionExtension::__toString ( ) : string

Exporte une extension reflétée et retourne le résultat sous forme de chaîne de caractères. Cette méthode est identique à ReflectionExtension::export() avec return défini à true.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne l'extension reflétée sous forme de chaîne de caractères, de la même façon que ReflectionExtension::export().

Voir aussi

  • ReflectionExtension::__construct() - Construit un nouvel objet ReflectionExtension
  • ReflectionExtension::export() - Exportation
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionFunction

(PHP 5, PHP 7)

Introduction

La classe ReflectionFunction rapporte des informations sur une fonction.

Synopsis de la classe

ReflectionFunction extends ReflectionFunctionAbstract implements Reflector {
/* Constantes */
const int IS_DEPRECATED = 262144 ;
/* Propriétés */
public $name ;
/* Méthodes */
public __construct ( Closure|string $function )
public static export ( string $name , string $return = ? ) : string
public getClosure ( ) : Closure
public invoke ( mixed ...$args ) : mixed
public invokeArgs ( array $args ) : mixed
public isDisabled ( ) : bool
public __toString ( ) : string
/* Méthodes héritées */
final private ReflectionFunctionAbstract::__clone ( ) : void
public ReflectionFunctionAbstract::getClosureScopeClass ( ) : ReflectionClass|null
public ReflectionFunctionAbstract::getClosureThis ( ) : object|null
public ReflectionFunctionAbstract::getDocComment ( ) : string|false
public ReflectionFunctionAbstract::getEndLine ( ) : int|false
public ReflectionFunctionAbstract::getExtension ( ) : ReflectionExtension|null
public ReflectionFunctionAbstract::getExtensionName ( ) : string
public ReflectionFunctionAbstract::getFileName ( ) : string|false
public ReflectionFunctionAbstract::getName ( ) : string
public ReflectionFunctionAbstract::getNamespaceName ( ) : string
public ReflectionFunctionAbstract::getNumberOfParameters ( ) : int
public ReflectionFunctionAbstract::getNumberOfRequiredParameters ( ) : int
public ReflectionFunctionAbstract::getParameters ( ) : array
public ReflectionFunctionAbstract::getReturnType ( ) : ReflectionType|null
public ReflectionFunctionAbstract::getShortName ( ) : string
public ReflectionFunctionAbstract::getStartLine ( ) : int|false
public ReflectionFunctionAbstract::getStaticVariables ( ) : array
public ReflectionFunctionAbstract::hasReturnType ( ) : bool
public ReflectionFunctionAbstract::inNamespace ( ) : bool
public ReflectionFunctionAbstract::isClosure ( ) : bool
public ReflectionFunctionAbstract::isDeprecated ( ) : bool
public ReflectionFunctionAbstract::isGenerator ( ) : bool
public ReflectionFunctionAbstract::isInternal ( ) : bool
public ReflectionFunctionAbstract::isUserDefined ( ) : bool
public ReflectionFunctionAbstract::isVariadic ( ) : bool
public ReflectionFunctionAbstract::returnsReference ( ) : bool
abstract public ReflectionFunctionAbstract::__toString ( ) : void
}

Propriétés

name

Nom de la fonction. En lecture seule, émets ReflectionException lors d'une tentative d'écriture.

Constantes pré-définies

Modificateurs de ReflectionFunction

ReflectionFunction::IS_DEPRECATED

Indique une fonction obsolète.

Sommaire

  • ReflectionFunction::__construct — Construit un nouvel objet ReflectionFunction
  • ReflectionFunction::export — Exporte une fonction
  • ReflectionFunction::getClosure — Retourne une fermeture créée dynamiquement pour la fonction
  • ReflectionFunction::invoke — Invoque une fonction
  • ReflectionFunction::invokeArgs — Invoque les arguments d'une fonction
  • ReflectionFunction::isDisabled — Vérifie si une fonction est désactivée
  • ReflectionFunction::__toString — Récupère une représentation textuelle

User Contributed Notes

a dot lucassilvadeoliveira at gmail dot com 28-Nov-2020 06:15
We can use this functionality to automatically pass arguments to our function based on some data structure.

NOTE: I am using a php 8.0> feature called "Nameds parameter"

<?php

$valuesToProcess = [
  'name' => 'Anderson Lucas Silva de Oliveira',
  'age' => 21,
  'hobbie' => 'Play games'
];

function processUserData($name, $age, $job = "", $hobbie = "")
{
    $msg = "Hello $name. You have $age years old";
    if (!empty($job)) {
    $msg .= ". Your job is $job";
    }

    if (!empty($hobbie)) {
        $msg .= ". Your hobbie is $hobbie";
    }

    echo $msg . ".";
}

$refFunction = new ReflectionFunction('processUserData');
$parameters = $refFunction->getParameters();

$validParameters = [];
foreach ($parameters as $parameter) {
    if (!array_key_exists($parameter->getName(), $valuesToProcess) && !$parameter->isOptional()) {
        throw new DomainException('Cannot resolve the parameter' . $parameter->getName());
    }

    if(!array_key_exists($parameter->getName(), $valuesToProcess)) {
        continue;
    }

    $validParameters[$parameter->getName()] = $valuesToProcess[$parameter->getName()];
}

$refFunction->invoke(...$validParameters);
?>

Results in:

Hello Anderson Lucas Silva de Oliveira. You have 21 years old. Your hobbie is Play games.
Lorenz R.S. 12-Aug-2011 01:24
Here is a concise example of ReflectionFunction usage for Parameter Reflection / introspection (e.g. to automatically generate API descriptions)

<?php
$properties = $reflector->getProperties();
$refFunc = new ReflectionFunction('preg_replace');
foreach( $refFunc->getParameters() as $param ){
    //invokes ¦ReflectionParameter::__toString
    print $param;
}
?>

prints:

Parameter #0 [ <required> $regex ]
Parameter #1 [ <required> $replace ]
Parameter #2 [ <required> $subject ]
Parameter #3 [ <optional> $limit ]
Parameter #4 [ <optional> &$count ]


Construit un nouvel objet ReflectionFunction

  • « ReflectionFunction
  • ReflectionFunction::export »
  • PHP Manual
  • ReflectionFunction
  • Construit un nouvel objet ReflectionFunction

ReflectionFunction::__construct

(PHP 5, PHP 7)

ReflectionFunction::__construct — Construit un nouvel objet ReflectionFunction

Description

public ReflectionFunction::__construct ( Closure|string $function )

Construit un nouvel objet ReflectionFunction.

Liste de paramètres

function

Le nom de la fonction à refléter ou une fermeture.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

Une exception ReflectionException si le paramètre function contient une fonction invalide.

Exemples

Exemple #1 Exemple avec ReflectionFunction::__construct()

<?php
/**
 * Un simple compteur
 *
 * @return    int
 */
function counter1()
{
    static $c = 0;
    return ++$c;
}

/**
 * Une autre simple compteur
 *
 * @return    int
 */
$counter2 = function()
{
    static $d = 0;
    return ++$d;

};

function dumpReflectionFunction($func)
{
    // Affiche des informations basiques
    printf(
        "\n\n===> The %s function '%s'\n".
        "     declared in %s\n".
        "     lines %d to %d\n",
        $func->isInternal() ? 'internal' : 'user-defined',
        $func->getName(),
        $func->getFileName(),
        $func->getStartLine(),
        $func->getEndline()
    );

    // Affiche les commentaires de documentation
    printf("---> Documentation:\n %s\n", var_export($func->getDocComment(), 1));

    // Affiche les variables statiques existantes
    if ($statics = $func->getStaticVariables())
    {
        printf("---> Static variables: %s\n", var_export($statics, 1));
    }
}

// Créer une instance de la classe ReflectionFunction
dumpReflectionFunction(new ReflectionFunction('counter1'));
dumpReflectionFunction(new ReflectionFunction($counter2));
?>

Résultat de l'exemple ci-dessus est similaire à :

===> The user-defined function 'counter1'
     declared in Z:\reflectcounter.php
     lines 7 to 11
---> Documentation:
 '/**
 * A simple counter
 *
 * @return    int
 */'
---> Static variables: array (
  'c' => 0,
)

===> The user-defined function '{closure}'
     declared in Z:\reflectcounter.php
     lines 18 to 23
---> Documentation:
 '/**
 * Another simple counter
 *
 * @return    int
 */'
---> Static variables: array (
  'd' => 0,
)

Voir aussi

  • ReflectionMethod::__construct() - Construit un nouvel objet ReflectionMethod
  • Les constructeurs

User Contributed Notes

There are no user contributed notes for this page.


Exporte une fonction

  • « ReflectionFunction::__construct
  • ReflectionFunction::getClosure »
  • PHP Manual
  • ReflectionFunction
  • Exporte une fonction

ReflectionFunction::export

(PHP 5, PHP 7)

ReflectionFunction::export — Exporte une fonction

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 7.4.0. Dépendre de cette fonction est fortement déconseillé.

Description

public static ReflectionFunction::export ( string $name , string $return = ? ) : string

Exporte une fonction reflétée.

Liste de paramètres

name

La réflection à exporter.

return

Le fait de le définir à true retournera l'export plutôt que l'émission. Le définir à false (par défaut) fera l'inverse.

Valeurs de retour

Si le paramètre return est défini à true, l'export sera retourné sous la forme d'une chaîne de caractères, sinon, null sera retourné.

Voir aussi

  • ReflectionFunction::invoke() - Invoque une fonction
  • ReflectionFunction::__toString() - Récupère une représentation textuelle

User Contributed Notes

hytest at gmail dot com 22-Nov-2011 08:04
Example:

<?php
function title($title, $name)
{
    return sprintf("%s. %s\r\n", $title, $name);
}

echo ReflectionFunction::export('title',true);

?>

Output:

Function [ <user> function title ] {
  @@ /path/to/file.php 2 - 5

  - Parameters [2] {
    Parameter #0 [ <required> $title ]
    Parameter #1 [ <required> $name ]
  }
}


Retourne une fermeture créée dynamiquement pour la fonction

  • « ReflectionFunction::export
  • ReflectionFunction::invoke »
  • PHP Manual
  • ReflectionFunction
  • Retourne une fermeture créée dynamiquement pour la fonction

ReflectionFunction::getClosure

(PHP 5 >= 5.4.0, PHP 7)

ReflectionFunction::getClosure — Retourne une fermeture créée dynamiquement pour la fonction

Description

public ReflectionFunction::getClosure ( ) : Closure

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un objet Closure. Retourne null en cas d'erreur.

User Contributed Notes

php dot net-bug at spamhereplease dot com 23-Nov-2013 05:34
If you have a callback that is going to be invoked often, you can use this method (and the related method for ReflectProperty) to get a closure that will execute at near native speed.

Some benchmark comparisons with php 5.4.22 on ubuntu:

[function call]      [time]     [%slower]
function():          0.09527      0%
Reflection::Closure: 0.09729      2%
$string():           0.102641     8%
Reflection:          0.197122   107%
call_user_func:      0.214045   125%

[method call]        [time]  [% slower] [%vs func]
->method():          0.103611    0%       9%
Reflection::Closure: 0.1043      1%       9%
$string():           0.109885    6%      15%
Reflection:          0.20451    97%     115%
call_user_func:      0.219205  112%     130%


Invoque une fonction

  • « ReflectionFunction::getClosure
  • ReflectionFunction::invokeArgs »
  • PHP Manual
  • ReflectionFunction
  • Invoque une fonction

ReflectionFunction::invoke

(PHP 5, PHP 7)

ReflectionFunction::invoke — Invoque une fonction

Description

public ReflectionFunction::invoke ( mixed ...$args ) : mixed

Invoque une fonction reflétée.

Liste de paramètres

args

La liste d'arguments à passer à la fonction. Il est possible de passer un nombre variable d'arguments à la fonction, comme pour la fonction call_user_func().

Valeurs de retour

Retourne le résultat de la fonction invoquée.

Exemples

Exemple #1 Exemple avec ReflectionFunction::invoke()

<?php
function title($title, $name)
{
   return sprintf("%s. %s\r\n", $title, $name);
}

$function = new ReflectionFunction('title');

echo $function->invoke('Dr', 'Phil');
?>

L'exemple ci-dessus va afficher :

Dr. Phil

Notes

Note:

Si la fonction a des arguments qui ont besoin d'être des références, alors ils doivent être passés par références dans la liste des arguments.

Voir aussi

  • ReflectionFunction::export() - Exporte une fonction
  • __invoke()
  • call_user_func() - Appelle une fonction de rappel fournie par le premier argument

User Contributed Notes

spark at limao dot com dot br 10-Jun-2011 10:55
I know Reflections classes have a lot of power, but sometimes all we need is to store a annonymus function or even create a simple callback somewhere.

so here it is, the Callback class:
<?php
    class Callback{
        private $name = false;

        public function Callback($obj,$call=false){
            $name = array($obj);
            if($call) $name[] = $call;

            $this->name = $name;
        }
        public function invoke($params=array()){
            return call_user_func_array($this->name,$params);
        }
    }
?>

Usage:
<?php
    function sayName(){
        return "goku";
    }

    $myVar = new Callback("sayName");

    echo "Hi, I am ".$myVar->invoke()."!";

    //also works with methods: new Callback($obj,"method");
?>


Invoque les arguments d'une fonction

  • « ReflectionFunction::invoke
  • ReflectionFunction::isDisabled »
  • PHP Manual
  • ReflectionFunction
  • Invoque les arguments d'une fonction

ReflectionFunction::invokeArgs

(PHP 5 >= 5.1.2, PHP 7)

ReflectionFunction::invokeArgs — Invoque les arguments d'une fonction

Description

public ReflectionFunction::invokeArgs ( array $args ) : mixed

Invoque la fonction et lui transmet les arguments sous la forme d'un tableau.

Liste de paramètres

args

Les arguments à utiliser lors de l'invocation, tout comme le fonctionnement de call_user_func_array().

Valeurs de retour

Retourne le résultat de la fonction invoquée.

Exemples

Exemple #1 Exemple avec ReflectionFunction::invokeArgs()

<?php
function title($title, $name)
{
    return sprintf("%s. %s\r\n", $title, $name);
}

$function = new ReflectionFunction('title');

echo $function->invokeArgs(array('Dr', 'Phil'));
?>

L'exemple ci-dessus va afficher :

Dr. Phil

Exemple #2 Exemple pour ReflectionFunction::invokeArgs() avec des références

<?php
function get_false_conditions(array $conditions, array &$false_conditions)
{
    foreach($conditions as $condition) {
       if(!$condition) {
          $false_conditions[] = $condition;
       }
    }
}

$function_ref = new ReflectionFunction('get_false_conditions');

$conditions       = array(true, false, -1, 0, 1);
$false_conditions = array();

$function_ref->invokeArgs(array($conditions, &$false_conditions));

var_dump($false_conditions);
?>

L'exemple ci-dessus va afficher :

array(2) {
  [0]=>
  bool(false)
  [1]=>
  int(0)
}

Notes

Note:

Si la fonction a des arguments qui ont besoin d'être des références, alors ils doivent être passés par références dans la liste des arguments.

Voir aussi

  • ReflectionFunction::invoke() - Invoque une fonction
  • ReflectionFunctionAbstract::getNumberOfParameters() - Récupère le nombre de paramètres
  • __invoke()
  • call_user_func_array() - Appelle une fonction de rappel avec les paramètres rassemblés en tableau

User Contributed Notes

theyourcomputer at gmail dot com 05-Dec-2017 01:40
In the case of call_user_func_array(), if you were to pass around an anonymous function and reference $this within the anonymous function, $this will faithfully refer to the class in the context in which the function was defined. Using ReflectionFunction::invokeArgs() does not seem to retain its original context--yeah, even if you bind the anonymous function before invoking. I recommend call_user_func_array() where context is a concern.
Andrea Giammarchi 16-Feb-2008 06:41
I encountered a weird problem with ReflectionFunction, described in ticket 44139 of PHP Bugs.

If for some reason you need to call with invoke, or invokeArgs, a function like array_unshift (that accepts internally the array by reference) you could use this code to avoid the generated warning or fatal error.

<?php
function unshift(){
    $ref        = new ReflectionFunction('array_unshift');
    $arguments    = func_get_args();
    return        $ref->invokeArgs(array_merge(array(&$this->arr), $arguments));
}
?>

I don't know about performances (you can create an array manually too, starting from array(&$this->something) and adding arguments). However, it seems to work correctly without problems, at least until the send by reference will be usable with one single value ...


Vérifie si une fonction est désactivée

  • « ReflectionFunction::invokeArgs
  • ReflectionFunction::__toString »
  • PHP Manual
  • ReflectionFunction
  • Vérifie si une fonction est désactivée

ReflectionFunction::isDisabled

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunction::isDisabled — Vérifie si une fonction est désactivée

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 8.0.0. Dépendre de cette fonction est fortement déconseillé.

Description

public ReflectionFunction::isDisabled ( ) : bool

Vérifie si une fonction est désactivée, via la directive disable_functions.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la fonction est désactivée, false sinon.

Voir aussi

  • ReflectionFunctionAbstract::isUserDefined() - Vérifie si la fonction est définie dans l'espace utilisateur
  • Directive disable_functions

User Contributed Notes

There are no user contributed notes for this page.


Récupère une représentation textuelle

  • « ReflectionFunction::isDisabled
  • ReflectionFunctionAbstract »
  • PHP Manual
  • ReflectionFunction
  • Récupère une représentation textuelle

ReflectionFunction::__toString

(PHP 5, PHP 7)

ReflectionFunction::__toString — Récupère une représentation textuelle

Description

public ReflectionFunction::__toString ( ) : string

Récupère une représentation textuelle.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne une représentation textuelle semblable à ReflectionFunction::export().

Exemples

Exemple #1 Exemple pour ReflectionFunction::__toString()

<?php
function title($title, $name)
{
    return sprintf("%s. %s\r\n", $title, $name);
}

echo new ReflectionFunction('title');
?>

Résultat de l'exemple ci-dessus est similaire à :

Function [ <user> function title ] {
  @@ Command line code 1 - 1

  - Parameters [2] {
    Parameter #0 [ <required> $title ]
    Parameter #1 [ <required> $name ]
  }
}

Voir aussi

  • ReflectionFunction::export() - Exporte une fonction
  • ReflectionClassAbstract::clone()
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionFunctionAbstract

(PHP 5 >= 5.2.0, PHP 7)

Introduction

Une classe parente à ReflectionFunction, lisez sa description pour plus de détails.

Synopsis de la classe

ReflectionFunctionAbstract implements Reflector {
/* Propriétés */
public $name ;
/* Méthodes */
final private __clone ( ) : void
public getClosureScopeClass ( ) : ReflectionClass|null
public getClosureThis ( ) : object|null
public getDocComment ( ) : string|false
public getEndLine ( ) : int|false
public getExtension ( ) : ReflectionExtension|null
public getExtensionName ( ) : string
public getFileName ( ) : string|false
public getName ( ) : string
public getNamespaceName ( ) : string
public getNumberOfParameters ( ) : int
public getNumberOfRequiredParameters ( ) : int
public getParameters ( ) : array
public getReturnType ( ) : ReflectionType|null
public getShortName ( ) : string
public getStartLine ( ) : int|false
public getStaticVariables ( ) : array
public hasReturnType ( ) : bool
public inNamespace ( ) : bool
public isClosure ( ) : bool
public isDeprecated ( ) : bool
public isGenerator ( ) : bool
public isInternal ( ) : bool
public isUserDefined ( ) : bool
public isVariadic ( ) : bool
public returnsReference ( ) : bool
abstract public __toString ( ) : void
}

Propriétés

name

Nom de la fonction. En lecture seule, émets ReflectionException lors d'une tentative d'écriture.

Sommaire

  • ReflectionFunctionAbstract::__clone — Clone une fonction
  • ReflectionFunctionAbstract::getClosureScopeClass — Retourne le contexte associé à la closure
  • ReflectionFunctionAbstract::getClosureThis — Retourne le pointeur lié à la fermeture
  • ReflectionFunctionAbstract::getDocComment — Récupère un commentaire
  • ReflectionFunctionAbstract::getEndLine — Récupère le numéro de la dernière ligne
  • ReflectionFunctionAbstract::getExtension — Récupère les informations d'une extension
  • ReflectionFunctionAbstract::getExtensionName — Récupère le nom de l'extension
  • ReflectionFunctionAbstract::getFileName — Récupère le nom du fichier
  • ReflectionFunctionAbstract::getName — Récupère le nom d'une fonction
  • ReflectionFunctionAbstract::getNamespaceName — Récupère l'espace de noms
  • ReflectionFunctionAbstract::getNumberOfParameters — Récupère le nombre de paramètres
  • ReflectionFunctionAbstract::getNumberOfRequiredParameters — Récupère le nombre de paramètres requis
  • ReflectionFunctionAbstract::getParameters — Récupère les paramètres
  • ReflectionFunctionAbstract::getReturnType — Récupère le type de retour définit pour une fonction
  • ReflectionFunctionAbstract::getShortName — Récupère le nom court d'une fonction
  • ReflectionFunctionAbstract::getStartLine — Récupère le numéro de ligne de départ
  • ReflectionFunctionAbstract::getStaticVariables — Récupère les variables statiques
  • ReflectionFunctionAbstract::hasReturnType — Vérifie si la fonction a un type de retour définit
  • ReflectionFunctionAbstract::inNamespace — Vérifie si une fonction est dans un espace de noms
  • ReflectionFunctionAbstract::isClosure — Vérifie si c'est une fermeture
  • ReflectionFunctionAbstract::isDeprecated — Vérifie si la fonction est obsolète
  • ReflectionFunctionAbstract::isGenerator — Vérifie si la fonction est un générateur
  • ReflectionFunctionAbstract::isInternal — Vérifie si la fonction est une fonction interne
  • ReflectionFunctionAbstract::isUserDefined — Vérifie si la fonction est définie dans l'espace utilisateur
  • ReflectionFunctionAbstract::isVariadic — Vérifie si la fonction est variadique
  • ReflectionFunctionAbstract::returnsReference — Vérifie si la fonction retourne une référence
  • ReflectionFunctionAbstract::__toString — Récupère une représentation textuelle

User Contributed Notes

There are no user contributed notes for this page.


Clone une fonction

  • « ReflectionFunctionAbstract
  • ReflectionFunctionAbstract::getClosureScopeClass »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Clone une fonction

ReflectionFunctionAbstract::__clone

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::__clone — Clone une fonction

Description

final private ReflectionFunctionAbstract::__clone ( ) : void

Clone une fonction.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Voir aussi

  • Le clonage d'objets

User Contributed Notes

There are no user contributed notes for this page.


Retourne le contexte associé à la closure

  • « ReflectionFunctionAbstract::__clone
  • ReflectionFunctionAbstract::getClosureThis »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Retourne le contexte associé à la closure

ReflectionFunctionAbstract::getClosureScopeClass

(PHP 5 >= 5.4.0, PHP 7)

ReflectionFunctionAbstract::getClosureScopeClass — Retourne le contexte associé à la closure

Description

public ReflectionFunctionAbstract::getClosureScopeClass ( ) : ReflectionClass|null

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne la classe en cas de succès, ou null si une erreur survient.

User Contributed Notes

There are no user contributed notes for this page.


Retourne le pointeur lié à la fermeture

  • « ReflectionFunctionAbstract::getClosureScopeClass
  • ReflectionFunctionAbstract::getDocComment »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Retourne le pointeur lié à la fermeture

ReflectionFunctionAbstract::getClosureThis

(PHP 5 >= 5.4.0, PHP 7)

ReflectionFunctionAbstract::getClosureThis — Retourne le pointeur lié à la fermeture

Description

public ReflectionFunctionAbstract::getClosureThis ( ) : object|null

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le pointeur $this. Retourne null si une erreur survient.

User Contributed Notes

There are no user contributed notes for this page.


Récupère un commentaire

  • « ReflectionFunctionAbstract::getClosureThis
  • ReflectionFunctionAbstract::getEndLine »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère un commentaire

ReflectionFunctionAbstract::getDocComment

(PHP 5 >= 5.1.0, PHP 7)

ReflectionFunctionAbstract::getDocComment — Récupère un commentaire

Description

public ReflectionFunctionAbstract::getDocComment ( ) : string|false

Récupère un commentaire depuis une fonction.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le commentaire, s'il existe, false sinon.

Voir aussi

  • ReflectionFunctionAbstract::getStartLine() - Récupère le numéro de ligne de départ

User Contributed Notes

jens dot kohl+php at gmail dot com 26-Mar-2012 11:19
Beware when you try to use the getDocComment() methods with eAccelerator turned on. eAccelerator »optimizes« your code in a way that it removes any comments from your source. So at runtime you're not able to get any comments and therefor getDocComments return false.
bruno at vault7 dot com 12-Nov-2009 11:09
In order to retrieve a comment with this method, the comment must be imediately before the class, function or method, start with /** and end with */


Récupère le numéro de la dernière ligne

  • « ReflectionFunctionAbstract::getDocComment
  • ReflectionFunctionAbstract::getExtension »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère le numéro de la dernière ligne

ReflectionFunctionAbstract::getEndLine

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::getEndLine — Récupère le numéro de la dernière ligne

Description

public ReflectionFunctionAbstract::getEndLine ( ) : int|false

Récupère le numéro de la dernière ligne.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le numéro de la dernière ligne d'une fonction définie dans l'espace utilisateur, ou bien false si ce numéro n'est pas connu.

Voir aussi

  • ReflectionFunctionAbstract::getStartLine() - Récupère le numéro de ligne de départ

User Contributed Notes

There are no user contributed notes for this page.


Récupère les informations d'une extension

  • « ReflectionFunctionAbstract::getEndLine
  • ReflectionFunctionAbstract::getExtensionName »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère les informations d'une extension

ReflectionFunctionAbstract::getExtension

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::getExtension — Récupère les informations d'une extension

Description

public ReflectionFunctionAbstract::getExtension ( ) : ReflectionExtension|null

Récupère les informations d'une extension.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Les informations de l'extension, sous la forme d'un objet ReflectionExtension, ou null pour les fonctions définis par l'utilisateur.

Voir aussi

  • ReflectionFunctionAbstract::getExtensionName() - Récupère le nom de l'extension

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom de l'extension

  • « ReflectionFunctionAbstract::getExtension
  • ReflectionFunctionAbstract::getFileName »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère le nom de l'extension

ReflectionFunctionAbstract::getExtensionName

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::getExtensionName — Récupère le nom de l'extension

Description

public ReflectionFunctionAbstract::getExtensionName ( ) : string

Récupère le nom de l'extension.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le nom de l'extension qui définit la fonction, ou false pour les fonctions définis par l'utilisateur.

Voir aussi

  • ReflectionFunctionAbstract::getExtension() - Récupère les informations d'une extension

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom du fichier

  • « ReflectionFunctionAbstract::getExtensionName
  • ReflectionFunctionAbstract::getName »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère le nom du fichier

ReflectionFunctionAbstract::getFileName

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::getFileName — Récupère le nom du fichier

Description

public ReflectionFunctionAbstract::getFileName ( ) : string|false

Récupère le nom du fichier depuis une fonction définie dans l'espace utilisateur.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le nom du fichier du fichier dans lequel la fonction a été définie. Si la classe est définie dans le coeur de PHP ou une extension PHP, false est retourné.

Voir aussi

  • ReflectionFunctionAbstract::getNamespaceName() - Récupère l'espace de noms

User Contributed Notes

stein at visibone dot com 04-Jul-2013 10:53
Returns FALSE for an internal function (when isInternal() returns TRUE, e.g. for 'strlen').


Récupère le nom d'une fonction

  • « ReflectionFunctionAbstract::getFileName
  • ReflectionFunctionAbstract::getNamespaceName »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère le nom d'une fonction

ReflectionFunctionAbstract::getName

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::getName — Récupère le nom d'une fonction

Description

public ReflectionFunctionAbstract::getName ( ) : string

Récupère le nom d'une fonction.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le nom de la fonction.

Voir aussi

  • ReflectionFunctionAbstract::getExtensionName() - Récupère le nom de l'extension
  • ReflectionFunctionAbstract::isUserDefined() - Vérifie si la fonction est définie dans l'espace utilisateur

User Contributed Notes

PR 14-Feb-2021 01:28
If you call getName() on an anonymous function you'll get "{closure}".


Récupère l'espace de noms

  • « ReflectionFunctionAbstract::getName
  • ReflectionFunctionAbstract::getNumberOfParameters »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère l'espace de noms

ReflectionFunctionAbstract::getNamespaceName

(PHP 5 >= 5.3.0, PHP 7)

ReflectionFunctionAbstract::getNamespaceName — Récupère l'espace de noms

Description

public ReflectionFunctionAbstract::getNamespaceName ( ) : string

Récupère l'espace de noms depuis lequel la classe est définie.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le nom de l'espace de noms.

Voir aussi

  • ReflectionFunctionAbstract::getFileName() - Récupère le nom du fichier
  • Les espaces de noms

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nombre de paramètres

  • « ReflectionFunctionAbstract::getNamespaceName
  • ReflectionFunctionAbstract::getNumberOfRequiredParameters »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère le nombre de paramètres

ReflectionFunctionAbstract::getNumberOfParameters

(PHP 5 >= 5.3.0, PHP 7)

ReflectionFunctionAbstract::getNumberOfParameters — Récupère le nombre de paramètres

Description

public ReflectionFunctionAbstract::getNumberOfParameters ( ) : int

Récupère le nombre de paramètres défini dans la fonction ; aussi bien les paramètres requis qu'optionnels.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le nombre de paramètres.

Voir aussi

  • ReflectionFunctionAbstract::getNumberOfRequiredParameters() - Récupère le nombre de paramètres requis
  • func_num_args() - Retourne le nombre d'arguments passés à la fonction

User Contributed Notes

8ctopus 23-Nov-2020 08:26
$reflection = new ReflectionFunction('implode');
echo $reflection->getNumberOfParameters();
Robert Pitt ( LitePHP ) 11-Apr-2010 03:42
Working on a new MVC Application Framework i use this method to check how many arguments are required before calling the sub method!

Example

<?php
        $this->method_args_count = $this->CReflection
            ->getMethod($Route->getMethod())
            ->getNumberOfParameters();
        //Maybe be 5 but if uri is /controller/method/single_param/ we only of 1
        $this->params = $Route->getParams(); //0 in some cases

        if($this->method_args_count > count($this->params))
        {
            $this->difference = ($this->method_args_count - count($this->params));
            for($i=0;$i<=$this->difference;$i++)
            {
                $this->params[] = false;
            }
        }

        //Call the method with correct amount of params
        // but as false for params that have not been passed!
        call_user_func_array(array(new $this->obj,$Route->getMethod()),$this->params);
?>


Récupère le nombre de paramètres requis

  • « ReflectionFunctionAbstract::getNumberOfParameters
  • ReflectionFunctionAbstract::getParameters »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère le nombre de paramètres requis

ReflectionFunctionAbstract::getNumberOfRequiredParameters

(PHP 5 >= 5.3.0, PHP 7)

ReflectionFunctionAbstract::getNumberOfRequiredParameters — Récupère le nombre de paramètres requis

Description

public ReflectionFunctionAbstract::getNumberOfRequiredParameters ( ) : int

Récupère le nombre de paramètres requis par une fonction.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le nombre de paramètres requis.

Voir aussi

  • ReflectionFunctionAbstract::getNumberOfParameters() - Récupère le nombre de paramètres

User Contributed Notes

cesar at magic3w dot com 07-Jul-2015 12:45
It's interesting to note that this function will treat optional parameters that come before a required parameter as required too. This is good since it allows you to verify that the function will be receiving enough parameters for the it to work, regardless where they are located.

<?php

class MyTest() {
    public function test($a = null, $b) {}
    public function test2($a = null, $b, $c = null) {}
}

//Create the reflection
$r  = new \ReflectionMethod('MyTest', 'test');
$r2 = new \ReflectionMethod('MyTest', 'test2');

//Verify the numbers
echo 'Test: ' . $r->getNumberOfRequiredParameters()); //Output: 2
echo 'Test2: ' . $r->getNumberOfRequiredParameters()); //Output: 2

?>
sebastian at sebastian-eiweleit dot de 02-Sep-2013 03:03
<?php
namespace ExampleWorld;
// The Class
class helloWorld {
    /* Method with two required arguments */

    public function requiredTwoArguments ( $var1, $var2 ) {
        // Some code ...
    }

    /* Method with two arguments, but just one is required */
    public function requiredOneArgument ( $var1, $var2 = false ) {
        // Some code ...
    }
}

$r = new \ReflectionMethod ( 'ExampleWorld\helloWorld', 'requiredTwoArguments' );
echo $r->getNumberOfRequiredParameters ();

$r = new \ReflectionMethod ( 'ExampleWorld\helloWorld', 'requiredOneArgument' );
echo $r->getNumberOfRequiredParameters ();

// Output: 2 1


Récupère les paramètres

  • « ReflectionFunctionAbstract::getNumberOfRequiredParameters
  • ReflectionFunctionAbstract::getReturnType »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère les paramètres

ReflectionFunctionAbstract::getParameters

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::getParameters — Récupère les paramètres

Description

public ReflectionFunctionAbstract::getParameters ( ) : array

Récupère les paramètres, sous la forme d'un tableau d'objets ReflectionParameter.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Les paramètres, sous la forme d'objets ReflectionParameter.

Voir aussi

  • ReflectionFunctionAbstract::getNumberOfParameters() - Récupère le nombre de paramètres
  • func_get_args() - Retourne les arguments d'une fonction sous la forme d'un tableau

User Contributed Notes

a dot lucassilvadeoliveira at gmail dot com 28-Nov-2020 06:08
We can use this functionality to automatically pass arguments to our function based on some data structure.

NOTE: I am using a php 8.0> feature called "Nameds parameter".

<?php

$valuesToProcess = [
  'name' => 'Anderson Lucas Silva de Oliveira',
  'age' => 21,
  'hobbie' => 'Play games'
];

function processUserData($name, $age, $job = "", $hobbie = "")
{
    $msg = "Hello $name. You have $age years old";
    if (!empty($job)) {
    $msg .= ". Your job is $job";
    }

    if (!empty($hobbie)) {
        $msg .= ". Your hobbie is $hobbie";
    }

    echo $msg . ".";
}

$refFunction = new ReflectionFunction('processUserData');
$parameters = $refFunction->getParameters();

$validParameters = [];
foreach ($parameters as $parameter) {
    if (!array_key_exists($parameter->getName(), $valuesToProcess) && !$parameter->isOptional()) {
        throw new DomainException('Cannot resolve the parameter' . $parameter->getName());
    }

    if(!array_key_exists($parameter->getName(), $valuesToProcess)) {
        continue;
    }

    $validParameters[$parameter->getName()] = $valuesToProcess[$parameter->getName()];
}

$refFunction->invoke(...$validParameters);
?>

Results in:

Hello Anderson Lucas Silva de Oliveira. You have 21 years old. Your hobbie is Play games.
dabidi at slupca dot pl 27-Oct-2015 01:33
This is part of my private framework that uses reflection.
This function get arguments list from theme method and puts corresponding vars from $_REQUEST ($_GET, $_POST, and $_COOKIE)

<?php
public static function fire_theme_method($class, $method)
{
        $fire_args=array();

        $reflection = new ReflectionMethod($class, $method);

    foreach($reflection->getParameters() AS $arg)
    {
        if($_REQUEST[$arg->name])
        $fire_args[$arg->name]=$_REQUEST[$arg->name];
        else
        $fire_args[$arg->name]=null;
    }

    return call_user_func_array(array($class, $method), $fire_args);
}
?>
For example, if my theme method needs only id, and we get this url:
http://example.com/my_class/my_method/?id=12&some_unwanted_var=123
will be ignored some_unwanted_var

Of course behind this i have .htaccess, autoloader and controller


Récupère le type de retour définit pour une fonction

  • « ReflectionFunctionAbstract::getParameters
  • ReflectionFunctionAbstract::getShortName »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère le type de retour définit pour une fonction

ReflectionFunctionAbstract::getReturnType

(PHP 7)

ReflectionFunctionAbstract::getReturnType — Récupère le type de retour définit pour une fonction

Description

public ReflectionFunctionAbstract::getReturnType ( ) : ReflectionType|null

Récupère le type de retour définit pour une fonction reflété.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un objet ReflectionType si un type de retour est définit, null sinon.

Exemples

Exemple #1 Exemple avec ReflectionFunctionAbstract::getReturnType()

<?php

function to_int($param) : int {
    return (int) $param;
}

$reflection1 = new ReflectionFunction('to_int');
echo $reflection1->getReturnType();

L'exemple ci-dessus va afficher :

int

Exemple #2 Utilisation sur les fonctions intégrés

<?php

$reflection2 = new ReflectionFunction('array_merge');

var_dump($reflection2->getReturnType());

L'exemple ci-dessus va afficher :

null

Ceci est le cas car beaucoup de fonction interne ne définissent pas un type pour leurs paramètres ou leurs valeur de retour. Il est donc conseillé d'éviter l'usage de cette méthode sur les fonctions intégrés.

Voir aussi

  • ReflectionFunctionAbstract::hasReturnType() - Vérifie si la fonction a un type de retour définit
  • ReflectionType::__toString() - To string

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom court d'une fonction

  • « ReflectionFunctionAbstract::getReturnType
  • ReflectionFunctionAbstract::getStartLine »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère le nom court d'une fonction

ReflectionFunctionAbstract::getShortName

(PHP 5 >= 5.3.0, PHP 7)

ReflectionFunctionAbstract::getShortName — Récupère le nom court d'une fonction

Description

public ReflectionFunctionAbstract::getShortName ( ) : string

Récupère le nom court d'une fonction (sans la partie concernant l'espace de noms).

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le nom court de la fonction.

Voir aussi

  • ReflectionFunctionAbstract::getNamespaceName() - Récupère l'espace de noms
  • Les espaces de noms

User Contributed Notes

There are no user contributed notes for this page.


Récupère le numéro de ligne de départ

  • « ReflectionFunctionAbstract::getShortName
  • ReflectionFunctionAbstract::getStaticVariables »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère le numéro de ligne de départ

ReflectionFunctionAbstract::getStartLine

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::getStartLine — Récupère le numéro de ligne de départ

Description

public ReflectionFunctionAbstract::getStartLine ( ) : int|false

Récupère le numéro de ligne de départ de la fonction.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le numéro de la ligne de départ, ou false si inconnue.

Voir aussi

  • ReflectionFunctionAbstract::getEndLine() - Récupère le numéro de la dernière ligne

User Contributed Notes

There are no user contributed notes for this page.


Récupère les variables statiques

  • « ReflectionFunctionAbstract::getStartLine
  • ReflectionFunctionAbstract::hasReturnType »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère les variables statiques

ReflectionFunctionAbstract::getStaticVariables

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::getStaticVariables — Récupère les variables statiques

Description

public ReflectionFunctionAbstract::getStaticVariables ( ) : array

Récupère les variables statiques.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un tableau de variables statiques.

Voir aussi

  • ReflectionFunctionAbstract::getParameters() - Récupère les paramètres

User Contributed Notes

Martiros Aghajanyan 11-Oct-2014 01:27
<?php

function test()
{
    static $a = 0, $b = 15;
    $a++;
    $b++;
    return $a;
}

$rf = new ReflectionFunction('test');

// result - Array ( [a] => 0 [b] => 15 )
print_r( $rf->getStaticVariables() );

//call test function and print again static variables
test();

// result - Array ( [a] => 1 [b] => 16 )
print_r( $rf->getStaticVariables() );

?>


Vérifie si la fonction a un type de retour définit

  • « ReflectionFunctionAbstract::getStaticVariables
  • ReflectionFunctionAbstract::inNamespace »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Vérifie si la fonction a un type de retour définit

ReflectionFunctionAbstract::hasReturnType

(PHP 7)

ReflectionFunctionAbstract::hasReturnType — Vérifie si la fonction a un type de retour définit

Description

public ReflectionFunctionAbstract::hasReturnType ( ) : bool

Vérifie si la fonction a un type de retour définit.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne true si la fonction a un type de retour définit, sinon false.

Exemples

Exemple #1 Exemple avec ReflectionFunctionAbstract::hasReturnType()

<?php

function to_int($param) : int {
    return (int) $param;
}

$reflection1 = new ReflectionFunction('to_int');
var_dump($reflection1->hasReturnType());

L'exemple ci-dessus va afficher :

bool(true)

Exemple #2 Utilisation sur les fonctions intégrés

<?php

$reflection2 = new ReflectionFunction('array_merge');

var_dump($reflection2->hasReturnType());

L'exemple ci-dessus va afficher :

bool(false)

Ceci est le cas car beaucoup de fonction interne ne définissent pas un type pour leurs paramètres ou leurs valeur de retour. Il est donc conseillé d'éviter l'usage de cette méthode sur les fonctions intégrés.

Voir aussi

  • ReflectionFunctionAbstract::getReturnType() - Récupère le type de retour définit pour une fonction

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si une fonction est dans un espace de noms

  • « ReflectionFunctionAbstract::hasReturnType
  • ReflectionFunctionAbstract::isClosure »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Vérifie si une fonction est dans un espace de noms

ReflectionFunctionAbstract::inNamespace

(PHP 5 >= 5.3.0, PHP 7)

ReflectionFunctionAbstract::inNamespace — Vérifie si une fonction est dans un espace de noms

Description

public ReflectionFunctionAbstract::inNamespace ( ) : bool

Vérifie si une fonction est dans un espace de noms.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la fonction est dans l'espace de noms, false sinon.

Voir aussi

  • ReflectionFunctionAbstract::getNamespaceName() - Récupère l'espace de noms
  • Les espaces de noms

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si c'est une fermeture

  • « ReflectionFunctionAbstract::inNamespace
  • ReflectionFunctionAbstract::isDeprecated »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Vérifie si c'est une fermeture

ReflectionFunctionAbstract::isClosure

(PHP 5 >= 5.3.0, PHP 7)

ReflectionFunctionAbstract::isClosure — Vérifie si c'est une fermeture

Description

public ReflectionFunctionAbstract::isClosure ( ) : bool

Vérifie si la fonction réfléchie est une Closure.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne true si la fonction est une Closure, sinon false

Exemples

Exemple #1 Exemple de ReflectionFunctionAbstract::isClosure()

<?php
// Non-closure
$function1 = 'str_replace';
$reflection1 = new ReflectionFunction($function1);
var_dump($reflection1->isClosure());

// Closure
$function2 = function () {};
$reflection2 = new ReflectionFunction($function2);
var_dump($reflection2->isClosure());
?>

L'exemple ci-dessus va afficher :

bool(false)
bool(true)

Voir aussi

  • ReflectionFunctionAbstract::isGenerator() - Vérifie si la fonction est un générateur

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la fonction est obsolète

  • « ReflectionFunctionAbstract::isClosure
  • ReflectionFunctionAbstract::isGenerator »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Vérifie si la fonction est obsolète

ReflectionFunctionAbstract::isDeprecated

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::isDeprecated — Vérifie si la fonction est obsolète

Description

public ReflectionFunctionAbstract::isDeprecated ( ) : bool

Vérifie si la fonction est obsolète.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la fonction est obsolète, false sinon.

Exemples

Exemple #1 Exemple avec ReflectionFunctionAbstract::isDeprecated()

<?php
$rf = new ReflectionFunction('ereg');
var_dump($rf->isDeprecated());
?>

L'exemple ci-dessus va afficher :

bool(true)

Voir aussi

  • ReflectionFunctionAbstract::getDocComment() - Récupère un commentaire

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la fonction est un générateur

  • « ReflectionFunctionAbstract::isDeprecated
  • ReflectionFunctionAbstract::isInternal »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Vérifie si la fonction est un générateur

ReflectionFunctionAbstract::isGenerator

(PHP 5 >= 5.5.0, PHP 7)

ReflectionFunctionAbstract::isGenerator — Vérifie si la fonction est un générateur

Description

public ReflectionFunctionAbstract::isGenerator ( ) : bool

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne true si la fonction est un générateur, false si ca n'en est pas un, ou null si une erreur survient.

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la fonction est une fonction interne

  • « ReflectionFunctionAbstract::isGenerator
  • ReflectionFunctionAbstract::isUserDefined »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Vérifie si la fonction est une fonction interne

ReflectionFunctionAbstract::isInternal

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::isInternal — Vérifie si la fonction est une fonction interne

Description

public ReflectionFunctionAbstract::isInternal ( ) : bool

Vérifie si la fonction est une fonction interne, au lieu d'une fonction définie dans l'espace utilisateur.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la fonction est une fonction interne, false sinon.

Voir aussi

  • ReflectionFunctionAbstract::isUserDefined() - Vérifie si la fonction est définie dans l'espace utilisateur

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la fonction est définie dans l'espace utilisateur

  • « ReflectionFunctionAbstract::isInternal
  • ReflectionFunctionAbstract::isVariadic »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Vérifie si la fonction est définie dans l'espace utilisateur

ReflectionFunctionAbstract::isUserDefined

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::isUserDefined — Vérifie si la fonction est définie dans l'espace utilisateur

Description

public ReflectionFunctionAbstract::isUserDefined ( ) : bool

Vérifie si la fonction est définie dans l'espace utilisateur, au lieu d'être une fonction interne.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la fonction a été définie dans l'espace utilisateur, false sinon.

Voir aussi

  • ReflectionFunctionAbstract::isInternal() - Vérifie si la fonction est une fonction interne

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la fonction est variadique

  • « ReflectionFunctionAbstract::isUserDefined
  • ReflectionFunctionAbstract::returnsReference »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Vérifie si la fonction est variadique

ReflectionFunctionAbstract::isVariadic

(PHP 5 >= 5.6.0, PHP 7)

ReflectionFunctionAbstract::isVariadic — Vérifie si la fonction est variadique

Description

public ReflectionFunctionAbstract::isVariadic ( ) : bool

Vérifie si la fonction est variadique.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne true si la fonction est variadique, false sinon.

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la fonction retourne une référence

  • « ReflectionFunctionAbstract::isVariadic
  • ReflectionFunctionAbstract::__toString »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Vérifie si la fonction retourne une référence

ReflectionFunctionAbstract::returnsReference

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::returnsReference — Vérifie si la fonction retourne une référence

Description

public ReflectionFunctionAbstract::returnsReference ( ) : bool

Vérifie si la fonction retourne une référence.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la fonction retourne une référence, false sinon.

Voir aussi

  • ReflectionFunctionAbstract::isClosure() - Vérifie si c'est une fermeture

User Contributed Notes

There are no user contributed notes for this page.


Récupère une représentation textuelle

  • « ReflectionFunctionAbstract::returnsReference
  • ReflectionMethod »
  • PHP Manual
  • ReflectionFunctionAbstract
  • Récupère une représentation textuelle

ReflectionFunctionAbstract::__toString

(PHP 5 >= 5.2.0, PHP 7)

ReflectionFunctionAbstract::__toString — Récupère une représentation textuelle

Description

abstract public ReflectionFunctionAbstract::__toString ( ) : void

Récupère une représentation textuelle.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Une chaîne de caractères.

Voir aussi

  • ReflectionClass::clone()
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionMethod

(PHP 5, PHP 7)

Introduction

La classe ReflectionMethod rapporte des informations sur une méthode.

Synopsis de la classe

ReflectionMethod extends ReflectionFunctionAbstract implements Reflector {
/* Constantes */
const int IS_STATIC = 1 ;
const int IS_PUBLIC = 256 ;
const int IS_PROTECTED = 512 ;
const int IS_PRIVATE = 1024 ;
const int IS_ABSTRACT = 2 ;
const int IS_FINAL = 4 ;
/* Propriétés */
public $name ;
public $class ;
/* Méthodes */
public __construct ( object|string $objectOrMethod , string $method )
public __construct ( string $classMethod )
public static export ( string $class , string $name , bool $return = false ) : string
public getClosure ( object|null $object = null ) : Closure
public getDeclaringClass ( ) : ReflectionClass
public getModifiers ( ) : int
public getPrototype ( ) : ReflectionMethod
public invoke ( object|null $object , mixed ...$args ) : mixed
public invokeArgs ( object|null $object , array $args ) : mixed
public isAbstract ( ) : bool
public isConstructor ( ) : bool
public isDestructor ( ) : bool
public isFinal ( ) : bool
public isPrivate ( ) : bool
public isProtected ( ) : bool
public isPublic ( ) : bool
public isStatic ( ) : bool
public setAccessible ( bool $accessible ) : void
public __toString ( ) : string
/* Méthodes héritées */
final private ReflectionFunctionAbstract::__clone ( ) : void
public ReflectionFunctionAbstract::getClosureScopeClass ( ) : ReflectionClass|null
public ReflectionFunctionAbstract::getClosureThis ( ) : object|null
public ReflectionFunctionAbstract::getDocComment ( ) : string|false
public ReflectionFunctionAbstract::getEndLine ( ) : int|false
public ReflectionFunctionAbstract::getExtension ( ) : ReflectionExtension|null
public ReflectionFunctionAbstract::getExtensionName ( ) : string
public ReflectionFunctionAbstract::getFileName ( ) : string|false
public ReflectionFunctionAbstract::getName ( ) : string
public ReflectionFunctionAbstract::getNamespaceName ( ) : string
public ReflectionFunctionAbstract::getNumberOfParameters ( ) : int
public ReflectionFunctionAbstract::getNumberOfRequiredParameters ( ) : int
public ReflectionFunctionAbstract::getParameters ( ) : array
public ReflectionFunctionAbstract::getReturnType ( ) : ReflectionType|null
public ReflectionFunctionAbstract::getShortName ( ) : string
public ReflectionFunctionAbstract::getStartLine ( ) : int|false
public ReflectionFunctionAbstract::getStaticVariables ( ) : array
public ReflectionFunctionAbstract::hasReturnType ( ) : bool
public ReflectionFunctionAbstract::inNamespace ( ) : bool
public ReflectionFunctionAbstract::isClosure ( ) : bool
public ReflectionFunctionAbstract::isDeprecated ( ) : bool
public ReflectionFunctionAbstract::isGenerator ( ) : bool
public ReflectionFunctionAbstract::isInternal ( ) : bool
public ReflectionFunctionAbstract::isUserDefined ( ) : bool
public ReflectionFunctionAbstract::isVariadic ( ) : bool
public ReflectionFunctionAbstract::returnsReference ( ) : bool
abstract public ReflectionFunctionAbstract::__toString ( ) : void
}

Propriétés

name

Nom de la méthode

class

Nom de la classe

Constantes pré-définies

Modificateurs de ReflectionMethod

ReflectionMethod::IS_STATIC

Indique que la méthode est statique

ReflectionMethod::IS_PUBLIC

Indique que la méthode est publique

ReflectionMethod::IS_PROTECTED

Indique que la méthode est protégée

ReflectionMethod::IS_PRIVATE

Indique que la méthode est privée

ReflectionMethod::IS_ABSTRACT

Indique que la méthode est abstraite

ReflectionMethod::IS_FINAL

Indique que la méthode est finale

Sommaire

  • ReflectionMethod::__construct — Construit un nouvel objet ReflectionMethod
  • ReflectionMethod::export — Exportation d'une méthode de reflection
  • ReflectionMethod::getClosure — Retourne une fermeture créée dynamiquement pour la méthode
  • ReflectionMethod::getDeclaringClass — Récupère la déclaration de la classe de la méthode réfléchie
  • ReflectionMethod::getModifiers — Récupère les modificateurs de la méthode
  • ReflectionMethod::getPrototype — Récupère le prototype de la méthode (s'il existe)
  • ReflectionMethod::invoke — Invoque
  • ReflectionMethod::invokeArgs — Invoque les arguments
  • ReflectionMethod::isAbstract — Vérifie si la méthode est abstraite
  • ReflectionMethod::isConstructor — Vérifie si la méthode est un constructeur
  • ReflectionMethod::isDestructor — Vérifie si la méthode est un destructeur
  • ReflectionMethod::isFinal — Vérifie si la méthode est finale
  • ReflectionMethod::isPrivate — Vérifie si la méthode est privée
  • ReflectionMethod::isProtected — Vérifie si la méthode est protégée
  • ReflectionMethod::isPublic — Vérifie si la méthode est publique
  • ReflectionMethod::isStatic — Vérifie si la méthode est statique
  • ReflectionMethod::setAccessible — Définit l'accessibilité de la méthode
  • ReflectionMethod::__toString — Retourne une représentation textuelle de la méthode

User Contributed Notes

Anonymous 02-Nov-2020 10:15
We can make a "Automatic dependenci injector" in classes when her constructors depends other classes (with type hint).

<?php

class Dependence1 {
    function foo() {
        echo "foo";
    }
}

class Dependence2 {
    function foo2() {
        echo "foo2";
    }
}

final class myClass
{
    private $dep1;
    private $dep2;

    public function __construct(
        Dependence1 $dependence1,
        Dependence2 $dependence2
    )
    {
        $this->dep1 = $dependence1;
        $this->dep2 = $dependence2;
    }

}

// Automatic dependence injection (CLASSES)

$constructor = new ReflectionMethod(myClass::class, '__construct');
$parameters = $constructor->getParameters();

$dependences = [];
foreach ($parameters as $parameter) {
    $dependenceClass = (string) $parameter->getType();
    $dependences[] = new $dependenceClass();
}

$instance = new myClass(...$dependences);
var_dump($instance);

?>

Results in:

object(myClass)#6 (2) {
  ["dep1":"myClass":private]=>
  object(Dependence1)#4 (0) {
  }
  ["dep2":"myClass":private]=>
  object(Dependence2)#5 (0) {
  }
}
webseiten dot designer at googlemail dot com 02-Apr-2011 11:53
Note that the public member $class contains the name of the class in which the method has been defined:

<?php
class A {public function __construct() {}}
class B extends A {}

$method = new ReflectionMethod('B', '__construct');
echo $method->class; // prints 'A'
?>
no dot prob at gmx dot net 02-Jun-2006 01:09
I have written a function which returns the value of a given DocComment tag.

Full example:

<?php

header('Content-Type: text/plain');

class Example
{
    /**
     * This is my DocComment!
     *
     * @DocTag: prints Hello World!
     */
    public function myMethod()
    {
        echo 'Hello World!';
    }
}

function getDocComment($str, $tag = '')
{
    if (empty($tag))
    {
        return $str;
    }

    $matches = array();
    preg_match("/".$tag.":(.*)(\\r\\n|\\r|\\n)/U", $str, $matches);

    if (isset($matches[1]))
    {
        return trim($matches[1]);
    }

    return '';
}

$method = new ReflectionMethod('Example', 'myMethod');

// will return Hello World!
echo getDocComment($method->getDocComment(), '@DocTag');

?>

Maybe you can add this functionality to the getDocComment methods of the reflection classes.


Construit un nouvel objet ReflectionMethod

  • « ReflectionMethod
  • ReflectionMethod::export »
  • PHP Manual
  • ReflectionMethod
  • Construit un nouvel objet ReflectionMethod

ReflectionMethod::__construct

(PHP 5, PHP 7)

ReflectionMethod::__construct — Construit un nouvel objet ReflectionMethod

Description

public ReflectionMethod::__construct ( object|string $objectOrMethod , string $method )

Signature alternative (non supporté avec les arguments nommés) :

public ReflectionMethod::__construct ( string $classMethod )

Construit un nouvel objet ReflectionMethod.

Liste de paramètres

objectOrMethod

Nom de classe -ou instance de celle-ci- qui contient la méthode.

method

Nom de la méthode.

classMethod

Nom de classe et de méthode délimités par ::.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

Une ReflectionException est émise si la méthode considérée n'existe pas.

Exemples

Exemple #1 Exemple avec ReflectionMethod::__construct()

<?php
class Counter
{
    private static $c = 0;

    /**
     * Compteur qui s'incrémente
     *
     * @final
     * @static
     * @access  public
     * @return  int
     */
    final public static function increment()
    {
        return ++self::$c;
    }
}

// Crée une nouvelle instance de la classe ReflectionMethod
$method = new ReflectionMethod('Counter', 'increment');

// Affiche des informations
printf(
    "===> The %s%s%s%s%s%s%s method '%s' (which is %s)\n" .
    "     declared in %s\n" .
    "     lines %d to %d\n" .
    "     having the modifiers %d[%s]\n",
        $method->isInternal() ? 'internal' : 'user-defined',
        $method->isAbstract() ? ' abstract' : '',
        $method->isFinal() ? ' final' : '',
        $method->isPublic() ? ' public' : '',
        $method->isPrivate() ? ' private' : '',
        $method->isProtected() ? ' protected' : '',
        $method->isStatic() ? ' static' : '',
        $method->getName(),
        $method->isConstructor() ? 'the constructor' : 'a regular method',
        $method->getFileName(),
        $method->getStartLine(),
        $method->getEndline(),
        $method->getModifiers(),
        implode(' ', Reflection::getModifierNames($method->getModifiers()))
);

// Affiche le commentaire de documentation
printf("---> Documentation:\n %s\n", var_export($method->getDocComment(), true));

// Affiche les variables statiques, si elles existent
if ($statics= $method->getStaticVariables()) {
    printf("---> Static variables: %s\n", var_export($statics, true));
}

// Invoque la méthode
printf("---> Invocation results in: ");
var_dump($method->invoke(NULL));
?>

Résultat de l'exemple ci-dessus est similaire à :

===> The user-defined final public static method 'increment' (which is a regular method)
     declared in /Users/philip/cvs/phpdoc/test.php
     lines 14 to 17
     having the modifiers 261[final public static]
---> Documentation:
 '/**
     * Compteur qui s'incrémente
     *
     * @final
     * @static
     * @access  public
     * @return  int
     */'
---> Invocation results in: int(1)

Voir aussi

  • ReflectionMethod::export() - Exportation d'une méthode de reflection
  • Les constructeurs

User Contributed Notes

There are no user contributed notes for this page.


Exportation d'une méthode de reflection

  • « ReflectionMethod::__construct
  • ReflectionMethod::getClosure »
  • PHP Manual
  • ReflectionMethod
  • Exportation d'une méthode de reflection

ReflectionMethod::export

(PHP 5, PHP 7)

ReflectionMethod::export — Exportation d'une méthode de reflection

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 7.4.0. Dépendre de cette fonction est fortement déconseillé.

Description

public static ReflectionMethod::export ( string $class , string $name , bool $return = false ) : string

Exporte un objet ReflectionMethod.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

class

Le nom de la classe.

name

Le nom de la méthode.

return

Le fait de le définir à true retournera l'export plutôt que l'émission. Le définir à false (par défaut) fera l'inverse.

Valeurs de retour

Si le paramètre return est défini à true, l'export sera retourné sous la forme d'une chaîne de caractères, sinon, null sera retourné.

Voir aussi

  • ReflectionMethod::__construct() - Construit un nouvel objet ReflectionMethod
  • ReflectionMethod::__toString() - Retourne une représentation textuelle de la méthode

User Contributed Notes

There are no user contributed notes for this page.


Retourne une fermeture créée dynamiquement pour la méthode

  • « ReflectionMethod::export
  • ReflectionMethod::getDeclaringClass »
  • PHP Manual
  • ReflectionMethod
  • Retourne une fermeture créée dynamiquement pour la méthode

ReflectionMethod::getClosure

(PHP 5 >= 5.4.0, PHP 7)

ReflectionMethod::getClosure — Retourne une fermeture créée dynamiquement pour la méthode

Description

public ReflectionMethod::getClosure ( object|null $object = null ) : Closure

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

object

Interdit pour les méthodes statiques, requis pour les autres méthodes.

Valeurs de retour

Retourne un objet Closure. Retourne null si une erreur survient.

Historique

Version | Description
8.0.0 | object est désormais nullable.

User Contributed Notes

okto 14-Aug-2016 10:45
Use method from another class context.

<?php

class A {
    private $var = 'class A';

    public function getVar() {
        return $this->var;
    }

    public function getCl() {
        return function () {
            $this->getVar();
        };
    }
}

class B {
    private $var = 'class B';
}

$a = new A();
$b = new B();

print $a->getVar() . PHP_EOL;

$reflection = new ReflectionClass(get_class($a));
$closure    = $reflection->getMethod('getVar')->getClosure($a);
$get_var_b  = $closure->bindTo($b, $b);

print $get_var_b() . PHP_EOL;

// Output:
// class A
// class B
Denis Doronin 18-Jan-2013 08:05
You can call private methods with getClosure():

<?php

function call_private_method($object, $method, $args = array()) {
    $reflection = new ReflectionClass(get_class($object));
    $closure = $reflection->getMethod($method)->getClosure($object);
    return call_user_func_array($closure, $args);
}

class Example {

    private $x = 1, $y = 10;

    private function sum() {
        print $this->x + $this->y;
    }

}

call_private_method(new Example(), 'sum');

?>

Output is 11.


Récupère la déclaration de la classe de la méthode réfléchie

  • « ReflectionMethod::getClosure
  • ReflectionMethod::getModifiers »
  • PHP Manual
  • ReflectionMethod
  • Récupère la déclaration de la classe de la méthode réfléchie

ReflectionMethod::getDeclaringClass

(PHP 5, PHP 7)

ReflectionMethod::getDeclaringClass — Récupère la déclaration de la classe de la méthode réfléchie

Description

public ReflectionMethod::getDeclaringClass ( ) : ReflectionClass

Récupère la déclaration de la classe de la méthode réfléchie

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un objet ReflectionClass concernant la classe appartenant à la méthode réfléchie.

Exemples

Exemple #1 Exemple pour ReflectionMethod::getDeclaringClass()

<?php
class HelloWorld {

    protected function sayHelloTo($name) {
        return 'Hello ' . $name;
    }

}

$reflectionMethod = new ReflectionMethod(new HelloWorld(), 'sayHelloTo');
var_dump($reflectionMethod->getDeclaringClass());
?>

L'exemple ci-dessus va afficher :

object(ReflectionClass)#2 (1) {
  ["name"]=>
  string(10) "HelloWorld"
}

Voir aussi

  • ReflectionMethod::isAbstract() - Vérifie si la méthode est abstraite

User Contributed Notes

There are no user contributed notes for this page.


Récupère les modificateurs de la méthode

  • « ReflectionMethod::getDeclaringClass
  • ReflectionMethod::getPrototype »
  • PHP Manual
  • ReflectionMethod
  • Récupère les modificateurs de la méthode

ReflectionMethod::getModifiers

(PHP 5, PHP 7)

ReflectionMethod::getModifiers — Récupère les modificateurs de la méthode

Description

public ReflectionMethod::getModifiers ( ) : int

Retourne un champ de bits de modificateurs d'accès pour cette méthode.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Une représentation numérique des modificateurs. Les modificateurs sont précisés plus bas. La signification de ces modificateurs est décrite dans les constantes prédéfinies.

Exemples

Exemple #1 Exemple avec ReflectionMethod::getModifiers()

<?php
class Testing
{
    final public static function foo()
    {
        return;
    }
    public function bar()
    {
        return;
    }
}

$foo = new ReflectionMethod('Testing', 'foo');

echo "Modificateurs pour la méthode foo():\n";
echo $foo->getModifiers() . "\n";
echo implode(' ', Reflection::getModifierNames($foo->getModifiers())) . "\n";

$bar = new ReflectionMethod('Testing', 'bar');

echo "Modificateurs pour la méthode bar():\n";
echo $bar->getModifiers() . "\n";
echo implode(' ', Reflection::getModifierNames($bar->getModifiers()));
?>

Résultat de l'exemple ci-dessus est similaire à :

Modificateurs pour la méthode foo():
261
final public static
Modificateurs pour la méthode bar():
65792
public

Voir aussi

  • Reflection::getModifierNames() - Récupère les nom des modificateurs

User Contributed Notes

There are no user contributed notes for this page.


Récupère le prototype de la méthode (s'il existe)

  • « ReflectionMethod::getModifiers
  • ReflectionMethod::invoke »
  • PHP Manual
  • ReflectionMethod
  • Récupère le prototype de la méthode (s'il existe)

ReflectionMethod::getPrototype

(PHP 5 >= 5.1.2, PHP 7)

ReflectionMethod::getPrototype — Récupère le prototype de la méthode (s'il existe)

Description

public ReflectionMethod::getPrototype ( ) : ReflectionMethod

Retourne le prototype de la méthode.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un objet ReflectionMethod instance de la méthode.

Erreurs / Exceptions

Une exception ReflectionException sera émise si la méthode ne possède pas de prototype.

Exemples

Exemple #1 Exemple avec ReflectionMethod::getPrototype()

<?php
class Hello {

    public function sayHelloTo($name) {
        return 'Hello ' . $name;
    }

}
class HelloWorld extends Hello {

    public function sayHelloTo($name) {
        return 'Hello world: ' . $name;
    }

}

$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
var_dump($reflectionMethod->getPrototype());
?>

L'exemple ci-dessus va afficher :

object(ReflectionMethod)#2 (2) {
  ["name"]=>
  string(10) "sayHelloTo"
  ["class"]=>
  string(5) "Hello"
}

Voir aussi

  • ReflectionMethod::getModifiers() - Récupère les modificateurs de la méthode

User Contributed Notes

There are no user contributed notes for this page.


Invoque

  • « ReflectionMethod::getPrototype
  • ReflectionMethod::invokeArgs »
  • PHP Manual
  • ReflectionMethod
  • Invoque

ReflectionMethod::invoke

(PHP 5, PHP 7)

ReflectionMethod::invoke — Invoque

Description

public ReflectionMethod::invoke ( object|null $object , mixed ...$args ) : mixed

Invoque une méthode reflétée.

Liste de paramètres

object

L'objet sur lequel invoquer la méthode. Pour les méthodes statiques, passez null comme paramètre.

args

Paramètres à passer à la méthode. Ceci accepte un nombre variable de paramètres qui seront passés à la méthode.

Valeurs de retour

Retourne le résultat de la méthode.

Erreurs / Exceptions

Une ReflectionException si object n'est pas une instance de la classe dont la méthode a été déclaré.

Une ReflectionException si l'invocation de la méthode échoue.

Exemples

Exemple #1 Exemple avec ReflectionMethod::invoke()

<?php
class HelloWorld {

    public function sayHelloTo($name) {
        return 'Hello ' . $name;
    }

}

$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invoke(new HelloWorld(), 'Mike');
?>

L'exemple ci-dessus va afficher :

Hello Mike

Notes

Note:

Si la fonction a des arguments qui ont besoin d'être des références, alors ils doivent être passés par références dans la liste des arguments.

Voir aussi

  • ReflectionMethod::invokeArgs() - Invoque les arguments
  • __invoke()
  • call_user_func() - Appelle une fonction de rappel fournie par le premier argument

User Contributed Notes

dimitriy at remerov dot ru 06-Jun-2012 01:19
This method can be used to call a overwritten public method of a parent class on an child instance
The following code will output "A":

<?php

class A
{
    public function foo()
    {
        return __CLASS__;
    }
}

class B extends A
{
    public function foo()
    {
        return __CLASS__;
    }
}

$b = new B();

$reflection = new ReflectionObject($b);

$parentReflection = $reflection->getParentClass();

$parentFooReflection = $parentReflection->getMethod('foo');

$data = $parentFooReflection->invoke($b);

echo $data;

?>
templargrey at wp dot pl 21-Jul-2011 01:12
Seems that Reflection doesn`t resolve late static bindings - var_dump will show "string 'a' (length=1)".

<?php
class ParentClass { protected static $a = 'a'; static public function init() { return static::$a; } }
class ChildClass extends ParentClass { protected static $a = 'b'; }

$r = new ReflectionClass('ChildClass');
var_dump($r->getMethod('init')->invoke(null));
?>
rojaro at gmail dot com 10-Feb-2011 01:56
Note: If you want to invoke protected or private methods, you'll first have to make them accessible using the setAccessible() method (see http://php.net/reflectionmethod.setaccessible ).


Invoque les arguments

  • « ReflectionMethod::invoke
  • ReflectionMethod::isAbstract »
  • PHP Manual
  • ReflectionMethod
  • Invoque les arguments

ReflectionMethod::invokeArgs

(PHP 5 >= 5.1.2, PHP 7)

ReflectionMethod::invokeArgs — Invoque les arguments

Description

public ReflectionMethod::invokeArgs ( object|null $object , array $args ) : mixed

Invoque la méthode réfléchie et lui passe les arguments sous la forme d'un tableau.

Liste de paramètres

object

L'objet sur lequel invoquer la méthode. Si la méthode est statique, vous pouvez passer null pour ce paramètre.

args

Les paramètres à passer à la méthode, sous forme de tableau.

Valeurs de retour

Retourne le résultat de la méthode.

Erreurs / Exceptions

Une ReflectionException si object n'est pas une instance de la classe prévue pour cette méthode.

Une ReflectionException si l'invocation de la méthode échoue.

Exemples

Exemple #1 Exemple pour ReflectionMethod::invokeArgs()

<?php
class HelloWorld {

    public function sayHelloTo($name) {
        return 'Hello ' . $name;
    }

}

$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invokeArgs(new HelloWorld(), array('Mike'));
?>

L'exemple ci-dessus va afficher :

Hello Mike

Notes

Note:

Si la fonction a des arguments qui ont besoin d'être des références, alors ils doivent être passés par références dans la liste des arguments.

Voir aussi

  • ReflectionMethod::invoke() - Invoque
  • __invoke()
  • call_user_func_array() - Appelle une fonction de rappel avec les paramètres rassemblés en tableau

User Contributed Notes

CodeCoutureXX at gmail dot com 03-Sep-2015 09:12
If you need to call ReflectionMethod::invokeArgs() on a static function you can pass NULL in for the $object parameter.

Example:

<?php
     class myClass {
          public static myStaticFunc($a, $b) {
               return $a + $b;
          }
     }

     $ref = new ReflectionMethod('myClass', 'myStaticFunc');
     echo $ref->invokeArgs(NULL, [12, 7]);
?>

produces the following output:

19
cweiske at cweiske dot de 25-Mar-2011 07:34
Passing arguments by reference works:
<?php $rm->invokeArgs($object, array(&$foo, $bar)); ?>
agent_harris at secure-mail dot biz 13-Feb-2011 07:12
There is a simple workaround for the reference passing problem:
Since the reflection api has to handle all parameters in a generic way it has no chance to guess if you wish to pass data per value or reference.

But it seems that you can also decide to pass a reference from where you call the function or method (not just only by the ampersand prefix in its declaration).

So just do the following; which worked for me:

<?php
//...
$method->invoke($object, $inputValue, &$outputValue);
?>

Since this will only be necessary with arrays and primitive data types it should be acceptable in most cases to know in advance if you need to pass per reference. But it is probably although necessary to keep the ampersand always in the declaration (because of the at least two layers between the actual function and your invoke call).

If this is the expected behavior it will maybe make sense to mention it in the documentation for invoke and invokeArgs.
serg dot smertin at gmail dot com 21-Sep-2010 06:51
We can do black magic, which is useful in templating block calls:

<?php
     $object->__named('methodNameHere', array('arg3' => 'three', 'arg1' => 'one'));

     ...

      /**
       * Pass method arguments by name
       *
       * @param string $method
       * @param array $args
       * @return mixed
       */
      public function __named($method, array $args = array())
      {
        $reflection = new ReflectionMethod($this, $method);

        $pass = array();
        foreach($reflection->getParameters() as $param)
        {
          /* @var $param ReflectionParameter */
          if(isset($args[$param->getName()]))
          {
            $pass[] = $args[$param->getName()];
          }
          else
          {
            $pass[] = $param->getDefaultValue();
          }
        }

        return $reflection->invokeArgs($this, $pass);
      }
?>


Vérifie si la méthode est abstraite

  • « ReflectionMethod::invokeArgs
  • ReflectionMethod::isConstructor »
  • PHP Manual
  • ReflectionMethod
  • Vérifie si la méthode est abstraite

ReflectionMethod::isAbstract

(PHP 5, PHP 7)

ReflectionMethod::isAbstract — Vérifie si la méthode est abstraite

Description

public ReflectionMethod::isAbstract ( ) : bool

Vérifie si la méthode est abstraite.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la méthode est abstraite, false sinon.

Voir aussi

  • ReflectionMethod::getDeclaringClass() - Récupère la déclaration de la classe de la méthode réfléchie

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la méthode est un constructeur

  • « ReflectionMethod::isAbstract
  • ReflectionMethod::isDestructor »
  • PHP Manual
  • ReflectionMethod
  • Vérifie si la méthode est un constructeur

ReflectionMethod::isConstructor

(PHP 5, PHP 7)

ReflectionMethod::isConstructor — Vérifie si la méthode est un constructeur

Description

public ReflectionMethod::isConstructor ( ) : bool

Vérifie si la méthode est un constructeur.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la méthode est un constructeur; false sinon.

Voir aussi

  • ReflectionMethod::__construct() - Construit un nouvel objet ReflectionMethod
  • ReflectionMethod::isAbstract() - Vérifie si la méthode est abstraite
  • ReflectionMethod::isDestructor() - Vérifie si la méthode est un destructeur

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la méthode est un destructeur

  • « ReflectionMethod::isConstructor
  • ReflectionMethod::isFinal »
  • PHP Manual
  • ReflectionMethod
  • Vérifie si la méthode est un destructeur

ReflectionMethod::isDestructor

(PHP 5, PHP 7)

ReflectionMethod::isDestructor — Vérifie si la méthode est un destructeur

Description

public ReflectionMethod::isDestructor ( ) : bool

Vérifie si la méthode est un destructeur.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la méthode est un destructeur, false sinon.

Voir aussi

  • ReflectionMethod::isConstructor() - Vérifie si la méthode est un constructeur

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la méthode est finale

  • « ReflectionMethod::isDestructor
  • ReflectionMethod::isPrivate »
  • PHP Manual
  • ReflectionMethod
  • Vérifie si la méthode est finale

ReflectionMethod::isFinal

(PHP 5, PHP 7)

ReflectionMethod::isFinal — Vérifie si la méthode est finale

Description

public ReflectionMethod::isFinal ( ) : bool

Vérifie si la méthode est finale.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la méthode est finale, false sinon.

Voir aussi

  • ReflectionMethod::isStatic() - Vérifie si la méthode est statique

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la méthode est privée

  • « ReflectionMethod::isFinal
  • ReflectionMethod::isProtected »
  • PHP Manual
  • ReflectionMethod
  • Vérifie si la méthode est privée

ReflectionMethod::isPrivate

(PHP 5, PHP 7)

ReflectionMethod::isPrivate — Vérifie si la méthode est privée

Description

public ReflectionMethod::isPrivate ( ) : bool

Vérifie si la méthode est privée.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la méthode est privée, false sinon.

Voir aussi

  • ReflectionMethod::isPublic() - Vérifie si la méthode est publique

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la méthode est protégée

  • « ReflectionMethod::isPrivate
  • ReflectionMethod::isPublic »
  • PHP Manual
  • ReflectionMethod
  • Vérifie si la méthode est protégée

ReflectionMethod::isProtected

(PHP 5, PHP 7)

ReflectionMethod::isProtected — Vérifie si la méthode est protégée

Description

public ReflectionMethod::isProtected ( ) : bool

Vérifie si la méthode est protégée.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la méthode est protégée, false sinon.

Voir aussi

  • ReflectionMethod::isPrivate() - Vérifie si la méthode est privée

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la méthode est publique

  • « ReflectionMethod::isProtected
  • ReflectionMethod::isStatic »
  • PHP Manual
  • ReflectionMethod
  • Vérifie si la méthode est publique

ReflectionMethod::isPublic

(PHP 5, PHP 7)

ReflectionMethod::isPublic — Vérifie si la méthode est publique

Description

public ReflectionMethod::isPublic ( ) : bool

Vérifie si la méthode est publique.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la méthode est statique, false sinon.

Voir aussi

  • ReflectionMethod::isPrivate() - Vérifie si la méthode est privée

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la méthode est statique

  • « ReflectionMethod::isPublic
  • ReflectionMethod::setAccessible »
  • PHP Manual
  • ReflectionMethod
  • Vérifie si la méthode est statique

ReflectionMethod::isStatic

(PHP 5, PHP 7)

ReflectionMethod::isStatic — Vérifie si la méthode est statique

Description

public ReflectionMethod::isStatic ( ) : bool

Vérifie si la méthode est statique.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la méthode est statique, false sinon.

Voir aussi

  • ReflectionMethod::isFinal() - Vérifie si la méthode est finale

User Contributed Notes

There are no user contributed notes for this page.


Définit l'accessibilité de la méthode

  • « ReflectionMethod::isStatic
  • ReflectionMethod::__toString »
  • PHP Manual
  • ReflectionMethod
  • Définit l'accessibilité de la méthode

ReflectionMethod::setAccessible

(PHP 5 >= 5.3.2, PHP 7)

ReflectionMethod::setAccessible — Définit l'accessibilité de la méthode

Description

public ReflectionMethod::setAccessible ( bool $accessible ) : void

Active l'invocation des méthodes protégées et privées via la méthode ReflectionMethod::invoke().

Liste de paramètres

accessible

true pour permettre l'accessibilité, ou false.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Définition d'une classe simple

<?php
class MyClass
{
    private function foo()
    {
        return 'bar';
    }
}
$method = new ReflectionMethod("MyClass", "foo");
$method->setAccessible(true);
$obj = new MyClass();
echo $method->invoke($obj);
echo $obj->foo();
?>

Résultat de l'exemple ci-dessus est similaire à :

bar
Fatal error: Uncaught Error: Call to private method MyClass::foo() from global scope in /in/qdaZS:16

Voir aussi

  • ReflectionMethod::isPrivate() - Vérifie si la méthode est privée
  • ReflectionMethod::isProtected() - Vérifie si la méthode est protégée

User Contributed Notes

dave1010 at gmail dot com 11-May-2011 03:21
This is handy for accessing private methods but remember that things are normally private for a reason! Unit Testing is one (debatable) use case for this.

Example:
<?php
class Foo {
  private function myPrivateMethod() {
    return 7;
  }
}

$method = new ReflectionMethod('Foo', 'myPrivateMethod');
$method->setAccessible(true);

echo $method->invoke(new Foo);
// echos "7"
?>

This works nicely with PHPUnit: http://php.net/manual/en/reflectionmethod.setaccessible.php


Retourne une représentation textuelle de la méthode

  • « ReflectionMethod::setAccessible
  • ReflectionNamedType »
  • PHP Manual
  • ReflectionMethod
  • Retourne une représentation textuelle de la méthode

ReflectionMethod::__toString

(PHP 5, PHP 7)

ReflectionMethod::__toString — Retourne une représentation textuelle de la méthode

Description

public ReflectionMethod::__toString ( ) : string

Récupère une représentation textuelle de la méthode.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Une représentation textuelle de cet objet ReflectionMethod.

Exemples

Exemple #1 ReflectionMethod::__toString() example

<?php
class HelloWorld {

    public function sayHelloTo($name) {
        return 'Hello ' . $name;
    }

}

$reflectionMethod = new ReflectionMethod(new HelloWorld(), 'sayHelloTo');
echo $reflectionMethod;
?>

L'exemple ci-dessus va afficher :

Method [ <user> public method sayHelloTo ] {
  @@ /var/www/examples/reflection.php 16 - 18

  - Parameters [1] {
    Parameter #0 [ <required> $name ]
  }
}

Voir aussi

  • ReflectionMethod::export() - Exportation d'une méthode de reflection
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionNamedType

(PHP 7 >= 7.1.0)

Introduction

Synopsis de la classe

ReflectionNamedType extends ReflectionType {
/* Méthodes */
public getName ( ) : string
public isBuiltin ( ) : bool
/* Méthodes héritées */
public ReflectionType::allowsNull ( ) : bool
public ReflectionType::__toString ( ) : string
}

Sommaire

  • ReflectionNamedType::getName — Récupère le texte de la déclaration de type
  • ReflectionNamedType::isBuiltin — Vérifie si c'est un type intégré

User Contributed Notes

There are no user contributed notes for this page.


Récupère le texte de la déclaration de type

  • « ReflectionNamedType
  • ReflectionNamedType::isBuiltin »
  • PHP Manual
  • ReflectionNamedType
  • Récupère le texte de la déclaration de type

ReflectionNamedType::getName

(PHP 7 >= 7.1.0)

ReflectionNamedType::getName — Récupère le texte de la déclaration de type

Description

public ReflectionNamedType::getName ( ) : string

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Récupère le texte de la déclaration de type.

Voir aussi

  • ReflectionType::__toString() - To string

User Contributed Notes

e3jeremy at gmail dot com 04-Jul-2018 07:28
Method "getName" is available when you access getType from getParameters from class reports information of a method(ReflectionMethod).
No need to instantiate the ReflectionNamedType.

Below is my custom method on resolving method dependencies, getName is a big help.

<?php

class A
{
    public function my()
    {
        return ' My ';
    }
}

class B
{
    public function __construct(A $a)
    {
        $this->a = $a;
    }

    public function hello($string)
    {
        return 'Hello' . $this->a->my() . $string . '.';
    }
}

class C
{
    public function print($instance, $method)
    {
        $params = ['World'];

        echo call_user_func_array(array($instance, $method), array_merge($this->resolveMethodDependencies($instance, $method), $params));
    }

    public function instantiate($class)
    {
        if(method_exists($class, '__construct')) $instance = new $class(...$this->resolveMethodDependencies($class, '__construct'));
        else $instance = new $class;

        return $instance;
    }

    protected function resolveMethodDependencies($class, $method)
    {
        $params = [];
        $reflection = new \ReflectionMethod($class, $method);

        foreach ($reflection->getParameters() as $param) {

            if($type = $param->getType()) {

                if(!$type || !$this->instatiatable ($type)) continue;

                // This is the right way to get the class name in string.
                $className = $type->getName();

                // This will throw error.
                // $className = $param->getType();

                // Alos this one will do the trick.
                // $className = (string) $param->getType();

                if(method_exists($className, '__construct')) {
                    $params[] = new $className(...$this->resolveMethodDependencies($className, '__construct'));
                    continue;
                }

                $params[] = new $className;
            }
        }
        return $params;
    }

    protected function instatiatable ($type)
    {
        // Add conditon if something is leftout.
        // This is to ensure that the type is existing class.
        return $type != 'Closure' && !is_callable($type) && class_exists($type);
    }
}

$class = new C;

$class->print(
    $class->instantiate('B'), 'hello'
);

Output:
Hello My World.


Vérifie si c'est un type intégré

  • « ReflectionNamedType::getName
  • ReflectionObject »
  • PHP Manual
  • ReflectionNamedType
  • Vérifie si c'est un type intégré

ReflectionNamedType::isBuiltin

(PHP 7)

ReflectionNamedType::isBuiltin — Vérifie si c'est un type intégré

Description

public ReflectionNamedType::isBuiltin ( ) : bool

Vérifie si le type est un type intégré en PHP.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si c'est un type intégré en PHP, sinon false

Exemples

Exemple #1 Exemple avec ReflectionNamedType::isBuiltin()

<?php
class SomeClass {}

function someFunction(string $param, SomeClass $param2, StdClass $param3) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParams = $reflectionFunc->getParameters();

var_dump($reflectionParams[0]->getType()->isBuiltin());
var_dump($reflectionParams[1]->getType()->isBuiltin());
var_dump($reflectionParams[2]->getType()->isBuiltin());

L'exemple ci-dessus va afficher :

bool(true)
bool(false)
bool(false)

Notez que la méthode ReflectionNamedType::isBuiltin() ne distingue pas entre des classes internes et utilisateur. Pour faire cette distinction, la méthode ReflectionClass::isInternal() doit être utilisé sur le nom de classe retourné.

Voir aussi

  • ReflectionType::allowsNull() - Vérifie si null est permit
  • ReflectionType::__toString() - To string
  • ReflectionClass::isInternal() - Vérifie si une classe est définie comme interne par une extension
  • ReflectionParameter::getType() - Récupère le type du paramètre

User Contributed Notes

mndevel at gmail dot com 13-Mar-2021 10:16
I couldn't find a list of what qualifies as a builtin. Here is what I have so far:
string
float
bool
int
iterable (Iterator reflects as type iterable)
mixed
array

These do not qualify as builtins:
Closure
Stringable
Generator
Traversable
Serializable
Throwable
IteratorAggregate
ArrayAccess
WeakReference
JsonSerializeable


La classe ReflectionObject

(PHP 5, PHP 7)

Introduction

La classe ReflectionObject rapporte des informations sur un object.

Synopsis de la classe

ReflectionObject extends ReflectionClass implements Reflector {
/* Constants héritées */
const int ReflectionClass::IS_IMPLICIT_ABSTRACT = 16 ;
const int ReflectionClass::IS_EXPLICIT_ABSTRACT = 32 ;
const int ReflectionClass::IS_FINAL = 64 ;
/* Propriétés */
public $name ;
/* Méthodes */
public __construct ( object $object )
public static export ( string $argument , bool $return = ? ) : string
/* Méthodes héritées */
public static ReflectionClass::export ( mixed $argument , bool $return = false ) : string
public ReflectionClass::getConstant ( string $name ) : mixed
public ReflectionClass::getConstants ( int|null $filter = null ) : array
public ReflectionClass::getConstructor ( ) : ReflectionMethod|null
public ReflectionClass::getDefaultProperties ( ) : array
public ReflectionClass::getDocComment ( ) : string|false
public ReflectionClass::getEndLine ( ) : int|false
public ReflectionClass::getExtension ( ) : ReflectionExtension|null
public ReflectionClass::getExtensionName ( ) : string|false
public ReflectionClass::getFileName ( ) : string|false
public ReflectionClass::getInterfaceNames ( ) : array
public ReflectionClass::getInterfaces ( ) : array
public ReflectionClass::getMethod ( string $name ) : ReflectionMethod
public ReflectionClass::getMethods ( int|null $filter = null ) : array
public ReflectionClass::getModifiers ( ) : int
public ReflectionClass::getName ( ) : string
public ReflectionClass::getNamespaceName ( ) : string
public ReflectionClass::getParentClass ( ) : ReflectionClass|false
public ReflectionClass::getProperties ( int|null $filter = null ) : array
public ReflectionClass::getProperty ( string $name ) : ReflectionProperty
public ReflectionClass::getReflectionConstant ( string $name ) : ReflectionClassConstant|false
public ReflectionClass::getReflectionConstants ( int|null $filter = null ) : array
public ReflectionClass::getShortName ( ) : string
public ReflectionClass::getStartLine ( ) : int|false
public ReflectionClass::getStaticProperties ( ) : array|null
public ReflectionClass::getStaticPropertyValue ( string $name , mixed &$def_value = ? ) : mixed
public ReflectionClass::getTraitAliases ( ) : array
public ReflectionClass::getTraitNames ( ) : array
public ReflectionClass::getTraits ( ) : array
public ReflectionClass::hasConstant ( string $name ) : bool
public ReflectionClass::hasMethod ( string $name ) : bool
public ReflectionClass::hasProperty ( string $name ) : bool
public ReflectionClass::implementsInterface ( ReflectionClass|string $interface ) : bool
public ReflectionClass::inNamespace ( ) : bool
public ReflectionClass::isAbstract ( ) : bool
public ReflectionClass::isAnonymous ( ) : bool
public ReflectionClass::isCloneable ( ) : bool
public ReflectionClass::isFinal ( ) : bool
public ReflectionClass::isInstance ( object $object ) : bool
public ReflectionClass::isInstantiable ( ) : bool
public ReflectionClass::isInterface ( ) : bool
public ReflectionClass::isInternal ( ) : bool
public ReflectionClass::isIterable ( ) : bool
public ReflectionClass::isSubclassOf ( ReflectionClass|string $class ) : bool
public ReflectionClass::isTrait ( ) : bool
public ReflectionClass::isUserDefined ( ) : bool
public ReflectionClass::newInstance ( mixed ...$args ) : object
public ReflectionClass::newInstanceArgs ( array $args = [] ) : object
public ReflectionClass::newInstanceWithoutConstructor ( ) : object
public ReflectionClass::setStaticPropertyValue ( string $name , mixed $value ) : void
public ReflectionClass::__toString ( ) : string
}

Propriétés

name

Nom de l'objet de la classe. En lecture seule, émets une exception de type ReflectionException si l'on tente d'y écrire.

Sommaire

  • ReflectionObject::__construct — Construit un nouvel objet ReflectionObject
  • ReflectionObject::export — Exportation

User Contributed Notes

ccb_bc at hotmail dot com 21-May-2019 03:39
<?php
    class FullReflectionObject {

        /**
        * @var obj => $ReflectionObject = propriedade que representa o objeto $ReflectionObject
        * @var obj => $ReflectionProperty = propriedade que representa o objeto $ReflectionProperty
        * @var obj => $ReflectionMethod = propriedade que representa o objeto $ReflectionMethod
        * @var obj => $ReflectionParameter = propriedade que representa o objeto $ReflectionParameter
        * @var bol => $reflect_object = true se o método object() for invocado
        * @var bol => $reflect_property = true se o método property() for invocado
        * @var bol => $reflect_method = true se o método method() for invocado
        * @var bol => $reflect_parameter = true se o método parameter() for invocado
        */

        private $ReflectionObject;
        private $ReflectionProperty;
        private $ReflectionMethod;
        private $ReflectionParameter;
        private $reflect_object    = false;
        private $reflect_property  = false;
        private $reflect_method    = false;
        private $reflect_parameter = false;

        /**
        * @param obj => $object = objeto a ser refletido
        */
        public function object(object $object) : object {
            $this->reflect_object = true;
            $this->ReflectionObject = new \ReflectionObject($object);
            return $this;
        }

        /**
        * @param str => $class_name = nome da classe o qual a properiedade ser refletida pertence
        * @param str => $property = nome da properiedade a ser refletida
        */
        public function property(string $class_name, string $property) : object {
            $this->reflect_property = true;
            $this->ReflectionProperty = new \ReflectionProperty($class_name, $property);
            return $this;
        }

        /**
        * @param str => $class_name = nome da classe o qual o método ser refletido pertence
        * @param str => $method = nome do método a ser refletido
        */
        public function method(string $class_name, string $method) : object {
            $this->reflect_method = true;
            $this->ReflectionMethod = new \ReflectionMethod($class_name, $method);
            return $this;
        }

        /**
        * @param str => $class_name = nome da classe o qual o parametro a ser refletido pertence
        * @param str => $method = nome do método o qual o parametro a ser refletido pertence
        * @param str => $parameter = nome do parametro a ser refletido
        */
        public function parameter(string $class_name, string $method, string $parameter) : object {
            $this->reflect_parameter = true;
            $this->ReflectionParameter = new \ReflectionParameter(array($class_name, $method), $parameter);
            return $this;
        }

        public function __call($methodName, $args){
            if($this->reflect_object){
                return call_user_func_array(array($this->ReflectionObject, $methodName), $args);
            }
            if($this->reflect_property){
                return call_user_func_array(array($this->ReflectionProperty, $methodName), $args);
            }
            if($this->reflect_method){
                return call_user_func_array(array($this->ReflectionMethod, $methodName), $args);
            }
            if($this->reflect_parameter){
                return call_user_func_array(array($this->ReflectionParameter, $methodName), $args);
            }
        }
    }

    // Digamos que você tenha no seu projeto a classe Client do pacote Guzzle
    $FullReflectionObject = new FullReflectionObject;
    var_dump($FullReflectionObject->object(new GuzzleHttp\Client)->getMethods());
    var_dump($FullReflectionObject->property('GuzzleHttp\Client', 'config')->isPrivate());
    var_dump($FullReflectionObject->method('GuzzleHttp\Client', 'buildUri')->isPrivate());
    var_dump($FullReflectionObject->parameter('GuzzleHttp\Client', 'send', 'options')->getDefaultValue());
kuldipem at gmail dot com 17-Jun-2015 06:01
class a {
    const abc = 1;
    public function __get($key){
        $r = new ReflectionObject($this);
        if($r->hasConstant($key)){ return $r->getConstant($key); }
    }
}
class b {
    public function getA(){
        return new a();
    }
}
$b = new b();
var_dump($b->getA()::abc);
var_dump($b->getA()::def);
marcel dot nolte at noltecomputer dot de 02-Sep-2009 02:42
To simply enlist all methods and properties of an object simply write:

<?php ReflectionObject::export($yourObject); ?>

,which will cause an var_export-like output.


Construit un nouvel objet ReflectionObject

  • « ReflectionObject
  • ReflectionObject::export »
  • PHP Manual
  • ReflectionObject
  • Construit un nouvel objet ReflectionObject

ReflectionObject::__construct

(PHP 5, PHP 7)

ReflectionObject::__construct — Construit un nouvel objet ReflectionObject

Description

public ReflectionObject::__construct ( object $object )

Construit un nouvel objet ReflectionObject.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

object

Une instance d'un objet.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • ReflectionObject::export() - Exportation
  • Les constructeurs

User Contributed Notes

There are no user contributed notes for this page.


Exportation

  • « ReflectionObject::__construct
  • ReflectionParameter »
  • PHP Manual
  • ReflectionObject
  • Exportation

ReflectionObject::export

(PHP 5, PHP 7)

ReflectionObject::export — Exportation

Description

public static ReflectionObject::export ( string $argument , bool $return = ? ) : string

Exporte une réflexion.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

argument

La réflection à exporter.

return

Le fait de le définir à true retournera l'export plutôt que l'émission. Le définir à false (par défaut) fera l'inverse.

Valeurs de retour

Si le paramètre return est défini à true, l'export sera retourné sous la forme d'une chaîne de caractères, sinon, null sera retourné.

Voir aussi

  • ReflectionObject::__construct() - Construit un nouvel objet ReflectionObject

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionParameter

(PHP 5, PHP 7)

Introduction

La classe ReflectionParameter récupère les informations sur les paramètres des fonctions ou des méthodes.

Pour introspecter les paramètres des fonctions, tout d'abord créez une instance de la classe ReflectionFunction ou de la classe ReflectionMethod puis utilisez la méthode ReflectionFunctionAbstract::getParameters() pour récupérer un tableau des paramètres.

Synopsis de la classe

ReflectionParameter implements Reflector {
/* Propriétés */
public $name ;
/* Méthodes */
public __construct ( string|array|object $function , int|string $param )
public allowsNull ( ) : bool
public canBePassedByValue ( ) : bool
final private __clone ( ) : void
public static export ( string $function , string $parameter , bool $return = ? ) : string
public getClass ( ) : ReflectionClass|null
public getDeclaringClass ( ) : ReflectionClass|null
public getDeclaringFunction ( ) : ReflectionFunctionAbstract
public getDefaultValue ( ) : mixed
public getDefaultValueConstantName ( ) : string|null
public getName ( ) : string
public getPosition ( ) : int
public getType ( ) : ReflectionType|null
public hasType ( ) : bool
public isArray ( ) : bool
public isCallable ( ) : bool
public isDefaultValueAvailable ( ) : bool
public isDefaultValueConstant ( ) : bool
public isOptional ( ) : bool
public isPassedByReference ( ) : bool
public isVariadic ( ) : bool
public __toString ( ) : string
}

Propriétés

name

Nom du paramètre. En lecture seule, émets ReflectionException lors d'une tentative d'écriture.

Sommaire

  • ReflectionParameter::allowsNull — Vérifie si la valeur null est autorisée comme valeur du paramètre
  • ReflectionParameter::canBePassedByValue — Vérifie si le paramètre peut être passé par valeur
  • ReflectionParameter::__clone — Clonage
  • ReflectionParameter::__construct — Constructeur
  • ReflectionParameter::export — Exportation
  • ReflectionParameter::getClass — Récupère la classe de typage d'objets
  • ReflectionParameter::getDeclaringClass — Récupère la classe déclarante
  • ReflectionParameter::getDeclaringFunction — Récupère la fonction déclarante
  • ReflectionParameter::getDefaultValue — Récupère la valeur par défaut du paramètre
  • ReflectionParameter::getDefaultValueConstantName — Retourne le nom de la constante de la valeur par défaut si la valeur est une constante ou null
  • ReflectionParameter::getName — Récupère le nom du paramètre
  • ReflectionParameter::getPosition — Récupère la position d'un paramètre
  • ReflectionParameter::getType — Récupère le type du paramètre
  • ReflectionParameter::hasType — Vérifie si un paramètre a un type
  • ReflectionParameter::isArray — Vérifie si le paramètre attend un tableau
  • ReflectionParameter::isCallable — Vérifie si le paramètre est de type callable
  • ReflectionParameter::isDefaultValueAvailable — Vérifie si une valeur par défaut est disponible pour le paramètre
  • ReflectionParameter::isDefaultValueConstant — Vérifie si la valeur par défaut du paramètre est une constante
  • ReflectionParameter::isOptional — Vérifie si le paramètre est optionnel
  • ReflectionParameter::isPassedByReference — Vérifie si le paramètre est passé par référence
  • ReflectionParameter::isVariadic — Vérifie si le paramètre est variadique
  • ReflectionParameter::__toString — Récupère une représentation textuelle

User Contributed Notes

fgm at riff dot org 11-May-2008 12:44
The note about the signature of the ReflectionParameter constructor is actually incomplete, at least in 5.2.5: it is possible to use an integer for the second parameter, and the constructor will use it to return the n-th parameter.

This allows you to obtain proper ReflectionParameter objects even when documenting code from extensions which (strangely enough) define several parameters with the same name. The string-based constructor always returns the first parameter with the matching name, whereas the integer-based constructor correctly returns the n-th parameter.

So, in short, this works:
<?php
// supposing the extension defined something like:
// Some_Class::someMethod($a, $x, $y, $x, $y)
$p = new ReflectionParameter(array('Some_Class', 'someMethod'), 4);
// returns the last parameter, whereas
$p = new ReflectionParameter(array('Some_Class', 'someMethod'), 'y');
// always returns the first $y at position 2
?>
killgecNOFSPAM at gmail dot com 25-Jul-2007 05:53
Signature of constructor of ReflectionParameter correctly is:

public function __construct(array/string $function, string $name);

where $function is either a name of a global function, or a class/method name pair.
massimo at mmware dot it 18-Jul-2007 08:58
I found these limitations using class ReflectionParameter from ReflectionFunction with INTERNAL FUNCTIONS (eg print_r, str_replace, ... ) :

1. parameter names don't match with manual: (try example 19.35 with arg "call_user_func" )
2. some functions (eg PCRE function, preg_match etc) have EMPTY parameter names
3. calling getDefaultValue on Parameters will result in Exception "Cannot determine default value for internal functions"


Vérifie si la valeur null est autorisée comme valeur du paramètre

  • « ReflectionParameter
  • ReflectionParameter::canBePassedByValue »
  • PHP Manual
  • ReflectionParameter
  • Vérifie si la valeur null est autorisée comme valeur du paramètre

ReflectionParameter::allowsNull

(PHP 5, PHP 7)

ReflectionParameter::allowsNull — Vérifie si la valeur null est autorisée comme valeur du paramètre

Description

public ReflectionParameter::allowsNull ( ) : bool

Vérifie si la valeur null est autorisée comme valeur du paramètre.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la valeur null est autorisée comme valeur du paramètre, false sinon.

Voir aussi

  • ReflectionParameter::isOptional() - Vérifie si le paramètre est optionnel

User Contributed Notes

Geoffrey LAURENT 05-May-2013 03:53
The allowsNull method look if arguments have a type.
If a type is defined, null is allowed only if default value is null.

 <?php
function myfunction ( $param ) {

}

echo (new ReflectionFunction("myfunction"))->getParameters()[0]->allowsNull() ? "true":"false";

?>

Result : true

<?php
function myfunction ( stdClass $param ) {

}

echo (new ReflectionFunction("myfunction"))->getParameters()[0]->allowsNull() ? "true":"false";

?>

Result : false

<?php
function myfunction ( stdClass $param = null ) {

}

echo (new ReflectionFunction("myfunction"))->getParameters()[0]->allowsNull() ? "true":"false";
?>

Result : true


Vérifie si le paramètre peut être passé par valeur

  • « ReflectionParameter::allowsNull
  • ReflectionParameter::__clone »
  • PHP Manual
  • ReflectionParameter
  • Vérifie si le paramètre peut être passé par valeur

ReflectionParameter::canBePassedByValue

(PHP 5 >= 5.4.0, PHP 7)

ReflectionParameter::canBePassedByValue — Vérifie si le paramètre peut être passé par valeur

Description

public ReflectionParameter::canBePassedByValue ( ) : bool

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne true si le paramètre peut être passé par valeur, false sinon. Retourne null si une erreur survient.

User Contributed Notes

There are no user contributed notes for this page.


Clonage

  • « ReflectionParameter::canBePassedByValue
  • ReflectionParameter::__construct »
  • PHP Manual
  • ReflectionParameter
  • Clonage

ReflectionParameter::__clone

(PHP 5, PHP 7)

ReflectionParameter::__clone — Clonage

Description

final private ReflectionParameter::__clone ( ) : void

Clonage.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Voir aussi

  • ReflectionParameter::toString()
  • Le clonage d'objet

User Contributed Notes

There are no user contributed notes for this page.


Constructeur

  • « ReflectionParameter::__clone
  • ReflectionParameter::export »
  • PHP Manual
  • ReflectionParameter
  • Constructeur

ReflectionParameter::__construct

(PHP 5, PHP 7)

ReflectionParameter::__construct — Constructeur

Description

public ReflectionParameter::__construct ( string|array|object $function , int|string $param )

Construit une instance ReflectionParameter.

Liste de paramètres

function

La fonction depuis laquelle les paramètres sont reflétés.

param

Soit un entier spécifiant la position du paramètre (commençant par zéro), soit le nom du paramètre en tant que chaîne de caractères.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec ReflectionParameter

<?php
function foo($a, $b, $c) { }
function bar(Exception $a, &$b, $c) { }
function baz(ReflectionFunction $a, $b = 1, $c = null) { }
function abc() { }

$reflect = new ReflectionFunction('foo');

echo $reflect;

foreach ($reflect->getParameters() as $i => $param) {
    printf(
        "-- Parameter #%d: %s {\n".
        "   Class: %s\n".
        "   Allows NULL: %s\n".
        "   Passed to by reference: %s\n".
        "   Is optional?: %s\n".
        "}\n",
        $i, // $param->getPosition() can be used from PHP 5.2.3
        $param->getName(),
        var_export($param->getClass(), 1),
        var_export($param->allowsNull(), 1),
        var_export($param->isPassedByReference(), 1),
        $param->isOptional() ? 'yes' : 'no'
    );
}
?>

Résultat de l'exemple ci-dessus est similaire à :

Function [ <user> function foo ] {
  @@ /Users/philip/cvs/phpdoc/a 2 - 2

  - Parameters [3] {
    Parameter #0 [ <required> $a ]
    Parameter #1 [ <required> $b ]
    Parameter #2 [ <required> $c ]
  }
}
-- Parameter #0: a {
   Class: NULL
   Allows NULL: true
   Passed to by reference: false
   Is optional?: no
}
-- Parameter #1: b {
   Class: NULL
   Allows NULL: true
   Passed to by reference: false
   Is optional?: no
}
-- Parameter #2: c {
   Class: NULL
   Allows NULL: true
   Passed to by reference: false
   Is optional?: no
}

Voir aussi

  • ReflectionFunctionAbstract::getParameters() - Récupère les paramètres
  • ReflectionFunction::__construct() - Construit un nouvel objet ReflectionFunction
  • ReflectionMethod::__construct() - Construit un nouvel objet ReflectionMethod
  • Les constructeurs

User Contributed Notes

tracid2008 t gmail o com 06-Dec-2011 03:31
You also can use a class instead of a function name. Just use an array like that
<?php
$reflect = new ReflectionParameter(array('className', 'methodName'), 'property');
?>


Exportation

  • « ReflectionParameter::__construct
  • ReflectionParameter::getClass »
  • PHP Manual
  • ReflectionParameter
  • Exportation

ReflectionParameter::export

(PHP 5, PHP 7)

ReflectionParameter::export — Exportation

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 7.4.0. Dépendre de cette fonction est fortement déconseillé.

Description

public static ReflectionParameter::export ( string $function , string $parameter , bool $return = ? ) : string

Exportation.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

function

Le nom de la fonction.

parameter

Le nom du paramètre.

return

Le fait de le définir à true retournera l'export plutôt que l'émission. Le définir à false (par défaut) fera l'inverse.

Valeurs de retour

La réflexion exportée.

Voir aussi

  • ReflectionParameter::__toString() - Récupère une représentation textuelle

User Contributed Notes

There are no user contributed notes for this page.


Récupère la classe de typage d'objets

  • « ReflectionParameter::export
  • ReflectionParameter::getDeclaringClass »
  • PHP Manual
  • ReflectionParameter
  • Récupère la classe de typage d'objets

ReflectionParameter::getClass

(PHP 5, PHP 7)

ReflectionParameter::getClass — Récupère la classe de typage d'objets

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 8.0.0. Dépendre de cette fonction est fortement déconseillé.

Description

public ReflectionParameter::getClass ( ) : ReflectionClass|null

Récupère la classe de typage d'objets pour le paramètre comme un objet ReflectionClass.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un objet ReflectionClass, ou null si aucun type est déclaré, ou le type déclaré n'est pas une classe ou interface.

Exemples

Exemple #1 Exemple d'utilisation de la classe ReflectionParameter

<?php
function foo(Exception $a) { }

$functionReflection = new ReflectionFunction('foo');
$parameters = $functionReflection->getParameters();
$aParameter = $parameters[0];

echo $aParameter->getClass()->name;
?>

L'exemple ci-dessus va afficher :

Exception

Voir aussi

  • ReflectionParameter::getDeclaringClass() - Récupère la classe déclarante

User Contributed Notes

tarik at bitstore dot ru 22-Feb-2021 07:08
You may use this one function instead depricated

    /**
     * Get parameter class
     * @param \ReflectionParameter $parameter
     * @return \ReflectionClass|null
     */
    private function getClass(\ReflectionParameter $parameter):?\ReflectionClass
    {
        $type = $parameter->getType();
        if (!$type || $type->isBuiltin())
            return NULL;

// This line triggers autoloader!
        if(!class_exists($type->getName()))
            return NULL;

        return  new \ReflectionClass($type->getName());
    }
Dylan 12-Feb-2021 11:47
For php version >=8
ReflectionParamter::getType() is the recommended way to replace the deprecated methods:

- getClass()
e.g: $name = $param->getType() && !$param->getType()->isBuiltin()
       ? new ReflectionClass($param->getType()->getName())
       : null;

- isArray()
e.g: $isArray = $param->getType() && $param->getType()->getName() === 'array';

- isCallable()
e.g: $isCallable = $param->getType() && $param->getType()->getName() === 'callable';

This method is available in PHP 7.0 and later.
richard dot t dot rohrig at gmail dot com 01-Jun-2020 09:33
Example of how to use getClass() in conjunction with getConstructor() to build the dependencies of a class.

private function buildDependencies(ReflectionClass $reflection)
    {
        $constructor = $reflection->getConstructor();

        if (!$constructor) {
            return [];
        }

        $params = $constructor->getParameters();

        return array_map(function ($param) {

            $className = $param->getClass();

            if (!$className) {
                throw new Exception();
            }

            $className = $param->getClass()->getName();

            return $this->make($className);
        }, $params);
    }
tom at r dot je 11-May-2012 09:15
ReflectionParameter::getClass() will cause a fatal error (and trigger __autoload) if the class required by the parameter is not defined.

Sometimes it's useful to only know the class name without needing the class to be loaded.

Here's a simple function that will retrieve only the class name without requiring the class to exist:

<?php
function getClassName(ReflectionParameter $param) {
    preg_match('/\[\s\<\w+?>\s([\w]+)/s', $param->__toString(), $matches);
    return isset($matches[1]) ? $matches[1] : null;
}
?>
infernaz at gmail dot com 31-Jan-2011 12:09
The method returns ReflectionClass object of parameter type class or NULL if none.

<?php

class A {
    function b(B $c, array $d, $e) {
    }
}
class B {
}

$refl = new ReflectionClass('A');
$par = $refl->getMethod('b')->getParameters();

var_dump($par[0]->getClass()->getName());  // outputs B
var_dump($par[1]->getClass());  // note that array type outputs NULL
var_dump($par[2]->getClass());  // outputs NULL

?>


Récupère la classe déclarante

  • « ReflectionParameter::getClass
  • ReflectionParameter::getDeclaringFunction »
  • PHP Manual
  • ReflectionParameter
  • Récupère la classe déclarante

ReflectionParameter::getDeclaringClass

(PHP 5 >= 5.1.3, PHP 7)

ReflectionParameter::getDeclaringClass — Récupère la classe déclarante

Description

public ReflectionParameter::getDeclaringClass ( ) : ReflectionClass|null

Récupère la classe déclarante.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un objet ReflectionClass ou null si appelé sur une fonction.

Exemples

Exemple #1 Récupération de la classe qui a déclarée la méthode

<?php
class Foo
{
    public function bar(\DateTime $datetime)
    {
    }
}

class Baz extends Foo
{
}

$param = new \ReflectionParameter(['Baz', 'bar'], 0);

var_dump($param->getDeclaringClass());

L'exemple ci-dessus va afficher :

object(ReflectionClass)#2 (1) {
  ["name"]=>
  string(3) "Foo"
}

Voir aussi

  • ReflectionParameter::getClass() - Récupère la classe de typage d'objets

User Contributed Notes

There are no user contributed notes for this page.


Récupère la fonction déclarante

  • « ReflectionParameter::getDeclaringClass
  • ReflectionParameter::getDefaultValue »
  • PHP Manual
  • ReflectionParameter
  • Récupère la fonction déclarante

ReflectionParameter::getDeclaringFunction

(PHP 5 >= 5.1.3, PHP 7)

ReflectionParameter::getDeclaringFunction — Récupère la fonction déclarante

Description

public ReflectionParameter::getDeclaringFunction ( ) : ReflectionFunctionAbstract

Récupère la fonction déclarante.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un objet ReflectionFunction.

Voir aussi

  • ReflectionParameter::getDeclaringClass() - Récupère la classe déclarante

User Contributed Notes

There are no user contributed notes for this page.


Récupère la valeur par défaut du paramètre

  • « ReflectionParameter::getDeclaringFunction
  • ReflectionParameter::getDefaultValueConstantName »
  • PHP Manual
  • ReflectionParameter
  • Récupère la valeur par défaut du paramètre

ReflectionParameter::getDefaultValue

(PHP 5 >= 5.0.3, PHP 7)

ReflectionParameter::getDefaultValue — Récupère la valeur par défaut du paramètre

Description

public ReflectionParameter::getDefaultValue ( ) : mixed

Récupère la valeur par défaut du paramètre d'une fonction ou d'une méthode définie dans l'espace utilisateur ou interne. Si le paramètre n'est pas optionnel, une exception ReflectionException sera émise.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

La valeur par défaut du paramètre.

Historique

Version | Description
8.0.0 | Cette méthode permet désormais de récupérer la valeur par défaut de fonctions et méthodes de classe intégré. Auparavant, ReflectionException était émit.

Exemples

Exemple #1 Récupérer les valeurs par défaut des paramètres de la fonction

<?php
function foo($test, $bar = 'baz')
{
    echo $test . $bar;
}

$function = new ReflectionFunction('foo');

foreach ($function->getParameters() as $param) {
    echo 'Nom : ' . $param->getName() . PHP_EOL;
    if ($param->isOptional()) {
        echo 'Valeur par défaut : ' . $param->getDefaultValue() . PHP_EOL;
    }
    echo PHP_EOL;
}
?>

L'exemple ci-dessus va afficher :

Nom : test

Nom : bar
Valeur par défaut : baz

Voir aussi

  • ReflectionParameter::isOptional() - Vérifie si le paramètre est optionnel
  • ReflectionParameter::isDefaultValueAvailable() - Vérifie si une valeur par défaut est disponible pour le paramètre
  • ReflectionParameter::getDefaultValueConstantName() - Retourne le nom de la constante de la valeur par défaut si la valeur est une constante ou null
  • ReflectionParameter::isPassedByReference() - Vérifie si le paramètre est passé par référence

User Contributed Notes

gmail@asmqb7 16-May-2016 12:57
[Editor's note: fixed on user's request]

Getting `Uncaught ReflectionException: Internal error: Failed to retrieve the default value`?

You have to wrap this inside ->isDefaultValueAvailable().


Retourne le nom de la constante de la valeur par défaut si la valeur est une constante ou null

  • « ReflectionParameter::getDefaultValue
  • ReflectionParameter::getName »
  • PHP Manual
  • ReflectionParameter
  • Retourne le nom de la constante de la valeur par défaut si la valeur est une constante ou null

ReflectionParameter::getDefaultValueConstantName

(PHP 5 >= 5.4.6, PHP 7)

ReflectionParameter::getDefaultValueConstantName — Retourne le nom de la constante de la valeur par défaut si la valeur est une constante ou null

Description

public ReflectionParameter::getDefaultValueConstantName ( ) : string|null

Retourne le nom de la constante qui sert de valeur par défault à un paramètre d'une fonction ou méthode définie par l'utilisateur ou interne, si la valeur par défaut est constante ou nulle. Si le paramètre n'est pas optionel une exception de type ReflectionException sera jetée.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne une chaîne de caractères en cas de succès, ou null en cas d'échec.

Historique

Version | Description
8.0.0 | Cette méthode permet désormais de récupérer le nom de la constante de la valeur par défaut de fonctions et méthodes de classe intégré. Auparavant, ReflectionException était émit.

Exemples

Exemple #1 Récupérer les noms des constantes qui servent de valeurs par défaut aux paramètres d'une fonction

<?php
function foo($test, $bar = PHP_INT_MIN)
{
    echo $test . $bar;
}

$function = new ReflectionFunction('foo');

foreach ($function->getParameters() as $param) {
    echo 'Nom : ' . $param->getName() . PHP_EOL;
    if ($param->isOptional()) {
        echo 'Valeur par défault : ' . $param->getDefaultValueConstantName() . PHP_EOL;
    }
    echo PHP_EOL;
}
?>

L'exemple ci-dessus va afficher :

Nom : test

Nom : bar
Valeur par défault : PHP_INT_MIN

Voir aussi

  • ReflectionParameter::isOptional() - Vérifie si le paramètre est optionnel
  • ReflectionParameter::isDefaultValueConstant() - Vérifie si la valeur par défaut du paramètre est une constante
  • ReflectionParameter::getDefaultValue() - Récupère la valeur par défaut du paramètre

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom du paramètre

  • « ReflectionParameter::getDefaultValueConstantName
  • ReflectionParameter::getPosition »
  • PHP Manual
  • ReflectionParameter
  • Récupère le nom du paramètre

ReflectionParameter::getName

(PHP 5, PHP 7)

ReflectionParameter::getName — Récupère le nom du paramètre

Description

public ReflectionParameter::getName ( ) : string

Récupère le nom du paramètre.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le nom du paramètre reflété.

Voir aussi

  • ReflectionParameter::getValue()

User Contributed Notes

mike 25-May-2015 07:26
FYI, it returns the parameter name without the dollars($) sign at the start.


Récupère la position d'un paramètre

  • « ReflectionParameter::getName
  • ReflectionParameter::getType »
  • PHP Manual
  • ReflectionParameter
  • Récupère la position d'un paramètre

ReflectionParameter::getPosition

(PHP 5 >= 5.1.3, PHP 7)

ReflectionParameter::getPosition — Récupère la position d'un paramètre

Description

public ReflectionParameter::getPosition ( ) : int

Récupère la position d'un paramètre.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

La position du paramètre, depuis la gauche vers la droite, et en commençant à la position #0.

Voir aussi

  • ReflectionParameter::getName() - Récupère le nom du paramètre

User Contributed Notes

micah at raincross-tech dot com 05-Dec-2010 07:26
Note that the ReflectionFunctionAbstract::getParameters() method will return the parameters in the correct order.


Récupère le type du paramètre

  • « ReflectionParameter::getPosition
  • ReflectionParameter::hasType »
  • PHP Manual
  • ReflectionParameter
  • Récupère le type du paramètre

ReflectionParameter::getType

(PHP 7)

ReflectionParameter::getType — Récupère le type du paramètre

Description

public ReflectionParameter::getType ( ) : ReflectionType|null

Récupère le type associé d'un paramètre.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un objet ReflectionType si un type de paramètre est spécifié, null sinon.

Exemples

Exemple #1 Utilisation de ReflectionParameter::getType() à partir de PHP 7.1.0

À partir de PHP 7.1.0, ReflectionType::__toString() est obsolète, et ReflectionParameter::getType() peut retourner une instance de ReflectionNamedType. Pour récupérer le nom du type de paramètre, ReflectionNamedType() est disponible dans ce cas.

<?php
function someFunction(int $param, $param2) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParams = $reflectionFunc->getParameters();
$reflectionType1 = $reflectionParams[0]->getType();
$reflectionType2 = $reflectionParams[1]->getType();

assert($reflectionType1 instanceof ReflectionNamedType);
echo $reflectionType1->getName(), PHP_EOL;
var_dump($reflectionType2);
?>

L'exemple ci-dessus va afficher :

int
NULL

Exemple #2 Utilisation de ReflectionParameter::getType() antérieur à PHP 7.1.0

<?php
function someFunction(int $param, $param2) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParams = $reflectionFunc->getParameters();
$reflectionType1 = $reflectionParams[0]->getType();
$reflectionType2 = $reflectionParams[1]->getType();

echo $reflectionType1, PHP_EOL;
var_dump($reflectionType2);
?>

Résultat de l'exemple ci-dessus en PHP 7.0 :

int
NULL

Voir aussi

  • ReflectionParameter::hasType() - Vérifie si un paramètre a un type
  • ReflectionType::__toString() - To string

User Contributed Notes

Will Beaumont 05-Sep-2020 04:26
As of 7.1, if a parameter type is found then this method returns an instance of ReflectionNamedType (https://www.php.net/manual/en/class.reflectionnamedtype.php), a subclass of ReflectionType.


Vérifie si un paramètre a un type

  • « ReflectionParameter::getType
  • ReflectionParameter::isArray »
  • PHP Manual
  • ReflectionParameter
  • Vérifie si un paramètre a un type

ReflectionParameter::hasType

(PHP 7)

ReflectionParameter::hasType — Vérifie si un paramètre a un type

Description

public ReflectionParameter::hasType ( ) : bool

Vérifie si le paramètre a un type associé avec celui-ci.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si un type est spécifié, false sinon.

Exemples

Exemple #1 Exemple avec ReflectionParameter::hasType()

<?php
function someFunction(string $param, $param2 = null) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParams = $reflectionFunc->getParameters();

var_dump($reflectionParams[0]->hasType());
var_dump($reflectionParams[1]->hasType());

Résultat de l'exemple ci-dessus est similaire à :

bool(true)
bool(false)

Voir aussi

  • ReflectionParameter::getType() - Récupère le type du paramètre

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si le paramètre attend un tableau

  • « ReflectionParameter::hasType
  • ReflectionParameter::isCallable »
  • PHP Manual
  • ReflectionParameter
  • Vérifie si le paramètre attend un tableau

ReflectionParameter::isArray

(PHP 5 >= 5.1.2, PHP 7)

ReflectionParameter::isArray — Vérifie si le paramètre attend un tableau

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 8.0.0. Dépendre de cette fonction est fortement déconseillé.

Description

public ReflectionParameter::isArray ( ) : bool

Vérifie si le paramètre attend un tableau.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si le paramètre attend un tableau, false sinon.

Voir aussi

  • ReflectionParameter::isOptional() - Vérifie si le paramètre est optionnel

User Contributed Notes

denis at example dot com 19-Feb-2020 08:45
Hi, this is simple example of how to use it.

class Test
{
    public function testArray(array $a)
    {
        // do something...

        return $a;
    }

    public function testString(string $a)
    {
        // do something...

        return $a;
    }
}

$reflection = new ReflectionClass('Test');

foreach($reflection->getMethods() as $methods){
    foreach($methods->getParameters() as $param){
        var_dump($param->isArray());
    }
}

//bool(true)
//bool(false)


Vérifie si le paramètre est de type callable

  • « ReflectionParameter::isArray
  • ReflectionParameter::isDefaultValueAvailable »
  • PHP Manual
  • ReflectionParameter
  • Vérifie si le paramètre est de type callable

ReflectionParameter::isCallable

(PHP 5 >= 5.4.0, PHP 7)

ReflectionParameter::isCallable — Vérifie si le paramètre est de type callable

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 8.0.0. Dépendre de cette fonction est fortement déconseillé.

Description

public ReflectionParameter::isCallable ( ) : bool

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne true si le paramètre est de type callable, false s'il ne l'est pas, ou null si une erreur survient.

User Contributed Notes

me at abiusx dot com 15-Jan-2016 05:18
Apparently this does not return true for callback arguments to many of the internal functions, such as array_map and array_walk.


Vérifie si une valeur par défaut est disponible pour le paramètre

  • « ReflectionParameter::isCallable
  • ReflectionParameter::isDefaultValueConstant »
  • PHP Manual
  • ReflectionParameter
  • Vérifie si une valeur par défaut est disponible pour le paramètre

ReflectionParameter::isDefaultValueAvailable

(PHP 5 >= 5.0.3, PHP 7)

ReflectionParameter::isDefaultValueAvailable — Vérifie si une valeur par défaut est disponible pour le paramètre

Description

public ReflectionParameter::isDefaultValueAvailable ( ) : bool

Vérifie si une valeur par défaut est disponible pour le paramètre.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si une valeur par défaut est disponible pour le paramètre, false sinon.

Voir aussi

  • ReflectionParameter::getDefaultValue() - Récupère la valeur par défaut du paramètre
  • ReflectionParameter::isDefaultValueConstant() - Vérifie si la valeur par défaut du paramètre est une constante
  • ReflectionParameter::getName() - Récupère le nom du paramètre

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la valeur par défaut du paramètre est une constante

  • « ReflectionParameter::isDefaultValueAvailable
  • ReflectionParameter::isOptional »
  • PHP Manual
  • ReflectionParameter
  • Vérifie si la valeur par défaut du paramètre est une constante

ReflectionParameter::isDefaultValueConstant

(PHP 5 >= 5.4.6, PHP 7)

ReflectionParameter::isDefaultValueConstant — Vérifie si la valeur par défaut du paramètre est une constante

Description

public ReflectionParameter::isDefaultValueConstant ( ) : bool

Vérifie si la valeur par défault du paramètre est une constante

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne true si la valeur par défaut est une constante, false sinon.

Voir aussi

  • ReflectionParameter::getDefaultValueConstantName() - Retourne le nom de la constante de la valeur par défaut si la valeur est une constante ou null
  • ReflectionParameter::isDefaultValueAvailable() - Vérifie si une valeur par défaut est disponible pour le paramètre

User Contributed Notes

kristianoye at gmail dot com 25-May-2015 09:39
This method returns true only if the parameter's default value is set to a named constant.  e.g.

class Foo {
   const OPTION_MULTIGET = 1;

   //Method 1
   public function setGetOptions($opts=0);

   //Method 2
   public function setMultiGetOptions($opts=Foo::OPTION_MULTIGET);
}

Method 1's first ReflectionParameter will return isDefaultValueConstant() = false (0 is a "constant"/static value but not a named constant) and Method 2's will return isDefaultValueConsntant() = true.


Vérifie si le paramètre est optionnel

  • « ReflectionParameter::isDefaultValueConstant
  • ReflectionParameter::isPassedByReference »
  • PHP Manual
  • ReflectionParameter
  • Vérifie si le paramètre est optionnel

ReflectionParameter::isOptional

(PHP 5 >= 5.0.3, PHP 7)

ReflectionParameter::isOptional — Vérifie si le paramètre est optionnel

Description

public ReflectionParameter::isOptional ( ) : bool

Vérifie si le paramètre est optionnel.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si le paramètre est optionnel, false sinon.

Voir aussi

  • ReflectionParameter::getName() - Récupère le nom du paramètre

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si le paramètre est passé par référence

  • « ReflectionParameter::isOptional
  • ReflectionParameter::isVariadic »
  • PHP Manual
  • ReflectionParameter
  • Vérifie si le paramètre est passé par référence

ReflectionParameter::isPassedByReference

(PHP 5, PHP 7)

ReflectionParameter::isPassedByReference — Vérifie si le paramètre est passé par référence

Description

public ReflectionParameter::isPassedByReference ( ) : bool

Vérifie si le paramètre est passé par référence.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si le paramètre est passé par référence, false sinon.

Voir aussi

  • ReflectionParameter::getName() - Récupère le nom du paramètre

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si le paramètre est variadique

  • « ReflectionParameter::isPassedByReference
  • ReflectionParameter::__toString »
  • PHP Manual
  • ReflectionParameter
  • Vérifie si le paramètre est variadique

ReflectionParameter::isVariadic

(PHP 5 >= 5.6.0, PHP 7)

ReflectionParameter::isVariadic — Vérifie si le paramètre est variadique

Description

public ReflectionParameter::isVariadic ( ) : bool

Vérifie si le paramètre a été déclaré comme un paramètre variadique.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne true si le paramètre est variadique, false sinon.

User Contributed Notes

There are no user contributed notes for this page.


Récupère une représentation textuelle

  • « ReflectionParameter::isVariadic
  • ReflectionProperty »
  • PHP Manual
  • ReflectionParameter
  • Récupère une représentation textuelle

ReflectionParameter::__toString

(PHP 5, PHP 7)

ReflectionParameter::__toString — Récupère une représentation textuelle

Description

public ReflectionParameter::__toString ( ) : string

Récupère une représentation textuelle.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Voir aussi

  • ReflectionParameter::export() - Exportation
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionProperty

(PHP 5, PHP 7)

Introduction

La classe ReflectionProperty rapporte des informations sur les propriétés des classes.

Synopsis de la classe

ReflectionProperty implements Reflector {
/* Constantes */
const int IS_STATIC = 1 ;
const int IS_PUBLIC = 256 ;
const int IS_PROTECTED = 512 ;
const int IS_PRIVATE = 1024 ;
/* Propriétés */
public $name ;
public $class ;
/* Méthodes */
public __construct ( object|string $class , string $property )
final private __clone ( ) : void
public static export ( mixed $class , string $name , bool $return = ? ) : string
public getDeclaringClass ( ) : ReflectionClass
public getDefaultValue ( ) : mixed
public getDocComment ( ) : string|false
public getModifiers ( ) : int
public getName ( ) : string
public getType ( ) : ReflectionType|null
public getValue ( object|null $object = null ) : mixed
public hasDefaultValue ( ) : bool
public hasType ( ) : bool
public isDefault ( ) : bool
public isInitialized ( object|null $object = null ) : bool
public isPrivate ( ) : bool
public isProtected ( ) : bool
public isPublic ( ) : bool
public isStatic ( ) : bool
public setAccessible ( bool $accessible ) : void
public setValue ( object $object , mixed $value ) : void
public __toString ( ) : string
}

Propriétés

name

Nom de la propriété. En lecture seule, émets ReflectionException lors d'une tentative d'écriture.

class

Nom de la classe où la propriété a été définie. En lecture seule, émets ReflectionException lors d'une tentative d'écriture.

Constantes pré-définies

Modificateurs de ReflectionProperty

ReflectionProperty::IS_STATIC

Indique que la propriété est statique.

ReflectionProperty::IS_PUBLIC

Indique que la propriété est publique.

ReflectionProperty::IS_PROTECTED

Indique que la propriété est protégée.

ReflectionProperty::IS_PRIVATE

Indique que la propriété est privée.

Sommaire

  • ReflectionProperty::__clone — Clonage
  • ReflectionProperty::__construct — Construit un nouvel objet ReflectionProperty
  • ReflectionProperty::export — Exporte
  • ReflectionProperty::getDeclaringClass — Récupère la classe déclarante
  • ReflectionProperty::getDefaultValue — Returns the default value declared for a property
  • ReflectionProperty::getDocComment — Récupère le commentaire de documentation d'une propriété
  • ReflectionProperty::getModifiers — Récupère les modificateurs de propriété
  • ReflectionProperty::getName — Récupère le nom de la proriété
  • ReflectionProperty::getType — Récupère le type d'une propriété
  • ReflectionProperty::getValue — Récupère la valeur de la propriété
  • ReflectionProperty::hasDefaultValue — Checks if property has a default value declared
  • ReflectionProperty::hasType — Vérifie si la propriété à un type
  • ReflectionProperty::isDefault — Vérifie si la propriété est celle par défaut
  • ReflectionProperty::isInitialized — Vérifie si une propriété est initialisée
  • ReflectionProperty::isPrivate — Vérifie si la propriété est privée
  • ReflectionProperty::isProtected — Vérifie si la propriété est protégée
  • ReflectionProperty::isPublic — Vérifie si la propriété est publique
  • ReflectionProperty::isStatic — Vérifie si la propriété est statique
  • ReflectionProperty::setAccessible — Définit l'accessibilité d'une propriété
  • ReflectionProperty::setValue — Définit la valeur de la propriété
  • ReflectionProperty::__toString — Récupère une représentation textuelle

User Contributed Notes

Nanhe Kumar 06-Jan-2014 12:36
<?php
//serialize static properties (class variable)

class Student {

    private $members = array();
    protected $name;
    public static $noOfStudent;

    public function __construct($name = 'Nanhe Kumar') {
        $this->name = $name;
        Student::$noOfStudent++;
    }

    public function __sleep() {
        $vars = get_class_vars(get_class($this));
        foreach ($vars as $key => $val) {
            if (!empty($val))
                $this->members[$key] = $val;
        }
        return array_keys(get_object_vars($this));
    }

    public function __wakeup() {
        foreach ($this->members as $key => $val) {
            $prop = new ReflectionProperty(get_class($this), $key);
            $prop->setValue(get_class($this), $val);
        }
        $this->members = array();
    }

    public function getTotalStudent() {
        return self::$noOfStudent;
    }

}

$so1 = new Student();
$so2 = new Student();
$serialized = serialize($so1);
print_r($serialized); //O:7:"Student":2:{s:16:"Studentmembers";a:1:{s:11:"noOfStudent";i:2;}s:7:"*name";s:11:"Nanhe Kumar";}
$unserialized = unserialize($serialized);
print_r($unserialized); //Student Object ( [members:Student:private] => Array ( ) [name:protected] => Nanhe Kumar )
echo Student::$noOfStudent; //2
?>
rasmus at mindplay dot dk 30-Jul-2010 05:06
I think a more accurate explanation is this:

The Reflection classes are designed to reflect upon the source code of an application, not on any runtime information.

I think you misunderstand the ReflectionProperty constructor in your example above. The fact that it accepts an object as argument is just a convenience feature - you are actually inspecting the class of that object, not the object itself, so it's basically equivalent to:

<?php

// works fine
$Reflection = new ReflectionProperty(get_class($a), 'a');

// throws exception
$Reflection = new ReflectionProperty(get_class($a), 'foo');

?>

Getting the class of the object you're passing in is implied, since inspecting a defined property is the purpose of this class.

In your example, $a->foo is a dynamic member - it is not defined as a member of class, so there is no defining class reference, line number, default value, etc. - which means, there is nothing to reflect upon.

Clearly this very useful library could use some real documentation...


Clonage

  • « ReflectionProperty
  • ReflectionProperty::__construct »
  • PHP Manual
  • ReflectionProperty
  • Clonage

ReflectionProperty::__clone

(PHP 5, PHP 7)

ReflectionProperty::__clone — Clonage

Description

final private ReflectionProperty::__clone ( ) : void

Clonage.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Voir aussi

  • ReflectionProperty::export() - Exporte
  • Clonage d'objet

User Contributed Notes

There are no user contributed notes for this page.


Construit un nouvel objet ReflectionProperty

  • « ReflectionProperty::__clone
  • ReflectionProperty::export »
  • PHP Manual
  • ReflectionProperty
  • Construit un nouvel objet ReflectionProperty

ReflectionProperty::__construct

(PHP 5, PHP 7)

ReflectionProperty::__construct — Construit un nouvel objet ReflectionProperty

Description

public ReflectionProperty::__construct ( object|string $class , string $property )

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

class

Soit une chaîne de caractère contenant le nom de la classe à introspecter, ou un objet.

property

Le nom de la propriété à refléter.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

Le fait de tenter de récupérer ou définir la valeur d'une propriété privée ou protégée d'une classe émettra une exception.

Exemples

Exemple #1 Exemple avec ReflectionProperty::__construct()

<?php
class Str
{
    public $length  = 5;
}

// Création d'une instance de la classe ReflectionProperty
$prop = new ReflectionProperty('Str', 'length');

// Affichage de quelques informations
printf(
    "===> The%s%s%s%s property '%s' (which was %s)\n" .
    "     having the modifiers %s\n",
        $prop->isPublic() ? ' public' : '',
        $prop->isPrivate() ? ' private' : '',
        $prop->isProtected() ? ' protected' : '',
        $prop->isStatic() ? ' static' : '',
        $prop->getName(),
        $prop->isDefault() ? 'declared at compile-time' : 'created at run-time',
        var_export(Reflection::getModifierNames($prop->getModifiers()), 1)
);

// Création d'une instance de Str
$obj= new Str();

// Récupère la valeur courante
printf("---> Value is: ");
var_dump($prop->getValue($obj));

// Modifie la valeur
$prop->setValue($obj, 10);
printf("---> Setting value to 10, new value is: ");
var_dump($prop->getValue($obj));

// Affiche l'objet
var_dump($obj);
?>

Résultat de l'exemple ci-dessus est similaire à :

===> The public property 'length' (which was declared at compile-time)
     having the modifiers array (
  0 => 'public',
)
---> Value is: int(5)
---> Setting value to 10, new value is: int(10)
object(Str)#2 (1) {
  ["length"]=>
  int(10)
}

Exemple #2 Récupération d'une valeur depuis une propriété privée ou protégée en utilisant la classe ReflectionProperty

<?php

class Foo {
    public $x = 1;
    protected $y = 2;
    private $z = 3;
}

$obj = new Foo;

$prop = new ReflectionProperty('Foo', 'y');
$prop->setAccessible(true); /* À partir de PHP 5.3.0 */
var_dump($prop->getValue($obj)); // int(2)

$prop = new ReflectionProperty('Foo', 'z');
$prop->setAccessible(true); /* À partir de PHP 5.3.0 */
var_dump($prop->getValue($obj)); // int(2)

?>

Résultat de l'exemple ci-dessus est similaire à :

int(2)
int(3)

Voir aussi

  • ReflectionProperty::getName() - Récupère le nom de la proriété
  • Les constructeurs

User Contributed Notes

geoffsmiths at hotmail dot com 05-Jul-2017 12:20
At example #2: the comment // int(2) is stated while the value for the private property is actually 3. (private $z = 3;)

var_dump($prop->getValue($obj)); // This should be int(3)


Exporte

  • « ReflectionProperty::__construct
  • ReflectionProperty::getDeclaringClass »
  • PHP Manual
  • ReflectionProperty
  • Exporte

ReflectionProperty::export

(PHP 5, PHP 7)

ReflectionProperty::export — Exporte

Description

public static ReflectionProperty::export ( mixed $class , string $name , bool $return = ? ) : string

Exporte une réflexion.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

argument

La réflection à exporter.

name

Le nom de la propriété.

return

Le fait de le définir à true retournera l'export plutôt que l'émission. Le définir à false (par défaut) fera l'inverse.

Valeurs de retour

Voir aussi

  • ReflectionProperty::__toString() - Récupère une représentation textuelle

User Contributed Notes

antonfedonyuk at gmail dot com 03-Sep-2020 03:16
Note: export() method is deprecated in PHP 7.4, use __toString() instead - this method return same result.


Récupère la classe déclarante

  • « ReflectionProperty::export
  • ReflectionProperty::getDefaultValue »
  • PHP Manual
  • ReflectionProperty
  • Récupère la classe déclarante

ReflectionProperty::getDeclaringClass

(PHP 5, PHP 7)

ReflectionProperty::getDeclaringClass — Récupère la classe déclarante

Description

public ReflectionProperty::getDeclaringClass ( ) : ReflectionClass

Récupère la classe déclarante.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un objet ReflectionClass.

Voir aussi

  • ReflectionProperty::getName() - Récupère le nom de la proriété

User Contributed Notes

metamarkers at gmail dot com 17-May-2013 06:30
If you're reflecting an object and get the declaring class of a property that's set but wasn't declared in any class, it returns the class of the instance.

<?php

class X {

}

$x = new X();
$x->foo = 'bar';
$reflection = new ReflectionObject($x);
echo $reflection->getProperty('foo')->getDeclaringClass()->getName(); // X

?>


Returns the default value declared for a property

  • « ReflectionProperty::getDeclaringClass
  • ReflectionProperty::getDocComment »
  • PHP Manual
  • ReflectionProperty
  • Returns the default value declared for a property

ReflectionProperty::getDefaultValue

(PHP 8)

ReflectionProperty::getDefaultValue — Returns the default value declared for a property

Description

public ReflectionProperty::getDefaultValue ( ) : mixed

Gets the implicit or explicitly declared default value for a property.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The default value if the property has any default value (including null). If there is no default value, then null is returned. It is not possible to differentiate between a null default value and an unitialized typed property. Use ReflectionClass::hasDefaultValue() to detect the difference.

Exemples

Exemple #1 ReflectionClass::getDefaultValue() example

<?php
class Foo {
    public $bar = 1;
    public ?int $baz;
    public int $boing = 0;
}

$ro = new ReflectionClass(Foo::class);
var_dump($ro->getProperty('bar')->getDefaultValue());
var_dump($ro->getProperty('baz')->getDefaultValue());
var_dump($ro->getProperty('boing')->getDefaultValue());
?>

L'exemple ci-dessus va afficher :

int(1)
NULL
int(0)

Voir aussi

  • ReflectionProperty::hasDefaultValue() - Checks if property has a default value declared

User Contributed Notes

There are no user contributed notes for this page.


Récupère le commentaire de documentation d'une propriété

  • « ReflectionProperty::getDefaultValue
  • ReflectionProperty::getModifiers »
  • PHP Manual
  • ReflectionProperty
  • Récupère le commentaire de documentation d'une propriété

ReflectionProperty::getDocComment

(PHP 5 >= 5.1.0, PHP 7)

ReflectionProperty::getDocComment — Récupère le commentaire de documentation d'une propriété

Description

public ReflectionProperty::getDocComment ( ) : string|false

Récupère le commentaire de documentation d'une propriété.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le commentaire de documentation s'il existe, sinon false.

Exemples

Exemple #1 ReflectionProperty::getDocComment() example

<?php
class Str
{
    /**
     * @var int  La taille de la chaîne de caractère
     */
    public $length = 5;
}

$prop = new ReflectionProperty('Str', 'length');

var_dump($prop->getDocComment());

?>

Résultat de l'exemple ci-dessus est similaire à :

string(53) "/**
     * @var int  La taille de la chaîne de caractère
     */"

Exemple #2 Multiple property declarations

Si plusieurs déclaration de propriétés sont précédé d'un unique commentaire de documentation, le commentaire de documentation ne fait référence uniquement à la première propriété.

<?php
class Foo
{
    /** @var string */
    public $a, $b;
}
$class = new \ReflectionClass('Foo');
foreach ($class->getProperties() as $property) {
    echo $property->getName() . ': ' . var_export($property->getDocComment(), true) . PHP_EOL;
}
?>

L'exemple ci-dessus va afficher :

a: '/** @var string */'
b: false

Voir aussi

  • ReflectionProperty::getModifiers() - Récupère les modificateurs de propriété
  • ReflectionProperty::getName() - Récupère le nom de la proriété
  • ReflectionProperty::getValue() - Récupère la valeur de la propriété

User Contributed Notes

There are no user contributed notes for this page.


Récupère les modificateurs de propriété

  • « ReflectionProperty::getDocComment
  • ReflectionProperty::getName »
  • PHP Manual
  • ReflectionProperty
  • Récupère les modificateurs de propriété

ReflectionProperty::getModifiers

(PHP 5, PHP 7)

ReflectionProperty::getModifiers — Récupère les modificateurs de propriété

Description

public ReflectionProperty::getModifiers ( ) : int

Récupère les modificateurs.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Une représentation numérique des modificateurs.

Voir aussi

  • ReflectionProperty::isPrivate() - Vérifie si la propriété est privée
  • Reflection::getModifierNames() - Récupère les nom des modificateurs

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom de la proriété

  • « ReflectionProperty::getModifiers
  • ReflectionProperty::getType »
  • PHP Manual
  • ReflectionProperty
  • Récupère le nom de la proriété

ReflectionProperty::getName

(PHP 5, PHP 7)

ReflectionProperty::getName — Récupère le nom de la proriété

Description

public ReflectionProperty::getName ( ) : string

Récupère le nom de la proriété.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le nom de la propriété reflétée.

Voir aussi

  • ReflectionProperty::getValue() - Récupère la valeur de la propriété

User Contributed Notes

There are no user contributed notes for this page.


Récupère le type d'une propriété

  • « ReflectionProperty::getName
  • ReflectionProperty::getValue »
  • PHP Manual
  • ReflectionProperty
  • Récupère le type d'une propriété

ReflectionProperty::getType

(PHP 7 >= 7.4.0)

ReflectionProperty::getType — Récupère le type d'une propriété

Description

public ReflectionProperty::getType ( ) : ReflectionType|null

Récupère le type associé à une propriété.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne une ReflectionType si la propriété à un type, et null sinon.

Exemples

Exemple #1 Exemple de ReflectionProperty::getType()

<?php
class User
{
    public string $name;
}

$rp = new ReflectionProperty('User', 'name');
echo $rp->getType()->getName();
?>

L'exemple ci-dessus va afficher :

string

Voir aussi

  • ReflectionProperty::hasType() - Vérifie si la propriété à un type
  • ReflectionProperty::isInitialized() - Vérifie si une propriété est initialisée

User Contributed Notes

andr3medeiros at gmail dot com 06-Aug-2020 10:31
<?php

namespace App\Traits;

use ReflectionClass;
use Illuminate\Support\Str;
use InvalidArgumentException;

trait FieldTypeTrait {

  protected function getType(String $field, ReflectionClass $reflectedClass = null)
  {
    if(is_null($reflectedClass)) {
      $reflectedClass = new ReflectionClass($this);
    }

    if ($reflectedClass->hasProperty($field)) {
      return $this->getFieldType($field, $reflectedClass);
    }

    return null;
  }

  protected function enumValue(String $field) {
    if($this->isEnum($field)) {
      throw new InvalidArgumentException("'$field' is not an enum");
    }

    $type = $this->getType($field);
    $enumClass = $type->name;

    return new $enumClass($this->{$field});
  }

  protected function isEnum(String $field)
  {
    $type = $this->getType($field);

    if(!is_object($type)) {
      return false;
    }

    $className = $type->name;

    $reflectedClass = new ReflectionClass($className);
    $reflectedParent = $reflectedClass->getParentClass();

    return $reflectedParent->getName() == 'MyCLabs\Enum\Enum';
  }

  private function getUseStatements(): array
  {
    $reflectedThis = new ReflectionClass($this);
    $contents = file_get_contents($reflectedThis->getFileName());

    $matches = [];

    preg_match_all("/use ([\w\\\\]+)( as \w+)*/", $contents, $matches);

    $results = [];
    foreach ($matches[1] as $index => $value) {
      $results[] = [
        'namespace' => $value,
        'alias' => isset($matches[2][$index]) ? str_replace(' as ', '', $matches[2][$index]) : null
      ];
    }

    return $results;
  }

  private function getFieldType(String $field, ReflectionClass $reflectedClass)
  {
    $docComment = $reflectedClass->getProperty($field)->getDocComment();
    $type = $this->getFieldTypeByFieldDocComment($docComment);

    if (!is_object($type)) {
      $fromClass = $this->getTypeByClassDocComment($field, $reflectedClass->getDocComment());

      if(is_object($fromClass)) {
          return $fromClass;
      }
    }

    return $type;
  }

  private function getFieldTypeByFieldDocComment(String $docComment)
  {
    $matches = [];

    if (preg_match("/\@var (\w+)(\[\])*/", $docComment, $matches) === 1) {

      if (count($matches) > 0) {
        $type = $matches[1];
        $isArray = isset($matches[2]);
        $fullyQualifiedName = $this->getFullyQualifiedName($type);

        if (class_exists($fullyQualifiedName)) {
          return (object) [
            'name' => $fullyQualifiedName,
            'array' => $isArray
          ];
        }
      }

      return $type;
    }
  }

  private function getTypeByClassDocComment(String $field, String $docComment)
  {
    $matches = [];

    if (preg_match_all("/\@property (\w+) (\\$\w+)/", $docComment, $matches) > 0) {
      $type = null;
      $isArray = false;

      foreach ($matches[2] as $index => $value) {
        if($value == $field) {
          $type = $matches[1][$index];
          $isArray = Str::endsWith($type, '[]');
          $type = str_replace('[]', '', $type);
        }
      }

      if ($type) {
        $fullyQualifiedName = $this->getFullyQualifiedName($type);

        if (class_exists($fullyQualifiedName)) {
          return (object) [
            'name' => $fullyQualifiedName,
            'array' => $isArray
          ];
        }
      }

      return $type;
    }
  }

  private function getFullyQualifiedName($className)
  {
    $useStatements = collect($this->getUseStatements());
    $aliasedStatement = $useStatements->where('alias', $className);

    if ($aliasedStatement) {
      return $aliasedStatement['namespace'];
    }

    $statement = $useStatements->first(function ($statement) use ($className) {
      return Str::endsWith($statement['namespace'], $className);
    });

    if ($statement) {
      return $statement['namespace'];
    }

    return null;
  }
}
email at dronov dot vg 03-Jun-2020 02:46
class User
{
    /**
     * @var string
     */
    public $name;
}

function getTypeNameFromAnnotation(string $className, string $propertyName): ?string
{
    $rp = new \ReflectionProperty($className, $propertyName);
    if (preg_match('/@var\s+([^\s]+)/', $rp->getDocComment(), $matches)) {
        return $matches[1];
    }

    return null;
}

echo getTypeNameFromAnnotation('User', 'name');

// string


Récupère la valeur de la propriété

  • « ReflectionProperty::getType
  • ReflectionProperty::hasDefaultValue »
  • PHP Manual
  • ReflectionProperty
  • Récupère la valeur de la propriété

ReflectionProperty::getValue

(PHP 5, PHP 7)

ReflectionProperty::getValue — Récupère la valeur de la propriété

Description

public ReflectionProperty::getValue ( object|null $object = null ) : mixed

Récupère la valeur de la propriété.

Liste de paramètres

object

L'objet à utiliser dans le cas d'une propriété non statique. Si vous souhaitez récupérer la valeur par défaut de la propriété, utilisez ReflectionClass::getDefaultProperties() à la place.

Valeurs de retour

La valeur courante de la propriété.

Erreurs / Exceptions

Émet une ReflectionException si la propriété est inaccessible. Vous pouvez transformer une propriété protégée ou privée en publique grâce à ReflectionProperty::setAccessible().

Historique

Version | Description
8.0.0 | object est désormais nullable.

Exemples

Exemple #1 Exemple avec ReflectionProperty::getValue()

<?php
class Foo {
    public static $staticProperty = 'foobar';

    public $property = 'barfoo';
    protected $privateProperty = 'foofoo';
}

$reflectionClass = new ReflectionClass('Foo');

var_dump($reflectionClass->getProperty('staticProperty')->getValue());
var_dump($reflectionClass->getProperty('property')->getValue(new Foo));

$reflectionProperty = $reflectionClass->getProperty('privateProperty');
$reflectionProperty->setAccessible(true);
var_dump($reflectionProperty->getValue(new Foo));
?>

L'exemple ci-dessus va afficher :

string(6) "foobar"
string(6) "barfoo"
string(6) "foofoo"

Voir aussi

  • ReflectionProperty::setValue() - Définit la valeur de la propriété
  • ReflectionProperty::setAccessible() - Définit l'accessibilité d'une propriété
  • ReflectionClass::getDefaultProperties() - Récupère les propriétés par défaut
  • ReflectionClass::getStaticPropertyValue() - Récupère la valeur d'une propriété statique

User Contributed Notes

sergiy dot sokolenko at gmail dot com 28-Jun-2010 03:48
To allow protected and private properties to be accessed, you should use
ReflectionProperty::setAccessible(bool $accessible):

<?php
/** Class Foo with protected and private members */
class Foo {
    protected $bar = 'barrr!';
    private $baz = 'bazzz!';
}

$reflFoo = new ReflectionClass('Foo');
$reflBar = $reflFoo->getProperty('bar');
$reflBaz = $reflFoo->getProperty('baz');

// Set private and protected members accessible for getValue/setValue
$reflBar->setAccessible(true);
$reflBaz->setAccessible(true);

$foo = new Foo();
echo $reflBar->getValue($foo); // will output "barrr!"
echo $reflBaz->getValue($foo); // will output "bazzz!"

// You can also setValue
$reflBar->setValue($foo, "new value");
echo $reflBar->getValue($foo); // will output "new value"
?>


Checks if property has a default value declared

  • « ReflectionProperty::getValue
  • ReflectionProperty::hasType »
  • PHP Manual
  • ReflectionProperty
  • Checks if property has a default value declared

ReflectionProperty::hasDefaultValue

(PHP 8)

ReflectionProperty::hasDefaultValue — Checks if property has a default value declared

Description

public ReflectionProperty::hasDefaultValue ( ) : bool

Checks whether the property was declared with a default value, including an implicit null default value. Only returns false for typed properties without default value (or dynamic properties).

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

If the property has any default value (including null) true is returned; if the property is typed without a default value declared or is a dynamic property, false is returned.

Exemples

Exemple #1 ReflectionClass::hasDefaultValue() example

<?php
class Foo {
    public $bar;
    public ?int $baz;
    public ?int $foo = null;
    public int $boing;

    public function __construct()
    {
        $this->ping = '';
    }
}

$ro = new ReflectionObject(new Foo());
var_dump($ro->getProperty('bar')->hasDefaultValue());
var_dump($ro->getProperty('baz')->hasDefaultValue());
var_dump($ro->getProperty('foo')->hasDefaultValue());
var_dump($ro->getProperty('boing')->hasDefaultValue());
var_dump($ro->getProperty('ping')->hasDefaultValue()); // Dynamic property
var_dump($ro->getProperty('pong')->hasDefaultValue()); // Not defined property
?>

L'exemple ci-dessus va afficher :

bool(true)
bool(false)
bool(true)
bool(false)
bool(false)

Fatal error: Uncaught ReflectionException: Property Foo::$pong does not exist in example.php

Voir aussi

  • ReflectionProperty::getDefaultValue() - Returns the default value declared for a property

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la propriété à un type

  • « ReflectionProperty::hasDefaultValue
  • ReflectionProperty::isDefault »
  • PHP Manual
  • ReflectionProperty
  • Vérifie si la propriété à un type

ReflectionProperty::hasType

(PHP 7 >= 7.4.0)

ReflectionProperty::hasType — Vérifie si la propriété à un type

Description

public ReflectionProperty::hasType ( ) : bool

Vérifie si la propriété à un type associé avec.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si un type est spécifié, false sinon.

Exemples

Exemple #1 Exemple de ReflectionProperty::hasType()

<?php
class User
{
    public string $name;
}

$rp = new ReflectionProperty('User', 'name');
var_dump($rp->hasType());
?>

L'exemple ci-dessus va afficher :

bool(true)

Voir aussi

  • ReflectionProperty::getType() - Récupère le type d'une propriété
  • ReflectionProperty::isInitialized() - Vérifie si une propriété est initialisée

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la propriété est celle par défaut

  • « ReflectionProperty::hasType
  • ReflectionProperty::isInitialized »
  • PHP Manual
  • ReflectionProperty
  • Vérifie si la propriété est celle par défaut

ReflectionProperty::isDefault

(PHP 5, PHP 7)

ReflectionProperty::isDefault — Vérifie si la propriété est celle par défaut

Description

public ReflectionProperty::isDefault ( ) : bool

Vérifie si la propriété a été déclarée au moment de la compilation, ou si la propriété a été déclarée dynamiquement au moment de l'exécution.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la propriété a été déclarée lors de la compilation ou false si elle a été déclarée au moment de l'exécution.

Exemples

Exemple #1 Exemple avec ReflectionClass::isDefault()

<?php
class Foo {
    public $bar;
}

$o = new Foo();
$o->bar = 42;
$o->baz = 42;

$ro = new ReflectionObject($o);
var_dump($ro->getProperty('bar')->isDefault());
var_dump($ro->getProperty('baz')->isDefault());
?>

L'exemple ci-dessus va afficher :

bool(true)
bool(false)

Voir aussi

  • ReflectionProperty::getValue() - Récupère la valeur de la propriété

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si une propriété est initialisée

  • « ReflectionProperty::isDefault
  • ReflectionProperty::isPrivate »
  • PHP Manual
  • ReflectionProperty
  • Vérifie si une propriété est initialisée

ReflectionProperty::isInitialized

(PHP 7 >= 7.4.0)

ReflectionProperty::isInitialized — Vérifie si une propriété est initialisée

Description

public ReflectionProperty::isInitialized ( object|null $object = null ) : bool

Vérifie si une propriété est initialisée.

Liste de paramètres

object

Si la propriété n'est pas statique un objet doit être fourni pour récupérer la propriété depuis.

Valeurs de retour

Retourne false pour les propriétés typées antérieur à leur initialisation, et pour les propriétes qui ont était explicitement unset(). Pour toutes les autres propriétes true sera retourné.

Erreurs / Exceptions

Lance une ReflectionException si la propriété est innacessible. Il est possible de rendre une propriété protégée ou privée acessile en utilisant ReflectionProperty::setAccessible().

Historique

Version | Description
8.0.0 | object est désormais nullable.

Exemples

Exemple #1 Exemple de ReflectionProperty::isInitialized()

<?php
class User
{
    public string $name;
}

$rp = new ReflectionProperty('User', 'name');
$user = new User;
var_dump($rp->isInitialized($user));
$user->name = 'Nikita';
var_dump($rp->isInitialized($user));
?>

L'exemple ci-dessus va afficher :

bool(false)
bool(true)

Voir aussi

  • ReflectionProperty::hasType() - Vérifie si la propriété à un type

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la propriété est privée

  • « ReflectionProperty::isInitialized
  • ReflectionProperty::isProtected »
  • PHP Manual
  • ReflectionProperty
  • Vérifie si la propriété est privée

ReflectionProperty::isPrivate

(PHP 5, PHP 7)

ReflectionProperty::isPrivate — Vérifie si la propriété est privée

Description

public ReflectionProperty::isPrivate ( ) : bool

Vérifie si la propriété est privée.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la propriété est privée, false sinon.

Voir aussi

  • ReflectionProperty::isPublic() - Vérifie si la propriété est publique
  • ReflectionProperty::isProtected() - Vérifie si la propriété est protégée
  • ReflectionProperty::isStatic() - Vérifie si la propriété est statique

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la propriété est protégée

  • « ReflectionProperty::isPrivate
  • ReflectionProperty::isPublic »
  • PHP Manual
  • ReflectionProperty
  • Vérifie si la propriété est protégée

ReflectionProperty::isProtected

(PHP 5, PHP 7)

ReflectionProperty::isProtected — Vérifie si la propriété est protégée

Description

public ReflectionProperty::isProtected ( ) : bool

Vérifie si la propriété est protégée.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la propriété est protégée, false sinon.

Voir aussi

  • ReflectionProperty::isPublic() - Vérifie si la propriété est publique
  • ReflectionProperty::isPrivate() - Vérifie si la propriété est privée
  • ReflectionProperty::isStatic() - Vérifie si la propriété est statique

User Contributed Notes

Ievgen Iefimenko the_boss at bk dot ru 09-Jun-2012 09:44
<?php

/**
* Return 1 if property is public,
* else return void
*/

class Classname{
    private $variable;
}

$obj = new Classname;
$rp = new ReflectionProperty($obj,'variable');
echo $rp->isPrivate();
?>


Vérifie si la propriété est publique

  • « ReflectionProperty::isProtected
  • ReflectionProperty::isStatic »
  • PHP Manual
  • ReflectionProperty
  • Vérifie si la propriété est publique

ReflectionProperty::isPublic

(PHP 5, PHP 7)

ReflectionProperty::isPublic — Vérifie si la propriété est publique

Description

public ReflectionProperty::isPublic ( ) : bool

Vérifie si la propriété est publique.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la propriété est publique, false sinon.

Voir aussi

  • ReflectionProperty::isProtected() - Vérifie si la propriété est protégée
  • ReflectionProperty::isPrivate() - Vérifie si la propriété est privée
  • ReflectionProperty::isStatic() - Vérifie si la propriété est statique

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la propriété est statique

  • « ReflectionProperty::isPublic
  • ReflectionProperty::setAccessible »
  • PHP Manual
  • ReflectionProperty
  • Vérifie si la propriété est statique

ReflectionProperty::isStatic

(PHP 5, PHP 7)

ReflectionProperty::isStatic — Vérifie si la propriété est statique

Description

public ReflectionProperty::isStatic ( ) : bool

Vérifie si la propriété est statique.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si la propriété est statique, false sinon.

Voir aussi

  • ReflectionProperty::isPublic() - Vérifie si la propriété est publique
  • ReflectionProperty::isProtected() - Vérifie si la propriété est protégée
  • ReflectionProperty::isPrivate() - Vérifie si la propriété est privée

User Contributed Notes

There are no user contributed notes for this page.


Définit l'accessibilité d'une propriété

  • « ReflectionProperty::isStatic
  • ReflectionProperty::setValue »
  • PHP Manual
  • ReflectionProperty
  • Définit l'accessibilité d'une propriété

ReflectionProperty::setAccessible

(PHP 5 >= 5.3.0, PHP 7)

ReflectionProperty::setAccessible — Définit l'accessibilité d'une propriété

Description

public ReflectionProperty::setAccessible ( bool $accessible ) : void

Active l'accès à une propriété protégée ou privée via les méthodes ReflectionProperty::getValue() et ReflectionProperty::setValue().

Liste de paramètres

accessible

true pour permettre l'accès, ou false.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Définition d'une classe simple

<?php
class MyClass
{
    private $foo = 'bar';
}
$property = new ReflectionProperty("MyClass", "foo");
$property->setAccessible(true);
$obj = new MyClass();
echo $property->getValue($obj);
echo $obj->foo;
?>

Résultat de l'exemple ci-dessus est similaire à :

bar
Fatal error: Uncaught Error: Cannot access private property MyClass::$foo in /in/WJqTv:12

Voir aussi

  • ReflectionProperty::isPrivate() - Vérifie si la propriété est privée
  • ReflectionProperty::isProtected() - Vérifie si la propriété est protégée

User Contributed Notes

matthieu at mnapoli dot fr 19-Oct-2012 08:50
Note that the property will only become accessible using the ReflectionProperty class. The property is still private or protected in the class instances.

<?php
class MyClass {
     private $myProperty = true;
}

$class = new ReflectionClass("MyClass");
$property = $class->getProperty("myProperty");
$property->setAccessible(true);

$obj = new MyClass();
echo $property->getValue($obj); // Works
echo $obj->myProperty; // Doesn't work (error)
?>
Yzmir Ramirez 15-Oct-2010 05:31
Have you tried:

<?php

echo "PHP Version: ".phpversion()."\n";

class Foo
{
    private   $bar  = "private";
    protected $bar2 = "protected";
    public    $bar3 = "public";
}

$obj = new Foo;

$arr = (array)$obj;

print_r($arr);
?>

Output:

PHP Version: 5.2.12
Array
(
    [Foobar] => private
    [*bar2] => protected
    [bar3] => public
)

PHP Version: 5.1.6
Array
(
    [Foobar] => private
    [*bar2] => protected
    [bar3] => public
)
Rob McVey 11-Jun-2010 10:11
If you are using < PHP 5.3 and need to get the private attributes and values, you can use this method:

This is what you are doing:

<?php
$obj_with_privates = new MyObject();
$class     = get_class($obj_with_privates);
$vars     = get_object_vars($obj_with_privates);
//will not show private attributes
print_r($vars);

$reflection = new ReflectionClass( $class );
$attributes = $reflection->getProperties();
//still no private access!
print_r($attributes);
?>

This is what you should do:

<?php
$obj_with_privates = new MyObject();

$class         = get_class( $obj_with_privates );
$reflection = new ReflectionClass( $class );
$abstract    = $reflection->getMethods( ReflectionMethod::IS_ABSTRACT );
$priv_attr  = $reflection->getProperties( ReflectionProperty::IS_PRIVATE );
$privates   = array();
$parent     = get_parent_class( $class );
$child         = $class;
$constructor = $reflection->getConstructor();

//If the class has abstract methods you need to implement them
$abstr_methods = "";
if(sizeof($abstr_methods))
{
    foreach($abstract as $method)
    {
        $mname = $method->name;
        $abstr_methods .= "public function $mname(){return false;}";
    }
}

//Convert private attributes to public attributes
if(sizeof($priv_attr))
{
    $parseable = unserialize(str_replace("\0$class\0", "\0*\0", serialize($obj)));
    foreach($priv_attr as $attribute)
    {
        $aname = $attribute->name;
        $privates[$aname] = $parseable->$aname;
    }
}

$temp_child_class = "temp" . str_replace("_", "", "$class");

//You can gain access to protected attributes by extending the target class
$class_def = "
class $temp_child_class extends $class{
    $constructor
    public function reflect_getmyvars(){
        return get_object_vars(\$this);
    }
    $abstr_methods
}
";

//place class definition in memory
eval($class_def);

//generate object from dynamic class
$tcobj =@ new $temp_child_class;
//call the method we added to the object (to access protected vars)
$vars = $tcobj->reflect_getmyvars();

$attribs = array_merge($vars, $privates);

//will now show private attributes
print_r($attribs);
?>


Définit la valeur de la propriété

  • « ReflectionProperty::setAccessible
  • ReflectionProperty::__toString »
  • PHP Manual
  • ReflectionProperty
  • Définit la valeur de la propriété

ReflectionProperty::setValue

(PHP 5, PHP 7)

ReflectionProperty::setValue — Définit la valeur de la propriété

Description

public ReflectionProperty::setValue ( object $object , mixed $value ) : void
public ReflectionProperty::setValue ( mixed $value ) : void

Définit (modifie) la valeur de la propriété.

Liste de paramètres

object

L'objet à utiliser dans le cas d'une propriété non statique. Si la propriété est statique, nul besoin de préciser un objet, seul value est nécessaire.

value

La nouvelle valeur.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

Émet une ReflectionException si la propriété est inaccessible. Vous pouvez transformer une propriété protégée ou privée en publique grâce à ReflectionProperty::setAccessible().

Exemples

Exemple #1 Exemple avec ReflectionProperty::setValue()

<?php
class Foo {
    public static $staticProperty;

    public $property;
    protected $privateProperty;
}

$reflectionClass = new ReflectionClass('Foo');

$reflectionClass->getProperty('staticProperty')->setValue('foo');
var_dump(Foo::$staticProperty);

$foo = new Foo;

$reflectionClass->getProperty('property')->setValue($foo, 'bar');
var_dump($foo->property);

$reflectionProperty = $reflectionClass->getProperty('privateProperty');
$reflectionProperty->setAccessible(true);
$reflectionProperty->setValue($foo, 'foobar');
var_dump($reflectionProperty->getValue($foo));
?>

L'exemple ci-dessus va afficher :

string(3) "foo"
string(3) "bar"
string(6) "foobar"

Voir aussi

  • ReflectionProperty::getValue() - Récupère la valeur de la propriété
  • ReflectionProperty::setAccessible() - Définit l'accessibilité d'une propriété
  • ReflectionClass::setStaticPropertyValue() - Définit la valeur d'une propriété statiques

User Contributed Notes

me at ircmaxell dot om 22-Jun-2011 09:27
You can use ReflectionProperty::setValue to set the value on static properties as well as regular instance properties.  Simply pass null in place of the instance:

<?php
class Foo {
    protected static $bar = null;
    public static function sayBar() {
        echo self::$bar;
    }
}

$r = new ReflectionProperty('Foo', 'bar');
$r->setAccessible(true);
$r->setValue(null, 'foo');

Foo::sayBar(); // "foo"
?>


Récupère une représentation textuelle

  • « ReflectionProperty::setValue
  • ReflectionType »
  • PHP Manual
  • ReflectionProperty
  • Récupère une représentation textuelle

ReflectionProperty::__toString

(PHP 5, PHP 7)

ReflectionProperty::__toString — Récupère une représentation textuelle

Description

public ReflectionProperty::__toString ( ) : string

Récupère une représentation textuelle.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Voir aussi

  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionType

(PHP 7)

Introduction

La classe ReflectionType relate les informations à propos du type de retour d'une fonction.

Synopsis de la classe

abstract ReflectionType {
/* Méthodes */
public allowsNull ( ) : bool
public __toString ( ) : string
}

Historique

Version | Description
8.0.0 | ReflectionType est devenue abstraite et ReflectionType::isBuiltin() a été déplacée vers ReflectionNamedType::isBuiltin().

Sommaire

  • ReflectionType::allowsNull — Vérifie si null est permit
  • ReflectionType::__toString — To string

User Contributed Notes

Ondej Mirtes 27-Sep-2020 06:53
Method ReflectionType::getName() does not exist. This may have been virtually true in the past but not anymore. It exists on ReflectionNamedType which used to be the only child class of ReflectionType. So you could have kind of relied on that.

But in PHP 8 there's also ReflectionUnionType which doesn't have the getName() method. So in order to support PHP 8, you need to support both ReflectionNamedType and ReflectionUnionType.
benjamin dot morel at gmail dot com 18-Sep-2020 09:03
Known subclasses:

- ReflectionNamedType
- ReflectionUnionType
roland at mxchange dot org 11-Mar-2020 09:13
I guess it is <?php ReflectionNamedType::getName(); ?> ?
1franck 28-Jan-2020 08:59
For those who stumble on notice about ReflectionType::__toString() beeing deprecated, use method ReflectionType::getName() instead which is not yet documented.


Vérifie si null est permit

  • « ReflectionType
  • ReflectionType::__toString »
  • PHP Manual
  • ReflectionType
  • Vérifie si null est permit

ReflectionType::allowsNull

(PHP 7)

ReflectionType::allowsNull — Vérifie si null est permit

Description

public ReflectionType::allowsNull ( ) : bool

Vérifie si le paramètre accepte null.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si null est permit, sinon false

Exemples

Exemple #1 Exemple avec ReflectionType::allowsNull()

<?php
function someFunction(string $param, StdClass $param2 = null) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParams = $reflectionFunc->getParameters();

var_dump($reflectionParams[0]->getType()->allowsNull());
var_dump($reflectionParams[1]->getType()->allowsNull());

L'exemple ci-dessus va afficher :

bool(false)
bool(true)

Voir aussi

  • ReflectionNamedType::isBuiltin() - Vérifie si c'est un type intégré
  • ReflectionType::__toString() - To string
  • ReflectionParameter::getType() - Récupère le type du paramètre

User Contributed Notes

There are no user contributed notes for this page.


To string

  • « ReflectionType::allowsNull
  • ReflectionUnionType »
  • PHP Manual
  • ReflectionType
  • To string

ReflectionType::__toString

(PHP 7)

ReflectionType::__toString — To string

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 7.1.0. Dépendre de cette fonction est fortement déconseillé.

Description

public ReflectionType::__toString ( ) : string

Récupère le nom du type du paramètre.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le type du paramètre.

Exemples

Exemple #1 Exemple avec ReflectionType::__toString()

<?php
function someFunction(string $param) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParam = $reflectionFunc->getParameters()[0];

echo $reflectionParam->getType();

Résultat de l'exemple ci-dessus est similaire à :

string

Historique

Version | Description
7.1.0 | ReflectionType::__toString() a été rendu obsolète.

Voir aussi

  • ReflectionNamedType::getName() - Récupère le texte de la déclaration de type
  • ReflectionNamedType::isBuiltin() - Vérifie si c'est un type intégré
  • ReflectionType::allowsNull() - Vérifie si null est permit
  • ReflectionUnionType::getTypes() - Returns the types included in the union type
  • ReflectionParameter::getType() - Récupère le type du paramètre

User Contributed Notes

Anonymous 26-Jul-2020 04:32
Regarding this method's deprecation:

ReflectionType::__toString() was first deprecated in PHP 7.1.0 alpha1.
The deprecation notice was removed in PHP 7.1.0 RC3, before being reinstated in PHP 7.4.0 alpha1.

Starting with PHP 7.1.0 beta 3, ReflectionParameter::getType() & ReflectionFunctionAbstract::getReturnType() return instances of ReflectionNamedType instead of ReflectionType.
The ReflectionNamedType class inherits from ReflectionType but provides an additional getName() method which can be used to retrieve the type hint.

Lastly, PHP 8.0.0 alpha1 introduced the concept of union types (see https://wiki.php.net/rfc/union_types_v2). As a result, ReflectionParameter::getType() & ReflectionFunctionAbstract::getReturnType() will now return either instances of ReflectionNamedType or ReflectionUnionType depending on the type hint, both of which are descendants of ReflectionType.


The ReflectionUnionType class

(PHP 8)

Introduction

Synopsis de la classe

ReflectionUnionType extends ReflectionType {
/* Méthodes */
public getTypes ( ) : array
/* Méthodes héritées */
public ReflectionType::allowsNull ( ) : bool
public ReflectionType::__toString ( ) : string
}

Sommaire

  • ReflectionUnionType::getTypes — Returns the types included in the union type

User Contributed Notes

There are no user contributed notes for this page.


Returns the types included in the union type

  • « ReflectionUnionType
  • ReflectionGenerator »
  • PHP Manual
  • ReflectionUnionType
  • Returns the types included in the union type

ReflectionUnionType::getTypes

(PHP 8)

ReflectionUnionType::getTypes — Returns the types included in the union type

Description

public ReflectionUnionType::getTypes ( ) : array

Returns the reflections of types included in the union type.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

An array of ReflectionType objects.

Exemples

Exemple #1 ReflectionUnionType::getTypes() example

<?php
function someFunction(int|float $number) {}

$reflectionFunc = new ReflectionFunction('someFunction');
$reflectionParam = $reflectionFunc->getParameters()[0];

var_dump($reflectionParam->getType()->getTypes());

Résultat de l'exemple ci-dessus est similaire à :

array(2) {
    [0] =>
    class ReflectionNamedType#4(0) {
    }
    [1] =>
    class ReflectionNamedType#5(0) {
    }
}

Voir aussi

  • ReflectionType::allowsNull() - Vérifie si null est permit
  • ReflectionParameter::getType() - Récupère le type du paramètre

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionGenerator

(PHP 7)

Introduction

La classe ReflectionGenerator rapporte des informations à props d'un générateur.

Synopsis de la classe

ReflectionGenerator {
/* Méthodes */
public __construct ( Generator $generator )
public getExecutingFile ( ) : string
public getExecutingGenerator ( ) : Generator
public getExecutingLine ( ) : int
public getFunction ( ) : ReflectionFunctionAbstract
public getThis ( ) : object|null
public getTrace ( int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT ) : array
}

Sommaire

  • ReflectionGenerator::__construct — Construit un objet ReflectionGenerator
  • ReflectionGenerator::getExecutingFile — Récupère le nom de fichier du générateur actuellement exécuté
  • ReflectionGenerator::getExecutingGenerator — Récupère l'objet Generator exécuté
  • ReflectionGenerator::getExecutingLine — Récupère la ligne actuellement exécutée du générateur
  • ReflectionGenerator::getFunction — Récupère le nom de fonction du générateur
  • ReflectionGenerator::getThis — Récupère la valeur de $this du générateur
  • ReflectionGenerator::getTrace — Récupère la trace du générateur exécutant

User Contributed Notes

There are no user contributed notes for this page.


Construit un objet ReflectionGenerator

  • « ReflectionGenerator
  • ReflectionGenerator::getExecutingFile »
  • PHP Manual
  • ReflectionGenerator
  • Construit un objet ReflectionGenerator

ReflectionGenerator::__construct

(PHP 7)

ReflectionGenerator::__construct — Construit un objet ReflectionGenerator

Description

public ReflectionGenerator::__construct ( Generator $generator )

Construit un objet ReflectionGenerator.

Liste de paramètres

generator

Un objet generator.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec ReflectionGenerator::__construct()

<?php

function gen()
{
    yield 1;
}

$gen = gen();

$reflectionGen = new ReflectionGenerator($gen);

echo <<< output
{$reflectionGen->getFunction()->name}
Line: {$reflectionGen->getExecutingLine()}
File: {$reflectionGen->getExecutingFile()}
output;

Résultat de l'exemple ci-dessus est similaire à :

gen
Line: 5
File: /path/to/file/example.php

Voir aussi

  • ReflectionGenerator::getFunction() - Récupère le nom de fonction du générateur
  • ReflectionGenerator::getExecutingLine() - Récupère la ligne actuellement exécutée du générateur
  • ReflectionGenerator::getExecutingFile() - Récupère le nom de fichier du générateur actuellement exécuté

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom de fichier du générateur actuellement exécuté

  • « ReflectionGenerator::__construct
  • ReflectionGenerator::getExecutingGenerator »
  • PHP Manual
  • ReflectionGenerator
  • Récupère le nom de fichier du générateur actuellement exécuté

ReflectionGenerator::getExecutingFile

(PHP 7)

ReflectionGenerator::getExecutingFile — Récupère le nom de fichier du générateur actuellement exécuté

Description

public ReflectionGenerator::getExecutingFile ( ) : string

Récupère le chemin complet et le nom de fichier du générateur actuellement exécuté.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le chemin complet et le nom de fichier du générateur actuellement exécuté.

Exemples

Exemple #1 Exemple avec ReflectionGenerator::getExecutingFile()

<?php

class GenExample
{
    public function gen()
    {
        yield 1;
    }
}

$gen = (new GenExample)->gen();

$reflectionGen = new ReflectionGenerator($gen);

echo "File: {$reflectionGen->getExecutingFile()}";

Résultat de l'exemple ci-dessus est similaire à :

File: /path/to/file/example.php

Voir aussi

  • ReflectionGenerator::getExecutingLine() - Récupère la ligne actuellement exécutée du générateur
  • ReflectionGenerator::getExecutingGenerator() - Récupère l'objet Generator exécuté

User Contributed Notes

There are no user contributed notes for this page.


Récupère l'objet Generator exécuté

  • « ReflectionGenerator::getExecutingFile
  • ReflectionGenerator::getExecutingLine »
  • PHP Manual
  • ReflectionGenerator
  • Récupère l'objet Generator exécuté

ReflectionGenerator::getExecutingGenerator

(PHP 7)

ReflectionGenerator::getExecutingGenerator — Récupère l'objet Generator exécuté

Description

public ReflectionGenerator::getExecutingGenerator ( ) : Generator

Récupère l'objet Generator exécuté.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne l'objet Generator actuellement exécuté.

Exemples

Exemple #1 Exemple avec ReflectionGenerator::getExecutingGenerator()

<?php

class GenExample
{
    public function gen()
    {
        yield 1;
    }
}

$gen = (new GenExample)->gen();

$reflectionGen = new ReflectionGenerator($gen);

$gen2 = $reflectionGen->getExecutingGenerator();

var_dump($gen2 === $gen);
var_dump($gen2->current());

Résultat de l'exemple ci-dessus est similaire à :

bool(true)
int(1);

Voir aussi

  • ReflectionGenerator::getExecutingLine() - Récupère la ligne actuellement exécutée du générateur
  • ReflectionGenerator::getExecutingFile() - Récupère le nom de fichier du générateur actuellement exécuté

User Contributed Notes

There are no user contributed notes for this page.


Récupère la ligne actuellement exécutée du générateur

  • « ReflectionGenerator::getExecutingGenerator
  • ReflectionGenerator::getFunction »
  • PHP Manual
  • ReflectionGenerator
  • Récupère la ligne actuellement exécutée du générateur

ReflectionGenerator::getExecutingLine

(PHP 7)

ReflectionGenerator::getExecutingLine — Récupère la ligne actuellement exécutée du générateur

Description

public ReflectionGenerator::getExecutingLine ( ) : int

Récupère la ligne actuellement exécutée du générateur.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le numéro de ligne de la déclaration actuellement exécutée dans le générateur.

Exemples

Exemple #1 Exemple avec ReflectionGenerator::getExecutingLine()

<?php

class GenExample
{
    public function gen()
    {
        yield 1;
    }
}

$gen = (new GenExample)->gen();

$reflectionGen = new ReflectionGenerator($gen);

echo "Line: {$reflectionGen->getExecutingLine()}";

Résultat de l'exemple ci-dessus est similaire à :

Line: 7

Voir aussi

  • ReflectionGenerator::getExecutingGenerator() - Récupère l'objet Generator exécuté
  • ReflectionGenerator::getExecutingFile() - Récupère le nom de fichier du générateur actuellement exécuté

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom de fonction du générateur

  • « ReflectionGenerator::getExecutingLine
  • ReflectionGenerator::getThis »
  • PHP Manual
  • ReflectionGenerator
  • Récupère le nom de fonction du générateur

ReflectionGenerator::getFunction

(PHP 7)

ReflectionGenerator::getFunction — Récupère le nom de fonction du générateur

Description

public ReflectionGenerator::getFunction ( ) : ReflectionFunctionAbstract

Permet l'obtention du nom de fonction du générateur en retournant une classe dérivé depuis ReflectionFunctionAbstract.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne une classe ReflectionFunctionAbstract. Ceci sera ReflectionFunction pour les fonctions, ou ReflectionMethod pour les méthodes.

Exemples

Exemple #1 Exemple avec ReflectionGenerator::getFunction()

<?php

function gen()
{
    yield 1;
}

$gen = gen();

$reflectionGen = new ReflectionGenerator($gen);

var_dump($reflectionGen->getFunction());

Résultat de l'exemple ci-dessus est similaire à :

object(ReflectionFunction)#3 (1) {
  ["name"]=>
  string(3) "gen"
}

Voir aussi

  • ReflectionGenerator::getThis() - Récupère la valeur de $this du générateur
  • ReflectionGenerator::getTrace() - Récupère la trace du générateur exécutant

User Contributed Notes

There are no user contributed notes for this page.


Récupère la valeur de $this du générateur

  • « ReflectionGenerator::getFunction
  • ReflectionGenerator::getTrace »
  • PHP Manual
  • ReflectionGenerator
  • Récupère la valeur de $this du générateur

ReflectionGenerator::getThis

(PHP 7)

ReflectionGenerator::getThis — Récupère la valeur de $this du générateur

Description

public ReflectionGenerator::getThis ( ) : object|null

Récupère la valeur de $this du générateur auquel il a accès.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne la valeur de $this, ou null si le générateur n'a pas été crée dans un contexte de classe.

Exemples

Exemple #1 Exemple avec ReflectionGenerator::getThis()

<?php

class GenExample
{
    public function gen()
    {
        yield 1;
    }
}

$gen = (new GenExample)->gen();

$reflectionGen = new ReflectionGenerator($gen);

var_dump($reflectionGen->getThis());

Résultat de l'exemple ci-dessus est similaire à :

object(GenExample)#3 (0) {
}

Voir aussi

  • ReflectionGenerator::getFunction() - Récupère le nom de fonction du générateur
  • ReflectionGenerator::getTrace() - Récupère la trace du générateur exécutant

User Contributed Notes

There are no user contributed notes for this page.


Récupère la trace du générateur exécutant

  • « ReflectionGenerator::getThis
  • ReflectionReference »
  • PHP Manual
  • ReflectionGenerator
  • Récupère la trace du générateur exécutant

ReflectionGenerator::getTrace

(PHP 7)

ReflectionGenerator::getTrace — Récupère la trace du générateur exécutant

Description

public ReflectionGenerator::getTrace ( int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT ) : array

Récupère la trace du générateur actuellement exécuté.

Liste de paramètres

options

La valeur d'options peut être n'importe laquelle des drapeaux suivant.

Options disponible
Option | Description
DEBUG_BACKTRACE_PROVIDE_OBJECT | Par défaut.
DEBUG_BACKTRACE_IGNORE_ARGS | N'inclue pas les informations des arguments pour les fonctions dans la trace d'appels.

Valeurs de retour

Retourne la trace du générateur actuellement exécuté.

Exemples

Exemple #1 Exemple avec ReflectionGenerator::getTrace()

<?php
function foo() {
    yield 1;
}

function bar()
{
    yield from foo();
}

function baz()
{
    yield from bar();
}

$gen = baz();
$gen->valid(); // start the generator

var_dump((new ReflectionGenerator($gen))->getTrace());

Résultat de l'exemple ci-dessus est similaire à :

array(2) {
  [0]=>
  array(4) {
    ["file"]=>
    string(18) "example.php"
    ["line"]=>
    int(8)
    ["function"]=>
    string(3) "foo"
    ["args"]=>
    array(0) {
    }
  }
  [1]=>
  array(4) {
    ["file"]=>
    string(18) "example.php"
    ["line"]=>
    int(12)
    ["function"]=>
    string(3) "bar"
    ["args"]=>
    array(0) {
    }
  }
}

Voir aussi

  • ReflectionGenerator::getFunction() - Récupère le nom de fonction du générateur
  • ReflectionGenerator::getThis() - Récupère la valeur de $this du générateur

User Contributed Notes

There are no user contributed notes for this page.


The ReflectionReference class

(PHP 7 >= 7.4.0)

Introduction

The ReflectionReference class provides information about a reference.

Synopsis de la classe

final ReflectionReference {
/* Méthodes */
public static fromArrayElement ( array $array , int|string $key ) : ReflectionReference|null
public getId ( ) : string
}

Sommaire

  • ReflectionReference::fromArrayElement — Create a ReflectionReference from an array element
  • ReflectionReference::getId — Get unique ID of a reference

User Contributed Notes

There are no user contributed notes for this page.


Create a ReflectionReference from an array element

  • « ReflectionReference
  • ReflectionReference::getId »
  • PHP Manual
  • ReflectionReference
  • Create a ReflectionReference from an array element

ReflectionReference::fromArrayElement

(PHP 7 >= 7.4.0)

ReflectionReference::fromArrayElement — Create a ReflectionReference from an array element

Description

public static ReflectionReference::fromArrayElement ( array $array , int|string $key ) : ReflectionReference|null

Creates a ReflectionReference from an array element.

Liste de paramètres

array

The tableau which contains the potential reference.

key

The key; either an entier or a chaîne de caractères.

Valeurs de retour

Returns a ReflectionReference instance if $array[$key] is a reference, or null otherwise.

Erreurs / Exceptions

If array is not an tableau, or key is not an entier or chaîne de caractères, a TypeError is thrown. If $array[$key] does not exist, a ReflectionException is thrown.

User Contributed Notes

There are no user contributed notes for this page.


Get unique ID of a reference

  • « ReflectionReference::fromArrayElement
  • Reflector »
  • PHP Manual
  • ReflectionReference
  • Get unique ID of a reference

ReflectionReference::getId

(PHP 7 >= 7.4.0)

ReflectionReference::getId — Get unique ID of a reference

Description

public ReflectionReference::getId ( ) : string

Returns an ID which is unique for the reference for the lifetime of that reference. This ID can be used to compare references for equality, or to maintain a map of known references.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Returns a chaîne de caractères of unspecified format.

Exemples

Exemple #1 Basic ReflectionReference::getId() usage

<?php
$val1 = 'foo';
$val2 = 'bar';
$arr = [&$val1, &$val2, &$val1];

$rr1 = ReflectionReference::fromArrayElement($arr, 0);
$rr2 = ReflectionReference::fromArrayElement($arr, 1);
$rr3 = ReflectionReference::fromArrayElement($arr, 2);

var_dump($rr1->getId() === $rr2->getId());
var_dump($rr1->getId() === $rr3->getId());
?>

L'exemple ci-dessus va afficher :

bool(false)
bool(true)

User Contributed Notes

There are no user contributed notes for this page.


L'interface Reflector

(PHP 5, PHP 7)

Introduction

Reflector est une interface implémentée par toutes les classes exportables Reflection.

Synopsis de la classe

Reflector {
/* Méthodes */
public static export ( ) : string
public __toString ( ) : string
}

Sommaire

  • Reflector::export — Exporte
  • Reflector::__toString — Conversion en chaîne de caractères

User Contributed Notes

There are no user contributed notes for this page.


Exporte

  • « Reflector
  • Reflector::__toString »
  • PHP Manual
  • Reflector
  • Exporte

Reflector::export

(PHP 5, PHP 7)

Reflector::export — Exporte

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 7.4.0. Dépendre de cette fonction est fortement déconseillé.

Description

public static Reflector::export ( ) : string

Exporte.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Voir aussi

  • Reflection::__toString()

User Contributed Notes

There are no user contributed notes for this page.


Conversion en chaîne de caractères

  • « Reflector::export
  • ReflectionException »
  • PHP Manual
  • Reflector
  • Conversion en chaîne de caractères

Reflector::__toString

(PHP 5, PHP 7)

Reflector::__toString — Conversion en chaîne de caractères

Description

public Reflector::__toString ( ) : string

Conversion en chaîne de caractères.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Voir aussi

  • ReflectionProperty::export() - Exporte
  • __toString()

User Contributed Notes

There are no user contributed notes for this page.


La classe ReflectionException

(PHP 5, PHP 7)

Introduction

La classe ReflectionException.

Synopsis de la classe

ReflectionException extends Exception {
/* Propriétés */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* Méthodes héritées */
final public Exception::getMessage ( ) : string
final public Exception::getPrevious ( ) : Throwable
final public Exception::getCode ( ) : mixed
final public Exception::getFile ( ) : string
final public Exception::getLine ( ) : int
final public Exception::getTrace ( ) : array
final public Exception::getTraceAsString ( ) : string
public Exception::__toString ( ) : string
final private Exception::__clone ( ) : void
}

User Contributed Notes

temirkhan.nasukhov 18-Apr-2019 11:50
Note that this exception is unchecked even if it is not based on RuntimeException.  Such error must lead to direct fixes in code and not in catch-handle of situation.

Also keep in mind that IDE (mine is Phpstorm 2018.3.4) inspections will highlight it for that reason so do not create phpdoc with throws for any Runtime exceptions.

<?php

/**
 * This way is wrong
 *
 * @throws \ReflectionException
 */
function createReflection()
{
    return new \ReflectionClass('invalid argument');
}

/**
 * This way is fine(I don't mean the code of course)
 */
function createReflection()
{
    return new \ReflectionClass('invalid argument');
}


Gestion des variables

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Fonctions de gestion des variables
    • boolval — Récupère la valeur booléenne d'une variable
    • debug_zval_dump — Extrait une représentation sous forme de chaîne de la structure interne d'une zval pour affichage
    • doubleval — Alias de floatval
    • empty — Détermine si une variable est vide
    • floatval — Convertit une chaîne en nombre à virgule flottante
    • get_defined_vars — Liste toutes les variables définies
    • get_resource_id — Retourne un entier identifiant une ressource
    • get_resource_type — Retourne le type de ressource
    • gettype — Retourne le type de la variable
    • intval — Retourne la valeur numérique entière équivalente d'une variable
    • is_array — Détermine si une variable est un tableau
    • is_bool — Détermine si une variable est un booléen
    • is_callable — Détermine si l'argument peut être appelé comme fonction
    • is_countable — Vérifie si le contenu de la variable est une valeur dénombrable
    • is_double — Alias de is_float
    • is_float — Détermine si une variable est de type nombre décimal
    • is_int — Détermine si une variable est de type nombre entier
    • is_integer — Alias de is_int
    • is_iterable — Détermine si le contenu de la variable est itérable.
    • is_long — Alias de is_int
    • is_null — Indique si une variable vaut null
    • is_numeric — Détermine si une variable est un nombre ou une chaîne numérique
    • is_object — Détermine si une variable est de type objet
    • is_real — Alias de is_float
    • is_resource — Détermine si une variable est une ressource
    • is_scalar — Indique si une variable est un scalaire
    • is_string — Détermine si une variable est de type chaîne de caractères
    • isset — Détermine si une variable est déclarée et est différente de null
    • print_r — Affiche des informations lisibles pour une variable
    • serialize — Génère une représentation stockable d'une valeur
    • settype — Affecte un type à une variable
    • strval — Récupère la valeur d'une variable, au format chaîne
    • unserialize — Crée une variable PHP à partir d'une valeur linéarisée
    • unset — Détruit une variable
    • var_dump — Affiche les informations d'une variable
    • var_export — Retourne le code PHP utilisé pour générer une variable

User Contributed Notes

There are no user contributed notes for this page.


Introduction

Pour plus de détails sur le comportement des variables, reportez-vous à la section Variables du chapitre Référence du langage.

User Contributed Notes

There are no user contributed notes for this page.


Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration pour les variables
Nom | Défaut | Modifiable | Historique
unserialize_callback_func | null | PHP_INI_ALL |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.

Voici un éclaircissement sur l'utilisation des directives de configuration.

unserialize_callback_func string

La fonction de rappel spécifié est appelée lorsque la fonction unserialize() tente d'utiliser une classe non définie. Une alerte apparaît si la fonction de rappel n'est pas définie, ou si elle échoue lors de la définition de la classe manquante.

Voir aussi unserialize() et l'auto-chargement de classes.

User Contributed Notes

There are no user contributed notes for this page.


Fonctions de gestion des variables

Sommaire

  • boolval — Récupère la valeur booléenne d'une variable
  • debug_zval_dump — Extrait une représentation sous forme de chaîne de la structure interne d'une zval pour affichage
  • doubleval — Alias de floatval
  • empty — Détermine si une variable est vide
  • floatval — Convertit une chaîne en nombre à virgule flottante
  • get_defined_vars — Liste toutes les variables définies
  • get_resource_id — Retourne un entier identifiant une ressource
  • get_resource_type — Retourne le type de ressource
  • gettype — Retourne le type de la variable
  • intval — Retourne la valeur numérique entière équivalente d'une variable
  • is_array — Détermine si une variable est un tableau
  • is_bool — Détermine si une variable est un booléen
  • is_callable — Détermine si l'argument peut être appelé comme fonction
  • is_countable — Vérifie si le contenu de la variable est une valeur dénombrable
  • is_double — Alias de is_float
  • is_float — Détermine si une variable est de type nombre décimal
  • is_int — Détermine si une variable est de type nombre entier
  • is_integer — Alias de is_int
  • is_iterable — Détermine si le contenu de la variable est itérable.
  • is_long — Alias de is_int
  • is_null — Indique si une variable vaut null
  • is_numeric — Détermine si une variable est un nombre ou une chaîne numérique
  • is_object — Détermine si une variable est de type objet
  • is_real — Alias de is_float
  • is_resource — Détermine si une variable est une ressource
  • is_scalar — Indique si une variable est un scalaire
  • is_string — Détermine si une variable est de type chaîne de caractères
  • isset — Détermine si une variable est déclarée et est différente de null
  • print_r — Affiche des informations lisibles pour une variable
  • serialize — Génère une représentation stockable d'une valeur
  • settype — Affecte un type à une variable
  • strval — Récupère la valeur d'une variable, au format chaîne
  • unserialize — Crée une variable PHP à partir d'une valeur linéarisée
  • unset — Détruit une variable
  • var_dump — Affiche les informations d'une variable
  • var_export — Retourne le code PHP utilisé pour générer une variable

User Contributed Notes

aldemarcalazans@gmail 06-Oct-2019 08:57
I thought the PHP developers should include in this section, the operator "identity" ( see http://php.net/manual/en/language.operators.arithmetic.php).

From an arithmetic point of view, this operator is useless but, as a converter from string to number, it is great. It does not force the numerical string to have an integer or float type, instead, it automatically determines the adequate type, depending on the numerical quantity represented by the string.


Récupère la valeur booléenne d'une variable

  • « Fonctions de gestion des variables
  • debug_zval_dump »
  • PHP Manual
  • Fonctions de gestion des variables
  • Récupère la valeur booléenne d'une variable

boolval

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

boolval — Récupère la valeur booléenne d'une variable

Description

boolval ( mixed $value ) : bool

Retourne la valeur booléen de la variable fournie dans le paramètre value.

Liste de paramètres

value

La valeur scalaire qui sera convertie en booléen.

Valeurs de retour

La valeur booléen du paramètre value.

Exemples

Exemple #1 Exemple avec boolval()

<?php
echo '0:        '.(boolval(0) ? 'true' : 'false')."\n";
echo '42:       '.(boolval(42) ? 'true' : 'false')."\n";
echo '0.0:      '.(boolval(0.0) ? 'true' : 'false')."\n";
echo '4.2:      '.(boolval(4.2) ? 'true' : 'false')."\n";
echo '"":       '.(boolval("") ? 'true' : 'false')."\n";
echo '"string": '.(boolval("string") ? 'true' : 'false')."\n";
echo '"0":      '.(boolval("0") ? 'true' : 'false')."\n";
echo '"1":      '.(boolval("1") ? 'true' : 'false')."\n";
echo '[1, 2]:   '.(boolval([1, 2]) ? 'true' : 'false')."\n";
echo '[]:       '.(boolval([]) ? 'true' : 'false')."\n";
echo 'stdClass: '.(boolval(new stdClass) ? 'true' : 'false')."\n";
?>

L'exemple ci-dessus va afficher :

0:        false
42:       true
0.0:      false
4.2:      true
"":       false
"string": true
"0":      false
"1":      true
[1, 2]:   true
[]:       false
stdClass: true

Voir aussi

  • floatval() - Convertit une chaîne en nombre à virgule flottante
  • intval() - Retourne la valeur numérique entière équivalente d'une variable
  • strval() - Récupère la valeur d'une variable, au format chaîne
  • settype() - Affecte un type à une variable
  • is_bool() - Détermine si une variable est un booléen
  • Le transtypage

User Contributed Notes

uasenior at gmail dot com 28-Jan-2020 08:02
<?

// Some way to print boolean value as string

$b = true;

echo ['false', 'true'][$b];

?>
raphael.satyago 20-Jan-2015 09:20
function is_true($val, $return_null=false){
    $boolval = ( is_string($val) ? filter_var($val, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) : (bool) $val );
    return ( $boolval===null && !$return_null ? false : $boolval );
}

// Return Values:

is_true(new stdClass);      // true
is_true([1,2]);             // true
is_true([1]);               // true
is_true([0]);               // true
is_true(42);                // true
is_true(-42);               // true
is_true('true');            // true
is_true('on')               // true
is_true('off')              // false
is_true('yes')              // true
is_true('no')               // false
is_true('ja')               // false
is_true('nein')             // false
is_true('1');               // true
is_true(NULL);              // false
is_true(0);                 // false
is_true('false');           // false
is_true('string');          // false
is_true('0.0');             // false
is_true('4.2');             // false
is_true('0');               // false
is_true('');                // false
is_true([]);                // false
Matt M 09-Jan-2015 05:27
To anyone like me who came here looking for a way to turn any value into a 0/1 that will fit into a MySQL boolean (tinyint) field:

<?php
$tinyint = (int) filter_var($valToCheck, FILTER_VALIDATE_BOOLEAN);
?>

tinyint will be 0 (zero) for values like string "false", boolean false, int 0

tinyint will be 1 for values like string "true", boolean true, int 1

Useful if you are accepting data that might be from a language like Javascript that sends string "false" for a boolean false.
Babak Bandpey 13-May-2014 09:14
I believe that the double negation !! can perform the same task with the same result if your PHP is not up2date

var_dump(!!1, !!0, !!"test", !!"");

outputs:
boolean true

boolean false

boolean true

boolean false

May the life be good to you.
Anonymous 30-Dec-2013 05:12
A misspell in v2.0.
:-)

Hack v2.1

<?php

if( ! function_exists('boolval'))
{
    /**
     * Get the boolean value of a variable
     *
     * @param mixed The scalar value being converted to a boolean.
     * @return boolean The boolean value of var.
     */
    function boolval($var)
    {
        return !! $var;
    }
}

?>
info at lomalkin dot ru 15-Mar-2013 11:08
<?

// Hack for old php versions to use boolval()

if (!function_exists('boolval')) {
        function boolval($val) {
                return (bool) $val;
        }
}
?>


Extrait une représentation sous forme de chaîne de la structure interne d'une zval pour affichage

  • « boolval
  • doubleval »
  • PHP Manual
  • Fonctions de gestion des variables
  • Extrait une représentation sous forme de chaîne de la structure interne d'une zval pour affichage

debug_zval_dump

(PHP 4 >= 4.2.0, PHP 5, PHP 7)

debug_zval_dump — Extrait une représentation sous forme de chaîne de la structure interne d'une zval pour affichage

Description

debug_zval_dump ( mixed $value , mixed ...$values ) : void

Extrait une représentation sous forme de chaîne de caractère d'un structure interne d'une zval (Zend value) pour affichage. Ceci est généralement utile pour comprendre ou déboguer les détails d'implémentation du moteur Zend ou d'extensions PHP.

Liste de paramètres

value

La variable où valeur à extraire.

values

Variables ou valeurs supplémentaire à extraire.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec debug_zval_dump()

<?php
$var1 = 'Hello';
$var1 .= ' World';
$var2 = $var1;

debug_zval_dump($var1);
?>

L'exemple ci-dessus va afficher :

string(11) "Hello World" refcount(3)

Note: Comprendre le refcount

La valeur refcount affiché par cette fonction peut être surprenant sans une compréhension détaillé de l'implémentation du moteur.

Le moteur Zend utilise le comptage de référence pour deux raisons différentes :

  • Optimiser l'usage de mémoire en utilisant une technique appelé "copy on write", où plusieurs variables tenant la même valeur pointe à la même copie en mémoire. Quand une de ces variables est modifié, elle pointe à une nouvelle copie en mémoire, et le comptage de référence de l'originale est réduit de 1.
  • Le pistage des variables qui ont été assigné ou passé par référence (voir Références Expliquer). Ce refcount est stocker dans un zval de référence séparé, pointant à la zval pour la valeur actuelle. Cette zval additionnelle n'est actuellement pas montré par debug_zval_dump().

Car debug_zval_dump() prend son entrée comme un paramètre normal, passé par valeur, la technique de copy on write sera utilisé pour la passé: au lieu de copier les données, le refcount sera incrémenté de 1 pour la durée de vie de l'appel de la fonction. Si la fonction modifie le paramètre après l'avoir reçu, alors une copie sera fait ; comme elle n'en fait pas, elle affichera un refcount de 1 plus élevé que dans la portée d'appel.

Le passage de paramètre empêche aussi debug_zval_dump() de montrer les variables qui ont été assigné par référence. Pour illustrer ceci, considérons une version légèrement modifié de l'exemple ci-dessus : showing variables which have been assigned by reference. To illustrate, consider a slightly modified version of the above example:

<?php
$var1 = 'Hello';
$var1 .= ' World';
// Point three variables as references to the same value
$var2 =& $var1;
$var3 =& $var1;

debug_zval_dump($var1);
?>

L'exemple ci-dessus va afficher :

string(11) "Hello World" refcount(2)

Bien que $var1, $var2, et $var3 sont lié en tant que référence, seul la valeur est passé à debug_zval_dump(). Cette valeur est utilisé une seul fois par le jeu de références, et une fois à l'intérieur de debug_zval_dump(), ainsi il affiche un refcount de 2.

Des complications supplémentaire émergent à cause des optimisations effectué par le moteur pour différent types de données. Certains types tel que les entiers n'utilise pas "copy on write", et donc n'affiche aucun refcount. Dans d'autre cas, le refcount montre d'autres copies utilisé en interne, tel que quand une chaîne littérale ou tableau est stocké comme une partie d'une instruction de code

Voir aussi

  • var_dump() - Affiche les informations d'une variable
  • debug_backtrace() - Génère le contexte de débogage
  • Explication sur les références
  • » Explication sur les références (par Derick Rethans)

User Contributed Notes

Hayley Watson 09-Jul-2019 11:01
If you're finding the interpretation of refcount confusing, the Xdebug extension offers a function similar to this one, but because the variable name is passed as a string, xdebug_debug_zval() doesn't scribble on the refcount with its own references to the zval.


Alias de floatval

  • « debug_zval_dump
  • empty »
  • PHP Manual
  • Fonctions de gestion des variables
  • Alias de floatval

doubleval

(PHP 4, PHP 5, PHP 7, PHP 8)

doubleval — Alias de floatval()

Description

Cette fonction est un alias de : floatval().

User Contributed Notes

There are no user contributed notes for this page.


Détermine si une variable est vide

  • « doubleval
  • floatval »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détermine si une variable est vide

empty

(PHP 4, PHP 5, PHP 7, PHP 8)

empty — Détermine si une variable est vide

Description

empty ( mixed $var ) : bool

Détermine si une variable est considérée comme vide. Une variable est considérée comme vide si elle n'existe pas, ou si sa valeur équivaut à false. La fonction empty() ne génère pas d'alerte si la variable n'existe pas.

Liste de paramètres

var

Variable à vérifier.

Note:

Avant PHP 5.5, la fonction empty() ne supportait que les variables ; tout autre type retournait une erreur d'analyse. En d'autres termes, ce qui suit ne fonctionnait pas : empty(trim($name)). A la place, utilisez trim($name) == false.

Aucune alerte n'est générée si la variable n'existe pas. Cela signifie que empty() est strictement équivalent à !isset($var) || $var == false.

Valeurs de retour

Retourne false si var existe et est non-vide, une valeur différent de zéro, c.à.d. qu'elle est considéré "falsey", voir conversion en booléen. Sinon retourne true.

Exemples

Exemple #1 Une comparaison simple empty() / isset().

<?php
$var = 0;

// Evalué à vrai car $var est vide
if (empty($var)) {
  echo '$var vaut soit 0, vide, ou pas définie du tout';
}

// Evalué à vrai car $var est défini
if (isset($var)) {
  echo '$var est définie même si elle est vide';
}
?>

Exemple #2 empty() sur des positions dans une chaîne

PHP 5.4 modifie le comportement de la fonction empty() lors de l'utilisation de positions dans une chaîne.

<?php
$expected_array_got_string = 'somestring';
var_dump(empty($expected_array_got_string['some_key']));
var_dump(empty($expected_array_got_string[0]));
var_dump(empty($expected_array_got_string['0']));
var_dump(empty($expected_array_got_string[0.5]));
var_dump(empty($expected_array_got_string['0.5']));
var_dump(empty($expected_array_got_string['0 Mostel']));
?>

Résultat de l'exemple ci-dessus en PHP 5.3 :

bool(false)
bool(false)
bool(false)
bool(false)
bool(false)
bool(false)

Résultat de l'exemple ci-dessus en PHP 5.4 :

bool(true)
bool(false)
bool(false)
bool(false)
bool(true)
bool(true)

Notes

Note: Comme ceci est une structure du langage, et non pas une fonction, il n'est pas possible de l'appeler avec les fonctions variables.

Note:

Lors de l'utilisation de cette fonction sur des propriétés d'objet inaccessibles, la méthode magique __isset() sera appelée, si elle existe.

Voir aussi

  • isset() - Détermine si une variable est déclarée et est différente de null
  • __isset()
  • unset() - Détruit une variable
  • array_key_exists() - Vérifie si une clé existe dans un tableau
  • count() - Compte tous les éléments d'un tableau ou quelque chose d'un objet
  • strlen() - Calcule la taille d'une chaîne
  • Les tables de comparaison des types

User Contributed Notes

pm1625637 at gmail dot com 05-Dec-2019 02:11
Be careful about this  :

<?php
$del = '';
echo empty($del);
?>

Output : 1
markmanning at gmail dot com 23-Mar-2019 09:15
I normally count() an array, so I wanted to see how empty() would stack up.

<?php
    $test = array();
    $test2 = array();
    for ($x = 0; $x < 1000; $x++)  $test[] = $x;

    $ts = microtime(true);
    for ($x = 0; $x < 100000000; $x++)
    {
        if (count($test))
        {
        }
    }

    echo "Time taken:  " . (microtime(true) - $ts) . " sec\n";
?>

For 100,000,000 comparisons, here are the results against PHP 7.2.16 on my hardware:

count($test):  2.697 sec
count($test2):  2.596 sec
$test === array():  2.579 sec
$test2 === array():  2.552 sec
empty($test):  3.085 sec
empty($test2):  3.113 sec

In short, it doesn't matter what method is used although empty() is actually just ever so slightly slower despite it being a language construct.  YMMV.
fahimcseiiuc at gmail dot com 25-Feb-2019 10:02
<?php

    /*"" (an empty string)
      0 (0 as an integer)
      0.0 (0 as a float)
      "0" (0 as a string)
      NULL
      FALSE
      array() (an empty array)*/

$anEmptyString = "";
empty($anEmptyString);
if(empty($anEmptyString) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";         //line break

$anIntegerNumber = 0;
empty($anIntegerNumber);
if(empty($anIntegerNumber) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";         //line break

$aFloatNumber = 0.0;
empty($aFloatNumber);
if(empty($aFloatNumber) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";       //line break

$aZeroValuedString = "0";
empty($aZeroValuedString);
if(empty($aZeroValuedString) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";        //line break

$aNULL = NULL;
empty($aNULL);
if(empty($aNULL) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";        //line break

$aBooleanFALSE = FALSE;
empty($aBooleanFALSE);
if(empty($aBooleanFALSE) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";        //line break

$anEmptyArray = array();
empty($anEmptyArray);
if(empty($anEmptyArray) == TRUE){
    echo "TRUE";
} else{
    echo "FALSE";
}
echo "<hr>";       //line break

?>
GazetteSDF 21-Sep-2018 09:02
For the verification of a form, to "block" entries such as a simple space or other, I thought of this combination:

function isEmpty($string){
    $val = preg_replace('#[^A-Za-z0-9]+#', '', $string) ;
    $val = trim($string, '');
    return ($string=='') ;
}

This protects entries like: ' ' ,'  -  ', '. - +', ... On entries like name, profession, ... it's helpful
aditycse at gmail dot com 10-Nov-2017 03:58
<?php

/**
 * Used for checking empty objects/array
 * @uses How to check empty objects and array in php code
 * @author Aditya Mehrotra<aditycse@gmail.com>
 */

/**
 * Empty class
 */
class EmptyClass {

}

$obj = new stdClass();
//or any other class empty object
$emptyClassObj = new EmptyClass();
$array = array();

if (empty($array)) {
    echo 'array is empty'; //expected result
} else {
    echo 'array is not empty'; //unexpected result
}
echo "<br>";

if (empty($obj)) {
    echo 'object is empty'; //expected result
} else {
    echo 'object is not empty'; //unexpected result
}
echo "<br>";

if (empty($emptyClassObj)) {
    echo 'EmptyClass is empty'; //expected result
} else {
    echo 'EmptyClass is not empty'; //unexpected result
}
echo "<br>";

//Result SET 1
//array is empty      => expected result
//object is not empty => ouch what happened
//EmptyClass is not empty => ouch what happened

/**
 * So what we do for checking empty object
 * @solution use any known property or check property count
 * Or you can use below method
 * Count function will not return 0 in empty object
 */

//Below line print "Object count:1"
echo 'Object count:' . count($obj);

echo "<br>";

/**
 * This function is used to get object item counts
 * @function getCount
 * @access public
 * @param object|array $var
 * @return integer
 */
function getCount($var) {
    $count = 0;
    if (is_array($var) || is_object($var)) {
        foreach ($var as $value) {
            $count++;
        }
    }
    unset($value);
    return $count;
}

//Running code again with new logic
if (getCount($array) === 0) {
    echo 'array is empty'; //expected result
} else {
    echo 'array is not empty'; //unexpected result
}
echo "<br>";

if (getCount($obj) === 0) {
    echo 'object is empty'; //expected result
} else {
    echo 'object is not empty'; //unexpected result
}

echo "<br>";

if (getCount($emptyClassObj) === 0) {
    echo 'EmptyClass is empty'; //expected result
} else {
    echo 'EmptyClass is not empty'; //unexpected result
}

//Result SET 2
//array is empty    => expected result  ##everything is all right
//object is empty   => expected result  ##everything is all right
//EmptyClass is empty   => expected result  ##everything is all right
xzero at elite7hackers dot net 13-Jul-2017 11:36
Note that empty() will return false on null byte. Eg.

<?php
// Save to variable, so it works on older PHP versions
$null_byte = chr(0); // === \0

var_dump(
    empty(null),
    empty($null_byte)
);
/**
 * Results:
 *
 * bool(true)
 * bool(false)
 */
wranvaud at gmail dot com 02-Jul-2017 06:22
Note that if your variable only has an "end of line" (aka carriage return), PHP_EOL it is not considered as empty. Since end of lines are not always easy to spot this can be confusing.
Claudio Galdiolo 25-Mar-2017 12:20
Warning: an "empty" object is NOT considered to be empty
<?php
$var = new stdClass(); // "empty" object
var_dump(empty($var)); // bool(false)
?>

I don't know if there is a standard way to test for "empty" objects, I personally use array casting:
<?php
$var = new stdClass(); // "empty" object
$var = (array) $var; // cast to empty array
var_dump(empty($var)); // bool(true)
?>
mcfogw at gmail dot com 08-May-2016 02:40
I'm comparing behavior of `!` and `empty()`, find an undocumented behavior here.

just like cast-to-boolean, `empty()` cares about if SimpleXML object is made from emty tags.

`empty(simplexml_load_string('<root />'))` is TRUE

this behavior begins from php 5.1.0~7, in 5.0.x that's FALSE

proof here => https://3v4l.org/74Tc4
Javier Alfonso 11-Mar-2016 01:05
If you test an element of an array (like $_POST['key]), it test if the key doesn't exist or if it exist if its value is empty and never emit a warning.

For who don't want to test what happen if passed an array element here is my test and result.

<?php
$a = array();
$b = array('key');
$c = array('key' => false);
$d = array('key' => 'La verdad nos hace libres');

echo (empty($a['key'])?'A empty':'A not empty'), ' - ', (empty($b['key'])?'B empty':'B not empty'), ' - ', (empty($c['key'])?'C empty':'C not empty'), ' - ', (empty($d['key'])?'D empty':'D not empty');
?>

And the result is:

    A empty - B empty - C empty - D not empty
your dot brother dot t at hotmail dot com 25-Dec-2014 09:38
(experienced in PHP 5.6.3) The `empty()` can't evaluate `__get()` results explicitly, so the `empty()` statement bellow always renders true
<?php
class Juice extends Liquid{
   protected $apple;
   protected $orange;
   public function __get($name) {
      return $this->$name;
   }
   public function __construct($apple, $orange) {
      $this->apple = $apple;
      $this->orange = $orange;
   }
}

class Glass {
   protected $liquid;
   public function __get($name) {
      return $name == "liquid" ? $this->liquid : false;
   }
   public function __construct() {
      $this->juice = new Juice(3, 5);
   }
}

$glass = new Glass();
var_dump(empty($this->liquid->apple));

/**
 * The output is:
 * bool(true)
 */
?>

The correct way is to force the evaluation of `__get()` first, by using extra braces around implicit statements like this:
<?php
var_dump(empty(($this->liquid->apple)));

/**
 * The output is:
 * bool(false)
 */
?>

So if you are using packages that utilize object oriented designs and magic methods like `__get()`, it's a good practice to always use double braces for `empty()` calls.
chrisdmiddleton at gmail dot com 09-Sep-2014 08:37
If you want to use empty() to evaluate an expression (not a variable), and you don't have PHP 5.5+, you can do it by wrapping the call to empty in a function, like so:
<?php
function is_empty($var) {

    return empty($var);

}
?>
Then you can do something like
<?php
if(is_empty(NULL)) {
 /* ... */
}
?>
without issue, since the local variable $var is being tested rather than the expression in the function call itself.
Nanhe Kumar 31-Jan-2014 10:17
<?php
/**
* @author :  Nanhe Kumar <nanhe.kumar@gmail.com>
* List of all empty values
**/

$testCase = array(
    1 => '',
    2 => "",
    3 => null,
    4 => array(),
    5 => FALSE,
    6 => NULL,
    7=>'0',
    8=>0,

);

foreach ($testCase as $k => $v) {
    if (empty($v)) {
        echo "<br> $k=>$v is empty";
    }
}
/**
Output
1=> is empty
2=> is empty
3=> is empty
4=>Array is empty
5=> is empty
6=> is empty
7=>0 is empty
8=>0 is empty
**/
?>
martin dot aarhof at gmail dot com 15-Mar-2012 08:38
<?php
$str = '            ';
var_dump(empty($str)); // boolean false
?>

So remember to trim your strings first!

<?php
$str = '        ';
$str = trim($str);
var_dump(empty($str)); // boolean true
?>
qeremy 07-Mar-2012 03:33
Simple solution for: "Fatal error: Can't use function return value in write context in ..."

<?php
function _empty($val) { return empty($val); }
?>
chris dot wisefool at gmail dot com 09-Sep-2011 12:44
Note that checking the existence of a subkey of an array when that subkey does not exist but the parent does and is a string will return false for empty.

i.e.

<?php
$params = array('search'=>'1');
empty($params['search']['filter']); # returns false
?>

This is correct, per the documentation (http://php.net/manual/en/language.types.string.php); quite a bit down the page is the Warning: "Writing to an out of range offset pads the string with spaces. Non-integer types are converted to integer." ) I didn't receive a warning but perhaps that's correct too...depends on whether the string -> integer conversion is considered "illegal": "Illegal offset type emits E_NOTICE."

(i.e. since $params['search'] is a string, the 'filter' subscript is converted to 0, so the test becomes empty($params['search'][0]), which is obviously false), but it tripped me up enough to mistakenly file a bug report (which I've since closed).
steven at nevvix dot com 02-May-2011 09:16
When you need to accept these as valid, non-empty values:
- 0 (0 as an integer)
- 0.0 (0 as a float)
- "0" (0 as a string)

<?php
function is_blank($value) {
    return empty($value) && !is_numeric($value);
}
?>

This is similar to Rails' blank? method.
phpsort 21-Jan-2011 11:13
I'm summarising a few points on empty() with inaccessible properties, in the hope of saving others a bit of time. Using PHP 5.3.2.
<?php
class MyClass {
    private $foo = 'foo';
}
$myClass = new MyClass;
echo $myClass->foo;
?>
As expected, this gives "Fatal error: Cannot access private property MyClass::$foo".
But substitute the line
if (empty($myClass->foo)) echo 'foo is empty'; else echo 'foo is not empty';
and we get the misleading result "foo is empty".
There is NO ERROR OR WARNING, so this is a real gotcha. Your code will just go wrong silently, and I would say it amounts to a bug.
If you add two magic functions to the class:
public function __get($var) { return $this->$var; }
public function __isset($var) { return isset($this->$var); }
then we get the expected result. You need both functions.
For empty($myClass->foo), I believe PHP calls __isset, and if that is true returns the result of empty on the result of __get. (Some earlier posts wrongly suggest PHP just returns the negation of __isset).
BUT …
See the earlier post by php at lanar dot com. I confirm those results, and if you extend the test with isset($x->a->b->c) it appears that __isset is only called for the last property in the chain. Arguably another bug. empty() behaves in the same way. So things are not as clear as we might hope.
See also the note on empty() at
http://uk3.php.net/manual/en/language.oop5.overloading.php
Clear as mud!
e dot klerks at i-bytes dot nl 08-Nov-2010 06:16
To make an empty function, which only accepts arrays, one can use type-hinting:

<?php
// emptyArray :: [a] -> Bool

function emptyArray(array $xs){
 return empty($xs);
}
?>

Type hinting is a good thing to use in your code, because it makes it more easy to reason about your code. Besides that, it automatically documents the code.
rodolphe dot bodeau at free dot fr 25-Oct-2010 06:37
Be careful, if "0" (zero as a string), 0 (zero as an integer) and -0 (minus zero as an integer) return true, "-0" (minus zero as a string (yes, I already had some customers that wrote -0 into a form field)) returns false. You need to cast your variable before testing it with the empty() function :

<?php
$var = "-0";
echo empty($var);  // returns false
$var = (int) $var; // casts $var as an integer
echo empty($vat);  // returns true
?>
ehsmeng 21-Sep-2010 05:25
I can't use empty() in all situations because '0' is usually not considered empty to me. I did a quick benchmark over the most common ways of testing it. '' == var suffers from '' == 0 is true so that's just there for curiosity.

<?php
    $microtimeref = microtime(true);
    $a = 0;
    $b = 'asd';
    for ($i = 0; $i < 5000000; $i++)
    {
        if (0 == mb_strlen ($b))
        {
            $a++;
        }
    }
    echo "Total time 0 == mb_strlen(var): <b>" . round(microtime(true) - $microtimeref,3) . 's</b><br />';
?>

The results:

Total time 0 == mb_strlen(var): 3.141s
Total time 0 === strlen(var): 2.904s
Total time 0 == strlen(var): 2.878s
Total time '' == var: 1.774s
Total time '' === var: 1.706s
Total time empty(var): 1.496s

Thus '' === var will be my zero length string test.
marko dot crni at gmail dot com 16-Sep-2010 11:06
Calling non existing object property, empty($object->prop), will trigger __isset(), the same way as isset($object->prop) does, but there is one difference. If __isset() returns TRUE, another call to __get() will be made and actual return value will be result of empty() and result of __get().
aidan1103 at yahoo dot com 26-Mar-2010 10:11
empty() should not necessarily return the negation of the __isset() magic function result, if you set a data member to 0, isset() should return true and empty should also return true.  A simpler implementation of the __isset magic function would be:

public function __isset($key) {
  return isset($this->{$key});
}

I don't understand why this isn't included in stdClass and inherited by default.
Janci 24-Aug-2009 08:57
Please note that results of empty() when called on non-existing / non-public variables of a class are a bit confusing if using magic method __get (as previously mentioned by nahpeps at gmx dot de). Consider this example:

<?php
class Registry
{
    protected $_items = array();
    public function __set($key, $value)
    {
        $this->_items[$key] = $value;
    }
    public function __get($key)
    {
        if (isset($this->_items[$key])) {
            return $this->_items[$key];
        } else {
            return null;
        }
    }
}

$registry = new Registry();
$registry->empty = '';
$registry->notEmpty = 'not empty';

var_dump(empty($registry->notExisting)); // true, so far so good
var_dump(empty($registry->empty)); // true, so far so good
var_dump(empty($registry->notEmpty)); // true, .. say what?
$tmp = $registry->notEmpty;
var_dump(empty($tmp)); // false as expected
?>

The result for empty($registry->notEmpty) is a bit unexpeced as the value is obviously set and non-empty. This is due to the fact that the empty() function uses __isset() magic functin in these cases. Although it's noted in the documentation above, I think it's worth mentioning in more detail as the behaviour is not straightforward. In order to achieve desired (expexted?) results, you need to add  __isset() magic function to your class:

<?php
class Registry
{
    protected $_items = array();
    public function __set($key, $value)
    {
        $this->_items[$key] = $value;
    }
    public function __get($key)
    {
        if (isset($this->_items[$key])) {
            return $this->_items[$key];
        } else {
            return null;
        }
    }
    public function __isset($key)
    {
        if (isset($this->_items[$key])) {
            return (false === empty($this->_items[$key]));
        } else {
            return null;
        }
    }
}

$registry = new Registry();
$registry->empty = '';
$registry->notEmpty = 'not empty';

var_dump(empty($registry->notExisting)); // true, so far so good
var_dump(empty($registry->empty)); // true, so far so good
var_dump(empty($registry->notEmpty)); // false, finally!
?>

It actually seems that empty() is returning negation of the __isset() magic function result, hence the negation of the empty() result in the __isset() function above.
denobasis-bozic et yahoo.com 18-Jul-2009 04:54
test if all multiarray's are empty

<?php
function is_multiArrayEmpty($multiarray) {
    if(is_array($multiarray) and !empty($multiarray)){
        $tmp = array_shift($multiarray);
            if(!is_multiArrayEmpty($multiarray) or !is_multiArrayEmpty($tmp)){
                return false;
            }
            return true;
    }
    if(empty($multiarray)){
        return true;
    }
    return false;
}

$testCase = array (
0 => '',
1 => "",
2 => null,
3 => array(),
4 => array(array()),
5 => array(array(array(array(array())))),
6 => array(array(), array(), array(), array(), array()),
7 => array(array(array(), array()), array(array(array(array(array(array(), array())))))),
8 => array(null),
9 => 'not empty',
10 => "not empty",
11 => array(array("not empty")),
12 => array(array(),array("not empty"),array(array()))
);

foreach ($testCase as $key => $case ) {
    echo "$key is_multiArrayEmpty= ".is_multiArrayEmpty($case)."<br>";
}
?>

OUTPUT:
========

0 is_multiArrayEmpty= 1
1 is_multiArrayEmpty= 1
2 is_multiArrayEmpty= 1
3 is_multiArrayEmpty= 1
4 is_multiArrayEmpty= 1
5 is_multiArrayEmpty= 1
6 is_multiArrayEmpty= 1
7 is_multiArrayEmpty= 1
8 is_multiArrayEmpty= 1
9 is_multiArrayEmpty=
10 is_multiArrayEmpty=
11 is_multiArrayEmpty=
12 is_multiArrayEmpty=
mlibazisi mabandla 28-May-2009 02:47
in cases when "0" is not intended to be empty, here is a simple function to safely test for an empty string (or mixed variable):

<?php
function _empty($string){
     $string = trim($string);
     if(!is_numeric($string)) return empty($string);
     return FALSE;
}
?>
thomas at thomasnoest dot nl 28-Nov-2008 01:54
Note on the selfmade empty function below:

function_exists() returns false on language constructs and empty is a language construct.
Anonymous 20-Aug-2008 02:41
To add on to what anon said, what's happening in john_jian's example seems unusual because we don't see the implicit typecasting going on behind the scenes.  What's really happening is:

$a = '';
$b = 0;
$c = '0';

(int)$a == $b -> true, because any string that's not a number gets converted to 0
$b==(int)$c -> true, because the int in the string gets converted
and
$a==$c -> false, because they're being compared as strings, rather than integers.  (int)$a==(int)$c should return true, however.

Note: I don't remember if PHP even *has* typecasting, much less if this is the correct syntax.  I'm just using something for the sake of examples.
tom at tomwardrop dot com 22-May-2008 05:01
In reply to "admin at ninthcircuit dot info",

Using str_replace is unnecessary. I would encourage the use of trim which would most likely be faster (haven't tested) and easier. Trim also takes care of other white space like line breaks and tabs. Actually, in most of the applications I code, I use a multi-dimensional array map function with trim on the Super Globals such as $_POST, $_GET and $_COOKIE as so far, there hasn't been an instance where I would want any user input to begin or end with whitespace. The good thing about doing this is that you never have to worry about 'trimming' your input which makes your code easier and more reliable (incase you forget to trim some input).
Greg Hartwig 02-May-2008 02:55
David from CodeXplorer:
>> The ONLY reason to use empty() is for code readability. It is the same as an IF/ELSE check.
>> So, don't bother using EMPTY in the real world.

This is NOT true.  empty() will not generate warnings if you're testing against an undefined variable as a simple boolean check will.  On production systems, warnings are usually shut off, but they are often active on development systems.

You could test a flag with
   <?php if ($flagvar)  ... ?>
but this can generate a warning if $flagvar is not set.

Instead of
   <?php if (isset($flagvar) && $flagvar)  ... ?>
you can simply use
   <?php if (!empty($flagvar))  ... ?>

for easy readability without warnings.
EllisGL 04-Oct-2007 02:48
Here's what I do for the zero issue issue:
if($val == '' && $val !== 0 && $val !== '0')
rkulla2 at gmail dot com 05-Sep-2007 03:57
Since I didn't like how empty() considers 0 and "0" to be empty (which can easily lead to bugs in your code), and since it doesn't deal with whitespace, i created the following function:

<?php
function check_not_empty($s, $include_whitespace = false)
{
    if ($include_whitespace) {
        // make it so strings containing white space are treated as empty too
        $s = trim($s);
    }
    return (isset($s) && strlen($s)); // var is set and not an empty string ''
}
?>

Instead of saying if (!empty($var)) { // it's not empty } you can just say if (check_not_empty($var)) { // it's not empty }.

If you want strings that only contain whitespace (such as tabs or spaces) to be treated as empty then do: check_not_empty($var, 1)

If you want to check if a string IS empty then do: !check_not_empty($var).

So, whenever you want to check if a form field both exists and contains a value just do: if (check_not_empty($_POST['foo'], 1))

no need to do if (isset() && !empty()) anymore =]
jmarbas at hotmail dot com 01-Jul-2005 09:10
empty($var) will return TRUE if $var is empty (according to the definition of 'empty' above) AND if $var is not set.

I know that the statement in the "Return Values" section of the manual already says this in reverse:

"Returns FALSE if var has a non-empty and non-zero value."

but I was like "Why is this thing returning TRUE for unset variables???"... oh i see now... Its supposed to return TRUE for unset variables!!!

<?php
  ini_set('error_reporting',E_ALL);
  ini_set('display_errors','1');
  empty($var);
?>
paul at worldwithoutwalls dot co dot uk 22-May-2004 10:09
Note the exceptions when it comes to decimal numbers:

<?php
$a = 0.00;
$b = '0.00';
echo (empty($a)? "empty": "not empty"); //result empty
echo (empty($b)? "empty": "not empty"); //result not empty
//BUT...
$c = intval($b);
echo (empty($c)? "empty": "not empty"); //result empty
?>

For those of you using MySQL, if you have a table with a column of decimal type, when you do a SELECT, your data will be returned as a string, so you'll need to do apply intval() before testing for empty.

e.g.
TABLE t has columns id MEDIUMINT and d DECIMAL(4,2)
and contains 1 row where id=1, d=0.00
<?php
$q = "SELECT * FROM t";
$res = mysql_query($q);
$row = mysql_fetch_assoc($res);
echo (empty($row['d'])? "empty": "not empty"); //result not empty
?>


Convertit une chaîne en nombre à virgule flottante

  • « empty
  • get_defined_vars »
  • PHP Manual
  • Fonctions de gestion des variables
  • Convertit une chaîne en nombre à virgule flottante

floatval

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

floatval — Convertit une chaîne en nombre à virgule flottante

Description

floatval ( mixed $value ) : float

floatval() retourne la valeur de type float (nombre à virgule flottante), extraite à partir du paramètre value.

Liste de paramètres

value

Peut être de n'importe quel type scalaire. floatval() ne doit pas être utilisé sur les objets ; si tel est le cas, une alerte de niveau E_NOTICE sera émise et la fonction retournera 1.

Valeurs de retour

La valeur flottante de la variable donnée. Un tableau vide retourne 0, alors qu'un tableau non-vide retourne 1.

Les chaînes de caractères retourneront la plupart du temps 0, mais cela dépend du caractère le plus à gauche de la chaîne. Les règles classiques de transtypage d'un nombre à virgule flottante sont appliquées.

Exemples

Exemple #1 Exemple avec floatval()

<?php
$var = '122.34343The';
$float_value_of_var = floatval($var);
echo $float_value_of_var; // 122.34343
?>

Exemple #2 Exemple avec floatval() avec des caractères à gauche non numériques

<?php
$var = 'The122.34343';
$float_value_of_var = floatval($var);
echo $float_value_of_var; // 0
?>

Voir aussi

  • boolval() - Récupère la valeur booléenne d'une variable
  • intval() - Retourne la valeur numérique entière équivalente d'une variable
  • strval() - Récupère la valeur d'une variable, au format chaîne
  • settype() - Affecte un type à une variable
  • Transtypage

User Contributed Notes

iliyazelenkog at gmail dot com 02-Nov-2018 10:51
(float) would be more performant here (up to 6x times faster).

intval, floatval, doubleval, strva for PHP4 functions (intval, floatval, doubleval, strval), in PHP5 use type casting construction (i.e. '(type) parameter').
radler63 at hotmail dot com 16-Feb-2018 12:27
I get the following disturbing results:
var_dump string(10) "?0.01333"
echo the string=?0.01333
echo (float)string=0
echo floatval(string)=0

The string is an outcome of array_map('str_getcsv', file(...
I can't find the characters 8-10

thanks
T-Soloveychik at ya.ru 03-Mar-2017 02:23
Float value less than 0.0001 (0.0000999999999999995) will be converted by floatval to scientific notation (exponential notation):
<?php

var_dump(floatval(0.0000999999999999995)); # >> float(0,0001)

var_dump(floatval("0.000099")); # >> float(9.9E-5)

var_dump((string)floatval(0.000099)); # >> string(6) "9.9E-5"
pierpaolocira 15-Nov-2016 11:41
Be aware the last tofloat($num).

In theory it is very useful to have a function "separator-agnostic" (I think "locale based" solutions are useless if you have to parse a user file that can have a locale different to the server).

But this can lead to misinterpretations; in short: "123,456" is "123.456" (so comma used as decimal separator) or "123456" (comma used as thousand separator).

In any case, if you really want to use it, please don't forget that this function doesn't manage negative numbers.
movila dot e dot v at gmail dot com 05-Jul-2016 08:05
<?php
       $price = '1.299,00 EUR';
    //$price = 'EUR 1.299,00';
    //$price = '$1,745.09';
    //$price = '$14';
    //$price = '$.14';

    function floatValue($str){
        if(preg_match("/([0-9\.,-]+)/", $str, $match)){
            $value = $match[0];
            if( preg_match("/(\.\d{1,2})$/", $value, $dot_delim) ){
                $value = (float)str_replace(',', '', $value);
            }
            else if( preg_match("/(,\d{1,2})$/", $value, $comma_delim) ){
                $value = str_replace('.', '', $value);
                $value = (float)str_replace(',', '.', $value);
            }
            else
                $value = (int)$value;
        }
        else {
            $value = 0;
        }
        return $value;
    }

    echo floatValue($price);
/*
    1.299,00
    1.299,00
    1,745.09
    14
    0.14
*/
?>
Alexey M 23-Mar-2016 02:28
There is much easier way to deal with formatted numbers:

<?php
$str = '13,232.95';
$var = (double)filter_var($str, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
var_dump($var);
?>
double(13232.95)
zfcb13 at gmail dot com 24-Oct-2015 10:18
More elegant function with selection of decimal point (deafault ,):
<?php
function floatvaldec($v, $dec=',') { return floatval(ereg_replace("," , "." , ereg_replace("[^-0-9$dec]","",$v))); }

// examples:
echo '<br>'.floatvaldec('somthing123.456.789,12Euro') ;
echo '<br>'.floatvaldec('x123,456 789.12 Euro', '.') ;
echo '<br>'.floatvaldec('123.456 789,12$') ;
?>
brewal dot renault at gmail dot com 26-Feb-2014 09:25
This function takes the last comma or dot (if any) to make a clean float, ignoring thousand separator, currency or any other letter :

function tofloat($num) {
    $dotPos = strrpos($num, '.');
    $commaPos = strrpos($num, ',');
    $sep = (($dotPos > $commaPos) && $dotPos) ? $dotPos :
        ((($commaPos > $dotPos) && $commaPos) ? $commaPos : false);

    if (!$sep) {
        return floatval(preg_replace("/[^0-9]/", "", $num));
    }

    return floatval(
        preg_replace("/[^0-9]/", "", substr($num, 0, $sep)) . '.' .
        preg_replace("/[^0-9]/", "", substr($num, $sep+1, strlen($num)))
    );
}

$num = '1.999,369€';
var_dump(tofloat($num)); // float(1999.369)
$otherNum = '126,564,789.33 m²';
var_dump(tofloat($otherNum)); // float(126564789.33)

Demo : http://codepad.org/NW4e9hQH
PapaPinguoin 31-Oct-2011 07:26
To view the very large and very small numbers (eg from a database DECIMAL), without displaying scientific notation, or leading zeros.

FR : Pour afficher les très grand et très petits nombres (ex. depuis une base de données DECIMAL), sans afficher la notation scientifique, ni les zéros non significatifs.

<?php
function floattostr( $val )
{
    preg_match( "#^([\+\-]|)([0-9]*)(\.([0-9]*?)|)(0*)$#", trim($val), $o );
    return $o[1].sprintf('%d',$o[2]).($o[3]!='.'?$o[3]:'');
}
?>

<?php
echo floattostr("0000000000000001");
echo floattostr("1.00000000000000");
echo floattostr("0.00000000001000");
echo floattostr("0000.00010000000");
echo floattostr("000000010000000000.00000000000010000000000");
echo floattostr("-0000000000000.1");
echo floattostr("-00000001.100000");

// result
// 1
// 1
// 0.00000000001
// 0.0001
// 10000000000.0000000000001
// -0.1
// -1.1

?>
secretr at NOSPAM dot e107 dot org 03-Jan-2011 08:37
setlocale() and floatval() duo could break your DB queries in a very simple way:

<?php
setlocale(LC_ALL, 'bg_BG', 'bgr_BGR');
echo floatval(0.15); // output 0,15
?>

You would need simple workaround like:

<?php
function number2db($value)
{
    $larr = localeconv();
    $search = array(
        $larr['decimal_point'],
        $larr['mon_decimal_point'],
        $larr['thousands_sep'],
        $larr['mon_thousands_sep'],
        $larr['currency_symbol'],
        $larr['int_curr_symbol']
    );
    $replace = array('.', '.', '', '', '', '');

    return str_replace($search, $replace, $value);
}

setlocale(LC_ALL, 'bg_BG', 'bgr_BGR');
$testVal = floatval(0.15); // result 0,15
var_dump($testVal, number2db($testVal));

// Result:
// float(0,15)
// string(4) "0.15"
?>
chris at georgakopoulos dot com 29-Jul-2009 08:12
locale aware floatval:

<?php
function ParseFloat($floatString){
    $LocaleInfo = localeconv();
    $floatString = str_replace($LocaleInfo["mon_thousands_sep"] , "", $floatString);
    $floatString = str_replace($LocaleInfo["mon_decimal_point"] , ".", $floatString);
    return floatval($floatString);
}
?>
ted devito 09-Mar-2009 09:10
i noticed all (well, unless i missed something) the functions working with decimals destroy trailing decimal places. this function restores them in case you want to be able to display a consistent precision for users.

<?php
function decimal($val, $precision = 0) {
    if ((float) $val) :
        $val = round((float) $val, (int) $precision);
        list($a, $b) = explode('.', $val);
        if (strlen($b) < $precision) $b = str_pad($b, $precision, '0', STR_PAD_RIGHT);
        return $precision ? "$a.$b" : $a;
    else : // do whatever you want with values that do not have a float
        return $val;
    endif;
}
?>
info at marc-gutt dot de 26-Aug-2008 03:55
<?php
function floatvalue($value) {
     return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,2}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}
?>

It is much shorter and able to handle those one, too:
xx,-
xx,--
xx'xxx,xx

After using floatvalue() you can go forward with number_format() as usual.
Michiel 30-Jul-2008 05:21
The last getFloat() function is not completely correct.

1.000.000 and 1,000,000 and its negative variants are not correctly parsed. For the sake of comparing and to make myself clear I use the name parseFloat in stead of getFloat for the new function:

<?php
function parseFloat($ptString) {
            if (strlen($ptString) == 0) {
                    return false;
            }

            $pString = str_replace(" ", "", $ptString);

            if (substr_count($pString, ",") > 1)
                $pString = str_replace(",", "", $pString);

            if (substr_count($pString, ".") > 1)
                $pString = str_replace(".", "", $pString);

            $pregResult = array();

            $commaset = strpos($pString,',');
            if ($commaset === false) {$commaset = -1;}

            $pointset = strpos($pString,'.');
            if ($pointset === false) {$pointset = -1;}

            $pregResultA = array();
            $pregResultB = array();

            if ($pointset < $commaset) {
                preg_match('#(([-]?[0-9]+(\.[0-9])?)+(,[0-9]+)?)#', $pString, $pregResultA);
            }
            preg_match('#(([-]?[0-9]+(,[0-9])?)+(\.[0-9]+)?)#', $pString, $pregResultB);
            if ((isset($pregResultA[0]) && (!isset($pregResultB[0])
                    || strstr($preResultA[0],$pregResultB[0]) == 0
                    || !$pointset))) {
                $numberString = $pregResultA[0];
                $numberString = str_replace('.','',$numberString);
                $numberString = str_replace(',','.',$numberString);
            }
            elseif (isset($pregResultB[0]) && (!isset($pregResultA[0])
                    || strstr($pregResultB[0],$preResultA[0]) == 0
                    || !$commaset)) {
                $numberString = $pregResultB[0];
                $numberString = str_replace(',','',$numberString);
            }
            else {
                return false;
            }
            $result = (float)$numberString;
            return $result;
}
?>

Comparing of float parsing functions with the following function:

<?php
function testFloatParsing() {
    $floatvals = array(
        "22 000,76",
        "22.000,76",
        "22,000.76",
        "22 000",
        "22,000",
        "22.000",
        "22000.76",
        "22000,76",
        "1.022.000,76",
        "1,022,000.76",
        "1,000,000",
        "1.000.000",
        "1022000.76",
        "1022000,76",
        "1022000",
        "0.76",
        "0,76",
        "0.00",
        "0,00",
        "1.00",
        "1,00",
        "-22 000,76",
        "-22.000,76",
        "-22,000.76",
        "-22 000",
        "-22,000",
        "-22.000",
        "-22000.76",
        "-22000,76",
        "-1.022.000,76",
        "-1,022,000.76",
        "-1,000,000",
        "-1.000.000",
        "-1022000.76",
        "-1022000,76",
        "-1022000",
        "-0.76",
        "-0,76",
        "-0.00",
        "-0,00",
        "-1.00",
        "-1,00"
    );

    echo "<table>
        <tr>
            <th>String</th>
            <th>floatval()</th>
            <th>getFloat()</th>
            <th>parseFloat()</th>
        </tr>";

    foreach ($floatvals as $fval) {
        echo "<tr>";
        echo "<td>" . (string) $fval . "</td>";

        echo "<td>" . (float) floatval($fval) . "</td>";
        echo "<td>" . (float) getFloat($fval) . "</td>";
        echo "<td>" . (float) parseFloat($fval) . "</td>";
        echo "</tr>";
    }
    echo "</table>";
}
?>
steve at opilo dot net 20-Jul-2008 06:07
Most of the functions listed here that deal with $ and , are unnecessarily complicated. You can use ereg_replace() to strip out ALL of the characters that will cause floatval to fail in one simple line of code:

<?php $output = floatval(ereg_replace("[^-0-9\.]","",$input)); ?>
leprau at leprau dot de 19-Jul-2007 09:26
For those of you, who are looking for a function that rips the first,
but longest possible float (or at least integer) from a string,
like 123.45 from the string "Price: 123,45$"

If no useable value is found, the function returns false.

Checks for both comma and dot as decimal-separator,
but does not check for 3 digits between thousands,
so 1,234.5 is as valid as 1,23,4.5 (both will return 1234.5)

12,.3 will return 12
1,000,000 will return 1000.0 !

(if thousands separator is defined,
decimals should be defined too ...
in fact I was too lazy to check for that too)

Here you go, and feel free to optimize the function ;)
<?php
function getFloat($pString) {
    if (strlen($pString) == 0) {
            return false;
    }
    $pregResult = array();

    $commaset = strpos($pString,',');
    if ($commaset === false) {$commaset = -1;}

    $pointset = strpos($pString,'.');
    if ($pointset === false) {$pointset = -1;}

    $pregResultA = array();
    $pregResultB = array();

    if ($pointset < $commaset) {
        preg_match('#(([-]?[0-9]+(\.[0-9])?)+(,[0-9]+)?)#', $pString, $pregResultA);
    }
    preg_match('#(([-]?[0-9]+(,[0-9])?)+(\.[0-9]+)?)#', $pString, $pregResultB);
    if ((isset($pregResultA[0]) && (!isset($pregResultB[0])
            || strstr($preResultA[0],$pregResultB[0]) == 0
            || !$pointset))) {
        $numberString = $pregResultA[0];
        $numberString = str_replace('.','',$numberString);
        $numberString = str_replace(',','.',$numberString);
    }
    elseif (isset($pregResultB[0]) && (!isset($pregResultA[0])
            || strstr($pregResultB[0],$preResultA[0]) == 0
            || !$commaset)) {
        $numberString = $pregResultB[0];
        $numberString = str_replace(',','',$numberString);
    }
    else {
        return false;
    }
    $result = (float)$numberString;
    return $result;
}
?>
aa at geb-team dot de 04-Sep-2006 08:03
@pillepop2003 at yahoo dot de

<?php
float('-100.00', array('single_dot_as_decimal' => true)); // whoops, returns -10000
?>

use: "/^[0-9-]*[\.]{1}[0-9-]+$/"
instead of: "/^[0-9]*[\.]{1}[0-9-]+$/"
19-Apr-2005 05:30
you can also use typecasting instead of functions:

(float) $value;
pillepop2003 at yahoo dot de 14-Dec-2004 02:38
Use this snippet to extract any float out of a string. You can choose how a single dot is treated with the (bool) 'single_dot_as_decimal' directive.
This function should be able to cover almost all floats that appear in an european environment.

<?php

    function float($str, $set=FALSE)
    {
        if(preg_match("/([0-9\.,-]+)/", $str, $match))
        {
            // Found number in $str, so set $str that number
            $str = $match[0];

            if(strstr($str, ','))
            {
                // A comma exists, that makes it easy, cos we assume it separates the decimal part.
                $str = str_replace('.', '', $str);    // Erase thousand seps
                $str = str_replace(',', '.', $str);    // Convert , to . for floatval command

                return floatval($str);
            }
            else
            {
                // No comma exists, so we have to decide, how a single dot shall be treated
                if(preg_match("/^[0-9]*[\.]{1}[0-9-]+$/", $str) == TRUE && $set['single_dot_as_decimal'] == TRUE)
                {
                    // Treat single dot as decimal separator
                    return floatval($str);

                }
                else
                {
                    // Else, treat all dots as thousand seps
                    $str = str_replace('.', '', $str);    // Erase thousand seps
                    return floatval($str);
                }
            }
        }

        else
        {
            // No number found, return zero
            return 0;
        }
    }

// Examples

echo float('foo 123,00 bar'); // returns 123.00
echo float('foo 123.00 bar' array('single_dot_as_decimal'=> TRUE)); //returns 123.000
echo float('foo 123.00 bar' array('single_dot_as_decimal'=> FALSE)); //returns 123000
echo float('foo 222.123.00 bar' array('single_dot_as_decimal'=> TRUE)); //returns 222123000
echo float('foo 222.123.00 bar' array('single_dot_as_decimal'=> FALSE)); //returns 222123000

// The decimal part can also consist of '-'
echo float('foo 123,-- bar'); // returns 123.00

?>

Big Up.
Philipp
anonymous at start dot be 15-Jun-2004 07:00
Easier-to-grasp-function for the ',' problem.

<?php
function Getfloat($str) {
  if(strstr($str, ",")) {
    $str = str_replace(".", "", $str); // replace dots (thousand seps) with blancs
    $str = str_replace(",", ".", $str); // replace ',' with '.'
  }

  if(preg_match("#([0-9\.]+)#", $str, $match)) { // search for number that may contain '.'
    return floatval($match[0]);
  } else {
    return floatval($str); // take some last chances with floatval
  }
}

echo Getfloat("$ 19.332,35-"); // will print: 19332.35
?>
vickers at hotpop dot com 26-Jan-2004 03:45
floatval() does not work with "$35,234.43", as it could not handle the '$' and the ','.  The following takes care of all values, such that only numeric and the decimal sign are input into floatval().  (It probably shows I'm an old 'c' guy)...this function only lightly tested.

<?php
function strtflt($str) {
    $il = strlen($str);
    $flt = "";
    $cstr = "";

    for($i=0;$i<$il;$i++) {
        $cstr = substr($str, $i, 1);
        if(is_numeric($cstr) || $cstr == ".")
            $flt = $flt.$cstr;
    }
    return floatval($flt);
}
?>

Richard Vickers
vickers@hotpop.com
Zipi 25-Apr-2003 02:51
This function converts a string to a float no matter is the decimal separator dot (.) or comma (,). It also converts integers correctly. It takes the digits from the beginning of the string and ignores all other characters.

<?php
function floatval($strValue) {
   $floatValue = ereg_replace("(^[0-9]*)(\\.|,)([0-9]*)(.*)", "\\1.\\3", $strValue);
   if (!is_numeric($floatValue)) $floatValue = ereg_replace("(^[0-9]*)(.*)", "\\1", $strValue);
   if (!is_numeric($floatValue)) $floatValue = 0;
   return $floatValue;
  }
?>

-Zipi (Finland)
jason at shadonet dot com 07-Mar-2003 07:07
Instead of using floatval which only appeared in PHP 4.2 you could juse use $variable = (float)$variable

This function doesn't seem to add any functionality that wasn't already there.


Liste toutes les variables définies

  • « floatval
  • get_resource_id »
  • PHP Manual
  • Fonctions de gestion des variables
  • Liste toutes les variables définies

get_defined_vars

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

get_defined_vars — Liste toutes les variables définies

Description

get_defined_vars ( ) : array

get_defined_vars() retourne un tableau multidimensionnel contenant la liste de toutes les variables définies, qu'elles soient des variables d'environnement, de serveur ou définies par l'utilisateur dans la portée d'appel de la fonction get_defined_vars().

Valeurs de retour

Un tableau multidimensionnel contenant toutes les variables.

Exemples

Exemple #1 Exemple avec get_defined_vars()

<?php
$b = array(1, 1, 2, 3, 5, 8);

$arr = get_defined_vars();

// Affiche $b
print_r($arr["b"]);

/* Affiche le chemin vers l'interpréteur PHP (Si utilisé en tant que CGI)
 * e.g. /usr/local/bin/php */
echo $arr["_"];

// Affiche les paramètres de la ligne de commande s'il y en a
print_r($arr["argv"]);

// Affiche toutes les variables serveur
print_r($arr["_SERVER"]);

// Affiche toutes les clés disponibles du tableau de variables
print_r(array_keys(get_defined_vars()));
?>

Voir aussi

  • isset() - Détermine si une variable est déclarée et est différente de null
  • get_defined_functions() - Liste toutes les fonctions définies
  • get_defined_constants() - Retourne la liste des constantes et leurs valeurs

User Contributed Notes

antonfedonyuk at gmail dot com 05-Feb-2021 09:29
NOTE: when you call code by eval() PHP append self vars to result, they have "__" prefix ("__source_code" and "__bootstrap_file" in PHP 7.3).

Fix:
<?php
function filter_eval_vars(array $vars): array
{
    foreach ($vars as $key => $value) {
         if ($key[0] === '_' && $key[1] === '_') {
              unset($vars[$key]);
         }
    }
    return $vars;
}

?>
npelov at croler dot net 02-Feb-2021 12:35
get_defined_vars() returns all variables - locally defined vars and global vars (well actually only super globals). If you need local vars only  - for example you need to get variables from a file - let's say config.php and you don't want a missing value to be replaced with a global defined somewhere else.

<?php

  /**
   * Filters out global vars from get_defined_vars() in order to get local vars only
   * @param array $localVars pass get_defined_vars() here
   *
   * @return array local vars only
   */
  function removeGlobals(array $localVars) {
    return array_diff_key($localVars, $GLOBALS);
  }

  define('CONFIG_FILE_PATH', '/path/to/config.php');
  function readConfig() {
    require CONFIG_FILE_PATH;
    $config = removeGlobals(get_defined_vars());
    return $config;
  }

?>
Joey 11-Jun-2018 07:22
I posted here before about "this" being in get_defined_vars.

It turns out it's not always there but in certain cases it will inexplicably appear.

    php -r '
    class Test {
        public function a() {var_dump(array_keys(get_defined_vars()));$a = 123;}
        public function b() {var_dump(array_keys(get_defined_vars()));$this;}
    }
    $t = new Test();
    $t->a();
    $t->b();
    '

    array()
    array('this')

This does not happen in PHP 7.2 but will happen in PHP 5.6.
Joey 24-Apr-2018 08:30
Some comments here point out that this function wont return references. It does however return names and names are "references".

I would not recommend the suggestions here that convert it to references.

Instead...

    public function x($a, $b, $c) {
        foreach(array_keys(get_defined_vars()) as $key)
            if($key !== 'this')
                $this->y(${$key});
    }

    public function y(&$input) {
        $input++;
    }

Instead of ${} you can also use $$.

I have done some whacky things in my time to make extremely generic code but I've never had to do anything like the above. It might not even work (but should since it's no different to $a[$key]).

You could also do $$key++ but I've never seen code like that which wasn't horrifically bad (using dynamic where dynamic isn't beneficial).

If you're doing something like that then give it additional scrutiny.
Joey 24-Apr-2018 08:20
I occasionally use this as a hack to convert arguments to an array where terseness is needed (dealing with legacy code, etc).

However in an object context it'll also pull in $this.

Make sure to unset it. If you map it to properties or an array then setting the key this wont be an error.

I recommend using a wrapper function that strips this from the result.
istiaquealamjoy at gmail dot com 23-May-2017 05:37
for all those who don't know how to us this function. copy and run this code in your computer  .

note: you need to know what superglobals are.....

<?php

$A = 5  ;
$B = 10 ;
$C = 15 ;
$D = 20 ;

$F = get_defined_vars($A);

var_dump($F);  //don't use echo. it will show error

?>

Result : will show all superglobals status along with your defined
variables along with its values
sergeyzuzic at mail dot ru 14-Nov-2015 10:35
dirty code sample:

print_r(compact(array_keys(get_defined_vars())));
mail at mkharitonov dot net 01-Jun-2014 07:14
Reference variables are returned by reference (tested on PHP 5.5.11):
<?php
$a = null;
$b = &$a;
get_defined_vars()['b'] = 4;
var_dump($b); // int(4)
?>
ryanlwh at yahoo dot com 02-Apr-2013 05:28
Since get_defined_vars() only gets the variables at the point you call the function, there is a simple way to get the variables defined within the current scope.

<?php
// The very top of your php script
$vars = get_defined_vars();

// Now do your stuff
$foo = 'foo';
$bar = 'bar';

// Get all the variables defined in current scope
$vars = array_diff(get_defined_vars(),$vars);

echo '<pre>';
print_r($vars);
echo '</pre>';
?>
Anonymous 18-Apr-2011 05:32
get_defined_vars() returns ALL the vars (in the current scope), what if you just want all YOUR vars, not PHP's super-globals?

<?php
    var_export(array_diff(get_defined_vars(), array(array())));
?>

Example...

<?php
    $TOP_LEVEL_VAR=1;
    var_export(array_diff(get_defined_vars(), array(array())));
?>

The output (with register_globals off) should be...

array (
  'TOP_LEVEL_VAR' => 1,
)

...it perfectly eliminated all the super-globals, without me having to specify them! (note with register_globals on, the output includes those globals, then TOP_LEVEL_VAR).

Here it is, as a function...(it's the best I could do {I can't call get_defined_vars() inside get_user_defined_vars() cuz of the scope issue}).

<?php
    header('Content-type: text/plain');

    $TOP_LEVEL_VAR=1;

    echo 'register_globals(';
    echo ini_get('register_globals');
    echo ') '.phpversion()."\n";

    var_export(get_user_defined_vars(get_defined_vars()));

    function get_user_defined_vars($vars) {
        return array_diff($vars, array(array()));
    }
?>

Note that originally I had an array of the super-globals I wanted removed from get_defined_vars()'s array, then I noticed even an empty double-array, array(array()), made it give me the correct result. Weird.

This was tested on PHP 5.2.9.
meint at meint dot net 11-Jan-2011 12:46
Please be aware that function_get_vars only returns the variables defined at the point before you call the function_get_vars function, it does not scan the entire function for you, only the lines before you call it.
Johan de Vries 17-Jun-2010 08:09
Note that this only returns things you've used. See http://bugs.php.net/bug.php?id=52110 . So don't expect this to have the $this entry, unless you assign $this to return $this.
donovan at example dot com 21-Oct-2008 09:15
As a note, get_defined_vars() does not return a set of variable references (as I hoped). For example:

<?php

// define a variable
$my_var = "foo";

// get our list of defined variables
$defined_vars = get_defined_vars();

// now try to change the value through the returned array
$defined_vars["my_var"] = "bar";

echo $my_var, "\n";

?>

will output "foo" (the original value). It'd be nice if get_defined_vars() had an optional argument to make them references, but I imagine its a rather specialized request. You can do it yourself (less conveniently) with something like:

<?php

$defined_vars = array();
$var_names = array_keys(get_defined_vars());

foreach ($var_names as $var_name)
{
    $defined_vars[$var_name] =& $$var_name;
}

?>
SyCo 21-Aug-2008 03:52
Here's a very simple function for debugging. It's far from perfect but I find it very handy. It outputs the var value and the var name on a new line. The problem is it'll echo any vars and their name if they share the same value. No big deal when debugging and saves the hassle of writing the HTML and var name when echoing a variable. (ev=echo variable). Using get_defined_vars() inside a function renames the var name to the functions variable so isn't as useful for debugging. Of course, you'll need access to the $GLOBALS array
<?
function ev($variable){
    foreach($GLOBALS as $key => $value){
        if($variable===$value){
            echo '<p>'.$key.' - '.$value.'</p>';
        }
    }
}

$a=0;
ev($a);
$b=0;
ev($b);
$c=0;
ev($c);
?>
Will output
a - 0

a - 0
b - 0

a - 0
b - 0
c - 0
zabmilenko at hotmail dot com 31-Aug-2006 07:32
A little gotcha to watch out for:

If you turn off RegisterGlobals and related, then use get_defined_vars(), you may see something like the following:

<?php
Array
(
    [GLOBALS] => Array
        (
            [GLOBALS] => Array
 *RECURSION*
            [_POST] => Array()
            [_GET] => Array()
            [_COOKIE] => Array()
            [_FILES] => Array()
        )

    [_POST] => Array()
    [_GET] => Array()
    [_COOKIE] => Array()
    [_FILES] => Array()

)
?>

Notice that $_SERVER isn't there.  It seems that php only loads the superglobal $_SERVER if it is used somewhere.  You could do this:

<?php
print '<pre>' . htmlspecialchars(print_r(get_defined_vars(), true)) . '</pre>';
print '<pre>' . htmlspecialchars(print_r($_SERVER, true)) . '</pre>';
?>

And then $_SERVER will appear in both lists.  I guess it's not really a gotcha, because nothing bad will happen either way, but it's an interesting curiosity nonetheless.
lbowerh at adelphia dot net 04-Jun-2004 08:19
Here is a function which generates a debug report for display or email
using get_defined_vars. Great for getting a detailed snapshot without
relying on user input.

<?php
function generateDebugReport($method,$defined_vars,$email="undefined"){
    // Function to create a debug report to display or email.
    // Usage: generateDebugReport(method,get_defined_vars(),email[optional]);
    // Where method is "browser" or "email".

    // Create an ignore list for keys returned by 'get_defined_vars'.
    // For example, HTTP_POST_VARS, HTTP_GET_VARS and others are
    // redundant (same as _POST, _GET)
    // Also include vars you want ignored for security reasons - i.e. PHPSESSID.
    $ignorelist=array("HTTP_POST_VARS","HTTP_GET_VARS",
    "HTTP_COOKIE_VARS","HTTP_SERVER_VARS",
    "HTTP_ENV_VARS","HTTP_SESSION_VARS",
    "_ENV","PHPSESSID","SESS_DBUSER",
    "SESS_DBPASS","HTTP_COOKIE");

    $timestamp=date("m/d/y h:m:s");
    $message="Debug report created $timestamp\n";

    // Get the last SQL error for good measure, where $link is the resource identifier
    // for mysql_connect. Comment out or modify for your database or abstraction setup.
    global $link;
    $sql_error=mysql_error($link);
    if($sql_error){
      $message.="\nMysql Messages:\n".mysql_error($link);
    }
    // End MySQL

    // Could use a recursive function here. You get the idea ;-)
    foreach($defined_vars as $key=>$val){
      if(is_array($val) && !in_array($key,$ignorelist) && count($val) > 0){
        $message.="\n$key array (key=value):\n";
        foreach($val as $subkey=>$subval){
          if(!in_array($subkey,$ignorelist) && !is_array($subval)){
            $message.=$subkey." = ".$subval."\n";
          }
          elseif(!in_array($subkey,$ignorelist) && is_array($subval)){
            foreach($subval as $subsubkey=>$subsubval){
              if(!in_array($subsubkey,$ignorelist)){
                $message.=$subsubkey." = ".$subsubval."\n";
              }
            }
          }
        }
      }
      elseif(!is_array($val) && !in_array($key,$ignorelist) && $val){
        $message.="\nVariable ".$key." = ".$val."\n";
      }
    }

    if($method=="browser"){
      echo nl2br($message);
    }
    elseif($method=="email"){
      if($email=="undefined"){
        $email=$_SERVER["SERVER_ADMIN"];
      }

      $mresult=mail($email,"Debug Report for ".$_ENV["HOSTNAME"]."",$message);
      if($mresult==1){
        echo "Debug Report sent successfully.\n";
      }
      else{
        echo "Failed to send Debug Report.\n";
      }
    }
}
?>
jgettys at gnuvox dot com 22-Feb-2002 07:09
Simple routine to convert a get_defined_vars object to XML.

<?php
function obj2xml($v, $indent='') {
  while (list($key, $val) = each($v)) {
    if ($key == '__attr') continue;
    // Check for __attr
    if (is_object($val->__attr)) {
      while (list($key2, $val2) = each($val->__attr)) {
        $attr .= " $key2=\"$val2\"";
      }
    }
    else $attr = '';
    if (is_array($val) || is_object($val)) {
      print("$indent<$key$attr>\n");
      obj2xml($val, $indent.'  ');
      print("$indent</$key>\n");
    }
    else print("$indent<$key$attr>$val</$key>\n");
  }
}

//Example object
$x->name->first = "John";
$x->name->last = "Smith";
$x->arr['Fruit'] = 'Bannana';
$x->arr['Veg'] = 'Carrot';
$y->customer = $x;
$y->customer->__attr->id='176C4';

$z = get_defined_vars();
obj2xml($z['y']);
?>

will output:
<customer id="176C4">
  <name>
    <first>John</first>
    <last>Smith</last>
  </name>
  <arr>
    <Fruit>Bannana</Fruit>
    <Veg>Carrot</Veg>
  </arr>
</customer>


Retourne un entier identifiant une ressource

  • « get_defined_vars
  • get_resource_type »
  • PHP Manual
  • Fonctions de gestion des variables
  • Retourne un entier identifiant une ressource

get_resource_id

(PHP 8)

get_resource_id — Retourne un entier identifiant une ressource

Description

get_resource_id ( resource $res ) : int

Cette fonction fournit un moyen sûr pour générer un entier identifiant une ressource.

Liste de paramètres

res

Le gestionnaire de la ressource à identifier.

Valeurs de retour

L'int identifiant la res passée en paramètre.

Cette fonction est une conversion de type de res vers un int pour faciliter la récupération de l'ID d'une ressource.

Exemples

Exemple #1 get_resource_id() exemple

<?php
$handle = fopen('./storage/logs/lumen.log', 'rt');

echo (int) $handle . "\n\n";

echo get_resource_id($handle);

?>

L'exemple ci-dessus va afficher :

698

698

Voir aussi

  • get_resource_type() - Retourne le type de ressource

User Contributed Notes

There are no user contributed notes for this page.


Retourne le type de ressource

  • « get_resource_id
  • gettype »
  • PHP Manual
  • Fonctions de gestion des variables
  • Retourne le type de ressource

get_resource_type

(PHP 4 >= 4.0.2, PHP 5, PHP 7, PHP 8)

get_resource_type — Retourne le type de ressource

Description

get_resource_type ( resource $handle ) : string

Cette fonction retourne le type de la ressource donnée.

Liste de paramètres

handle

Le gestionnaire de ressources à évaluer.

Valeurs de retour

Si le paramètre handle est une ressource, cette fonction retournera une chaîne de caractères représentant son type. Si le type n'est pas identifié par cette fonction, la valeur de retour sera la chaîne de caractères Unknown.

Cette fonction retournera null et générera une erreur si handle n'est pas une ressource.

Exemples

Exemple #1 Exemple avec get_resource_type()

<?php

// affiche : stream (ndt : flux)
$fp = fopen("foo", "w");
echo get_resource_type($fp) . "\n";

// affiche : curl
$c = curl_init ();
echo get_resource_type($c) . "\n"; // fonctionne sur les versions antérieures à PHP 8.0.0, car à partir de PHP 8.0.0, curl_init returne un objet CurlHandle
?>

Voir aussi

  • get_resource_id() - Retourne un entier identifiant une ressource

User Contributed Notes

CertaiN 17-Jan-2014 05:04
Try this to know behavior:

<?php
function resource_test($resource, $name) {
    echo
        '[' . $name. ']',
        PHP_EOL,
        '(bool)$resource => ',
        $resource ? 'TRUE' : 'FALSE',
        PHP_EOL,
        'get_resource_type($resource) => ',
        get_resource_type($resource) ?: 'FALSE',
        PHP_EOL,
        'is_resoruce($resource) => ',
        is_resource($resource) ? 'TRUE' : 'FALSE',
        PHP_EOL,
        PHP_EOL
    ;
}

$resource = tmpfile();
resource_test($resource, 'Check Valid Resource');

fclose($resource);
resource_test($resource, 'Check Released Resource');

$resource = null;
resource_test($resource, 'Check NULL');
?>

It will be shown as...

[Check Valid Resource]
(bool)$resource => TRUE
get_resource_type($resource) => stream
is_resoruce($resource) => TRUE

[Check Released Resource]
(bool)$resource => TRUE
get_resource_type($resource) => Unknown
is_resoruce($resource) => FALSE

[Check NULL]
(bool)$resource => FALSE
get_resource_type($resource) => FALSE
Warning:  get_resource_type() expects parameter 1 to be resource, null given in ... on line 10
is_resoruce($resource) => FALSE


Retourne le type de la variable

  • « get_resource_type
  • intval »
  • PHP Manual
  • Fonctions de gestion des variables
  • Retourne le type de la variable

gettype

(PHP 4, PHP 5, PHP 7, PHP 8)

gettype — Retourne le type de la variable

Description

gettype ( mixed $value ) : string

Retourne le type de la variable value. Pour vérifier le type de la variable, vous pouvez utiliser les fonctions is_*.

Liste de paramètres

value

La variable à analyser.

Valeurs de retour

Les chaînes de caractères que peut retourner la fonction sont les suivantes :

  • "boolean"
  • "integer"
  • "double" (pour des raisons historiques, "double" est retournée lorsqu'une valeur de type float est fournie, et non "float"")
  • "string"
  • "array"
  • "object"
  • "resource"
  • "resource (closed)" as of PHP 7.2.0
  • "NULL"
  • "unknown type"

Exemples

Exemple #1 Exemple avec gettype()

<?php

$data = array(1, 1., NULL, new stdClass, 'foo');

foreach ($data as $value) {
    echo gettype($value), "\n";
}

?>

Résultat de l'exemple ci-dessus est similaire à :

integer
double
NULL
object
string

Historique

Version | Description
7.2.0 | Les ressources fermées sont maintenant rapportées en tant que 'resource (closed)'. Précédement la valeur retournée pour des ressources fermées était 'unknown type'.

Voir aussi

  • settype() - Affecte un type à une variable
  • get_class() - Retourne le nom de la classe d'un objet
  • is_array() - Détermine si une variable est un tableau
  • is_bool() - Détermine si une variable est un booléen
  • is_callable() - Détermine si l'argument peut être appelé comme fonction
  • is_float() - Détermine si une variable est de type nombre décimal
  • is_int() - Détermine si une variable est de type nombre entier
  • is_null() - Indique si une variable vaut null
  • is_numeric() - Détermine si une variable est un nombre ou une chaîne numérique
  • is_object() - Détermine si une variable est de type objet
  • is_resource() - Détermine si une variable est une ressource
  • is_scalar() - Indique si une variable est un scalaire
  • is_string() - Détermine si une variable est de type chaîne de caractères
  • function_exists() - Indique si une fonction est définie
  • method_exists() - Vérifie si la méthode existe pour une classe

User Contributed Notes

matt at appstate 16-Dec-2004 11:10
Here is something that had me stumped with regards to gettype and is_object.
Gettype will report an incomplete object as such, whereas is_object will return FALSE.

<?php
if (!is_object($incomplete_obj)) {
   echo 'This variable is not an object, it is a/an ' . gettype($incomplete_obj);
}
?>

Will print:
This variable is not an object, it is a/an object


Retourne la valeur numérique entière équivalente d'une variable

  • « gettype
  • is_array »
  • PHP Manual
  • Fonctions de gestion des variables
  • Retourne la valeur numérique entière équivalente d'une variable

intval

(PHP 4, PHP 5, PHP 7, PHP 8)

intval — Retourne la valeur numérique entière équivalente d'une variable

Description

intval ( mixed $value , int $base = 10 ) : int

Retourne la valeur entier de value en utilisant la base fourni pour la conversion (par défaut en base 10). intval() ne devrait pas être utilisée sur des objets, dans ces cas, une erreur de niveau E_NOTICE sera émise et la fonction retournera 1.

Liste de paramètres

value

La valeur scalaire à être convertie en entier

base

La base pour la conversion

Note:

Si base vaut 0, la base utilisée est déterminée par le format du paramètre value :

  • si la chaîne inclue un préfixe "0x" (ou "0X"), la base prise sera 16 (hex) ; sinon,
  • si la chaîne commence par "0", la base prise sera 8 (octal); sinon,
  • la base prise sera 10 (décimal).

Valeurs de retour

Une valeur de type entier de value en cas de succès ou 0 en cas d'échec. Les tableaux vides retournent 0, les tableaux non vides retournent 1.

La valeur maximale dépend du système. Les systèmes à 32 bits ont une valeur entière signée maximale de -2147483648 à 2147483647. Alors, par exemple, sur un système semblable, intval('1000000000000') retournera 2147483647. La valeur entière signée maximale pour un système à 64 bits est 9223372036854775807.

Les chaînes de caractères retournent la plupart du temps 0, cela dépend des caractères à l'extrême gauche de la chaîne. La règle courante du transtypage d'entier s'applique.

Exemples

Exemple #1 Exemples avec intval()

Les exemples suivants sont basés sur un système à 32 bits.

<?php
echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8);                   // 42
echo intval('42', 8);                 // 34
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
echo intval(false);                   // 0
echo intval(true);                    // 1
?>

Notes

Note:

Le paramètre base n'a aucun effet à moins que le paramètre value soit une chaîne de caractères.

Voir aussi

  • boolval() - Récupère la valeur booléenne d'une variable
  • floatval() - Convertit une chaîne en nombre à virgule flottante
  • strval() - Récupère la valeur d'une variable, au format chaîne
  • settype() - Affecte un type à une variable
  • is_numeric() - Détermine si une variable est un nombre ou une chaîne numérique
  • Définition du type
  • Nombres de grande taille BCMath

User Contributed Notes

Anony Moose 15-May-2020 03:46
As a warning, do not use this function alone for input validation.

Vulnerable example:
<?php
if(isset($_GET['id']) && intval($_GET['id']) > 0){
    echo $id;
}
?>

The following requests would pass this filter:

/page.php?id=10
/page.php?id=10oops
/page.php?id=10<script>alert(1)</script>
/page.php?id=1' OR '1'='1
/page.php?id[]=<script>alert(1)</script>

Instead use the is_numeric() function for integer validation:

<?php
echo intval("10oops"); // 10
echo is_numeric("10oops");  // false
?>

Secure example:
<?php
if(isset($_GET['id']) && is_numeric($_GET['id']) && intval($_GET['id']) > 0){
    echo $id;
}
?>
Anonymous 12-Feb-2020 05:14
PHP 7.2

$test = intval(150.20*100); //15019
$test2 = intval(15020); //15020
$test3 = intval(15020.0); //15020
$test4 = 150.20*100; //15020.0
chinmay235 at gmail dot com 10-May-2018 05:57
<?php
echo intval("10 days");          //10
echo intval("days 10");          //0
?>
Anthony 21-Apr-2018 12:28
The binary notation is NOT supported until php7.2
<?php
                         // PHP <7.2 | PHP >=7.2
echo intval(0b11);       //    3     |     3
echo intval(-0b11);      //   -3     |    -3
echo intval('0b11');     //    0     |     0
echo intval('-0b11');    //    0     |     0
echo intval('0b11', 0);  //    0     |     3
echo intval('-0b11', 0); //    0     |    -3
?>
leon at leonidasjp dot nl 27-Jan-2017 03:35
It seems intval is interpreting valid numeric strings differently between PHP 5.6 and 7.0 on one hand, and PHP 7.1 on the other hand.

<?php
echo intval('1e5');
?>

will return 1 on PHP 5.6 and PHP 7.0,
but it will return 100000 on PHP 7.1.
taylorsarrafian at gmail dot com 11-Jul-2015 04:45
beware:

<?php

   // observe the following
   echo intval( strval( -0.0001 ) ); // 0
   echo intval( strval( -0.00001 ) ); // -1

   // this is because
   echo strval( -0.0001 ); // -.0001
   echo strval( -0.00001 ); // -1.0E-5

   // thus beware when using
   function trunc2_bad( $n ) {
      return intval( strval( $n * 100 ) / 100 );
   }

   // use this instead
   function trunc2_good( $n ) {
      return intval( floatval( strval( $n * 100 )  ) / 100 );
   }

?>
pfreet at gmail dot com 25-Apr-2013 05:27
Do not use intval() when you really want round(). This is due to how PHP handles precision.

echo number_format(8.20*100, 20), "<br />";
echo intval(8.20*100), "<br />";
echo floor(8.20*100), "<br />";
echo round(8.20*100), "<br />";

819.99999999999988631316
819
819
820
espertalhao04 at hotmail dot com 06-Mar-2013 09:58
if you want to take a number from a string, no matter what it may contain, here is a good solution:

<?php
function int($s){return(int)preg_replace('/[^\-\d]*(\-?\d*).*/','$1',$s);}

echo int('j18ugj9hu0gj5hg');
//output: 18
?>
this example returns an int, so it will follow the int rules, and has support for negative values.

<?php
function int($s){return($a=preg_replace('/[^\-\d]*(\-?\d*).*/','$1',$s))?$a:'0';}

echo int('j-1809809808908099878758765ugj9hu0gj5hg');
//output: -1809809808908099878758765
?>

this one returns a string with just the numeric value.
it also supports negative values.

the latter is better when you have a 32 bit system and you want a huge int that is higher than PHP_MAX_INT.
Ken 11-Nov-2011 11:50
Not mentioned elsewhere: intval(NULL) also returns 0.
yves 27-Dec-2010 08:53
The behaviour of intval() is interesting when supplying a base, and you better check your intval base-based expressions, as it is counter-intuitive.
As the example shows
<?php
  intval('42', 8); // => 34
  intval(42, 8);   // => 42 !
?>
PHP considers the 42 as being already an integer, and doesn't apply any conversion. And supplying
<?php
  intval(49, 8);  // => 49 !
?>
produces no error and no warning.
winbill at hotmail dot com 16-Dec-2010 08:31
Be careful :

<?php
$n="19.99";
print intval($n*100); // prints 1998
print intval(strval($n*100)); // prints 1999
?>
spoon_reloaded at gmail dot com 21-Jun-2009 10:35
Here is a really useful undocumented feature:

You can have it automatically deduce the base of the number from the prefix of the string using the same syntax as integer literals in PHP ("0x" for hexadecimal, "0" for octal, non-"0" for decimal) by passing a base of 0 to intval():

<?php
echo intval("0x1a", 0), "\n"; // hex; prints "26"
echo intval("057", 0), "\n"; // octal; prints "47"
echo intval("42", 0), "\n"; // decimal; prints "42"
?>
mkamerma at science dot uva dot nl 06-Mar-2006 11:48
As addendum, the "if ($int > 0)" check in the encode function is redundant. It doesn't do anything bad to keep it in since it will always be true when reaching that point, but it's a meaningless conditional this way. It's a remnant from when I tried to write the function in terms of bitshifts, which could lead to negative ints when shifting if the 32nd bit was set (instead of always padding with 0's when using >> it pads with 1's leading to negative ints).
simon at npkk dot cz 30-Jan-2006 08:03
Still have on mind, that if you convert big numbers by adding zero, PHP makes automatic "to a float" conversion, so it is same as floatVal(). So if the number is realy big (over 13 digits), you can lose preciosity. Do not use it for such long numbers, if all bits do matter (IPv6 addresses and similar).
Ben Laurienti 16-Jan-2006 01:21
You guys are going to love this.  I found something that I found quite disturbing.

$test1 = intVal(1999);

$amount = 19.99 * 100;
$test2 = intVal($amount);
$test3 = intVal("$amount");

echo $test1 . "<br />\n";
echo $test2 . "<br />\n";
echo $test3 . "<br />\n";

expected output:
1999
1999
1999

actual output
1999
1998
1999

Appears to be a floating point issue, but the number 1999 is the only number that I was able to get to do this.  19.99 is the price of many things, and for our purpose we must pass it as 1999 instead of 19.99.
tuxedobob at mac dot com 07-Feb-2004 04:56
Sometimes intval just won't cut it. For example if you want to use an unsigned 32-bit int and need all 32 bits. Recently, I wrote a little script that took and integer and converted it to an IP address. After realizing I couldn't just mod the whole thing, since the sign bit throws it off (and compensating for that), we ran into a problem where if it was entered into a form, the value somehow wasn't converted to an integer properly, at least not implicitly. The solution for this, and the way I recommend converting a string to an integer, is:

$num = $num + 0;

and PHP will leave your number alone; it'll just know it's a number. Such is the fun of a loosely-typed language. :)
zak at php dot net 12-Aug-2000 01:38
intval converts doubles to integers by truncating the fractional component of the number.

When dealing with some values, this can give odd results.  Consider the following:

print intval ((0.1 + 0.7) * 10);

This will most likely print out 7, instead of the expected value of 8.

For more information, see the section on floating point numbers in the PHP manual (http://www.php.net/manual/language.types.double.php)

Also note that if you try to convert a string to an integer, the result is often 0.

However, if the leftmost character of a string looks like a valid numeric value, then PHP will keep reading the string until a character that is not valid in a number is encountered.

For example:

"101 Dalmations" will convert to 101

"$1,000,000" will convert to 0 (the 1st character is not a valid start for a number

"80,000 leagues ..." will convert to 80

"1.4e98 microLenats were generated when..." will convert to 1.4e98

Also note that only decimal base numbers are recognized in strings.

"099" will convert to 99, while "0x99" will convert to 0.

One additional note on the behavior of intval.  If you specify the base argument, the var argument should be a string - otherwise the base will not be applied.

For Example:

print intval (77, 8);   // Prints 77
print intval ('77', 8); // Prints 63


Détermine si une variable est un tableau

  • « intval
  • is_bool »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détermine si une variable est un tableau

is_array

(PHP 4, PHP 5, PHP 7, PHP 8)

is_array — Détermine si une variable est un tableau

Description

is_array ( mixed $value ) : bool

is_array() détermine si la variable donnée est un tableau.

Liste de paramètres

value

La variable à évaluer.

Valeurs de retour

Retourne true si value est un array, false sinon.

Exemples

Exemple #1 Exemple avec is_array()

<?php
$yes = array('ceci', 'est', 'un tableau');

echo is_array($yes) ? 'Tableau' : 'ce n\'est pas un tableau';
echo "\n";

$no = 'ceci est une chaîne';

echo is_array($no) ? 'Tableau' : 'ce n\'est pas un tableau';
?>

L'exemple ci-dessus va afficher :

Tableau
ce n'est pas un tableau

Voir aussi

  • is_float() - Détermine si une variable est de type nombre décimal
  • is_int() - Détermine si une variable est de type nombre entier
  • is_string() - Détermine si une variable est de type chaîne de caractères
  • is_object() - Détermine si une variable est de type objet

User Contributed Notes

Daniel 14-Jul-2019 06:54
The next post is not correct because has problems with blank array index:
https://www.php.net/manual/es/function.is-array.php#89332

The next code use the above link php code

<?php
function is_assoc($var)
{
        return is_array($var) && array_diff_key($var,array_keys(array_keys($var)));
}

function test($var)
{
        echo is_assoc($var) ? "I'm an assoc array.\n" : "I'm not an assoc array.\n";
}

// an assoc array
$a = array("a"=>"aaa","b"=>1,"c"=>true);
test($a);

// maybe assoc array?
$b = array(0 => "aaa", 1 => 1, 3 => true); // Index 2 not exist
test($b);
?>

# Output
I'm an assoc array.
I'm an assoc array.

"Associative arrays are arrays that use named keys that you assign to them."
https://www.w3schools.com/php/php_arrays.asp

Solution:

<?php
function is_assoc(array $array)
{
    return count(array_filter(array_keys($array), 'is_string')) > 0;
}
function test(array $array)
{
    echo is_assoc($array) ? "I'm an assoc array.\n" : "I'm not an assoc array.\n";
}
// an assoc array
$a = array("a"=>"aaa","b"=>1,"c"=>true);
test($a);
// an array
$b = array(0=>"aaa",1=>1,3=>true);
test($b);
?>

# Output
I'm an assoc array.
I'm not an assoc array.

If you want check pure assoc. array replace > 0 by === count($array)
lrgbx0 at gmail dot com 10-May-2018 08:48
is_assoc() Benchmark:

<?php

function is_assoc1($array) {
    if (!is_array($array)) return false;
    $i = count($array);
    while ($i > 0) unset($array[--$i]);
    return (bool)$array;
}

function is_assoc2(&$array) {
    if (!is_array($array)) return false;
    $i = count($array);
    while ($i > 0) {
        if (!isset($array[--$i])) return true;
    }
    return false;
}

function is_assoc3(&$array) {
    if (!is_array($array)) return false;
    $i = count($array);
    while ($i > 0) {
        if (!array_key_exists(--$i, $array)) return true;
    }
    return false;
}

function is_assoc4($array) {
    if (!is_array($array)) return false;
    ksort($array);
    foreach (array_keys($array) as $k => $v) {
        if ($k !== $v) return true;
    }
    return false;
}

function is_assoc5(&$array) {
    return is_array($array) && array_diff_key($array, array_keys($array));
}

$arr1 = array(); // not associative
$arr2 = $arr3 = array('foo', 'bar', 'baz', 'foo', 'bar', 'baz', 'foo', 'bar', 'baz', 'foo'); // not associative
asort($arr3); // not associative, shuffled keys
$arr4 = array('foo', 'bar', 'baz', 'foo', 'bar', null, 'foo', 'bar', 'baz', 'foo'); // not associative but is_assoc2() thinks it is
$arr5 = array(0 => 'foo', 1 => 'bar', 2 => 'baz', 3 => 'foo', 4 => 'bar', 5 => 'baz', 'foo3' => 'foo', 'bar3' => 'bar', 'baz3' => 'baz', 'foo4' => 'foo'); // associative

$i = $j = 0;
$time = array(0.0, 0.0, 0.0, 0.0, 0.0);

for ($j = 0; $j < 2000; $j++) {
    $time[0] -= microtime(true);
    for ($i = 0; $i < 1000; $i++) {
        if (is_assoc1($arr1) || is_assoc1($arr2) || is_assoc1($arr3) || is_assoc1($arr4) || !is_assoc1($arr5)) {
            echo 'error';
            break;
        }
    }
    $time[0] += microtime(true);
    $time[1] -= microtime(true);
    for ($i = 0; $i < 1000; $i++) {
        if (is_assoc2($arr1) || is_assoc2($arr2) || is_assoc2($arr3) || !is_assoc2($arr4) || !is_assoc2($arr5)) { // $arr4 tweaked
            echo 'error';
            break;
        }
    }
    $time[1] += microtime(true);
    $time[2] -= microtime(true);
    for ($i = 0; $i < 1000; $i++) {
        if (is_assoc3($arr1) || is_assoc3($arr2) || is_assoc3($arr3) || is_assoc3($arr4) || !is_assoc3($arr5)) {
            echo 'error';
            break;
        }
    }
    $time[2] += microtime(true);
    $time[3] -= microtime(true);
    for ($i = 0; $i < 1000; $i++) {
        if (is_assoc4($arr1) || is_assoc4($arr2) || is_assoc4($arr3) || is_assoc4($arr4) || !is_assoc4($arr5)) {
            echo 'error';
            break;
        }
    }
    $time[3] += microtime(true);
    $time[4] -= microtime(true);
    for ($i = 0; $i < 1000; $i++) {
        if (is_assoc5($arr1) || is_assoc5($arr2) || is_assoc5($arr3) || is_assoc5($arr4) || !is_assoc5($arr5)) {
            echo 'error';
            break;
        }
    }
    $time[4] += microtime(true);
}

echo 'is_assoc1(): ' . $time[0] . "\n";
echo 'is_assoc2(): ' . $time[1] . "\n";
echo 'is_assoc3(): ' . $time[2] . "\n";
echo 'is_assoc4(): ' . $time[3] . "\n";
echo 'is_assoc5(): ' . $time[4] . "\n";

?>

is_assoc1() - uses unset(), a bit slow, but mem friendly and no function calls
is_assoc2() - uses isset(), fastest one, but returns TRUE whenever array contains NULL
is_assoc3() - fixed is_assoc2(), uses array_key_exists(), fast and memory friendly, and much smarter than the following (no need to check all those keys)
is_assoc4() - alex' version with proper check and key sorting
is_assoc5() - fixed a bit JTS' version, really nice one, but uses too many functions and checks all keys

Results:

is_assoc1(): 2.1628699302673
is_assoc2(): 1.1079933643341
is_assoc3(): 1.7120850086212
is_assoc4(): 3.9194552898407
is_assoc5(): 1.9509885311127
rik at mmod dot co 12-Apr-2018 05:39
Using is_array prior to an in_array within an if clause will safely escape a check against a variable that could potentially be a non-array when using in_array.  For instance:

NOTE: A real use case might be that we have a list of possible flags which  in a database we have stored whether each of the flags are 0 or 1.  We want a list of the flags which have the value of 1 to be returned.

Our example here will not use so many technical artifacts, but will be based on similar logic just to get the point across.

<?php

// We have a list of known values
$knownVars = ['apple', 'orange'];

// A list of values to check
$listToCheck = ['pear', 'banana'];

// And a method that takes a list of values to check and returns a new list
// of the items from said list that are found to be valid...
public function getValidItemsList( $listToCheck /*['pear', 'banana']*/)
{
    $returnList = [];
    foreach($listToCheck as $key => $val)
    {
        if(in_array($val, $knownVars))
        {
            array_push($returnList, $val);
        }
    }

    if(empty($returnList))
    {
        // We have a special case if there were no valid items found, which is the case we are going over
        return  -1;
    }

    // Otherwise, normally returns a list of the items that were found to be valid
    return $returnList;
}

// Call the method and check for any valid items that can be used for some purpose
$validItemsList =  getValidItemsList($listToCheck);

// In this usage we could potentially get an exception because
// in_array() expects an array for argument #2, checking that the value != -1 does not escape the if statement:
if(isset($validItemsList) && $validItemsList != -1 && in_array('apple', $validItemsList))
{
    //...
}

// In this usage, we break free from the if statement safely:
if(isset($validItemsList) && $validItemsList != -1 && is_array($validItemsList) && in_array('apple', $validItemsList))
{
    //...
}

?>

Hope that can help someone, I know it helped me.
gwschnell at ewe dot net 22-Mar-2018 04:58
An error will be thrown If is_array() is applied to a nonexisting varble.
carren at AngieBecker dot ch 26-Sep-2017 08:48
This is probably the best way to test for associative arrays:

<?php
function is_assoc($test) {
        if (empty($test)) { return(false); }
        if (!is_array($test)) { return(false); }
        return ($test !== array_values($test));
}
?>

This version is based on the one from dmitry dot sushilov, which is unfortunately exactly opposite and misses the is_array and empty test.
http://php.net/manual/en/function.is-array.php#115901
marko at newvibrations dot net 20-Oct-2016 12:08
hperrin at gmail dot com
i tested modified version of your code:

<?php
$test = array_fill(0, $size, rand());
$test3 = (object) $test;
?>

Results are quite different!

PHP 5.5:
is_array - execution time is constant over different $size
cast, === - execution time is proportional with $size, for small arrays, it's faster than is_array, but for bigger arrays, it's way slower. Also, bigger memory allocation because casting actually allocates memory

PHP 7.0:
is_array and cast, === have constant execution time over different $size:
is_array  :  0.12564396858215
cast, === :  0.24629783630371

Looks like casting is optimised, but still slower.

Bottom line is: optimisation is not done for special scenario, but for average use and scalability. Don't reinvent wheel.
Rob Thomas 05-Oct-2016 10:40
Please note that the 'cast to array' check is horrendously out of date.

Running that code against PHP 5.6 results in this:

is_array  :  0.93975400924683
cast, === :  1.2425191402435

So, please use 'is_array', not the horrible casting hack.
mt at banita dot de 08-Sep-2016 09:30
I'm using PHP 5.3.10 and the remark from hperrin is not (no longer?) valid

is_array is (now?) faster than if ( (array) $unknown !== $unknown )

my result of hperrins test script

is_array  :  0.61710119247437
cast, === :  1.1551909446716
ari at umbrella dot bz 05-Sep-2016 08:34
hperrin's results have indeed changed in PHP 7. The opposite is now true, is_array is faster than comparison:

is_array  :  0.52148389816284
cast, === :  0.84179711341858

Tested 1000000 iterations.
mbrodala at pagemachine dot de 24-Aug-2016 01:22
Notice that the benchmark results from hperrin at gmail dot com have changed in the meantime:

is_array  :  0.31888604164124
cast, === :  0.58448791503906

(Using PHP 5.6.24, I expect other results with PHP 7)
dmitry dot sushilov at gmail dot com 12-Oct-2014 12:49
function is_associate_array($array)
{
    return $array === array_values($array);
}

or you can add check is_array in functions
joksnet at gmail dot com 08-Oct-2013 10:17
Here is something for compare `is_assoc` functions.

<?php
function is_assoc1($var)
{
    return is_array($var) && array_diff_key($var, array_keys(array_keys($var)));
}

function is_assoc2($var)
{
    return is_array($var) && array_diff_key($var, array_fill(0, count($var), null));
}

$count = 1000000;

$a = array('a' => 'foo', 'b' => 1, 'c' => true);
$b = array('a', 'b', 'c');

$i = $start_time = $end_time = 0;

$start_time = microtime(true);
for ($i = 0; $i < $count; $i++) {
    assert(is_assoc1($a) === true);
    assert(is_assoc1($b) === false);
}
$end_time = microtime(true);
echo 'is_assoc1  :  ' . ($end_time - $start_time) . "\n";

$start_time = microtime(true);
for ($i = 0; $i < $count; $i++) {
    assert(is_assoc2($a) === true);
    assert(is_assoc2($b) === false);
}
$end_time = microtime(true);
echo 'is_assoc2  :  ' . ($end_time - $start_time) . "\n";
?>

It prints something like this:

```
% php is_assoc.php
is_assoc1  :  19.36315202713
is_assoc2  :  18.954080104828
```

The first one is from
skaimauve (http://www.php.net/manual/en/function.is-array.php#89332). The second one is mine.
magentix at gmail dot com 26-Feb-2011 09:12
If you wanted to have 'pure' associative arrays,
you could filter out non-string keys and then compare the count of the original array with the count of the filtered array.

<?php
    // Only validates empty or completely associative arrays
    function is_assoc ($arr) {
        return (is_array($arr) && count(array_filter(array_keys($arr),'is_string')) == count($arr));
    }

    $a = '';
    $b = 'z';
    $c = array();
    $d = array('x','y','z');
    $e = array('x','y','zed'=>'z');
    $f = array('ex'=>'x','why'=>'y','zed'=>'z');

    echo '$a: ' . ( (is_assoc($a)) ? 'true' : 'false' ) ."\n"; // False
    echo '$b: ' . ( (is_assoc($b)) ? 'true' : 'false' ) ."\n"; // False
    echo '$c: ' . ( (is_assoc($c)) ? 'true' : 'false' ) ."\n"; // True
    echo '$d: ' . ( (is_assoc($d)) ? 'true' : 'false' ) ."\n"; // False
    echo '$e: ' . ( (is_assoc($e)) ? 'true' : 'false' ) ."\n"; // False
    echo '$f: ' . ( (is_assoc($f)) ? 'true' : 'false' ) ."\n"; // True
?>

I've tested the point of checking whether the array is empty first.
The overall result was a 200% speed increase when the array was indeed empty,
but an average 10% slow when it had elements inside.

<?php
    /***********************************************************
     *    Benchmarks: checking for empty array vs. not checking  *
     ***********************************************************/

    // With empty check
    function is_assoc ($arr) {
        return (is_array($arr) && (!count($arr) || count(array_filter(array_keys($arr),'is_string')) == count($arr)));
    }

    function test_speed($arr) {
        $t = microtime(true);
        for($i = 0; $i < 100000; ++$i) is_assoc($arr);
        return (microtime(true) - $t);
    }

    echo '$a: ' . test_speed($a) ."\n"; // 0.20597505569458
    echo '$b: ' . test_speed($b) ."\n"; // 0.19199514389038
    echo '$c: ' . test_speed($c) ."\n"; // 0.28803396224976
    echo '$d: ' . test_speed($d) ."\n"; // 0.94685983657837
    echo '$e: ' . test_speed($e) ."\n"; // 0.96698403358459
    echo '$f: ' . test_speed($f) ."\n"; // 0.98052096366882

    // Without empty check
    function is_assoc_2 ($arr) {
        return (is_array($arr) && count(array_filter(array_keys($arr),'is_string')) == count($arr));
    }

    function test_speed_2($arr) {
        $t = microtime(true);
        for($i = 0; $i < 100000; ++$i) is_assoc_2($arr);
        return (microtime(true) - $t);
    }

    echo '$a: ' . test_speed_2($a) ."\n"; // 0.18811202049255 = FASTER:  91.3% of is_assoc
    echo '$b: ' . test_speed_2($b) ."\n"; // 0.18782901763916 = FASTER:  97.8% of is_assoc
    echo '$c: ' . test_speed_2($c) ."\n"; // 0.64437484741211 = SLOWER: 223.7% of is_assoc
    echo '$d: ' . test_speed_2($d) ."\n"; // 0.84632205963135 = FASTER:  89.4% of is_assoc
    echo '$e: ' . test_speed_2($e) ."\n"; // 0.86739897727966 = FASTER:  89.7% of is_assoc
    echo '$f: ' . test_speed_2($f) ."\n"; // 0.87963700294495 = FASTER:  89.7% of is_assoc
?>
JTS 08-Jun-2010 04:22
I would change the order of the comparison, because if it is really an empty array, it is better to stop at that point before doing several 'cpu & memory intensive' function calls.

In the end on a ratio of 3 not empty arrays to 1 empty array computed for 1000000 iterations it needed 10% less time.
Or the other way round:
It needed approx 3% to 4% more time if the array is not empty, but was at least 4 times faster on empty arrays.

Additionally the memory consumption veritably lesser.

<?php
function is_assoc($array) {
    return (is_array($array) && (count($array)==0 || 0 !== count(array_diff_key($array, array_keys(array_keys($array))) )));
}
?>
hperrin at gmail dot com 28-May-2010 10:02
I've found a faster way of determining an array. If you use is_array() millions of times, you will notice a *huge* difference. On my machine, this method takes about 1/4 the time of using is_array().

Cast the value to an array, then check (using ===) if it is identical to the original.

<?php
if ( (array) $unknown !== $unknown ) {
    echo '$unknown is not an array';
} else {
    echo '$unknown is an array';
}
?>

You can use this script to test the speed of both methods.

<pre>
What's faster for determining arrays?

<?php

$count = 1000000;

$test = array('im', 'an', 'array');
$test2 = 'im not an array';
$test3 = (object) array('im' => 'not', 'going' => 'to be', 'an' => 'array');
$test4 = 42;
// Set this now so the first for loop doesn't do the extra work.
$i = $start_time = $end_time = 0;

$start_time = microtime(true);
for ($i = 0; $i < $count; $i++) {
    if (!is_array($test) || is_array($test2) || is_array($test3) || is_array($test4)) {
        echo 'error';
        break;
    }
}
$end_time = microtime(true);
echo 'is_array  :  '.($end_time - $start_time)."\n";

$start_time = microtime(true);
for ($i = 0; $i < $count; $i++) {
    if (!(array) $test === $test || (array) $test2 === $test2 || (array) $test3 === $test3 || (array) $test4 === $test4) {
        echo 'error';
        break;
    }
}
$end_time = microtime(true);
echo 'cast, === :  '.($end_time - $start_time)."\n";

echo "\nTested $count iterations."

?>
</pre>

Prints something like:

What's faster for determining arrays?

is_array  :  7.9920151233673
cast, === :  1.8978719711304

Tested 1000000 iterations.
Anonymous 16-May-2009 02:18
Using empty() in the previous example posted by Anonymous will result in a "Fatal error: Can't use function return value in write context".  I suggest using count() instead:

<?php
function is_assoc($array) {
    return (is_array($array) && 0 !== count(array_diff_key($array, array_keys(array_keys($array)))));
}
?>
skaimauve at yahoo dot ca 03-Mar-2009 12:12
Or you could make use of the array_diff_key and array_key function:

<?php

function is_assoc($var)
{
        return is_array($var) && array_diff_key($var,array_keys(array_keys($var)));
}

function test($var)
{
        echo is_assoc($var) ? "I'm an assoc array.\n" : "I'm not an assoc array.\n";
}

// an assoc array
$a = array("a"=>"aaa","b"=>1,"c"=>true);
test($a);

// an array
$b = array_values($a);
test($b);

// an object
$c = (object)$a;
test($c);

// other types
test($a->a);
test($a->b);
test($a->c);

?>

The above code outputs:
I'm an assoc array.
I'm not an assoc array.
I'm not an assoc array.
I'm not an assoc array.
I'm not an assoc array.
I'm not an assoc array.
Matthias Loitsch 03-Dec-2008 11:36
Or you could make use of the array_diff_key and range functions:

<?php

function isVector($var) { return count(array_diff_key($var, range(0, count($var) - 1))) == 0; }

function isAssociative($var) { return !isVector($var); }

?>
jim at akubo dot net 28-Oct-2008 11:02
yousef's example was wrong because is_vector returned true instead of false if the key was found
here is the fixed version (only 2 lines differ)
<?php
function is_vector( &$array ) {
   if ( !is_array($array) || empty($array) ) {
      return -1;
   }
   $next = 0;
   foreach ( $array as $k => $v ) {
      if ( $k !== $next ) return false;
      $next++;
   }
   return true;
}
?>
yousuf at philipz dot com 16-Oct-2008 03:41
alex frase's example is fast but elanthis at awesomeplay dot com's example is faster and Ilgar's modification of alex's code is faulty (the part " || $_array[$k] !== $v"). Also, Ilgar's suggestion of giving a false return value when the variable isnt an array is not suitable in my opinion and i think checking if the array is empty would also be a suitable check before the rest of the code runs.

So here's the modified (is_vector) version

<?php
function is_vector( &$array ) {
   if ( !is_array($array) || empty($array) ) {
      return -1;
   }
   $next = 0;
   foreach ( $array as $k => $v ) {
      if ( $k !== $next ) return true;
      $next++;
   }
   return false;
}
?>

and the modified (alex's is_assoc) version

<?php
function is_assoc($_array) {
    if ( !is_array($_array) || empty($array) ) {
        return -1;
    }
    foreach (array_keys($_array) as $k => $v) {
        if ($k !== $v) {
            return true;
        }
    }
    return false;
}
?>
alex frase 16-Jul-2008 08:05
Yet another simpler, faster is_assoc():

<?php
function is_assoc($array) {
  foreach (array_keys($array) as $k => $v) {
    if ($k !== $v)
      return true;
  }
  return false;
}
?>

In my tests it runs about twice as fast as Michael/Gabriel's array_reduce() method.

(Speaking of which: Gabriel's version doesn't work as written; it reports associative arrays as numeric if only the first key is non-numeric, or if the keys are numeric but ordered backwards.  Michael solves this problem by comparing array_reduce() to count(), but that costs another function call; it also works to just compare to -1 instead of 0, and therefore return -1 as the ternary else from the callback).
Michael 11-Sep-2007 12:37
A slight modification of what's below:

<?php

function is_assoc($array)
{
    return is_array($array) && count($array) !== array_reduce(array_keys($array), 'is_assoc_callback', 0);
}

function is_assoc_callback($a, $b)
{
    return $a === $b ? $a + 1 : 0;
}

?>
gabriel at bumpt dot nothing-here dot net 29-Aug-2007 08:34
Yet another safer, faster way of detecting whether an array is associative.

The principle is: using array reduction on the keys, we verify that each key is numeric and is equal to its rank.

Beware: integer keys that are not in sequence, or are negative, or with "holes", still make an associative array.

<?php
/**
  * @param array $arr
  * @returns boolean
  */
function isNotAssocArray($arr)
{
    return (0 !== array_reduce(
        array_keys($arr),
        create_function('$a, $b', 'return ($b === $a ? $a + 1 : 0);'),
        0
        )
    );
}
?>

Of course, it is still faster if the callback for array_reduce is not an anonymous function:

<?php
function callbackReduceNotArray($a, $b)
{
    return ($b === $a ? $a + 1 : 0);
}
function isVector($arr)
{
    return (0 !== array_reduce(
        array_keys($arr),
        'callbackReduceNotArray',
        0
        )
    );
}
?>
Alfred J Fazio <alfred dot fazio at gmail dot com> 04-Apr-2007 04:32
Yet another associative array test:

<?php
function binary_nand ($a, $b) { return !$a && !$b; }
function binary_nor ($a, $b)  { return !$a || !$b; }

// Returns true if array has elements with non-numeric keys
function is_associative_array ($arr) {
  return is_array($arr) && !empty($arr) && array_reduce(array_map("is_numeric", array_keys($arr)), "binary_nor", true);
}

// Returns true if all elements of array have a non-numeric key
function is_strict_associative_array ($arr) {
  return is_array($arr) && !empty($arr) && array_reduce(array_map("is_numeric", array_keys($arr)), "binary_nand", false);
}
?>
angelo [at] mandato <dot> com 26-Feb-2007 01:32
The is_associative_array() and is_sequential_array() functions posted by 'rjg4013 at rit dot edu' are not accurate.

The functions fail to recognize indexes that are not in sequence or in order.  For example, array(0=>'a', 2=>'b', 1=>'c') and array(0=>'a', 3=>'b', 5=>'c') would be considered as sequential arrays. A true sequential array would be in consecutive order with no gaps in the indices.

The following solution utilizes the array_merge properties. If only one array is given and the array is numerically indexed, the keys get re-indexed in a continuous way.  The result must match the array passed to it in order to truly be a numerically indexed (sequential) array.  Otherwise it can be assumed to be an associative array (something unobtainable in languages such as C).

The following functions will work for PHP >= 4.

<?php
    function is_sequential_array($var)
    {
        return (array_merge($var) === $var && is_numeric( implode( array_keys( $var ) ) ) );
    }

    function is_assoc_array($var)
    {
        return (array_merge($var) !== $var || !is_numeric( implode( array_keys( $var ) ) ) );
    }
?>

If you are not concerned about the actual order of the indices, you can change the comparison to == and != respectively.
jupiter at nospam dot com 29-May-2006 11:42
Will check a Multi-Dimentional Array to any specified level.  This is a fix to 11/16/05 submission, which would break since you must supply a foreach with an array. Beware recursive functions shouldn't go over 100 deep or could break the memory stack on server.

<?php
// checks for multiarray to defined depth level recursively
// original $level must be 2 or more, else will instantly return true
function isDeepMultiArray($multiarray, $level = 2) {  // default is simple multiarray
    if (is_array($multiarray)) {  // confirms array
        if ($level == 1) {  // $level reaches 1 after specified # of recursions
            return true;  // returns true to recursive function conditional
        }  // end conditional
        foreach ($multiarray as $array) {  // goes one level deeper into array
            if (isDeepMultiArray($array, $level - 1)) {  // check subarray
                $message = "I'm a multiarray";  // optional message
                return $message;  // best if $message = true so function returns boolean
            }  // end recursive function
        }  // end loop
    } else {  // not an array at specified level
    return false;  // is also used recursively so can't change to message
    }
}

if (isDeepMultiArray(array(array()), 2)); // beware this returns true eventhough arrays are empty

?>
BTW my notation is consistent with the PEAR manual on coding standards, which is what php.net says to follow. I hope a function like this gets included in PHP6.
jupiter at nospam dot com 29-May-2006 09:15
Simple check for a Multi-Dimentional Array of any depth
<?php
// checks for multiarray (2 or more levels deep)
function isMultiArray($multiarray) {
  if (is_array($multiarray)) {  // confirms array
    foreach ($multiarray as $array) {  // goes one level deeper
      if (is_array($array)) {  // is subarray an array
        return true;  // return will stop function
      }  // end 2nd check
    }  // end loop
  }  // end 1st check
  return false;  // not a multiarray if this far
}
?>
March 30-Mar-2006 06:28
And here is another variation for a function to test if an array is associative. Based on the idea by mot4h.

<?php
function is_associative($array)
{
  if (!is_array($array) || empty($array))
    return false;

  $keys = array_keys($array);
  return array_keys($keys) !== $keys;
}
?>
dan at cain dot sh 10-Dec-2004 05:05
is_array() under PHP 5.0.2 will return FALSE when passed an object descended from the internal class interface ArrayAccess(http://www.php.net/spl) even though said object behaves as an array would in most instances.

I've found the following user function helpful with my own classes and functions that expect array(s) as arguments, but work fine with objects that behave as an array would.

<?php
function is_array_abled(&$x)
{
    return (bool)($x instanceof ArrayAccess or is_array($x));
}
?>
vhermecz at ixpert dot hu 01-Apr-2004 04:58
Mike's function is quite cool, it is just the one, I was searching for. Using range is a great idea! But it's a bit long for me. Here is a shorter version:

<?php
function is_assoc_array($var) {
    if (!is_array($var)) {
        return false;
    }
    return array_keys($var)!==range(0,sizeof($var)-1);
}
?>

Or, if you don't want to type that much:

<?php
function is_assoc($var) {
    return is_array($var) && array_keys($var)!==range(0,sizeof($var)-1);
}
?>


Détermine si une variable est un booléen

  • « is_array
  • is_callable »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détermine si une variable est un booléen

is_bool

(PHP 4, PHP 5, PHP 7, PHP 8)

is_bool — Détermine si une variable est un booléen

Description

is_bool ( mixed $value ) : bool

is_bool() détermine si la variable donnée est un booléen.

Liste de paramètres

value

La variable à évaluer.

Valeurs de retour

Retourne true si value est un booléen, false sinon.

Exemples

Exemple #1 Exemple avec is_bool()

<?php
$a = false;
$b = 0;

// Si $a est un booléen, is_bool retournera true
if (is_bool($a) === true) {
    echo "Oui, c'est un booléen.";
}

// Si $b n'est pas un booléen, is_bool retournera false
if (is_bool($b) === false) {
    echo "Non, ce n'est pas un booléen.";
}
?>

Voir aussi

  • is_float() - Détermine si une variable est de type nombre décimal
  • is_int() - Détermine si une variable est de type nombre entier
  • is_string() - Détermine si une variable est de type chaîne de caractères
  • is_object() - Détermine si une variable est de type objet
  • is_array() - Détermine si une variable est un tableau

User Contributed Notes

Julio Marchi 08-Sep-2019 12:32
The function Michael Smith published doesn't do the work as it should.

To check if a variable is boolean is one thing, to evaluate if the value of a variable represents a boolean condition (true or false) is another.

Here a simple function that checks the status of the received variable in regards to boolean equivalencies (case insensitive).

<?php
/**
 * Check "Booleanic" Conditions :)
 *
 * @param  [mixed]  $variable  Can be anything (string, bol, integer, etc.)
 * @return [boolean]           Returns TRUE  for "1", "true", "on" and "yes"
 *                             Returns FALSE for "0", "false", "off" and "no"
 *                             Returns NULL otherwise.
 */
function is_enabled($variable)
{
    if (!isset($variable)) return null;
    return filter_var($variable, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
}
?>

Of course, it is a simplistic approach, but for the majority of cases it will do the job right.

And, just to put thing in the right perspective, here's a real function that does what Phill disclosed:

<?php
/**
 * Convert $variable to boolean (adapted from Phill answer)
 *
 * @param  [mixed]  $variable  Can be anything
 * @return [boolean]           Returns the booelan equivalent to $variable based on Zend Enegine interpretation
 */
function to_bool($variable)
{
    return (bool)$variable;
}
?>

I hope it helps someone. Happy coding.
phil 10-Jan-2019 06:21
It should be stated that this function returns true if the _type_ of it's argument is boolean. It does not convert or coerce the value to a boolean type, not sure why so many comments focus on how to do this.
However, if you arrived here looking for a solution to convert a value to a boolean type, use this:

to_bool($x) { return (bool)$x; }
Michael Smith 17-Nov-2013 01:17
The function in the last comment also converts the string 'false' to a true boolean. Here's a function that does what I think was intended:

<?php
function toBool($var) {
  if (!is_string($var)) return (bool) $var;
  switch (strtolower($var)) {
    case '1':
    case 'true':
    case 'on':
    case 'yes':
    case 'y':
      return true;
    default:
      return false;
  }
}


Détermine si l'argument peut être appelé comme fonction

  • « is_bool
  • is_countable »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détermine si l'argument peut être appelé comme fonction

is_callable

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

is_callable — Détermine si l'argument peut être appelé comme fonction

Description

is_callable ( mixed $value , bool $syntax_only = false , string &$callable_name = null ) : bool

Vérifie qu'une variable est un callable.

Liste de paramètres

value

La valeur à vérifier.

syntax_only

Si l'argument syntax_only vaut true, la fonction ne va vérifier que si value peut être une fonction ou une méthode. Il va simplement rejeter les variables qui ne sont pas des chaînes, ou des tableaux qui n'ont pas la bonne structure pour être utilisés comme fonction de rappel. Les tableaux valides sont supposés n'avoir que deux entrées, le premier étant un objet ou une chaîne, et le second une chaîne.

callable_name

L'argument callable_name reçoit le nom à utiliser. Dans l'exemple ci-dessous, il vaut "someClass::someMethod". Notez que, bien que someClass::someMethod() puisse être appelée sous forme statique, ce n'est pas le cas.

Valeurs de retour

Retourne true si value peut être appelé comme une fonction, false sinon.

Exemples

Exemple #1 Exemple avec is_callable()

<?php
//  Comment vérifier qu'une variable peut être appelée
//  comme fonction ?

//
//  Variable simple contenant une fonction
//

function someFunction()
{
}

$functionVariable = 'someFunction';

var_dump(is_callable($functionVariable, false, $callable_name));  // bool(true)

echo $callable_name, "\n";  // someFunction

//
//  Tableau contenant une méthode
//

class someClass {

  function someMethod()
  {
  }

}

$anObject = new someClass();

$methodVariable = array($anObject, 'someMethod');

var_dump(is_callable($methodVariable, true, $callable_name));  //  bool(true)

echo $callable_name, "\n";  //  someClass::someMethod

?>

Exemple #2 is_callable() et les constructeurs

Depuis PHP 5.3.0, is_callable() vérifie si un constructeur est appelable ou non. Ceci affecte les constructeurs style PHP 5 (__construct) mais aussi les constructeurs style PHP 4 (i.e. méthodes avec le même nom que la classe). Auparavant, les deux étaient considérés comme appelable.

<?php

class Foo
{
    public function __construct() {}
    public function foo() {}
}

var_dump(
    is_callable(array('Foo', '__construct')),
    is_callable(array('Foo', 'foo'))
);

L'exemple ci-dessus va afficher :

bool(false)
bool(false)

Voir aussi

  • function_exists() - Indique si une fonction est définie
  • method_exists() - Vérifie si la méthode existe pour une classe

User Contributed Notes

jlh 22-Mar-2019 09:28
The story about __call() is a bit more complicated unfortunately. It will always return true ONLY if you pass an instance of a class, not if you pass the class name itself:

<?php
class MyClass {
    public function method() { }
    public function __call($name, $arguments) { }
}

is_callable([MyClass::class, 'method']); // true
is_callable([new MyClass(), 'method']); // true
is_callable([MyClass::class, 'other']); // false!!!
is_callable([new MyClass(), 'other'])); // true
bienvenunet at yaho dot com 06-Mar-2018 10:29
It's not immediately evident from the content of the article, but implementing __invoke() makes an object callable.

<?php
class ObjectWithInvoke {
  public function __invoke() {}
}

$o = new ObjectWithInvoke();
if (is_callable($o)) echo "true"; else echo "false";
// echoes "true"
?>
roland at mxchange dot org 27-Feb-2017 10:17
Please note that the example at comment #104633 is no longer valid with PHP 7 as it seems to be fixed:

PHP 7.0.16-1~dotdeb+8.1

correctly outputs:
bool(true)
mikko dot rantalainen at peda dot net 03-Feb-2017 08:29
Some additional notes about the implementation (PHP 5.6):

- <?php is_callable(array("myclass", "f1")) ?> will return true even if myclass::f1() is not a static method. As such, even if is_callable() will return true, the method cannot be called.

- <?php is_callable(array($object, "f2")) ?> will return true even if $object->f2() cannot be called because of method visibility (e.g. f2() is private or protected).
heah at heahprod dot com 20-Apr-2016 11:48
I don't know if it is a bug but when you test an array with a class and method, is_callable returns true for non static method.

Consider the following code:
<?php

class A
{
    public static function test()
    {
        echo 'test', '<br>';
    }

    public function hello()
    {
        echo 'hello', '<br>';
    }
}

echo "Static #1: call_user_func(array('A', 'test')) => ", call_user_func(array('A', 'test')), '<br>';
echo 'expect is_callable TRUE => ',
    is_callable(array('A', 'test'))
        ? 'TRUE, A::test() is callable statically'
        : 'FALSE, A::test() is not callable statically',
    '<br><br>'
;

echo "Static #2: call_user_func(array('A', 'hello')) => ", call_user_func(array('A', 'hello')), '<br>';
echo 'expect is_callable FALSE => ',
    is_callable(array('A', 'hello'))
        ? 'TRUE, A::hello() is callable statically'
        : 'FALSE, A::hello() is not callable statically',
    '<br><br>'
;

$a = new A();

echo "Instance #1: call_user_func(array(\$a, 'test')) => ", call_user_func(array($a, 'test')), '<br>';
echo 'expect is_callable TRUE => ',
    is_callable(array($a, 'test'))
        ? 'TRUE, $a::test() is callable'
        : 'FALSE, $a::test() is not callable',
    '<br><br>'
;

echo "Instance #2: call_user_func(array(\$a, 'hello')) => ", call_user_func(array($a, 'hello')), '<br>';
echo 'expect is_callable FALSE => ',
    is_callable(array($a, 'hello'))
        ? 'TRUE, $a::hello() is callable'
        : 'FALSE, $a::hello() is not callable',
    '<br><br>'
;

?>

Will output:
Static #1: call_user_func(array('A', 'test')) => test

expect is_callable TRUE => TRUE, A::test() is callable statically

Static #2: call_user_func(array('A', 'hello')) =>
Strict Standards: call_user_func() expects parameter 1 to be a valid callback, non-static method A::hello() should not be called statically in test.php on line 24
hello

expect is_callable FALSE => TRUE, A::hello() is callable statically

Instance #1: call_user_func(array($a, 'test')) => test

expect is_callable TRUE => TRUE, $a::test() is callable

Instance #2: call_user_func(array($a, 'hello')) => hello

expect is_callable TRUE => TRUE, $a::hello() is callable

------------------------------------------------------------

Also note that this works the same for inherited methods (I read other posts suggesting otherwise), and that private methods (static, inherited or both) always return false in any case as expected.

Tested with php 5.6.20.
izharaazmi at gmail dot com 11-Jan-2016 06:50
If the target class has __call() magic function implemented, then is_callable will ALWAYS return TRUE for whatever method you call it.
is_callable does not evaluate your internal logic inside __call() implementation (and this is for good).
Therefore every method name is callable for such classes.

Hence it is WRONG to say (as someone said):
...is_callable will correctly determine the existence of methods made with __call...

Example:
<?php
class TestCallable
{
    public function testing()
    {
          return "I am called.";
    }

    public function __call($name, $args)
    {
        if($name == 'testingOther')
        {
                return call_user_func_array(array($this, 'testing'), $args);
        }
    }
}

$t = new TestCallable();
echo $t->testing();      // Output: I am called.
echo $t->testingOther(); // Output: I am called.
echo $t->working();      // Output: (null)

echo is_callable(array($t, 'testing'));       // Output: TRUE
echo is_callable(array($t, 'testingOther'));  // Output: TRUE
echo is_callable(array($t, 'working'));       // Output: TRUE, expected: FALSE
?>
ffalek at banfi dot pl 13-Mar-2015 05:42
Example how is_callable works:

<?php
$counter = 0;

class TestClassOne {
    function testMethod(){
        global $counter;
        return ++$counter;
    }
    static function testMethodStatic(){
        global $counter;
        return ++$counter;
    }
}

class TestClassTwo {
    function __invoke() {
        global $counter;
        return ++$counter;
    }
}

function test_function() {
    global $counter;
    return ++$counter;
}

$p1 = 'test_function';
$p2 = new TestClassOne();
$p3 = ['TestClassOne', 'testMethodStatic'];
$p4 = [new TestClassOne(), 'testMethod'];
$p5 = new TestClassTwo();
$p6 = function() {
    global $counter;
    return ++$counter;
};

foreach ([$p1, $p2, $p3, $p4, $p5, $p6] as $p) {
    if(is_callable($p)){
        echo 'is invokable: yes '.$p().PHP_EOL;
    } else {
        echo 'is invokable: no'.PHP_EOL;
    }
}
?>

And output is:

is invokable: yes 1
is invokable: no
is invokable: yes 2
is invokable: yes 3
is invokable: yes 4
is invokable: yes 5
wowkise at gmail dot com 07-Mar-2013 10:10
beware calling is_callable on class that has the same method name will return false, i filed a bug report to be included in function description as example

<?php
class test {
 function test() {
 }
}
$class = new test();
var_dump(is_callable([$class, 'test']));
?>

will return false
np dot liamg at gmail dot com 08-Dec-2012 01:52
is_callable() will try __autoload(), if have one.
Athari 13-May-2012 03:58
For closures, the function will return true and $callable_name will be set to "Closure::__invoke".
passivesmoking AT yahoo DOT com 07-Jan-2012 06:06
is_callable doesn't seem able to resolve namespaces.  If you're passing a string, then the string has to include the function's full namespace.

<?php
namespace foo\bar\baz;

function something ()
{
    return (42);
}

var_dump (is_callable ('something')); // false
var_dump (is_callable ('foo\bar\baz\something')); // true
?>

It's easy to forget, but if you just prepend __NAMESPACE__ to your function name strings you should be fine in most cases.
fgm at osinet dot fr 27-Jun-2011 05:03
Note that, for the purpose of this function, an abstract method, although necessarily non-callable since it does not have a body, is still considered to be callable:

<?php
abstract class Foo {
  abstract function bar();
}

echo is_callable(array('Foo', 'bar'));
// display: 1
?>
Andy at txtNation dot com 27-Jun-2011 03:50
Note that is_callable is aware of context, and you can ask it things like parent::__construct from within a child constructor

<?php

    class TestClass extends TestClassParent {

        /** @brief Object initialisation callback
            @returns void */
        public function __construct() {

            # do initialisation

            # ...

            # if we have a parent

            if(is_callable('parent::__construct')) {

                # then bubble up

                parent::__construct();
            }
        }
    }
?>
colin 03-Oct-2010 11:30
I haven't seen anyone note this before, but is_callable will correctly determine the existence of methods made with __call. The method_exists function will not.

Example:
<?php

class Test {

    public function testing($not = false) {
        $not = $not ? 'true' : 'false';
        echo "testing - not: $not<br/>";
    }

    public function __call($name, $args) {
        if(preg_match('/^not([A-Z]\w+)$/', $name, $matches)) {
            $fn_name = strtolower($matches[1]);
            if(method_exists($this, $fn_name)) {
                $args[] = true; // add NOT boolean to args
                return call_user_func_array(array($this, $matches[1]), $args);
            }
        }
        die("No method with name: $name<br/>");
    }

}

$t = new Test();
$t->testing();
$t->notTesting();

echo "exists: ".method_exists($t, 'notTesting').'<br/>';
echo "callable: ".is_callable(array($t, 'notTesting'));

?>

Output:

testing - not: false
testing - not: true
exists:
callable: 1
Constantin Kpplinger 10-Jun-2010 12:16
It seems the only issue left with is_callable() is the disable_functions ini-setting. Apart from that, is_callable() will reliably evaluate whether the passed function or method can be called from within the same context is_callable() was called from, taking visibility and inheritance into account. This includes functions, regular and static methods, magic functions and methods and implemented interfaces (which are regular methods within the implementing class anyway).

<?php
function regular_function() {}

abstract class ParentTest
{
    public function public_parent_method() {}
    protected function protected_parent_method() {}
    public static function static_method() {}
    protected static function protected_static_method() {}
}

class CallableTest extends ParentTest implements Countable
{
    public function __invoke() { } // Introduced in 5.3, see http://php.net/manual/language.oop5.magic.php
    protected function protected_method() { }
    public function is_callable($args)
    {
        return is_callable($args);
    }
    // Countable
    public function count()
    {
        return 1;
    }
}

$o = new CallableTest();

// Regular function:
var_dump(is_callable('regular_function')); // true

// Magic __invoke method:
var_dump(is_callable($o)); // true if PHP >= 5.3, false otherwise

// Countable implementation (regular method really):
var_dump(is_callable(array($o, 'count'))); // true

// Protected method from outside the object's scope:
var_dump(is_callable(array($o, 'protected_method'))); // false

// Protected method from inside the object's scope via public proxy method:
var_dump($o->is_callable(array($o, 'protected_method'))); // true

// Parent's public method
var_dump(is_callable(array($o, 'public_parent_method'))); // true

// Parent's protected method
var_dump(is_callable(array($o, 'protected_parent_method'))); // false

// Parent's protected method via proxy
var_dump($o->is_callable(array($o, 'protected_parent_method'))); // true

// Parent's static public method
var_dump(is_callable('CallableTest::static_method')); // true

// Parent's static protected method
var_dump(is_callable('CallableTest::protected_static_method')); // false

// Parent's static protected method via proxy
var_dump($o->is_callable('CallableTest::protected_static_method')); // true
?>

Tested PHP versions were 5.2.9 on openSUSE 10.3 (x64) and 5.3.1 on Windows Server 2003 (x86).
juand at softwarecubes dot com 21-Feb-2009 11:39
Revised function with static support:

<?php
    /**
    * The is_callable php function only considers methods declared in the class itself, and ignores the parent's.
    * This version considers all of the hierarchy.
    *
    * @param (string|Object) $class_name
    * @param string $method_name
    * @param bool $static the method being tested is static.
    */
    public static function isCallable( $class_name, $method_name, $static = false ){

        if( !is_string( $class_name ) ){
            $class_name = get_class( $class_name );
        }

        // Define Callable
        if( $static ){
            $callable = "{$class_name}::{$method_name}";
        }else{
            $callable = array( $class_name, $method_name );
        }

        // Check class itself
            if( @is_callable( $callable ) === true ){
                if( $method_name == 'setEmailAddressTypeHash' ) {
                    ErrorHandler::preDump($callable);
                }
                return true;
            }

        // Check all parents
            while( $parent_class = get_parent_class( $class_name ) ){
                if( @is_callable( $callable ) === true ){
                    return true;
                }
                $class_name = $parent_class;
            }

        return false;
    }
?>
Rafael M. Salvioni 20-May-2008 09:10
The PHP's function is_callable not verify the visibility of the tested method.

The following function uses the Reflection classes of the PHP5 to check it.

<?php

/**
 * Function is_callback().
 *
 * @param mixed $var Var
 * @return bool
 */
function is_callback($var)
{
    if (is_array($var) && count($var) == 2) {
        $var = array_values($var);
        if ((!is_string($var[0]) && !is_object($var[0])) || (is_string($var[0]) && !class_exists($var[0]))) {
            return false;
        }
        $isObj = is_object($var[0]);
        $class = new ReflectionClass($isObj ? get_class($var[0]) : $var[0]);
        if ($class->isAbstract()) {
            return false;
        }
        try {
            $method = $class->getMethod($var[1]);
            if (!$method->isPublic() || $method->isAbstract()) {
                return false;
            }
            if (!$isObj && !$method->isStatic()) {
                return false;
            }
        } catch (ReflectionException $e) {
            return false;
        }
        return true;
    } elseif (is_string($var) && function_exists($var)) {
        return true;
    }
    return false;
}

?>
rahadotaboulfethatgmail.com 01-Mar-2008 04:44
is_callable generates an [E_STRICT] error if the  tested method cannot be called staticly. (and returns the good value)

I used @is_called
i'm using php 5.2.1
Quis strrev TA omicidio strrev TOD com 13-Nov-2007 03:50
is_callable() does _not_ check wheter this function is disabled by php.ini's disable_functions

use:

<?PHP
function is_disabled($function) {
  $disabled_functions=explode(',',ini_get('disable_functions'));
  return in_array($function, $disabled_functions);
}
?>

I`m running PHP 5.2.4
mw at NO-SPAM hire mason wolf dot com 19-Oct-2007 07:35
As empyone noted, early versions of php 5 incorrectly returned true if is_callable checked on a protected or private method. Later versions of php 5 will now only return true if the method is public and can be called externally. I do not know precisely when this behavior was changed, so you may have to test on your own. But sometime between 5.0.4, which empyone said he was using, and 5.2.4 where I tested it myself, the behavior was modified.
hcblue 24-Aug-2006 01:51
True that method_exists() is faster than is_callable(). However, is_callable() will be able to correctly recognize method calls handled by __call() in PHP 5, while method_exists() will not.
jphp at dsf dot org dot uk 12-Feb-2006 03:38
bob at theshirdshift:

"function_exists" doesn't do this, no, but "method_exists" works fine, and is still faster than is_callable:

<?php
function doTimes($start, $end)
  {
   $start_time = explode (" ", $start);
   $start_time = $start_time[1] + $start_time[0];
   $end_time = explode (" ", $end);
   $end_time = $end_time[1] + $end_time[0];
   $time = $end_time - $start_time;
   return $time;
  }

class test
  {
     function test()
     {
         return true;
     }
  }

$test = new test;

$callableIsTrue = false;
$startIsCallable = microtime();
for($i = 0; $i < 10000; $i++)
  {
     if(is_callable(array('test', 'test'))) { $callableIsTrue = true; }
  }
$endIsCallable = microtime();

$existsIsTrue = false;
$startExists = microtime();
for($i = 0; $i < 10000; $i++)
  {
     if(method_exists('test', 'test')) { $existsIsTrue = true; }
  }
$endExists = microtime();

$timeIsCallable = doTimes($startIsCallable, $endIsCallable);
$timeExists    = doTimes($startExists, $endExists);

echo "<b>is_callable = ".($callableIsTrue ? "TRUE" : "FALSE")."</b>, \n";
echo "<b>method_exists = ".($existsIsTrue ? "TRUE" : "FALSE")."</b><br>\n";

echo "<br>Did 10000 is_callables in ".$timeIsCallable." seconds";
echo "<br>Did 10000 method_exists in ".$timeExists." seconds";
?>

is_callable = TRUE, method_exists = TRUE

Did 10000 is_callables in 0.410346984863 seconds
Did 10000 method_exists in 0.175447940826 seconds
yetanotheruser at hotmail etc 15-Dec-2005 06:47
I have come across a strange oddity in versions around the 4.3.11 mark - I may have missunderstood the purpose of this function but hope this'll be helpful for some.

The point the code below is supposed to illustrate is that in some cases with

    <? $myFunc = Array( $myObj, 'myMethod' ); ?>

    <? is_callable( $myFunc, true, $callMe ); ?>

will return true, and give you $callMe set to myObj::myMethod but calling

    <? $callMe(); ?>

doesn't work... however calling

    <? $myFunc[0]->$myFunc[1](); ?>

seems to work fine..

... the reason all the code is down there is I think this oddity is due to how/the order in which I've instantiated my classes or something...

anyhow... HTH someone! :-)

Code follows:

FILE 1 :
<?
    include('myTools');

    $foo = new myClass();

    print $foo->getMySource();

    class myClass{

        var $flibble = 'wibble';

        function myClass(
            // Initialise loads of stuff.. including..
            $this->tools = new myTools();
        )

        function getMySource(){
            // This just returns the source.. ok, like some HTML to go into an email for example.
            // Some arguments;
            $args   = $this->flibble;
            // Call our Tool that returns the source..
            $source = $this->tools->returnSource( Array ( $this, 'someHTML' ), $args );
            // and return it..
            return ( $source );
        }

        function someHTML($args){
            // Leave PHP
            ?>
            Here is some HTML.. that we want to build outside a PHP block,
            possibly just cos it's tidier in <B>your favourite text editor</B>..
            .. or you want this function to be elsewhere.. for your designers
            to play with etc.. ... incidentally I'd like to say "<?=$args?>" etc.
            <?
            // .. and we're back.
        }
    }

?>

FILE 2:

<?
    /* OK - this is some other big library and a whole load more
       faff but this is the particular function in question... it
       just calls the function it's been asked to and uses an output
       buffer to grab the output and return it as a string rather than
       letting it go to terminal/browser.... useful for grabbing PHP pages
       for spidering, emailing etc. etc. etc..
    */

    class myTools(){

        function returnSource($func, $args){

            if ( is_callable ( $func, true, $callMe ){
                // Start a buffer
                ob_start();
                // Calling the function like this DOESN'T seem to work:
                // ~~~~~~~~
                // "Command not found : myClass::someHTML"
                // $callMe($args);
                // ~~~~~~~~
                // But - what I've discovered is that this behaves fine..
                if ( is_array($func) ){
                    $func[0]->$func[1]($args);
                } else {
                    $func($args);
                }
                // Then we just carry on with our code..
                $rtn =     ob_get_contents();
                ob_clean();
                return ( $rtn );
            } else {
                error_log("Doh!");
            }
        }
    }

?>
empyone at tiscalinet dot it 08-Nov-2005 12:41
To corey at eyewantmedia dot com:

your misunderstanding lies in passing in the naked $object parameter. It is correct for is_callable to return FALSE since you cannot 'call an object', you can only call one of its methods, but you don't specify which one. Hence:

is_callable(array($object, 'some_function'), [true or false], $callable_name)

will yield the correct result.

Notice, though, that a quick test I made (PHP 5.0.4) showed that is_callable incorrectly returns TRUE also if you specify the name of a protected/private method from outside of the context of the defining class, so, as wasti dot redl at gmx dot net pointed out, reflection is the way to go if you want to take visibility into account (which you should for true OOP, IMHO).
wasti dot redl at gmx dot net 09-Oct-2005 04:14
The way to discover whether a method exists in face of a __call is reflection.

It should be mentioned that although array('Test', 'func') is callable according to this function (where func is a public static method of Test), actually calling this construct as $fn() fails.
corey at eyewantmedia dot com 18-Mar-2005 03:39
I've been spending a month on and off trying to figure out why

is_callable($object, [true or false], $varContainingFunctionName)

returned false when it should not have (ie: $object->FunctionName() was callable), I realized I must have misunderstood its purpose. If you find yourself in the same situation, try

function_exists(string functionname)

or

method_exists ( object object, string method_name )

before you rip your hair out :)
mcroghan at digitalkeg dot com 10-Feb-2005 07:36
Be careful when using this function and __call (PHP5).  This function will always report true when using __call.

Need a specific function for the purpose of checking if a class method exists explicitly even when using __call.

Haven't ruled out the possibility of the existence of such a function yet.  So if someone knows of one, please point it out.
bob at thethirdshift dot net 23-Jun-2004 09:54
I, too, was wondering whether is_callable or function exists is faster when checking class methods.  So, I setup the following test:

<?php
function doTimes($start, $end)
  {
    $start_time = explode (" ", $start);
    $start_time = $start_time[1] + $start_time[0];
    $end_time = explode (" ", $end);
    $end_time = $end_time[1] + $end_time[0];
    $time = $end_time - $start_time;
    return $time;
  }

class test
  {
      function test()
      {
          return true;
      }
  }

$callableIsTrue = false;
$startIsCallable = microtime();
for($i = 0; $i < 10000; $i++)
  {
      if(is_callable(array('test', 'test'))) { $callableIsTrue = true; }
  }
$endIsCallable = microtime();

$existsIsTrue = false;
$startExists = microtime();
for($i = 0; $i < 10000; $i++)
  {
      if(function_exists('test::test')) { $existsIsTrue = true; }
  }
$endExists = microtime();

$timeIsCallable = doTimes($startIsCallable, $endIsCallable);
$timeExists     = doTimes($startExists, $endExists);

echo "<b>is_callable = ".($callableIsTrue ? "TRUE" : "FALSE")."</b>, \n";
echo "<b>function_exists = ".($existsIsTrue ? "TRUE" : "FALSE")."</b><br>\n";

echo "<br>Did 10000 is_callables in ".$timeIsCallable." seconds";
echo "<br>Did 10000 function_exists in ".$timeExists." seconds";
?>

This gives the output :

is_callable = TRUE, function_exists = FALSE

Did 10000 is_callables in 0.0640790462494 seconds
Did 10000 function_exists in 0.0304429531097 seconds

So the fact that function_exists is twice as fast is slightly over shadowed by the fact that it doesn't work on class methods, at least not as far as I can tell.


Vérifie si le contenu de la variable est une valeur dénombrable

  • « is_callable
  • is_double »
  • PHP Manual
  • Fonctions de gestion des variables
  • Vérifie si le contenu de la variable est une valeur dénombrable

is_countable

(PHP 7 >= 7.3.0, PHP 8)

is_countable — Vérifie si le contenu de la variable est une valeur dénombrable

Description

is_countable ( mixed $value ) : bool

Vérifie si le contenue de la variable est un tableau array ou un object qui implémente Countable

Liste de paramètres

value

La variable à vérifier

Valeurs de retour

Retourne true si value est dénombrable, false sinon.

Historique

Version | Description
7.3.0 | is_countable() a été ajouté.

Exemples

Exemple #1 Exemples avec is_countable()

<?php
var_dump(is_countable([1, 2, 3])); // bool(true)
var_dump(is_countable(new ArrayIterator(['foo', 'bar', 'baz']))); // bool(true)
var_dump(is_countable(new ArrayIterator())); // bool(true)
var_dump(is_countable(new stdClass())); // bool(false)

Voir aussi

  • is_array() - Détermine si une variable est un tableau
  • is_object() - Détermine si une variable est de type objet
  • is_iterable() - Détermine si le contenu de la variable est itérable.
  • is_bool() - Détermine si une variable est un booléen

User Contributed Notes

info at ensostudio dot ru 25-Oct-2020 06:29
Note: if is_countable() return true is does not guarantee that the it can be calculated recursively and correctly:
<?php
$iterator = new ArrayIterator(['one', 'two', new ArrayIterator(['three', 'four'])]);
var_dump(is_countable($iterator), count($iterator, COUNT_RECURSIVE));
// return TRUE and 3!
?>
Anonymous 25-Oct-2020 04:58
Fixed polyfill:
<?php
if (! function_exists('is_countable')) {
    /**
      * @param mixed $value The value to check
      * @return bool
      */
    function is_countable($value): bool
    {
        return is_array($value) || (is_object($value) && $value instanceof Countable);
    }
}
?>
renic 12-Jun-2019 08:33
be wary of using is_object($var) and assuming that the object has implemented Countable.  Not all objects are countable directly with count().
danmichaelo at gmail dot com 08-Apr-2019 08:33
Note that a polyfill for this method is also provided by the symfony/polyfill project.
deoomen 01-Apr-2019 11:58
Polyfill written by arisendrake is not quite good. It return FALSE when checking an Simple XML Node but count() works properly on PHP 7.1 and 7.3.
Better is this one:

<?php
if (version_compare(PHP_VERSION, "7.3") < 0 && !function_exists("is_countable")) {
    function is_countable($var): bool
    {
        return (is_array($var) || is_object($var) || is_iterable($var) || $var instanceof Countable);
    }
}
?>
info at arisendrake dot de 30-Aug-2018 11:10
If you are unable to upgrade to PHP 7.3 (not released at the time of writing), you can use this simple polyfill:

<?php
if (!function_exists('is_countable')) {
    function is_countable($var) {
        return (is_array($var) || $var instanceof Countable);
    }
}
?>


Alias de is_float

  • « is_countable
  • is_float »
  • PHP Manual
  • Fonctions de gestion des variables
  • Alias de is_float

is_double

(PHP 4, PHP 5, PHP 7, PHP 8)

is_double — Alias de is_float()

Description

Cette fonction est un alias de : is_float().

User Contributed Notes

There are no user contributed notes for this page.


Détermine si une variable est de type nombre décimal

  • « is_double
  • is_int »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détermine si une variable est de type nombre décimal

is_float

(PHP 4, PHP 5, PHP 7, PHP 8)

is_float — Détermine si une variable est de type nombre décimal

Description

is_float ( mixed $value ) : bool

Détermine si la variable donnée est de type nombre décimal.

Note:

Pour tester si une variable est un nombre ou une chaîne numérique (comme les entrées de formulaire, qui sont toujours des chaînes), vous devez utiliser la fonction is_numeric().

Liste de paramètres

value

La variable à évaluer.

Valeurs de retour

Retourne true si value est un nombre décimal, false sinon.

Exemples

Exemple #1 Exemple avec is_float()

<?php
var_dump(is_float(27.25));
var_dump(is_float('abc'));
var_dump(is_float(23));
var_dump(is_float(23.5));
var_dump(is_float(1e7));  //Notation Scientifique
var_dump(is_float(true));
?>

L'exemple ci-dessus va afficher :

bool(true)
bool(false)
bool(false)
bool(true)
bool(true)
bool(false)

Voir aussi

  • is_bool() - Détermine si une variable est un booléen
  • is_int() - Détermine si une variable est de type nombre entier
  • is_numeric() - Détermine si une variable est un nombre ou une chaîne numérique
  • is_string() - Détermine si une variable est de type chaîne de caractères
  • is_array() - Détermine si une variable est un tableau
  • is_object() - Détermine si une variable est de type objet

User Contributed Notes

Anonymous 28-Jan-2021 10:38
is_float() returns true for NAN, INF and -INF. You may want to test is_float($value) && is_finite($value), or alternatively filter_var($value, FILTER_VALIDATE_FLOAT) !== false.
ivan dot maruca at gmail dot com 19-Oct-2015 11:31
check if string/numeric is float or not :

<?php
function isFloat($value){
  return ((int)$value != $value) ;
}

isFloat('1.5') ;//return true
isFloat('15');//return false
isFloat('1e16');//return true
isFloat('foo');//return false
isFloat(5.98);//return true
isFloat(5);//return false
?>
Erutan409 at Hotmail dot com 19-May-2015 02:37
Boylett's solution is elegant (http://php.net/manual/en/function.is-float.php#85848), but won't work for long float's or variables that are not explicitly type of 'string' or for long floats that are encased in quotes, making it a string that will be truncated/rounded when cast to a float.  So, further logic must be completed to test for the case.  Take the following example:

<?php

if (!function_exists("test_float")) {

    function test_float($test) {

        if (!is_scalar($test)) {return false;}

        $type = gettype($test);

        if ($type === "float") {
            return true;
        } else {
            return preg_match("/^\\d+\\.\\d+$/", $test) === 1;
        }

    }

}

$test = "3.14159265358979323846264338g32795";

var_dump($test);
var_dump((float)$test);
var_dump($test == (string)(float)$test);
var_dump(test_float($test));

?>

Will produce (32-bit):

string(34) "3.14159265358979323846264338g32795"
float(3.1415926535898)
bool(false)
bool(false)

So far, so good, right?  Yeah, but it's misleading, because the string is so long, that when it's converted to a float, it won't be equivalent to the comparison of the value being cast back into a string .  So the aforementioned short function works.  Look at this next example:

<?php

$test = 3.1415926535897932384626433832795;

var_dump($test);
var_dump((float)$test);
var_dump($test == (string)(float)$test);
var_dump(test_float($test));

?>

Will produce (32-bit):

float(3.1415926535898)
float(3.1415926535898)
bool(false)
bool(true)

Why is it not working now, but the value is truly a float?  Same reasoning as mentioned before.  The float is so long that it's truncated/rounded and doesn't match the comparison being done with the short-hand function.

So, as you can see, more logic should be applied to the variable you're testing.
nonzer0value 26-Mar-2015 08:20
Coercing the value to float and back to string was a neat trick. You can also just add a literal 0 to whatever you're checking.

<?php
function isfloat($value) {
  // PHP automagically tries to coerce $value to a number
  return is_float($value + 0);
}
?>

Seems to work ok:

<?php
isfloat("5.0" + 0);  // true
isfloat("5.0");  // false
isfloat(5 + 0);  // false
isfloat(5.0 + 0);  // false
isfloat('a' + 0);  // false
?>

YMMV
KIVagant at gmail dot com 21-Aug-2012 12:04
Yet another regular expression for float in real life:

<?php
function isTrueFloat($val)
{
    $pattern = '/^[-+]?(((\\\\d+)\\\\.?(\\\\d+)?)|\\\\.\\\\d+)([eE]?[+-]?\\\\d+)?$/';

    return (!is_bool($val) && (is_float($val) || preg_match($pattern, trim($val))));
}
?>

// Matches:
1, -1, 1.0, -1.0, '1', '-1', '1.0', '-1.0', '2.1', '0', 0, ' 0 ', ' 0.1 ', ' -0.0 ', -0.0, 3., '-3.', '.27', .27, '-0', '+4', '1e2', '+1353.0316547', '13213.032468e-13465', '-8E+3', '-1354.98879e+37436'

// Non-matches:
false, true, '', '-', '.a', '-1.a', '.a', '.', '-.', '1+', '1.3+', 'a1', 'e.e', '-e-4', 'e2', '8e', '3,25'
Mitch 12-Jun-2012 08:27
Another RegEx for matching floats:
/^[+-]?(\d*\.\d+([eE]?[+-]?\d+)?|\d+[eE][+-]?\d+)$/

Matches:
1e2
+1353.0316547
13213.032468e-13465
-8E+3
-1354.98879e+37436

Non-matches:
8
e2
-e-4
E
asdf.safd
8e

Enjoy.
Boylett 20-Sep-2008 09:29
If you want to test whether a string is containing a float, rather than if a variable is a float, you can use this simple little function:

function isfloat($f) return ($f == (string)(float)$f);
ckelley at the ca - cycleworks dot com 14-Jul-2008 03:39
Personally, I use an implicit cast:

if( is_float($value+1) ){
    $value=sprintf("%.2f",$value);
}

Which turns 22.0000000 query result into 22.00 for display to users.
kshegunov at gmail dot com 31-Mar-2008 01:32
As celelibi at gmail dot com stated, is_float checks ONLY the type of the variable not the data it holds!

If you want to check if string represent a floating point value use the following regular expression and not is_float(),
or poorly written custom functions.

/^[+-]?(([0-9]+)|([0-9]*\.[0-9]+|[0-9]+\.[0-9]*)|
(([0-9]+|([0-9]*\.[0-9]+|[0-9]+\.[0-9]*))[eE][+-]?[0-9]+))$/
phper 25-Jan-2006 12:08
A better way to check for a certain number of decimal places is to use :

$num_dec_places = 2;
number_format($value,$num_dec_places);


Détermine si une variable est de type nombre entier

  • « is_float
  • is_integer »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détermine si une variable est de type nombre entier

is_int

(PHP 4, PHP 5, PHP 7, PHP 8)

is_int — Détermine si une variable est de type nombre entier

Description

is_int ( mixed $value ) : bool

Détermine si la variable donnée est de type nombre entier.

Note:

Pour tester si une variable est un nombre ou une chaîne numérique (comme les entrées de formulaire, qui sont toujours des chaînes), vous devez utiliser la fonction is_numeric().

Liste de paramètres

value

La variable à évaluer.

Valeurs de retour

Retourne true si value est un entier, false sinon.

Exemples

Exemple #1 Exemple avec is_int()

<?php
$values = array(23, "23", 23.5, "23.5", null, true, false);
foreach ($values as $value) {
    echo "is_int(";
    var_export($value);
    echo ") = ";
    var_dump(is_int($value));
}
?>

L'exemple ci-dessus va afficher :

is_int(23) = bool(true)
is_int('23') = bool(false)
is_int(23.5) = bool(false)
is_int('23.5') = bool(false)
is_int(NULL) = bool(false)
is_int(true) = bool(false)
is_int(false) = bool(false)

Voir aussi

  • is_bool() - Détermine si une variable est un booléen
  • is_float() - Détermine si une variable est de type nombre décimal
  • is_numeric() - Détermine si une variable est un nombre ou une chaîne numérique
  • is_string() - Détermine si une variable est de type chaîne de caractères
  • is_array() - Détermine si une variable est un tableau
  • is_object() - Détermine si une variable est de type objet

User Contributed Notes

lksunny at live dot hk 24-Aug-2017 09:19
<?
function check_num($num){
    if (preg_match("#^(-[0-9]{1,}|[0-9]{1,})$#", $num)){
        return true;
    }else{
        return false;
    }
}
var_dump(-1); //True
var_dump("-1"); //True
var_dump("1"); //True
var_dump("-999999999999999999"); //True
var_dump("999999999999999999"); //True
?>

negative number will be true :)
Hector (hector-ordonez.com) 25-Jul-2016 12:00
Simon Neaves's answer is incomplete: negative integers will return false.

I recommend checking stackoverflow's answers:
http://stackoverflow.com/questions/6416763/checking-if-a-variable-is-an-integer-in-php
Vasiliy Makogon 08-Apr-2016 10:10
If you want detect integer of float values, which presents as pure int or float, and presents as string values, use this functions:

<?php
function isInteger($val)
{
    if (!is_scalar($val) || is_bool($val)) {
        return false;
    }
    if (is_float($val + 0) && ($val + 0) > PHP_INT_MAX) {
        return false;
    }
    return is_float($val) ? false : preg_match('~^((:?+|-)?[0-9]+)$~', $val);
}

function isFloat($val)
{
    if (!is_scalar($val)) {
        return false;
    }
    return is_float($val + 0);
}

foreach ([
    '11111111111111111', 11111111111111111, // > PHP_INT_MAX - presents in PHP as float
    1, '10', '+1', '1.1', 1.1, .2, 2., '.2', '2.',
    '-2.', '-.2', null, [], true, false, 'string'
] as $value) {
    echo $value . ':' . gettype($value) . ' is Integer? - '  . (isInteger($value) ? 'yes' : 'no') . PHP_EOL;
    echo $value . ':' . gettype($value) . ' is Float? - '  . (isFloat($value) ? 'yes' : 'no') . PHP_EOL;
}
?>
davide dot renzi at gmail dot com 16-Dec-2015 12:32
I've found a faster way of determining an integer.
On my env, this method takes about half the time of using is_int().

Cast the value then check if it is identical to the original.

<?php
if ( (int) $n !== $n ) {
    echo 'not is int';
} else {
    echo 'is int';
}
?>
PHPDev esurf er s >dot 15-Apr-2015 02:32
This will check if something has an acceptable integer value, such as

a string with int value like "1" or "1.0"
a float with int value like 1.0
an int like 12e5

The same as is_numeric, but with integer values.

<?php

    function isIntValued($var) {
        if(is_numeric($var)) {
            $var=(float)$var;
            return ((float)(int)$var)===$var;
        }
        return FALSE;
    }

?>
felix dot b at outlook dot com 16-Mar-2015 02:13
((int)$foo === $foo) does exactly the same as is_int($foo), but is faster performancewise, because PHP has quite an overhead on function calls.

As you can see the expression only returns true if the type (and value) of $foo is the same as int-casted $foo, which is only the case when foo is an int.

This applies to all the other is* functions aswell.
Anonymous 07-Mar-2015 04:20
Sometimes, we need to validate if a DECIMAL returned by a SQL database is an int or not. DECIMAL always return .000 at end of the string.

Then i use:
<?php
function isInteger($input){
{
    if(strpos($input,"."))
        $input=preg_replace("/\.$/","",rtrim(strval($input),"0"));
    return (ctype_digit($input));
}
?>
ing dot alpi at gmail dot com 18-Sep-2013 03:18
Remember that some source of data always give a string data type.
That's the case with cookies and $_GET.
if you need to check against those values, try to convert them into numbers first.
The easiest way of doing so is adding a zero before your var, just like:

<?php
$var = '15'; // ...or $var = $_COOKIE['myvar'] or $var =
$_GET['myvar']...

is_int($var);  // now returns FALSE

$var += 0;

is_int($var);  // now returns TRUE
?>
some at somewhere dot com 02-Jul-2013 03:35
<?php
// check if input is a valid number
// first number must be 1 thru 9, followed by a number 0-9, no decimals
// true for "1", "1000"
// false for "01", "-1", "1.2"
function isInteger($input){
  return preg_match('@^[1-9][0-9]*$@',$input) === 1;
}
?>
petepostma at gmail dot spam dot com 17-Jul-2012 06:38
There is a versa to the vice of this int only type check.

is_int( $integer_type) will only return true, if the TYPE is int, not the value
ctype_digit( $string_type) will only return true if the TYPE is string, and its value is INT

therefore:
 return ( is_int($value) || ctype_digit($value) );
nicolas dot giraud at actiane dot com 27-Jun-2012 09:24
Just a shorter way to check if your variable is an int or a string containing a int without others digit than 0 to 9 :

<?php
$bool = ( !is_int($value) ? (ctype_digit($value)) : true );

$value = 42; //true
$value = '42'; //true
$value = '1e9'; //false
$value = '0155'; //true
$value = 0155; //true
$value = 0xFF; //true while it's just the same as 255
$value = '0xFF'; //false
$value = 'a'; //false
$value = array(); //false
$value = array('5'); //false
$value = array(5); false
$value = ''; //false
$value = NULL; //false

?>

Short & cool :)
arturs at indigo dot lv 04-May-2012 11:31
Sometime needed check if string containing numbers is integer or not. Then I created this small function:
<?php
function is_integer2($v) {
  $i = intval($v);
  if ("$i" == "$v") {
    return TRUE;
  } else {
    return FALSE;
  }
}
?>
andre dot roesti at 7flex dot net 27-Jul-2010 05:51
With this function you can check if every of multiple variables are int. This is a little more comfortable than writing 'is_int' for every variable you've got.

<?php
function are_int ( ) {
    $args = func_get_args ();
    foreach ( $args as $arg )
        if ( ! is_int ( $arg ) )
            return false;
    return true;
}

// Example:
are_int ( 4, 9 ); // true
are_int ( 22, 08, 'foo' ); // false
?>
Robin 27-Mar-2010 08:22
Keep in mind that is_int() operates in signed fashion, not unsigned, and is limited to the word size of the environment php is running in.

In a 32-bit environment:

<?php
is_int( 2147483647 );           // true
is_int( 2147483648 );           // false
is_int( 9223372036854775807 );  // false
is_int( 9223372036854775808 );  // false
?>

In a 64-bit environment:

<?php
is_int( 2147483647 );           // true
is_int( 2147483648 );           // true
is_int( 9223372036854775807 );  // true
is_int( 9223372036854775808 );  // false
?>

If you find yourself deployed in a 32-bit environment where you are required to deal with numeric confirmation of integers (and integers only) potentially breaching the 32-bit span, you can combine is_int() with is_float() to guarantee a cover of the full, signed 64-bit span:

<?php
$small = 2147483647;         // will always be true for is_int(), but never for is_float()
$big = 9223372036854775807;  // will only be true for is_int() in a 64-bit environment

if( is_int($small) || is_float($small) );  // passes in a 32-bit environment
if( is_int($big) || is_float($big) );      // passes in a 32-bit environment
?>
thierryreeuwijk at hotmail dot com 14-Jan-2010 02:04
If you only want integer values like 23 or 0155, or form/string integer values like "23" or "0155" to be valid, this should work just fine.

<?php

    function int($int){

        // First check if it's a numeric value as either a string or number
        if(is_numeric($int) === TRUE){

            // It's a number, but it has to be an integer
            if((int)$int == $int){

                return TRUE;

            // It's a number, but not an integer, so we fail
            }else{

                return FALSE;
            }

        // Not a number
        }else{

            return FALSE;
        }
    }

    print("155".int(155)."<br>");
    print("15.5".int(15.5)."<br>");
    print("\"155\"".int("155")."<br>");
    print("\"15.5\"".int("15.5")."<br>");
    print("\"0155\"".int("0155")."<br>");
    print("\"I'm 155\"".int("I'm 155")."<br>");
    print("\"test\"".int("test")."<br>");
    print("\"\"".int(""));
?>

The above returns:

155        TRUE
15.5       FALSE
"155"      TRUE
"15.5"     FALSE
"0155"     TRUE
"I'm 155"  FALSE
"test"     FALSE
""         FALSE
me at rexxars dot com 16-Sep-2009 05:23
I was looking for the fastest way to check for an unsigned integer which supported large numbers like 4318943448871348 or 0xFFFFFFFF.

Fastest I came up with is this:
<?php
function is_unsigned_int($val) {
    return ctype_digit((string) $value));
}
?>

Will return true on 1515, 0xFFFFFFFF, '3515' and '1365158185855141'.
Will return false on 0.1515, '415.4134' and '-616'.

Be aware though, before PHP 5.1.0 this will return true on an empty string.

According to my benchmarks this is about 30% faster than the regex ^\d+$.
Roberto Rama 21-Jul-2009 11:39
Use this instead if you wanna know if a string is explicitly a number:

<?php

function isint( $mixed )
{
    return ( preg_match( '/^\d*$/'  , $mixed) == 1 );
}

var_export( isint( '123' ) ); //This will return true

var_export( isint( 123 ) ); //This will return true

var_export( isint( 'asd' ) ); //This will return false

var_export( isint( '123asd123' ) ); //This will return false

?>
e dot sand at elisand dot com 09-Apr-2009 08:27
Simon Neaves was close on explaining why his function is perfect choice for testing for an int (as possibly most people would need).  He made some errors on his ctype_digit() output though - possibly a typo, or maybe a bug in his version of PHP at the time.

The correct output for parts of his examples should be:

<?php
var_dump(ctype_digit(23)); //bool(false)
var_dump(ctype_digit("23")); //bool(true)
var_dump(ctype_digit(23.5)); //bool(false)
var_dump(ctype_digit(NULL)); //bool(false)
var_dump(ctype_digit("")); //bool(false)
?>

As you can see, the reason why using *just* ctype_digit() may not always work is because it only returns TRUE when given a string as input - given a number value and it returns FALSE (which may be unexpected).
leonix at motd dot ru 16-Dec-2008 12:08
another_is_int() is almost perfect, but it treats boolean true as int because
1 == (int) true == (string) true == '1'.

Fixed version:

<?php
/**
 * Checks if the given value represents integer
 */
function int_ok($val)
{
    return ($val !== true) && ((string)(int) $val) === ((string) $val);
}
?>
paulo dot koch at g_mail dot com 17-Oct-2008 12:30
Don't over-engineer it.

<?php
function another_is_int($a){
    return ((string) $a) === ((string)(int) $a);
}
?>
Wryel Covo - ryryel[at]gmail[dot]com 14-Oct-2008 11:53
<?php
function onlyNumbers($string){
    //This function removes all characters other than numbers
    //Esta função limpa a url e conserva apenas os numeros
    $string = preg_replace("/[^0-9]/", "", $string);
    return (int) $string;
}

echo $test = onlyNumbers("as87d68a6db8a7d686dx8a6dx"); //2147483647
echo "<br/>";
echo onlyNumbers("xn89d9x797d9a8x7-"); //899797987
echo "<br/>";
if(is_int($test)){
    echo "Is int ! - É inteiro !"; // This OK !
} else {
    echo "Not int ! - Não é inteiro";
}
?>
mark at codedesigner dot nl 26-Jun-2008 06:34
updated version from Simon Neaves

<?php
function isInteger($input){
  return preg_match('@^[-]?[0-9]+$@',$input) === 1;
}
?>

this function checks if the string:
- starts with a - sign (optional)
- ends with 1 or more numeric chars
Julien Picalausa 11-May-2008 02:44
To check if a string ($s) is a representation of an integer (including representations is scientific notation and negative numbers), you can use the following test, provided that you don't expect values that are out of bounds for an integer.

is_numeric($s) && floatval($s) == intval(floatval($s))

If the test returns true, the string is a representation of an integer.
is_numeric (if it works as intended) protects from strings that are not proper numbers.
The comparison filters anything that is non_integer

If, for performance reasons, you want to avoid converting to float twice, it can also be written:
is_numeric($s) && ($f = floatval($s)) == intval($f)

If you plan to get values that cannot be representated with an integer and are ready to deal with a float, you can use floor instead of intval, as long as you are ready to deal with floats. Even so, that method will become unreliable when the precision of the float becomes insufficient for getting to the fractional part of the number
Simon Neaves 29-Apr-2008 11:14
I've found that both that is_int and ctype_digit don't behave quite as I'd expect, so I made a simple function called isInteger which does. I hope somebody finds it useful.

<?php
function isInteger($input){
    return(ctype_digit(strval($input)));
}

var_dump(is_int(23)); //bool(true)
var_dump(is_int("23")); //bool(false)
var_dump(is_int(23.5)); //bool(false)
var_dump(is_int(NULL)); //bool(false)
var_dump(is_int("")); //bool(false)

var_dump(ctype_digit(23)); //bool(true)
var_dump(ctype_digit("23")); //bool(false)
var_dump(ctype_digit(23.5)); //bool(false)
var_dump(ctype_digit(NULL)); //bool(false)
var_dump(ctype_digit("")); //bool(true)

var_dump(isInteger(23)); //bool(true)
var_dump(isInteger("23")); //bool(true)
var_dump(isInteger(23.5)); //bool(false)
var_dump(isInteger(NULL)); //bool(false)
var_dump(isInteger("")); //bool(false)
?>
qlimmax at gmail dot com 07-Apr-2008 10:58
function is_natural($natural,$zero=true)
{
if(ctype_digit($natural))
{
    if($zero)
    {
        $natural_test=(int)$natural;
        if((string)$natural_test !== $natural) return false;
        else return true;
    }
    else return true;
}
else return false;
}

true for ("0","1","2","3",...) false for("-1","01","adS","#@!$%^&*-...","0.7","0,7", "0x12",...)
if $zero=false
true for("0","00","1","01",...) false("-1","#@!$%^&*-...","adS","0.7","0,7", "0x12",...)
tudor at tudorholton dot com 04-Jul-2007 06:27
Please note this from the Integer datatype page:

"The size of an integer is platform-dependent, although a maximum value of about two billion is the usual value (that's 32 bits signed). PHP does not support unsigned integers. Integer size can be determined from PHP_INT_SIZE, maximum value from PHP_INT_MAX since PHP 4.4.0 and PHP 5.0.5."

This is particularly important if you are doing validation of large keys or any number larger than 2,000,000,000 (e.g. telephone numbers)
Ender at soldat dot nl 16-Feb-2006 03:38
Be aware that is_numeric (mentioned in this article as the proper way to validate string numbers) also allows numbers in scientific and hexadecimal annotation. Thus DO NOT USE that function to validate user input that will be used as id number for in a query for example, this could cause mysql errors. Use ctype_digit instead.
ludvig dot ericson at gmail dot com 06-Jan-2006 01:00
I would like to say that is_int() is pretty helpfull when looking for neat proper ways to check functions that return either integers or booleans (false) on failure (strpos, socket_select, etc.)
<?php
function mySelect() {
    global $someSockets;
    $ret = socket_select($someSockets, $o = array(), $e = array(), 0);
    if (!$ret)
        return is_int($ret);
    /* FURTHER PROCESSING HERE */
    return true;    // Return true if the function proceeded as expected.
}
?>
The point of doing this is that if you put this in a while() loopo, you'll break it when the select fails.
<?php
while (mySelect());
?>

Hope you get the point
 - toxik
lclkk at urbanvagabond dot net 15-Sep-2003 07:24
I think the function below is a robust test for integers working on all datatypes. It works by first checking that a number can be evaluated numerically, and then secondly that the integer evaluation matches the original number.

Test cases are included.

<?
function myIsInt ($x) {
    return (is_numeric($x) ? intval($x) == $x : false);
}

function Test($x) {
    echo "$x is " . ( myIsInt($x) ? ('an integer. The integer value is ' . intval($x)) : 'not an integer.');
    echo "\n";
}

echo "These should be integers...\n";
Test(1);
Test(5);
Test(10);
Test(10.0);
Test(20.0);
Test(-20.0);
Test(0+4+4.5+4.5);
Test("10.0");
Test("+14");
Test("-15");
Test("0");

echo "\nThese should not be integers...\n";
Test(true); // watch out, this displays as '1'
Test(false);
Test("moose");
Test("3.5");
Test("-214235.5");
Test(""); // empty string
Test(array(1,2,3));
Test(dir('.')); // object
Test(null);
?>
gabe at websaviour dot com 14-Jul-2003 11:08
Although this can be inferred from the documentation, beware of numeric strings.  I ran into the problem in a MySQL app where I would either SELECT an INT PRIMARY KEY or INSERT a new record and use mysql_insert_id() to get the KEY before continuing onto the new section.

I used is_int() to make sure the subsequent queries wouldn't break when using the key variable.  Unfortunately I failed to realize that while mysql_insert_id() returns an int, mysql_result() always returns a string even if you are SELECTing from an INT field.

Spent at least 30 minutes trying to figure out why existing records weren't getting linked, but new records would link fine.  I ended up using intval() on mysql_result() to make sure subsequent queries still always work.


Alias de is_int

  • « is_int
  • is_iterable »
  • PHP Manual
  • Fonctions de gestion des variables
  • Alias de is_int

is_integer

(PHP 4, PHP 5, PHP 7, PHP 8)

is_integer — Alias de is_int()

Description

Cette fonction est un alias de : is_int().

User Contributed Notes

ru dot mahmoud at mail dot ru 17-Jan-2019 08:05
using function :

if(is_integer($_POST[mobile_number])){
 return true; //// 0-9
}else{
 echo "Wrong number";
return false;
}
gldbrzent at gmail dot com 24-Sep-2017 07:37
There are two different functions.  But, the reason why is beyond the scope of this article!
being dot juan at icloud dot com 26-Jul-2017 05:07
There is no difference, per se. is_integer() is an alias of is_int().


Détermine si le contenu de la variable est itérable.

  • « is_integer
  • is_long »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détermine si le contenu de la variable est itérable.

is_iterable

(PHP 7 >= 7.1.0, PHP 8)

is_iterable — Détermine si le contenu de la variable est itérable.

Description

is_iterable ( mixed $value ) : bool

Vérifie que le contenu de la variable est accepté par le pseudo-type iterable, c'est-à-dire qu'il s'agit soit d'un array ou un objet qui implémente l'interface Traversable

Liste de paramètres

value

La valeur à vérifier

Valeurs de retour

Retourne true si value est itérable, false sinon.

Exemples

Exemple #1 Exemples avec is_iterable()

<?php

var_dump(is_iterable([1, 2, 3]));  // bool(true)
var_dump(is_iterable(new ArrayIterator([1, 2, 3])));  // bool(true)
var_dump(is_iterable((function () { yield 1; })()));  // bool(true)
var_dump(is_iterable(1));  // bool(false)
var_dump(is_iterable(new stdClass()));  // bool(false)

?>

Voir aussi

  • is_array() - Détermine si une variable est un tableau

User Contributed Notes

mopsyd at me dot com 01-Apr-2018 04:24
A slight correction to brcontainer's polyfill, which prevents errors on a non-object in a non-blocking way, and also corrects the issue of  the conditional checking "file_exists" instead of the correct "function_exists":

if ( !function_exists(  'is_iterable' ) )
{

    function is_iterable( $obj )
    {
        return is_array( $obj ) || ( is_object( $obj ) && ( $obj instanceof \Traversable ) );
    }

}

The original answer would not have resolved correctly, because it was looking for a file instead of a function, and the provided method would error if given a non-iterable non-object value such as false.
brcontainer at yahoo dot com dot br 09-Mar-2018 08:35
Polyfill for PHP5.6 and PHP7.0

    if (!file_exists('is_iterable')) {
        function is_iterable($obj)
        {
            return is_array($obj) || $obj instanceof \Traversable;
        }
    }
anatoly dot pashin at gmail dot com 01-Feb-2018 07:02
Here is more details on iterable type: http://php.net/manual/en/language.types.iterable.php


Alias de is_int

  • « is_iterable
  • is_null »
  • PHP Manual
  • Fonctions de gestion des variables
  • Alias de is_int

is_long

(PHP 4, PHP 5, PHP 7, PHP 8)

is_long — Alias de is_int()

Description

Cette fonction est un alias de : is_int().

User Contributed Notes

There are no user contributed notes for this page.


Indique si une variable vaut null

  • « is_long
  • is_numeric »
  • PHP Manual
  • Fonctions de gestion des variables
  • Indique si une variable vaut null

is_null

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

is_null — Indique si une variable vaut null

Description

is_null ( mixed $value ) : bool

Indique si la variable donnée vaut null.

Liste de paramètres

value

La variable à évaluer.

Valeurs de retour

Retourne true si value est null, false sinon.

Exemples

Exemple #1 Exemple avec is_null()

<?php

error_reporting(E_ALL);

$foo = NULL;
var_dump(is_null($inexistent), is_null($foo));

?>
Notice: Undefined variable: inexistent in ...
bool(true)
bool(true)

Voir aussi

  • Le type null
  • isset() - Détermine si une variable est déclarée et est différente de null
  • is_bool() - Détermine si une variable est un booléen
  • is_numeric() - Détermine si une variable est un nombre ou une chaîne numérique
  • is_float() - Détermine si une variable est de type nombre décimal
  • is_int() - Détermine si une variable est de type nombre entier
  • is_string() - Détermine si une variable est de type chaîne de caractères
  • is_object() - Détermine si une variable est de type objet
  • is_array() - Détermine si une variable est un tableau

User Contributed Notes

etimjoshua4 at gmail dot com 20-Jan-2021 05:09
I've found that for HTTP requests such as POST, is_null isn't the most reliable choice for checking if empty.

Try using

if(trim($var) == ""){
    // do something
}

instead.

I think the request does something to the input that makes it definitely not NULL.
contact dot 01834e2c at renegade334 dot me dot uk 25-May-2015 06:57
In PHP 7 (phpng), is_null is actually marginally faster than ===, although the performance difference between the two is far smaller.

PHP 5.5.9
is_null - float(2.2381200790405)
===     - float(1.0024659633636)
=== faster by ~100ns per call

PHP 7.0.0-dev (built: May 19 2015 10:16:06)
is_null - float(1.4121870994568)
===     - float(1.4577329158783)
is_null faster by ~5ns per call
normadize (a) gmail (d) com 07-Jul-2012 10:08
Using === NULL instead of is_null(), is actually useful in loaded server scenarios where you have hundreds or thousands of requests per second. Saving microseconds on a lot of "simple" operations in the entire PHP execution chain usually results in being able to serve more pages per second at the same speed, or lowering your cpu usage. People usually write very bad and slow code.
george at fauxpanels dot com 01-Dec-2008 01:58
See how php parses different values. $var is the variable.

$var        =    NULL    ""    0    "0"    1

strlen($var)    =    0    0    1    1    1
is_null($var)    =    TRUE    FALSE    FALSE    FALSE    FALSE
$var == ""    =    TRUE    TRUE    TRUE    FALSE    FALSE
!$var        =    TRUE    TRUE    TRUE    TRUE    FALSE
!is_null($var)    =    FALSE    TRUE    TRUE    TRUE    TRUE
$var != ""    =    FALSE    FALSE    FALSE    TRUE    TRUE
$var        =    FALSE    FALSE    FALSE    FALSE    TRUE

Peace!
Malfist 01-Jul-2008 07:54
Micro optimization isn't worth it.

You had to do it ten million times to notice a difference, a little more than 2 seconds

$a===NULL; Took: 1.2424390316s
 is_null($a); Took: 3.70693397522s

difference = 2.46449494362
difference/10,000,000 = 0.000000246449494362

The execution time difference between ===NULL and is_null is less than 250 nanoseconds. Go optimize something that matters.
strrev xc.noxeh@ellij 03-Jun-2008 05:42
$var===NULL is much faster than is_null($var) (with the same result)

I did some benchmarking with 10 million iterations:

$a=null;
 isset($a); Took: 1.71841216087s
 $a==NULL; Took: 1.27205181122s
 $a===NULL; Took: 1.2424390316s
 is_null($a); Took: 3.70693397522s
$a=5;
 isset($a); Took: 1.15165400505s
 $a==NULL; Took: 1.41901302338s
 $a===NULL; Took: 1.21655392647s
 is_null($a); Took: 3.78501200676s
error_reporting(E_ALL&~E_NOTICE);
unset($a);
 isset($a); Took: 1.51441502571s
 $a==NULL; Took: 16.5414860249s
 $a===NULL; Took: 16.1273870468s
 is_null($a); Took: 23.1918480396s

Please note, that isset is only included because it gives a good performance in any case; HOWEVER isset is NOT the same, or the opposite.
But you might be able to use isset() instead of null-checking.

You should not use is_null, except when you need a callback-function, or for conformity with is_int, is_float, etc.
ai dot unstmann at combase dot de 14-Jan-2008 12:17
For what I realized is that  is_null($var)  returns exactly the opposite of  isset($var) , except that is_null($var) throws a notice if $var hasn't been set yet.

the following will prove that:

<?php

$quirks = array(null, true, false, 0, 1, '', "\0", "unset");

foreach($quirks as $var) {
    if ($var === "unset") unset($var);

    echo is_null($var) ? 1 : 0;
    echo isset($var) ? 1 : 0;
    echo "\n";
}

?>

this will print out something like:

10    // null
01    // true
01    // false
01    // 0
01    // 1
01    // ''
01    // "\0"
Notice:  Undefined variable: var in /srv/www/htdocs/sandbox/null/nulltest.php on line 8
10    // (unset)

For the major quirky types/values is_null($var) obviously always returns the opposite of isset($var), and the notice clearly points out the faulty line with the is_null() statement. You might want to examine the return value of those functions in detail, but since both are specified to return boolean types there should be no doubt.

A second look into the PHP specs tells that is_null() checks whether a value is null or not. So, you may pass any VALUE to it, eg. the result of a function.
isset() on the other hand is supposed to check for a VARIABLE's existence, which makes it a language construct rather than a function. Its sole porpuse lies in that checking. Passing anything else will result in an error.

Knowing that, allows us to draw the following unlikely conclusion:

isset() as a language construct is way faster, more reliable and powerful than is_null() and should be prefered over is_null(), except for when you're directly passing a function's result, which is considered bad programming practice anyways.
michael at cannonbose dot com 30-Dec-2003 09:42
Regarding avoidance of NULLs in your MySQL queries, why not use  IS NULL and IS NOT NULL in your WHERE clauses.

SELECT *
FROM someDatabase
WHERE someAttribute IS NOT NULL

Cheers,

Michael
uioreanu at hotmail dot com 23-Mar-2001 06:36
Don't try to test
if ($intSomething==NULL) {
 ...
}
use is_null() instead.
The first statement misses 0 values.

Regards,
Calin

[Ed. note: this is because == tests for equivalence of value, but not type. NULL evaluates to
false, as does 0, so NULL == 0 is true--even though 0 is type int and NULL is type null.
You should use either is_null() as noted or ===, which returns true only if its operands are
equal and of the same type.]


Détermine si une variable est un nombre ou une chaîne numérique

  • « is_null
  • is_object »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détermine si une variable est un nombre ou une chaîne numérique

is_numeric

(PHP 4, PHP 5, PHP 7, PHP 8)

is_numeric — Détermine si une variable est un nombre ou une chaîne numérique

Description

is_numeric ( mixed $value ) : bool

Détermine si la variable donnée est un nombre ou une chaîne numérique.

Liste de paramètres

value

La variable à évaluer.

Valeurs de retour

Retourne true si value est un nombre ou une chaîne numérique, false sinon.

Exemples

Exemple #1 Exemple avec is_numeric()

<?php
$tests = array(
    "42",
    1337,
    0x539,
    02471,
    0b10100111001,
    1337e0,
    "0x539",
    "02471",
    "0b10100111001",
    "1337e0",
    "not numeric",
    array(),
    9.1,
    null
);

foreach ($tests as $element) {
    if (is_numeric($element)) {
        echo var_export($element, true) . " est numérique", PHP_EOL;
    } else {
        echo var_export($element, true) . " N'est PAS numérique", PHP_EOL;
    }
}
?>

L'exemple ci-dessus va afficher :

'42' est numérique
1337 est numérique
1337 est numérique
1337 est numérique
1337 est numérique
1337.0 est numérique
'0x539' N'est PAS numérique
'02471' est numérique
'0b10100111001' N'est PAS numérique
'1337e0' est numérique
'not numeric' N'est PAS numérique
array (
) N'est PAS numérique
9.1 est numérique
NULL N'est PAS numérique

Voir aussi

  • Les chaînes numérique
  • ctype_digit() - Vérifie qu'une chaîne est un entier
  • is_bool() - Détermine si une variable est un booléen
  • is_null() - Indique si une variable vaut null
  • is_float() - Détermine si une variable est de type nombre décimal
  • is_int() - Détermine si une variable est de type nombre entier
  • is_string() - Détermine si une variable est de type chaîne de caractères
  • is_object() - Détermine si une variable est de type objet
  • is_array() - Détermine si une variable est un tableau

User Contributed Notes

rds88 10-Mar-2021 01:46
Notice that not only are leading spaces valid, but pretty much all whitespace characters and any combination thereof seems to be valid.

Examples (999 is the actual number), verified in PHP 7.3.x:

%09999 - a leading horizontal tabulator followed by the number
%20999 - a leading space followed by the number
%09%20999 - a leading tab, followed by a space, followed by the number
orcinus 22-Aug-2019 09:37
This page is a hot mess.

The changes note states:

“7.0.0    Strings in hexadecimal (e.g. 0xf4c3b00c) notation are no longer regarded as numeric strings, i.e. is_numeric() returns FALSE now.”

Meanwhile, the description says:

“Hexadecimal (e.g. 0xf4c3b00c) *and binary* (e.g. 0b10100111001) notation is not allowed.”

And finally, the examples section claims both are TRUE for is_binary.
What the hell?
sandreas 21-Feb-2019 10:48
Note that strings with leading zeros containing only digits also return true on check with is_numeric, although they might be not a valid number. Example:

<?php
$x = 009; // this is invalid php code, 009 is not octal
$y = 007; // this is valid php code, 007 is octal
$z = 01.12; // this also is valid php code

var_dump(is_numeric("009")); // outputs true
var_dump(is_numeric("007")); // outputs true
var_dump(is_numeric("00.12")); // outputs true
?>
Ray.Paseur sometimes uses Gmail 19-Dec-2018 08:50
intval() appears to be helpful with hex strings:

<?php // is_hex_numeric.php
/**
 * PHP 7.0.0+ Strings in hexadecimal (e.g. 0xf4c3b00c) notation
 * are no longer regarded as numeric strings, i.e. is_numeric() returns FALSE now.
 * See: http://php.net/manual/en/function.intval.php
 */
error_reporting(E_ALL);

var_dump( PHP_VERSION );              // string(6) "7.1.25"
var_dump( PHP_INT_SIZE );             // int(8)

$x = 0xf4c3b00c;                      // --> Assignment of hex value
var_dump($x);                         // int(4106465292)
var_dump( is_numeric($x) );           // bool(true)

$y = '0x' . dechex($x);               // --> Convert hex value to a string
var_dump($y);                         // string(10) "0xf4c3b00c"
var_dump( is_numeric($y) );           // bool(false)

$z = intval($y, 0);                   // --> intval() with base zero recognizes hex notation
var_dump($z);                         // int(4106465292)
var_dump( is_numeric($z) );           // bool(true)
var_dump($x == $z);                   // bool(true)
phil at kiwilimon dot com 07-May-2018 04:43
There is another not documented big difference between PHP 5 and PHP 7:
is_numeric("45 "); // with a space at the end
will return true on PHP 5 and false on PHP 7
za at byza dot it 26-Sep-2017 02:21
To check if a numeric string is a valid integer or float number:

function is_valid_number($a) {
   return $a==(float)$a && strlen($a)==strlen((float)$a);
}

This returns false for "0012345" and true for "0.12345"
cottton 05-Feb-2017 02:20
As of http://php.net/manual/de/function.is-numeric.php#111709
' 12345' is considered numeric.

BUT '12345 ' NOT.

Test:
<?php
foreach (
    [
        ' 12345',
        '12345 ',
        ' 12345 ',
    ] as $value

) {
    echo "'{$value}'\t" . var_export(is_numeric($value), true) . PHP_EOL;
}
/**
 * Output:
 *
 *  ' 12345'        true
 *  '12345 '        false
 *  ' 12345 '       false
 */
?>
tanguy_barsik at hotmail dot com 03-Feb-2017 03:22
for strings, it return true only if float number has a dot

is_numeric( '42.1' )//true
is_numeric( '42,1' )//false
Vasiliy Makogon 08-Apr-2016 08:22
If you want detect integer of float values, which presents as pure int or float, and presents as string values, use this functions:

<?php
function isInteger($val)
{
    if (!is_scalar($val) || is_bool($val)) {
        return false;
    }
    if (is_float($val + 0) && ($val + 0) > PHP_INT_MAX) {
        return false;
    }
    return is_float($val) ? false : preg_match('~^((?:\+|-)?[0-9]+)$~', $val);
}

function isFloat($val)
{
    if (!is_scalar($val)) {
        return false;
    }
    return is_float($val + 0);
}

foreach ([
    '11111111111111111', 11111111111111111, // > PHP_INT_MAX - presents in PHP as float
    1, '10', '+1', '1.1', 1.1, .2, 2., '.2', '2.',
    '-2.', '-.2', null, [], true, false, 'string'
] as $value) {
    echo $value . ':' . gettype($value) . ' is Integer? - '  . (isInteger($value) ? 'yes' : 'no') . PHP_EOL;
    echo $value . ':' . gettype($value) . ' is Float? - '  . (isFloat($value) ? 'yes' : 'no') . PHP_EOL;
}
?>

Output:

11111111111111111:string is Integer? - no
11111111111111111:string is Float? - yes
1,1111111111111E+16:double is Integer? - no
1,1111111111111E+16:double is Float? - yes
1:integer is Integer? - yes
1:integer is Float? - no
10:string is Integer? - yes
10:string is Float? - no
+1:string is Integer? - yes
+1:string is Float? - no
1.1:string is Integer? - no
1.1:string is Float? - yes
1,1:double is Integer? - no
1,1:double is Float? - yes
0,2:double is Integer? - no
0,2:double is Float? - yes
2:double is Integer? - no
2:double is Float? - yes
.2:string is Integer? - no
.2:string is Float? - yes
2.:string is Integer? - no
2.:string is Float? - yes
-2.:string is Integer? - no
-2.:string is Float? - yes
-.2:string is Integer? - no
-.2:string is Float? - yes
:NULL is Integer? - no
:NULL is Float? - no
Array:array is Integer? - no
Array:array is Float? - no
1:boolean is Integer? - no
1:boolean is Float? - no
:boolean is Integer? - no
:boolean is Float? - no
string:string is Integer? - no
string:string is Float? - no
vikramverma214 at gmail dot com 26-Dec-2015 06:24
check if given string is mobile number

function filterNumber($str)
        {
            //remove non number
            $count = strlen($str);
            $newNumber = "";
            for($i = 0; $i<$count; $i++)
            {
                if(is_numeric($str[$i]))
                    $newNumber .= $str[$i];
            }

            //removes leading 0s
            $newNumber = ltrim($newNumber, '0');

            //remove 91 in starting, 91 is specific to Indian Numbers
            if(strlen($newNumber) == 12)
            {
                if(substr($newNumber, 0, 2) == '91')
                    $newNumber = substr($newNumber, 2);
            }

            //final check for length 10
            if(strlen($newNumber) != 10 )
                return null;
            else
                return $newNumber;
        }
lihatskiym at gmail dot com 30-Sep-2015 11:26
Check that value is whole numeric or is whole integer.
<?php
function whole_numeric($val)
{
    if (is_numeric($val)
        && floor($val) == $val)
    {
        if ((string)$val === (string)0)
            return true;
        elseif(ltrim((string)$val, '0') === (string)$val)
            return true;
    }

    return false;
}

function whole_int($val)
{
    $val = strval($val);
    $val = str_replace('-', '', $val);

    if (ctype_digit($val))
    {
        if ($val === (string)0)
            return true;
        elseif(ltrim($val, '0') === $val)
            return true;
    }

    return false;
}
?>

Result will be like this:

<?php
whole_numeric('-1.0');  // true
whole_numeric(0);        // true
whole_numeric('0');      // true
whole_numeric('00');     // false
whole_numeric(1);        // true
whole_numeric('1');      // true
whole_numeric('1.0');    // true
whole_numeric('1,0');    // false
whole_numeric('1.2');    // false
whole_numeric('001');    // false
whole_numeric(array()); // false

whole_int('-1.0');    // false
whole_int('-1');       // true
whole_int(0);          // true
whole_int('0');        // true
whole_int('00');      // false
whole_int(1);          // true
whole_int('1');         // true
whole_int('1.0');      // false
whole_int('1.2');      // false
whole_int('001');     // false
whole_int(array()); // false
?>
Tim Robert-Fitzgerald 26-Jun-2015 11:17
Be careful when using `is_numeric()` to validate user input and protect against SQL injection. According to wiki.hashphp.org,

"Many people reach for is_numeric() thinking this is a good approach, and it will seem to work just fine. However the problem with is_numeric() isn't that it can't detect an integer, it is that it detects a lot more than just integers. All of the following are valid numbers to is_numeric():

- 1
- 1.123
- 0xFF
- +0123.45e6

See the problem? If we really want just an integer, this function is too broad."

Source: http://wiki.hashphp.org/Validation#Why_is_numeric.28.29_is_bad
charlike dot mike at mail dot bg 03-Feb-2014 04:24
I think that is best check solution if u want to create real calculator for example :)

<?php
function is_number($var)
{
    if ($var == (string) (float) $var) {
        return (bool) is_numeric($var);
    }
    if ($var >= 0 && is_string($var) && !is_float($var)) {
        return (bool) ctype_digit($var);
    }
    return (bool) is_numeric($var);
}

is_number(12); // true
is_number(-12); // true
is_number(-12.2); // true
is_number("12"); // true
is_number("-124.3"); // true
is_number(0.8); // true
is_number("0.8"); // true
is_number(0); // true
is_number("0"); // true
is_number(NULL); // false
is_number(true); // false
is_number(false); // false
is_number("324jdas32"); // false
is_number("123-"); // false
is_number(1e7); // true
is_number("1e7"); // true
is_number(0x155); // true
is_number("0x155"); // false
?>
ben at chico dot com 07-Jan-2014 11:20
Apparently NAN (Not A Number) is a number for the sake of is_numeric().

<?php
echo "is ";
if (!is_numeric(NAN))
 echo "not ";
 echo "a number";
?>

Outputs "is a number". So something that is NOT a number (by defintion) is a number...
jsnell at e-normous dot com 19-Mar-2013 09:38
Note that this function handles leading spaces differently than is_int(), is_float(), is_real(), is_long(), and is_double().

is_numeric(" 12345") = true
is_int(" 12345") = false
is_float(" 12345") = false
is_real(" 12345") = false
is_long(" 12345") = false
is_double(" 12345") = false
jeffvanhees at gmail dot com 19-Jun-2012 05:20
Function for checking all the values in an array for being numeric:

<?php
function is_numeric_array($array) {
    foreach ($array as $key => $value) {
        if (!is_numeric($value)) return false;
    }
    return true;
}

$array_not_numeric = array('1', '2', 3, 'a'); // returns false
$array_numeric = array('1', '2', 3, 4); // returns true
?>
dave dot marr at gmail dot com 31-Jan-2012 04:30
If you want the numerical value of a string, this will return a float or int value:

<?php
function get_numeric($val) {
  if (is_numeric($val)) {
    return $val + 0;
  }
  return 0;
}
?>

Example:
<?php
get_numeric('3'); // int(3)
get_numeric('1.2'); // float(1.2)
get_numeric('3.0'); // float(3)
?>
akam at akameng dor com 22-Jan-2012 09:22
<?php
$d = @$_GET['d'];

/*
assuming that passing value of d in the mysql
$sql = "select * from books where bookid = '$d' "
*/

/*
now check if $d is numeric?
*/

if(!is_numeric($d)){
 $d = preg_replace("/[^0-9]+/", "", $d);
}
echo "Cleared value: $d \n<br />Original Vlaue:".@$_GET['d'];
//then using clear value of $d in the mysql query
$sql = "select * from books where bookid = '$d' ";
?>
Example:
?d=52;d;s;s'2233l'[[22

Outpt:

Cleared value: 52223322
Original Vlaue:52;d;s;s'2233l'[[22
sobolanx at gmail dot com 22-Jan-2011 03:55
Note that the function accepts extremely big numbers and correctly evaluates them.

For example:

<?php
    $v = is_numeric ('58635272821786587286382824657568871098287278276543219876543') ? true : false;

    var_dump ($v);
?>

The above script will output:

bool(true)

So this function is not intimidated by super-big numbers. I hope this helps someone.

PS: Also note that if you write is_numeric (45thg), this will generate a parse error (since the parameter is not enclosed between apostrophes or double quotes). Keep this in mind when you use this function.
Martyn Ranyard 10-Jan-2011 04:14
The documentation does not clarify what happens if you the input is an empty string - it correctly returns false in my experience.  Useful to state these odd cases, for when you see code that checks for an empty string and is_numeric, you can tell it's a waste of a comparison.
Nitrogen 11-Sep-2010 10:40
I find it a little weird that people are having issues with ordinal numbers, it's pretty easy..
Notes are in the commenting, check out the example outputs.

<?php

function ordinal($i='') {
  // a temporary value we can change, and keep the original value.
  $o=$i;

  // suffixes = 0th, 1st, 2nd, third == zeroth, first, second, third
  $s=array('th','st','nd','rd');

  // if input just so happens to be a string, we check to make sure it
  // still holds a numeric value and only acquire the last 2 numbers.
  // if it's not a string, nor an integer, we freak out and say no.
  if(!is_int($o))
    if(ctype_digit($o))
      $o=(int)substr($o,-2,2);
    else
      return(false);

  // basically, if $o is between 11 and 19, we use 'th'
  // otherwise we use the last digit and if it's over
  // 4 then we use 0 (for the $s array index).
  return($i.$s[($o%100>10&&$o%100<20)?0:($o%10<4?$o%10:0)]);
}

var_dump(ordinal(5));

/* Example Outputs of ordinal():
  0th, 1st, 2nd, 3rd, 4th, ..., 9th,
  10th, 11th, 12th, 13th, 14th, ..., 19th,
  110th, 111th, ..., 199th, 200th, 201st.

  ordinal('-1'); returns false because ctype_digit hates anything that
  isn't strictly 0 through 9 and '-' trips it to false.

  ordinal('asdf'); returns false for the exact same reason.

  ordinal(); returns false because it's blank.

  signed integers on a 32-bit system (and the same issue on a 64-bit
  system using 0x7FFFFFFFFFFFFFFF because of two's compliment,
  anything higher will become a negative number):
  ordinal(0x7FFFFFFF  ); returns 2147483647th (which is correct)
  ordinal(0x7FFFFFFF+1); returns false.
*/

?>
Kiam 23-Jul-2009 11:02
empty(trim($test, '+-.,0123456789')) doesn't assure you $test contains a number. It returns TRUE also for a string containing ".+1234.56", which is not a valid number.
codeslinger at compsalot dot com 15-Jul-2009 01:34
if speed is important, the liberal use of regex should be avoided, especially complex ones like those here.

For most purposes, this will be sufficient and has the advantages of both speed and clarity.

$BoolResult = empty(trim($Test, '+-.,0123456789'));

If the $Test contains any character that is not a valid part of a number the remaining string will not be empty.

if you want to be more restrictive of the '+-'  then you can use a separate trim for that and nest it.  Keep in mind that some notations pt the sign to the right of the number instead of to the left.  Depending upon your specific application you can also choose to ignore spaces and allow for 'e' notation.

I also use this approach when testing for other character sets such as Hex.
Magnus Deininger, dma05 at web dot de 07-Jan-2009 06:01
regarding the global vs. american numeral notations, it should be noted that at least in japanese, numbers aren't grouped with an extra symbol every three digits, but rather every four digits (for example 1,0000 instead of 10.000). also nadim's regexen are slightly suboptimal at one point having an unescaped '.' operator, and the whole thing could easily be combined into a single regex (speed and all).

adjustments:

<?php
$eng_or_world = preg_match
  ('/^[+-]?'. // start marker and sign prefix
  '(((([0-9]+)|([0-9]{1,4}(,[0-9]{3,4})+)))?(\\.[0-9])?([0-9]*)|'. // american
  '((([0-9]+)|([0-9]{1,4}(\\.[0-9]{3,4})+)))?(,[0-9])?([0-9]*))'. // world
  '(e[0-9]+)?'. // exponent
  '$/', // end marker
  $str) == 1;
?>

i'm sure this still isn't optimal, but it should also cover japanese-style numerals and it fixed a couple of other issues with the other regexen. it also allows for an exponent suffix, the pre-decimal digits are optional and it enforces using either grouped or ungrouped integer parts. should be easier to trim to your liking too.
Elwin van Huissteden 27-Mar-2007 04:05
To James holwell:

Maybe your function was more strickt, but profides FALSE to any numeric string that wasnt written in the English/American notition. To enable a person to use the both the English/American and the rest of the world's way:

<?php
  function my_is_numeric($value)
  {
   return (preg_match ("/\A(-){0, 1}([0-9]+)((,|.)[0-9]{3, 3})*((,|.)[0-9]){0, 1}([0-9]*)\z/" ,$value) == 1);
  }
?>

Other than that, i'd recommend using yours, if it works (i havent tested either yours or mine)
By using mine, there might be a slight chance to not being able to do calculations with the numeric string if it's not the English/American way.

(*Note:
-the E/A way of writing 1 million (with decimal for 1/50): 1,000,000.02
-the global way of writing 1 million (with decimal for 1/50): 1.000.000,02
james.holwell( at )exeter.ox.ac.uk 20-Mar-2007 02:07
In reply to www.kigoobe.com, a more strict expression is

<?php
  function my_is_numeric($value)
  {
    return (preg_match ("/^(-){0,1}([0-9]+)(,[0-9][0-9][0-9])*([.][0-9]){0,1}([0-9]*)$/", $value) == 1);
  }
?>

This will not match strings like -6,77.8,8 which are matched by the below expression, and instead requires a single decimal point, with at least one character following, and only permits comma-separation when the right hand side is a triplet.
Stephen 25-Jan-2007 09:31
The documentation is not completely precise here. is_numeric will also return true if the number begins with a decimal point  and/or a space, provided a number follows (rather than a letter or punctuation). So, it doesn't necessarily have to start with a digit.
moskalyuk at gmail dot com 21-Aug-2006 10:18
is_numeric fails on the hex values greater than LONG_MAX, so having a large hex value parsed through is_numeric would result in FALSE being returned even though the value is a valid hex number
rontarrant at NO_SPAMsympatico dot ca 23-Jul-2006 07:15
Here's an even simpler pair of functions for finding out if a number is odd or even:

function IS_ODD($number) { return($number & 1); }

function IS_EVEN($number) { return(!($number & 1)); }

Test:
$myNumber = 151;

if(IS_ODD($myNumber))
    echo("number is odd\n");
else
    echo("number is NOT odd\n");

if(IS_even($myNumber))
    echo("number is even\n");
else
    echo("number is NOT even\n");

Results:
number is odd
number is NOT even
andrea dot vacondio at gmail dot com 13-Dec-2005 07:52
Two simple functions using is_numeric:

<?php

 function is_odd($num){
     return (is_numeric($num)&($num&1));
 }

 function is_even($num){
     return (is_numeric($num)&(!($num&1)));
 }

 //examples
echo "1: odd? ".(is_odd(1)? "TRUE": "FALSE")."<br />";
//is_numeric(0) returns true
echo "0: odd? ".(is_odd(0)? "TRUE": "FALSE")."<br />";
echo "6: odd? ".(is_odd(6)? "TRUE": "FALSE")."<br />";
echo "\"italy\": odd? ".(is_odd("italy")? "TRUE": "FALSE")."<br />";
echo "null: odd? ".(is_odd(null)? "TRUE": "FALSE")."<br /><br />";
echo "1: even? ".(is_even(1)? "TRUE": "FALSE")."<br />";
echo "0: even? ".(is_even(0)? "TRUE": "FALSE")."<br />";
echo "6: even? ".(is_even(6)? "TRUE": "FALSE")."<br />";
echo "\"italy\": even? ".(is_even("italy")? "TRUE": "FALSE")."<br />";
echo "null: even? ".(is_even(null)? "TRUE": "FALSE")."<br />";

?>
And here is the result:
1: odd? TRUE
0: odd? FALSE
6: odd? FALSE
"italy": odd? FALSE
null: odd? FALSE

1: even? FALSE
0: even? TRUE
6: even? TRUE
"italy": even? FALSE
null: even? FALSE
jamespam at hotmail dot com 08-Aug-2005 02:31
Here's a function to determine if a variable represents a whole number:

function is_whole_number($var){
  return (is_numeric($var)&&(intval($var)==floatval($var)));
}

just simple stuff...
is_whole_number(2.00000000001); will return false
is_whole_number(2.00000000000); will return true
namik at hub-cafe dot net 29-Jul-2005 06:11
I needed a number_suffix function that takes numbers with thousand seperators (using number_format() function).  Note that this doesn't properly handle decimals.

Example:
<?= number_suffix('1,021') ?> returns: 1,021st

Also, increasing the range above the condition statements increases efficiency.  That's almost 20% of the numbers between 0 and 100 that get to end early.

<?
  function number_suffix($number)
  {
    // Validate and translate our input
    if ( is_numeric($number) )
    {
      // Get the last two digits (only once)
      $n = $number % 100;
    } else {
     // If the last two characters are numbers
     if ( preg_match( '/[0-9]?[0-9]$/', $number, $matches ) )
     {
       // Return the last one or two digits
       $n = array_pop($matches);
     } else {
       // Return the string, we can add a suffix to it
       return $number;
     }
    }
    // Skip the switch for as many numbers as possible.
    if ( $n > 3 && $n < 21 )
      return $number . 'th';

    // Determine the suffix for numbers ending in 1, 2 or 3, otherwise add a 'th'
    switch ( $n % 10 )
    {
      case '1': return $number . 'st';
      case '2': return $number . 'nd';
      case '3': return $number . 'rd';
      default:  return $number . 'th';
    }
  }
?>
sebu 28-Jul-2005 04:37
Referring to previous post "Be aware if you use is_numeric() or is_float() after using set_locale(LC_ALL,'lang') or set_locale(LC_NUMERIC,'lang')":

This is totally wrong!

This was the example code:

-----
  set_locale(LC_NUMERIC,'fr');
  is_numeric(12.25); // Return False
  is_numeric(12,25); // Return True
  is_float(12.25); //Return False
  is_float(12,25); //Return True
-----

This is nonsense!

- set_locale() does not exist, you must use setlocale() instead
- you have to enclose 12,25 with quotes; otherwise PHP will think that
the function gets _two_ arguments: 12 and 25 (depending on PHP version and setup you may additionally get a PHP warning)
- if you don't enclose 12,25 with quotes the first argument will be the inspected value (12), the second value (25) is discarded. And is_numeric(12) and is_float(12) is always TRUE

Corrected Example:

----
  setlocale(LC_NUMERIC,'fr');
  is_numeric(12.25); // Return True
  is_numeric("12,25"); // Return False
  is_float(12.25); //Return True
  is_float("12,25"); //Return False
----

Remarks:
- is_float(12.25) is _always_ TRUE, 12.25 is a PHP language construct (a "value") and the way PHP interpretes files is definitely _not_ affected by the locale
- is_float("12,25") is _always_ FALSE, since is_float (other than is_numeric): if the argument is a string then is_float() always returns FALSE since it does a strict check for floats

And the corrected example shows: you get the _same_ results for every possible locale, is_numeric() does not depend on the locale.
mdallaire at virtuelcom dot com 17-Nov-2004 04:23
Sometimes, we need to have no letters in the number and is_numeric does not quit the job.
You can try it this ways to make sure of the number format:

    function new_is_unsigned_float($val) {
        $val=str_replace(" ","",trim($val));
        return eregi("^([0-9])+([\.|,]([0-9])*)?$",$val);
    }

    function new_is_unsigned_integer($val) {
        $val=str_replace(" ","",trim($val));
        return eregi("^([0-9])+$",$val);
    }

    function new_is_signed_float($val) {
        $val=str_replace(" ","",trim($val));
        return eregi("^-?([0-9])+([\.|,]([0-9])*)?$",$val);
    }

    function new_is_signed_integer($val) {
        $val=str_replace(" ","",trim($val));
        return eregi("^-?([0-9])+$",$val);
    }

It returns 1 if okay and returns nothing "" if it's bad number formating.
renimar no spam at nospam yahoo dot com 03-May-2004 12:54
A little function to ordinalize numbers using is_numeric() and accounting for the numbers in the teens.

<?php
function ordinalize($num) {

        if (!is_numeric($num))
                return $num;

        if ($num >= 11 and $num <= 19)
                return $num."th";
        elseif ( $num % 10 == 1 )
                return $num."st";
        elseif ( $num % 10 == 2 )
                return $num."nd";
        elseif ( $num % 10 == 3 )
                return $num."rd";
        else
                return $num."th";

}

// Demo
for ($i=1; $i<=25; $i++) {
        print ordinalize($i) . " ";
}

// The loop returns:
// 1st 2nd 3rd 4th 5th 6th 7th 8th 9th 10th 11th 12th
// 13th 14th 15th 16th 17th 18th 19th 20th 21st 22nd
// 23rd 24th 25th

?>
joe at kewlmail dot net 16-Jan-2004 03:12
Here is a simple function that I found usefull for filtering user input into numbers. Basically, it attempts to fix fat fingering. For example:

$userString = "$654.4r5";

function numpass_filter($userString){
    $money = explode(".", $userString);
    //now $money[0] = "$645" and $money[1] = "4r5"

    //next remove all characters save 0 though 9
    //in both elements of the array
    $dollars = eregi_replace("[^0-9]", null, $money[0]);
    $cents = eregi_replace("[^0-9]", null, $money[1]);

    //if there was a decimal in the original string, put it back
    if((string)$cents!=null){
        $cents = "." . $cents;
    }

   $result = $dollars . $cents;

    return($result);
}

The output in this case would be '654.45'.
Please note that this function will work properly unless the user fat fingers an extra decimal in the wrong place.
kouber at saparev dot com 24-Nov-2003 03:05
Note that this function is not appropriate to check if "is_numeric" for very long strings. In fact, everything passed to this function is converted to long and then to a double. Anything greater than approximately 1.8e308 is too large for a double, so it becomes infinity, i.e. FALSE. What that means is that, for each string with more than 308 characters, is_numeric() will return FALSE, even if all chars are digits.

However, this behaviour is platform-specific.

http://www.php.net/manual/en/language.types.float.php

In such a case, it is suitable to use regular expressions:

function is_numeric_big($s=0) {
  return preg_match('/^-?\d+$/', $s);
}
stew_wilde at hotmail dot com 07-Aug-2003 01:25
When using the exec() function in php to execute anther php script, any command line arguments passed the script will lose their type association, regardless of whether they are numeric or not, the same seems to hold true for strings as well.

ie : two scripts test.php:

<?php
$val = trim($argv[1]);
echo is_string($val);
?>

and testwrapper.php:

<?php
$tmp = 5;
exec("php ./test.php ".$tmp);
?>

Executing testwrapper.php on the command line will echo nothing (ie false), and false will be returned regardless of any escaping of parameters or other such attempts to overcome this.  The solution then is to explicitly cast $val in test.php to be an int and then is_numeric will work.  But as stated the same test was performed using a string for $val and the is_string() function and the same thing occurs.  Not the end of the world, but something to be aware of :)
andi_nrw at hotmail dot com 12-Feb-2003 08:25
<?php
/* This function is not useful if you want
to check that someone has filled in only
numbers into a form because for example
4e4 and 444 are both "numeric".

I used a regular expression for this problem
and it works pretty good. Maybe it is a good
idea to write a function and then to use it.

$input_number = "444"; // Answer 1
$input_number = "44 "; // Answer 2
$input_number = "4 4"; // Answer 2
$input_number = "4e4"; // Answer 2
$input_number = "e44"; // Answer 2
$input_number = "e4e"; // Answer 2
$input_number = "abc"; // Answer 2
*/
$input_number = "444";

if (preg_match ("/^([0-9]+)$/", $input_number)) {
     print "Answer 1";
} else {
     print "Answer 2";
}
?>
eagleflyer2 at lycos dot com 06-Sep-2002 01:02
Hi !
Many of you may have experienced that the 'is_numeric' function seems to fail always when form entries are checked against their variable type. So the function seems to return  'false' even if the form entry was aparently a number or numeric string.

The solution is pretty simple and no subroutines or fancy operations are necessary to make the 'is_numeric' function usable for form entry checks:

Simply strip off all (invisible) characters that may be sent along with the value when submitting a form entry.

Just use the 'trim' function before 'is_numeric'.

Example:

$variable = trim($variable);
if (is_numeric($variable)
{...#do something#...}
else
{...#do something else#...}


Détermine si une variable est de type objet

  • « is_numeric
  • is_real »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détermine si une variable est de type objet

is_object

(PHP 4, PHP 5, PHP 7, PHP 8)

is_object — Détermine si une variable est de type objet

Description

is_object ( mixed $value ) : bool

Détermine si la variable donnée est de type objet.

Liste de paramètres

value

La variable à évaluer.

Valeurs de retour

Retourne true si value est un objet, false sinon.

Exemples

Exemple #1 Exemple avec is_object()

<?php
// Déclare une simple fonction pour retourner un tableau
// de notre objet
function get_students($obj)
{
    if (!is_object($obj)) {
        return false;
    }

    return $obj->students;
}

// Déclare une nouvelle instance et
// la remplit
$obj = new stdClass();
$obj->students = array('Kalle', 'Ross', 'Felipe');

var_dump(get_students(null));
var_dump(get_students($obj));;
?>

Historique

Version | Description
7.2.0 | is_object() retourne maintenant true pour un objet délinéarisé sans une définition de classe (classe de __PHP_Incomplete_Class). Précédement false était retourné.

Voir aussi

  • is_bool() - Détermine si une variable est un booléen
  • is_int() - Détermine si une variable est de type nombre entier
  • is_float() - Détermine si une variable est de type nombre décimal
  • is_string() - Détermine si une variable est de type chaîne de caractères
  • is_array() - Détermine si une variable est un tableau

User Contributed Notes

wadih at creationmw dot com 29-Jul-2017 06:47
Note that closures return true when passed to is_object():

<?php

echo
    is_object(
        function(){return "hello";}
    );

?>

Returns true (1)
shadow_games at abv dot bg 11-Jun-2014 03:42
here i created one function that i wanted to find but i had never found :X

    function compare_two_object_recursive($object_1, $object_2, $object_1_Identifier = false, $object_2_Identifier = false){
        $object1 = (array)$object_1;
        $object2 = (array)$object_2;
        $object3 = array();

        $o1i = $object_1_Identifier ? $object_1_Identifier : 1;
        $o2i = $object_2_Identifier ? $object_2_Identifier : 2;

        foreach($object1 as $key => $value){
            if(is_object($object1[$key])){
                $object1[$key] = (array)$object1[$key];
                $object2[$key] = (array)$object2[$key];
                $object3[$key] = (object)compare_two_object_recursive($object1[$key], $object2[$key], $o1i, $o2i);
            }elseif(is_array($object1[$key])){
                $object3[$key] = compare_two_object_recursive($object1[$key], $object2[$key], $o1i, $o2i);
            }else{
                if($object1[$key] == $object2[$key]){
                    $object3[$key]['comparison_status'] = "SAME";
                }else{
                    $object3[$key]['comparison_status'] = "NOT THE SAME";
                    $object3[$key][$o1i] = $object1[$key];
                    $object3[$key][$o2i] = $object2[$key];
                }
            }
        }
        return $object3;
    }
mark at not4you dot com 21-Sep-2011 12:23
Unserializes data as returned by the standard PHP serialize() function. If the unserialized object is not an array, it will be converted to one, particularily useful if it returns a __PHP_Incomplete_Class.

<?php
/**
 *
 * @param string $data Serialized data
 *
 * @return array    Unserialized array
 */
function unserialize2array($data) {
    $obj = unserialize($data);
    if(is_array($obj)) return $obj;
    $arr = array();
    foreach($obj as $k=>$v) {
        $arr[$k] = $v;
    }
    unset($arr['__PHP_Incomplete_Class_Name']);
    return $arr;
}
?>
peter dot nagel at portavita dot nl 22-Mar-2011 01:46
Note: is_object(null) returns false

This should actually be part of the input/output specification at the top of this page.
will 20-Mar-2010 02:36
Just discovered:
is_a  (  object $object  ,  string $class_name  )
Which checks if the object is of this class or has this class as one of its parents

Which seems to do what a lot here are trying to replicate
ldean at saleamp dot com 01-Sep-2009 07:16
Use instanceof() to check for a specific type.
Senthryl 17-Mar-2009 06:03
Cleaning it up even more:

<?php
function is_obj(&$object, $className = null, $caseSensitive = true) {
    return is_object($object) && (!is_string($className) || preg_match('/^'.$className.'$/D'.($caseSensitive ? '' : 'i'), get_class($object)));
}
?>
gregdangelo at gmail dot com 14-Apr-2008 12:03
cleaned up peter's code... use only one return statement

function is_obj( &$object, $check=null, $strict=true )
{
$result = false;
  if (is_object($object)) {
      if ($check == null) {
          $result =  true;
      } else {
           $object_name = get_class($object);
           $result =  ($strict === true)?
               ( $object_name == $check ):
               ( strtolower($object_name) == strtolower($check) );
      }
  }
return $result;
}
corychristison[aT-]lavacube(.dot)com 02-Feb-2005 05:06
Thank you victor AT fourstones DOT net.

I have written a function to do what victor has suggested, with the ease of use of is_object. It can be used to replace is_object(), but has an extra field [$check], to compare to a certain name. If $check is left empty, it will just check if &$object is an object.

<?php

function is_obj( &$object, $check=null, $strict=true )
{
    if( $check == null && is_object($object) )
    {
        return true;
    }
    if( is_object($object) )
    {
        $object_name = get_class($object);
        if( $strict === true )
        {
            if( $object_name == $check )
            {
                return true;
            }
        }
        else
        {
            if( strtolower($object_name) == strtolower($check) )
            {
                return true;
            }
        }
    }
}

?>

This could probably be cleaned up, but it's spaced out to be easy to read.
victor AT fourstones DOT net 01-Jan-2005 03:49
er, I don't think that's right, especially if calling from another object instance:

<?

function test_this()
{
    $c2 = new C2();
    $c2->func();
    $c1 = new C1();
    $c1->func();
    C1::func();
}

class C2
{
    function func()
    {
        C1::func();
    }
}

class C1
{
    function func()
    {
        if( isset($this) )
        {
            if( strtolower(get_class($this)) != 'c1' )
                print("oops\n");
            else
                print("this is ok\n" );
        }
        else
        {
            print("static call\n");
        }
    }
}

test_this();
?>

yields:
---------- run-php ----------

oops
this is ok
static call
corychristison[aT-]lavacube(.dot)com 01-Jan-2005 07:47
You can use is_object($this) to detect if the function is being called via instance or procedure.

Example:

<?php

class mrClass {

    function test( )
    {
        if( is_object($this) )
        {
         // do something for instance method
            echo 'this is an instance call <br />' . "\n";
        }
        else
        {
         // do something different for procedural method
            echo 'this is a procedure call <br />' . "\n";
        }
    }

}

$inst = new mrClass();
$inst->test();

mrClass::test();

?>

This would output:
this is an instance call <br />
this is a procedure call <br />

:-) Happy coding!
lbjay can be emailed at reallywow dot com 02-May-2003 12:18
I'm not even sure how to articulate this, so I'm going to just include test code. Maybe someone else will someday wonder the same thing.

<?
    error_reporting(E_ALL);
    class testParent
    {
        var $child;

        function testParent()
        {
            $this->child = new testChild();
        }
    }

    class testChild
    {
        function testChild()
        {
        }
    }

    $parent = new testParent();
    $parent2 = 'foobar';

    print join(',', Array(
        is_object($parent) ? 'yes' : 'no',
        is_object($parent->child) ? 'yes' : 'no',
        is_object($parent2) ? 'yes' : 'no',
        is_object($parent2->child) ? 'yes' : 'no'
    ));

?>

This prints "yes,yes,no,no". Basically this shows that you can use is_object to test if the child object is an object without worrying about an error if the parent object isn't an object either.


Alias de is_float

  • « is_object
  • is_resource »
  • PHP Manual
  • Fonctions de gestion des variables
  • Alias de is_float

is_real

(PHP 4, PHP 5, PHP 7, PHP 8)

is_real — Alias de is_float()

Description

Cette fonction est un alias de : is_float().

Avertissement

Cet alias est OBSOLÈTE en PHP 7.4.0, et SUPPRIMÉ à partir de PHP 8.0.0.

User Contributed Notes

There are no user contributed notes for this page.


Détermine si une variable est une ressource

  • « is_real
  • is_scalar »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détermine si une variable est une ressource

is_resource

(PHP 4, PHP 5, PHP 7, PHP 8)

is_resource — Détermine si une variable est une ressource

Description

is_resource ( mixed $value ) : bool

Détermine si une variable est une ressource.

Liste de paramètres

value

La variable à évaluer.

Valeurs de retour

Retourne true si value est une ressource, false autrement.

Exemples

Exemple #1 Exemple avec is_resource()

<?php

$db_link = @mysql_connect('localhost', 'mysql_user', 'mysql_pass');
if (!is_resource($db_link)) {
    die('Connexion impossible : ' . mysql_error());
}

?>

Notes

Note:

La fonction is_resource() n'est pas une méthode de vérification stricte de type : elle va retourner false si le paramètre value est une ressource qui a été fermée.

Voir aussi

  • La documentation sur les ressources
  • get_resource_type() - Retourne le type de ressource

User Contributed Notes

Anonymous 29-Sep-2017 11:16
Note that is_resource() is unreliable. It considers closed resources as false:

<?php

$a = fopen('http://www.google.com', 'r');
var_dump(is_resource($a)); var_dump(is_scalar($a));
//bool(true)
//bool(false)

fclose($a);
var_dump(is_resource($a)); var_dump(is_scalar($a));
//bool(false)
//bool(false)

?>

That's the reason why some other people here have been confused and devised some complex (bad) "solutions" to detect resources...

There's a much better solution... In fact, I just showed it above, but here it is again with a more complete example:

<?php

$a = fopen('http://www.google.com', 'r');
var_dump(is_resource($a)); var_dump(is_scalar($a)); var_dump(is_object($a)); var_dump(is_array($a)); var_dump(is_null($a));
//bool(true)
//bool(false)
//bool(false)
//bool(false)
//bool(false)

?>

So how do you check if something is a resource?

Like this!

<?php

$a = fopen('http://www.google.com', 'r');
$isResource = is_resource($a) || ($a !== null && !is_scalar($a) && !is_array($a) && !is_object($a));
var_dump($isResource);
//bool(true)

fclose($a);

var_dump(is_resource($a));
//bool(false)

$isResource = is_resource($a) || ($a !== null && !is_scalar($a) && !is_array($a) && !is_object($a));
var_dump($isResource);
//bool(true)

?>

How it works:

- An active resource is a resource, so check that first for efficiency.
- Then branch to check what the variable is NOT:
- A resource is never NULL. (We do that check via `!== null` for efficiency).
- A resource is never Scalar (int, float, string, bool).
- A resource is never an array.
- A resource is never an object.
- Only one variable type remains if all of the above checks succeeded: IF it's NOT any of the above, then it's a closed resource!

Just surfed by and saw the bad and hacky methods other people had left, and wanted to help out with this proper technique. Good luck, everyone!

PS: The core problem is that is_resource() does a "loose" check for "living resource". I wish that it had a $strict parameter for "any resource" instead of these user-workarounds being necessary.
CertaiN 17-Jan-2014 05:05
Try this to know behavior:

<?php
function resource_test($resource, $name) {
    echo
        '[' . $name. ']',
        PHP_EOL,
        '(bool)$resource => ',
        $resource ? 'TRUE' : 'FALSE',
        PHP_EOL,
        'get_resource_type($resource) => ',
        get_resource_type($resource) ?: 'FALSE',
        PHP_EOL,
        'is_resource($resource) => ',
        is_resource($resource) ? 'TRUE' : 'FALSE',
        PHP_EOL,
        PHP_EOL
    ;
}

$resource = tmpfile();
resource_test($resource, 'Check Valid Resource');

fclose($resource);
resource_test($resource, 'Check Released Resource');

$resource = null;
resource_test($resource, 'Check NULL');
?>

It will be shown as...

[Check Valid Resource]
(bool)$resource => TRUE
get_resource_type($resource) => stream
is_resource($resource) => TRUE

[Check Released Resource]
(bool)$resource => TRUE
get_resource_type($resource) => Unknown
is_resource($resource) => FALSE

[Check NULL]
(bool)$resource => FALSE
get_resource_type($resource) => FALSE
Warning:  get_resource_type() expects parameter 1 to be resource, null given in ... on line 10
is_resource($resource) => FALSE
btleffler [AT] gmail [DOT] com 12-May-2011 01:55
I was recently trying to loop through some objects and convert them to arrays so that I could encode them to json strings.

I was running into issues when an element of one of my objects was a SoapClient. As it turns out, json_encode() doesn't like any resources to be passed to it. My simple fix was to use is_resource() to determine whether or not the variable I was looking at was a resource.

I quickly realized that is_resource() returns false for two out of the 3 resources that are typically in a SoapClient object. If the resource type is 'Unknown' according to var_dump() and get_resource_type(), is_resource() doesn't think that the variable is a resource!

My work around for this was to use get_resource_type() instead of is_resource(), but that function throws an error if the variable you're checking isn't a resource.

So how are you supposed to know when a variable is a resource if is_resource() is unreliable, and get_resource_type() gives errors if you don't pass it a resource?

I ended up doing something like this:

<?php

function isResource ($possibleResource) { return !is_null(@get_resource_type($possibleResource)); }

?>

The @ operator suppresses the errors thrown by get_resource_type() so it returns null if $possibleResource isn't a resource.

I spent way too long trying to figure this stuff out, so I hope this comment helps someone out if they run into the same problem I did.


Indique si une variable est un scalaire

  • « is_resource
  • is_string »
  • PHP Manual
  • Fonctions de gestion des variables
  • Indique si une variable est un scalaire

is_scalar

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

is_scalar — Indique si une variable est un scalaire

Description

is_scalar ( mixed $value ) : bool

Indique si la variable donnée est un scalaire.

Les variables scalaires sont celles qui contennant un entier, un nombre décimal, une chaîne de caractères ou un booléen. Les types array, object et resource ne sont pas scalaires.

Note:

is_scalar() ne considère pas les valeurs des types ressource comme scalaires, étant donné que les ressources sont des types abstraits, basés sur des entiers. Ceci est susceptible de changer.

Note:

La fonction is_scalar() ne considère pas la valeur NULL comme un scalaire.

Liste de paramètres

value

La variable à évaluer.

Valeurs de retour

Retourne true si value est un scalaire, false autrement.

Exemples

Exemple #1 Exemple avec is_scalar()

<?php
function show_var($var)
{
    if (is_scalar($var)) {
        echo $var;
    } else {
        var_dump($var);
    }
}
$pi = 3.1416;
$proteines = array("hémoglobine", "cytochrome c oxidase", "ferredoxine");

show_var($pi);

show_var($proteines)
?>

L'exemple ci-dessus va afficher :

3.1416
array(3) {
  [0]=>
  string(11) "hémoglobine"
  [1]=>
  string(20) "cytochrome c oxidase"
  [2]=>
  string(11) "ferredoxine"
}

Voir aussi

  • is_float() - Détermine si une variable est de type nombre décimal
  • is_int() - Détermine si une variable est de type nombre entier
  • is_numeric() - Détermine si une variable est un nombre ou une chaîne numérique
  • is_real() - Alias de is_float
  • is_string() - Détermine si une variable est de type chaîne de caractères
  • is_bool() - Détermine si une variable est un booléen
  • is_object() - Détermine si une variable est de type objet
  • is_array() - Détermine si une variable est un tableau

User Contributed Notes

31-Jul-2006 08:59
Another warning in response to the previous note:
> just a warning as it appears that an empty value is not a scalar.

That statement is wrong--or, at least, has been fixed with a later revision than the one tested.  The following code generated the following output on PHP 4.3.9.

CODE:
<?php
    echo('is_scalar() test:'.EOL);
    echo("NULL: "      . print_R(is_scalar(NULL),     true) . EOL);
    echo("false: "    . print_R(is_scalar(false),   true) . EOL);
    echo("(empty): "  . print_R(is_scalar(''),      true) . EOL);
    echo("0: "         . print_R(is_scalar(0),       true) . EOL);
    echo("'0': "      . print_R(is_scalar('0'),     true) . EOL);
?>

OUTPUT:
is_scalar() test:
NULL:
false: 1
(empty): 1
0: 1
'0': 1

THUS:
   * NULL is NOT a scalar
   * false, (empty string), 0, and "0" ARE scalars
efelch at gmail dot com 17-Aug-2005 02:31
A scalar is a single item or value, compared to things like arrays and objects which have multiple values. This tends to be the standard definition of the word in terms of programming. An integer, character, etc are scalars. Strings are probably considered scalars since they only hold "one" value (the value represented by the characters represented) and nothing else.
Dr K 14-Aug-2005 03:48
Having hunted around the manual, I've not found a clear statement of what makes a type "scalar" (e.g. if some future version of the language introduces a new kind of type, what criterion will decide if it's "scalar"? - that goes beyond just listing what's scalar in the current version.)

In other lanuages, it means "has ordering operators" - i.e. "less than" and friends.

It (-:currently:-) appears to have the same meaning in PHP.
popanowel HAT hotmailZ DOT cum 14-May-2004 12:31
Hi ... for newbees here, I just want to mention that reference and scalar variable aren't the same. A reference is a pointer to a scalar, just like in C or C++.

<? php  // simple reference to scalar

  $a = 2;
  $ref = & $a;

  echo "$a <br> $ref";

?>
this should print out: "2 <br> 2".

Scalar class also exists. Look below:
<? php

  class Object_t {

     var $a;

     function Object_t ()  // constructor
     {
        $this->a = 1;
     }

  }

  $a = new Object_t; // we define a scalar object

  $ref_a = &a;

  echo "$a->a <br> $ref->a";

?>
again, this should echo: "1 <br> 1";

Here is another method isued in OOP to acheive on working only over reference to scalar object. Using this, you won't ever have to  ask yourself if you work on a copy of the scalar or its reference. You will only possess reference to the scalar object. If you want to duplicate the scalar object, you will have to create a function for that purpose that would read by the reference the values and assign them to another scalar of the same type... or an other type, it is as you wish at that moment.
<?php

  class objet_t {
     var $a;

     function object_t
     {
        $this->a = "patate_poil";
     }
  }

   function &get_ref($object_type)
   {
      // here we create a scalar object in memory
      // and we return it by reference to the calling
      // control scope.
      return &new $object_type;
   }

   $ref_object_t = get_ref(object_t);

   echo "$ref_object_t->a <br>";

?>
this should echo: "patate_poit <br>".

The only thing that I try to demonstrate is that scalar variable ARE object in memory while a reference is usualy a variable (scalar object) that contain the address of another scalar object, which contain the informations you want by using the reference.

Good Luck!

otek is popanowel HAT hotmailZ DOT cum


Détermine si une variable est de type chaîne de caractères

  • « is_scalar
  • isset »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détermine si une variable est de type chaîne de caractères

is_string

(PHP 4, PHP 5, PHP 7, PHP 8)

is_string — Détermine si une variable est de type chaîne de caractères

Description

is_string ( mixed $value ) : bool

Détermine si la variable donnée est de type chaîne de caractères.

Liste de paramètres

value

La variable à évaluer.

Valeurs de retour

Retourne true si value est une chaîne de caractères, false sinon.

Exemples

Exemple #1 Exemple avec is_string()

<?php
$values = array(false, true, null, 'abc', '23', 23, '23.5', 23.5, '', ' ', '0', 0);
foreach ($values as $value) {
    echo "is_string(";
    var_export($value);
    echo ") = ";
    echo var_dump(is_string($value));
}
?>

L'exemple ci-dessus va afficher :

is_string(false) = bool(false)
is_string(true) = bool(false)
is_string(NULL) = bool(false)
is_string('abc') = bool(true)
is_string('23') = bool(true)
is_string(23) = bool(false)
is_string('23.5') = bool(true)
is_string(23.5) = bool(false)
is_string('') = bool(true)
is_string(' ') = bool(true)
is_string('0') = bool(true)
is_string(0) = bool(false)

Voir aussi

  • is_float() - Détermine si une variable est de type nombre décimal
  • is_int() - Détermine si une variable est de type nombre entier
  • is_bool() - Détermine si une variable est un booléen
  • is_object() - Détermine si une variable est de type objet
  • is_array() - Détermine si une variable est un tableau

User Contributed Notes

jcours at numifinancial dot com 15-Jul-2020 07:59
is_string() of an integer or float returns false, so it might be useful to include an is_numeric() when checking if a value is stringy:

<?php
function is_stringy($val) {
  return (is_string($val) || is_numeric($val)
    || (is_object($val) && method_exists($val, '__toString')));
}
?>

Test code (which should print "vector N OK" for each test vector):
<?php
foreach ([[NULL, false], [false, false], [true, false],
  [0, true], [[], false], [0.1, true], ["x", true],
  ["", true], [new Exception("x"), true]] as $idx => $vector) {
  list ($val, $expected) = $vector;
  if (is_stringy($val) != $expected) {
    print ("mismatch at $idx\n");
    var_dump($val);
  } else {
    print ("vector $idx OK\n");
  }
}
?>
Peter Barney 13-Sep-2017 10:47
As noted earlier, is_string() returns false on an object that has a __toString() method. Here is a simple way to do a check that will work:

<?php
// determine if the passed argument can be treated like a string.
function is_stringy($text) {
    return (is_string($text) || (is_object($text) && method_exists($text, '__toString' ));
}
laszlo dot heredy shift-two gmail etc 27-Feb-2014 09:22
Using is_string() on an object will always return false (even with __toString()).

<?php
class B {
  public function __toString() {
    return "Instances of B() can be treated as a strings!\n";
  }
}

$b = new B();
print($b); //Instances of B() can be treated as a strings!
print(is_string($b) ? 'true' : 'false'); //false
?>


Détermine si une variable est déclarée et est différente de null

  • « is_string
  • print_r »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détermine si une variable est déclarée et est différente de null

isset

(PHP 4, PHP 5, PHP 7, PHP 8)

isset — Détermine si une variable est déclarée et est différente de null

Description

isset ( mixed $var , mixed ...$vars ) : bool

Détermine si une variable est considérée définie, ceci signifie qu'elle est déclarée et est différente de null.

Si une variable a été détruite avec la fonction unset(), elle n'est plus considéré comme définie.

isset() renverra false lors de la vérification d'une variable de valeur null. Il est à noter que aussi que le caractère nul ("\0") n'est pas équivalent à la constante PHP null.

Si plusieurs paramètres sont fournis, alors isset() retournera true seulement si tous les paramètres sont définis. L'évaluation s'effectue de gauche à droite et s'arrête dès qu'une variable non définie est rencontrée.

Liste de paramètres

var

La variable à analyser.

vars

Variables supplémentaires.

Valeurs de retour

Retourne true si var existe et a une valeur autre que null. false sinon.

Exemples

Exemple #1 Exemple avec isset()

<?php

$var = '';

// Ceci est vrai, alors le texte est affiché
if (isset($var)) {
    echo 'Cette variable existe, donc je peux l\'afficher.';
}

// Dans les exemples suivants, nous utilisons var_dump() pour afficher
// le retour de la fonction isset().

$a = 'test';
$b = 'anothertest';

var_dump(isset($a));      // TRUE
var_dump(isset($a, $b)); // TRUE

unset ($a);

var_dump(isset($a));     // FALSE
var_dump(isset($a, $b)); // FALSE

$foo = NULL;
var_dump(isset($foo));   // FALSE

?>

Fonctionne aussi avec les tableaux :

<?php

$a = array ('test' => 1, 'bonjour' => NULL, 'pie' => array('a' => 'apple'));

var_dump(isset($a['test']));            // TRUE
var_dump(isset($a['foo']));             // FALSE
var_dump(isset($a['bonjour']));           // FALSE

// La clé 'bonjour' vaut NULL et est considérée comme non existante
// Si vous voulez vérifier l'existence de cette clé, utilisez cette fonction
var_dump(array_key_exists('bonjour', $a) ); // TRUE

// Vérification des valeurs en profondeur
var_dump(isset($a['pie']['a']));        // TRUE
var_dump(isset($a['pie']['b']));        // FALSE
var_dump(isset($a['cake']['a']['b']));  // FALSE
?>

Exemple #2 isset() sur des positions dans une chaîne

PHP 5.4 modifie le comportement de la fonction isset() lorsqu'on lui passe des positions dans une chaîne.

<?php
$expected_array_got_string = 'somestring';
var_dump(isset($expected_array_got_string['some_key']));
var_dump(isset($expected_array_got_string[0]));
var_dump(isset($expected_array_got_string['0']));
var_dump(isset($expected_array_got_string[0.5]));
var_dump(isset($expected_array_got_string['0.5']));
var_dump(isset($expected_array_got_string['0 Mostel']));
?>

Résultat de l'exemple ci-dessus en PHP 5.3 :

bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)

Résultat de l'exemple ci-dessus en PHP 5.4 :

bool(false)
bool(true)
bool(true)
bool(true)
bool(false)
bool(false)

Notes

Avertissement

isset() fonctionne uniquement avec des variables car l'utilisation de toute autre chose aura comme conséquence une erreur d'analyse. Pour vérifier si une constants est définie, utilisez la fonction defined().

Note: Comme ceci est une structure du langage, et non pas une fonction, il n'est pas possible de l'appeler avec les fonctions variables.

Note:

Lors de l'utilisation de cette fonction sur des propriétés d'objet inaccessibles, la méthode magique __isset() sera appelée, si elle existe.

Voir aussi

  • empty() - Détermine si une variable est vide
  • __isset()
  • unset() - Détruit une variable
  • defined() - Vérifie l'existence d'une constante
  • le tableau de comparaison de types
  • array_key_exists() - Vérifie si une clé existe dans un tableau
  • is_null() - Indique si une variable vaut null
  • l'opérateur de contrôle de rapport d'erreurs @

User Contributed Notes

razvan_bc at yahoo dot com 13-Feb-2019 07:25
In these days you can use ISSET to compare a sting length
COOOL! I love php !!!!

<?php
//FIRST:try to run the script like this,
//THEN: try to uncomment the seccond $str=

$yes="SURE!!!";
$no="NOPE !";

$str="12345";//the string is long 5 bytes ?
//$str="123456";

echo !isset($str{5}) ? $yes : $no;

?>
borshak at gmail dot com 24-Jun-2018 03:13
Would be nice to have is_set() alias for more language consistency (alike of is_int, is_bull so on).
venimus at gmail dot com 27-Apr-2018 11:46
Be warned that before checking an array key existence with isset() the key will be typecasted to integer if it is not a string or integer!

See Example #2 in http://php.net/manual/en/language.types.array.php

I.e.

$a = ['test']; // 'test' will have key 0
$key = false;

var_dump(isset($a[$key]) ); // true, because false will be typecasted to 0

It is not a problem with isset but rather the lose typing when you access keys in arrays
Hayley Watson 30-Jul-2017 01:12
If you regard isset() as indicating whether the given variable has a value or not, and recall that NULL is intended to indicate that a value is _absent_ (as said, somewhat awkwardly, on its manual page), then its behaviour is not at all inconsistent or confusing.

It's not just to check for uninitialised variables - a lot of the time those are just due to sloppy coding. There are other ways a variable could fail to have a value (e.g., it's meant to hold the value returned from a function call but the function didn't have a value to return) where uninitialising the variable would not be an option nor even make sense (e.g., depending on what was to be done with the returned value).
kurdtpage at gmail dot com 21-Dec-2016 01:03
The new (as of PHP7) 'null coalesce operator' allows shorthand isset. You can use it like so:

<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>

Quoted from http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op
p_ignorethis_lbowers at gmail dot com 06-Oct-2016 07:26
I, too, was dismayed to find that isset($foo) returns false if ($foo == null). Here's an (awkward) way around it.

unset($foo);
if (compact('foo') != array()) {
  do_your_thing();
}

Of course, that is very non-intuitive, long, hard-to-understand, and kludgy. Better to design your code so you don't depend on the difference between an unset variable and a variable with the value null. But "better" only because PHP has made this weird development choice.

In my thinking this was a mistake in the development of PHP. The name ("isset") should describe the function and not have the desciption be "is set AND is not null". If it was done properly a programmer could very easily do (isset($var) || is_null($var)) if they wanted to check for this!

A variable set to null is a different state than a variable not set - there should be some easy way to differentiate. Just my (pointless) $0.02.
ayyappan dot ashok at gmail dot com 24-Mar-2016 07:23
Return Values :
Returns TRUE if var exists and has value other than NULL, FALSE otherwise.

<?php
$a=NULL;
$b=FALSE; //The out put was TRUE.
$c=TRUE;
$d='';
$e="";
if(isset($b)):
echo "TRUE";
else:
echo "FALSE";
endif;
?>
Could any one explain me in clarity.
andreasonny83 at gmail dot com 12-May-2015 11:26
Here is an example with multiple parameters supplied

<?php
$var = array();
$var['val1'] = 'test';
$var['val2'] = 'on';

if ( isset( $var['val1'], $var['val2'] ) && $var['val2'] === 'on' ) {
    unset( $var['val1'] );
}
print_r( $var );
?>

This will output:
Array
(
    [val2] => on
)

The following code does the same calling "isset" 2 times:

<?php
$var = array();
$var['val1'] = 'test';
$var['val2'] = 'on';

if ( isset( $var['val1'] ) && isset( $var['val2'] ) && $var['val2'] === 'on' ) {
    unset( $var['val1'] );
}
print_r( $var );
?>
uramihsayibok, gmail, com 25-Apr-2013 11:32
Note that isset() is not recursive as of the 5.4.8 I have available here to test with: if you use it on a multidimensional array or an object it will not check isset() on each dimension as it goes.

Imagine you have a class with a normal __isset and a __get that fatals for non-existant properties. isset($object->nosuch) will behave normally but isset($object->nosuch->foo) will crash. Rather harsh IMO but still possible.

<?php

class FatalOnGet {

    // pretend that the methods have implementations that actually try to do work
    // in this example I only care about the worst case conditions

    public function __get($name) {
        echo "(getting {$name}) ";

        // if property does not exist {
            echo "Property does not exist!";
            exit;
        // }
    }

    public function __isset($name) {
        echo "(isset {$name}?) ";
        // return whether the property exists
        return false;
    }

}

$obj = new FatalOnGet();

// works
echo "Testing if ->nosuch exists: ";
if (isset($obj->nosuch)) echo "Yes"; else echo "No";

// fatals
echo "\nTesting if ->nosuch->foo exists: ";
if (isset($obj->nosuch->foo)) echo "Yes"; else echo "No";

// not executed
echo "\nTesting if ->irrelevant exists: ";
if (isset($obj->irrelevant)) echo "Yes"; else echo "No";

?>

    Testing if ->nosuch exists: No
    Testing if ->nosuch->foo exists: Property does not exist!

Uncomment the echos in the methods and you'll see exactly what happened:

    Testing if ->nosuch exists: (isset nosuch?) No
    Testing if ->nosuch->foo exists: (getting nosuch) Property does not exist!

On a similar note, if __get always returns but instead issues warnings or notices then those will surface.
Daniel Klein 29-May-2012 03:49
How to test for a variable actually existing, including being set to null. This will prevent errors when passing to functions.

<?php
// false
var_export(
  array_key_exists('myvar', get_defined_vars())
);

$myvar;
// false
var_export(
  array_key_exists('myvar', get_defined_vars())
);

$myvar = null;
// true
var_export(
  array_key_exists('myvar', get_defined_vars())
);

unset($myvar);
// false
var_export(
  array_key_exists('myvar', get_defined_vars())
);

if (array_key_exists('myvar', get_defined_vars())) {
  myfunction($myvar);
}
?>

Note: you can't turn this into a function (e.g. is_defined($myvar)) because get_defined_vars() only gets the variables in the current scope and entering a function changes the scope.
Cuong Huy To 23-Mar-2011 05:08
1) Note that isset($var) doesn't distinguish the two cases when $var is undefined, or is null. Evidence is in the following code.

<?php
unset($undefined);
$null = null;
if (true === isset($undefined)){echo 'isset($undefined) === true'} else {echo 'isset($undefined) === false'); // 'isset($undefined) === false'
if (true === isset($null)){echo 'isset($null) === true'} else {echo 'isset($null) === false');              // 'isset($null)      === false'
?>

2) If you want to distinguish undefined variable with a defined variable with a null value, then use array_key_exist

<?php
unset($undefined);
$null = null;

if (true !== array_key_exists('undefined', get_defined_vars())) {echo '$undefined does not exist';} else {echo '$undefined exists';} // '$undefined does not exist'
if (true === array_key_exists('null', get_defined_vars())) {echo '$null exists';} else {echo '$null does not exist';}                // '$null exists'
?>
francois vespa 22-Dec-2010 07:21
Now this is how to achieve the same effect (ie, having isset() returning true even if variable has been set to null) for objects and arrays

<?php

// array

$array=array('foo'=>null);

return isset($array['foo']) || array_key_exists('foo',$array)
  ? true : false ; // return true

return isset($array['inexistent']) || array_key_exists('inexistent',$array)
  ? true : false ; // return false

// static class

class bar

{
  static $foo=null;
}

return isset(bar::$foo) || array_key_exists('foo',get_class_vars('bar'))
  ? true : false ; // return true

return isset(bar::$inexistent) || array_key_exists('inexistent',get_class_vars('bar'))
  ? true : false ; // return false

// object

class bar
{
    public $foo=null;
}

$bar=new bar();

return isset($bar->foo) || array_key_exists('foo',get_object_vars($bar))
  ? true : false ; // return true

return isset($bar->inexistent) || array_key_exists('inexistent',get_object_vars($bar))
  ? true : false ; // return true

// stdClass

$bar=new stdClass;
$bar->foo=null;

return isset($bar->foo) || array_key_exists('foo',get_object_vars($bar))
  ? true : false ; // return true

return isset($bar->inexistent) || array_key_exists('inexistent',get_object_vars($bar))
  ? true : false ; // return true

?>
Anl zselgin 14-Aug-2009 03:30
Note: Because this is a language construct and not a function, it cannot be called using variable functions.

So why it is under "Variable handling Functions". Maybe there should be some good documentation field for language constructs.
Ashus 08-Dec-2008 01:05
Note that array keys are case sensitive.

<?php
$ar['w'] = true;

var_dump(isset($ar['w']),
      isset($ar['W']));
?>

will report:
bool(true) bool(false)
a dot schaffhirt at sedna-soft dot de 12-Oct-2008 08:01
You can safely use isset to check properties and subproperties of objects directly. So instead of writing

    isset($abc) && isset($abc->def) && isset($abc->def->ghi)

or in a shorter form

    isset($abc, $abc->def, $abc->def->ghi)

you can just write

    isset ($abc->def->ghi)

without raising any errors, warnings or notices.

Examples
<?php
    $abc = (object) array("def" => 123);
    var_dump(isset($abc));                // bool(true)
    var_dump(isset($abc->def));           // bool(true)
    var_dump(isset($abc->def->ghi));      // bool(false)
    var_dump(isset($abc->def->ghi->jkl)); // bool(false)
    var_dump(isset($def));                // bool(false)
    var_dump(isset($def->ghi));           // bool(false)
    var_dump(isset($def->ghi->jkl));      // bool(false)

    var_dump($abc);                       // object(stdClass)#1 (1) { ["def"] => int(123) }
    var_dump($abc->def);                  // int(123)
    var_dump($abc->def->ghi);             // null / E_NOTICE: Trying to get property of non-object
    var_dump($abc->def->ghi->jkl);        // null / E_NOTICE: Trying to get property of non-object
    var_dump($def);                       // null / E_NOTICE: Trying to get property of non-object
    var_dump($def->ghi);                  // null / E_NOTICE: Trying to get property of non-object
    var_dump($def->ghi->jkl);             // null / E_NOTICE: Trying to get property of non-object
?>
mark dot fabrizio at gmail dot com 15-Sep-2008 07:01
I know this is probably not the recommended way to do this, but it seems to work fine for me. Instead of the normal isset check to extract variables from arrays (like $_REQUEST), you can use the @ prefix to squelch any errors.

For example, instead of:
<?php
$test = isset($_REQUEST['test']) ? $_REQUEST['test'] : null;
?>
you can use:
<?php
$test = @$_REQUEST['test'];
?>

It saves some typing, but doesn't give the opportunity to provide a default value. If 'test' is not an assigned key for $_REQUEST, the assigned value will be null.
mandos78 AT mail from google 29-Jul-2008 02:40
Careful with this function "ifsetfor" by soapergem, passing by reference means that if, like the example $_GET['id'], the argument is an array index, it will be created in the original array (with a null value), thus causing posible trouble with the following code. At least in PHP 5.

For example:

<?php
$a = array();
print_r($a);
ifsetor($a["unsetindex"], 'default');
print_r($a);
?>

will print

Array
(
)
Array
(
    [unsetindex] =>
)

Any foreach or similar will be different before and after the call.
anonymousleaf at gmail dot com 25-Feb-2008 10:16
isset expects the variable sign first, so you can't add parentheses or anything.

<?php
    $foo = 1;
    if(isset(($foo))) { // Syntax error at isset((
        $foo = 2;
    }
?>
muratyaman at gmail dot com 07-Feb-2008 04:40
To organize some of the frequently used functions..

<?php

/**
 * Returns field of variable (arr[key] or obj->prop), otherwise the third parameter
 * @param array/object $arr_or_obj
 * @param string $key_or_prop
 * @param mixed $else
 */
function nz($arr_or_obj, $key_or_prop, $else){
  $result = $else;
  if(isset($arr_or_obj)){
    if(is_array($arr_or_obj){
      if(isset($arr_or_obj[$key_or_prop]))
        $result = $arr_or_obj[$key_or_prop];
    }elseif(is_object($arr_or_object))
      if(isset($arr_or_obj->$key_or_prop))
        $result = $arr_or_obj->$key_or_prop;
    }
  }
  return $result;
}

/**
 * Returns integer value using nz()
 */
function nz_int($arr_or_obj, $key_or_prop, $else){
  return intval(nz($arr_or_obj, $key_or_prop, $else));
}

$my_id = nz_int($_REQUEST, 'id', 0);
if($my_id > 0){
  //why?
}
?>
packard_bell_nec at hotmail dot com 25-Dec-2007 11:18
Note: isset() only checks variables as anything else will result in a parse error. In other words, the following will not work: isset(trim($name)).

isset() is the opposite of is_null($var) , except that no warning is generated when the variable is not set.
talbutt(at)mail(dot)med(dot)upenn(edu) 13-Aug-2007 08:30
In PHP 5.2.3, really returns true if the variable is set to null.
beuc at beuc dot net 16-Dec-2006 12:35
"empty() is the opposite of (boolean) var, except that no warning is generated when the variable is not set."

So essentially
<?php
if (isset($var) && $var)
?>
is the same as
<?php
if (!empty($var))
?>
doesn't it? :)

!empty() mimics the chk() function posted before.
randallgirard at hotmail dot com 27-Sep-2006 11:51
The unexpected results of isset has been really frustrating to me. Hence, it doesn't work how you'd think it would, (as documented) a var currently in the scope with a null value will return false.

Heres a quick solution, perhaps there are better ways of going about this, but heres my solution...

<?php
function is_set( $varname, $parent=null ) {
  if ( !is_array( $parent ) && !is_object($parent) ) {
    $parent = $GLOBALS;
  }
  return array_key_exists( $varname, $parent );
}
?>

Hence, $varname should be a mixed value of var's to check for, and $parent can be an array or object, which will default to the GLOBAL scope. See the documentation of array_key_exists for further information.

This will allow to check if a var is in the current scope, object, or array... Whether it's a null, false, true, or any value. It depends on ARRAY_KEY_EXISTS for it's functionality which also works with Objects. Feel free to improve on this anyone ;D
Tee Cee 20-Aug-2006 05:20
In response to 10-Feb-2006 06:02, isset($v) is in all (except possibly buggy) cases equivalent to !is_null($v). And no, it doesn't actually test if a variable is set or not by my definition "$v is set if unset($v) has no effect".

<?php
unset($c); //force $c to be unset
var_dump($a=&$c); // NULL, but this actually sets $a and $c to the 'same' NULL.
var_dump(isset($c)); // bool(false)
var_dump($a = 5); // int(5)
var_dump($c); // int(5)

unset($c);
var_dump($a=&$c); // NULL
var_dump(isset($c)); // bool(false)
unset($c);
var_dump($a = 5); // int(5)
var_dump($c); // NULL
?>

In the following example, we see an alternate method of testing if a variable is actually set or not:
<?php
var_dump(array_key_exists('c',get_defined_vars())); // false
var_dump(isset($c));                                // also false
var_dump($c);                                       // manipulate $c a bit...
var_dump((string)$c);
var_dump(print_r($c,true));
var_dump($a=$c);
var_dump(array_key_exists('c',get_defined_vars())); // ... still false
var_dump($c = NULL);                                // this sets $c
var_dump(array_key_exists('c',get_defined_vars())); // true!
var_dump(isset($c));                                // false; isset() still says it's unset
unset($c);                                          // actually unset it
var_dump(array_key_exists('c',get_defined_vars())); // false
var_dump($a=&$c);
var_dump(array_key_exists('c',get_defined_vars())); // true!
unset($c);                                          // unset it again
var_dump(&$c);                                      // &NULL
var_dump(array_key_exists('c',get_defined_vars())); // true!
?>

Obviously, null values take up space (or they wouldn't show up in get_defined_vars). Also, note that &$v sets $v to NULL if it is unset.
21-Jul-2006 07:08
I tried the example posted previously by Slawek:

$foo = 'a little string';
echo isset($foo)?'yes ':'no ', isset($foo['aaaa'])?'yes ':'no ';

He got yes yes, but he didn't say what version of PHP he was using.

I tried this on PHP 5.0.5 and got:  yes no

But on PHP 4.3.5 I got:  yes yes

Apparently, PHP4 converts the the string 'aaaa' to zero and then returns the string character at that position within the string $foo, when $foo is not an array. That means you can't assume you are dealing with an array, even if you used an expression such as isset($foo['aaaa']['bbb']['cc']['d']), because it will return true also if any part is a string.

PHP5 does not do this. If $foo is a string, the index must actually be numeric (e.g. $foo[0]) for it to return the indexed character.
soywiz at php dot net 14-Apr-2006 06:12
Sometimes you have to check if an array has some keys. To achieve it you can use "isset" like this: isset($array['key1'], $array['key2'], $array['key3'], $array['key4'])
You have to write $array all times and it is reiterative if you use same array each time.

With this simple function you can check if an array has some keys:

<?php
function isset_array() {
    if (func_num_args() < 2) return true;
    $args = func_get_args();
    $array = array_shift($args);
    if (!is_array($array)) return false;
    foreach ($args as $n) if (!isset($array[$n])) return false;
    return true;
}
?>

Use: isset_array($array, 'key1', 'key2', 'key3', 'key4')
First parameter has the array; following parameters has the keys you want to check.
Slawek Petrykowski 29-Nov-2005 03:06
<?php
$foo = 'a little string';
echo isset($foo)?'yes ':'no ', isset($foo['aaaa'])?'yes ':'no ';
>

results with unexpected values:
yes yes

Well, it is necessary to check type of $foo first !
Andrew Penry 11-May-2005 08:17
The following is an example of how to test if a variable is set, whether or not it is NULL. It makes use of the fact that an unset variable will throw an E_NOTICE error, but one initialized as NULL will not.

<?php

function var_exists($var){
    if (empty($GLOBALS['var_exists_err'])) {
        return true;
    } else {
        unset($GLOBALS['var_exists_err']);
        return false;
    }
}

function var_existsHandler($errno, $errstr, $errfile, $errline) {
   $GLOBALS['var_exists_err'] = true;
}

$l = NULL;
set_error_handler("var_existsHandler", E_NOTICE);
echo (var_exists($l)) ? "True " : "False ";
echo (var_exists($k)) ? "True " : "False ";
restore_error_handler();

?>

Outputs:
True False

The problem is, the set_error_handler and restore_error_handler calls can not be inside the function, which means you need 2 extra lines of code every time you are testing. And if you have any E_NOTICE errors caused by other code between the set_error_handler and restore_error_handler they will not be dealt with properly. One solution:

<?php

function var_exists($var){
   if (empty($GLOBALS['var_exists_err'])) {
       return true;
   } else {
       unset($GLOBALS['var_exists_err']);
       return false;
   }
}

function var_existsHandler($errno, $errstr, $errfile, $errline) {
    $filearr = file($errfile);
    if (strpos($filearr[$errline-1], 'var_exists') !== false) {
        $GLOBALS['var_exists_err'] = true;
        return true;
    } else {
        return false;
    }
}

$l = NULL;
set_error_handler("var_existsHandler", E_NOTICE);
echo (var_exists($l)) ? "True " : "False ";
echo (var_exists($k)) ? "True " : "False ";
is_null($j);
restore_error_handler();

?>

Outputs:
True False
Notice: Undefined variable: j in filename.php on line 26

This will make the handler only handle var_exists, but it adds a lot of overhead. Everytime an E_NOTICE error happens, the file it originated from will be loaded into an array.
yaogzhan at gmail dot com 20-Mar-2005 04:52
in PHP5, if you have

<?PHP
class Foo
{
    protected $data = array('bar' => null);

    function __get($p)
    {
        if( isset($this->data[$p]) ) return $this->data[$p];
    }
}
?>

and
<?PHP
$foo = new Foo;
echo isset($foo->bar);
?>
will always echo 'false'. because the isset() accepts VARIABLES as it parameters, but in this case, $foo->bar is NOT a VARIABLE. it is a VALUE returned from the __get() method of the class Foo. thus the isset($foo->bar) expreesion will always equal 'false'.
pianistsk8er at gmail dot com 09-Dec-2004 06:23
This function is very useful while calling to the URL to specify which template to be used on certain parts of your application.

Here is an example...

<?php

    $cat = $_GET['c'];
    $id = $_GET['id'];
    $error = 'templates/error.tpl';

    if( isset($cat))
    {
        if( isset($id))
        {
            $var = 'templates/pics/' . $cat . '-' . $id . '.tpl';
            if (is_file($var))
            {
                include($var);
            }
            else
            {
                include($error);
            }
        }
        else
        {
            $var = 'templates/pics/' . $cat . '.tpl';
            if (is_file($var))
            {
                include($var);
            }
            else
            {
                include($error);
            }
        }
    }
    else
    {
        include('templates/alternative.'.tpl);
    }

?>

You can see several uses of the isset function being used to specify wheter a template is to be called upon or not.  This can easily prevent other generic PHP errors.


Affiche des informations lisibles pour une variable

  • « isset
  • serialize »
  • PHP Manual
  • Fonctions de gestion des variables
  • Affiche des informations lisibles pour une variable

print_r

(PHP 4, PHP 5, PHP 7, PHP 8)

print_r — Affiche des informations lisibles pour une variable

Description

print_r ( mixed $value , bool $return = false ) : string|bool

print_r() affiche des informations à propos d'une variable, de manière à ce qu'elle soit lisible.

print_r(), var_dump() et var_export() affiche également les propriétés protégées et privées d'un objet. Les membres des classes statiques ne seront pas affichés.

Liste de paramètres

value

L'expression à afficher.

return

Si vous voulez obtenir le résultat de print_r() dans une chaîne, utilisez le paramètre return. Lorsque ce paramètre vaut true, print_r() retournera l'information plutôt que de l'afficher.

Valeurs de retour

Si une chaîne de caractères, un entier ou un nombre décimal est fournie, sa valeur sera affichée. Si un tableau est fourni, les valeurs seront affichées dans un format permettant de voir les clés et les éléments. Un format similaire sera également utilisé pour les objets.

Lorsque le paramètre return vaut true, cette fonction retournera une chaîne de caractères. Autrement, la valeur de retour sera true.

Notes

Note:

Lorsque le paramètre return est utilisé, cette fonction utilisait la mise en tampon (buffer) interne de sortie antérieur à PHP 7.1.0, et donc ne peut pas être utilisé dans la fonction de rappel de ob_start().

Exemples

Exemple #1 Exemple avec print_r()

<pre>
<?php
$a = array ('a' => 'apple', 'b' => 'banana', 'c' => array ('x', 'y', 'z'));
print_r ($a);
?>
</pre>

L'exemple ci-dessus va afficher :

<pre>
Array
(
    [a] => apple
    [b] => banana
    [c] => Array
        (
            [0] => x
            [1] => y
            [2] => z
        )
)
</pre>

Exemple #2 Exemple avec le paramètre return

<?php
$b = array ('m' => 'monkey', 'foo' => 'bar', 'x' => array ('x', 'y', 'z'));
$results = print_r($b, true); // $results contient l'affichage de print_r
?>

Voir aussi

  • ob_start() - Enclenche la temporisation de sortie
  • var_dump() - Affiche les informations d'une variable
  • var_export() - Retourne le code PHP utilisé pour générer une variable

User Contributed Notes

ajaykwatra at gmail dot com 12-Mar-2018 08:33
easier and better readability with print_r and vardump for php developers

https://gist.github.com/akwatra/b6a2f21b33e7a86d148618d8a83276b0
Soaku 28-Sep-2017 04:47
liamtoh6@hotmail.com posted a function that will echo print_r output with proper new lines in HTML files. He used <pre> for it to work, but that might not be always the best method to go. For example, it is not valid to place <pre> inside <p>.

Here is my way to do this:

<?php

function print_rbr ($var, $return = false) {
  $r = nl2br(htmlspecialchars(print_r($var, true)));
  if ($return) return $r;
  else echo $r;
}

?>

This function will:

- Place <br> where newlines are,
- Escape unsecure characters with HTML entities.
Soaku 28-Jul-2017 10:24
Remember to always htmlspecialchars print_r output, if it can contain html characters.

<?php

$array = array("<some>html<tags>");

print_r($array); // Invalid output, HTML breaks.
echo htmlspecialchars(print_r($array, true)); // Works and doesn't break the output.
?>
simivar at gmail dot com 21-Jun-2017 01:31
I've fixed function wrote by Matt to reverse print_r - it had problems with null values. Created a GIST for that too so please add any future fixes in there instead of this comment section:
https://gist.github.com/simivar/037b13a9bbd53ae5a092d8f6d9828bc3

<?php
/**
  * Matt: core
  * Trixor: object handling
  * lech: Windows suppport
  * simivar: null support
  *
  * @see http://php.net/manual/en/function.print-r.php
  **/
function print_r_reverse($input) {
        $lines = preg_split('#\r?\n#', trim($input));
        if (trim($lines[ 0 ]) != 'Array' && trim($lines[ 0 ] != 'stdClass Object')) {
            // bottomed out to something that isn't an array or object
            if ($input === '') {
                return null;
            }

            return $input;
        } else {
            // this is an array or object, lets parse it
            $match = array();
            if (preg_match("/(\s{5,})\(/", $lines[ 1 ], $match)) {
                // this is a tested array/recursive call to this function
                // take a set of spaces off the beginning
                $spaces = $match[ 1 ];
                $spaces_length = strlen($spaces);
                $lines_total = count($lines);
                for ($i = 0; $i < $lines_total; $i++) {
                    if (substr($lines[ $i ], 0, $spaces_length) == $spaces) {
                        $lines[ $i ] = substr($lines[ $i ], $spaces_length);
                    }
                }
            }
            $is_object = trim($lines[ 0 ]) == 'stdClass Object';
            array_shift($lines); // Array
            array_shift($lines); // (
            array_pop($lines); // )
            $input = implode("\n", $lines);
            $matches = array();
            // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
            preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $input, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
            $pos = array();
            $previous_key = '';
            $in_length = strlen($input);
            // store the following in $pos:
            // array with key = key of the parsed array's item
            // value = array(start position in $in, $end position in $in)
            foreach ($matches as $match) {
                $key = $match[ 1 ][ 0 ];
                $start = $match[ 0 ][ 1 ] + strlen($match[ 0 ][ 0 ]);
                $pos[ $key ] = array($start, $in_length);
                if ($previous_key != '') {
                    $pos[ $previous_key ][ 1 ] = $match[ 0 ][ 1 ] - 1;
                }
                $previous_key = $key;
            }
            $ret = array();
            foreach ($pos as $key => $where) {
                // recursively see if the parsed out value is an array too
                $ret[ $key ] = print_r_reverse(substr($input, $where[ 0 ], $where[ 1 ] - $where[ 0 ]));
            }

            return $is_object ? (object)$ret : $ret;
        }
    }
?>
anymix dot services at gmail dot com 28-May-2017 04:31
// New var export option

function varExp($E,$vE){
    $vE.="=array(";$sep="";
    foreach ($E as $veK => $veV) {
        $vE.=$sep."'$veK'=>'$veV'";$sep=",";
    }
    $vE.=");";
    return $vE;
}

print varExp($I,"\$I");
lech 02-May-2017 08:30
A slight amendment to Matt's awesome print_r_reverse function (Thank You, a life-saver - data recovery :-) . If the output is copied from a Windows system, the end of lines may include the return character "\r" and so the scalar (string) elements will include a trailing "\r" character that isn't suppose to be there. To resolve, replace the first line in the function with...

<?php $lines = preg_split('#\r?\n#', trim($in)); ?>

This will work for both cases (Linux and Windows).

I include the entire function below for completeness, but all credit to Matt, the original author, Thank You.

<?php
//Author: Matt (http://us3.php.net/print_r)
function print_r_reverse($in) {
    $lines = preg_split('#\r?\n#', trim($in));
    if (trim($lines[0]) != 'Array') {
        // bottomed out to something that isn't an array
        return $in;
    } else {
        // this is an array, lets parse it
        if (preg_match("/(\s{5,})\(/", $lines[1], $match)) {
            // this is a tested array/recursive call to this function
            // take a set of spaces off the beginning
            $spaces = $match[1];
            $spaces_length = strlen($spaces);
            $lines_total = count($lines);
            for ($i = 0; $i < $lines_total; $i++) {
                if (substr($lines[$i], 0, $spaces_length) == $spaces) {
                    $lines[$i] = substr($lines[$i], $spaces_length);
                }
            }
        }
        array_shift($lines); // Array
        array_shift($lines); // (
        array_pop($lines); // )
        $in = implode("\n", $lines);
        // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
        preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $in, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
        $pos = array();
        $previous_key = '';
        $in_length = strlen($in);
        // store the following in $pos:
        // array with key = key of the parsed array's item
        // value = array(start position in $in, $end position in $in)
        foreach ($matches as $match) {
            $key = $match[1][0];
            $start = $match[0][1] + strlen($match[0][0]);
            $pos[$key] = array($start, $in_length);
            if ($previous_key != '') $pos[$previous_key][1] = $match[0][1] - 1;
            $previous_key = $key;
        }
        $ret = array();
        foreach ($pos as $key => $where) {
            // recursively see if the parsed out value is an array too
            $ret[$key] = print_r_reverse(substr($in, $where[0], $where[1] - $where[0]));
        }
        return $ret;
    }
}
?>
Trixor 01-Feb-2017 07:12
I've made a small improvement to the print_r_reverse function to also handle objects. Thanks to Matt for making the original.

<?php
function print_r_reverse($in) {
  $lines = explode("\n", trim($in));
  if (trim($lines[0]) != 'Array' && trim($lines[0] != 'stdClass Object')) {
// bottomed out to something that isn't an array or object
    return $in;
  } else {
// this is an array or object, lets parse it
    $match = array();
    if (preg_match("/(\s{5,})\(/", $lines[1], $match)) {
// this is a tested array/recursive call to this function
// take a set of spaces off the beginning
      $spaces = $match[1];
      $spaces_length = strlen($spaces);
      $lines_total = count($lines);
      for ($i = 0; $i < $lines_total; $i++) {
        if (substr($lines[$i], 0, $spaces_length) == $spaces) {
          $lines[$i] = substr($lines[$i], $spaces_length);
        }
      }
    }
    $is_object = trim($lines[0]) == 'stdClass Object';
    array_shift($lines); // Array
    array_shift($lines); // (
    array_pop($lines); // )
    $in = implode("\n", $lines);
    $matches = array();
// make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
    preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $in, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
    $pos = array();
    $previous_key = '';
    $in_length = strlen($in);
// store the following in $pos:
// array with key = key of the parsed array's item
// value = array(start position in $in, $end position in $in)
    foreach ($matches as $match) {
      $key = $match[1][0];
      $start = $match[0][1] + strlen($match[0][0]);
      $pos[$key] = array($start, $in_length);
      if ($previous_key != '') {
        $pos[$previous_key][1] = $match[0][1] - 1;
      }
      $previous_key = $key;
    }
    $ret = array();
    foreach ($pos as $key => $where) {
// recursively see if the parsed out value is an array too
      $ret[$key] = print_r_reverse(substr($in, $where[0], $where[1] - $where[0]));
    }
    return $is_object ? (object) $ret : $ret;
  }
}
?>
ntd at entidi dot it 31-Jul-2015 05:43
Another attempt that tries to overcome the memory blowout when the passed in data has mutual recursion.

<?php
function safe_print_r($data, $nesting = 5, $indent = '') {
    if (! is_object($data) && ! is_array($data)) {
        var_dump($data);
    } elseif ($nesting < 0) {
        echo "** MORE **\n";
    } else {
        echo ucfirst(gettype($data)) . " (\n";
        foreach ((array) $data as $k => $v) {
            echo $indent . "\t[$k] => ";
            safe_print_r($v, $nesting - 1, "$indent\t");
        }
        echo "$indent)\n";
    }
}
?>
Sumit 27-May-2015 01:20
I prefer to use
<?php
printf("<pre>%s</pre>",print_r($_POST, true));
?>
Simon Asika 06-Nov-2013 04:06
Here is a print_r() clone but support max level limit.

When we want to print a big object, this will help us get a clean dumping data.

<?php

/**
 * Recrusive print variables and limit by level.
 *
 * @param   mixed  $data   The variable you want to dump.
 * @param   int    $level  The level number to limit recrusive loop.
 *
 * @return  string  Dumped data.
 *
 * @author  Simon Asika (asika32764[at]gmail com)
 * @date    2013-11-06
 */
function print_r_level($data, $level = 5)
{
    static $innerLevel = 1;

    static $tabLevel = 1;

    static $cache = array();

    $self = __FUNCTION__;

    $type       = gettype($data);
    $tabs       = str_repeat('    ', $tabLevel);
    $quoteTabes = str_repeat('    ', $tabLevel - 1);

    $recrusiveType = array('object', 'array');

    // Recrusive
    if (in_array($type, $recrusiveType))
    {
        // If type is object, try to get properties by Reflection.
        if ($type == 'object')
        {
            if (in_array($data, $cache))
            {
                return "\n{$quoteTabes}*RECURSION*\n";
            }

            // Cache the data
            $cache[] = $data;

            $output     = get_class($data) . ' ' . ucfirst($type);
            $ref        = new \ReflectionObject($data);
            $properties = $ref->getProperties();

            $elements = array();

            foreach ($properties as $property)
            {
                $property->setAccessible(true);

                $pType = $property->getName();

                if ($property->isProtected())
                {
                    $pType .= ":protected";
                }
                elseif ($property->isPrivate())
                {
                    $pType .= ":" . $property->class . ":private";
                }

                if ($property->isStatic())
                {
                    $pType .= ":static";
                }

                $elements[$pType] = $property->getValue($data);
            }
        }
        // If type is array, just retun it's value.
        elseif ($type == 'array')
        {
            $output = ucfirst($type);
            $elements = $data;
        }

        // Start dumping datas
        if ($level == 0 || $innerLevel < $level)
        {
            // Start recrusive print
            $output .= "\n{$quoteTabes}(";

            foreach ($elements as $key => $element)
            {
                $output .= "\n{$tabs}[{$key}] => ";

                // Increment level
                $tabLevel = $tabLevel + 2;
                $innerLevel++;

                $output  .= in_array(gettype($element), $recrusiveType) ? $self($element, $level) : $element;

                // Decrement level
                $tabLevel = $tabLevel - 2;
                $innerLevel--;
            }

            $output .= "\n{$quoteTabes})\n";
        }
        else
        {
            $output .= "\n{$quoteTabes}*MAX LEVEL*\n";
        }
    }

    // Clean cache
    if($innerLevel == 1)
    {
        $cache = array();
    }

    return $output;
}// End function

// TEST ------------------------------------

class testClass
{
    protected $a = 'aaa';

    private $b = 'bbb';

    public $c = array(1, 2, ['a', 'b', 'c'], 4);

    static public $d = 'ddd';

    static protected $e = 'eee';
}

$test = new testClass;

$test->testClass = $test;

echo '<pre>' . print_r_level($test, 3) . '</pre>';

?>

will output
-------------------------------------------------------------

testClass Object
(
    [a:protected] => aaa
    [b:testClass:private] => bbb
    [c] => Array
        (
            [0] => 1
            [1] => 2
            [2] => Array
                *MAX LEVEL*

            [3] => 4
        )

    [d:static] => ddd
    [e:protected:static] => eee
    [testClass] =>
        *RECURSION*

)
preda dot vlad at yahoo dot com 22-Mar-2013 09:40
print_r(), just like var_dump() does NOT cast an object, not even if it has a __toString() method - which is normal.

<?php
class A {
    public function __toString() {
        return 'In class A';
    }
}
$a = new A;
echo $a; // In class A
print_r($a); // A Object()
// you can simulate the echo by casting it manually
print_r((string)$a);  // In class A
henzeberkheij at gmail dot com 28-Jan-2012 03:10
print_r is used for debug purposes. Yet I had some classes where I just wanted the values coming out of the database, not all the other crap. thus i wrote the following function. If your class has an toArray function, that one will be called otherwise it will return the object as is. print_neat_classes_r is the function that should be called!

<?php
print_neat_classes_r($array, $return=false){
        return print_r(self::neat_class_print_r($array), $return);
    }

function do_print_r($array, $return=false){
        if(is_object($array) && method_exists($array, 'toArray')){
            return $array->toArray();
        }else if(is_array($array)){
            foreach($array as $key=>$obj){
                $array[$key] = self::do_print_r($obj, $return);
            }
            return $array;
        }else{
            return $array;
        }
    }
?>
eithed 21-Oct-2011 02:25
Bear in mind that print_r actually reserves some memory to do something - so, for example thing like:

<?php
function shutdown_handler()
{
    file_put_contents($_SERVER['DOCUMENT_ROOT']."/log.txt", print_r($_REQUEST, true));
}

ini_set('memory_limit', '1M');
register_shutdown_function("shutdown_handler");

$array = array();
while(true)
    $array[] = new stdClass();
?>

will just not work. Try using var_export, and presto, everything is fine.
machuidel 03-Feb-2011 04:01
The following will output an array in a PHP parsable format:

<?php
function serialize_array(&$array, $root = '$root', $depth = 0)
{
        $items = array();

        foreach($array as $key => &$value)
        {
                if(is_array($value))
                {
                        serialize_array($value, $root . '[\'' . $key . '\']', $depth + 1);
                }
                else
                {
                        $items[$key] = $value;
                }
        }

        if(count($items) > 0)
        {
                echo $root . ' = array(';

                $prefix = '';
                foreach($items as $key => &$value)
                {
                        echo $prefix . '\'' . $key . '\' => \'' . addslashes($value) . '\'';
                        $prefix = ', ';
                }

                echo ');' . "\n";
        }
}
?>
Alexander 19-Mar-2010 05:20
A simple function to send the output of print_r to firebug.
The script creates a dummy console object with a log method for when firebug is disabled/not available.

<?php
function debug ($data) {
    echo "<script>\r\n//<![CDATA[\r\nif(!console){var console={log:function(){}}}";
    $output    =    explode("\n", print_r($data, true));
    foreach ($output as $line) {
        if (trim($line)) {
            $line    =    addslashes($line);
            echo "console.log(\"{$line}\");";
        }
    }
    echo "\r\n//]]>\r\n</script>";
}
?>
liamtoh6 at hotmail dot com 03-Feb-2010 10:01
I add this function to the global scope on just about every project I do, it makes reading the output of print_r() in a browser infinitely easier.

<?php
function print_r2($val){
        echo '<pre>';
        print_r($val);
        echo  '</pre>';
}
?>

It also makes sense in some cases to add an if statement to only display the output in certain scenarios, such as:

if(debug==true)
if($_SERVER['REMOTE_ADDR'] == '127.0.0.1')
Matt 14-Sep-2009 12:53
Here is another version that parses the print_r() output. I tried the one posted, but I had difficulties with it. I believe it has a problem with nested arrays. This handles nested arrays without issue as far as I can tell.

<?php
function print_r_reverse($in) {
    $lines = explode("\n", trim($in));
    if (trim($lines[0]) != 'Array') {
        // bottomed out to something that isn't an array
        return $in;
    } else {
        // this is an array, lets parse it
        if (preg_match("/(\s{5,})\(/", $lines[1], $match)) {
            // this is a tested array/recursive call to this function
            // take a set of spaces off the beginning
            $spaces = $match[1];
            $spaces_length = strlen($spaces);
            $lines_total = count($lines);
            for ($i = 0; $i < $lines_total; $i++) {
                if (substr($lines[$i], 0, $spaces_length) == $spaces) {
                    $lines[$i] = substr($lines[$i], $spaces_length);
                }
            }
        }
        array_shift($lines); // Array
        array_shift($lines); // (
        array_pop($lines); // )
        $in = implode("\n", $lines);
        // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
        preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $in, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
        $pos = array();
        $previous_key = '';
        $in_length = strlen($in);
        // store the following in $pos:
        // array with key = key of the parsed array's item
        // value = array(start position in $in, $end position in $in)
        foreach ($matches as $match) {
            $key = $match[1][0];
            $start = $match[0][1] + strlen($match[0][0]);
            $pos[$key] = array($start, $in_length);
            if ($previous_key != '') $pos[$previous_key][1] = $match[0][1] - 1;
            $previous_key = $key;
        }
        $ret = array();
        foreach ($pos as $key => $where) {
            // recursively see if the parsed out value is an array too
            $ret[$key] = print_r_reverse(substr($in, $where[0], $where[1] - $where[0]));
        }
        return $ret;
    }
}

?>
Bob 08-May-2009 03:19
Here is a function that formats the output of print_r as a expandable/collapsable tree list using HTML and JavaScript.
<?php
function print_r_tree($data)
{
    // capture the output of print_r
    $out = print_r($data, true);

    // replace something like '[element] => <newline> (' with <a href="javascript:toggleDisplay('...');">...</a><div id="..." style="display: none;">
    $out = preg_replace('/([ \t]*)(\[[^\]]+\][ \t]*\=\>[ \t]*[a-z0-9 \t_]+)\n[ \t]*\(/iUe',"'\\1<a href=\"javascript:toggleDisplay(\''.(\$id = substr(md5(rand().'\\0'), 0, 7)).'\');\">\\2</a><div id=\"'.\$id.'\" style=\"display: none;\">'", $out);

    // replace ')' on its own on a new line (surrounded by whitespace is ok) with '</div>
    $out = preg_replace('/^\s*\)\s*$/m', '</div>', $out);

    // print the javascript function toggleDisplay() and then the transformed output
    echo '<script language="Javascript">function toggleDisplay(id) { document.getElementById(id).style.display = (document.getElementById(id).style.display == "block") ? "none" : "block"; }</script>'."\n$out";
}
?>
Pass it a multidimensional array or object and each sub-array/object will be hidden and replaced by a html link that will toggle its display on and off.
Its quick and dirty, but great for debugging the contents of large arrays and objects.
Note: You'll want to surround the output with <pre></pre>
sebasg37 at gmail dot com 25-Jan-2009 09:35
If you have to catch the output without showing it at all at first (for example, if you want to append the print_r output to a file), you can do this:

<?php

ob_start();
print_r( $some_array );
$output = ob_get_clean();

// if you want to append the print_r output of $some_array to, let's say, log.txt:

file_put_contents( 'log.txt', file_get_contents( 'log.txt' ) . $output )

?>
afisher8 at cox dot net 17-Dec-2008 08:53
I use this all the time when debugging objects, but when you have a very large object with big arrays of sub-objects, it's easy to get overwhelmed with the large amount of output....sometimes you don't want to see absolutely every sub-object.

I made this function to debug objects while "hiding" sub-objects of certain types.  This also color codes the output for a more readable printout.

<?php

function wtf($var, $arrayOfObjectsToHide=null, $fontSize=11)
{
    $text = print_r($var, true);

    if (is_array($arrayOfObjectsToHide)) {

        foreach ($arrayOfObjectsToHide as $objectName) {

            $searchPattern = '#('.$objectName.' Object\n(\s+)\().*?\n\2\)\n#s';
            $replace = "$1<span style=\"color: #FF9900;\">--&gt; HIDDEN - courtesy of wtf() &lt;--</span>)";
            $text = preg_replace($searchPattern, $replace, $text);
        }
    }

    // color code objects
    $text = preg_replace('#(\w+)(\s+Object\s+\()#s', '<span style="color: #079700;">$1</span>$2', $text);
    // color code object properties
    $text = preg_replace('#\[(\w+)\:(public|private|protected)\]#', '[<span style="color: #000099;">$1</span>:<span style="color: #009999;">$2</span>]', $text);

    echo '<pre style="font-size: '.$fontSize.'px; line-height: '.$fontSize.'px;">'.$text.'</pre>';
}

// example usage:
wtf($myBigObject, array('NameOfObjectToHide_1', 'NameOfObjectToHide_2'));

?>
kurt krueckeberg 28-Oct-2008 10:53
This is an alternative for printing arrays. It bolds array values.

<?php
function print_array(&$a, $str = "")
{
    if ($str[0]) {
        echo "$str =";
    }
    echo ' array( ';
    foreach ($a as $k => $v) {

        echo "[$k]".' => ';

        if (is_array($v)) {
            print_array($v);
        }
        else {
               echo "<strong>$a[$k]</strong> ";
        }
    }
    echo ')  ';
}
$a1 = array ("apples", "oranges", "pears");
$a2 = array ("potatos", "green beans", "squash");
$a3 = array ("euros", "dollars", "pesos", "dinars");
$test = range(1, 9);
array_push($test, array ("fruit" => $a1, "vegies" => $a2, "money" => $a3));
print_array($test, "test");
?>
schizo do not spamme duckie at gmail dot com 07-Oct-2008 05:00
my take on the highlighted markupped debug function:

<?php
/**
 * print_array()
 * Does a var_export of the array and returns it between <pre> tags
 *
 * @param mixed $var any input you can think of
 * @return string HTML
 */
function print_array($var)
{
    $input =var_export($var,true);
    $input = preg_replace("! => \n\W+ array \(!Uims", " => Array ( ", $input);
    $input = preg_replace("!array \(\W+\),!Uims", "Array ( ),", $input);
    return("<pre>".str_replace('><?', '>', highlight_string('<'.'?'.$input, true))."</pre>");
}
?>
brenden at beagleproductions dot com 28-Aug-2008 01:58
Many developers have submitted bugs to the PHP development team with regards to print_r showing protected and private properties of objects (PHP 5).  This is not a bug; sensitive information (ex. database connection object) should be  encapsulated within a private member function of your class.
admin at swivelgames dot com 17-Aug-2008 01:44
I was having problems using print_r because I didn't like the fact that if tags where included in the array it would still be parsed by the browsers.

Heres a simple fix for anyone who is having the same problem as I did. This will output your text properly for viewing through the browser instead of the browser's "view source" or CLI.

Script:
<?php

     $MyArray[0]="<div align='center'>My Text</div>";

     echo "<pre>".htmlspecialchars(print_r($MyArray,true))."</pre>";

?>

Output:
<pre>Array
(
    [0] =&gt; &lt;div align='center'&gt;My Text&lt;/div&gt;
)
</pre>
Anonymous 28-Jun-2008 01:21
I have written a nice debugging function.
This function handles arrays beautifully.
<?php
//Debug variables, $i and $k are for recursive use
function DebugDisplayVar($input, $name = "Debug", $i = "0", $k = array("Error")){
    if(is_array($input))
    {    foreach ($input as $i => $value){
            $temp = $k;
            $temp[] = $i;
            DebugDisplayVar($value, $name, $i, $temp);}
    }else{//if not array
        echo "$".$name;//[$k]
        foreach ($k as $i => $value){
            if($value !=="Error"){echo "[$value]";}
        }
        echo " = $input<br>";
}    }

//outputs
Debug[0] = value
Debug[1] = another value
ect...

?>
janci 13-May-2008 02:49
You cannot use print_r(), var_dump() nor var_export() to get static member variables of a class. However, in PHP5 you can use Reflection classes for this:

<?php

$reflection = new ReflectionClass('Static');
print_r($reflection->getStaticProperties());

?>
helpful at maybe dot com 06-Mar-2008 08:13
Another slight modification to the previous post to allow for empty array elements

added the following lines after the first preg_match block
<?php
        } else if ($expecting == 2 && preg_match('/^\[(.+?)\] \=\>$/', $trim, $matches)) { // array element
            // the array element is blank
            list ($fullMatch, $key) = $matches;
            $topArray[$key] = $element;
        }

?>
anon at anon dot com 29-Feb-2008 10:30
A slight modification to the previous post to allow for arrays containing mutli line strings. haven't fully tested it with everything, but seems to work great for the stuff i've done so far.

<?php

function print_r_reverse(&$output)
{
    $expecting = 0; // 0=nothing in particular, 1=array open paren '(', 2=array element or close paren ')'
    $lines = explode("\n", $output);
    $result = null;
    $topArray = null;
    $arrayStack = array();
    $matches = null;
    while (!empty($lines) && $result === null)
    {
        $line = array_shift($lines);
        $trim = trim($line);
        if ($trim == 'Array')
        {
            if ($expecting == 0)
            {
                $topArray = array();
                $expecting = 1;
            }
            else
            {
                trigger_error("Unknown array.");
            }
        }
        else if ($expecting == 1 && $trim == '(')
        {
            $expecting = 2;
        }
        else if ($expecting == 2 && preg_match('/^\[(.+?)\] \=\> (.+)$/', $trim, $matches)) // array element
        {
            list ($fullMatch, $key, $element) = $matches;
            if (trim($element) == 'Array')
            {
                $topArray[$key] = array();
                $newTopArray =& $topArray[$key];
                $arrayStack[] =& $topArray;
                $topArray =& $newTopArray;
                $expecting = 1;
            }
            else
            {
                $topArray[$key] = $element;
            }
        }
        else if ($expecting == 2 && $trim == ')') // end current array
        {
            if (empty($arrayStack))
            {
                $result = $topArray;
            }
            else // pop into parent array
            {
                // safe array pop
                $keys = array_keys($arrayStack);
                $lastKey = array_pop($keys);
                $temp =& $arrayStack[$lastKey];
                unset($arrayStack[$lastKey]);
                $topArray =& $temp;
            }
        }
        // Added this to allow for multi line strings.
    else if (!empty($trim) && $expecting == 2)
    {
        // Expecting close parent or element, but got just a string
        $topArray[$key] .= "\n".$line;
    }
        else if (!empty($trim))
        {
            $result = $line;
        }
    }

    $output = implode(n, $lines);
    return $result;
}

/**
 * @param string $output : The output of a multiple print_r calls, separated by newlines
 * @return mixed[] : parseable elements of $output
 */
function print_r_reverse_multiple($output)
{
    $result = array();
    while (($reverse = print_r_reverse($output)) !== NULL)
    {
        $result[] = $reverse;
    }
    return $result;
}

$output = '
Array
(
    [a] => apple
    [b] => banana
    [c] => Array
        (
            [0] => x
            [1] => y
            [2] => z
            [3] => Array
            (
                [nest] => yes
                [nest2] => Array
                (
                    [nest] => some more
                    asffjaskkd
                )
                [nest3] => o rly?
            )
        )
)

some extra stuff
';
var_dump(print_r_reverse($output), $output);

?>

This should output

array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  array(4) {
    [0]=>
    string(1) "x"
    [1]=>
    string(1) "y"
    [2]=>
    string(1) "z"
    [3]=>
    array(3) {
      ["nest"]=>
      string(3) "yes"
      ["nest2"]=>
      array(1) {
        ["nest"]=>
        string(40) "some more
                    asffjaskkd"
      }
      ["nest3"]=>
      string(6) "o rly?"
    }
  }
}
string(18) "nsome extra stuffn"

Added:
else if (!empty($trim) && $expecting == 2)
{
    // Expecting close parent or element, but got just a string
    $topArray[$key] .= "\n".$line;
}
bart at mediawave dot nl 30-Oct-2007 04:27
Here's a PHP version of print_r which can be tailored to your needs. Shows protected and private properties of objects and detects recursion (for objects only!). Usage:

void u_print_r ( mixed $expression [, array $ignore] )

Use the $ignore parameter to provide an array of property names that shouldn't be followed recursively.

<?php

function u_print_r($subject, $ignore = array(), $depth = 1, $refChain = array())
{
    if ($depth > 20) return;
    if (is_object($subject)) {
        foreach ($refChain as $refVal)
            if ($refVal === $subject) {
                echo "*RECURSION*\n";
                return;
            }
        array_push($refChain, $subject);
        echo get_class($subject) . " Object ( \n";
        $subject = (array) $subject;
        foreach ($subject as $key => $val)
            if (is_array($ignore) && !in_array($key, $ignore, 1)) {
                echo str_repeat(" ", $depth * 4) . '[';
                if ($key{0} == "\0") {
                    $keyParts = explode("\0", $key);
                    echo $keyParts[2] . (($keyParts[1] == '*')  ? ':protected' : ':private');
                } else
                    echo $key;
                echo '] => ';
                u_print_r($val, $ignore, $depth + 1, $refChain);
            }
        echo str_repeat(" ", ($depth - 1) * 4) . ")\n";
        array_pop($refChain);
    } elseif (is_array($subject)) {
        echo "Array ( \n";
        foreach ($subject as $key => $val)
            if (is_array($ignore) && !in_array($key, $ignore, 1)) {
                echo str_repeat(" ", $depth * 4) . '[' . $key . '] => ';
                u_print_r($val, $ignore, $depth + 1, $refChain);
            }
        echo str_repeat(" ", ($depth - 1) * 4) . ")\n";
    } else
        echo $subject . "\n";
}

?>

Example:

<?php

class test {

    public $var1 = 'a';
    protected $var2 = 'b';
    private $var3 = 'c';
    protected $array = array('x', 'y', 'z');

}

$test = new test();
$test->recursiveRef = $test;
$test->anotherRecursiveRef->recursiveRef = $test;
$test->dont->follow = 'me';

u_print_r($test, array('dont'));

?>

Will produce:

test Object (
    [var1] => a
    [var2:protected] => b
    [var3:private] => c
    [array:protected] => Array (
        [0] => x
        [1] => y
        [2] => z
    )
    [recursiveRef] => *RECURSION*
    [anotherRecursiveRef] => stdClass Object (
        [recursiveRef] => *RECURSION*
    )
)
motin at demomusic dot nu 19-Jun-2007 04:01
This works around the hacky nature of print_r in return mode (using output buffering for the return mode to work is hacky...):

<?php
/**
  * An alternative to print_r that unlike the original does not use output buffering with
  * the return parameter set to true. Thus, Fatal errors that would be the result of print_r
  * in return-mode within ob handlers can be avoided.
  *
  * Comes with an extra parameter to be able to generate html code. If you need a
  * human readable DHTML-based print_r alternative, see http://krumo.sourceforge.net/
  *
  * Support for printing of objects as well as the $return parameter functionality
  * added by Fredrik Wollsén (fredrik dot motin at gmail), to make it work as a drop-in
  * replacement for print_r (Except for that this function does not output
  * paranthesises around element groups... ;) )
  *
  * Based on return_array() By Matthew Ruivo (mruivo at gmail)
  * (http://se2.php.net/manual/en/function.print-r.php#73436)
  */
function obsafe_print_r($var, $return = false, $html = false, $level = 0) {
    $spaces = "";
    $space = $html ? "&nbsp;" : " ";
    $newline = $html ? "<br />" : "\n";
    for ($i = 1; $i <= 6; $i++) {
        $spaces .= $space;
    }
    $tabs = $spaces;
    for ($i = 1; $i <= $level; $i++) {
        $tabs .= $spaces;
    }
    if (is_array($var)) {
        $title = "Array";
    } elseif (is_object($var)) {
        $title = get_class($var)." Object";
    }
    $output = $title . $newline . $newline;
    foreach($var as $key => $value) {
        if (is_array($value) || is_object($value)) {
            $level++;
            $value = obsafe_print_r($value, true, $html, $level);
            $level--;
        }
        $output .= $tabs . "[" . $key . "] => " . $value . $newline;
    }
    if ($return) return $output;
      else echo $output;
}
?>

Built on a function earlier posted in these comments as stated in the Doc comment. Cheers! /Fredrik (Motin)
Enthusiastic PHPers 22-Mar-2007 12:03
We had an interesting problem dumping an object that
contained embedded HTML. The application makes use
of buffer manipulation functions, so print_r's 2nd argument
wasn't helpful. Here is how we solved the problem:

$object = new ObjectContainingHTML();
$savedbuffercontents = ob_get_clean();
print_r($object);
$print_r_output = ob_get_clean();
ob_start();
echo $savedbuffercontents;
echo htmlentities($print_r_output);
Matthew Ruivo (mruivo at gmail) 22-Feb-2007 10:47
For those of you needing to print an array within a buffer callback function, I've created this quick function. It simply returns the array as a readable string rather than printing it. You can even choose whether to return it in normal text-mode or HTML. It's recursive, so multi-dimensial arrays are supported. I hope someone finds this useful!

<?php

    function return_array($array, $html = false, $level = 0) {
        $space = $html ? "&nbsp;" : " ";
        $newline = $html ? "<br />" : "\n";
        for ($i = 1; $i <= 6; $i++) {
            $spaces .= $space;
        }
        $tabs = $spaces;
        for ($i = 1; $i <= $level; $i++) {
            $tabs .= $spaces;
        }
        $output = "Array" . $newline . $newline;
        foreach($array as $key => $value) {
            if (is_array($value)) {
                $level++;
                $value = return_array($value, $html, $level);
                $level--;
            }
            $output .= $tabs . "[" . $key . "] => " . $value . $newline;
        }
        return $output;
    }

?>
reinder at fake-address dot com 31-Jan-2006 09:09
I always use this function in my code, because most of my functions return an Array or Boolean :

<?php

function printr ( $object , $name = '' ) {

    print ( '\'' . $name . '\' : ' ) ;

    if ( is_array ( $object ) ) {
        print ( '<pre>' )  ;
        print_r ( $object ) ;
        print ( '</pre>' ) ;
    } else {
        var_dump ( $object ) ;
    }

}

?>

( print_r gives no output on FALSE and that can be annoying! )
thbley at gmail dot com 16-Nov-2005 12:10
Here is a print_r that produces xml:
(now you can expand/collapse the nodes in your browser)

<?php
header('Content-Type: text/xml; CHARSET=Windows-1252');
echo print_r_xml($some_var);

function print_r_xml($arr,$first=true) {
  $output = "";
  if ($first) $output .= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<data>\n";
  foreach($arr as $key => $val) {
    if (is_numeric($key)) $key = "arr_".$key; // <0 is not allowed
    switch (gettype($val)) {
      case "array":
        $output .= "<".htmlspecialchars($key)." type='array' size='".count($val)."'>".
          print_r_xml($val,false)."</".htmlspecialchars($key).">\n"; break;
      case "boolean":
        $output .= "<".htmlspecialchars($key)." type='bool'>".($val?"true":"false").
          "</".htmlspecialchars($key).">\n"; break;
      case "integer":
        $output .= "<".htmlspecialchars($key)." type='integer'>".
          htmlspecialchars($val)."</".htmlspecialchars($key).">\n"; break;
      case "double":
        $output .= "<".htmlspecialchars($key)." type='double'>".
          htmlspecialchars($val)."</".htmlspecialchars($key).">\n"; break;
      case "string":
        $output .= "<".htmlspecialchars($key)." type='string' size='".strlen($val)."'>".
          htmlspecialchars($val)."</".htmlspecialchars($key).">\n"; break;
      default:
        $output .= "<".htmlspecialchars($key)." type='unknown'>".gettype($val).
          "</".htmlspecialchars($key).">\n"; break;
    }
  }
  if ($first) $output .= "</data>\n";
  return $output;
}

?>
warhog at warhog dot net 11-Aug-2005 05:01
For very long arrays I have written a little function which formats an array quite nice and uses javascript for browsing it like a tree. The function is very customizable with the $style parameter.
For me it's of great use for browsing large array's, for example when those are used in language-files in some script and so on. It may even be used in "real" scripts for the "real" front-end, cause the tree can very easily be styled (look at the function or the outputted source and you'll see what i mean).

Here's the function:

<?php

function print_r_html($arr, $style = "display: none; margin-left: 10px;")
{ static $i = 0; $i++;
  echo "\n<div id=\"array_tree_$i\" class=\"array_tree\">\n";
  foreach($arr as $key => $val)
  { switch (gettype($val))
    { case "array":
        echo "<a onclick=\"document.getElementById('";
        echo array_tree_element_$i."').style.display = ";
        echo "document.getElementById('array_tree_element_$i";
        echo "').style.display == 'block' ?";
        echo "'none' : 'block';\"\n";
        echo "name=\"array_tree_link_$i\" href=\"#array_tree_link_$i\">".htmlspecialchars($key)."</a><br />\n";
        echo "<div class=\"array_tree_element_\" id=\"array_tree_element_$i\" style=\"$style\">";
        echo print_r_html($val);
        echo "</div>";
      break;
      case "integer":
        echo "<b>".htmlspecialchars($key)."</b> => <i>".htmlspecialchars($val)."</i><br />";
      break;
      case "double":
        echo "<b>".htmlspecialchars($key)."</b> => <i>".htmlspecialchars($val)."</i><br />";
      break;
      case "boolean":
        echo "<b>".htmlspecialchars($key)."</b> => ";
        if ($val)
        { echo "true"; }
        else
        { echo "false"; }
        echo  "<br />\n";
      break;
      case "string":
        echo "<b>".htmlspecialchars($key)."</b> => <code>".htmlspecialchars($val)."</code><br />";
      break;
      default:
        echo "<b>".htmlspecialchars($key)."</b> => ".gettype($val)."<br />";
      break; }
    echo "\n"; }
  echo "</div>\n"; }

?>

The function as it is now does not support the $return parameter as print_r does and will create an endless loop like print_r did in php-versions < 4.0.3 when there is an element which contains a reference to a variable inside of the array to print out :-/

I've tested it with PHP 5.0.6 and PHP 4.2.3 - no problems except those already mentioned.

please e-mail me if you've got a solution for the problems i've mentioned, i myself are not able to solve them 'cause i don't know how the hell i can find out whether a variable is a reference or not.
general at NOSPAMbugfoo dot com 20-Jan-2005 01:23
You can't use print_r($var, TRUE) inside a function which is a callback from ob_start() or you get the following error:
Fatal error: print_r(): Cannot use output buffering in output buffering display handlers


Génère une représentation stockable d'une valeur

  • « print_r
  • settype »
  • PHP Manual
  • Fonctions de gestion des variables
  • Génère une représentation stockable d'une valeur

serialize

(PHP 4, PHP 5, PHP 7, PHP 8)

serialize — Génère une représentation stockable d'une valeur

Description

serialize ( mixed $value ) : string

Retourne un tableau en chaine de caractère.

C'est une technique pratique pour stocker ou passer des valeurs PHP entre scripts, sans perdre leur structure ni leur type.

Pour récupérer une variable linéarisée et retrouver une valeur PHP, utilisez unserialize().

Liste de paramètres

value

La valeur à linéariser. serialize() accepte tous les types sauf les ressources ressource et certains objets (voir note ci-dessous). Vous pouvez même linéariser un tableau qui contient des références sur lui-même. Les références cycliques dans des tableaux/objets seront également stockées. Toutes les autres références seront perdues.

Lors de la linéarisation d'un objet, PHP tentera d'appeler les fonctions
membres __serialize() ou
__sleep() avant de linéariser.
Cela permet à l'objet de faire un dernier nettoyage, etc.
avant d'être linéarisé. De même, lorsque l'objet est restauré en
utilisant unserialize(), la fonction membre
__unserialize() ou
__wakeup() est appelée.

Note:

Les attributs privés d'un objet auront le nom de la classe préfixé au nom de l'attribut ; les attributs protégés seront préfixés avec un astérisque '*'. Ces valeurs préfixées ont des caractères nuls des deux cotés.

Valeurs de retour

Retourne une chaîne de caractères contenant une représentation sous forme de flux d'octets qui peut être stocker partout.

Il est à noter que c'est une chaîne binaire qui peut inclure des octets nuls, et doit donc être stockée et gérée comme telle. Par exemple, la sortie de serialize() doit généralement être stockée dans un champ de type BLOB d'une base de données, plutôt que dans un champ de type CHAR ou TEXT.

Exemples

Exemple #1 Exemple avec serialize()

<?php
// $session_data contient un tableau multidimensionnel , avec les
// informations de session de l'utilisateur courant. On utilise serialize()
// pour les stocker dans une base de données

$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn,
      "UPDATE sessions SET data = ? WHERE id = ?");
$sqldata = array (serialize($session_data), $_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata)) {
    $stmt = odbc_prepare($conn,
     "INSERT INTO sessions (id, data) VALUES(?, ?)");
    if (!odbc_execute($stmt, array_reverse($sqldata))) {
        /* Un problème est survenu ! */
    }
}
?>

Notes

Note:

Il est à noter que de nombreux objets internes de PHP ne peuvent pas être linéarisés. Cependant, ceux qui le peuvent implémentent soit l'interface Serializable soit les méthodes magiques __serialize()/__unserialize() ou __sleep()/__wakeup(). Si une classe interne ne remplit aucune de ces conditions, elle ne peut pas être linéarisée de manière fiable.

Il existe des exceptions historiques à cette règle, où des objets internes peuvent être linéarisés alors qu'ils n'implémentent pas l'interface ou n'exposent pas les méthodes magiques prévues à cet effet. On pourra notamment citer ArrayObject avant PHP 5.2.0.

Avertissement

Lorsque la fonction serialize() linéarise des objets, l'anti-slash de fin n'est pas inclus dans l'espace de nom du nom de la classe et ce, pour un maximum de compatibilité.

Voir aussi

  • unserialize() - Crée une variable PHP à partir d'une valeur linéarisée
  • var_export() - Retourne le code PHP utilisé pour générer une variable
  • json_encode() - Retourne la représentation JSON d'une valeur
  • Serializing Objects
  • __sleep()
  • __wakeup()
  • __serialize()
  • __unserialize()

User Contributed Notes

Kantin Charignon 15-Jun-2018 02:50
I did the same test as MiChAeLoKGB but in another version of PHP.
I don't post his code because I executed exactly the same script (after correcting a small variable naming error and add a line to display the PHP version).

PHP version: 7.1.9
PHP serialized in 0.0032186679840088 seconds average
JSON encoded in 0.0035939190387726 seconds average
serialize() was roughly 11.66% faster than json_encode()
Test took 6.8132710456848 seconds with 1000 iterations.

It would seem that in the current version of PHP the serialize function is faster.
lincoln dot du dot j at gmail dot com 11-Jul-2017 05:48
class A{
    public $tumi='Ami';
    public $ami='Tumi';

    public function ami(){
        $this->ami='You love me.';
    }
    public function tumi(){
        $this->tumi="I love you.";
    }
}
$obj=new A;
$serial=serialize($obj);

echo $serial;

echo PHP_EOL;

$uns=unserialize($serial);

print_r($uns);
sinus-php at sinpi dot net 03-Jul-2017 01:49
Here's a serialization function that doesn't serialize objects (it could, I just didn't care for that) but writes straight to a file. Very useful if you run out of memory when trying to serialize that 5-level nested 100000-entry array of strings.

Call it with the subject variable and a file name, it'll do the rest.

<?php
function serialize_to_file($subject,$file,$level=0) {
    if ($level==0) {
        $file=fopen($file,"w");
        if (!$file) return FALSE;
    }
    if (is_numeric($subject))
        fputs($file,"i:".$subject);
    elseif (is_string($subject))
        fputs($file,"s:".strlen($subject).":\"".addslashes($subject)."\"");
    elseif (is_bool($subject))
        fputs($file,"b:".($subject?1:0));
    elseif (is_array($subject)) {
        $keys = array_keys($subject);
        fputs($file,"a:".count($keys).":{");
        foreach ($keys as $key) {
            flat_serialize_to_file($key,$file,$level+1);
            fputs($file,";");
            flat_serialize_to_file($subject[$key],$file,$level+1);
            if (!is_array($subject[$key])) fputs($file,";");
        }
        fputs($file,"}");
    }
    if ($level==0)
        fclose($file);
}
?>
Anonymous 28-Dec-2016 05:10
If you want write something strange, like string array to binary string, and you are afraid 0-days of php's serialize function, you can use this.

Out:

string(88) "031a000a0001004c6f72..."
array(3) {
  [0]=>
  string(26) "Lorem ipsum dolor sit amet"
  [1]=>
  string(10) "8726348723"
  [2]=>
  string(1) "1"
}
string(152) "1c5e108afdec7c27a..."
array(3) {
  [0]=>
  string(26) "Lorem ipsum dolor sit amet"
  [1]=>
  string(10) "8726348723"
  [2]=>
  string(1) "1"
}

<?php

$arrToPack = array('Lorem ipsum dolor sit amet', 8726348723, true);

$packer = new ArraysPack();
$packer->privateKey = hash('sha256', 'k6LYiB8cnr5ESBMpVUBdC3c73Mt52p8w' ,true);

$dataPacked = $packer->pack($arrToPack);
$dataUnpacked = $packer->unPack($dataPacked);

$dataHMACPacked = $packer->hmacPack($arrToPack);
$dataHMACUnpacked = $packer->hmacUnPack($dataHMACPacked);

var_dump(bin2hex($dataPacked));
var_dump($dataUnpacked);

var_dump(bin2hex($dataHMACPacked));
var_dump($dataHMACUnpacked);

class ArraysPack
{
    public $hmacAlgo = 'sha256';
    public $hmacLen = 32;
    public $privateKey = '';

    public function hmacPack($array)
    {
        if(($ret = $this->pack($array)) === false)
            return false;

        $hmacHash = hash_hmac($this->hmacAlgo, $ret, $this->privateKey, true);
        return $hmacHash.$ret;
    }

    public function hmacUnPack($binaryString)
    {
        if(strlen($binaryString) < $this->hmacLen)
            return false;

        $hmacHash = substr($binaryString, 0, $this->hmacLen);
        $binaryString = substr($binaryString, $this->hmacLen);
        $binaryStringHash = hash_hmac($this->hmacAlgo, $binaryString, $this->privateKey, true);

        // Timing attack safe string comparison
        if(hash_equals($hmacHash, $binaryStringHash) === false)
            return false;

        return $this->unPack($binaryString);
    }

    public function pack($array)
    {
        if(!is_array($array))
            return false;

        $cnt = count($array);
        $header = pack('C', $cnt);
        $bin = '';

        for($i=0;$i<$cnt;$i++) {
            if(($strLen = strlen($array[$i])) > 65535 || $strLen === 0)
                return false;

            $header .= pack('S', $strLen);
            $bin .= $array[$i];
        }

        return $header.$bin;
    }

    public function unPack($bin)
    {
        if(empty($bin))
            return false;

        $arr = array();
        $cnt = unpack('C', $bin);
        $cnt = $cnt[1];

        if(!isset($bin[$cnt * 4]))
            return false;

        $header = substr($bin, 1, $cnt * 4);
        $bin = substr($bin, ($cnt * 2)+1);
        $int = unpack('S'.$cnt, $header);

        for($i=1;$i<=$cnt;$i++) {
            $val = substr($bin, 0, $int[$i]);

            if($val === false)
                return false;

            $arr[] = $val;
            $bin = substr($bin, $int[$i]);
        }

        if($bin !== false)
            return false;

        return $arr;
    }
}
?>
MiChAeLoKGB 23-May-2015 05:28
I did some testing to see the speed differences between serialize and json_encode, and my results with 250 iterations are:

PHP serialized in 0.0651714730263 seconds average
JSON encoded in 0.0254955434799 seconds average
json_encode() was roughly 155.62% faster than serialize()
Test took 27.2039430141 seconds with 300 iretations.

PHP serialized in 0.0564563179016 seconds average
JSON encoded in 0.0249140485128 seconds average
json_encode() was roughly 126.60% faster than serialize()
Test took 24.4148340225 seconds with 300 iretations.

From all my tests it looks like json_encode is on average about 120% faster (sometimes it gets to about 85% and sometimes to 150%).

Here is the PHP code you can run on your server to try it out:

<?php

// fillArray function myde by Peter Bailey
function fillArray($depth, $max){
    static $seed;
    if (is_null($seed)){
        $seed = array('a', 2, 'c', 4, 'e', 6, 'g', 8, 'i', 10);
    }
    if ($depth < $max){
        $node = array();
        foreach ($seed as $key){
            $node[$key] = fillArray( $depth + 1, $max );
        }
        return $node;
    }
    return 'empty';
}

function testSpeed($testArray, $iterations = 100){

    $json_time = array();
    $serialize_time = array();
    $test_start = microtime(true);

    for ($x = 1; $x <= $iterations; $x++){
        $start = microtime(true);
        json_encode($testArray);
        $json_time[] = microtime(true) - $start;

        $start = microtime(true);
        serialize($testArray);
        $serialize_time[] = microtime(true) - $start;
    }

    $test_lenght = microtime(true) - $test_start;
    $json_average = array_sum($json_time) / count($json_time);
    $serialize_average = array_sum($serialize_time) / count($serialize_time);

    $result = "PHP serialized in ".$serialize_average." seconds average<br>";
    $result .= "JSON encoded in ".$json_average." seconds average<br>";

    if ($json_average < $serialize_average){
        $result .= "json_encode() was roughly ".number_format( ($serialize_average / $json_average - 1 ) * 100, 2 )."% faster than serialize()<br>";
    } else if ( $serializeTime < $jsonTime ){
        $result .= "serialize() was roughly ".number_format( ($json_average / $serialize_average - 1 ) * 100, 2 )."% faster than json_encode()<br>";
    } else {
        $result .= "No way!<br>";
    }

    $result .= "Test took ".$test_lenght." seconds with ".$iterations." iterations.";

    return $result;

}

// Change the number of iterations (250) to lower if you exceed your maximum execution time
echo testSpeed(fillArray(0, 5), 250);

?>
Anonymous 14-Apr-2015 01:57
For everyone facing the conversion nightmare another Anonymous described here in an older comment (and he took the words out of my mouth), this T-SQL script might be of great help: https://github.com/mjohnsonperl/tsqlphpunserialize/tree/master.

Please do not follow the path of evil by dumping serialized data into relational databases.
tuxedobob 04-Jun-2014 04:36
When using serialize() to convert, say, an array to a string to pass via HTML forms, you will likely run into issues with quoting. This is because serialize() puts values in double quotes. The simplest solution is to quote your HTML form value with single quotes rather than double quotes. (This *is* allowed, according to W3C specs.)

So, instead of:

<?php
$arr = serialize($some_array);
?>
<input type="hidden" name="array" value="$arr" />

you would want to use:

<?php
$arr = serialize($some_array);
?>
<input type="hidden" name="array" value='$arr' />
Nanhe Kumar 27-Dec-2013 05:57
Note : You cannot save the state of a static variable by serializing.
<?php
/*
 * student.class.php
 */
class Student {

    public $name;
    private $roll;
    protected $age;
    static $class;

    public function __construct() {
        $this->name = "Nanhe Kumar";
        $this->roll = 1;
        $this->age = 16;
        Student::$class = "10+2";
    }

}
?>
<?php
/**
 * serialize.php
 */
include_once("student.class.php");

//Serialize
$so = new Student();
$serialized = serialize($so);
file_put_contents("test.txt", $serialized);
echo $serialized; //O:7:"Student":3:{s:4:"name";s:11:"Nanhe Kumar";s:13:"Studentroll";i:1;s:6:"*age";i:16;}
?>
<?php
/**
 * unserialize.php
 */
include_once("student.class.php");
$content = file_get_contents("test.txt");
$unserialized = unserialize($content);
print_r($unserialized);//Student Object ( [name] => Nanhe Kumar [roll:Student:private] => 1 [age:protected] => 16 )
?>
frost at easycast dot ru 23-Sep-2013 10:56
Closures cannot be serialized:
<?php
$func = function () {echo 'hello!';};
$func(); // prints "hello!"

$result = serialize($func);  // Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed'
?>
allan666 at gmail.com 07-Mar-2013 01:28
Oddly, if you serialize a class that was previously unserialized, the class of the variable changes to string... Example:

$R = unserialize($serialized_object);
$R->method(); // this is ok
$str = serialize($R);
echo(get_class($R));

this will output "string"!!!!! whereas if the first line was

$R = new my_class();

it would output "my_class"!

I don't know if that is a bug, but the manual is not clear about that! (somehow $R in serialize($R) is being passed by reference, since it changes class).
nh at ngin dot de 21-Jan-2013 09:59
Serializing floating point numbers leads to weird precision offset errors:

<?php

echo round(96.670000000000002, 2);
// 96.67

echo serialize(round(96.670000000000002, 2));
// d:96.670000000000002;

echo serialize(96.67);
// d:96.670000000000002;

?>

Not only is this wrong, but it adds a lot of unnecessary bulk to serialized data. Probably better to use json_encode() instead (which apparently is faster than serialize(), anyway).
Andrew B 05-Sep-2012 09:42
When you serialize an array the internal pointer will not be preserved. Apparently this is the expected behavior but was a bit of a gotcha moment for me. Copy and paste example below.

<?php
//Internal Pointer will be 2 once variables have been assigned.
$array = array();
$array[] = 1;
$array[] = 2;
$array[] = 3;

//Unset variables. Internal pointer will still be at 2.
unset($array[0]);
unset($array[1]);
unset($array[2]);

//Serialize
$serializeArray = serialize($array);

//Unserialize
$array = unserialize($serializeArray);

//Add a new element to the array
//If the internal pointer was preserved, the new array key should be 3.
//Instead the internal pointer has been reset, and the new array key is 0.
$array[] = 4;

//Expected Key - 3
//Actual Key - 0
echo "<pre>" , print_r($array, 1) , "</pre>";
?>
Anonymous 28-Feb-2012 07:44
Please! please! please! DO NOT serialize data and place it into your database. Serialize can be used that way, but that's missing the point of a relational database and the datatypes inherent in your database engine. Doing this makes data in your database non-portable, difficult to read, and can complicate queries. If you want your application to be portable to other languages, like let's say you find that you want to use Java for some portion of your app that it makes sense to use Java in, serialization will become a pain in the buttocks. You should always be able to query and modify data in the database without using a third party intermediary tool to manipulate data to be inserted.

I've encountered this too many times in my career, it makes for difficult to maintain code, code with portability issues, and data that is it more difficult to migrate to other RDMS systems, new schema, etc. It also has the added disadvantage of making it messy to search your database based on one of the fields that you've serialized.

That's not to say serialize() is useless. It's not... A good place to use it may be a cache file that contains the result of a data intensive operation, for instance. There are tons of others... Just don't abuse serialize because the next guy who comes along will have a maintenance or migration nightmare.
pgl at yoyo dot org 03-Feb-2011 09:13
Another suggestion for coping with binary data in serialize()d variables is just to base64_encode() those fields before serializing. It will increase the size of the variable, but not by too much.
travis at travishegner dot com 02-Mar-2010 12:37
If serializing objects to be stored into a postgresql database, the 'null byte' injected for private and protected members throws a wrench into the system. Even pg_escape_bytea() on the value, and storing the value as a binary type fails under certain circumstances.

For a dirty work around:
<?php

$serialized_object = serialize($my_object);
$safe_object = str_replace("\0", "~~NULL_BYTE~~", $serialized_object);

?>

this allows you to store the object in a readable text format as well. When reading the data back:

<?php

$serialized_object = str_replace("~~NULL_BYTE~~", "\0", $safe_object);
$my_object = unserialize($serialized_object);

?>

The only gotcha's with this method is if your object member names or values may somehow contain the odd "~~NULL_BYTE~~" string. If that is the case, then str_replace() to a string that you are guaranteed not to have any where else in the string that serialize() returns.
Also remember to define the class before calling unserialize().

If you are storing session data into a postgresql database, then this workaround is an absolute must, because the $data passed to the session's write function is already serialized.

Thanks,
Travis Hegner
Anonymous 21-Jan-2010 09:23
you should really use mysql_real_escape_string() for escaping (serialized) strings that got thrown into a query (visit php.net/mysql_real_escape_string for further information)
donotmail at me dot com 02-Sep-2009 11:16
NOTE: php's serialize does not properly serialize arrays with which a slice of the array is a reference to the array itself, observe:

<?php
$a = array();
$a[0] = "blah";
$a[1] =& $a;

$a[1][0] = "pleh"; // $a[0] === "pleh"

$b = unserialize(serialize($a));

// $b[0] == "pleh", $b[1][0] == "pleh"

$b[1][0] = "blah";
?>

now $b[1][0] == "blah", but $b[0] == "pleh"
after serializing and unserializing, slice 1 is no longer a reference to the array itself... I have found no way around this problem... even manually modifying the serialized string from
'a:2:{i:0;s:4:"pleh";i:1;a:2:{i:0;s:4:"pleh";i:1;R:3;}}'
to
'a:2:{i:0;s:4:"pleh";i:1;R:1;}'

to force the second slice to be a reference to the first element of the serialization (the array itself), it seemed to work at first glance, but then unreferences it when you alter it again, observe:

<?php
    $testser = 'a:2:{i:0;s:4:"pleh";i:1;R:1;}';

    $tmp = unserialize($testser);

    print_r($tmp);

    print "\n-----------------------\n";

    $tmp[1][0] = "blah";

    print_r($tmp);

?>

outputs:
Array
(
    [0] => pleh
    [1] => Array
 *RECURSION*
)

-----------------------
Array
(
    [0] => pleh
    [1] => Array
        (
            [0] => blah
            [1] => Array
                (
                    [0] => pleh
                    [1] => Array
 *RECURSION*
                )

        )

)
Alessandro Segala 17-Jul-2009 08:18
I needed to serialize an array to store it inside a database.
I was looking for a fast, simple way to do serialization, and I came out with 2 options: serialize() or json_encode().

I ran some benchmarks to see which is the faster, and, surprisingly, I found that serialize() is always between 46% and 96% SLOWER than json_encode().
So, if you don't need to serialize objects and have the json extension available, consider using it instead of serialize().
barbuj at NOSPAM dot yahoo dot com 14-Nov-2007 02:19
In my specific situation, I wanted to be able to pass some data from page to page, but without relying on a session variable. The answer I came up with was to serialize() the object in question, pass it on to the next page as a hidden form field, then unserialize() it. When ALL class variables are public, this worked fine. However, if there was at least one private/protected variable, the code no longer worked as expected ("Fatal error: Call to a member function display() on a non-object in page2.php on line 4")

As others have already mentioned, private/protected class variables will not behave nicely (private variables are prefixed by class_name + &#65533;, while protected variables are only prefixed by &#65533; - when looking at the page source using Firefox). Internet Explorer does NOT display the extra character between the class name and variable name, but the code still doesn't work as one would expect.

Suppose you have a simple class:

testclass.php
=============
<?php
class TestClass {
  var $i = 1;

  function display() {
    echo "i=" . $this->i;
  }
?>

page1.php
=========
<?php
  require_once 'testclass.php';
  $tc = new TestClass;
  $tc->display();
?>
<form method = "post" action = "page2.php">
<input type = "hidden" name = "str" value = "<?php echo htmlspecialchars( serialize( $tc ) ); ?>">
<input type = "submit">
</form>

page2.php
=========
<?php
  require_once 'testclass.php';
  $tc = unserialize( stripslashes( htmlspecialchars_decode( $_POST["str"] ) ) );
  $tc->display();
?>

The fix, suggested by evulish on #php/irc.dal.net, is to replace htmlspecialchars()/htmlspecialchars_decode() by base64_encode()/base64_decode. The code becomes:

page1.php
=========
<input type = "hidden" name = "str" value = "<?php echo base64_encode( serialize( $tc ) ); ?>">

page2.php
=========
<?php
  $tc = unserialize( base64_decode( $_POST["str"] ) );
?>

Hope this will help someone...
Jeex 06-Nov-2007 02:59
It may be worth noting that, depending on the size of the object you are serializing, the serialize function can take up a lot of memory.

If your script isn't working as expected, your serialize call may have pushed the memory usage over the limit set by memory_limit in php.ini.

More info on memory limits here: http://www.php.net/manual/en/ini.core.php
friday13 at ig dot com dot br 19-Jun-2007 07:15
I have problem to use serialize function with hidden form field and the resolution was use htmlentities.

Ex.:

<?

$lista = array( 'pera', 'maça', 'laranja' );

print "< input type='hidden' name='teste' value='htmlentities( serialize( $lista ) )'" >";

?>
Ates Goral 18-Jul-2006 11:59
Corrections/clarifications to  "Anatomy of a serialize()'ed value":

All strings appear inside quotes. This applies to string values, object class names and array key names. For example:

s:3:"foo"
O:7:"MyClass":1:{...
a:2:{s:3:"bar";i:42;...

Object property names and values are delimited by semi-colons, not colons. For example:

O:7:"MyClass":2:{s:3:"foo";i:10;s:3:"bar";i:20}

Double/float values are represented as:

d:0.23241446
egingell at sisna dot com 15-May-2006 05:12
<?
/*
Anatomy of a serialize()'ed value:

 String
 s:size:value;

 Integer
 i:value;

 Boolean
 b:value; (does not store "true" or "false", does store '1' or '0')

 Null
 N;

 Array
 a:size:{key definition;value definition;(repeated per element)}

 Object
 O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}

 String values are always in double quotes
 Array keys are always integers or strings
    "null => 'value'" equates to 's:0:"";s:5:"value";',
    "true => 'value'" equates to 'i:1;s:5:"value";',
    "false => 'value'" equates to 'i:0;s:5:"value";',
    "array(whatever the contents) => 'value'" equates to an "illegal offset type" warning because you can't use an
    array as a key; however, if you use a variable containing an array as a key, it will equate to 's:5:"Array";s:5:"value";',
     and
    attempting to use an object as a key will result in the same behavior as using an array will.
*/
?>
MC_Gurk at gmx dot net 03-Jan-2006 07:44
If you are going to serialie an object which contains references to other objects you want to serialize some time later, these references will be lost when the object is unserialized.
The references can only be kept if all of your objects are serialized at once.
That means:

$a = new ClassA();
$b = new ClassB($a); //$b containes a reference to $a;

$s1=serialize($a);
$s2=serialize($b);

$a=unserialize($s1);
$b=unserialize($s2);

now b references to an object of ClassA which is not $a. $a is another object of Class A.

use this:
$buf[0]=$a;
$buf[1]=$b;
$s=serialize($buf);
$buf=unserialize($s);
$a=$buf[0];
$b=$buf[1];

all references are intact.
Alexander Podgorny 02-Dec-2005 11:47
Here is an example of a base class to implement object persistence using serialize and unserialize:

<?php
class Persistent
{
    var $filename;

    /**********************/
    function Persistent($filename)
    {
        $this->filename = $filename;
        if(!file_exists($this->filename)) $this->save();
    }
    /**********************/
    function save()
    {
        if($f = @fopen($this->filename,"w"))
        {
            if(@fwrite($f,serialize(get_object_vars($this))))
            {
                @fclose($f);
            }
            else die("Could not write to file ".$this->filename." at Persistant::save");
        }
        else die("Could not open file ".$this->filename." for writing, at Persistant::save");

    }
    /**********************/
    function open()
    {
        $vars = unserialize(file_get_contents($this->filename));
        foreach($vars as $key=>$val)
        {
            eval("$"."this->$key = $"."vars['"."$key'];");
        }
    }
    /**********************/
}

?>

When an object is extended from this one it can be easily saved and re-opened using it's own methods as follows:

<?

class foo extends Persistent
{
   var $counter;
   function inc()
   {
       $this->counter++;
   }
}

$fooObj = new $foo;
$foo->open();
print $foo->counter; // displays incrementing integer as page reloads
$foo->inc();
$foo->save();

?>
stephen dot adamson at smius dot com 01-Nov-2005 09:40
If you are serializing an object to store it in the database, using __sleep() can save you some space. The following code will not store empty (null) variables in the serialized string. For my purposes this saved a lot of space, since some of the member variables would not be given values.

function __sleep()
{
    $allVars = get_object_vars($this);
    $toReturn = array();
    foreach(array_keys($allVars) as $name)
    {
        if (isset($this->$name))
        {
            $toReturn[] = $name;
        }
    }
    return $toReturn;
}
wiart at yahoo dot com 16-Dec-2004 03:40
Warning: on 64 bits machines,  if you use a long string only composed of numbers as a key in an array and serialize/unserialize it, you can run into problems:

an example code:
$arr["20041001103319"] = 'test';
var_dump( $arr);
$arr_in_str = serialize($arr);
print "Now result is: $arr_in_str<BR />";
$final_arr = unserialize($arr_in_str);
print "The final unserialized array:<BR />";
var_dump($final_arr);

The result:
array(1) { [20041001103319]=>  string(4) "test" }
Now result is: a:1:{i:20041001103319;s:4:"test";}
The final unserialized array:
array(1) { [683700183]=> string(4) "test" }

As you can see, the original array :
$arr["20041001103319"] = "test"

after serialize/unserialize is:
$arr[683700183] = "test"

As you can see,  the key has changed ...

Apparently a problem of implicit casting + integer overflow (I posted a PHP bug report: http://bugs.php.net/bug.php?id=31117)

I tested with the latest 4.3.10 compiled on my laptop (32 bits, Mandrake 9.1) --> no such problem. But compiled on AMD 64 bits (Red Hat Taroon), the problem is present.

Hope this will help some of you to not loose almost a whole day of debugging ;-)
paul at moveNOtoSPAMiceland DOT com 18-Nov-2004 08:29
I was trying to submit a serialized array through a hidden form field using POST and was having a lot of trouble with the quotes. I couldn't figure out a way to escape the quotes in the string so that they'd show up right inside the form, so only the characters up to the first set of quotes were being sent.

My solution was to base64_encode() the string, put that in the hidden form field, and send that through the POST method. Then I decoded it (using base64_decode()) on the other end. This seemed to solve the problem.
hfuecks at phppatterns dot com 21-Apr-2004 08:20
Regarding serializing PHP data types to Javascript, following Ivans note below, theres an example at http://www.tekool.net/php/js_serializer/.

The basic serialization looks good although, in its current form, it works on the basis of generating Javascript source which a browser executes as a page loads. Using Javascripts eval() the same can be done with strings containing Javascript if youre working with something like XMLHTTPRequest
pli9 at itsa dot ucsf dot edu 31-Jan-2003 11:05
I have also written some code for importing serialized PHP data into PERL and then writing it back into PHP.  I think the similar library posted above is actually more robust for a few select cases, but mine is more compact and a little easier to follow.  I'd really like comments if anyone finds this useful or has improvements.  Please credit me if you use my code.

http://www.hcs.harvard.edu/~pli/code/serialPHP.pm
MarkRoedel at letu dot edu 21-Feb-2000 10:58
A call to serialize() appears to mess with the array's internal pointer.  If you're going to be walking through your array after serializing it, you'll want to make a call to reset() first.


Affecte un type à une variable

  • « serialize
  • strval »
  • PHP Manual
  • Fonctions de gestion des variables
  • Affecte un type à une variable

settype

(PHP 4, PHP 5, PHP 7, PHP 8)

settype — Affecte un type à une variable

Description

settype ( mixed &$var , string $type ) : bool

Force le type de la variable var en type.

Liste de paramètres

var

La variable à convertir.

type

Les valeurs possibles pour le paramètre type sont :

  • "boolean" ou "bool"
  • "integer" ou "int"
  • "float" ou "double"
  • "string"
  • "array"
  • "object"
  • "null"

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec settype()

<?php
$foo = "5bar"; // chaîne
$bar = true;   // booléen

settype($foo, "integer"); // $foo vaut maintenant 5   (integer)
settype($bar, "string");  // $bar vaut maintenant "1" (string)
?>

Notes

Note:

La valeur maximale des entiers est la valeur contenue dans la variable PHP_INT_MAX.

Voir aussi

  • gettype() - Retourne le type de la variable
  • conversion de type
  • transtypage automatique

User Contributed Notes

geoffsmiths at hotmail dot com 24-Dec-2019 10:23
Please note:

When using settype to convert indexed arrays to objects, the properties of the typed object will be integers:

A brief example:

$a = ['1', '2'];

settype($a, 'object');

var_dump($a);

// output
object(stdClass)#1 (2) {
  ["0"]=>
  string(1) "1"
  ["1"]=>
  string(1) "2"
}
Anonymous 04-Jan-2019 01:41
If you attempt to convert the special $this variable from an instance method (only in classes) :
* PHP will silently return TRUE and leave $this unchanged if the type was 'bool', 'array', 'object' or 'NULL'
* PHP will generate an E_NOTICE if the type was 'int', 'float' or 'double', and $this will not be casted
* PHP will throw a catchable fatal error when the type is 'string' and the class does not define the __toString() method
Unless the new variable type passed as the second argument is invalid, settype() will return TRUE. In all cases the object will remain unchanged.
<?php
    // This was tested with PHP 7.2
    class Foo {
        function test() {
            printf("%-20s %-20s %s\n", 'Type', 'Succeed?', 'Converted');

            // settype() should throw a fatal error, as $this cannot be re-assigned
            printf("%-20s %-20s %s\n", 'bool', settype($this, 'bool'), print_r($this, TRUE));
            printf("%-20s %-20s %s\n", 'int', settype($this, 'int'), print_r($this, TRUE));
            printf("%-20s %-20s %s\n", 'float', settype($this, 'float'), print_r($this));
            printf("%-20s %-20s %s\n", 'array', settype($this, 'array'), print_r($this, TRUE));
            printf("%-20s %-20s %s\n", 'object', settype($this, 'object'), print_r($this, TRUE));
            printf("%-20s %-20s %s\n", 'unknowntype', settype($this, 'unknowntype'), print_r($this, TRUE));
            printf("%-20s %-20s %s\n", 'NULL', settype($this, 'NULL'), print_r($this, TRUE));
            printf("%-20s %-20s %s\n", 'string', settype($this, 'string'), print_r($this, TRUE));
        }
    }
    $a = new Foo();
    $a->test();
?>
Here is the result :
Type                 Succeed?             Converted
bool                 1                    Foo Object
(
)

Notice: Object of class Foo could not be converted to int in C:\php\examples\oop-settype-this.php on line 9

int                  1                    Foo Object
(
)

Notice: Object of class Foo could not be converted to float in C:\php\examples\oop-settype-this.php on line 10

float                1                    Foo Object
(
)

array                1                    Foo Object
(
)

object               1                    Foo Object
(
)

Warning: settype(): Invalid type in C:\php\examples\oop-settype-this.php on line 14

unknowntype                               Foo Object
(
)

NULL                 1                    Foo Object
(
)

Catchable fatal error: Object of class Foo could not be converted to string in C:\php\examples\oop-settype-this.php on line 15

If the class Foo implements __toString() :
<?php
    class Foo {
        // ...
        function __toString() {
            return 'Foo object is awesome!';
        }
        // ...
    }
?>
So the first code snippet will not generate an E_RECOVERABLE_ERROR, but instead print the same string as for the other types, and not look at the one returned by the __toString() method.

Hope this helps !  :)
Skayo 26-Jul-2017 08:59
$foo = "1";
settype($foo, "bool");
var_dump($foo); // Outputs: bool(true)

$bar = "0";
settype($bar, "bool");
var_dump($bar); // Outputs: bool(false)
marjune 10-Nov-2016 05:31
any digit except 0 or -0 are considered true in boolean, and any string except '0' or '' are also considered true.

<?php

$foo = '0';
settype($foo, 'boolean');
var_dump($foo); // false

$foo = 0;
settype($foo, 'boolean');
var_dump($foo); // false
Special Notes 26-Feb-2012 12:00
Note that you can't use this to convert a string 'true' or 'false' to a boolean variable true or false as a string 'false' is a boolean true. The empty string would be false instead...

<?php
$var = "true";
settype($var, 'bool');
var_dump($var); // true

$var = "false";
settype($var, 'bool');
var_dump($var); // true as well!

$var = "";
settype($var, 'bool');
var_dump($var); // false
?>
Chris Sullins 18-Apr-2010 11:59
settype() has some really strange, potentially buggy behavior.

As noted by Michael Benedict, using settype() on a variable will initialize that variable.  What is stranger is that using settype() on an uninitialized variable that you are treating as an array or object will also initialize the variable.  So:

<?php
settype($foo->bar,"integer"); // stdClass Object ( [test] => 0 )
?>

This works for a chain of any length: $foo->bar['baz']->etc

Next we look at what happens if $foo is already set.

<?php
$foo = false;
settype($foo->bar,"integer"); // stdClass Object ( [test] => 0 )
?>

In and of itself, this wouldn't be problematic.  It might even make sense.  But in all other cases where $foo is defined, even if (boolean) $foo === false, it will throw an error unless $foo->bar is valid (i.e. $foo is an object already).

<?php
$foo = true;
settype($foo->bar,"integer"); // Notice: Trying to get property of non-object
?>
NWdev 17-Nov-2008 09:38
In trying to convert an array of strings to an array of ints,
I attempted to use settype with array_walk.

<?php
//$numArray is generated by another process
$numArray = array('13','14','33');

var_dump($numArray);

//my conversion function
function str_to_int($val){
  //remember: settype($x, 'int') returns boolean (1=success, 0=failure)
  //--> so return $x to return new value
    settype($val,'int');
    echo "<br />gettype = ".gettype($val)."<br />";
    return $val;
}

array_walk($numArray,'str_to_int');

var_dump($numArray);
?>

The var_dumps both return the following:
<?php
array(3) { [0]=> string(2) "13" [1]=> string(2) "14" [2]=> string(2) "33" }
?>

The gettype echo will show the value as an integer.

So it seems that settype($val,'int') makes the conversion,
but the function return value remains a string.
Since settype returns a boolean, using
<?php $val = settype($val, 'int'); ?>
is not a option.

I resolved my array value conversion using this instead:
<?php
$numArray =
      array_map(create_function('$value', 'return (int)$value;'),$numArray);
?>
Thanks to the posting here:
http://usrportage.de/archives/
808-Convert-an-array-of-strings-into-an-array-of-integers.html

Perhaps this will save someone else spinning wheels a bit.

Also thanks to robin at barafranca dot com for
pointing out the boolean return value of settype.
robin at barafranca dot com 05-Mar-2008 04:20
Just a quick note, as this caught me out very briefly:

settype() returns bool, not the typecasted variable - so:

$blah = settype($blah, "int"); // is wrong, changes $blah to 0 or 1
settype($blah, "int"); // is correct

Hope this helps someone else who makes a mistake.. ;)
ludvig dot ericson gmail.dot com 09-Apr-2006 08:36
To matt:
This function accepts a paremeter, which does not imply you using hardcoded stuff, instead you can let the user choose! \o/

As a part of a framework or something.

Plus, you can probably call this with call_user_func
matt at mattsoft dot net 06-Dec-2005 09:49
using (int) insted of the settype function works out much better for me. I have always used it. I personally don't see where settype would ever come in handy.
Michael Benedict 29-Oct-2005 10:55
note that settype() will initialize an undefined variable.  Therefore, if you want to preserve type and value, you should wrap the settype() call in a call to isset().

<?php
settype($foo, "integer");
echo("|$foo|");
?>

prints "|0|", NOT "||".

To get the latter, use:
<?php
if(isset($foo)) settype($foo, "integer");
echo("|$foo|");
?>
nospamplease at veganismus dot ch 22-Jul-2005 07:38
you must note that this function will not set the type permanently! the next time you set the value of that variable php will change its type as well.
reinier_deblois at hotmail dot com 13-Mar-2005 09:18
Instead of settype you could use:
<?php

$int=593;  // $int is a integer

$int.="";   // $int is now a string
memandeemail at gmail dot com 09-Dec-2004 05:17
/**
    * @return bool
    * @param array[byreference] $values
    * @desc Convert an array or any value to Escalar Object [not tested in large scale]
    */
    function setobject(&$values) {
        $values = (object) $values;
        foreach ($values as $tkey => $val) {
            if (is_array($val)) {
                setobject($val);
                $values->$tkey = $val;
            }
        }
        return (bool) $values;
    }
sdibb at myway dot com 06-Sep-2003 10:03
Using settype is not the best way to convert a string into an integer, since it will strip the string wherever the first non-numeric character begins.  The function intval($string) does the same thing.

If you're looking for a security check, or to strip non-numeric characters (such as cleaning up phone numbers or ZIP codes),  try this instead:

<?
     $number=ereg_replace("[^0-9]","",$number);
?>
ns at canada dot com 05-May-2000 04:38
This settype() behaviour seems consistent to me. Quoting two sections from the manual:

"When casting from a scalar or a string variable to an array, the variable will become the first element of the array: "
<pre>
2 $var = 'ciao';
3 $arr = (array) $var;
4 echo $arr[0];  // outputs 'ciao'
</pre>

And if (like your code above) you do a settype on an empty variable, you'll end up with a one element array with an empty (not unset!) first element. So appeanding to it will start appending at index 1. As for why reset() doesn't do anything:

"When you assign a value to an array variable using empty brackets, the value will be added onto the end of the array."

It doesn't matter where the array counter is; values are added at the end, not at the counter.


Récupère la valeur d'une variable, au format chaîne

  • « settype
  • unserialize »
  • PHP Manual
  • Fonctions de gestion des variables
  • Récupère la valeur d'une variable, au format chaîne

strval

(PHP 4, PHP 5, PHP 7, PHP 8)

strval — Récupère la valeur d'une variable, au format chaîne

Description

strval ( mixed $value ) : string

Récupère la valeur de la variable value, au format chaîne de caractères. Voir la documentation sur les chaînes de caractères pour plus d'informations sur la conversion en chaîne.

Cette fonction n'effectue aucun formatage sur la valeur retournée. Si vous cherchez un moyen de formatter une valeur numérique en chaîne de caractères, reportez-vous à la fonction sprintf() ou la fonction number_format().

Liste de paramètres

value

La variable à convertir en chaîne de caractères.

value peut être un scalaire ou un objet implémentant la méthode magique __toString(). Vous ne pouvez pas utiliser la fonction strval() avec des tableaux ou des objets qui n'implémentent pas la méthode magique __toString().

Valeurs de retour

La valeur de la variable value sous la forme d'une chaîne de caractères.

Exemples

Exemple #1 Exemple pour strval() utilisant la méthode magique PHP 5 __toString().

<?php
class StrValTest
{
    public function __toString()
    {
        return __CLASS__;
    }
}

// Affiche 'StrValTest'
echo strval(new StrValTest);
?>

Voir aussi

  • boolval() - Récupère la valeur booléenne d'une variable
  • floatval() - Convertit une chaîne en nombre à virgule flottante
  • intval() - Retourne la valeur numérique entière équivalente d'une variable
  • settype() - Affecte un type à une variable
  • sprintf() - Retourne une chaîne formatée
  • number_format() - Formate un nombre pour l'affichage
  • Le transtypage
  • __toString()

User Contributed Notes

Mark Clements 02-Jun-2016 01:17
Some notes about how this function has changed over time, with regards the following statement:

> You cannot use strval() on arrays or on objects that
> do not implement the __toString() method.

== Arrays ==

In PHP 5.3 and below, strval(array(1, 2, 3)) would return the string "Array" without any sort of error occurring.

From 5.4 and above, the return value is unchanged but you will now get a notice-level error: "Array to string conversion".

== Objects ==

For objects that do not implement __toString(), the behaviour has varied:

PHP 4: "Object"
PHP 5 < 5.2: "Object id #1" (number obviously varies)
PHP >= 5.2: Catchable fatal error:  Object of class X could not be converted to string
Hayley Watson 21-Aug-2007 08:53
As of PHP 5.2, strval() will return the string value of an object, calling its __toString() method to determine what that value is.
NyctoFixer at gmail dot com 11-Jun-2007 12:19
As of PHP 5.1.4 (I have not tested it in later versions), the strval function does not attempt to invoke the __toString method when it encounters an object. This simple wrapper function will handle this circumstance for you:

<?

/**
 * Returns the string value of a variable
 *
 * This differs from strval in that it invokes __toString if an object is given
 * and the object has that method
 */
function stringVal ($value)
{
    // We use get_class_methods instead of method_exists to ensure that __toString is a public method
    if (is_object($value) && in_array("__toString", get_class_methods($value)))
        return strval($value->__toString());
    else
        return strval($value);
}

?>
kendsnyder+phpnet at gmail dot com 01-Jun-2007 10:08
The only way to convert a large float to a string is to use printf('%0.0f',$float); instead of strval($float); (php 5.1.4).

// strval() will lose digits around pow(2,45);
echo pow(2,50); // 1.1258999068426E+015
echo (string)pow(2,50); // 1.1258999068426E+015
echo strval(pow(2,50)); // 1.1258999068426E+015

// full conversion
printf('%0.0f',pow(2,50)); // 112589906846624
echo sprintf('%0.0f',pow(2,50)); // 112589906846624
portos_ze_retour at hotmail dot fr 10-Mar-2006 08:15
In complement to Tom Nicholson's contribution, here is the french version (actually it's possible to change the language, but you should check the syntax ;) )

function int_to_words($x) {
   global $nwords;

   if(!is_numeric($x))
     $w = '#';
   else if(fmod($x, 1) != 0)
     $w = '#';
   else {
     if($x < 0) {
         $w = $nwords['minus'].' ';
         $x = -$x;
     } else
         $w = '';
     // ... now $x is a non-negative integer.

     if($x < 21)  // 0 to 20
         $w .= $nwords[$x];
     else if($x < 100) {  // 21 to 99
         $w .= $nwords[10 * floor($x/10)];
         $r = fmod($x, 10);
         if($r > 0)
           $w .= '-'. $nwords[$r];
     } else if($x < 1000) {  // 100 to 999
         $w .= $nwords[floor($x/100)] .' '.$nwords['hundred'];
         $r = fmod($x, 100);
         if($r > 0)
           $w .= ' '.$nwords['separator'].' '. int_to_words($r);
     } else if($x < 1000000) {  // 1000 to 999999
         $w .= int_to_words(floor($x/1000)) .' '.$nwords['thousand'];
         $r = fmod($x, 1000);
         if($r > 0) {
           $w .= ' ';
           if($r < 100)
               $w .= $nwords['separator'].' ';
           $w .= int_to_words($r);

         }
     } else {    //  millions
         $w .= int_to_words(floor($x/1000000)) .' '.$nwords['million'];
         $r = fmod($x, 1000000);
         if($r > 0) {
           $w .= ' ';
           if($r < 100)
               $word .= $nwords['separator'].' ';
           $w .= int_to_words($r);
         }
     }
   }
   return $w;
}

 // Usage in English
$nwords = array( "zero", "one", "two", "three", "four", "five", "six", "seven",
                   "eight", "nine", "ten", "eleven", "twelve", "thirteen",
                   "fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
                   "nineteen", "twenty", 30 => "thirty", 40 => "forty",
                   50 => "fifty", 60 => "sixty", 70 => "seventy", 80 => "eighty",
                   90 => "ninety" , "hundred" => "hundred", "thousand"=> "thousand", "million"=>"million",
                   "separator"=>"and", "minus"=>"minus");

echo 'There are currently '. int_to_words(-120223456) . ' members logged on.<br>';

 //Utilisation en Francais
$nwords = array( "zéro", "un", "deux", "trois", "quatre", "cinq", "six", "sept",
                   "huit", "neuf", "dix", "onze", "douze", "treize",
                   "quatorze", "quinze", "seize", "dix-sept", "dix-huit",
                   "dix-neuf", "vingt", 30 => "trente", 40 => "quarante",
                   50 => "cinquante", 60 => "soixante", 70 => "soixante-dix", 80 => "quatre-vingt",
                   90 => "quatre-vingt-dix" , "hundred" => "cent", "thousand"=> "mille", "million"=>"million",
                   "separator"=>"", "minus"=>"moins");

echo 'Il y a actuellement '. int_to_words(-120223456) . ' membres connectés.<br>';
php at ianco dot co dot uk 07-Oct-2005 04:36
I can't help being surprised that

(string)"0" == (string)"0.00"

evaluates to true. It's the same with strval and single quotes.
=== avoids it.

Why does it matter? One of my suppliers, unbelievably, uses 0 to mean standard discount and 0.00 to mean no discount in their stock files.
Steve Ball 08-Sep-2005 07:18
It seems that one is being treated as an unsigned large int (32 bit), and the other as a signed large int (which has rolled over/under).

2326201276 - (-1968766020) =  4294967296.
Tom Nicholson 28-Apr-2004 09:13
If you want to convert an integer into an English word string, eg. 29 -> twenty-nine, then here's a function to do it.

Note on use of fmod()
  I used the floating point fmod() in preference to the % operator, because % converts the operands to int, corrupting values outside of the range [-2147483648, 2147483647]

I haven't bothered with "billion" because the word means 10e9 or 10e12 depending who you ask.

The function returns '#' if the argument does not represent a whole number.

<?php
$nwords = array( "zero", "one", "two", "three", "four", "five", "six", "seven",
                   "eight", "nine", "ten", "eleven", "twelve", "thirteen",
                   "fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
                   "nineteen", "twenty", 30 => "thirty", 40 => "forty",
                   50 => "fifty", 60 => "sixty", 70 => "seventy", 80 => "eighty",
                   90 => "ninety" );

function int_to_words($x) {
   global $nwords;

   if(!is_numeric($x))
      $w = '#';
   else if(fmod($x, 1) != 0)
      $w = '#';
   else {
      if($x < 0) {
         $w = 'minus ';
         $x = -$x;
      } else
         $w = '';
      // ... now $x is a non-negative integer.

      if($x < 21)   // 0 to 20
         $w .= $nwords[$x];
      else if($x < 100) {   // 21 to 99
         $w .= $nwords[10 * floor($x/10)];
         $r = fmod($x, 10);
         if($r > 0)
            $w .= '-'. $nwords[$r];
      } else if($x < 1000) {   // 100 to 999
         $w .= $nwords[floor($x/100)] .' hundred';
         $r = fmod($x, 100);
         if($r > 0)
            $w .= ' and '. int_to_words($r);
      } else if($x < 1000000) {   // 1000 to 999999
         $w .= int_to_words(floor($x/1000)) .' thousand';
         $r = fmod($x, 1000);
         if($r > 0) {
            $w .= ' ';
            if($r < 100)
               $w .= 'and ';
            $w .= int_to_words($r);
         }
      } else {    //  millions
         $w .= int_to_words(floor($x/1000000)) .' million';
         $r = fmod($x, 1000000);
         if($r > 0) {
            $w .= ' ';
            if($r < 100)
               $word .= 'and ';
            $w .= int_to_words($r);
         }
      }
   }
   return $w;
}

?>

Usage:
<?php
echo 'There are currently '. int_to_words($count) . ' members logged on.';
?>


Crée une variable PHP à partir d'une valeur linéarisée

  • « strval
  • unset »
  • PHP Manual
  • Fonctions de gestion des variables
  • Crée une variable PHP à partir d'une valeur linéarisée

unserialize

(PHP 4, PHP 5, PHP 7, PHP 8)

unserialize — Crée une variable PHP à partir d'une valeur linéarisée

Description

unserialize ( string $data , array $options = [] ) : mixed

unserialize() prend une variable linéarisée (voir serialize()) et la convertit en variable PHP.

Avertissement

Ne passez pas d'entrée utilisateur non fiable à la fonction unserialize() quelle que soit la valeur de allowed_classes dans options. La délinéarisation peut résulter en une exécution de code chargé et exécuté lors de l'instanciation et l'auto-chargement d'objet, et ainsi, un utilisateur mal intentionné peut être capable d'exploiter ce comportement. Utilisez un standard d'échange sûr, comme JSON (via les fonctions json_decode() et json_encode()) si vous devez passer des données linéarisées à l'utilisateur.

Si vous avez besoin de délinéariser des données linéarisées enregistré à l'extérieur, considérez l'utilisation de hash_hmac() pour valider les données. Assurez-vous que les données n'ont été modifiées par personne d'autre que vous.

Liste de paramètres

data

La chaîne linéarisée.

Si la variable délinéarisée est un objet, après avoir réussi à le reconstruire, PHP tentera automatiquement d'appeller les méthodes __unserialize() ou __wakeup (si l'une d'elles existent).

Note: unserialize_callback_func directive

Il est possible de définir une fonction de rappel qui sera appelée si une classe indéfinie est utilisée lors de la délinéarisation (ce qui évitera de recevoir un object "__PHP_Incomplete_Class"). Utilisez votre php.ini ou le fichier .htaccess pour définir unserialize_callback_func. Chaque fois qu'une classe non-définie sera instanciée, cette fonction sera appelée. Pour désactiver cette fonctionnalité, laissez simplement la chaîne de caractère vide.

options

Toute option à fournir à unserialize(), sous la forme d'un tableau associatif.

Options valides
Nom | Type | Description
allowed_classes | mixed | Soit un tableau de noms de classes qui doivent être acceptées, false pour accepter aucune classe, ou true pour accepter toutes les classes. Si cette option est définie, et unserialize() rencontre un objet d'une classe qui n'est pas accepté, alors l'objet sera instancié plutôt comme __PHP_Incomplete_Class. Le fait d'ommettre cette option revient à le définir comme true : PHP va tenter d'instancier les objets de n'importe quelle classe.

Valeurs de retour

La valeur convertie est retournée par la fonction, et peut être de type booléen, entier, nombre décimal, chaîne de caractères, tableau ou objet.

Si la chaîne passée ne peut être délinéarisée, cette fonction retourne false et une erreur E_NOTICE est émise.

Erreurs / Exceptions

Les objets peuvent lancer Throwables dans leur gestionnaire de délinéarisation.

Historique

Version | Description
7.1.0 | L'élément allowed_classes de options) est maintenant strictement typé, c'est à dire si quelque chose autre qu'un tableau array ou un booléan bool est donné unserialize() retourne false et émet une E_WARNING.
7.0.0 | Le paramètre options a été ajouté.
5.6.0 | La manipulation des données linéarisées en remplaçant C: avec O: pour forcer l'instanciation d'objet sans appeler le constructeur échoue dorénavant.

Exemples

Exemple #1 Exemple avec unserialize()

<?php
// Ici, on utilise <function>unserialize</function> pour charger les données de sessions
// depuis la base de données, dans $session_data. Cet exemple complète
// celui fourni avec <function>serialize</function>.

$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn, "SELECT data FROM sessions WHERE id = ?");
$sqldata = array($_SERVER['PHP_AUTH_USER']);
if (!odbc_execute($stmt, $sqldata) || !odbc_fetch_into($stmt, $tmp)) {
    // si la préparation ou la lecture échouent, on crée un tableau vide
    $session_data = array();
} else {
    // les données sauvées sont dans $tmp[0].
    $session_data = unserialize($tmp[0]);
    if (!is_array($session_data)) {
        // Erreur... initialisation d'un tableau vide
        $session_data = array();
    }
}
?>

Exemple #2 Exemple avec la directive unserialize_callback_func

<?php
$serialized_object='O:1:"a":1:{s:5:"value";s:3:"100";}';

ini_set('unserialize_callback_func', 'mycallback');

function mycallback($classname)
{
    // Incluez simplement un fichier contenant votre définition de classe
    // vous saurez quelle classe grâce à $classname
}
?>

Notes

Avertissement

false est retourné dans les cas où une erreur survient et si vous tentez de délinéariser une valeur linéarisé égale à false. Il est possible d'intercepter ce cas spécial en comparant data avec serialize(false) ou en attrapant l'erreur E_NOTICE émise.

Voir aussi

  • json_encode() - Retourne la représentation JSON d'une valeur
  • json_decode() - Décode une chaîne JSON
  • hash_hmac() - Génère une valeur de clé de hachage en utilisant la méthode HMAC
  • serialize() - Génère une représentation stockable d'une valeur
  • Autoloading Classes
  • unserialize_callback_func
  • __wakeup()
  • __serialize()
  • __unserialize()

User Contributed Notes

karsten at dambekalns dot de 27-Nov-2020 07:53
Keep in mind that the allowed_classes does not use inheritance, i.e. allowing an interface is not possible and sub-classes won't pass the check. See https://3v4l.org/tdHfl
hadley8899 at gmail dot com 13-Jan-2020 01:58
For the people who are getting the error

PHP Notice:  unserialize(): Error at offset 191 of 285 bytes in ...

and are getting the data from a database, Make sure that you have the database set the the correct encoding, I had the database set as latin1_swedish_ci and all of the data looked perfect, Infact when i copied it into a online unserialize it worked fine. I changed the collation to utf8mb4_unicode_ci and all worked fine.
Anonymous 11-Mar-2019 06:36
If serialize() is the answer, you're almost certainly asking the wrong question.

JSON is widely available. The only thing it does not do, is the very thing that makes serialization immensely dangerous. All it takes is a crafty hacker to pass a crafted payload to a supposedly 'secured' serialize call, for a database driver to be overwritten with malicious code, for example.

Recreate the object. Normally. With actual data, and a source file, not with serialize. To do otherwise is laziness bordering on malice.
me+phpnet at unreal4u dot com 30-Oct-2017 03:30
Just some reminder which may save somebody some time regarding the `$options` array:

Say you want to be on the safe side and not allow any objects to be unserialized... My first thought was doing the following:

<?php
$lol = unserialize($string, false);
// This will generate:
// Warning: unserialize() expects parameter 2 to be array, boolean given
?>

The correct way of doing this is the following:
<?php
$lol = unserialize($string, ['allowed_classes' => false]);
?>

Hope it helps somebody!
bjd 02-Jan-2017 12:49
Talk on Exploiting PHP7 Unserialize here: https://media.ccc.de/v/33c3-7858-exploiting_php7_unserialize
m.m.j.kronenburg 06-Sep-2016 09:52
You can use the following code to use the php 7 unserialize function in php 5.3 and upwards. This adds the $option argument.

<?php

namespace
{

/**
 * PHP 7 unserialize function for PHP 5.3 upwards.
 * Added the $option argument (allowed_classes).
 * See php unserialize manual for more detail.
 **/
function php7_unserialize($str, $options = array())
{
  if(version_compare(PHP_VERSION, '7.0.0', '>='))
  { return unserialize($str, $options); }

  $allowed_classes = isset($options['allowed_classes']) ?
    $options['allowed_classes'] : true;
  if(is_array($allowed_classes) || !$allowed_classes)
  {
    $str = preg_replace_callback(
      '/(?=^|:)(O|C):\d+:"([^"]*)":(\d+):{/',
      function($matches) use ($allowed_classes)
      {
        if(is_array($allowed_classes) &&
          in_array($matches[2], $allowed_classes))
        { return $matches[0]; }
        else
        {
          return $matches[1].':22:"__PHP_Incomplete_Class":'.
            ($matches[3] + 1).
            ':{s:27:"__PHP_Incomplete_Class_Name";'.
            serialize($matches[2]);
        }
      },
      $str
    );
  }
  unset($allowed_classes);
  return unserialize($str);
}

} // namespace

namespace my_name_space
{
  /**
   * Use the new php7 unserialize in your namespace without
   * renaming all unserialize(...) function calls to
   * php7_unserialize(...).
   **/
  function unserialize($str, $options = array())
  { return php7_unserialize($str, $options); }
}

?>
chris at pollett dot org 02-Jul-2015 03:28
When you serialize an object of a class from a particular namespace, the namespace is recorded as part of the serialization. If you decide to change this namespace's name, it can be hard to read in old serialized objects. I.e., suppose you had serialized an object of type foo\A, you change the namespace of your project to goo but otherwise leave the class definition of A unchanged. You would like to be able to unserialize the object as goo\A, instead unserialization will only create a partial object. To fix this in the case where you don't have nested objects in your class definition, you can use the following simple rename function:
/**
 * Used to change the namespace of a serialized php object (assumes doesn't
 * have nested subobjects)
 *
 * @param string $class_name new fully qualified name with namespace
 * @param string $object_string serialized object
 *
 * @return string serialized object with new name
 */
function renameSerializedObject($class_name, $object_string)
{
    /*  number of digits in the length of name of the object needs to be
        less than 12 digits (probably more like 4) for this to work.
    */
    $name_length = intval(substr($object_string, 2, 14));
    $name_space_info_length = strlen("O:".$name_length.":") +
        $name_length + 2; // 2 for quotes;
    $object_string = 'O:' .
        strlen($class_name) . ':"'. $class_name.'"' .
        substr($object_string, $name_space_info_length);
    return $object_string;
}
ErnestV 03-Aug-2013 01:05
Just a note - if the serialized string contains a reference to a class that cannot be instantiated (e.g. being abstract) PHP will immediately die with a fatal error. If the unserialize() statement is preceded with a '@' to avoid cluttering the logs with warns or notices there will be absolutely no clue as to why the script stopped working. Cost me a couple of hours...
Ray.Paseur often uses Gmail 26-Jul-2013 01:41
In the Classes and Objects docs, there is this: In order to be able to unserialize() an object, the class of that object needs to be defined.

Prior to PHP 5.3, this was not an issue.  But after PHP 5.3 an object made by SimpleXML_Load_String() cannot be serialized.  An attempt to do so will result in a run-time failure, throwing an exception.  If you store such an object in $_SESSION, you will get a post-execution error that says this:

Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'SimpleXMLElement' is not allowed' in [no active file]:0 Stack trace: #0 {main} thrown in [no active file] on line 0

The entire contents of the session will be lost.  Hope this saves someone some time!

<?php // RAY_temp_ser.php
error_reporting(E_ALL);
session_start();
var_dump($_SESSION);
$_SESSION['hello'] = 'World';
var_dump($_SESSION);

// AN XML STRING FOR TEST DATA
$xml = '<?xml version="1.0"?>
<families>
  <parent>
    <child index="1" value="Category 1">Child One</child>
  </parent>
</families>';

// MAKE AN OBJECT (GIVES SimpleXMLElement)
$obj = SimpleXML_Load_String($xml);

// STORE THE OBJECT IN THE SESSION
$_SESSION['obj'] = $obj;
suman dot jis at gmail dot com 13-Mar-2012 09:12
I was getting unserialize()  Error at offset error.

If you face similar problem  then use the following procedure

$auctionDetails = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $dataArr[$i]['auction_details'] );
$auctionDetails = unserialize($auctionDetails);
walf 22-Aug-2011 08:22
a replacement for unserialize that returns whether it worked and populates the unserialized variable by reference:
<?php
function funserialize($serialized, &$into) {
    static $sfalse;
    if ($sfalse === null)
        $sfalse = serialize(false);
    $into = @unserialize($serialized);
    return $into !== false || rtrim($serialized) === $sfalse;//whitespace at end of serialized var is ignored by PHP
}

$s_foo = 'b:0;';
var_dump(funserialize($s_foo, $foo), $foo);

$s_bar = 'bar';
var_dump(funserialize($s_bar, $bar), $bar);

$s_foo = 'a:0:{};';
var_dump(funserialize($s_foo, $foo), $foo);

?>
gives:

bool(true)
bool(false)

bool(false)
bool(false)

bool(true)
array(0) {
}
MBa 02-Aug-2011 03:49
To check if a string is serialized:

$blSerialized=(@unserialize($sText)||$sText=='b:0;');
chris at colourlovers dot com 16-Jun-2011 05:31
Anyone having trouble serializing data with SimpleXMLElement objects stored within it, check this out:

This will traverse $data looking for any children which are instances of SimpleXMLElement, and will run ->asXML() on them, turning them into a string and making them serializable. Other data will be left alone.

<?php
function exportNestedSimpleXML($data) {
    if (is_scalar($data) === false) {
        foreach ($data as $k => $v) {
            if ($v instanceof SimpleXMLElement) {
                $v = str_replace("&#13;","\r",$v->asXML());
            } else {
                $v = exportNestedSimpleXML($v);
            }

            if (is_array($data)) {
                $data[$k] = $v;
            } else if (is_object($data)) {
                $data->$k = $v;
            }
        }
    }

    return $data;
}

$data = array (
    "baz" => array (
        "foo" => new stdClass(),
        "int" => 123,
        "str" => "asdf",
        "bar" => new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><foo>bar</foo>'),
    )
);

var_dump($data);
/*array(1) {
  ["baz"]=>
  array(4) {
    ["foo"]=>
    object(stdClass)#3 (0) {
    }
    ["int"]=>
    int(123)
    ["str"]=>
    string(4) "asdf"
    ["bar"]=>
    object(SimpleXMLElement)#4 (1) {
      [0]=>
      string(3) "bar"
    }
  }
}*/

var_dump(exportNestedSimpleXML($data));
/*array(1) {
  ["baz"]=>
  array(4) {
    ["foo"]=>
    object(stdClass)#3 (0) {
    }
    ["int"]=>
    int(123)
    ["str"]=>
    string(4) "asdf"
    ["bar"]=>
    string(54) "<?xml version="1.0" encoding="UTF-8"?>
<foo>bar</foo>
"
  }
}
*/
?>
daniel at fourstaples dot com 23-Mar-2010 08:46
Here's a simple function to get the class of a serialized string (that is, the type of object that will be returned if it's unserialized):

<?php
function get_serial_class($serial) {
    $types = array('s' => 'string', 'a' => 'array', 'b' => 'bool', 'i' => 'int', 'd' => 'float', 'N;' => 'NULL');

    $parts = explode(':', $serial, 4);
    return isset($types[$parts[0]]) ? $types[$parts[0]] : trim($parts[2], '"');
}
?>

I use this when saving a serialized object to a cookie, to make sure it is the right type when I go to unserialize it.

The type names are the same format/case as you would see if you did a var_dump().
Fagzal 09-Mar-2010 10:10
To all who have problem with quoting and slashes when storing serialized data in MySQL: you are probably doing it wrong.

Use e.g. PDO with placeholders and the blob column type, and it will Just Work.
arbie samong 10-Sep-2009 07:42
__PHP_Incomplete_Class Object Demystified

1. First take note of the output. A simple example:

__PHP_Incomplete_Class Object (
[__PHP_Incomplete_Class_Name] => SomeObject1
[obj1property1] => somevalue1 [obj1property2] => __PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => SomeObject2 [obj2property1] => somevalue1 [obj2property2] => Array (
['key1'] => somevalue3, ['key2'] => somevalue4 ) ) )

2. We analyze this and break it down.
__PHP_Incomplete_Class Object tells you there is an object that needs to be declared somehow.
__PHP_Incomplete_Class_Name simply tells you the expected class name. It is just one of the properties for now.

So we have:
a) an unknown object that has a class name SomeObject1 (first class)
b) it has 2 properties, namely obj1property1 and obj2property2
c) obj2property2 is itself an object whose class name is SomeObject2 (the second class)
d) SomeObject2 has two properties, obj2property1 and obj2property2
e) obj2property2 is an array that contains two elements

3. Now that we have an idea of the structure, we shall create class definitions based from it. We will just create properties for now, methods are not required as a minimum.

<?php
class SomeObject1 {
        public $obj1property1;
        public $obj1property2;
}
class SomeObject2 {
        public $obj2property1;
        public $obj2property2;
}
?>

4. Have that accessible to your script and it will solve the __PHP_Incomplete_Class Object problem as far as the output is concerned. Now you will have:

SomeObject1 ( [obj1property1] => somevalue1 [obj1property2] => SomeObject2 ( [obj2property1] => somevalue1 [obj2property2] => Array ( ['key1'] => somevalue3, ['key2'] => somevalue4 ) ) )

As you will notice, __PHP_Incomplete_Class Object is gone and replaced by the class name. The property __PHP_Incomplete_Class_Name is also removed.

5. As for the array property obj2property2, we can directly access that and just assume that it is an array and loop through it:

<?php

// this will be SomeObject1
$data = unserialize($serialized_data);

// this will be SomeObject2
$data2 = $data->obj1property2();

foreach($data2->obj2property2 as $key => $value):
         print $key.' : '. $value .'<br>';
endforeach;

?>

Outputs:
key1 : somevalue3
key2 : somevalue4

That's it. You can add more methods on the class declarations for the given properties, provided you keep your original output as basis for the data types.
w dot laurencine at teknoa dot net 07-Apr-2009 05:54
When dealing with a string which contain "\r", it seems that the length is not evaluated correctly. The following solves the problem for me :

<?php
// remove the \r caracters from the $unserialized string
$unserialized = str_replace("\r","",$unserialized);

// and then unserialize()
unserialize($unserialized);
?>
chris AT cmbuckley DOT co DOT uk 14-Aug-2008 06:47
As mentioned in the notes, unserialize returns false in the event of an error and for boolean false. Here is the first solution mentioned, without using error handling:

<?php
function isSerialized($str) {
    return ($str == serialize(false) || @unserialize($str) !== false);
}

var_dump(isSerialized('s:6:"foobar";')); // bool(true)
var_dump(isSerialized('foobar'));        // bool(false)
var_dump(isSerialized('b:0;'));          // bool(true)
?>
BenBE at omorphia dot de 02-Mar-2007 06:20
When trying to serialize or unserialize recursive arrays or otherwise linked data you might find the undocumented R data type quite useful.

If you want a array like the one produced with
<?
$a = array();
$a[0] =& $a;
?>
serialized you can store it using a string simular to this one:
<?
$a = unserialize("a:1:{i:0;R:1;}");
?>

Both sources will make $a hold an array that self-references itself in index 0.

The argument for R is the index of the created sub-variable of the serialize-string beginning with 1.
double at dumpit dot com 19-Dec-2006 05:09
This little function will check whether the serialized string is well formed.

PHP < 6 because i'd heard changes will be made in this php-intern function,
maybe it could be edited easy for it.

<?php

function wd_check_serialization( $string, &$errmsg )
{

    $str = 's';
    $array = 'a';
    $integer = 'i';
    $any = '[^}]*?';
    $count = '\d+';
    $content = '"(?:\\\";|.)*?";';
    $open_tag = '\{';
    $close_tag = '\}';
    $parameter = "($str|$array|$integer|$any):($count)" . "(?:[:]($open_tag|$content)|[;])";
    $preg = "/$parameter|($close_tag)/";
    if( !preg_match_all( $preg, $string, $matches ) )
    {
        $errmsg = 'not a serialized string';
        return false;
    }
    $open_arrays = 0;
    foreach( $matches[1] AS $key => $value )
    {
        if( !empty( $value ) && ( $value != $array xor $value != $str xor $value != $integer ) )
        {
            $errmsg = 'undefined datatype';
            return false;
        }
        if( $value == $array )
        {
            $open_arrays++;
            if( $matches[3][$key] != '{' )
            {
                $errmsg = 'open tag expected';
                return false;
            }
        }
        if( $value == '' )
        {
            if( $matches[4][$key] != '}' )
            {
                $errmsg = 'close tag expected';
                return false;
            }
            $open_arrays--;
        }
        if( $value == $str )
        {
            $aVar = ltrim( $matches[3][$key], '"' );
            $aVar = rtrim( $aVar, '";' );
            if( strlen( $aVar ) != $matches[2][$key] )
            {
                $errmsg = 'stringlen for string not match';
                return false;
            }
        }
        if( $value == $integer )
        {
            if( !empty( $matches[3][$key] ) )
            {
                $errmsg = 'unexpected data';
                return false;
            }
            if( !is_integer( (int)$matches[2][$key] ) )
            {
                $errmsg = 'integer expected';
                return false;
            }
        }
    }
    if( $open_arrays != 0 )
    {
        $errmsg = 'wrong setted arrays';
        return false;
    }
    return true;
}

?>
Are Pedersen 09-Aug-2006 01:46
Be aware that if useing serialize/unserialize in a serverfarm with both 32bit and 64bit servers you can get unexpected results.

Ex: if you serialize an integer with value of 2147483648 on a 64bit system and then unserialize it on a 32bit system you will get the value -2147483648 instead. This is because an integer on 32bit cannot be above 2147483647 so it wraps.
Chris Hayes (chris at hypersites dot com) 23-Oct-2004 09:27
In reply to the earlier post about having to include object definitions *before* using unserialize.  There is a workaround for this.

When an object is serialized, the first bit of the string is actually the name of the class.  When an unknown object is unserialized, this is maintained as a property.  So if you serialize it again, you get back the exact same string as if you'd serialized the original object.  Basically, to cut to the point...

If you use

$_SESSION['my_object'] = unserialize(serialize($_SESSION['my_object']))

then you get back an object of the correct type, even if the session had originally loaded it as an object of type stdClass.
aderyn at nowhere dot tld 30-Oct-2003 10:02
A quick note:
If you store a serialized object in a session, you have to include the class _before_ you initialize (session_start()) the session.


Détruit une variable

  • « unserialize
  • var_dump »
  • PHP Manual
  • Fonctions de gestion des variables
  • Détruit une variable

unset

(PHP 4, PHP 5, PHP 7, PHP 8)

unset — Détruit une variable

Description

unset ( mixed $var , mixed ...$vars ) : void

unset() détruit la ou les variables dont le nom a été passé en argument var.

Le comportement de unset() à l'intérieur d'une fonction peut varier suivant le type de variable que vous voulez détruire.

Si une variable globale est détruite avec unset() depuis une fonction, seule la variable locale sera détruite. La variable globale gardera la valeur acquise avant l'appel à unset().

<?php
function destroy_foo()
{
    global $foo;
    unset($foo);
}

$foo = 'bar';
destroy_foo();
echo $foo;
?>

L'exemple ci-dessus va afficher :

bar

Pour détruire une variable globale à l'intérieur d'une fonction, vous pouvez utiliser le tableau $GLOBALS :

<?php
function foo()
{
    unset($GLOBALS['bar']);
}

$bar = "truc";
foo();
?>

Si une variable qui est passée par référence est détruite à l'intérieur d'une fonction, seule la variable locale sera détruite. La variable globale conservera la même valeur qu'elle avait avant l'appel de unset().

<?php
function foo(&$bar)
{
    unset($bar);
    $bar = "blah";
}

$bar = 'truc';
echo "$bar\n";

foo($bar);
echo "$bar\n";
?>

L'exemple ci-dessus va afficher :

truc
truc

Si une variable statique est détruite à l'intérieur d'une fonction unset() détruira la variable seulement dans le contexte du reste de la fonction. Les appels suivants restaureront la valeur précédente de la variable.

<?php
function foo()
{
    static $bar;
    $bar++;
    echo "Avant unset : $bar, ";
    unset($bar);
    $bar = 23;
    echo "après unset : $bar\n";
}

foo();
foo();
foo();
?>

L'exemple ci-dessus va afficher :

Avant unset : 1, après unset: 23
Avant unset : 2, après unset: 23
Avant unset : 3, après unset: 23

Liste de paramètres

var

La variable à détruire.

vars

Variables supplémentaires.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec unset()

<?php
// Destruction d'une seule variable
unset($foo);

// Destruction d'un élément de tableau
unset($bar['quux']);

// Destruction de plusieurs variables
unset($foo1, $foo2, $foo3);
?>

Exemple #2 Exemple avec un transtypage (unset)

Le transtypage (unset) est souvent confondu avec la fonction unset(). Le transtypage (unset) sert uniquement à transtyper en type NULL. Il n'altère pas la variable transtypée. Le transtypage (unset) est obsolète à partir de PHP 7.2.0.

<?php
$name = 'Felipe';

var_dump((unset) $name);
var_dump($name);
?>

L'exemple ci-dessus va afficher :

NULL
string(6) "Felipe"

Notes

Note: Comme ceci est une structure du langage, et non pas une fonction, il n'est pas possible de l'appeler avec les fonctions variables.

Note:

Il est possible de détruire n'importe quelle propriété visible dans le contexte courant.

Note:

Il n'est pas possible de détruire la variable spéciale $this à l'intérieur d'une méthode d'un objet.

Note:

Lors de l'utilisation de cette fonction sur des propriétés d'objet inaccessibles, la méthode magique __unset sera appelée, si elle existe.

Voir aussi

  • isset() - Détermine si une variable est déclarée et est différente de null
  • __unset()
  • empty() - Détermine si une variable est vide
  • array_splice() - Efface et remplace une portion de tableau
  • (unset) casting

User Contributed Notes

ronan at shopping-feed dot com 04-Feb-2020 08:19
<?php

$list = ['a', 'b', 'c'];
next($list);
unset($list[1]);

echo current($list); // result : "c"
Phantasma_9 at yahoo dot com 08-Aug-2016 06:17
This is probably trivial but there is no error for unsetting a non-existing variable.
magnesium dot oxide dot play+php at gmail dot com 20-Mar-2014 08:10
You can unset superglobals like $GLOBALS, $_GET etc., but causing an unususal behavior (as of PHP 5.3.3).

1) unsetting of superglobals is done globally, i.e. unsetting inside the function affects GLOBALLY.

2) Recreation of unset'ed superglobals can be done (recreated valiables are superglobals), but original functionality (in $GLOBALS, $_SESSION ...) has lost.

<?php

function foo(){
  unset($GLOBALS);
}

function bar(){
  var_dump($GLOBALS);
}

foo();
bar(); //issues E_NOTICE ($GLOBALS not defined)
$GLOBALS=3;
bar(); //displays int(3)

?>
Hayley Watson 05-Mar-2013 09:41
You don't need to check that a variable is set before you unset it.
<?php
unset($a);
?>
is harmless.
<?php
if(isset($a)) {
    unset($a);
}
?>
is pointless complication.

This doesn't apply to properties of objects that have __isset() methods that visibly change object state or __unset() methods that don't properly check their arguments or have extra side effects.

The latter case means that __unset shouldn't do more than what it says on the tin, and also has the responsibility for checking (possibly using __isset()) that what it's being asked to do makes sense.

The former case is just plain bad design.
tigercat at aol dot com 10-Oct-2012 07:55
The combination of "global" and "unset" in functions can lead to some unexpected results.  This is because the "global" function creates a reference to a variable at the time it's executed, so a variable can be deleted out from under a "global $my_variable" declaration in a function.  Accessing data that's been deleted with an obsolete reference is usually a bad thing; in some languages it can generate a machine address fault.

<?php
$my_global_var = "old data";
f1();

function f1() // example of invalid variable reference use
{
  global $my_global_var;   // creates reference to global variable
  f2(); // recreates global variable, so reference is now invalid

// bad...
  echo $my_global_var;     // outputs "old data" (from invalid memory???)

// good...
  global $my_global_var;  // reestablish reference to new global variable
  echo $my_global_var;     // outputs "new data" as expected
}

function f2() // recreate global variable
{
  unset($GLOBALS['my_global_var']); // this syntax works with all variable types including arrays
  global $my_global_var; // must do this after unset to access new global variable
  $my_global_var = "new data";
}
?>
pfreilly at umd dot umich dot edu 29-Sep-2011 04:56
Despite much searching, I have not yet found an explanation as to how one can manually free resources from variables, not so much objects, in PHP.  I have also seen many comments regarding the merits and demerits of unset() versus setting a variable to null.  Thus, here are the results of some benchmarks performed comparing unset() of numerous variables to setting them to null (with regards to memory usage and processing time):

10 variables:
Unset:
Memory Usage: 296
Time Elapsed: 1.0013580322266E-5

Null set:
Memory Usage: 1736
Time Elapsed: 5.9604644775391E-6

50 variables:
Unset:
Memory Usage: 296
Time Elapsed: 3.6001205444336E-5

Null set:
Memory Usage: 8328
Time Elapsed: 3.2901763916016E-5

100 variables:
Unset:
Memory Usage: 296
Time Elapsed: 5.6982040405273E-5

Null set:
Memory Usage: 15928
Time Elapsed: 5.8174133300781E-5

1000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.00041294097900391

Null set:
Memory Usage: 168096
Time Elapsed: 0.00067591667175293

10000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.0042569637298584

Null set:
Memory Usage: 1650848
Time Elapsed: 0.0076930522918701

100000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.042603969573975

Null set:
Memory Usage: 16249080
Time Elapsed: 0.087724924087524

300000 variables:
Unset:
Memory Usage: 296
Time Elapsed: 0.13177299499512

Null set:
Memory Usage: 49796320
Time Elapsed: 0.28617882728577

Perhaps my test code for the null set was flawed, but despite that possibility it is simple to see that unset() has minimal processing time impact, and no apparent memory usage impact (unless the values returned by memory_get_usage() are flawed).  If you truly care about the ~4 microseconds saved over <50 variables, more power to you.  Otherwise, use unset() to minimize script impact on your system.
Note: Tested on PHP 5.3.8 installed via RPM on Fedora 14
edouard dot berge at gmail dot com 24-Sep-2010 09:09
Warning!

When unset from an array, if you unset all elements, the array is always set

$tab=array('A'=>1,'B'=>2);
unset($tab['A']);
unset($tab['B']);
echo isset($tab)." ".count($tab);

output: 1 0
Andreas 24-Sep-2010 05:51
You can not unset a numeric key of an array, if key is a string. See this example:

// Create a simple array with 3 different key types
$test[1] = array(
    10 => array('apples'),
    "20" => array('bananas'),
    '30' => array('peaches')
);
$test[2] = (array) json_decode(json_encode($test[1]));
$test[3] = (array) (object) $test[1];
// array form a stdClass object
$testClass = new stdClass();
$testClass->{10} =  array('apples');
$testClass->{"20"} =  array('bananas');
$test[4] = (array) $testClass[6];

echo "<pre>";
foreach($test as $testNum => $arr) {

    echo "\nTest: " . $testNum  . " \n";
    var_dump($arr);

    foreach($arr as $key => $fruit) {
        echo "key: " . $key . "\n";
        echo "key exists: ";
        var_dump(array_key_exists(strval($key), $arr));
        echo "typeof key is: " . gettype($key) . "\n";

        unset($arr[$key]);
    }
    var_dump($arr);
    echo "\n" . str_repeat("-", 80);
}
echo "</pre>";

And here is the output:

Test: 1
array(3) {
  [10]=>
  array(1) {
    [0]=>
    string(6) "apples"
  }
  [20]=>
  array(1) {
    [0]=>
    string(7) "bananas"
  }
  [30]=>
  array(1) {
    [0]=>
    string(7) "peaches"
  }
}
key: 10
key exists: bool(true)
typeof key is: integer
key: 20
key exists: bool(true)
typeof key is: integer
key: 30
key exists: bool(true)
typeof key is: integer
array(0) {
}

--------------------------------------------------------------
Test: 2
array(3) {
  ["10"]=>
  array(1) {
    [0]=>
    string(6) "apples"
  }
  ["20"]=>
  array(1) {
    [0]=>
    string(7) "bananas"
  }
  ["30"]=>
  array(1) {
    [0]=>
    string(7) "peaches"
  }
}
key: 10
key exists: bool(false)
typeof key is: string
key: 20
key exists: bool(false)
typeof key is: string
key: 30
key exists: bool(false)
typeof key is: string
array(3) {
  ["10"]=>
  array(1) {
    [0]=>
    string(6) "apples"
  }
  ["20"]=>
  array(1) {
    [0]=>
    string(7) "bananas"
  }
  ["30"]=>
  array(1) {
    [0]=>
    string(7) "peaches"
  }
}

--------------------------------------------------------------
Test: 3
array(3) {
  [10]=>
  array(1) {
    [0]=>
    string(6) "apples"
  }
  [20]=>
  array(1) {
    [0]=>
    string(7) "bananas"
  }
  [30]=>
  array(1) {
    [0]=>
    string(7) "peaches"
  }
}
key: 10
key exists: bool(true)
typeof key is: integer
key: 20
key exists: bool(true)
typeof key is: integer
key: 30
key exists: bool(true)
typeof key is: integer
array(0) {
}

--------------------------------------------------------------
Test: 4
array(2) {
  ["10"]=>
  array(1) {
    [0]=>
    string(6) "apples"
  }
  ["20"]=>
  array(1) {
    [0]=>
    string(7) "bananas"
  }
}
key: 10
key exists: bool(false)
typeof key is: string
key: 20
key exists: bool(false)
typeof key is: string
array(2) {
  ["10"]=>
  array(1) {
    [0]=>
    string(6) "apples"
  }
  ["20"]=>
  array(1) {
    [0]=>
    string(7) "bananas"
  }
}

--------------------------------------------------------------

Fix the problem with a rebuild of the array:
$oldArray = $array();
$array = array();
foreach($oldArray as $key => $item) {
    $array[intval($key)] = $item;
}
j dot vd dot merwe at enovision dot net 26-Aug-2010 05:08
A sample how to unset array elements from an array result coming from a mysql request. In this sample it is checking if a file exists and removes the row from the array if it not exists.

<?php
$db->set_query("select * from documents where document_in_user = 0"); //1
$documents = $db->result_to_array($db->get_result()); //1

foreach ($documents as $key => $row) { //2

    $file     = "uploads/".rawurldecode($row['document_name']);

    if ( file_exists ( $file ) == FALSE ) {
         unset($documents[$key]);  //3
    }
}

$documents = array_values($documents); // reindex the array (4)
?>

variables:
mysql table = documents,
array = $documents
array key (index) = $key
array row (record sort of speak) = $row

explanation:

1.
it gets the array from the table (mysql)

2.
foreach goes through the array $documents

3.
unset if record does not exist

4.
the array_values($documents) reindexes the $documents array, for otherwise you might end up in trouble when your  process will start expecting an array starting with key ($key) 0 (zero).
Anonymous 02-Jul-2010 07:20
further I realized that an object, when getting detroyed, does care about destroying variable in object space visibility but not those in local visibility, be aware of the found pattern:

<?php
class release_test{
  private $buffer;
  private $other_object;
  public function __construct(){
    $this->other_object=new other_object_class();
  }
  public function __destruct(){
    //note that you always have to unset class objects, in order to get the resources released
    unset($this->other_object);
  }
  public allocate_mem_A(){
    $this->buffer=file("/tmp/bigfile");
  }
  public allocate_mem_B(){
    $buffer=file("/tmp/bigfile");
  }
  public allocate_mem_C(){
    $buffer=file("/tmp/bigfile");
    unset($buffer);
  }
  public allocate_mem_D(){
    $this->other_buffer=file("/tmp/bigfile");
  }
}

//this does not lead to a resource problem
$A=new release_test();
$A->allocate_mem_A();
$A->__destruct();
unset($A);

//this DOES lead to a resource problem
$B=new release_test();
$B->allocate_mem_B();
$B->__destruct();
unset($B);

//this does not lead to a resource problem
$C=new release_test();
$C->allocate_mem_C();
$C->__destruct();
unset($C);

//this does not lead to a resource problem
$D=new release_test();
$D->allocate_mem_D();
$D->__destruct();
unset($D);
?>
phpmanual at kennel17 dot co dot uk 26-Feb-2010 08:55
Note that PHP 4 will generate a warning if you try to unset an array index that doesn't exist and whose parent doesn't exist.

Example:

<?php

  $foo = array();

  unset($foo['Bar']['Baz']);

?>

RESULT: "Notice:  Undefined index:  Bar"

On PHP5 no error is raised, which seems to me like the correct behaviour.

Note that using unset($foo['Bar']) in the above example does not generate a warning in either version.

(Tested on 4.4.9 and 5.2.4)
macnimble at gmail dot com 26-Mar-2009 02:39
Two ways of unsetting values within an array:

<?php
# remove by key:
function array_remove_key ()
{
  $args  = func_get_args();
  return array_diff_key($args[0],array_flip(array_slice($args,1)));
}
# remove by value:
function array_remove_value ()
{
  $args = func_get_args();
  return array_diff($args[0],array_slice($args,1));
}

$fruit_inventory = array(
  'apples' => 52,
  'bananas' => 78,
  'peaches' => 'out of season',
  'pears' => 'out of season',
  'oranges' => 'no longer sold',
  'carrots' => 15,
  'beets' => 15,
);

echo "<pre>Original Array:\n",
     print_r($fruit_inventory,TRUE),
     '</pre>';

# For example, beets and carrots are not fruits...
$fruit_inventory = array_remove_key($fruit_inventory,
                                    "beets",
                                    "carrots");
echo "<pre>Array after key removal:\n",
     print_r($fruit_inventory,TRUE),
     '</pre>';

# Let's also remove 'out of season' and 'no longer sold' fruit...
$fruit_inventory = array_remove_value($fruit_inventory,
                                      "out of season",
                                      "no longer sold");
echo "<pre>Array after value removal:\n",
     print_r($fruit_inventory,TRUE),
     '</pre>';
?>
lion_cat at mail ru 12-Nov-2008 02:22
about unset for arrays

if you unset the last array member
$ar[0]==2
$ar[1]==7
$ar[2]==9

unset ($ar[2])

after addition a new member by $ar[]=7,

you will get
$ar[0]==2
$ar[1]==7
$ar[3]==7,

So, unset has no effect to internal array counter!!!
nox at oreigon dot de 05-Aug-2008 12:24
if you try to unset an object, please be careful about references.

Objects will only free their resources and trigger their __destruct method when *all* references are unsetted.
Even when they are *in* the object... sigh!

<?php

class A {
  function __destruct() {
    echo "cYa later!!\n";
  }
}

$a = new A();
$a -> a = $a;
#unset($a); # Just uncomment, and you'll see

echo "No Message ... hm, what now?\n";
unset($a -> a);
unset($a);

echo "Finally that thing is gone\n";

?>

Of course the object completely dies at the end of the script.
stacionari at gmail dot com 17-Mar-2008 01:41
Sometimes you need to assigne values to an array index in some loop (if, while, foreach etc.) but you wish to set starting index key to some number greater then zero (lets say 5). One idea how to do this is:

<?php
    $values = array(5, 10, 15, 100);  //array of values that we wish to add to our new array

    $myArray = array(4=>0);   //sets starting key to be 4 and assigns some value (lets say 0)
    unset($myArray[4]);   //delete this index key, but preserves further enumeration

    foreach($values as $value){
        $myArray[] = $value;   //asign values to our array
    }

    print_r($myArray);

/* Output:

Array ( [5] => 5 [6] => 10 [7] => 15 [8] => 100 )

*/

?>
pauljamescampbell at gmail dot com 15-Mar-2008 05:22
Here's my variation on the slightly dull unset method. It throws in a bit of 80's Stallone action spice into the mix. Enjoy!

<?php
/**
 * function rambo (first blood)
 *
 * Completely and utterly destroys everything, returning the kill count of victims
 *
 * @param    It don't matter, it’s Rambo baby
 * @return    Integer    Body count (but any less than 500 and it's not really worth mentioning)
 */
function rambo() {

    // Get the victims and initiate that body count status
    $victims = func_get_args();
    $body_count = 0;

    // Kill those damn punks
    foreach($victims as $victim) {
        if($death_and_suffering = @unset($victim)) {
            $body_count++;
        }
    }

    // How many kills did Rambo tally up on this mission?
    return($body_count);
}
?>
Kai Kunstmann 10-Mar-2008 05:09
Since unset() is a language construct, it cannot be passed anything other than a variable. It's sole purpose is to "unset" this variable, ie. to remove it from the current scope and destroy it's associated data. This is true especially for reference variables, where not the actual value is destroyed but the reference to that value. This is why you can't wrap 'unset()' in a user defined function: You would either unset a copy of the data if the parameter is passed by value, or you would just unset the reference variable within the functions scope if the parameter is passed by reference. There is no workaround for that, as you cannot pass 'scope' to a function in PHP. Such a function can only work for variables that exist in a common or global scope (compare 'unset($_GLOBALS[variable])').

I don't know how PHP handles garbage collection internally, but I guess this behavior can result in a huge memory leak: if a value variable goes out of scope with a second variable still holding a reference to the in-memory value, then unsetting that reference would still hold the value in memory but potentially unset the last reference to that in-memory data, hence: occupied memory that is rendered useless as you cannot reference it anymore.
Hayley Watson 23-Aug-2007 09:02
In regard to some confusion earlier in these notes about what causes unset() to trigger notices when unsetting variables that don't exist....

Unsetting variables that don't exist, as in
<?php
unset($undefinedVariable);
?>
does not trigger an "Undefined variable" notice. But
<?php
unset($undefinedArray[$undefinedKey]);
?>
triggers two notices, because this code is for unsetting an element of an array; neither $undefinedArray nor $undefinedKey are themselves being unset, they're merely being used to locate what should be unset. After all, if they did exist, you'd still expect them to both be around afterwards. You would NOT want your entire array to disappear just because you unset() one of its elements!
chad 0x40 herballure 0x2e com 31-May-2007 07:11
It is observed on PHP 5.1.6 that <?php unset($this); ?> inside of a method will remove the reference to $this in that method. $this isn't considered "special" as far as unset() is concerned.
09-Feb-2007 08:10
Just to confirm, USING UNSET CAN DESTROY AN ENTIRE ARRAY. I couldn't find reference to this anywhere so I decided to write this.

The difference between using unset and using $myarray=array(); to unset is that obviously the array will just be overwritten and will still exist.

<?php

$myarray=array("Hello","World");

echo $myarray[0].$myarray[1];

unset($myarray);
//$myarray=array();

echo $myarray[0].$myarray[1];

echo $myarray;
?>

Output with unset is:
<?
HelloWorld

Notice: Undefined offset: 0 in C:\webpages\dainsider\myarray.php on line 10

Notice: Undefined offset: 1 in C:\webpages\dainsider\myarray.php on line 10

Output with $myarray=array(); is:
?>

<?
HelloWorld

Notice: Undefined offset: 0 in C:\webpages\dainsider\myarray.php on line 10

Notice: Undefined offset: 1 in C:\webpages\dainsider\myarray.php on line 10

Array
?>
hessodreamy at gmail dot com 17-Jan-2007 03:51
To clarify what hugo dot dworak at gmail dot com said about unsetting things that aren't already set:

unsetting a non-existent key within an array does NOT throw an error.
<?
$array = array();

unset($array[2]);
//this does not throw an error

unset($array[$undefinedVar]);
//Throws an error because of the undefined variable, not because of a non-existent key.
?>
dibakar dot datta at gmail dot com 31-Mar-2006 11:31
Instead of using the unset function  for unregistering your session or other array values you can also do this samll feature and get this task done with just 1 line code.

Suppose, if you like to unregister your session store values.
You can use:

      $_SESSION = array();

Well this syntax saves lot's of time instead of unsetting each values.
clark at everettsconsulting dot com 11-Sep-2005 12:50
In PHP 5.0.4, at least, one CAN unset array elements inside functions from arrays passed by reference to the function.
As implied by the manual, however, one can't unset the entire array by passing it by reference.

<?php
function remove_variable (&$variable)  // pass variable by reference
{
    unset($variable);
}

function remove_element (&$array, $key) // pass array by reference
{
    unset($array[$key]);
}

$scalar = 'Hello, there';
echo 'Value of $scalar is: ';
print_r ($scalar); echo '<br />';
// Value of $scalar is: Hello, there

remove_variable($scalar); // try to unset the variable
echo 'Value of $scalar is: ';
print_r ($scalar); echo '<br />';
// Value of $scalar is: Hello, there

$array = array('one' => 1, 'two' => 2, 'three' => 3);
echo 'Value of $array is: ';
print_r ($array); echo '<br />';
// Value of $array is: Array ( [one] => 1 [two] => 2 [three] => 3 )

remove_variable($array); // try to unset the array
echo 'Value of $array is: ';
print_r ($array); echo '<br />';
// Value of $array is: Array ( [one] => 1 [two] => 2 [three] => 3 )

remove_element($array, 'two'); // successfully remove an element from the array
echo 'Value of $array is: ';
print_r ($array); echo '<br />';
// Value of $array is: Array ( [one] => 1 [three] => 3 )

?>
no at spam dot com 30-Aug-2005 03:22
In addition to what timo dot hummel at 4fb dot de said;

>For the curious: unset also frees memory of the variable used.
>
>It might be possible that the in-memory size of the PHP Interpreter isn't reduced, but your scripts won't touch the memory_limit boundary. Memory is reused if you declare new variables.

It might be worth adding that functions apparently don't free up memory on exit the same way unset does..
Maybe this is common knowledge, but although functions destroys variables on exit, it (apparently) doesn't help the memory.

So if you use huge variables inside functions, be sure to unset them if you can before returning from the function.

In my case, if I did not unset before return, then the script would use 20 MB more of memory than if I did unset.
This was tested with php 5.0.4 on apache 2 on windows xp, with no memory limit.

Before I did the test, I was under the impression that when you exit from functions, the memory used inside it would be cleared and reused. Maybe this should be made clear in the manual, for either unset() or in the chapter for functions.
muhamad_zakaria at yahoo dot com 04-Jul-2005 07:08
We have experienced when we applied 'unset' to the overloaded properties (PHP5), consider the code below:
<?php
    class TheObj {
        public $RealVar1, $RealVar2, $RealVar3, $RealVar4;
        public $Var = array();

        function __set($var, $val) {
            $this->Var[$var] = $val;
        }
        function __get($var) {
            if(isset($this->Var[$var])) return $this->Var[$var];
            else return -1;
        }
    }

    $SomeObj = new TheObj;

    // here we set for real variables
    $SomeObj->RealVar1 = 'somevalue';
    $SomeObj->{'RealVar2'} = 'othervalue';
    $SomeObj->{'RealVar'.(3)} = 'othervaluetoo';
    $SomeObj->{'RealVar'.'4'} = 'anothervalue';

    // and here we set for virtual variables
    $SomeObj->Virtual1 = 'somevalue';
    $SomeObj->{'Virtual2'} = 'othervalue';
    $SomeObj->{'Virtual'.(3)} = 'othervaluetoo';
    $SomeObj->{'Virtual'.'4'} = 'anothervalue';

    // now we will try to unset these variables
    unset($SomeObj->RealVar1);
    unset($SomeObj->{'RealVar'.(3)});

    //the lines below will catch by '__get' magic method since these variables are unavailable anymore
    print $SomeObj->RealVar1."\n";
    print $SomeObj->{'RealVar'.(3)}."\n";

    // now we will try to unset these variables
    unset($SomeObj->Virtual1);
    unset($SomeObj->{'Virtual'.(3)});

    //but, these variables are still available??? eventhough they're "unset"-ed
    print $SomeObj->Virtual1."\n";
    print $SomeObj->{'Virtual'.(3)}."\n";
?>

Please note that PHP doesn't have magic callback to unset overloaded properties. This is the reason why unset($SomeObj->Virtual1) doesn't work.

But it does work when we set 'null' value such as the following code:
<?php
    // now we will set 'null' value instead of using unset statement
    $SomeObj->Virtual1 = null;
    $SomeObj->{'Virtual'.(3)} = null;

    // and now these variables are no longer available
    print $SomeObj->Virtual1."\n";
    print $SomeObj->{'Virtual'.(3)}."\n";
?>
Sound ugly, yeah?

This applied to the "virtual" array variable too, see more at http://bugs.php.net/bug.php?id=33513 (at feedback) about it.
PS: we used PHP version 5.1.0-dev from the CVS snapshot when we wrote the above codes.
franckraynal at free dot fr 26-Feb-2005 05:02
Here is another way to make 'unset' work with session variables from within a function :

<?php
function unsetSessionVariable ($sessionVariableName) {
   unset($GLOBALS[_SESSION][$sessionVariableName]);
}
?>

May it work with others than me...
F.
dan AT --nospam-- cubeland DOT co DOT uk 04-Nov-2004 11:38
dh at argosign dot de -
it is possible to unset globals from within functions thanks to the $GLOBALS array:

<?php
$x = 10;

function test() {
    // don't need to do ' global $x; '
    unset ($GLOBALS['x']);
    echo 'x: ' . $GLOBALS['x'] . '<br />';
}

test();
echo "x: $x<br />";

// will result in
/*
x:
x:
*/
?>
thorry at thorry dot net 05-Aug-2004 02:15
The documentation is not entirely clear when it comes to static variables. It says:

If a static variable is unset() inside of a function, unset() destroys the variable and all its references.

<?php
function foo()
{
   static $a;
   $a++;
   echo "$a\n";
   unset($a);
}

foo();
foo();
foo();
?>

The above example would output:

1
2
3

And it does! But the variable is NOT deleted, that's why the value keeps on increasing, otherwise the output would be:

1
1
1

The references are destroyed within the function, this handeling is the same as with global variables, the difference is a static variable is a local variable.

Be carefull using unset and static values as the output may not be what you expect it to be. It appears to be impossible to destroy a static variable. You can only destroy the references within the current executing function, a successive static statement will restore the references.

The documentation would be better if it would say:
"If a static variable is unset() inside of a function, unset() destroys all references to the variable. "

Example: (tested PHP 4.3.7)
<?php
function foo()
{
   static $a;
   $a++;
   echo "$a\n";
   unset($a);
   echo "$a\n";
   static $a;
   echo "$a\n";
}

foo();
foo();
foo();
?>

Would output:

1

1
2

2
3

3
anon at no spam dot no address dot com 16-Jul-2004 09:19
Adding on to what bond at noellebond dot com said, if you want to remove an index from the end of the array, if you use unset, the next index value will still be what it would have been.

Eg you have
<?php
 $x = array(1, 2);

 for ($i = 0; $i < 5; $i++)
 {
    unset($x[(count($x)-1)]); //remove last set key in the array

    $x[] = $i;
 }
?>

You would expect:
Array([0] => 1, [1] => 4)
as you want it to remove the last set key....

but you actually get
Array ( [0] => 1 [4] => 2 [5] => 3 [6] => 4 )

This is since even though the last key is removed, the auto indexing still keeps its previous value.

The only time where this would not seem right is when you remove a value off the end. I guess different people would want it different ways.

The way around this is to use array_pop() instead of unset() as array_pop() refreshes the autoindexing thing for the array.
<?php
 $x = array(1, 2);

 for ($i = 0; $i < 5; $i++)
 {
    array_pop($x); // removes the last item in the array

    $x[] = $i;
 }
?>

 This returns the expected value of x = Array([0] => 1, [1] => 4);

Hope this helps someone who may need this for some odd reason, I did.
andre at twg dot com dot au 06-Mar-2004 09:16
Only This works with register_globals being 'ON'.

unset( $_SESSION['variable'] );

The above will not work with register_globals turned on (will only work outside of a function).

$variable = $_SESSION['variable'];
unset( $_SESSION['variable'], $variable );

The above will work with register_globals on & inside a function
warhog at warhog dot net 27-Jan-2004 08:52
you may wan't to unset all variables which are defined, here's one way:

<?php

function unset_all_vars($a)
{ foreach($a as $key => $val)
  { unset($GLOBALS[$key]); }
  return serialize($a); }

unset_all_vars(get_defined_vars());

?>

you can also save than a serialized var of the "memory" and perhaps store this in a temporary file.. very usefull if you work with text files and/or file uploads when you've got very large variables.

greetz


Affiche les informations d'une variable

  • « unset
  • var_export »
  • PHP Manual
  • Fonctions de gestion des variables
  • Affiche les informations d'une variable

var_dump

(PHP 4, PHP 5, PHP 7, PHP 8)

var_dump — Affiche les informations d'une variable

Description

var_dump ( mixed $value , mixed ...$values ) : void

var_dump() affiche les informations structurées d'une variable, y compris son type et sa valeur. Les tableaux et les objets sont explorés récursivement, avec des indentations, pour mettre en valeur leur structure.

Toutes les propriétés publiques, privées et protégées des objets seront retournées dans la sortie à moins que l'objet n'implémente une méthode __debugInfo() (implémenté en PHP 5.6.0).

Astuce

Comme pour toutes les fonctions qui affichent directement des résultats au navigateur, les fonctions de gestion des sorties peuvent être utilisées pour capturer la sortie de cette fonction et l'enregistrer dans une chaîne de caractères (par exemple).

Liste de paramètres

value

L'expression afficher.

values

Expression supplémentaire à afficher.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec var_dump()

<?php
$a = array(1, 2, array("a", "b", "c"));
var_dump($a);
?>

L'exemple ci-dessus va afficher :

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  array(3) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
    [2]=>
    string(1) "c"
  }
}
<?php

$b = 3.1;
$c = true;
var_dump($b, $c);

?>

L'exemple ci-dessus va afficher :

float(3.1)
bool(true)

Voir aussi

  • print_r() - Affiche des informations lisibles pour une variable
  • debug_zval_dump() - Extrait une représentation sous forme de chaîne de la structure interne d'une zval pour affichage
  • var_export() - Retourne le code PHP utilisé pour générer une variable
  • __debugInfo()

User Contributed Notes

fabien dot villepinte at gmail dot com 27-May-2019 02:59
It's important to note that the output depends on the precision directive.
<?php
var_dump(10000000000000.5); // float(10000000000000)
ini_set('precision',-1);
var_dump(10000000000000.5); // float(10000000000000.5)
?>
Anonymous 18-Jul-2016 06:27
Be careful this outputs to stdout stream (1) instead of the proper stderr stream (2).
b dot bergloev at gmail dot com 31-Oct-2014 11:45
I post a new var_dump function with colors and collapse features. It can also adapt to terminal output if you execute it from there. No need to wrap it in a pre tag to get it to work in browsers.

<?php
function dump_debug($input, $collapse=false) {
    $recursive = function($data, $level=0) use (&$recursive, $collapse) {
        global $argv;

        $isTerminal = isset($argv);

        if (!$isTerminal && $level == 0 && !defined("DUMP_DEBUG_SCRIPT")) {
            define("DUMP_DEBUG_SCRIPT", true);

            echo '<script language="Javascript">function toggleDisplay(id) {';
            echo 'var state = document.getElementById("container"+id).style.display;';
            echo 'document.getElementById("container"+id).style.display = state == "inline" ? "none" : "inline";';
            echo 'document.getElementById("plus"+id).style.display = state == "inline" ? "inline" : "none";';
            echo '}</script>'."\n";
        }

        $type = !is_string($data) && is_callable($data) ? "Callable" : ucfirst(gettype($data));
        $type_data = null;
        $type_color = null;
        $type_length = null;

        switch ($type) {
            case "String":
                $type_color = "green";
                $type_length = strlen($data);
                $type_data = "\"" . htmlentities($data) . "\""; break;

            case "Double":
            case "Float":
                $type = "Float";
                $type_color = "#0099c5";
                $type_length = strlen($data);
                $type_data = htmlentities($data); break;

            case "Integer":
                $type_color = "red";
                $type_length = strlen($data);
                $type_data = htmlentities($data); break;

            case "Boolean":
                $type_color = "#92008d";
                $type_length = strlen($data);
                $type_data = $data ? "TRUE" : "FALSE"; break;

            case "NULL":
                $type_length = 0; break;

            case "Array":
                $type_length = count($data);
        }

        if (in_array($type, array("Object", "Array"))) {
            $notEmpty = false;

            foreach($data as $key => $value) {
                if (!$notEmpty) {
                    $notEmpty = true;

                    if ($isTerminal) {
                        echo $type . ($type_length !== null ? "(" . $type_length . ")" : "")."\n";

                    } else {
                        $id = substr(md5(rand().":".$key.":".$level), 0, 8);

                        echo "<a href=\"javascript:toggleDisplay('". $id ."');\" style=\"text-decoration:none\">";
                        echo "<span style='color:#666666'>" . $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "</span>";
                        echo "</a>";
                        echo "<span id=\"plus". $id ."\" style=\"display: " . ($collapse ? "inline" : "none") . ";\">&nbsp;&#10549;</span>";
                        echo "<div id=\"container". $id ."\" style=\"display: " . ($collapse ? "" : "inline") . ";\">";
                        echo "<br />";
                    }

                    for ($i=0; $i <= $level; $i++) {
                        echo $isTerminal ? "|    " : "<span style='color:black'>|</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                    }

                    echo $isTerminal ? "\n" : "<br />";
                }

                for ($i=0; $i <= $level; $i++) {
                    echo $isTerminal ? "|    " : "<span style='color:black'>|</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                }

                echo $isTerminal ? "[" . $key . "] => " : "<span style='color:black'>[" . $key . "]&nbsp;=>&nbsp;</span>";

                call_user_func($recursive, $value, $level+1);
            }

            if ($notEmpty) {
                for ($i=0; $i <= $level; $i++) {
                    echo $isTerminal ? "|    " : "<span style='color:black'>|</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
                }

                if (!$isTerminal) {
                    echo "</div>";
                }

            } else {
                echo $isTerminal ?
                        $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "  " :
                        "<span style='color:#666666'>" . $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "</span>&nbsp;&nbsp;";
            }

        } else {
            echo $isTerminal ?
                    $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "  " :
                    "<span style='color:#666666'>" . $type . ($type_length !== null ? "(" . $type_length . ")" : "") . "</span>&nbsp;&nbsp;";

            if ($type_data != null) {
                echo $isTerminal ? $type_data : "<span style='color:" . $type_color . "'>" . $type_data . "</span>";
            }
        }

        echo $isTerminal ? "\n" : "<br />";
    };

    call_user_func($recursive, $input);
}
?>
stlawson *AT* joyfulearthtech *DOT* com 10-Aug-2011 09:31
<?php
/**
 * Better GI than print_r or var_dump -- but, unlike var_dump, you can only dump one variable.
 * Added htmlentities on the var content before echo, so you see what is really there, and not the mark-up.
 *
 * Also, now the output is encased within a div block that sets the background color, font style, and left-justifies it
 * so it is not at the mercy of ambient styles.
 *
 * Inspired from:     PHP.net Contributions
 * Stolen from:       [highstrike at gmail dot com]
 * Modified by:       stlawson *AT* JoyfulEarthTech *DOT* com
 *
 * @param mixed $var  -- variable to dump
 * @param string $var_name  -- name of variable (optional) -- displayed in printout making it easier to sort out what variable is what in a complex output
 * @param string $indent -- used by internal recursive call (no known external value)
 * @param unknown_type $reference -- used by internal recursive call (no known external value)
 */
function do_dump(&$var, $var_name = NULL, $indent = NULL, $reference = NULL)
{
    $do_dump_indent = "<span style='color:#666666;'>|</span> &nbsp;&nbsp; ";
    $reference = $reference.$var_name;
    $keyvar = 'the_do_dump_recursion_protection_scheme'; $keyname = 'referenced_object_name';

    // So this is always visible and always left justified and readable
    echo "<div style='text-align:left; background-color:white; font: 100% monospace; color:black;'>";

    if (is_array($var) && isset($var[$keyvar]))
    {
        $real_var = &$var[$keyvar];
        $real_name = &$var[$keyname];
        $type = ucfirst(gettype($real_var));
        echo "$indent$var_name <span style='color:#666666'>$type</span> = <span style='color:#e87800;'>&amp;$real_name</span><br>";
    }
    else
    {
        $var = array($keyvar => $var, $keyname => $reference);
        $avar = &$var[$keyvar];

        $type = ucfirst(gettype($avar));
        if($type == "String") $type_color = "<span style='color:green'>";
        elseif($type == "Integer") $type_color = "<span style='color:red'>";
        elseif($type == "Double"){ $type_color = "<span style='color:#0099c5'>"; $type = "Float"; }
        elseif($type == "Boolean") $type_color = "<span style='color:#92008d'>";
        elseif($type == "NULL") $type_color = "<span style='color:black'>";

        if(is_array($avar))
        {
            $count = count($avar);
            echo "$indent" . ($var_name ? "$var_name => ":"") . "<span style='color:#666666'>$type ($count)</span><br>$indent(<br>";
            $keys = array_keys($avar);
            foreach($keys as $name)
            {
                $value = &$avar[$name];
                do_dump($value, "['$name']", $indent.$do_dump_indent, $reference);
            }
            echo "$indent)<br>";
        }
        elseif(is_object($avar))
        {
            echo "$indent$var_name <span style='color:#666666'>$type</span><br>$indent(<br>";
            foreach($avar as $name=>$value) do_dump($value, "$name", $indent.$do_dump_indent, $reference);
            echo "$indent)<br>";
        }
        elseif(is_int($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> $type_color".htmlentities($avar)."</span><br>";
        elseif(is_string($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> $type_color\"".htmlentities($avar)."\"</span><br>";
        elseif(is_float($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> $type_color".htmlentities($avar)."</span><br>";
        elseif(is_bool($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> $type_color".($avar == 1 ? "TRUE":"FALSE")."</span><br>";
        elseif(is_null($avar)) echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> {$type_color}NULL</span><br>";
        else echo "$indent$var_name = <span style='color:#666666'>$type(".strlen($avar).")</span> ".htmlentities($avar)."<br>";

        $var = $var[$keyvar];
    }

    echo "</div>";
}
?>
kobrasrealm at gmail dot com 23-Jun-2011 01:28
I wrote this dandy little function for using var_dump() on HTML documents so I don't have to view the source.

<?php
function htmldump($variable, $height="9em") {
echo "<pre style=\"border: 1px solid #000; height: {$height}; overflow: auto; margin: 0.5em;\">";
var_dump($variable);
echo "</pre>\n";
}
?>

You can pass arguments like this:
<?php
$sql = mysql_query("SELECT id, name, value FROM table WHERE cond = 'value'");
$s = mysql_fetch_assoc($sql);

// Dump variable containing the result of the MySQL query
var_dump($s);
?>

The second parameter lets you specify the height of the box. Default is 9em, but if you're expecting a huge output you'll probably want a higher value.

<?php
var_dump($s, "17em");
?>

Happy var_dumping.
divinity76 at gmail dot com 23-Apr-2011 06:53
a html-encoded var_dump

<?php
function htmlvardump(){ob_start(); $var = func_get_args(); call_user_func_array('var_dump', $var); echo htmentities(ob_get_clean());}
?>

(creds: ekneuss / mOo @ irc.freenode.net/#php )
david at exposito dot mobi 07-Feb-2010 11:36
If you want to save exactly the content of an array into a variable to save ir later for example, use this:

<?php $xml = var_export($xml, true); ?>

You'll have in your same variable the content readable, instead of written down or anything else
egorinsk at gmail com 02-Feb-2009 04:08
Note that var_dump reset()'s array internal pointer!
rich dot schu at gmail dot com 09-Apr-2008 05:56
Keep in mind if you have xdebug installed it will limit the var_dump() output of array elements and object properties to 3 levels deep.

To change the default, edit your xdebug.ini file and add the folllowing line:
xdebug.var_display_max_depth=n

More information here:
http://www.xdebug.org/docs/display
highstrike at gmail dot com 08-Jan-2008 05:33
made 2 nifty functions based of what some people contributed here. Hope you find them usefull

usage ... call for the dump function. EG: dump($array, "Array dump");

<?php
////////////////////////////////////////////////////////
// Function:         dump
// Inspired from:     PHP.net Contributions
// Description: Helps with php debugging

function dump(&$var, $info = FALSE)
{
    $scope = false;
    $prefix = 'unique';
    $suffix = 'value';

    if($scope) $vals = $scope;
    else $vals = $GLOBALS;

    $old = $var;
    $var = $new = $prefix.rand().$suffix; $vname = FALSE;
    foreach($vals as $key => $val) if($val === $new) $vname = $key;
    $var = $old;

    echo "<pre style='margin: 0px 0px 10px 0px; display: block; background: white; color: black; font-family: Verdana; border: 1px solid #cccccc; padding: 5px; font-size: 10px; line-height: 13px;'>";
    if($info != FALSE) echo "<b style='color: red;'>$info:</b><br>";
    do_dump($var, '$'.$vname);
    echo "</pre>";
}

////////////////////////////////////////////////////////
// Function:         do_dump
// Inspired from:     PHP.net Contributions
// Description: Better GI than print_r or var_dump

function do_dump(&$var, $var_name = NULL, $indent = NULL, $reference = NULL)
{
    $do_dump_indent = "<span style='color:#eeeeee;'>|</span> &nbsp;&nbsp; ";
    $reference = $reference.$var_name;
    $keyvar = 'the_do_dump_recursion_protection_scheme'; $keyname = 'referenced_object_name';

    if (is_array($var) && isset($var[$keyvar]))
    {
        $real_var = &$var[$keyvar];
        $real_name = &$var[$keyname];
        $type = ucfirst(gettype($real_var));
        echo "$indent$var_name <span style='color:#a2a2a2'>$type</span> = <span style='color:#e87800;'>&amp;$real_name</span><br>";
    }
    else
    {
        $var = array($keyvar => $var, $keyname => $reference);
        $avar = &$var[$keyvar];

        $type = ucfirst(gettype($avar));
        if($type == "String") $type_color = "<span style='color:green'>";
        elseif($type == "Integer") $type_color = "<span style='color:red'>";
        elseif($type == "Double"){ $type_color = "<span style='color:#0099c5'>"; $type = "Float"; }
        elseif($type == "Boolean") $type_color = "<span style='color:#92008d'>";
        elseif($type == "NULL") $type_color = "<span style='color:black'>";

        if(is_array($avar))
        {
            $count = count($avar);
            echo "$indent" . ($var_name ? "$var_name => ":"") . "<span style='color:#a2a2a2'>$type ($count)</span><br>$indent(<br>";
            $keys = array_keys($avar);
            foreach($keys as $name)
            {
                $value = &$avar[$name];
                do_dump($value, "['$name']", $indent.$do_dump_indent, $reference);
            }
            echo "$indent)<br>";
        }
        elseif(is_object($avar))
        {
            echo "$indent$var_name <span style='color:#a2a2a2'>$type</span><br>$indent(<br>";
            foreach($avar as $name=>$value) do_dump($value, "$name", $indent.$do_dump_indent, $reference);
            echo "$indent)<br>";
        }
        elseif(is_int($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color$avar</span><br>";
        elseif(is_string($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color\"$avar\"</span><br>";
        elseif(is_float($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color$avar</span><br>";
        elseif(is_bool($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $type_color".($avar == 1 ? "TRUE":"FALSE")."</span><br>";
        elseif(is_null($avar)) echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> {$type_color}NULL</span><br>";
        else echo "$indent$var_name = <span style='color:#a2a2a2'>$type(".strlen($avar).")</span> $avar<br>";

        $var = $var[$keyvar];
    }
}
?>
vladimir at pixeltomorrow dot com 10-Sep-2007 12:45
You can also use the PEAR package available at http://pear.php.net/package/Var_Dump

which parses the variable content in a very pleasant manner, a lot more easier to "follow" than the built-in var_dump() function.

Of course there are many others, but I prefer this one, because it's simply to use.

Just add at the begining of your file:

<?php

require('Var_Dump.php'); // make sure the pear package path is set in php.ini
Var_Dump::displayInit(array('display_mode' => 'HTML4_Text'), array('mode' => 'normal','offset' => 4));
?>

then, instead of simply using var_dump($foo), use:

<?php

Var_Dump::display($foo);

?>

Read the documentation if you're looking for different output layouts.

Cheers!
Vladimir Ghetau
thriller dot ze at gmail dot com 21-Aug-2007 01:49
As Bryan said, it is possible to capture var_dump() output to a string. But it's not quite exact if the dumped variable contains HTML code.

You can use this instead:

<?php
echo '<pre>'; // This is for correct handling of newlines
ob_start();
var_dump($var);
$a=ob_get_contents();
ob_end_clean();
echo htmlspecialchars($a,ENT_QUOTES); // Escape every HTML special chars (especially > and < )
echo '</pre>';
?>
php at mikeboers dot com 28-Jun-2007 01:08
Howdy!

I am working on a pretty large project where I needed to dump a human readable form of whatever into the log files... and I thought var_export was too difficult to read. BigueNique at yahoo dot ca has a nice solution, although I needed to NOT modify whatever was being passed to dump.

So borrowing heavily from BigueNique's (just reworked his function) and someone's idea over in the object cloning page, I came up with the following function.

It makes a complete copy of whatever object you initially pass it, including all recursive definitions and outside objects references, then does the same thing as BigueNique's function. I also heavily reworked what it output, to suit my needs.

<?php

function var_log(&$varInput, $var_name='', $reference='', $method = '=', $sub = false) {

    static $output ;
    static $depth ;

    if ( $sub == false ) {
        $output = '' ;
        $depth = 0 ;
        $reference = $var_name ;
        $var = serialize( $varInput ) ;
        $var = unserialize( $var ) ;
    } else {
        ++$depth ;
        $var =& $varInput ;

    }

    // constants
    $nl = "\n" ;
    $block = 'a_big_recursion_protection_block';

    $c = $depth ;
    $indent = '' ;
    while( $c -- > 0 ) {
        $indent .= '|  ' ;
    }

    // if this has been parsed before
    if ( is_array($var) && isset($var[$block])) {

        $real =& $var[ $block ] ;
        $name =& $var[ 'name' ] ;
        $type = gettype( $real ) ;
        $output .= $indent.$var_name.' '.$method.'& '.($type=='array'?'Array':get_class($real)).' '.$name.$nl;

    // havent parsed this before
    } else {

        // insert recursion blocker
        $var = Array( $block => $var, 'name' => $reference );
        $theVar =& $var[ $block ] ;

        // print it out
        $type = gettype( $theVar ) ;
        switch( $type ) {

            case 'array' :
                $output .= $indent . $var_name . ' '.$method.' Array ('.$nl;
                $keys=array_keys($theVar);
                foreach($keys as $name) {
                    $value=&$theVar[$name];
                    var_log($value, $name, $reference.'["'.$name.'"]', '=', true);
                }
                $output .= $indent.')'.$nl;
                break ;

            case 'object' :
                $output .= $indent.$var_name.' = '.get_class($theVar).' {'.$nl;
                foreach($theVar as $name=>$value) {
                    var_log($value, $name, $reference.'->'.$name, '->', true);
                }
                $output .= $indent.'}'.$nl;
                break ;

            case 'string' :
                $output .= $indent . $var_name . ' '.$method.' "'.$theVar.'"'.$nl;
                break ;

            default :
                $output .= $indent . $var_name . ' '.$method.' ('.$type.') '.$theVar.$nl;
                break ;

        }

        // $var=$var[$block];

    }

    -- $depth ;

    if( $sub == false )
        return $output ;

}

// var_log( $var, '$name' ) ;

?>

Hope it works well for you!
jonbarnett at gmail dot com 02-Oct-2006 12:25
dumping objects that reference each other could lead to infinite recursion
<?php
$brother = new Sibling();
$sister = new Sibling();
$brother->sister = $sister;
$sister->brother = $brother;

var_dump($brother);
/* dumps all of $brother's properties, including "sister", which dumps all of $sister's properties, including "brother", etc. */
?>
edwardzyang at thewritingpot dot com 20-Mar-2005 02:06
If you're like me and uses var_dump whenever you're debugging, you might find these two "wrapper" functions helpful.

This one automatically adds the PRE tags around the var_dump output so you get nice formatted arrays.

<?php

function var_dump_pre($mixed = null) {
  echo '<pre>';
  var_dump($mixed);
  echo '</pre>';
  return null;
}

?>

This one returns the value of var_dump instead of outputting it.

<?php

function var_dump_ret($mixed = null) {
  ob_start();
  var_dump($mixed);
  $content = ob_get_contents();
  ob_end_clean();
  return $content;
}

?>

Fairly simple functions, but they're infinitely helpful (I use var_dump_pre() almost exclusively now).
anon 28-Jan-2005 06:31
var_dump(get_defined_vars());
will dump all defined variables to the browser.


Retourne le code PHP utilisé pour générer une variable

  • « var_dump
  • Services Web »
  • PHP Manual
  • Fonctions de gestion des variables
  • Retourne le code PHP utilisé pour générer une variable

var_export

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

var_export — Retourne le code PHP utilisé pour générer une variable

Description

var_export ( mixed $value , bool $return = false ) : string|null

var_export() retourne des données structurées sur la variable donnée. C'est le même principe que var_dump() mais avec une exception : le résultat retourné est du code PHP valide.

Liste de paramètres

value

La variable que vous voulez exporter.

return

Si utilisé et mis à true, var_export() retournera la représentation de la variable au lieu de l'afficher.

Valeurs de retour

Retourne la représentation de la variable lorsque le paramètre return est utilisé et évalué à true. Autrement, cette fonction retournera null.

Historique

Version | Description
7.3.0 | Exporte désormais les objets stdClass en tant qu'un tableau transtyper vers un objet ((object) array( ... )), au lieu d'utiliser la méthode non existante stdClass::__setState(). L'effet pratique est que désormais stdClass est exportable, et que le code résultant fonctionnera même sur des versions antérieure de PHP.

Exemples

Exemple #1 Exemple avec var_export()

<?php

$a = array (1, 2, array ("a", "b", "c"));
var_export($a);

?>

L'exemple ci-dessus va afficher :

array (
  0 => 1,
  1 => 2,
  2 =>
  array (
    0 => 'a',
    1 => 'b',
    2 => 'c',
  ),
)
<?php

$b = 3.1;
$v = var_export($b, true);
echo $v; // 3.1

?>

L'exemple ci-dessus va afficher :

3.1

Exemple #2 Exporter stdClass (à partir de PHP 7.3.0)

<?php
$person = new stdClass;
$person->name = 'ElePHPant ElePHPantsdotter';
$person->website = 'https://php.net/elephpant.php';

var_export($person);

L'exemple ci-dessus va afficher :

(object) array(
   'name' => 'ElePHPant ElePHPantsdotter',
   'website' => 'https://php.net/elephpant.php',
)

Exemple #3 Exporter des classes à partir de PHP 5.1.0

<?php
class A { public $var; }
$a = new A;
$a->var = 5;
var_export($a);
?>

L'exemple ci-dessus va afficher :

A::__set_state(array(
   'var' => 5,
))

Exemple #4 Utilisation de __set_state (à partir de PHP 5.1.0)

<?php
class A
{
    public $var1;
    public $var2;

    public static function __set_state($an_array)
    {
        $obj = new A;
        $obj->var1 = $an_array['var1'];
        $obj->var2 = $an_array['var2'];
        return $obj;
    }
}

$a = new A;
$a->var1 = 5;
$a->var2 = 'foo';

eval('$b = ' . var_export($a, true) . ';'); // $b = A::__set_state(array(
                                     //    'var1' => 5,
                                     //    'var2' => 'foo',
                                     // ));
var_dump($b);
?>

L'exemple ci-dessus va afficher :

object(A)#2 (2) {
    ["var1"]=>
    int(5)
    ["var2"]=>
    string(3) "foo"
}

Notes

Note:

Les variables de type ressource ne peuvent être exportées par cette fonction.

Note:

var_export() ne gère pas les références circulaires car il serait impossible de générer un code PHP analysable pour ce type de données. Si vous voulez faire quelque chose avec la représentation complète d'un tableau ou d'un objet, utilisez la fonction serialize().

Avertissement

Lorsque la fonction var_export() exporte des objets, l'anti-slash initial n'est pas inclus dans l'espace de nom de la classe et ce, pour un maximum de compatibilité.

Note:

Pour être capable d'évaluer le PHP généré par var_export(), tous les objets analysés doivent implémenter la méthode magique __set_state. La seule exception est stdClass; qui est exportée en utilisant un cast d'un tableau à un objet.

Voir aussi

  • print_r() - Affiche des informations lisibles pour une variable
  • serialize() - Génère une représentation stockable d'une valeur
  • var_dump() - Affiche les informations d'une variable

User Contributed Notes

steven at nevvix dot com 13-Sep-2019 03:52
I improved my previous varexport().

<?php
/**
 * PHP var_export() with short array syntax (square brackets) indented 2 spaces.
 *
 * NOTE: The only issue is when a string value has `=>\n[`, it will get converted to `=> [`
 * @link https://www.php.net/manual/en/function.var-export.php
 */
function varexport($expression, $return=FALSE) {
    $export = var_export($expression, TRUE);
    $patterns = [
        "/array \(/" => '[',
        "/^([ ]*)\)(,?)$/m" => '$1]$2',
        "/=>[ ]?\n[ ]+\[/" => '=> [',
        "/([ ]*)(\'[^\']+\') => ([\[\'])/" => '$1$2 => $3',
    ];
    $export = preg_replace(array_keys($patterns), array_values($patterns), $export);
    if ((bool)$return) return $export; else echo $export;
}

$array = [
    'str' => 'Test
       spaces',
       0 => 33,
       1 => TRUE,
       [3,4,'d',[]],
    'arr' => [
        'text with spaces' => '[Tes\'t"s":
 => [
 =>
  [
   {
      spaces',
    ],
    "str2" => "Test's'
 } spaces",
    'arr2' => [
        'text with spaces' => [
            'arr3' => [
                'text with spaces' => 'Te": "st \' => [
      spaces',
            ],
        ],
    ],
];
varexport($array);
// Result:
```
[
  'str' => 'Test
       spaces',
  0 => 33,
  1 => true,
  2 => [
    0 => 3,
    1 => 4,
    2 => 'd',
    3 => [
    ],
  ],
  'arr' => [
    'text with spaces' => '[Tes\'t"s":
 => [
 => [
   {
      spaces',
  ],
  'str2' => 'Test\'s\'
 } spaces',
  'arr2' => [
    'text with spaces' => [
      'arr3' => [
        'text with spaces' => 'Te": "st \' => [
      spaces',
      ],
    ],
  ],
]
```
NOTE: The only issue is when a string value has `=>\n[`, it will get converted to `=> [`
beverasrilakshmi at gmail dot com 01-May-2019 08:24
Just for fun, trying to understand the definition of "returns parsable string"....any type of variable passed to var_export, the return value will be a typecasted as string...

<?php

$var = 1;
var_dump($var); //type is int as expected
echo "<br>";
$var_after_export = var_export($var,true); //returning $var will now makes it a string
var_dump($var_after_export);

?>
steven at nevvix dot com 18-Jun-2018 06:24
/**
 * var_export() with square brackets and indented 4 spaces.
 */
<?php
function varexport($expression, $return=FALSE) {
    $export = var_export($expression, TRUE);
    $export = preg_replace("/^([ ]*)(.*)/m", '$1$1$2', $export);
    $array = preg_split("/\r\n|\n|\r/", $export);
    $array = preg_replace(["/\s*array\s\($/", "/\)(,)?$/", "/\s=>\s$/"], [NULL, ']$1', ' => ['], $array);
    $export = join(PHP_EOL, array_filter(["["] + $array));
    if ((bool)$return) return $export; else echo $export;
}
Mark P 29-Jan-2016 09:09
It doesn't appear to be documented, but the behaviour of `var_export()` changed in PHP 7.

Previously, `var_export(3.)` returned "3", now it returns "3.0".
cpmcgrat()uci ! edu 27-Jul-2015 10:45
When trying to use __set_state() to rebuild a huge, tricky class use the following:

class Foo
{
    public $a;
    public $b;
    public $c;
    public $d;
    public $e;
    public $f;
    public $g;
    public $h;
    public $i;

    public function __set_state($array)
    {
        $obj = new ArrayConfig;
        foreach($array as $k => $v) {
            eval('$obj->'.$k.' = '.$v.';');
        }
        return $obj;
    }
}

This will return a reconstructed version of the class without having to manually type each individual object in the class manually (as shown in the __set_state() example)
dan at coders dot co dot nz 10-Jan-2014 02:11
I found that my complex type was exporting with
  stdClass::__set_state()
in places. Not only was that strange and messy, it cannot be eval()-ed back in at all. Fatal error. Doh!

However a quick string-replace tidy-up of the result rendered it valid again.

    $macro = var_export($data, TRUE);
    $macro = str_replace("stdClass::__set_state", "(object)", $macro);
    $macro = '$data = ' . $macro . ';';

And now the string I output *can* be evaluated back in again.
wyattstorch42 at outlook dot com 22-Dec-2013 10:11
If you call var_export() on an instance of stdClass, it attempts to export it using ::__set_state(), which, for some reason, is not implemented in stdClass.

However, casting an associative array to an object usually produces the same effect (at least, it does in my case). So I wrote an improved_var_export() function to convert instances of stdClass to (object) array () calls. If you choose to export objects of any other class, I'd advise you to implement ::__set_state().

<?php
/**
 * An implementation of var_export() that is compatible with instances
 * of stdClass.
 * @param mixed $variable The variable you want to export
 * @param bool $return If used and set to true, improved_var_export()
 *     will return the variable representation instead of outputting it.
 * @return mixed|null Returns the variable representation when the
 *     return parameter is used and evaluates to TRUE. Otherwise, this
 *     function will return NULL.
 */
function improved_var_export ($variable, $return = false) {
    if ($variable instanceof stdClass) {
        $result = '(object) '.improved_var_export(get_object_vars($variable), true);
    } else if (is_array($variable)) {
        $array = array ();
        foreach ($variable as $key => $value) {
            $array[] = var_export($key, true).' => '.improved_var_export($value, true);
        }
        $result = 'array ('.implode(', ', $array).')';
    } else {
        $result = var_export($variable, true);
    }

    if (!$return) {
        print $result;
        return null;
    } else {
        return $result;
    }
}

// Example usage:
$obj = new stdClass;
$obj->test = 'abc';
$obj->other = 6.2;
$obj->arr = array (1, 2, 3);

improved_var_export((object) array (
    'prop1' => true,
    'prop2' => $obj,
    'assocArray' => array (
        'apple' => 'good',
        'orange' => 'great'
    )
));

/* Output:
(object) array ('prop1' => true, 'prop2' => (object) array ('test' => 'abc', 'other' => 6.2, 'arr' => array (0 => 1, 1 => 2, 2 => 3)), 'assocArray' => array ('apple' => 'good', 'orange' => 'great'))
*/
?>

Note: This function spits out a single line of code, which is useful to save in a cache file to include/eval. It isn't formatted for readability. If you want to print a readable version for debugging purposes, then I would suggest print_r() or var_dump().
chudinov at yahoo dot com 29-Nov-2013 09:55
Looks like since version 5.4.22 var_export uses the serialize_precision ini setting, rather than the precision one used for normal output of floating-point numbers.
As a consequence since version 5.4.22 for example var_export(1.1) will output 1.1000000000000001 (17 is default precision value) and not 1.1 as before.

<?php
//ouput 1.1000000000000001
var_export(1.1)
 ?>
NitPicker 10-Jul-2013 04:33
When it comes to HTML output (as discussed below), it's all fun and games until someone pokes their eye out with a "<".

Surround it with "<pre>", but do remember to wrap it in htmlspecialchars() as well.
sergei dot solomonov at gmail dot com 04-Oct-2012 04:00
<?php
$closure = function(){};

var_export($closure);

// output: Closure::__set_state(array())
?>
kexianbin at diyism dot com 16-Sep-2012 02:33
to use my_var_export(), it is as beautiful as var_export() and as could deal with recursive reference as print_r():

<?php
function my_var_export($var, $is_str=false)
         {$rtn=preg_replace(array('/Array\s+\(/', '/\[(\d+)\] => (.*)\n/', '/\[([^\d].*)\] => (.*)\n/'), array('array (', '\1 => \'\2\''."\n", '\'\1\' => \'\2\''."\n"), substr(print_r($var, true), 0, -1));
          $rtn=strtr($rtn, array("=> 'array ('"=>'=> array ('));
          $rtn=strtr($rtn, array(")\n\n"=>")\n"));
          $rtn=strtr($rtn, array("'\n"=>"',\n", ")\n"=>"),\n"));
          $rtn=preg_replace(array('/\n +/e'), array('strtr(\'\0\', array(\'    \'=>\'  \'))'), $rtn);
          $rtn=strtr($rtn, array(" Object',"=>" Object'<-"));
          if ($is_str)
             {return $rtn;
             }
          else
              {echo $rtn;
              }
         }

?>
jodybrabec at gmail dot com 28-Mar-2012 05:52
WORKAROUND for error "Nesting level too deep - recursive dependency":
ob_start();
var_dump($GLOBALS);
$dataDump = ob_get_clean();
echo $dataDump;
Anonymous 11-Nov-2011 09:13
There is an even simpler way to have clean output from var_export and print_r in html pages:

<?php
function pretty_var($myArray)
{
    echo "<pre>";
    var_export($myArray);
    echo "</pre>";
}
?>
laszlo dot heredy at gmail dot com 06-Oct-2010 01:57
Try this function instead of var_export($GLOBALS) or var_dump($GLOBALS) when all you want to know is the values of the variables you set on the current page.

<?php
function globalvars(){
    $result=array();
    $skip=array('GLOBALS','_ENV','HTTP_ENV_VARS',
                        '_POST','HTTP_POST_VARS','_GET',
                        'HTTP_GET_VARS',
                        '_COOKIE',
                        'HTTP_COOKIE_VARS','_SERVER',
                        'HTTP_SERVER_VARS',
                        '_FILES','HTTP_POST_FILES',
                        '_REQUEST','HTTP_SESSION_VARS',
                        '_SESSION');
    foreach($GLOBALS as $k=>$v)
        if(!in_array($k,$skip))
            $result[$k]=$v;
    return $result;
}//functionglobalvars

var_export(globalvars());
?>
4n4jmza02 at sneakemail dot com 17-Jun-2010 04:50
I learned the hard way that if var_export encounters a resource handle it exports it as "NULL", even if it is a valid handle. The documentation states that a handle cannot be exported, but it does not describe what happens if you try to do so anyway.

I had been using var_export in some debugging code while tracing a problem with a resource handle not being generated and ended up thinking that null handles were still being generated long after the problem had been fixed.
john dot risken at gmail dot com 16-Jan-2010 03:53
I didn't see this simple little item anywhere in the user notes. Maybe I'm blind!

Anyway, var_export and print_r both use spaces and carriage returns for formatting.  Sent to an html page, most of the formatting is lost. This simple function prints a nicely formatted array to an html screen:

<?php
function pretty_var($myArray){
    print str_replace(array("\n"," "),array("<br>","&nbsp;"), var_export($myArray,true))."<br>";
}
?>
rarioj at gmail dot com 28-Oct-2009 10:43
NOTE: If an object Foo has __set_state() method, but if that object contains another object Bar with no __set_state() method implemented, the resulting PHP expression will not be eval()-able.

This is an example (object Test that contains an instance of Exception).

<?php

class Test
{
  public $one;
  public $two;
  public function __construct($one, $two)
  {
    $this->one = $one;
    $this->two = $two;
  }
  public static function __set_state(array $array)
  {
    return new self($array['one'], $array['two']);
  }
}

$test = new Test('one', new Exception('test'));

$string = var_export($test, true);

/* $string =
Test::__set_state(array(
   'one' => 'one',
   'two' =>
  Exception::__set_state(array(
     'message' => 'test',
     'string' => '',
     'code' => 0,
     'file' => 'E:\\xampp\\htdocs\\test.Q.php',
     'line' => 35,
     'trace' =>
    array (
    ),
     'previous' => NULL,
  )),
))
*/

eval('$test2 = '.$string.';'); // Fatal error: Call to undefined method Exception::__set_state

?>

So avoid using var_export() on a complex array/object that contains other objects. Instead, use serialize() and unserialize() functions.

<?php

$string = 'unserialize('.var_export(serialize($test), true).')';

eval('$test2 = '.$string.';');

var_dump($test == $test2); // bool(true)

?>
ravenswd at gmail dot com 07-Jul-2009 10:32
(This replaces my note of 3-July-2009. The original version produced no output if a variable contained an empty array, or an array consisting only of empty arrays. For example, $bigarray['x'] = array(); Also, I have added a second version of the function.)

The output can be difficult to decipher when looking at an array with many levels and many elements on each level. For example:

<?php
print ('$bigarray = ' . var_export($bigarray, true) . "\n");
?>

will return:

$bigarray = array(
... (500 lines skipped) ...
          'mod' => 'charlie',

Whereas the routine below can be called with:

<?php
recursive_print ('$bigarray', $bigarray);
?>

and it will return:

$bigarray = array()
... (500 lines skipped) ...
$bigarray['foo']['bar']['0']['somethingelse']['mod'] = 'charlie'

Here's the function:

<?php
function recursive_print ($varname, $varval) {
  if (! is_array($varval)):
    print $varname . ' = ' . $varval . "<br>\n";
  else:
    print $varname . " = array()<br>\n";
    foreach ($varval as $key => $val):
      recursive_print ($varname . "['" . $key . "']", $val);
    endforeach;
  endif;
}
?>

For those who want a version that produces valid PHP code, use this version:

<?php
function recursive_print ($varname, $varval) {
  if (! is_array($varval)):
    print $varname . ' = ' . var_export($varval, true) . ";<br>\n";
  else:
    print $varname . " = array();<br>\n";
    foreach ($varval as $key => $val):
      recursive_print ($varname . "[" . var_export($key, true) . "]", $val);
    endforeach;
  endif;
}
?>

If your output is to a text file and not an HTML page, remove the <br>s.
ravenswd at gmail dot com 03-Jul-2009 05:21
The output can be difficult to decipher when looking at an array with many levels and many elements on each level. For example:

<?php
print ('$bigarray = ' . var_export($bigarray, true) . "\n");
?>

will return:

$bigarray = array(
... (500 lines skipped) ...
          'mod' => 'charlie',

Whereas the routine below can be called with:

<?php
recursive_print ('$bigarray', $bigarray);
?>

and it will return:

$bigarray['firstelement'] = 'something'
... (500 lines skipped) ...
$bigarray['foo']['bar']['0']['somethingelse']['mod'] = 'charlie'

Here's the function:

<?php
function recursive_print ($varname, $varval) {
  if (! is_array($varval)):
    print $varname . ' = ' . $varval . "<br>\n";
  else:
    foreach ($varval as $key => $val):
      recursive_print ($varname . "['" . $key . "']", $val);
    endforeach;
  endif;
}
?>
cmusicfan (at) gmail (daught) com 11-Jun-2009 09:19
Caution! var_export will add a backslash to single quotes (').

You may want to use stripslashes() to remove the mysteriously added backslashes.
stangelanda at arrowquick dot com 29-Jun-2007 04:20
I have been looking for the best method to store data in cache files.

First, I've identified two limitations of var_export verus serialize.  It can't store internal references inside of an array and it can't store a nested object or an array containing objects before PHP 5.1.0.

However, I could deal with both of those so I created a benchmark.  I used a single array containing from 10 to 150 indexes.  I've generate the elements' values randomly using booleans, nulls, integers, floats, and some nested arrays (the nested arrays are smaller averaging 5 elements but created similarly).  The largest percentage of elements are short strings around 10-15 characters.  While there is a small number of long strings (around 500 characters).

Benchmarking returned these results for 1000 * [total time] / [iterations (4000 in this case)]

serialize 3.656, 3.575, 3.68, 3.933, mean of 3.71
include 7.099, 5.42, 5.185, 6.076, mean of 5.95
eval 5.514, 5.204, 5.011, 5.788, mean of 5.38

Meaning serialize is around 1 and a half times faster than var_export for a single large array.  include and eval were consistently very close but eval was usually a few tenths faster (eval did better this particular set of trials than usual). An opcode cache like APC might make include faster, but otherwise serialize is the best choice.
Glen 23-May-2007 05:47
Like previously reported, i find var_export() frustrating when dealing with recursive structures.  Doing a :

<?php
var_export($GLOBALS);
?>

fails.  Interestingly, var_dump() has some logic to avoid recursive references.  So :

<?php
var_dump($GLOBALS);
?>

works (while being more ugly).  Unlike var_export(), var_dump() has no option to return the string, so output buffering logic is required if you want to direct the output.
Zorro 04-Sep-2005 11:24
This function can't export EVERYTHING. Moreover, you can have an error on an simple recursive array:

$test = array();
$test["oops"] = & $test;

echo var_export($test);

=>

Fatal error:  Nesting level too deep - recursive dependency? in ??.php on line 59
linus at flowingcreativity dot net 04-Jul-2005 09:50
<roman at DIESPAM dot feather dot org dot ru>, your function has inefficiencies and problems. I probably speak for everyone when I ask you to test code before you add to the manual.

Since the issue of whitespace only comes up when exporting arrays, you can use the original var_export() for all other variable types. This function does the job, and, from the outside, works the same as var_export().

<?php

function var_export_min($var, $return = false) {
    if (is_array($var)) {
        $toImplode = array();
        foreach ($var as $key => $value) {
            $toImplode[] = var_export($key, true).'=>'.var_export_min($value, true);
        }
        $code = 'array('.implode(',', $toImplode).')';
        if ($return) return $code;
        else echo $code;
    } else {
        return var_export($var, $return);
    }
}

?>
paul at worldwithoutwalls dot co dot uk 24-Nov-2004 11:22
var_export() differs from print_r() for variables that are resources, with print_r() being more useful if you are using the function for debugging purposes.
e.g.
<?php
$res = mysql_connect($dbhost, $dbuser, $dbpass);
print_r($res); //output: Resource id #14
var_export($res); //output: NULL
?>
php_manual_note at bigredspark dot com 16-Oct-2003 12:43
[john holmes]
True, but that method would require you to open and read the file into a variable and then unserialize it into another variable.

Using a file created with var_export() could simply be include()'d, which will be less code and faster.

[kaja]
If you are trying to find a way to temporarily save variables into some other file, check out serialize() and unserialize() instead - this one is more useful for its readable property, very handy while debugging.

[original post]
If you're like me, you're wondering why a function that outputs "correct PHP syntax" is useful. This function can be useful in implementing a cache system. You can var_export() the array into a variable and write it into a file. Writing a string such as

<?php
$string = '<?php $array = ' . $data . '; ?>';
?>

where $data is the output of var_export() can create a file that can be easily include()d back into the script to recreate $array.

The raw output of var_export() could also be eval()d to recreate the array.

---John Holmes...


Services Web

  • OAuth
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Exemples
    • Fonctions OAuth
    • OAuth — La classe OAuth
    • OAuthProvider — La classe OAuthProvider
    • OAuthException — La classe OAuthException
  • SOAP
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Fonctions SOAP
    • SoapClient — La classe SoapClient
    • SoapServer — La classe SoapServer
    • SoapFault — La classe SoapFault
    • SoapHeader — La classe SoapHeader
    • SoapParam — La classe SoapParam
    • SoapVar — La classe SoapVar
  • Yar — Yet Another RPC Framework
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Exemples
    • Yar_Server — La classe Yar_Server
    • Yar_Client — La classe Yar_Client
    • Yar_Concurrent_Client — La classe Yar_Concurrent_Client
    • Yar_Server_Exception — La classe Yar_Server_Exception
    • Yar_Client_Exception — La classe Yar_Client_Exception
  • XML-RPC
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Fonctions XML-RPC

User Contributed Notes

There are no user contributed notes for this page.


OAuth

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Exemples
    • FireEagle
  • Fonctions OAuth
    • oauth_get_sbs — Génère une chaîne de base de signature
    • oauth_urlencode — Encode une URI conformément à RFC 3986
  • OAuth — La classe OAuth
    • OAuth::__construct — Crée un nouvel objet OAuth
    • OAuth::__destruct — Le destructeur
    • OAuth::disableDebug — Désactive les messages de déboguage
    • OAuth::disableRedirects — Désactive les redirections
    • OAuth::disableSSLChecks — Désactive la vérification SSL
    • OAuth::enableDebug — Active les messages de débogage
    • OAuth::enableRedirects — Active les redirections
    • OAuth::enableSSLChecks — Active la vérification SSL
    • OAuth::fetch — Lit une ressource protégée par OAuth
    • OAuth::generateSignature — Génère une signature
    • OAuth::getAccessToken — Récupère un token d'accès
    • OAuth::getCAPath — Récupère l'information CA
    • OAuth::getLastResponse — Lit la dernière réponse
    • OAuth::getLastResponseHeaders — Récupère les en-têtes de la dernière réponse
    • OAuth::getLastResponseInfo — Lit les informations HTTP de la dernière réponse
    • OAuth::getRequestHeader — Génère une signature d'en-tête OAuth
    • OAuth::getRequestToken — Lit le token de requête
    • OAuth::setAuthType — Définit le type d'autorisation
    • OAuth::setCAPath — Définit le chemin et les informations du CA
    • OAuth::setNonce — Configure le nonce OAuth
    • OAuth::setRequestEngine — Le but de setRequestEngine
    • OAuth::setRSACertificate — Définit le certificat RSA
    • OAuth::setSSLChecks — Définit des vérifications spécifiques à SSL pour les requêtes
    • OAuth::setTimestamp — Définit le timestamp
    • OAuth::setToken — Configure le token et le secret
    • OAuth::setVersion — Configure la version OAuth
  • OAuthProvider — La classe OAuthProvider
    • OAuthProvider::addRequiredParameter — Ajoute des paramètres requis
    • OAuthProvider::callconsumerHandler — Appelle la fonction de rappel consumerNonceHandler
    • OAuthProvider::callTimestampNonceHandler — Appelle la fonction de rappel timestampNonceHandler
    • OAuthProvider::calltokenHandler — Appelle la fonction de rappel tokenNonceHandler
    • OAuthProvider::checkOAuthRequest — Vérifie une requête OAuth
    • OAuthProvider::__construct — Construit un nouvel objet OAuthProvider
    • OAuthProvider::consumerHandler — Définit la fonction de rappel consumerHandler
    • OAuthProvider::generateToken — Génère un jeton aléatoire
    • OAuthProvider::is2LeggedEndpoint — is2LeggedEndpoint
    • OAuthProvider::isRequestTokenEndpoint — Définit isRequestTokenEndpoint
    • OAuthProvider::removeRequiredParameter — Supprime un paramètre
    • OAuthProvider::reportProblem — Rapporte un problème
    • OAuthProvider::setParam — Définit un paramètre
    • OAuthProvider::setRequestTokenPath — Définit le chemin du jeton demandé
    • OAuthProvider::timestampNonceHandler — Définit le gestionnaire de rappel timestampNonceHandler
    • OAuthProvider::tokenHandler — Définit le gestionnaire de rappel tokenHandler
  • OAuthException — La classe OAuthException

User Contributed Notes

There are no user contributed notes for this page.


Introduction

Cette extension fournit un client et un prestataire de service OAuth 1.0a. OAuth est un protocole d'autorisation qui est construit sur HTTP, et qui permet aux applications de sécuriser l'accès aux données sans avoir à stocker de noms d'utilisateurs et de mots de passe.

User Contributed Notes

ramdan 04-Oct-2019 12:20
OAuth 1 is not secure anymore! Please do not use it! Version 1.0a tries to fix the problem.

Most platforms are using OAuth 2 instead. Both versions are incompatible. If you try to use version 1, you will get frustrated.


Pré-requis

PECL/oauth requiert PHP 5.1 ou plus récent, les extensions ext/hash et ext/pcre.

PECL/oauth peut aussi nécessiter la bibliothèque libcurl si elle a été sélectionnée au moment de la compilation. Si c'est le cas, PECL/oauth doit aussi être compilé avec le support HTTPS.

User Contributed Notes

There are no user contributed notes for this page.


Installation

Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » https://pear.php.net/package/oauth

User Contributed Notes

There are no user contributed notes for this page.


Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

La plupart de ces constantes impliquent des problèmes décrits dans la documentation officiels de » rapport de problèmes d'OAuth. Notez cependant que les noms des constantes sont spécifiques à PHP, malgré le fait que le schéma de nommage est similaire.

OAUTH_SIG_METHOD_RSASHA1 (chaîne de caractères)
Méthode de signature OAuth RSA-SHA1.
OAUTH_SIG_METHOD_HMACSHA1 (chaîne de caractères)

Méthode de signature OAuth HMAC-SHA1.

OAUTH_SIG_METHOD_HMACSHA256 (chaîne de caractères)
Méthode de signature OAuth HMAC-SHA256.
OAUTH_AUTH_TYPE_AUTHORIZATION (chaîne de caractères)

Cette constante représente l'entête Authorization.

OAUTH_AUTH_TYPE_NONE (chaîne de caractères)

Cette constante indique une requête NoAuth OAuth.

OAUTH_AUTH_TYPE_URI (chaîne de caractères)

Cette constante représente les paramètres OAuth dans l'URI de requête.

OAUTH_AUTH_TYPE_FORM (chaîne de caractères)

Cette constante représente les paramètres OAuth comme une partie du corps HTTP POST.

OAUTH_HTTP_METHOD_GET (chaîne de caractères)

Utilise la méthode GET pour la requête OAuth.

OAUTH_HTTP_METHOD_POST (chaîne de caractères)

Utilise la méthode POST pour la requête OAuth.

OAUTH_HTTP_METHOD_PUT (chaîne de caractères)

Utilise la méthode PUT pour la requête OAuth.

OAUTH_HTTP_METHOD_HEAD (chaîne de caractères)

Utilise la méthode HEAD pour la requête OAuth.

OAUTH_HTTP_METHOD_DELETE (chaîne de caractères)
Utilise la méthode DELETE pour la requête OAuth.
OAUTH_REQENGINE_STREAMS (entier)
Utilisé par la méthode Oauth::setRequestEngine() pour définir le moteur de flux PHP, à l'opposé de OAUTH_REQENGINE_CURL pour Curl.
OAUTH_REQENGINE_CURL (entier)
Utilisé par la méthode Oauth::setReqeustEngine() pour définir le moteur de Curl, à l'opposé de OAUTH_REQENGINE_STREAMS pour les flux PHP.
OAUTH_OK (entier)
La vie est belle.
OAUTH_BAD_NONCE (entier)
La valeur oauth_nonce a été utilisée pour une précédente requête, et ne peut être utilisée maintenant.
OAUTH_BAD_TIMESTAMP (entier)
La valeur oauth_timestamp n'est pas acceptée par le prestataire de service. Dans ce cas, la réponse devra aussi contenir le paramètre oauth_acceptable_timestamps.
OAUTH_CONSUMER_KEY_UNKNOWN (entier)
oauth_consumer_key est temporairement innaceptable par le prestataire de service. Par exemple, le prestataire de service surcharge le consommateur.
OAUTH_CONSUMER_KEY_REFUSED (entier)
La clé du consommateur a été refusée.
OAUTH_INVALID_SIGNATURE (entier)
oauth_signature est invalide car elle ne correspond pas à la signature calculée par le prestataire de service.
OAUTH_TOKEN_USED (entier)
oauth_token a été consommé. Elle ne peut plus être utilisée car elle a déjà été utilisée dans une ou plusieurs précédentes requêtes.
OAUTH_TOKEN_EXPIRED (entier)
oauth_token a expiré.
OAUTH_TOKEN_REVOKED (entier)
oauth_token a été révoquée et ne pourra plus être acceptée.
OAUTH_TOKEN_REJECTED (entier)
oauth_token n'a pas été acceptée par le prestataire de service. La raison est inconnue, mais il se peut que le jeton n'a jamais été utilisé, a déjà été consommé, a expiré et/ou a été oublié par le prestataire de service.
OAUTH_VERIFIER_INVALID (entier)
oauth_verifier est incorrect.
OAUTH_PARAMETER_ABSENT (entier)
Un paramètre requis n'a pas été reçu. Dans ce cas, la réponse devra également contenir le paramètre oauth_parameters_absent.
OAUTH_SIGNATURE_METHOD_REJECTED (entier)
oauth_signature_method n'a pas été accepté par le prestataire de service.

User Contributed Notes

There are no user contributed notes for this page.


Exemples

Sommaire

  • FireEagle

User Contributed Notes

There are no user contributed notes for this page.


FireEagle

<?php
$req_url = 'https://fireeagle.yahooapis.com/oauth/request_token';
$authurl = 'https://fireeagle.yahoo.net/oauth/authorize';
$acc_url = 'https://fireeagle.yahooapis.com/oauth/access_token';
$api_url = 'https://fireeagle.yahooapis.com/api/0.1';
$conskey = 'your_consumer_key';
$conssec = 'your_consumer_secret';

session_start();

// En état state=1 la prochaine requete doit inclure le oauth_token.
// Si ce n'est pas le cas, retour à 0
if(!isset($_GET['oauth_token']) && $_SESSION['state']==1) $_SESSION['state'] = 0;
try {
  $oauth = new OAuth($conskey,$conssec,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
  $oauth->enableDebug();
  if(!isset($_GET['oauth_token']) && !$_SESSION['state']) {
    $request_token_info = $oauth->getRequestToken($req_url);
    $_SESSION['secret'] = $request_token_info['oauth_token_secret'];
    $_SESSION['state'] = 1;
    header('Location: '.$authurl.'?oauth_token='.$request_token_info['oauth_token']);
    exit;
  } else if($_SESSION['state']==1) {
    $oauth->setToken($_GET['oauth_token'],$_SESSION['secret']);
    $access_token_info = $oauth->getAccessToken($acc_url);
    $_SESSION['state'] = 2;
    $_SESSION['token'] = $access_token_info['oauth_token'];
    $_SESSION['secret'] = $access_token_info['oauth_token_secret'];
  }
  $oauth->setToken($_SESSION['token'],$_SESSION['secret']);
  $oauth->fetch("$api_url/user.json");
  $json = json_decode($oauth->getLastResponse());
  print_r($json);
} catch(OAuthException $E) {
  print_r($E);
}
?>

User Contributed Notes

iquark10 at gmail dot com 01-Aug-2019 08:35
Fire Eagle has closed as of February 2013
pierre dot mihawk at gmail dot com 25-Jun-2014 07:09
In the case you're asking an API which gives you a reusable application key, you'll have to use the "verifier" in the getAccessToken() method, but also the "callback" parameter in the getRequestToken().

<?php
     $request_token_info = $oauth->getRequestToken($req_url, "<YOU_CALLBACK_URI>");
?>

In my case, once I accepted the form in the Authorize URI, I was redirected to this callback URI with a "oauth_verifier" GET parameter. I injected it into the access token request :

<?php
    $access_token_info = $oauth->getAccessToken($acc_url, '', $_GET['oauth_verifier']);
?>

I finally obtained an access token that I hardcoded ; it doesn't need any refresh.
brianmoreau at uk2 dot net 09-Mar-2013 12:26
I have just managed to modify this script to work with the Twitter API...

The changes are...

$req_url = 'https://api.twitter.com/oauth/request_token';
$authurl = 'https://api.twitter.com/oauth/authorize';
$acc_url = 'https://api.twitter.com/oauth/access_token';
$api_url = 'https://api.twitter.com/1.1/account';
$conskey = 'YOURAPPconskey';
$conssec = 'YOURAPPconssec';

And change
#$oauth->fetch("$api_url/user.json");
# verify_credentials
# TO
$oauth->fetch("$api_url/verify_credentials.json");


Fonctions OAuth

Sommaire

  • oauth_get_sbs — Génère une chaîne de base de signature
  • oauth_urlencode — Encode une URI conformément à RFC 3986

User Contributed Notes

There are no user contributed notes for this page.


Génère une chaîne de base de signature

  • « Fonctions OAuth
  • oauth_urlencode »
  • PHP Manual
  • Fonctions OAuth
  • Génère une chaîne de base de signature

oauth_get_sbs

(PECL OAuth >=0.99.7)

oauth_get_sbs — Génère une chaîne de base de signature

Description

oauth_get_sbs ( string $http_method , string $uri , array $request_parameters = ? ) : string

Génère une chaîne de base de signature pour pecl/oauth.

Liste de paramètres

http_method

La méthode HTTP.

uri

L'URI à encoder.

request_parameters

Tableau de paramètres de requêtes.

Valeurs de retour

Retourne une chaîne, la Signature Base String.

User Contributed Notes

There are no user contributed notes for this page.


Encode une URI conformément à RFC 3986

  • « oauth_get_sbs
  • OAuth »
  • PHP Manual
  • Fonctions OAuth
  • Encode une URI conformément à RFC 3986

oauth_urlencode

(PECL OAuth >=0.99.2)

oauth_urlencode — Encode une URI conformément à RFC 3986

Description

oauth_urlencode ( string $uri ) : string

Encodes une URI conformément à » RFC 3986.

Liste de paramètres

uri

l'URI à encoder.

Valeurs de retour

Retourne une chaîne encodée conformément à » RFC 3986.

User Contributed Notes

bohwaz 30-Mar-2010 07:20
Note that php5.3 rawurlencode will do exactly the same thing.

For PHP 5.2, easy replacement to this function :

<?php

function rfc3986_encode($str)
{
  $str = rawurlencode($str);
  $str = str_replace('%E7', '~', $str);
  return $str;
}

?>


La classe OAuth

(PECL OAuth >= 0.99.1)

Introduction

L'extension OAuth fournit une interface simple pour interagir avec des fournisseur de données, en utilisant les spécifications OAuth HTTP pour protéger les ressources.

Synopsis de la classe

OAuth {
/* Propriétés */
public $debug ;
public $sslChecks ;
public $debugInfo ;
/* Méthodes */
public __construct ( string $consumer_key , string $consumer_secret , string $signature_method = OAUTH_SIG_METHOD_HMACSHA1 , int $auth_type = 0 )
public __destruct ( ) : void
public disableDebug ( ) : bool
public disableRedirects ( ) : bool
public disableSSLChecks ( ) : bool
public enableDebug ( ) : bool
public enableRedirects ( ) : bool
public enableSSLChecks ( ) : bool
public fetch ( string $protected_resource_url , array $extra_parameters = ? , string $http_method = ? , array $http_headers = ? ) : mixed
public generateSignature ( string $http_method , string $url , mixed $extra_parameters = ? ) : string|false
public getAccessToken ( string $access_token_url , string $auth_session_handle = ? , string $verifier_token = ? , string $http_method = ? ) : array
public getCAPath ( ) : array
public getLastResponse ( ) : string
public getLastResponseHeaders ( ) : string|false
public getLastResponseInfo ( ) : array
public getRequestHeader ( string $http_method , string $url , mixed $extra_parameters = ? ) : string|false
public getRequestToken ( string $request_token_url , string $callback_url = ? , string $http_method = ? ) : array
public setAuthType ( int $auth_type ) : bool
public setCAPath ( string $ca_path = ? , string $ca_info = ? ) : mixed
public setNonce ( string $nonce ) : mixed
public setRequestEngine ( int $reqengine ) : void
public setRSACertificate ( string $cert ) : mixed
public setSSLChecks ( int $sslcheck ) : bool
public setTimestamp ( string $timestamp ) : mixed
public setToken ( string $token , string $token_secret ) : bool
public setVersion ( string $version ) : bool
}

Propriétés

debug

sslChecks

debugInfo

Sommaire

  • OAuth::__construct — Crée un nouvel objet OAuth
  • OAuth::__destruct — Le destructeur
  • OAuth::disableDebug — Désactive les messages de déboguage
  • OAuth::disableRedirects — Désactive les redirections
  • OAuth::disableSSLChecks — Désactive la vérification SSL
  • OAuth::enableDebug — Active les messages de débogage
  • OAuth::enableRedirects — Active les redirections
  • OAuth::enableSSLChecks — Active la vérification SSL
  • OAuth::fetch — Lit une ressource protégée par OAuth
  • OAuth::generateSignature — Génère une signature
  • OAuth::getAccessToken — Récupère un token d'accès
  • OAuth::getCAPath — Récupère l'information CA
  • OAuth::getLastResponse — Lit la dernière réponse
  • OAuth::getLastResponseHeaders — Récupère les en-têtes de la dernière réponse
  • OAuth::getLastResponseInfo — Lit les informations HTTP de la dernière réponse
  • OAuth::getRequestHeader — Génère une signature d'en-tête OAuth
  • OAuth::getRequestToken — Lit le token de requête
  • OAuth::setAuthType — Définit le type d'autorisation
  • OAuth::setCAPath — Définit le chemin et les informations du CA
  • OAuth::setNonce — Configure le nonce OAuth
  • OAuth::setRequestEngine — Le but de setRequestEngine
  • OAuth::setRSACertificate — Définit le certificat RSA
  • OAuth::setSSLChecks — Définit des vérifications spécifiques à SSL pour les requêtes
  • OAuth::setTimestamp — Définit le timestamp
  • OAuth::setToken — Configure le token et le secret
  • OAuth::setVersion — Configure la version OAuth

User Contributed Notes

There are no user contributed notes for this page.


Crée un nouvel objet OAuth

  • « OAuth
  • OAuth::__destruct »
  • PHP Manual
  • OAuth
  • Crée un nouvel objet OAuth

OAuth::__construct

(PECL OAuth >= 0.99.1)

OAuth::__construct — Crée un nouvel objet OAuth

Description

public OAuth::__construct ( string $consumer_key , string $consumer_secret , string $signature_method = OAUTH_SIG_METHOD_HMACSHA1 , int $auth_type = 0 )

Crée un nouvel objet OAuth.

Liste de paramètres

consumer_key

La clé de lecture fournie par le fournisseur de services.

consumer_secret

Le secret de lecture fourni par le fournisseur de services.

signature_method

Ce paramètre optionnel définit la méthode de signature utilisée. Par défaut, c'est OAUTH_SIG_METHOD_HMACSHA1 (HMAC-SHA1).

auth_type

Ce paramètre optionnel définit la méthode de passage des paramètres OAuth au fournisseur de services. Par défaut, c'est OAUTH_AUTH_TYPE_AUTHORIZATION (dans l'entête Authorization).

User Contributed Notes

mgfrobozz at gmail dot com 23-Jan-2017 05:29
The authorization type enums as of oauth-1.2.3 are
OAUTH_AUTH_TYPE_AUTHORIZATION
OAUTH_AUTH_TYPE_URI
OAUTH_AUTH_TYPE_FORM
OAUTH_AUTH_TYPE_NONE
mgfrobozz at gmail dot com 23-Jan-2017 05:27
The signature methods available as of oauth-1.2.3 are:
OAUTH_SIG_METHOD_HMACSHA1
OAUTH_SIG_METHOD_HMACSHA256
OAUTH_SIG_METHOD_RSASHA1
OAUTH_SIG_METHOD_PLAINTEXT


Le destructeur

  • « OAuth::__construct
  • OAuth::disableDebug »
  • PHP Manual
  • OAuth
  • Le destructeur

OAuth::__destruct

(PECL OAuth >= 0.99.9)

OAuth::__destruct — Le destructeur

Description

public OAuth::__destruct ( ) : void

Le destructeur.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • OAuth::__construct() - Crée un nouvel objet OAuth

User Contributed Notes

There are no user contributed notes for this page.


Désactive les messages de déboguage

  • « OAuth::__destruct
  • OAuth::disableRedirects »
  • PHP Manual
  • OAuth
  • Désactive les messages de déboguage

OAuth::disableDebug

(PECL OAuth >= 0.99.3)

OAuth::disableDebug — Désactive les messages de déboguage

Description

public OAuth::disableDebug ( ) : bool

Désactive les messages de déboguage. Il est désactivé par défaut. Vous pouvez définir la propriété debug à false pour désactiver le déboguage.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true

Historique

Version | Description
PECL oauth 0.99.8 | La propriété debug a été ajoutée

Voir aussi

  • OAuth::enableDebug() - Active les messages de débogage

User Contributed Notes

There are no user contributed notes for this page.


Désactive les redirections

  • « OAuth::disableDebug
  • OAuth::disableSSLChecks »
  • PHP Manual
  • OAuth
  • Désactive les redirections

OAuth::disableRedirects

(PECL OAuth >= 0.99.9)

OAuth::disableRedirects — Désactive les redirections

Description

public OAuth::disableRedirects ( ) : bool

Désactive les redirections, permettant ainsi aux requêtes d'être redirigées manuellement.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true

Voir aussi

  • OAuth::enableRedirects() - Active les redirections

User Contributed Notes

There are no user contributed notes for this page.


Désactive la vérification SSL

  • « OAuth::disableRedirects
  • OAuth::enableDebug »
  • PHP Manual
  • OAuth
  • Désactive la vérification SSL

OAuth::disableSSLChecks

(PECL OAuth >= 0.99.5)

OAuth::disableSSLChecks — Désactive la vérification SSL

Description

public OAuth::disableSSLChecks ( ) : bool

Désactive les vérifications de certificats et d'hôtes SLL (activé par défaut). Il est recommandé de ne pas utiliser cette fonction en production.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true

Historique

Version | Description
PECL oauth 0.99.8 | La propriété debug a été ajoutée

Voir aussi

  • OAuth::enableSSLChecks() - Active la vérification SSL

User Contributed Notes

There are no user contributed notes for this page.


Active les messages de débogage

  • « OAuth::disableSSLChecks
  • OAuth::enableRedirects »
  • PHP Manual
  • OAuth
  • Active les messages de débogage

OAuth::enableDebug

(PECL OAuth >= 0.99.3)

OAuth::enableDebug — Active les messages de débogage

Description

public OAuth::enableDebug ( ) : bool

Active les messages de débogage, pratiques en développement, mais inutiles en production.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true

Historique

Version | Description
PECL oauth 0.99.8 | La propriété debug a été ajoutée

Voir aussi

  • OAuth::disableDebug() - Désactive les messages de déboguage

User Contributed Notes

There are no user contributed notes for this page.


Active les redirections

  • « OAuth::enableDebug
  • OAuth::enableSSLChecks »
  • PHP Manual
  • OAuth
  • Active les redirections

OAuth::enableRedirects

(PECL OAuth >= 0.99.9)

OAuth::enableRedirects — Active les redirections

Description

public OAuth::enableRedirects ( ) : bool

Suit les redirections automatiquement ; c'est le comportement par défaut.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true

Voir aussi

  • OAuth::disableRedirects() - Désactive les redirections

User Contributed Notes

There are no user contributed notes for this page.


Active la vérification SSL

  • « OAuth::enableRedirects
  • OAuth::fetch »
  • PHP Manual
  • OAuth
  • Active la vérification SSL

OAuth::enableSSLChecks

(PECL OAuth >= 0.99.5)

OAuth::enableSSLChecks — Active la vérification SSL

Description

public OAuth::enableSSLChecks ( ) : bool

Active les vérifications de certificats et d'hôtes SLL (activé par défaut).

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true

Historique

Version | Description
PECL oauth 0.99.8 | La propriété debug a été ajoutée

Voir aussi

  • OAuth::disableSSLChecks() - Désactive la vérification SSL

User Contributed Notes

There are no user contributed notes for this page.


Lit une ressource protégée par OAuth

  • « OAuth::enableSSLChecks
  • OAuth::generateSignature »
  • PHP Manual
  • OAuth
  • Lit une ressource protégée par OAuth

OAuth::fetch

(PECL OAuth >= 0.99.1)

OAuth::fetch — Lit une ressource protégée par OAuth

Description

public OAuth::fetch ( string $protected_resource_url , array $extra_parameters = ? , string $http_method = ? , array $http_headers = ? ) : mixed

Lit une ressource protégée par OAuth.

Liste de paramètres

protected_resource_url

URL de la ressource protégées par OAuth.

extra_parameters

Paramètres supplémentaires à envoyer avec la requête, à la ressource.

http_method

Une des constantes OAUTH constants OAUTH_HTTP_METHOD_*, incluant GET, POST, PUT, HEAD, ou DELETE.

HEAD (OAUTH_HTTP_METHOD_HEAD) peut être utile pour découvrir des informations avant la demande (si les autorisations OAuth sont dans l'en-tête Authorization header).

http_headers

Les entêtes client HTTP (tels que User-Agent, Accept, etc.)

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
PECL oauth 1.0.0 | Avant cette version, null était retourné au lieu de false.
PECL oauth 0.99.5 | Ajout du paramètre http_method
PECL oauth 0.99.8 | Ajout du paramètre http_headers

Exemples

Exemple #1 Exemple avec OAuth::fetch()

<?php
try {
    $oauth = new OAuth("consumer_key","consumer_secret",OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_AUTHORIZATION);
    $oauth->setToken("access_token","access_token_secret");

    $oauth->fetch("http://photos.example.net/photo?file=vacation.jpg");

    $response_info = $oauth->getLastResponseInfo();
    header("Content-Type: {$response_info["content_type"]}");
    echo $oauth->getLastResponse();
} catch(OAuthException $E) {
    echo "Exception caught!\n";
    echo "Response: ". $E->lastResponse . "\n";
}
?>

Voir aussi

  • OAuth::getLastResponse() - Lit la dernière réponse
  • OAuth::getLastResponseInfo() - Lit les informations HTTP de la dernière réponse
  • OAuth::setToken() - Configure le token et le secret

User Contributed Notes

Lars Stttrup Nielsen 16-Mar-2016 07:37
So I'm using this to talk to the Woocommerce REST API, and was having a lot of trouble figuring out what exactly $extra_parameters was supposed to look like (which WC REST API expects, besides being of the type OAUTH_AUTH_TYPE_URI).

The multidimensional array I fed it crashed PHP, so don't do that if you're in my shoes.

What ended up solving it was me looking through the OAuth source and noticing that $extra_parameters can also be a string, which, encoded as json (json_encode), solved all my troubles as WC accepted it.
zverik at textual dot ru 31-Mar-2014 08:46
If $extra_parameters is not an array, you have to specify Content-Type header, or else you'll get HTTP 401 error. Example:

<?php
$oauth->fetch(ENDPOINT, '{"action": "get_user_info"}', OAUTH_HTTP_METHOD_PUT, array('Content-Type' => 'application/json'));
?>
chris dot barr at ntlworld dot com 05-Mar-2013 05:59
The fetch() method will throw an OAuthException if the returned http status code is in the 4xx or 5xx range:

<?php
// Querying Twitter with bad login details
try {
  $oauth->fetch('https://api.twitter.com/1.1/favorites/list.json');
}
catch(Exception $e) {
  echo $e->getCode(); // 401
  // Message generated by OAuth class
  echo $e->getMessage(); // Invalid auth/bad request (got a 401, expected HTTP/1.1 20X or a redirect)
  // Message returned from Twitter
  echo $e->lastResponse; // {"errors":[{"message":"Could not authenticate you","code":32}]}
}
sun at drupal dot org 09-Aug-2011 06:40
Make sure that your $extra_parameters is an array.

If it's not, then OAuth will silently skip the malformed data type and produce a signature base string that is invalid (doesn't contain POST parameters, as defined in the RFC).

You should file a critical bug report against any REST API you find in the wild that accepts such a bogus signature to pass authentication.
contact info at mech dot cx 23-Mar-2011 04:00
I was having troubles getting fetch() to post, the remote server (Twitter, in this case) complained at me that their "resource only supports POST". Turned out to be a known bug in OAuth 1.1, downgrading to 1.0 fixed it.

Don't lose as much time over this as I did :-)
Lyuben Penkovski (l_penkovski at yahoo dot com) 26-Aug-2010 11:51
If the provider's web server is configured to use Keep-Alive extension to HTTP protocol (HTTP 1.1), there can be a big delay in the response time from the provider. By default Apache is configured to use Keep-Alive for 5 seconds. This is the delay after which the response will come back to the consumer. If you have this issue of delayed result, you can pass in HTTP headers when calling $consumer->fetch():

<?php
$consumer = new OAuth("consumer_key", "consumer_secret", OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_FORM);
$consumer->fetch('http://example.com/api/', null, OAUTH_HTTP_METHOD_POST, array('Connection'=>'close'));
?>

Then the provider will send the result immediately after it's ready with the processing and the connection will be closed. Unfortunately, when calling $consumer->getRequestToken() and $consumer->getAccessToken() there's no way provided to pass in HTTP headers and this delay (if present) cannot be avoided, or at least we could not find a way to avoid it.

The solution that worked for us is to send this header from the provider when returning result to the consumer:

<?php
$result = 'oauth_callback_accepted=true&oauth_token=' . $this->urlencode($token->oauth_token) .
          '&oauth_token_secret='.$this->urlencode($token->oauth_token_secret);

header('HTTP/1.1 200 OK');
header('Content-Length: '.strlen($result));
header('Content-Type: application/x-www-form-urlencoded');
header('Connection:close');
echo $result;
?>

This can work if you have the possibility to modify the code of the provider, e.g. if you are the provider yourself or if you can talk with the people that develop it and ask them to send this header for your request.


Génère une signature

  • « OAuth::fetch
  • OAuth::getAccessToken »
  • PHP Manual
  • OAuth
  • Génère une signature

OAuth::generateSignature

(No version information available, might only be in Git)

OAuth::generateSignature — Génère une signature

Description

public OAuth::generateSignature ( string $http_method , string $url , mixed $extra_parameters = ? ) : string|false

Génère une signature basée sur la méthode HTTP finale, l'URL et une chaîne/tableau de paramètres.

Liste de paramètres

http_method

Méthode HTTP pour la requête.

url

URL de la requête.

extra_parameters

Chaîne ou tableau de paramètres additionnels.

Valeurs de retour

Une chaîne contenant la signature générée ou false si une erreur survient

User Contributed Notes

There are no user contributed notes for this page.


Récupère un token d'accès

  • « OAuth::generateSignature
  • OAuth::getCAPath »
  • PHP Manual
  • OAuth
  • Récupère un token d'accès

OAuth::getAccessToken

(PECL OAuth >= 0.99.1)

OAuth::getAccessToken — Récupère un token d'accès

Description

public OAuth::getAccessToken ( string $access_token_url , string $auth_session_handle = ? , string $verifier_token = ? , string $http_method = ? ) : array

Lit un token d'accès, un secret et toute information supplémentaire chez un fournisseur de services.

Liste de paramètres

access_token_url

L'URL à utiliser.

auth_session_handle

L'identifiant de session. Ce paramètre n'a pas d'existence dans les spécifications OAuth 1.0, mais peut être mis en place par de grosses implémentations. Voyez » ScalableOAuth pour plus de détails.

verifier_token

Pour les fournisseurs de service qui supportent 1.0a, le paramètre verifier_token doit être fourni, lors de l'échange de token de requête pour obtenir le token d'accès. Si verifier_token est présent dans $_GET ou $_POST, il est automatiquement passé et l'appelant n'a pas besoin de préciser de paramètre verifier_token (généralement, le token d'accès est échangé via l'URL de rappel callback_url.). Voyez » ScalableOAuth pour plus d'informations.

http_method

Méthode HTTP a utiliser, par exemple GET ou POST.

Valeurs de retour

Retourne un tableau contenant la réponse OAuth analyse, en cas de succès, et false sinon.

Historique

Version | Description
PECL oauth 1.0.0 | Avant cette version, null était retourné au lieu de false.
PECL oauth 0.99.9 | Le paramètre verifier_token a été ajouté

Exemples

Exemple #1 Exemple avec OAuth::getAccessToken()

<?php
try {
    $oauth = new OAuth(OAUTH_CONSUMER_KEY,OAUTH_CONSUMER_SECRET);
    $oauth->setToken($request_token,$request_token_secret);
    $access_token_info = $oauth->getAccessToken("https://example.com/oauth/access_token");
    if(!empty($access_token_info)) {
        print_r($access_token_info);
    } else {
        print "Failed fetching access token, response was: " . $oauth->getLastResponse();
    }
} catch(OAuthException $E) {
    echo "Response: ". $E->lastResponse . "\n";
}
?>

Résultat de l'exemple ci-dessus est similaire à :

Array
(
    [oauth_token] => some_token
    [oauth_token_secret] => some_token_secret
)

Voir aussi

  • OAuth::getLastResponse() - Lit la dernière réponse
  • OAuth::getLastResponseInfo() - Lit les informations HTTP de la dernière réponse
  • OAuth::setToken() - Configure le token et le secret

User Contributed Notes

There are no user contributed notes for this page.


Récupère l'information CA

  • « OAuth::getAccessToken
  • OAuth::getLastResponse »
  • PHP Manual
  • OAuth
  • Récupère l'information CA

OAuth::getCAPath

(PECL OAuth >= 0.99.8)

OAuth::getCAPath — Récupère l'information CA

Description

public OAuth::getCAPath ( ) : array

Récupère les informations du certificat de l'autorité, incluant les valeurs de ca_path et ca_info définit par la méthode OAuth::setCaPath().

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un tableau d'informations sur le certificat de l'autorité, contenant entre autres, les clés ca_path et ca_info.

Voir aussi

  • OAuth::setCAPath() - Définit le chemin et les informations du CA
  • OAuth::getLastResponseInfo() - Lit les informations HTTP de la dernière réponse

User Contributed Notes

There are no user contributed notes for this page.


Lit la dernière réponse

  • « OAuth::getCAPath
  • OAuth::getLastResponseHeaders »
  • PHP Manual
  • OAuth
  • Lit la dernière réponse

OAuth::getLastResponse

(PECL OAuth >= 0.99.1)

OAuth::getLastResponse — Lit la dernière réponse

Description

public OAuth::getLastResponse ( ) : string

Lit la réponse brute de la dernière requête.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne une chaîne avec la dernière requête.

Voir aussi

  • OAuth::getLastResponseInfo() - Lit les informations HTTP de la dernière réponse
  • OAuth::fetch() - Lit une ressource protégée par OAuth

User Contributed Notes

There are no user contributed notes for this page.


Récupère les en-têtes de la dernière réponse

  • « OAuth::getLastResponse
  • OAuth::getLastResponseInfo »
  • PHP Manual
  • OAuth
  • Récupère les en-têtes de la dernière réponse

OAuth::getLastResponseHeaders

(No version information available, might only be in Git)

OAuth::getLastResponseHeaders — Récupère les en-têtes de la dernière réponse

Description

public OAuth::getLastResponseHeaders ( ) : string|false

Récupère les en-têtes de la dernière réponse.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Une chaîne de caractères contenant les en-têtes de la dernière réponse ou false si une erreur survient

User Contributed Notes

There are no user contributed notes for this page.


Lit les informations HTTP de la dernière réponse

  • « OAuth::getLastResponseHeaders
  • OAuth::getRequestHeader »
  • PHP Manual
  • OAuth
  • Lit les informations HTTP de la dernière réponse

OAuth::getLastResponseInfo

(PECL OAuth >= 0.99.1)

OAuth::getLastResponseInfo — Lit les informations HTTP de la dernière réponse

Description

public OAuth::getLastResponseInfo ( ) : array

Lit les informations HTTP de la dernière réponse.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un tableau contenant les informations de réponse de la dernière requête. Les constantes de curl_getinfo() sont aussi utilisables.

Voir aussi

  • OAuth::fetch() - Lit une ressource protégée par OAuth
  • OAuth::getLastResponse() - Lit la dernière réponse

User Contributed Notes

There are no user contributed notes for this page.


Génère une signature d'en-tête OAuth

  • « OAuth::getLastResponseInfo
  • OAuth::getRequestToken »
  • PHP Manual
  • OAuth
  • Génère une signature d'en-tête OAuth

OAuth::getRequestHeader

(No version information available, might only be in Git)

OAuth::getRequestHeader — Génère une signature d'en-tête OAuth

Description

public OAuth::getRequestHeader ( string $http_method , string $url , mixed $extra_parameters = ? ) : string|false

Génère une signature d'en-tête OAuth basée sur la méthode HTTP finale, ainsi que sur l'URL et ses paramètres.

Liste de paramètres

http_method

Méthode HTTP pour la demande.

url

URL de la demande.

extra_parameters

Paramètres additionnels (chaîne de caractères ou tableau).

Valeurs de retour

Une chaîne de caractères contenant l'en-tête généré de la demande ou false si une erreur survient

User Contributed Notes

me at chrishowie dot com 12-Dec-2016 10:03
The documentation does not specify the difference between passing a string and passing an array for the third parameter.  We spent two days debugging before reading the C source code to figure out that there is a significant and undocumented difference between the two.

"a=1" and array("a" => 1) are handled very differently!

If you are making a POST/PUT request (or anything with an entity body) then you should pass that as a string.

If you are making a request with a query string, you should pass that as an associative array.

If you pass "a=1" intending that to specify the query string, the generated signature will be invalid -- it will process this as if you were POSTing the content "a=1" instead.


Lit le token de requête

  • « OAuth::getRequestHeader
  • OAuth::setAuthType »
  • PHP Manual
  • OAuth
  • Lit le token de requête

OAuth::getRequestToken

(PECL OAuth >= 0.99.1)

OAuth::getRequestToken — Lit le token de requête

Description

public OAuth::getRequestToken ( string $request_token_url , string $callback_url = ? , string $http_method = ? ) : array

Lit le token de requête, le secret et toute information supplémentaire du fournisseur de services.

Liste de paramètres

request_token_url

l'URL dont il faut obtenir le token.

callback_url

URL de rappel OAuth. Si callback_url est passé et que sa valeur est vide, il prend alors la valeur de "oob" pour satisfaire aux exigences de OAuth 2009.1 advisory.

http_method

Méthode HTTP a utiliser, par exemple GET ou POST.

Valeurs de retour

Retourne un tableau contenant la réponse OAuth analysée, en cas de succès, ou false en cas d'échec.

Historique

Version | Description
PECL oauth 1.0.0 | Avant cette version, null était retourné au lieu de false.
PECL oauth 0.99.9 | Le paramètre callback_url a été ajouté

Exemples

Exemple #1 Exemple avec OAuth::getRequestToken()

<?php
try {
    $oauth = new OAuth(OAUTH_CONSUMER_KEY,OAUTH_CONSUMER_SECRET);
    $request_token_info = $oauth->getRequestToken("https://example.com/oauth/request_token");
    if(!empty($request_token_info)) {
        print_r($request_token_info);
    } else {
        print "Failed fetching request token, response was: " . $oauth->getLastResponse();
    }
} catch(OAuthException $E) {
    echo "Response: ". $E->lastResponse . "\n";
}
?>

Résultat de l'exemple ci-dessus est similaire à :

Array
(
    [oauth_token] => some_token
    [oauth_token_secret] => some_token_secret
)

Voir aussi

  • OAuth::getLastResponse() - Lit la dernière réponse
  • OAuth::getLastResponseInfo() - Lit les informations HTTP de la dernière réponse

User Contributed Notes

bohwaz 29-Mar-2010 07:29
Please note that if you don't supply callback_url, the oauth parameter oauth_callback will not be sent to the server and will result in an error from the server, as this parameter is REQUIRED in the OAuth spec.


Définit le type d'autorisation

  • « OAuth::getRequestToken
  • OAuth::setCAPath »
  • PHP Manual
  • OAuth
  • Définit le type d'autorisation

OAuth::setAuthType

(PECL OAuth >= 0.99.1)

OAuth::setAuthType — Définit le type d'autorisation

Description

public OAuth::setAuthType ( int $auth_type ) : bool

Configure les paramètres OAuth.

Liste de paramètres

auth_type

auth_type peut être un des options suivantes (elles sont classées par ordre décroissant de préférence, tel que précisé dans OAuth 1.0 section 5.2) :

OAUTH_AUTH_TYPE_AUTHORIZATION
Passe les paramètres OAuth dans l'entête HTTP Authorization.
OAUTH_AUTH_TYPE_FORM
Ajoute les paramètres OAuth au corps de la requête HTTP POST.
OAUTH_AUTH_TYPE_URI
Ajoute les paramètres OAuth à l'URI.
OAUTH_AUTH_TYPE_NONE
Aucun.

Valeurs de retour

Retourne true si un paramètre est correctement défini, false dans les autres cas.

Historique

Version | Description
PECL oauth 1.0.0 | Avant cette version, null était retourné au lieu de false.

User Contributed Notes

There are no user contributed notes for this page.


Définit le chemin et les informations du CA

  • « OAuth::setAuthType
  • OAuth::setNonce »
  • PHP Manual
  • OAuth
  • Définit le chemin et les informations du CA

OAuth::setCAPath

(PECL OAuth >= 0.99.8)

OAuth::setCAPath — Définit le chemin et les informations du CA

Description

public OAuth::setCAPath ( string $ca_path = ? , string $ca_info = ? ) : mixed

Définit le certificat d'autorité (CA), pour à la fois le chemin et les informations.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

ca_path

Le chemin du CA à définir.

ca_info

Les informations du CA à définir.

Valeurs de retour

Retourne true en cas de succès, ou false si ca_path ou ca_info sont considérés comme invalide.

Historique

Version | Description
PECL oauth 1.0.0 | Avant cette version, null était retourné au lieu de false.

Voir aussi

  • OAuth::getCaPath() - Récupère l'information CA

User Contributed Notes

There are no user contributed notes for this page.


Configure le nonce OAuth

  • « OAuth::setCAPath
  • OAuth::setRequestEngine »
  • PHP Manual
  • OAuth
  • Configure le nonce OAuth

OAuth::setNonce

(PECL OAuth >= 0.99.1)

OAuth::setNonce — Configure le nonce OAuth

Description

public OAuth::setNonce ( string $nonce ) : mixed

Configure le nonce OAuth pour les appels suivants.

Liste de paramètres

nonce

La valeur de oauth_nonce.

Valeurs de retour

Retourne true en cas de succès, ou false si le paramètre nonce est considéré comme invalide.

Historique

Version | Description
PECL oauth 1.0.0 | Avant cette version, null était retourné au lieu de false.

Voir aussi

  • OAuth::setToken() - Configure le token et le secret
  • OAuth::setAuthType() - Définit le type d'autorisation
  • OAuth::setVersion() - Configure la version OAuth

User Contributed Notes

There are no user contributed notes for this page.


Le but de setRequestEngine

  • « OAuth::setNonce
  • OAuth::setRSACertificate »
  • PHP Manual
  • OAuth
  • Le but de setRequestEngine

OAuth::setRequestEngine

(PECL OAuth >= 1.0.0)

OAuth::setRequestEngine — Le but de setRequestEngine

Description

public OAuth::setRequestEngine ( int $reqengine ) : void

Définit le moteur de requête, utilisé pour envoyer les requêtes HTTP.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

reqengine

Le moteur de requêtes désiré. Définir à OAUTH_REQENGINE_STREAMS pour utiliser les flux PHP, ou OAUTH_REQENGINE_CURL pour utiliser Curl.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

Émet une exception OAuthException si un moteur de requêtes invalide est choisi.

Exemples

Exemple #1 Exemple avec OAuth::setRequestEngine()

<?php
$consumer = new OAuth();

$consumer->setRequestEngine(OAUTH_REQENGINE_STREAMS);
?>

Voir aussi

  • Curl
  • Les flux PHP
  • OAuthException

User Contributed Notes

There are no user contributed notes for this page.


Définit le certificat RSA

  • « OAuth::setRequestEngine
  • OAuth::setSSLChecks »
  • PHP Manual
  • OAuth
  • Définit le certificat RSA

OAuth::setRSACertificate

(PECL OAuth >= 1.0.0)

OAuth::setRSACertificate — Définit le certificat RSA

Description

public OAuth::setRSACertificate ( string $cert ) : mixed

Définit le certificat RSA.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

cert

Le certificat RSA.

Valeurs de retour

Retourne true en cas de succès, ou false si une erreur survient (i.e., le certificat RSA ne peut être analysé.)

Historique

Version | Description
PECL oauth 1.0.0 | Avant cette version, null était retourné au lieu de false.

Exemples

Exemple #1 Exemple avec OAuth::setRsaCertificate()

<?php
$consume = new OAuth('1234', '', OAUTH_SIG_METHOD_RSASHA1);

$consume->setRSACertificate(file_get_contents('test.pem'));
?>

Voir aussi

  • OAuth::setCaPath() - Définit le chemin et les informations du CA

User Contributed Notes

There are no user contributed notes for this page.


Définit des vérifications spécifiques à SSL pour les requêtes

  • « OAuth::setRSACertificate
  • OAuth::setTimestamp »
  • PHP Manual
  • OAuth
  • Définit des vérifications spécifiques à SSL pour les requêtes

OAuth::setSSLChecks

(No version information available, might only be in Git)

OAuth::setSSLChecks — Définit des vérifications spécifiques à SSL pour les requêtes

Description

public OAuth::setSSLChecks ( int $sslcheck ) : bool

Définit des vérifications spécifiques à SSL pour les requêtes.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

sslcheck

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

User Contributed Notes

There are no user contributed notes for this page.


Définit le timestamp

  • « OAuth::setSSLChecks
  • OAuth::setToken »
  • PHP Manual
  • OAuth
  • Définit le timestamp

OAuth::setTimestamp

(PECL OAuth >= 1.0.0)

OAuth::setTimestamp — Définit le timestamp

Description

public OAuth::setTimestamp ( string $timestamp ) : mixed

Définit le timestamp OAuth pour les prochaines requêtes.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

timestamp

Le timestamp.

Valeurs de retour

Retourne true, ou false si timestamp est invalide.

Historique

Version | Description
PECL oauth 1.0.0 | Avant cette version, null était retourné au lieu de false.

Voir aussi

  • OAuth::setNonce() - Configure le nonce OAuth

User Contributed Notes

There are no user contributed notes for this page.


Configure le token et le secret

  • « OAuth::setTimestamp
  • OAuth::setVersion »
  • PHP Manual
  • OAuth
  • Configure le token et le secret

OAuth::setToken

(PECL OAuth >= 0.99.1)

OAuth::setToken — Configure le token et le secret

Description

public OAuth::setToken ( string $token , string $token_secret ) : bool

Configure le token et le secret pour les prochains appels.

Liste de paramètres

token

Le token OAuth.

token_secret

Le secret OAuth.

Valeurs de retour

true

Exemples

Exemple #1 L'exemple OAuth::setToken()

<?php
$oauth = new OAuth(OAUTH_CONSUMER_KEY,OAUTH_CONSUMER_SECRET);
$oauth->setToken("token","token-secret");
?>

User Contributed Notes

There are no user contributed notes for this page.


Configure la version OAuth

  • « OAuth::setToken
  • OAuthProvider »
  • PHP Manual
  • OAuth
  • Configure la version OAuth

OAuth::setVersion

(PECL OAuth >= 0.99.1)

OAuth::setVersion — Configure la version OAuth

Description

public OAuth::setVersion ( string $version ) : bool

Configure la version de OAuth pour les prochains appels.

Liste de paramètres

version

La version OAuth, et par défaut, c'est toujours "1.0"

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

User Contributed Notes

There are no user contributed notes for this page.


La classe OAuthProvider

(PECL OAuth >= 1.0.0)

Introduction

Gère une classe OAuthProvider.

Voir aussi un tutoriel externe nommé » Écrire un service OAuth Provider, qui fournit une bonne approche pour proposer ce service. Il y a également des » exemples OAuth provider directement dans les sources de l'extension OAuth.

Synopsis de la classe

OAuthProvider {
/* Méthodes */
final public addRequiredParameter ( string $req_params ) : bool
public callconsumerHandler ( ) : void
public callTimestampNonceHandler ( ) : void
public calltokenHandler ( ) : void
public checkOAuthRequest ( string $uri = ? , string $method = ? ) : void
public __construct ( array $params_array = ? )
public consumerHandler ( callable $callback_function ) : void
final public static generateToken ( int $size , bool $strong = false ) : string
public is2LeggedEndpoint ( mixed $params_array ) : void
public isRequestTokenEndpoint ( bool $will_issue_request_token ) : void
final public removeRequiredParameter ( string $req_params ) : bool
final public static reportProblem ( string $oauthexception , bool $send_headers = true ) : string
final public setParam ( string $param_key , mixed $param_val = ? ) : bool
final public setRequestTokenPath ( string $path ) : bool
public timestampNonceHandler ( callable $callback_function ) : void
public tokenHandler ( callable $callback_function ) : void
}

Sommaire

  • OAuthProvider::addRequiredParameter — Ajoute des paramètres requis
  • OAuthProvider::callconsumerHandler — Appelle la fonction de rappel consumerNonceHandler
  • OAuthProvider::callTimestampNonceHandler — Appelle la fonction de rappel timestampNonceHandler
  • OAuthProvider::calltokenHandler — Appelle la fonction de rappel tokenNonceHandler
  • OAuthProvider::checkOAuthRequest — Vérifie une requête OAuth
  • OAuthProvider::__construct — Construit un nouvel objet OAuthProvider
  • OAuthProvider::consumerHandler — Définit la fonction de rappel consumerHandler
  • OAuthProvider::generateToken — Génère un jeton aléatoire
  • OAuthProvider::is2LeggedEndpoint — is2LeggedEndpoint
  • OAuthProvider::isRequestTokenEndpoint — Définit isRequestTokenEndpoint
  • OAuthProvider::removeRequiredParameter — Supprime un paramètre
  • OAuthProvider::reportProblem — Rapporte un problème
  • OAuthProvider::setParam — Définit un paramètre
  • OAuthProvider::setRequestTokenPath — Définit le chemin du jeton demandé
  • OAuthProvider::timestampNonceHandler — Définit le gestionnaire de rappel timestampNonceHandler
  • OAuthProvider::tokenHandler — Définit le gestionnaire de rappel tokenHandler

User Contributed Notes

There are no user contributed notes for this page.


Ajoute des paramètres requis

  • « OAuthProvider
  • OAuthProvider::callconsumerHandler »
  • PHP Manual
  • OAuthProvider
  • Ajoute des paramètres requis

OAuthProvider::addRequiredParameter

(PECL OAuth >= 1.0.0)

OAuthProvider::addRequiredParameter — Ajoute des paramètres requis

Description

final public OAuthProvider::addRequiredParameter ( string $req_params ) : bool

Ajoute des paramètres requis oauth provider.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

req_params

Les paramètres requis.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • OAuthProvider::removeRequiredParameter() - Supprime un paramètre

User Contributed Notes

me at thomashunter dot name 06-Jun-2013 03:03
This method can be used for adding non-standard parameters required by your application, as well as parameters within the spec.

<?php
$Provider->addRequiredParameter("permissions");
$Provider->addRequiredParameter("oauth_callback");


Appelle la fonction de rappel consumerNonceHandler

  • « OAuthProvider::addRequiredParameter
  • OAuthProvider::callTimestampNonceHandler »
  • PHP Manual
  • OAuthProvider
  • Appelle la fonction de rappel consumerNonceHandler

OAuthProvider::callconsumerHandler

(No version information available, might only be in Git)

OAuthProvider::callconsumerHandler — Appelle la fonction de rappel consumerNonceHandler

Description

public OAuthProvider::callconsumerHandler ( ) : void

Appelle la fonction de rappel consumer handler, qui a été définie par la méthode OAuthProvider::consumerHandler().

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

Émet une erreur E_ERROR si la fonction de rappel ne peut être appelée ou n'a pas été spécifiée.

Voir aussi

  • OAuthProvider::consumerHandler() - Définit la fonction de rappel consumerHandler

User Contributed Notes

There are no user contributed notes for this page.


Appelle la fonction de rappel timestampNonceHandler

  • « OAuthProvider::callconsumerHandler
  • OAuthProvider::calltokenHandler »
  • PHP Manual
  • OAuthProvider
  • Appelle la fonction de rappel timestampNonceHandler

OAuthProvider::callTimestampNonceHandler

(PECL OAuth >= 1.0.0)

OAuthProvider::callTimestampNonceHandler — Appelle la fonction de rappel timestampNonceHandler

Description

public OAuthProvider::callTimestampNonceHandler ( ) : void

Appelle la fonction de rappel timestamp handler, qui a été définie par la méthode OAuthProvider::timestampNonceHandler().

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

Émet une erreur E_ERROR si la fonction de rappel ne peut être appelée ou n'a pas été spécifiée.

Voir aussi

  • OAuthProvider::timestampNonceHandler() - Définit le gestionnaire de rappel timestampNonceHandler

User Contributed Notes

There are no user contributed notes for this page.


Appelle la fonction de rappel tokenNonceHandler

  • « OAuthProvider::callTimestampNonceHandler
  • OAuthProvider::checkOAuthRequest »
  • PHP Manual
  • OAuthProvider
  • Appelle la fonction de rappel tokenNonceHandler

OAuthProvider::calltokenHandler

(PECL OAuth >= 1.0.0)

OAuthProvider::calltokenHandler — Appelle la fonction de rappel tokenNonceHandler

Description

public OAuthProvider::calltokenHandler ( ) : void

Appelle la fonction de rappel token handler, qui a été définie par la méthode OAuthProvider::tokenHandler().

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

Émet une erreur E_ERROR si la fonction de rappel ne peut être appelée ou n'a pas été spécifiée.

Voir aussi

  • OAuthProvider::tokenHandler() - Définit le gestionnaire de rappel tokenHandler

User Contributed Notes

There are no user contributed notes for this page.


Vérifie une requête OAuth

  • « OAuthProvider::calltokenHandler
  • OAuthProvider::__construct »
  • PHP Manual
  • OAuthProvider
  • Vérifie une requête OAuth

OAuthProvider::checkOAuthRequest

(PECL OAuth >= 1.0.0)

OAuthProvider::checkOAuthRequest — Vérifie une requête OAuth

Description

public OAuthProvider::checkOAuthRequest ( string $uri = ? , string $method = ? ) : void

Vérifie une requête OAuth.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

uri

L'URI, optionnel, ou un point final.

method

La méthode HTTP. Optionnel ; passez-y une constante parmi les constantes OAuth OAUTH_HTTP_METHOD_* .

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

Émet une erreur de niveau E_ERROR si la méthode HTTP ne peut être détectée.

Voir aussi

  • OAuthProvider::reportProblem() - Rapporte un problème

User Contributed Notes

tim at timlytle dot net 17-Oct-2013 01:30
Seems this method can only be called once per instance (or gives the same result as the first call on repeat calls).

My use case is API endpoints that can be accessed by a user or with 2 legged auth. If normal oAuth failed, I was calling is2LeggedEndpoint(true) and running again.

For that to work the OAuth Provider needs to be created again, simply changing one of the flags seems to have no effect on the next call.
Lyuben Penkovski (l_penkovski at yahoo dot com) 23-Aug-2010 03:59
This function checks if OAuth request is valid and signed correctly.

$provider->checkOAuthRequest();

It does this by first calling timestampNonceHandler and expects result OAUHT_OK from it. If the result is different, an exception is thrown. It's up to you to write the code that checks timestamp/nonce combinations.

Secondly, it calls consumerHandler and expects your code in the consumerHandler function to set $provider->consumer_secret to the correct value (you should take it from your consumer storage location where it's saved with consumer key). If $provider->consumer_secret is not set, or is not set with the proper value an exception is thrown. Proper value means that it should be the same consumer key that was used to sign the request by the consumer before sending it to here (the provider). Again expected result from this function is OAUTH_OK or some OAUTH error code if you want to throw exception.

Third, it calls tokenHandler, but only WHEN you are requesting ACCESS token or requesting protected data with authorized ACCESS TOKEN. In order for the provider to call tokenHandler, before a call to the checkOAuthRequest function is made, the provider should call the method that says that this is not a request token endpoint (this is access token endpoint):

$provider->isRequestTokenEndpoint (false);
$provider->checkOAuthRequest();

Again here OAuthProvider is expecting your code in the tokenHandler to set $provider->token_secret to the correct value (you should take it from your token storage place) because during the signing process it uses CONSUMER SECRET (for request token) and CONSUMER SECRET AND TOKEN SECRET (for access token and fetch of protected data) to sign the request.

After these 3 handler functions are called and return good results (OAUTH_OK) and set the values of the required fields $provider->consumer_secret and $provider->token_secret, then the checkOAuthRequest function signs the request. If something goes wrong, it throws exception, otherwise there comes the place for your code to proceed and handle the request:

- you can create request token (if it's a first request for request token)
- you can create access token (if it's a request for access token)
- you can return protected data to the consumer (if it's a request to fetch protected data)

This is how the functions in my code look like, however please have in mind that I've just implemented it and it's possible that I have something missed or forgotten, but generally I think the idea should be clear:

$this->dbModel is the object for working with database and save/retrieve token and consumer data

<?php

public function timestampNonceHandler ( $provider )
{
    return $this->dbModel->checkTimestampNonce ( $provider->consumer_key,
                                                 $provider->token,
                                                 $provider->timestamp,
                                                 $provider->nonce );
}

public function consumerHandler ( $provider )
{
    $consumer = $this->dbModel->getConsumerSecrets ($provider->consumer_key);

    if($consumer['consumer_key'] != $provider->consumer_key)
    {
        return OAUTH_CONSUMER_KEY_UNKNOWN;
    }

    if( (int)$consumer['disabled'] != 0 )
    {
        return OAUTH_CONSUMER_KEY_REFUSED;
    }

    $provider->consumer_id = $consumer['consumer_id']; # this is not required by OAuthProvider but I use it later in tokenHandler
    $provider->consumer_secret = $consumer['consumer_secret']; # this is REQUIRED

    return OAUTH_OK;
}

public function tokenHandler ( $provider )
{
    $token = $this->dbModel->getToken( $provider->token );

    if( time() > $token['expire'] )
    {
        return OAUTH_TOKEN_EXPIRED;
    }

    if($token['consumer_id'] != $provider->consumer_id)
    {
        return OAUTH_TOKEN_REJECTED;
    }

    if( (int)$token['authorized'] == 0 )
    {
        return OAUTH_TOKEN_REJECTED;
    }

    if($token['token_type'] != 'access')
    {
        if($token['verifier'] != $provider->verifier)
            return OAUTH_VERIFIER_INVALID;
    }

    $provider->token_id = $token['token_id']; # not required to be set by OAuthProvider
    $provider->token_secret = $token['token_secret']; # this is REQUIRED

    return OAUTH_OK;
}

?>


Construit un nouvel objet OAuthProvider

  • « OAuthProvider::checkOAuthRequest
  • OAuthProvider::consumerHandler »
  • PHP Manual
  • OAuthProvider
  • Construit un nouvel objet OAuthProvider

OAuthProvider::__construct

(PECL OAuth >= 1.0.0)

OAuthProvider::__construct — Construit un nouvel objet OAuthProvider

Description

public OAuthProvider::__construct ( array $params_array = ? )

Initie un nouvel object OAuthProvider.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

params_array

Le fait de définir des paramètres optionnels est limité au SAPI CLI.

Valeurs de retour

Un object OAuthProvider.

Exemples

Exemple #1 Exemple avec OAuthProvider::__construct()

<?php
try {

    $op = new OAuthProvider();

    // Utilisation des fonctions de rappel définies par l'utilisateur
    $op->consumerHandler(array($this, 'lookupConsumer'));
    $op->timestampNonceHandler(array($this, 'timestampNonceChecker'));
    $op->tokenHandler(array($this, 'myTokenHandler'));

    // Ignore le paramètre foo_uri
    $op->setParam('foo_uri', NULL);

    // Aucun jeton nécessaire pour ce point final
    $op->setRequestTokenPath('/v1/oauth/request_token');

    $op->checkOAuthRequest();

} catch (OAuthException $e) {

    echo OAuthProvider::reportProblem($e);
}
?>

Voir aussi

  • OAuthProvider::setParam() - Définit un paramètre

User Contributed Notes

There are no user contributed notes for this page.


Définit la fonction de rappel consumerHandler

  • « OAuthProvider::__construct
  • OAuthProvider::generateToken »
  • PHP Manual
  • OAuthProvider
  • Définit la fonction de rappel consumerHandler

OAuthProvider::consumerHandler

(PECL OAuth >= 1.0.0)

OAuthProvider::consumerHandler — Définit la fonction de rappel consumerHandler

Description

public OAuthProvider::consumerHandler ( callable $callback_function ) : void

Définit la fonction de rappel consumer handler, qui pourra ensuite être appelée avec la méthode OAuthProvider::callConsumerHandler().

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

callback_function

Le nom de la fonction de rappel de type callable.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec OAuthProvider::consumerHandler()

<?php
function lookupConsumer($provider) {

    if ($provider->consumer_key === 'unknown') {
        return OAUTH_CONSUMER_KEY_UNKNOWN;
    } else if($provider->consumer_key == 'blacklisted' || $provider->consumer_key === 'throttled') {
        return OAUTH_CONSUMER_KEY_REFUSED;
    }

    $provider->consumer_secret = "the_consumers_secret";

    return OAUTH_OK;
}
?>

Voir aussi

  • OAuthProvider::callConsumerHandler() - Appelle la fonction de rappel consumerNonceHandler

User Contributed Notes

There are no user contributed notes for this page.


Génère un jeton aléatoire

  • « OAuthProvider::consumerHandler
  • OAuthProvider::is2LeggedEndpoint »
  • PHP Manual
  • OAuthProvider
  • Génère un jeton aléatoire

OAuthProvider::generateToken

(PECL OAuth >= 1.0.0)

OAuthProvider::generateToken — Génère un jeton aléatoire

Description

final public static OAuthProvider::generateToken ( int $size , bool $strong = false ) : string

Génère une chaîne de caractères d'octets pseudo-aléatoires.

Liste de paramètres

size

La longueur désirée du jeton, en octets.

strong

Définit à true, signifie que /dev/random sera utilisé, sinon, ce sera /dev/urandom. Ce paramètre est ignoré sous Windows.

Valeurs de retour

Le jeton généré, sous la forme d'une chaîne de caractères d'octets.

Erreurs / Exceptions

Si le paramètre strong vaut true, alors, une alerte de niveau E_WARNING sera émise lorsque la fonction de rappel rand() est utilisée pour compléter les octets aléatoires manquant (i.e., lorsqu'il n'y a pas assez de données aléatoires initialement).

Exemples

Exemple #1 Exemple avec OAuthProvider::generateToken()

<?php
$p = new OAuthProvider();

$t = $p->generateToken(4);

echo strlen($t),  PHP_EOL;
echo bin2hex($t), PHP_EOL;

?>

Résultat de l'exemple ci-dessus est similaire à :

4
b6a82c27

Notes

Note:

Lorsqu'il n'y a pas assez de données aléatoires de disponible sur le système, cette fonction complètera les octets manquant en utilisant la fonction PHP interne rand().

Voir aussi

  • openssl_random_pseudo_bytes() - Génère une chaine pseudo-aléatoire d'octets
  • mcrypt_create_iv() - Crée un vecteur d'initialisation (IV) à partir d'une source aléatoire

User Contributed Notes

carlosouza at me dot com 28-Mar-2012 02:32
Be careful when setting the 'strong' parameter to true.

If you system doesn't have enough entropy your script will block which can cause timeouts in other parts of your code.

In my case, the most serious symptom was my script blocking when trying to read from /dev/random and causing a 'MySQL has gone away' error.

Hopefully this saves someone the trouble when deciding to use /dev/random entropy


is2LeggedEndpoint

  • « OAuthProvider::generateToken
  • OAuthProvider::isRequestTokenEndpoint »
  • PHP Manual
  • OAuthProvider
  • is2LeggedEndpoint

OAuthProvider::is2LeggedEndpoint

(PECL OAuth >= 1.0.0)

OAuthProvider::is2LeggedEndpoint — is2LeggedEndpoint

Description

public OAuthProvider::is2LeggedEndpoint ( mixed $params_array ) : void

Le flux 2-legged, ou la demande de signature. Il ne requière pas de jeton.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

params_array

Valeurs de retour

Un object OAuthProvider .

Exemples

Exemple #1 Exemple avec OAuthProvider::is2LeggedEndpoint()

<?php

$provider = new OAuthProvider();

$provider->is2LeggedEndpoint(true);

?>

Voir aussi

  • OAuthProvider::__construct() - Construit un nouvel objet OAuthProvider

User Contributed Notes

There are no user contributed notes for this page.


Définit isRequestTokenEndpoint

  • « OAuthProvider::is2LeggedEndpoint
  • OAuthProvider::removeRequiredParameter »
  • PHP Manual
  • OAuthProvider
  • Définit isRequestTokenEndpoint

OAuthProvider::isRequestTokenEndpoint

(PECL OAuth >= 1.0.0)

OAuthProvider::isRequestTokenEndpoint — Définit isRequestTokenEndpoint

Description

public OAuthProvider::isRequestTokenEndpoint ( bool $will_issue_request_token ) : void

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

will_issue_request_token

Définit s'il émettra une demande de jeton ou non, ceci déterminant si la méthode OAuthProvider::tokenHandler() doit être appelée.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • OAuthProvider::setRequestTokenPath() - Définit le chemin du jeton demandé
  • OAuthProvider::reportProblem() - Rapporte un problème

User Contributed Notes

There are no user contributed notes for this page.


Supprime un paramètre

  • « OAuthProvider::isRequestTokenEndpoint
  • OAuthProvider::reportProblem »
  • PHP Manual
  • OAuthProvider
  • Supprime un paramètre

OAuthProvider::removeRequiredParameter

(PECL OAuth >= 1.0.0)

OAuthProvider::removeRequiredParameter — Supprime un paramètre

Description

final public OAuthProvider::removeRequiredParameter ( string $req_params ) : bool

Supprime un paramètre.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

req_params

Le paramètre à supprimer.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • OAuthProvider::setParam() - Définit un paramètre
  • OAuthProvider::addRequiredParameter() - Ajoute des paramètres requis

User Contributed Notes

There are no user contributed notes for this page.


Rapporte un problème

  • « OAuthProvider::removeRequiredParameter
  • OAuthProvider::setParam »
  • PHP Manual
  • OAuthProvider
  • Rapporte un problème

OAuthProvider::reportProblem

(PECL OAuth >= 1.0.0)

OAuthProvider::reportProblem — Rapporte un problème

Description

final public static OAuthProvider::reportProblem ( string $oauthexception , bool $send_headers = true ) : string

Rapporte un problème sous la forme d'une exception OAuthException ; les problèmes possibles sont listés dans la section des constantes OAuth.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

oauthexception

L'exception OAuthException.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • OAuthProvider::checkOAuthRequest() - Vérifie une requête OAuth
  • OAuthProvider::isRequestTokenEndpoint() - Définit isRequestTokenEndpoint

User Contributed Notes

There are no user contributed notes for this page.


Définit un paramètre

  • « OAuthProvider::reportProblem
  • OAuthProvider::setRequestTokenPath »
  • PHP Manual
  • OAuthProvider
  • Définit un paramètre

OAuthProvider::setParam

(PECL OAuth >= 1.0.0)

OAuthProvider::setParam — Définit un paramètre

Description

final public OAuthProvider::setParam ( string $param_key , mixed $param_val = ? ) : bool

Définit un paramètre.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

param_key

La clé du paramètre.

param_val

La valeur du paramètre ; optionnelle.

Pour exclure un paramètre de la vérification de signature, définir cette valeur à null.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • OAuthProvider::addRequiredParameter() - Ajoute des paramètres requis

User Contributed Notes

There are no user contributed notes for this page.


Définit le chemin du jeton demandé

  • « OAuthProvider::setParam
  • OAuthProvider::timestampNonceHandler »
  • PHP Manual
  • OAuthProvider
  • Définit le chemin du jeton demandé

OAuthProvider::setRequestTokenPath

(PECL OAuth >= 1.0.0)

OAuthProvider::setRequestTokenPath — Définit le chemin du jeton demandé

Description

final public OAuthProvider::setRequestTokenPath ( string $path ) : bool

Définit le chemin du jeton demandé.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

path

Le chemin.

Valeurs de retour

true

Voir aussi

  • OAuthProvider::tokenHandler() - Définit le gestionnaire de rappel tokenHandler

User Contributed Notes

There are no user contributed notes for this page.


Définit le gestionnaire de rappel timestampNonceHandler

  • « OAuthProvider::setRequestTokenPath
  • OAuthProvider::tokenHandler »
  • PHP Manual
  • OAuthProvider
  • Définit le gestionnaire de rappel timestampNonceHandler

OAuthProvider::timestampNonceHandler

(PECL OAuth >= 1.0.0)

OAuthProvider::timestampNonceHandler — Définit le gestionnaire de rappel timestampNonceHandler

Description

public OAuthProvider::timestampNonceHandler ( callable $callback_function ) : void

Définit le gestionnaire de rappel timestampNonceHandler, qui sera appelé plus tard avec la méthode OAuthProvider::callTimestampNonceHandler(). Les erreurs en rapport avec timestamp/nonce seront émises via ce gestionnaire de rappel.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

callback_function

Le nom de la fonction callback.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec OAuthProvider::timestampNonceHandler()

<?php
function timestampNonceChecker($provider) {

    if ($provider->nonce === 'bad') {
        return OAUTH_BAD_NONCE;
    } elseif ($provider->timestamp == '0') {
        return OAUTH_BAD_TIMESTAMP;
    }

    return OAUTH_OK;
}
?>

Voir aussi

  • OAuthProvider::callTimestampNonceHandler() - Appelle la fonction de rappel timestampNonceHandler

User Contributed Notes

There are no user contributed notes for this page.


Définit le gestionnaire de rappel tokenHandler

  • « OAuthProvider::timestampNonceHandler
  • OAuthException »
  • PHP Manual
  • OAuthProvider
  • Définit le gestionnaire de rappel tokenHandler

OAuthProvider::tokenHandler

(PECL OAuth >= 1.0.0)

OAuthProvider::tokenHandler — Définit le gestionnaire de rappel tokenHandler

Description

public OAuthProvider::tokenHandler ( callable $callback_function ) : void

Définit le gestionnaire de rappel tokenHandler, qui sera appelé plus tard avec la méthode OAuthProvider::callTokenHandler().

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

callback_function

Le nom de la fonction callable.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec OAuthProvider::tokenHandler()

<?php
function tokenHandler($provider) {

    if ($provider->token === 'rejected') {
        return OAUTH_TOKEN_REJECTED;
    } elseif ($provider->token === 'revoked') {
        return OAUTH_TOKEN_REVOKED;
    }

    $provider->token_secret = "the_tokens_secret";
    return OAUTH_OK;
}
?>

Voir aussi

  • OAuthProvider::callTokenHandler() - Appelle la fonction de rappel tokenNonceHandler

User Contributed Notes

There are no user contributed notes for this page.


La classe OAuthException

(PECL OAuth >= 0.99.1)

Introduction

Cette exception est émise quand des erreurs exceptionnelles surviennent durant l'utilisation de l'extension OAuth, et contient des informations pratiques pour déboguer.

Synopsis de la classe

OAuthException extends Exception {
/* Propriétés */
public $lastResponse ;
public $debugInfo ;
/* Propriétés héritées */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* Méthodes héritées */
final public Exception::getMessage ( ) : string
final public Exception::getPrevious ( ) : Throwable
final public Exception::getCode ( ) : mixed
final public Exception::getFile ( ) : string
final public Exception::getLine ( ) : int
final public Exception::getTrace ( ) : array
final public Exception::getTraceAsString ( ) : string
public Exception::__toString ( ) : string
final private Exception::__clone ( ) : void
}

Propriétés

lastResponse

La réponse à l'exception survenue, s'il y en a

debugInfo

User Contributed Notes

There are no user contributed notes for this page.


SOAP

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Fonctions SOAP
    • is_soap_fault — Vérifie si SOAP retourne une erreur
    • use_soap_error_handler — Active le gestionnaire d'erreurs SOAP natif
  • SoapClient — La classe SoapClient
    • SoapClient::__call — Appelle une fonction SOAP (obsolète)
    • SoapClient::__construct — Constructeur SoapClient
    • SoapClient::__doRequest — Exécute une requête SOAP
    • SoapClient::__getCookies — Get list of cookies
    • SoapClient::__getFunctions — Retourne une liste de fonctions SOAP publiées
    • SoapClient::__getLastRequest — Retourne la dernière requête SOAP
    • SoapClient::__getLastRequestHeaders — Retourne les en-têtes de la dernière requête SOAP
    • SoapClient::__getLastResponse — Retourne la dernière réponse SOAP
    • SoapClient::__getLastResponseHeaders — Retourne les en-têtes de la dernière réponse SOAP
    • SoapClient::__getTypes — Retourne une liste des types SOAP
    • SoapClient::__setCookie — Définit un cookie pour les requêtes SOAP
    • SoapClient::__setLocation — Configure l'URL du service Web à utiliser
    • SoapClient::__setSoapHeaders — Ajoute un en-tête SOAP pour les requêtes suivantes
    • SoapClient::__soapCall — Appelle une fonction SOAP
  • SoapServer — La classe SoapServer
    • SoapServer::addFunction — Ajoute une ou plusieurs fonctions qui vont gérer les requêtes SOAP
    • SoapServer::addSoapHeader — Ajoute un en-tête SOAP à une réponse
    • SoapServer::__construct — Constructeur SoapServer
    • SoapServer::fault — Emet une erreur SoapServer
    • SoapServer::getFunctions — Retourne la liste des fonctions définies
    • SoapServer::handle — Traite une requête SOAP
    • SoapServer::setClass — Configure la classe qui sera utilisée pour gérer les requêtes SOAP
    • SoapServer::setObject — Configure l'objet qui sera utilisé pour gérer les requêtes SOAP
    • SoapServer::setPersistence — Active le mode persistant de SoapServer
  • SoapFault — La classe SoapFault
    • SoapFault::__construct — Constructeur SoapFault
    • SoapFault::__toString — Produit une représentation chaîne d'un objet SoapFault
  • SoapHeader — La classe SoapHeader
    • SoapHeader::__construct — Constructeur SoapHeader
  • SoapParam — La classe SoapParam
    • SoapParam::__construct — Constructeur SoapParam
  • SoapVar — La classe SoapVar
    • SoapVar::__construct — Constructeur SoapVar

User Contributed Notes

Luke 08-Sep-2015 07:21
Was calling an asmx method like $success=$x->AuthenticateUser($userName,$password) and this was returning me an error.

However i changed it and added the userName and password in an array and its now KAWA...
spectrumcat at gmail dot com 22-Feb-2015 04:19
In case you'll get a .p12 certificate for your SOAP client to use (or any other actually) make sure to convert it to PEM and merge with the private key.

Convert p12 to PEM with merged private key:
openssl pkcs12 -in supplied_cert.p12 -out php_soap_cert.pem -clcerts

Example:
$wsdl = "./mywsdl.wsdl"; // Or "http://provider.com/api/api.wsdl"

$options = [
        'location'      => "http://provider.com/api/",
        'local_cert'    => "./php_soap_cert.pem",
        'passphrase'    => "certificate_password",
];

try {
    $soapClient = new SoapClient($wsdl, $options);
} catch(Exception $e) {
    var_dump($e);
}
rafinskipg at gmail dot com 14-May-2012 02:54
Support for MTOM addign this code to your project:

<?php
class MySoapClient extends SoapClient
{
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
        $response = parent::__doRequest($request, $location, $action, $version, $one_way);
        // parse $response, extract the multipart messages and so on

        //this part removes stuff
        $start=strpos($response,'<?xml');
        $end=strrpos($response,'>');
        $response_string=substr($response,$start,$end-$start+1);
        return($response_string);
    }
}

?>

Then you can do this
<?php
  new MySoapClient($wsdl_url);
?>
dennis at pleasedontspam dot clansman dot nl 02-Dec-2011 03:53
When you receive the soapfault message: "looks like we got no XML document" it might be that you're talking to a server that supports MTOM (http://www.w3.org/TR/soap12-mtom/).

MTOM is, as of yet (5.3.6), not supported by the SoapClient.
mariamr at gmail dot com 16-Oct-2010 06:38
“SOAP-ERROR: Parsing WSDL: Couldn’t find in ‘PATH/TO/YOUR/WSDL’”

This error occurs because some versions of PHP SOAP client  do not send the user name and password that you pass as the options input parameter of the SoapClient constructor  . Yu need to pass the credentials in the web service URL like this:
$soapClient =new SoapClient(“http://user:password@example.com/blahblah.wsdl”);
vishal dot thakkar at exateam dot com 22-Feb-2010 06:19
I was trying to figure out for days and days to make SOAP server return an associative array and NOT an object ....

To get an array (not object) in the SOAP response, just serialize the array before returning it to the clent..

hope it helps...
Thanks.....
Vishal Thakkar.
stephenlansell at gmail dot com 03-Feb-2010 07:19
Here is an example of a php client talking to a asmx server:

<?php

        $soapClient = new SoapClient("https://soapserver.example.com/blahblah.asmx?wsdl");

        // Prepare SoapHeader parameters
        $sh_param = array(
                    'Username'    =>    'username',
                    'Password'    =>    'password');
        $headers = new SoapHeader('http://soapserver.example.com/webservices', 'UserCredentials', $sh_param);

        // Prepare Soap Client
        $soapClient->__setSoapHeaders(array($headers));

        // Setup the RemoteFunction parameters
        $ap_param = array(
                    'amount'     =>    $irow['total_price']);

        // Call RemoteFunction ()
        $error = 0;
        try {
            $info = $soapClient->__call("RemoteFunction", array($ap_param));
        } catch (SoapFault $fault) {
            $error = 1;
            print("
            alert('Sorry, blah returned the following ERROR: ".$fault->faultcode."-".$fault->faultstring.". We will now take you back to our home page.');
            window.location = 'main.php';
            ");
        }

        if ($error == 0) {
            $auth_num = $info->RemoteFunctionResult;

            if ($auth_num < 0) {
                ....

                // Setup the OtherRemoteFunction() parameters
                $at_param = array(
                            'amount'        => $irow['total_price'],
                            'description'    => $description);

                // Call OtherRemoteFunction()
                $trans = $soapClient->__call("OtherRemoteFunction", array($at_param));
                $trans_result = $trans->OtherRemoteFunctionResult;
            ....
                } else {
                    // Record the transaction error in the database

                // Kill the link to Soap
                unset($soapClient);
            }
        }
    }
}

?>
moazzam at moazzam-khan dot com 05-Oct-2009 09:37
If anyone is trying to use this for accessing Sabre's web services, it won't work. Sabre checks the request header "Content-Type" to see if it is "text/xml" . If it is not text/xml then it sends an error back.

You will need to create a socket connection and use that to send the request over.
Raphal Gertz 18-Apr-2009 09:50
Juste a note to avoid wasting time on php-soap protocol and format support.

Until php 5.2.9 (at least) the soap extension is only capable of understanding wsdl 1.0 and 1.1 format.

The wsdl 2.0, a W3C recommendation since june 2007, ISN'T supported in php soap extension.
(the soap/php_sdl.c source code don't handle wsdl2.0 format)

The wsdl 2.0 is juste the 1.2 version renamed because it has substantial differences from WSDL 1.1.

The differences between the two format may not be invisible if you don't care a lot.

The wsdl 1.0 format structure (see http://www.w3.org/TR/wsdl) :
<definitions ...>
    <types ...>
    </types>
    <message ...>
        <part ...>
    </message>
    <portType ...>
        <operation ...>
            <input ... />
            <output ... />
            <fault ... />
        </operation>
    </portType>
    <binding ...>
        <operation ...>
            <input ... />
            <output ... />
            <fault ... />
        </operation>
    </binding>
    <service ...>
        <port ...>
    </service>
</definitions>

And the wsdl 2.0 format structure (see http://www.w3.org/TR/wsdl20/) :
<description ...>
    <types ...>
    </types>
    <interface ...>
        <fault ... />
        <operation ...>
            <input ... />
            <output ... />
            <fault ... />
        </operation>
    </interface>
    <binding ...>
        <fault ... />
        <operation ...>
            <input ... />
            <output ... />
            <fault ... />
        </operation>
    </binding>
    <service ...>
        <endpoint ...>
    </service>
</description>

The typical error message if you provide a wsdl 2.0 format file :
PHP Fatal error:  SOAP-ERROR: Parsing WSDL: Couldn't find <definitions> in 'wsdl/example.wsdl' in /path/client.php on line 9
jeff at jeffrodriguez dot com 03-Feb-2009 01:37
Named parameters are actually super easy once you know how to do it. No need to bother with SoapParam or SoapVar for the most part.

The code:
<?php
$ws->getAsset(array(
  'assetId' => 5967
));
?>

Generates the following SOAP body: (formatted for readability)
<SOAP-ENV:Body>
  <ns1:getAsset>
    <assetId>5967</assetId>
  </ns1:getAsset>
</SOAP-ENV:Body>
beau dot scott at gmail dot com 22-Oct-2008 03:34
If you've been trying to send null to a service that considers empty property tags as empty strings rather than null, here's an extending class that fixes this using xsi:nil:

<?php
class XSoapClient extends SoapClient
{
    const XSI_NS = "http://www.w3.org/2001/XMLSchema-instance";
    const _NULL_ = "xxx_replacedduetobrokephpsoapclient_xxx";

    protected $mustParseNulls = false;

    public function __doRequest($request, $location, $action, $version, $one_way = null)
    {
        if($this->mustParseNulls)
        {
            $this->mustParseNulls = false;
            $request = preg_replace('/<ns1:(\w+)>'.self::_NULL_.'<\/ns1:\\1>/',
                        '<ns1:$1 xsi:nil="true"/>',
                        $request, -1, &$count);

            if ($count > 0)
            {
                $request = preg_replace('/(<SOAP-ENV:Envelope )/',
                    '\\1 xmlns:xsi="'.self::XSI_NS.'" ',
                    $request);
            }
        }
        return parent::__doRequest($request, $location, $action, $version, $one_way);
    }

    public function __call($method, $params)
    {
        foreach($params as $k => $v)
        {
            if($v === null)
            {
                $this->mustParseNulls = true;
                $params[$k] = self::_NULL_;
            }
        }
        return parent::__call($method, $params);
    }
}
?>
Ryan 22-Oct-2008 06:21
If you are having an issue where SOAP cannot find the functions that are actually there if you view the wsdl file, it's because PHP is caching the wsdl file (for a day at a time). To turn this off, have this line on every script that uses SOAP: ini_set("soap.wsdl_cache_enabled", "0"); to disable the caching feature.
ivan dot cubillas at xeridia dot com 08-Aug-2008 01:02
The problem with the PHP WebService Client

We've a JAVA WebService Server which could have attached documents. When the PHP Client send the dates, the Server take it correctly, but when
the server return it to the PHP Client, the client reply always that is not a XML valid document.

The problem could be than the JAVA Server adds (to this type of XML binary files)  the documentType head: xml+xop and the clean doesn't understand
this head as a XML document.

There is some possibility to solve this problem in the PHP Client without doing changes in the JAVA Server?
aeg at mallxs dot nl 28-May-2008 05:19
SoapFault exception: [SOAP-ENV:Client] looks like we got no XML document

This error can have to reasons:
1: Your server script has some hidden output like spaces before or afher <?php ... ?> or echoing some text
2: You have a bug in your server script;
    resulting in a error message output

Test your server script by calling it direct  from the browser.
The result should be a clean output like :

-<SOAP-ENV:Envelope>
-<SOAP-ENV:Body>
-<SOAP-ENV:Fault>
  <faultcode>SOAP-ENV:Server</faultcode>
  <faultstring>Bad Request. Can't find HTTP_RAW_POST_DATA</faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

This tell's you there was a request but without data; This is OK
Now if you get the error when calling with your soap client;
remember that your server now will call other functions in the server.php script because it now has some data to process
nodkz at mail dot ru 24-May-2008 02:25
PROBLEM (with SOAP extension under PHP5) of transferring object, that contains objects or array of objects. Nested object would not transfer.

SOLUTION:
This class was developed by trial and error by me. So this 23 lines of code for most developers writing under PHP5 solves fate of using SOAP extension.

<?php
/*
According to specific of organization process of SOAP class in PHP5, we must wrap up complex objects in SoapVar class. Otherwise objects would not be encoded properly and could not be loaded on remote SOAP handler.

Function "getAsSoap" call for encoding object for transmission. After encoding it can be properly transmitted.
*/
abstract class SOAPable {
    public function getAsSOAP() {
        foreach($this as $key=>&$value) {
            $this->prepareSOAPrecursive($this->$key);
        }
        return $this;
    }

    private function prepareSOAPrecursive(&$element) {
        if(is_array($element)) {
            foreach($element as $key=>&$val) {
                $this->prepareSOAPrecursive($val);
            }
            $element=new SoapVar($element,SOAP_ENC_ARRAY);
        }elseif(is_object($element)) {
            if($element instanceof SOAPable) {
                $element->getAsSOAP();
            }
            $element=new SoapVar($element,SOAP_ENC_OBJECT);
        }
    }
}

// ------------------------------------------
//  ABSTRACT EXAMPLE
// ------------------------------------------

class PersonList extends SOAPable {
  protected $ArrayOfPerson; // variable MUST be protected or public!
}

class Person extends SOAPable {
   //any data
}

$client=new SoapClient("test.wsdl", array( 'soap_version'=>SOAP_1_2, 'trace'=>1, 'classmap' => array('Person' => "Person", 'PersonList' => "PersonList")  ));

$PersonList=new PersonList;

// some actions

$PersonList->getAsSOAP();

$client->someMethod($PersonList);

?>

So every class, which will transfer via SOAP, must be extends from class SOAPable.
As you can see, in code above, function prepareSOAPrecursive search another nested objects in parent object or in arrays, and if does it, tries call function getAsSOAP() for preparation of nested objects, after that simply wrap up via SoapVar class.

So in code before transmitting simply call $obj->getAsSOAP()


Introduction

L'extension SOAP peut être utilisée pour les échanges clients/serveurs SOAP. Elle supporte les spécifications » SOAP 1.1, » SOAP 1.2 et » WSDL 1.1.

User Contributed Notes

There are no user contributed notes for this page.


Pré-requis

Cette extension requière l'extension PHP libxml. Ceci signifie passer l'option de configuration --with-libxml, ou antérieur à PHP 7.4 l'option de configuration --enable-libxml, bien que ceci est accomplie implicitement car libxml est activé par défaut.

User Contributed Notes

There are no user contributed notes for this page.


Installation

Pour activer le support de SOAP, configurez PHP avec --enable-soap.

User Contributed Notes

slawkens 04-Jun-2018 08:01
for latest MacOS with brew, where Homebrew/PHP is deprecated:

brew install php@7.2-soap

(change 7.2 to your version)
cdvillagra 09-May-2017 05:39
If you have not yet updated the OS and also the PHP version

for Ubuntu 14.04 LTS
sudo apt-get install php5.6-soap
sudo service apache2 restart
c at cinqs dot net 16-Feb-2017 07:55
If you received a

    E: Couldn't find any package by regex 'php7.1-soap'

when using docker php:apache image

try

    apt-get install php-soap

instead
digimix.co 24-Jan-2017 01:31
On PHP7.1 Ubuntu 16.04 LTS:
$ sudo apt-get install php7.1-soap
$ sudo service php7.1-fpm reload
wally at soggysoftware dot co dot uk 22-Dec-2016 09:40
If you're using official PHP packages shipped with CentOS or RedHat version 6 or 7:

# yum install php-soap

(Restart Apache/nginx too if appropriate.)
dbagnara 20-Aug-2016 10:02
for Ubuntu 16.04 LTS
sudo apt-get install php7.0-soap
sudo systemctl restart apache2.service


Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration SOAP
Nom | Défaut | Modifiable | Historique
soap.wsdl_cache_enabled | 1 | PHP_INI_ALL |
soap.wsdl_cache_dir | /tmp | PHP_INI_ALL |
soap.wsdl_cache_ttl | 86400 | PHP_INI_ALL |
soap.wsdl_cache | 1 | PHP_INI_ALL |
soap.wsdl_cache_limit | 5 | PHP_INI_ALL |

Voici un éclaircissement sur l'utilisation des directives de configuration.

soap.wsdl_cache_enabled int

Active ou pas le cache WSDL.

soap.wsdl_cache_dir string

Configure le nom du dossier où l'extension SOAP peut mettre les fichiers de cache.

soap.wsdl_cache_ttl int

Configure la durée de vie des fichiers dans le cache, exprimé en secondes.

soap.wsdl_cache int

Si soap.wsdl_cache_enabled est actif, cette directive détermine le type de cache. Il peut prendre l'une des valeurs suivantes : WSDL_CACHE_NONE (0), WSDL_CACHE_DISK (1), WSDL_CACHE_MEMORY (2) ou WSDL_CACHE_BOTH (3). Cela peut aussi être configuré via le paramètre options dans les constructeurs de SoapClient ou SoapServer.

soap.wsdl_cache_limit int

Le nombre maximal de fichier WSDL en cache. La reception de nouveaux fichiers dans le cache, s'il est plein, causera l'effacement des plus anciens.

User Contributed Notes

michal-ok at o2 dot pl 06-Mar-2020 03:08
Be aware that wsdl cache may not be compatible across different PHP versions, which may be important to know when you upgrade your PHP on the same system or use a multi-PHP version setup where you run the same scripts from different PHP versions. In other words, when a SOAP request writes a file to the cache and then you make another SOAP request from another PHP version and this cache file is used then *sometimes* you may experience unexpected errors that you will not know where they come from.

I spent hours trying to figure out why I was getting "Encoding: Violation of encoding rules" errors every time I ran some of my SOAP scripts from PHP 7.3 just hours after switching from PHP 7.2. It turned out I needed to clear all cached wsdl files created by PHP 7.2. Downgrading from 7.3 to 7.2 caused the same errors and required clearing the cache, too.

When transitioning to a new PHP version you may turn off the cache or set a very short wsdl_cache_ttl period - if you can't delete the files yourself. If you need your scripts to run on multiple PHP versions with wsdl cache then you'd need to set wsdl_cache_dir that is different for each PHP version.
no dot tehwan dot spam at com dot nospam dot gmail 20-Aug-2014 08:05
Keep in mind if you have memory cache enabled that even if you use an updated WSDL file, it will still be using the one in memory. If you download the WSDL files yourself, avoid using memory cache as you will have no control over it, or set the TTL to a small value (default is 1 day).
martijn at netexpo dot nl 19-Oct-2012 01:37
Please note that these three ini settings will also affect the behaviour of your soap server (and clients as well) :

1. default_socket_timeout default 60 secs
Large or slow requests to your soap server or long processes at your soap server will return soap fault after 60 secs like : Error Fetching http headers.

2. max_execution_time default 30 secs
This can be the next bottleneck (but only when your default_socket_timeout is larger then this setting). Your soap server will not return anything, no faults no output, just an empty string.

3. memory_limit default 128M
Will throw fatal errors when the soap server script itself has low memory or will let your services return empty strings when the data it processes puts memory usage over this limit.

Other max POST settings luckily (but a bit suprisingly to me) have _no_ effect for your soap server. Those are :

max_input_time
max_input_nesting_level
max_input_vars
post_max_size
suhosin.post.max_array_depth
suhosin.post.max_array_index_length
suhosin.post.max_name_length
suhosin.post.max_totalname_length
suhosin.post.max_vars
suhosin.post.max_value_length
hpralow at users dot sf dot net 24-Jul-2008 07:40
If you want to dissable WSDL-caching, you can do so with
<?php
ini_set('soap.wsdl_cache_enabled', '0');
ini_set('soap.wsdl_cache_ttl', '0');
?>
However you must do this before creating a SOAP object (soap_client or soap_server).
Changing the settings like above does not have any effect on already existing soap-objects.

[EDIT BY danbrown AT php DOT net: Typofix provided by (james AT voodoo DOT co DOT uk) on 4-FEB-09.]


Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

SOAP constants
Constante | Valeur | Description
SOAP_1_1 (entier) | 1 |
SOAP_1_2 (entier) | 2 |
SOAP_PERSISTENCE_SESSION (entier) | 1 |
SOAP_PERSISTENCE_REQUEST (entier) | 2 |
SOAP_FUNCTIONS_ALL (entier) | 999 |
SOAP_ENCODED (entier) | 1 |
SOAP_LITERAL (entier) | 2 |
SOAP_RPC (entier) | 1 |
SOAP_DOCUMENT (entier) | 2 |
SOAP_ACTOR_NEXT (entier) | 1 |
SOAP_ACTOR_NONE (entier) | 2 |
SOAP_ACTOR_UNLIMATERECEIVER (entier) | 3 |
SOAP_COMPRESSION_ACCEPT (entier) | 32 |
SOAP_COMPRESSION_GZIP (entier) | 0 |
SOAP_COMPRESSION_DEFLATE (entier) | 16 |
SOAP_AUTHENTICATION_BASIC (entier) | 0 |
SOAP_AUTHENTICATION_DIGEST (entier) | 1 |
SOAP_SSL_METHOD_TLS (entier) | 0 | Depuis PHP 5.5.0.
SOAP_SSL_METHOD_SSLv2 (entier) | 1 | Depuis PHP 5.5.0.
SOAP_SSL_METHOD_SSLv3 (entier) | 2 | Depuis PHP 5.5.0.
SOAP_SSL_METHOD_SSLv23 (entier) | 3 | Depuis PHP 5.5.0.
UNKNOWN_TYPE (entier) | 999998 |
XSD_STRING (entier) | 101 |
XSD_BOOLEAN (entier) | 102 |
XSD_DECIMAL (entier) | 103 |
XSD_FLOAT (entier) | 104 |
XSD_DOUBLE (entier) | 105 |
XSD_DURATION (entier) | 106 |
XSD_DATETIME (entier) | 107 |
XSD_TIME (entier) | 108 |
XSD_DATE (entier) | 109 |
XSD_GYEARMONTH (entier) | 110 |
XSD_GYEAR (entier) | 111 |
XSD_GMONTHDAY (entier) | 112 |
XSD_GDAY (entier) | 113 |
XSD_GMONTH (entier) | 114 |
XSD_HEXBINARY (entier) | 115 |
XSD_BASE64BINARY (entier) | 116 |
XSD_ANYURI (entier) | 117 |
XSD_QNAME (entier) | 118 |
XSD_NOTATION (entier) | 119 |
XSD_NORMALIZEDSTRING (entier) | 120 |
XSD_TOKEN (entier) | 121 |
XSD_LANGUAGE (entier) | 122 |
XSD_NMTOKEN (entier) | 123 |
XSD_NAME (entier) | 124 |
XSD_NCNAME (entier) | 125 |
XSD_ID (entier) | 126 |
XSD_IDREF (entier) | 127 |
XSD_IDREFS (entier) | 128 |
XSD_ENTITY (entier) | 129 |
XSD_ENTITIES (entier) | 130 |
XSD_INTEGER (entier) | 131 |
XSD_NONPOSITIVEINTEGER (entier) | 132 |
XSD_NEGATIVEINTEGER (entier) | 133 |
XSD_LONG (entier) | 134 |
XSD_INT (entier) | 135 |
XSD_SHORT (entier) | 136 |
XSD_BYTE (entier) | 137 |
XSD_NONNEGATIVEINTEGER (entier) | 138 |
XSD_UNSIGNEDLONG (entier) | 139 |
XSD_UNSIGNEDINT (entier) | 140 |
XSD_UNSIGNEDSHORT (entier) | 141 |
XSD_UNSIGNEDBYTE (entier) | 142 |
XSD_POSITIVEINTEGER (entier) | 143 |
XSD_NMTOKENS (entier) | 144 |
XSD_ANYTYPE (entier) | 145 |
XSD_ANYXML (entier) | 147 |
APACHE_MAP (entier) | 200 |
SOAP_ENC_OBJECT (entier) | 301 |
SOAP_ENC_ARRAY (entier) | 300 |
XSD_1999_TIMEINSTANT (entier) | 401 |
XSD_NAMESPACE (entier) | http://www.w3.org/2001/XMLSchema |
XSD_1999_NAMESPACE (entier) | http://www.w3.org/1999/XMLSchema |
SOAP_SINGLE_ELEMENT_ARRAYS (entier) | 1 |
SOAP_WAIT_ONE_WAY_CALLS (entier) | 2 |
SOAP_USE_XSI_ARRAY_TYPE (entier) | 4 |
WSDL_CACHE_NONE (entier) | 0 |
WSDL_CACHE_DISK (entier) | 1 |
WSDL_CACHE_MEMORY (entier) | 2 |
WSDL_CACHE_BOTH (entier) | 3 |

User Contributed Notes

User 01-Oct-2010 08:56
We are casting the values (float) to simulate the 64-bits long. seem to work fine, of course, the values we are using have no decimal point.


Fonctions SOAP

Sommaire

  • is_soap_fault — Vérifie si SOAP retourne une erreur
  • use_soap_error_handler — Active le gestionnaire d'erreurs SOAP natif

User Contributed Notes

vIceBerg 23-Sep-2008 07:18
I have PHP 5.2.5 on my computer. I get this result:

Array
(
    [0] => stdClass Object
        (
            [Client] => stdClass Object
                (
                    [Nom] => LeNom:00000
                    [Prenom] => LePrenom:00000
                )

        )

My host have 5.1.6, the same call returns this result:
Array
(
    [0] => stdClass Object
        (
            [Client] => Array
                (
                    [0] => stdClass Object
                        (
                            [Nom] => LeNom:00000
                            [Prenom] => LePrenom:00000

                        )

5.2.5 is the good structure.

Take care of the version you're using. It can be a lot of work to change all the code
nodkz at mail dot ru 24-May-2008 02:28
PROBLEM (with SOAP extension under PHP5) of transferring object, that contains objects or array of objects. Nested object would not transfer.

SOLUTION:
This class was developed by trial and error by me. So this 23 lines of code for most developers writing under PHP5 solves fate of using SOAP extension.

<?php
/*
According to specific of organization process of SOAP class in PHP5, we must wrap up complex objects in SoapVar class. Otherwise objects would not be encoded properly and could not be loaded on remote SOAP handler.

Function "getAsSoap" call for encoding object for transmission. After encoding it can be properly transmitted.
*/
abstract class SOAPable {
    public function getAsSOAP() {
        foreach($this as $key=>&$value) {
            $this->prepareSOAPrecursive($this->$key);
        }
        return $this;
    }

    private function prepareSOAPrecursive(&$element) {
        if(is_array($element)) {
            foreach($element as $key=>&$val) {
                $this->prepareSOAPrecursive($val);
            }
            $element=new SoapVar($element,SOAP_ENC_ARRAY);
        }elseif(is_object($element)) {
            if($element instanceof SOAPable) {
                $element->getAsSOAP();
            }
            $element=new SoapVar($element,SOAP_ENC_OBJECT);
        }
    }
}

// ------------------------------------------
//  ABSTRACT EXAMPLE
// ------------------------------------------

class PersonList extends SOAPable {
  protected $ArrayOfPerson; // variable MUST be protected or public!
}

class Person extends SOAPable {
   //any data
}

$client=new SoapClient("test.wsdl", array( 'soap_version'=>SOAP_1_2, 'trace'=>1, 'classmap' => array('Person' => "Person", 'PersonList' => "PersonList")  ));

$PersonList=new PersonList;

// some actions

$PersonList->getAsSOAP();

$client->someMethod($PersonList);

?>

So every class, which will transfer via SOAP, must be extends from class SOAPable.
As you can see, in code above, function prepareSOAPrecursive search another nested objects in parent object or in arrays, and if does it, tries call function getAsSOAP() for preparation of nested objects, after that simply wrap up via SoapVar class.

So in code before transmitting simply call $obj->getAsSOAP()
rlee at melbournechapter dot net 01-May-2008 05:38
Just a note on "DTD not recognised..." faults. Check to make sure your wsdl file contains:

<?xml version ='1.0' encoding ='UTF-8' ?>

Also make sure you use full paths, to your service (in the wsdl, client and server)
...
<wsdlsoap:address location='http://www.mysite.com.au/web_services/myserver.php' />
...
<?php
// SOAP Server
$server = new SoapServer('http://www.mysite.com.au/web_services/hello.wsdl');
...
...
?>

<?php
// SOAP Client
 $client = new SoapClient('http://www.mysite.com.au/web_services/hello.wsdl');
...
...
?>

FYI im no SOAP expert but I hope this helps someone out ;)
Drydenmaker 13-Jan-2008 07:59
Working with a third party service I got: "SOAP-ERROR: Parsing Schema: unexpected <text> in restriction"

Thought it would be worth it to share.  What it is saying is that there is some text in an invalid place.  C# seems to ignore it, and if you are using nusoap it doesn't notice it either.  But what was causing my problem was something like:
<types>
    <schema ...

            <simpleType name="some type">
                <restriction base="xsd:string">
                    <enumeration value="foo"/>;
                </restriction>
            </simpleType>

Note the semicolon (;).  Filter that out and your good.
Dominik 07-Dec-2007 01:31
If you are working
- on localhost
- in WSDL mode
and encounter the following error when you try to connect the soap client with the soap server

Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host...

then change "localhost" to "127.0.0.1" in your WSDL file:
<soap:address location='http://127.0.0.1/soap-server.php'/>
AL13N 28-Nov-2007 04:05
this might be helpful, as it took quite some time for me to find this out:

if you're using some .wsdl and there's a sequence that can be there more than once (ie: maxOccurs > 1), you can specify an non-associative array for it if you have more than 1 items OR you could just specify the one item if there is only one:

<?php
'items' => array(
    array(
        'itemId' => 5,
        'name' => 'some name',
    ),
    array(
        'itemId' => 6,
        'name' => 'some other name',
    ),
),
?>

this also works:

<?php
'items' => array(
    'itemId' => 5,
    'name' => 'some name',
),
?>
Anonymous 26-Nov-2007 11:54
when dealing with wsdl and flash soap with php
(not exactly php, but proper wsdl - took me hours to figure it to work properly in flash webservice)

when naming definitions,
don't use "tns:" but use "typens:"

makesure your "definitions/targetNamespace"
is same as your "soap:body" namespace
example: "urn:mynamespace"

makesure your "binding/type" is declared with "typens"

makesure your service/port/binding is set to 'typens:...'

if you did not do it properly, you will end up with
WSDL.UnrecognizedNamespace - in flash
but seems okay in php soapclient...

happy coding :)
hope this help you to save your time on the wsdl :)
james at mercstudio dot com 24-Nov-2007 01:45
If you use wsdl,

makesure you define the input correctly.
if your method does not contain any input parameter,
you got to makesure that you:

 - do not create the message tag for the input..
 - do not put input within porttype / operation
 - do not put input within binding / operation

if not, you will get the error:
[Client] looks like we got no XML

d***, took me several hours figuring that out...
dirk at waferthin dot com 20-Jun-2007 04:31
I hope this will save someone time. When developing and testing your SOAP server, remember to disable WSDL caching in BOTH client and server:

$ini = ini_set("soap.wsdl_cache_enabled", 0);
jochen dot munz at municons dot com 11-Jun-2007 08:56
When encountering an error message like this

[faultstring] => Function ("yourMethod") is not a valid method for this service

although it is present in the WSDL etc., be aware that PHP caches the wsdl locally for better performance. You can disable the caching via php.ini/.htaccess completely or remove the cache file (/tmp/wsdl-.. if you are on Linux) to force regeneration of it.
albert at jool dot nl 27-Mar-2007 02:59
A note for ppl who use certificates with SOAP under a Windows config: it seems to be required to give the full path to the certificate file - and don't prepend 'file://' :

<?php

$wsdl = "test.wsdl";
$local_cert = "c:\htdocs\mycert.pem";
$passphrase = "xyz";

$client = new SoapClient($wsdl, array('local_cert' => $local_cert, 'passphrase' => $passphrase);

?>
kroesjnov at hotmail dot com 09-Feb-2007 07:38
If you dont want to manually maintain the classmap, make sure you use the same names for your PHP object classes and your WSDL complexTypes, and use the following code:

$classmap = array();
$tmpClient = new SoapClient("soapserver.wsdl");

foreach($tmpClient->__getTypes() as $type)
{
    $array = split(" ", $type);
    if($array[0] == "struct" && class_exists($array[1]))
    {
        $classmap[$array[1]] = $array[1];
    }
}
unset($tmpClient);

$server = new SoapServer("soapserver.wsdl", array("classmap" => $classmap));
unset($classmap);
$server->setClass("someclass");
$server->handle();
brephophagist 18-Jan-2007 09:45
For those working from a wsdl full of complex types that just want a class structure to hang your code on and not worry about typing in long parameter lists (or creating a script to do so): wsdl2php is a wonderful time-saver. Gets a structure going so you can go in and add what validation and special data munging you need: http://www.urdalen.no/wsdl2php/

Big up yourself, Knut.
Olaf Krische 21-Nov-2006 01:48
If you use SSL with a cert and password authentication:

$wsdl = "https://ws.ecopatz.de/ProductInfo?wsdl";
$pass = 'a password';
$certFile = "./mycert.pem";

  $client = new SoapClient($wsdl,
    array(
     'local_cert' => $certFile,
     'passphrase' => $pass
    )
  );

If you have problems with the certfile like this:

  Warning: SoapClient::__construct(): Unable to set local cert chain file `./mycert.pem'; Check that your cafile/capath settings include details of your certificate and its issuer in productinfo.php on line 27

then the certFile is probably in the "wrong format" (the wrong format for php maybe). It worked for me, when i appended the content of the private key file and the certificate file to a single file "mycert.pem":

  cat mycert.key >mycert.pem # mycert.key was the private key
  cat mycert.crt >>mycert.pem # mycert.crt was the signed certificate

Thanks to an author somewhere, who pointed to "curl --cert", where this little "so unimportant" dependency has been mentioned.
nico 25-Aug-2006 06:20
If you want to build a Soap Server for Microsoft Office's client (like Microsoft Office Research Service) you need to rewrite SOAP's namespaces :

<?php
// (...)

$server = new SoapServer($wsdl, array('uri' => $uri, 'classmap' => $classmap));
$server->setClass($class);
function callback($buffer)
{
    $s = array('<ns1:RegistrationResponse>', 'ns1:', 'xmlns:ns1="urn:Microsoft.Search"');
    $r = array('<RegistrationResponse xmlns="urn:Microsoft.Search">', '', '');
   return (str_replace($s, $r, $buffer));
}
ob_start('callback');
$server->handle();
ob_end_flush();

// (...)
?>

There are a complete example at this URL : http://touv.ouvaton.org/article.php3?id_article=104
mini at freebsd dot org 08-Jul-2006 04:54
wokan at cox dot net is incorrect about the security of URI-passed values to HTTPS URIs.  HTTPS connections are HTTP inside SSL -- all of the HTTP traffic, including the request, are encrypted.
adm 01-Mar-2006 11:27
Wondering why the function you just added to your WSDL file is not available to your SOAP client? Turn off WSDL caching, which (as the documentation says) is on by default.

At the top of your script, use:

$ini = ini_set("soap.wsdl_cache_enabled","0");
ckl at ecw dot de 16-Jan-2006 11:54
To debug a SOAP service using SoapServer(), a WSDL file and Zend Studio Client/Server, you have to append ?start_debug=1&amp;debug_port=10000 to the service location:
--- snip ---
... method / service definition ....

<service name="SOAPService">
  <port
    name="SOAPServicePort"
    binding="typens:SOAPServiceBinding">
   <soap:address
   location="$URL?start_debug=1&amp;debug_port=10000"/>
  </port>
</service>
--- snap ---
Rui Martins 18-Dec-2005 08:33
Here's an example on how to pass ArrayOfAnyType arguments
containing complex types.

Suppose your WSDL file defines "http://any.url.com/" as the default namespace and a complex type "SomeComplexType".

If you want to call a WebServices which takes an ArrayOfAnyType argument of "SomeComplexType"s you need to perform the following:

<?php
// complexTypes being an array containing several instances of SomeComplexType

myWSParameter = array();
foreach (complexTypes as ct)
{
   // Don't misspell the type or the namespace. Also note that php won't assume the default namespace defined in the WSDL file.
   myWSParameter []= new SoapVar(ct, 0, "SomeComplexType", "http://any.url.com/");
}
?>

On the other hand, when a WebService returns an ArrayOfAnyType you have to do the following to access each of its elements.

<?php
// Here, we will be echoing each return item
$res = $someWS->myFunction($myArgs)

// If only one element is returned, an array won't be built
if (is_array(myFunctionResult->anyType))
{
   foreach (myFunctionResult->anyType as $soapVar)
   {
      echo $soapVar->enc_value;
   }
}
else
{
   echo myFunctionResult->anyType->enc_value;
}
?>

This has all been tested using a .NET WebService.
ChrisB 23-Oct-2005 11:03
Heads up for anyone using PHP Soap + Sessions + PEAR DB classes.

Every time you make a call, via the soap client to your web service, your PEAR DB session is put to sleep and it doesnt by default wake upon the next request.

To fix this I simply called my particular database close call ifx_close() below my $soap->handle();
Bob 11-Oct-2005 01:17
If you are scratching your head why NuSOAP not working on PHP 5.x , the reason is this built-in SOAP Extenstion uses same soapclient() class name as Nusoap.

replace 'soapclient' with 'soapclient_xxx'  in nusoap.php and you are good to go...
johnjawed at gmail dot com 22-Sep-2005 09:29
For those wondering on how to set attributes on nodes with PHP5 SOAP, it would be done as such:

<... soap env/header>
<foo bar="blah">12345</foo>

array("foo" => array("_" => 12345, "bar" => "blah"));
Darryl 20-Jul-2005 11:46
Having trouble passing complex types over SOAP using a PHP SoapServer in WSDL mode?  Not getting decoded properly?  This may be the solution you're looking for!

When using ComplexType in the schema portion of the WSDL file, You need use an additional step to tell PHP SOAP how to encode the objects.  The first method would be to explicitely encapsulate the object in a SoapVar object - telling PHP to use generalized SOAP encoding rules (which encodes all ComplexTypes as Structs).  This won't work, though, if the client is expecting the objects to be encoded according to the WSDL's schema.  So, The actual way to do this is:

* First, define a specific PHP class which is actually just a data structure holding the various properties, and the appropriate  ComplexType in the WSDL.

<?php
 class MyComplexDataType {
     public $myProperty1;
     public $myProperty2;
 }
?>
 <complexType name="MyWSDLStructure">
 <sequence>
    <element name="MyProperty1" type="xsd:integer"/>
    <element name="MyProperty2" type="xsd:string"/>
 </sequence>
 </complexType>

* Next, Tell the SoapServer when you initialize it to map these two structures together.

<?php
 $classmap = array('MyWSDLStructure' => 'MyComplexDataType');
 $server = new SoapServer("http://MyServer/MyService.wsdl", array('classmap' => $classmap))
?>

* Finally, have your method return an instance of your class directly, and let the SoapServer take care of encoding!

<?php
 public function MySoapCall() {
     $o = new MyComplexDataType();

     $o->myProperty1 = 1;
     $o->myProperty2 = "MyString";

     return $o
 }
?>
Jim Plush 12-Jul-2005 04:45
If you're trying to use the SOAP Extension over SSL with a custom PEM file you need to do this:

$client->_local_cert = "C:\\path\myCert.pem";
flobee at gmail dot com 11-May-2005 01:25
wow, actually a cool program and soap is new for me.
I found out some interessting things i can not debug because the scripts exit without any error messages or notes. :-(

you may have problems with the memory and/or especially on "shared servers" when server load is high.
sometimes the script does the job, sometimes it just stopping at any unknown point.
these are the steps my script does:
* get data from remote server ( ~ 4.5 MB)
* parsing requested object and store the data in a database.

the return with debug messages was intressting:
-> check Mem limit: 30M
-> $client = new new SoapClient($url_wsdl, $options);
-> Memory usage: 185888
-> $client->[requested_method_to_get_data]();
-> check: __getLastResponseHeaders() - after:
-> HTTP/1.1 200 OK // remote server is fine with me :-)
-> Content-Length: 4586742  // I got the data
-> check: Memory usage now: 23098872 // ups !!! this can't be true!!

so, and if now someone on the server takes the rest of RAM  the walk thought the data breaks :-(

so, i need to store the xml tree ($client->client->__last_response) and parsing it by the classical way. (if you would request more RAM, you may get in trouble with the admin if you run a script like this more often! (on shared servers)
OrionI 18-Apr-2005 08:12
If you're having problems calling a .NET web service, see the comments over on http://php.net/soap_soapclient_soapcall (the __soapCall method).
kucerar at hhmi dot org 25-Mar-2005 12:04
Here are 73 test cases that detail the kinds of schemas that PHP5 currently supports and the structures you are expected to plug into them for the return value from your services.   Much better than trying to guess!

http://cvs.php.net/co.php/pecl/soap/tests/schema

You can cycle through the listings by changing the main index in the URL below,  rather than go in and out of the pages

http://cvs.php.net/co.php/pecl/soap/tests/schema/schema052.phpt?r=1.2

I downloaded the whole thing with this,  CVS might work too.
http://www.httrack.com/

With them all downloaded I just browse them with Textpad.
Norman Clarke <norman at dontblink dot com> 21-Feb-2005 04:29
Note that if you should need to set the timeout for your soap request,  you can use ini_set to change the value for the default_socket_timeout. I previously used NuSOAP, whose soap client class has a timeout option, and it took me a while to figure out that PHP's soap uses the same socket options as everything else.
wokan at cox dot net 05-Feb-2005 05:06
It's not good security practice to pass the username and password in the URI when the point of SSL is to prevent that information from being intercepted.  Putting that information in the URI makes it interceptable.  HTTPS-Posted values are safe because values passed in the headers are sent after the SSL handshake has been completed.
mikx at mikx dot de 29-Mar-2004 08:12
It took me a while to properly establish a password protected client connection via https on windows/apache1.3. Here my little guide:

1. The SOAP extension isn't activated by default (PHP5 RC1). Just add "extension=php_soap.dll" to the php.ini and don't forget to set the extension_dir properly (in most cases "c:\php\ext").

2. Add "extension=php_openssl.dll" to the php.ini. This module depends on libeay32.dll and ssleay32.dll - copy them from your php folder to your system32 folder.

3. Restart apache

4. The sourcecode

$client = new SoapClient("https://yourLogin:yourPassword@foo.com/bar.wsdl", array(
    "login"      => "yourLogin",
    "password"   => "yourPassword",
    "trace"      => 1,
    "exceptions" => 0));

$client->yourFunction();

print "<pre>\n";
print "Request: \n".htmlspecialchars($client->__getLastRequest()) ."\n";
print "Response: \n".htmlspecialchars($client->__getLastResponse())."\n";
print "</pre>";

Currently it seems to be necessary to add your login and password both in the uri and in the options array. Not sure if this is the expected behavior.


Vérifie si SOAP retourne une erreur

  • « Fonctions SOAP
  • use_soap_error_handler »
  • PHP Manual
  • Fonctions SOAP
  • Vérifie si SOAP retourne une erreur

is_soap_fault

(PHP 5, PHP 7, PHP 8)

is_soap_fault — Vérifie si SOAP retourne une erreur

Description

is_soap_fault ( mixed $object ) : bool

is_soap_fault() sert à vérifier si l'API SOAP a échoué, sans utiliser les exceptions. Pour l'utiliser, créez un objet SoapClient avec l'option exceptions mise à zéro ou à false. Dans ce cas, la méthode SOAP va retourner un objet spécial SoapFault, qui encapsule les détails de l'erreur (code d'erreur, message, acteur et détails).

Si exceptions n'est pas configurée, SOAP va émettre une exception. is_soap_fault() vérifie si le paramètre fourni est un objet SoapFault.

Liste de paramètres

objet

L'objet à tester.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec is_soap_fault()

<?php
$client = new SoapClient("some.wsdl", array('exceptions' => 0));
$result = $client->SomeFunction();
if (is_soap_fault($result)) {
    trigger_error("SOAP Fault: (faultcode: {$result->faultcode}, faultstring: {$result->faultstring})", E_USER_ERROR);
}
?>

Exemple #2 Gestion des erreurs par exception avec SOAP

<?php
try {
    $client = new SoapClient("some.wsdl");
    $result = $client->SomeFunction(/* ... */);
} catch (SoapFault $fault) {
    trigger_error("SOAP Fault: (faultcode: {$fault->faultcode}, faultstring: {$fault->faultstring})", E_USER_ERROR);
}
?>

Voir aussi

  • SoapClient::__construct() - Constructeur SoapClient
  • SoapFault::__construct() - Constructeur SoapFault

User Contributed Notes

There are no user contributed notes for this page.


Active le gestionnaire d'erreurs SOAP natif

  • « is_soap_fault
  • SoapClient »
  • PHP Manual
  • Fonctions SOAP
  • Active le gestionnaire d'erreurs SOAP natif

use_soap_error_handler

(PHP 5, PHP 7, PHP 8)

use_soap_error_handler — Active le gestionnaire d'erreurs SOAP natif

Description

use_soap_error_handler ( bool $enable = true ) : bool

use_soap_error_handler() active ou non le gestionnaire d'erreurs natif SOAP du serveur SOAP. Elle retourne la valeur précédemment utilisée. Si le paramètre handler est mis à true, le détail des erreurs du serveur SoapServer seront envoyées au client, comme message d'erreur SOAP. Si vaut false le gestionnaire d'erreur standard PHP sera utilisé. Le comportement par défaut est d'envoyer l'erreur au client sous forme de message SOAP.

Liste de paramètres

enable

Avec la valeur true, le détail des erreurs sera envoyé aux clients.

Valeurs de retour

Retourne la valeur originale.

Voir aussi

  • set_error_handler() - Spécifie une fonction utilisateur comme gestionnaire d'erreurs
  • set_exception_handler() - Définit une fonction utilisateur de gestion d'exceptions

User Contributed Notes

There are no user contributed notes for this page.


La classe SoapClient

(PHP 5, PHP 7, PHP 8)

Introduction

La classe SoapClient fournit un client pour les protocoles » SOAP 1.1 et » SOAP 1.2. Il peut être utilisé avec ou sans mode WSDL.

Synopsis de la classe

SoapClient {
/* Méthodes */
public __construct ( string|null $wsdl , array $options = [] )
public __call ( string $name , array $args ) : mixed
public __doRequest ( string $request , string $location , string $action , int $version , bool $oneWay = false ) : string|null
public __getCookies ( ) : array
public __getFunctions ( ) : array|null
public __getLastRequest ( ) : string|null
public __getLastRequestHeaders ( ) : string|null
public __getLastResponse ( ) : string|null
public __getLastResponseHeaders ( ) : string|null
public __getTypes ( ) : array|null
public __setCookie ( string $name , string|null $value = null ) : void
public __setLocation ( string $location = "" ) : string|null
public __setSoapHeaders ( SoapHeader|array|null $headers = null ) : bool
public __soapCall ( string $name , array $args , array|null $options = null , SoapHeader|array|null $inputHeaders = null , array &$outputHeaders = null ) : mixed
}

Sommaire

  • SoapClient::__call — Appelle une fonction SOAP (obsolète)
  • SoapClient::__construct — Constructeur SoapClient
  • SoapClient::__doRequest — Exécute une requête SOAP
  • SoapClient::__getCookies — Get list of cookies
  • SoapClient::__getFunctions — Retourne une liste de fonctions SOAP publiées
  • SoapClient::__getLastRequest — Retourne la dernière requête SOAP
  • SoapClient::__getLastRequestHeaders — Retourne les en-têtes de la dernière requête SOAP
  • SoapClient::__getLastResponse — Retourne la dernière réponse SOAP
  • SoapClient::__getLastResponseHeaders — Retourne les en-têtes de la dernière réponse SOAP
  • SoapClient::__getTypes — Retourne une liste des types SOAP
  • SoapClient::__setCookie — Définit un cookie pour les requêtes SOAP
  • SoapClient::__setLocation — Configure l'URL du service Web à utiliser
  • SoapClient::__setSoapHeaders — Ajoute un en-tête SOAP pour les requêtes suivantes
  • SoapClient::__soapCall — Appelle une fonction SOAP

User Contributed Notes

David 15-Feb-2017 12:57
Under IIS and PHP 7, when creating an new SoapClient, it will through an internal 500 error.

This could be caused by invalid permissions to the wsdl cache directory when using 'cache_wsdl'=>WSDL_CACHE_DISK or WSDL_CACHE_BOTH.

This worked for me:
    try {
        $arrContextOptions=array("ssl"=>array( "verify_peer"=>false, "verify_peer_name"=>false,'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT));

        $options = array(
                'soap_version'=>SOAP_1_2,
                'exceptions'=>true,
                'trace'=>1,
                'cache_wsdl'=>WSDL_CACHE_NONE,
                'stream_context' => stream_context_create($arrContextOptions)
        );
        $client = new SoapClient('https://url/dir/file.wsdl', $options);

    } catch (Exception $e) {
        echo "<h2>Exception Error!</h2>";
        echo $e->getMessage();
    }
sheikh303 at gmail dot com 13-Jan-2017 07:51
What is the core method to call remote WSDL file while creating SoapClient object?
is it CURL, wget or anyother?
Ricardo Pedrassani 03-Jun-2016 01:53
If the XML have identities with same name in different levels there is a solution. You don´t have to ever submit a raw XML (this PHP SOAP object don´t allows send a RAW XML), so you have to always translate your XML to a array, like the example below:

$originalXML = "
<xml>
  <firstClient>
      <name>someone</name>
      <adress>R. 1001</adress>
  </firstClient>
  <secondClient>
      <name>another one</name>
      <adress></adress>
  </secondClient>
</xml>"

//Translate the XML above in a array, like PHP SOAP function requires
$myParams = array('firstClient' => array('name' => 'someone',
                                  'adress' => 'R. 1001'),
            'secondClient' => array('name' => 'another one',
                                  'adress' => ''));

$webService = new SoapClient($someURL);
$result = $webService->someWebServiceFunction($myParams);
mcinantyspam at fejm dot pl 13-May-2016 11:32
Please note, that if you provide values that contain illegal xml characters (ASCII codes 0-8,  11-12, 14-15 - or x0-x8, xB-xC, xE-xF in hex), php's SoapClient will do send them in request, although such request is improper because it does not meet XML 1.0 requirements.
You always have to replace or remove these characters in your data before supplying them to SoapClient
info at nospam x valiton x com 13-Apr-2015 08:06
CAUTION:
I had quite a bit of trouble trying to make a request with fopen through a proxy to a secure url.  I kept getting a 400 Bad Request back from the remote host.  It was receiving the proxy url as the SNI host.  In order to get around this I had to explicity set the SNI host to the domain I was trying to reach.  It's apparently the issue outlined in this bug:

https://bugs.php.net/bug.php?id=63519

<?php
$domain = parse_url($file, PHP_URL_HOST);
$proxy_string = "tcp://" . WP_PROXY_HOST  . ":" . WP_PROXY_PORT;
$opts = array(
    'http' => array( 'proxy' => $proxy_string ),
    'ssl' => array( 'SNI_enabled' => true, 'SNI_server_name' => $domain));
$context = stream_context_create($opts);
$handle = fopen( $file, 'r', false, $context );
?>

src:
http://php.net/manual/en/context.http.php#114314
acopantepuy at gmail dot com 11-Apr-2015 02:45
when they want to pass variables into the http header that is how it is done:

<?php

$aHTTP['http']['header'] =  "User-Agent: PHP-SOAP/5.5.11\r\n";

$aHTTP['http']['header'].= "username: XXXXXXXXXXX\r\n"."password: XXXXX\r\n";

$context = stream_context_create($aHTTP);

$client=new SoapClient("https://ocppws-cert.extra.bcv.org.ve:443/AltoValor/BancoUniversal?WSDL",array('trace' => 1,"stream_context" => $context));

$result = $client->jornadaActiva();
var_dump($result);
?>
acopantepuy at gmail dot com 11-Apr-2015 02:42
when they want to pass variables into the http header that is how it is done:

<?php

$aHTTP['http']['header'] =  "User-Agent: PHP-SOAP/5.5.11\r\n";

$aHTTP['http']['header'].= "username: C1040001760102\r\n"."password: bcv2020\r\n";

$context = stream_context_create($aHTTP);

$client=new SoapClient("https://ocppws-cert.extra.bcv.org.ve:443/AltoValor/BancoUniversal?WSDL",array('trace' => 1,"stream_context" => $context));

$result = $client->jornadaActiva();
var_dump($result);
?>
romuloum at hotmail dot com 19-Feb-2015 04:22
After migrating to PHP 5.6.5, the soap 1.2 did not work anymore. So I solved the problem by adding optional parameters SSL.
My error: failed to load external entity
How to solve:
        // options for ssl in php 5.6.5
        $opts = array(
            'ssl' => array('ciphers'=>'RC4-SHA', 'verify_peer'=>false, 'verify_peer_name'=>false)
        );
        // SOAP 1.2 client
        $params = array ('encoding' => 'UTF-8', 'verifypeer' => false, 'verifyhost' => false, 'soap_version' => SOAP_1_2, 'trace' => 1, 'exceptions' => 1, "connection_timeout" => 180, 'stream_context' => stream_context_create($opts) );
        $oSoapClient = new SoapClient ( $url . "?WSDL", $params );
softontherocks at gmail dot com 22-Nov-2014 08:32
I posted in this URL http://softontherocks.blogspot.com/2014/02/web-service-soap-con-php.html a full example of a nusoap web service.

There is defined the server and the cliente who calls the web service.

I hope it would be useful for you.
martin dot schenck at plugsurfing dot com 15-Sep-2014 03:34
If you want to connect to a server that only supports SSLv2/3 and/or TLS 1.0 (no TLS 2 or 3), tell the SOAP client if you get a connection error by setting the appropriate stream context:
<?php
  $opts = array(
    'ssl' => array('ciphers'=>'RC4-SHA')
  );

  $objSoapClient = new SoapClient(
    'https://example.com/?wsdl',
    array ( "encoding"=>"ISO-8859-1",
    'stream_context' => stream_context_create($opts)
    // your options
    );
?>

You might need to disable the SOAP caching of WSDLs in order for the SOAP client to use the new context.
Stefan 03-Jun-2014 11:04
There is a known bug with some versions of Xdebug which can cause SoapClient to not throw an exception but instead cause a fatal error.

Surround the SoapClient call with xdebug_disable(); and xdebug_enable();  to work around this problem.

For reference:

http://bugs.xdebug.org/view.php?id=249
https://bugs.php.net/bug.php?id=47584
Anonymous 12-Sep-2013 09:25
I got the following error when trying to load the WSDL file:

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: <message> 'MessageName' already defined

In my case there was no double definitions but it was including other files - I think one of them contained a duplicate message with a different namespace (which SoapClient doesn't like).

I resolved it by loading the WSDL in SoapUI, right-clicking and selecting "Export definition". The WSDL that then got created worked fine. Hope this helps somebody.
Guillermo Prandi 20-Feb-2012 02:10
To make an HTTPS call with a client certificate, you can do it this way:

1) Create a file containing both the key and the signed certificate. I did this by concatenating my (.pem) key and the certificate I've got signed from my CA (also .pem format). The file looked like this:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKagQC1N27Ilb9pWil2NaX2qM8FquXBXK5T1AydOv7sCotsc8MAwbi7
......(snip)......
wAiOCD4K9TyMS76pIS8UyfJl/oIrn7EF24BUpaUfsh8=
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIC/zCCAmigAwIBAgIEAIl1JzANBgkqhkiG9w0BAQQuADBQMQswCQYxVQQGEaJV
......(snip)......
eSPds1hLKYSg0bd3uI7LhaDLOC1PPgb77sYe/uYkUWuHBzllts5x/pfue0zaIBKG
Omjy
-----END CERTIFICATE-----

2) Reference your certificate in the creation of the SOAP client, like this:

$protected_url = "https://my-server/?wsdl";
$my_cert_file = "/my/path/to/mycert.pem";

$client = new SoapClient($protected_url, array('local_cert', $my_cert_file) );
egiardina at badatmath dot com 03-Aug-2011 06:05
This one drove me nuts... if you are connecting to a web service run on Cassini, (Visual Studio's web server) from php, you may not be able to call web service functions or load a WSDL out-of-the-box.

My set up is that I am using xampp on my windows development machine, and also using Visual Studio's built in web-server. I built a web service in visual studio. I wrote a simple PHP script, running under xampp, to access this service, so the two projects can 'talk' to each other. What I found was the WSDL was never loaded.

So I moved the WSDL local to the PHP file and accessed it directly. Still no calls. Turns out, PHP's SoapClient seems to have a problem with 'localhost' as a web service endpoint. So I hand-edited the web service endpoint URL to read 127.0.0.1 instead of localhost, and Voila! Web Service calls work:

Here is my PHP, now working:
<?php
$client = new SoapClient("http://localhost/code/soap.wsdl");
$something =  $client->HelloWorld(array());
echo $something->HelloWorldResult;
die();

?>

Here is my modified WSDL:
  <wsdl:service name="MyService">
    <wsdl:port name="MyServiceSoap" binding="tns:MyServiceSoap">
      <soap:address location="http://127.0.0.1:55274/MyService/MyService.asmx" />
....

    </wsdl:port>
stepan dot zarubin at gmail dot com 30-Jun-2011 11:51
Well, this example works fine:

<?php
try {
    $x = @new SoapClient("non-existent.wsdl");
} catch (Exception $e) {
    echo $e->getMessage();
}
?>

Just make sure use NEW with @.
jjlopez 09-Mar-2011 11:36
If you are making soap calls in WSDL mode , and the address of your web service includes a port different from 80 (like http://my_ip_address:8080//service.asmx?wsdl), the WSDL file is fetched correctly, but all subsequent requests are made without any port in the host field. This causes a SoapFault exception when trying to call any of the service’s methods.

You need to redefine the soapClient class and force the port in each call.

See this example:

http://www.victorstanciu.ro/php-soapclient-port-bug-workaround/
hugues at zonereseau dot com 17-Feb-2011 09:17
When you need to connect to services requiring to send extra header use this method.

Here how we can to it with PHP and SoapClient

<?php
class exampleChannelAdvisorAuth
{
    public $DeveloperKey;
    public $Password;

    public function __construct($key, $pass)
    {
        $this->DeveloperKey = $key;
        $this->Password = $pass;
    }
}

$devKey        = "";
$password    = "";
$accountId    = "";

// Create the SoapClient instance
$url         = "";
$client     = new SoapClient($url, array("trace" => 1, "exception" => 0));

// Create the header
$auth         = new ChannelAdvisorAuth($devKey, $password);
$header     = new SoapHeader("http://www.example.com/webservices/", "APICredentials", $auth, false);

// Call wsdl function
$result = $client->__soapCall("DeleteMarketplaceAd", array(
    "DeleteMarketplaceAd" => array(
        "accountID"        => $accountId,
        "marketplaceAdID"    => "9938745"        // The ads ID
    )
), NULL, $header);

// Echo the result
echo "<pre>".print_r($result, true)."</pre>";
if($result->DeleteMarketplaceAdResult->Status == "Success")
{
    echo "Item deleted!";
}
?>
fourat dot zouari at tritux dot com 20-Jun-2009 08:08
In addition to the KeepAlive trick which is a "server-side" modification, on the "client side" default_socket_timeout should be increased from its default value (60) when you deal with ~slow SOAP servers.
As for the KeepAlive, if creating a new separate vhost for the soap api is not possible, you can add this to your existing vhost: BrowserMatch "^PHP-SOAP" nokeepalive
where PHP-SOAP is the agent name of your soap client, if you dont know what agent name your client use, just checkout the access.log of your apache.
peter dot hansen at fastit dot net 01-May-2009 06:57
When you get errors like:
"Fatal error: Uncaught SoapFault exception: [HTTP] Error Fetching http headers in"
after a few (time intensive) SOAP-Calls, check your webserver-config.

Sometimes the webservers "KeepAlive"-Setting tends to result in this error. For SOAP-Environments I recommend you to disable KeepAlive.

Hint: It might be tricky to create a dedicated vhost for your SOAP-Gateways and disable keepalive just for this vhost because for normal webpages Keepalive is a nice speed-boost.


Appelle une fonction SOAP (obsolète)

  • « SoapClient
  • SoapClient::__construct »
  • PHP Manual
  • SoapClient
  • Appelle une fonction SOAP (obsolète)

SoapClient::__call

(PHP 5, PHP 7, PHP 8)

SoapClient::__call — Appelle une fonction SOAP (obsolète)

Description

public SoapClient::__call ( string $name , array $args ) : mixed

L'appel direct à cette méthode est obsolète. Habituellement, les fonctions SOAP peuvent être appelées comme méthodes de l'objet SoapClient ; dans les cas où ce n'est pas possible, ou bien qu'il est nécessaire de passer plus d'options, utilisez la méthode SoapClient::__soapCall().

User Contributed Notes

philipp dot gruber at catchoftheday dot com dot au 07-Apr-2014 12:27
If you are using a WSDL, the library will strip out anything from your parameters that is not defined in WSDL, without giving you any notice about this.

So if your parameters are not fully matching the WSDL, it will simply send no parameters at all.
This can be a bit hard to debug if you don't have access to the target server.

__soapCall() expects parameters in an array called 'parameters' as opposed to calling the function via it's WSDL name, where it accepts the parameters as a plain array.

I.e. if a function called sendOrder expects a parameter (array) called orderDetails, you can call it like this:

$orderDetails = array(/* your data */);
$soap->sendOrder(array('orderDetails' => $orderDetails));

Which is equivalent to:

$client->__soapCall('sendOrder', array('parameters' => array('orderDetails' => $orderDetails)));

Note the additional 'parameters' key used in __soapCall().
KRavEN 17-Jun-2009 06:56
extend of __call thats adds a retry to handle the occasional 'Could not connect to host' exceptions

<?php
class LocalSoapClient extends SoapClient
{

  public function __call($function_name, $arguments)
  {
    $result = false;
    $max_retries = 5;
    $retry_count = 0;

    while(! $result && $retry_count < $max_retries)
    {
      try
      {
        $result = parent::__call($function_name, $arguments);
      }
      catch(SoapFault $fault)
      {
        if($fault->faultstring != 'Could not connect to host')
        {
          throw $fault;
        }
      }
      sleep(1);
      $retry_count ++;
    }
    if($retry_count == $max_retries)
    {
      throw new SoapFault('Could not connect to host after 5 attempts');
    }
    return $result;
  }
}
?>
bananos at dev dot co dot ua 11-Apr-2008 05:13
I'm writing PHP SOAP client (based on php_soap extension) which uses Google AdService,
today, I tried to create sample Ad using   AdService::addAds()  and discovered that my SOAP library does not pass
"headline", "description1", "description2"  parameters in SOAP request.

First, I thought that this was something wrong with my data, coz I was getting validation errors like
"One or more input elements failed validation."   Then I decided to take a look at WSDL description
https://adwords.google.com/api/adwords/v11/AdService?wsdl

And voilà !  I've found this:

<complexType name="Ad" abstract="true">
<sequence>
  <element name="adGroupId" type="xsd:int"/>
  <element name="adType" nillable="true" minOccurs="0" type="impl:AdType"/>
  <element name="destinationUrl" nillable="true" minOccurs="0" type="xsd:string"/>
  <element name="disapproved" type="xsd:boolean"/>
  <element name="displayUrl" nillable="true" minOccurs="0" type="xsd:string"/>
  <element name="exemptionRequest" nillable="true" minOccurs="0" type="xsd:string"/>
  <element name="id" type="xsd:long"/>
  <element name="status" nillable="true" minOccurs="0" type="impl:AdStatus"/>
</sequence>

</complexType>

There is no any ''description", "headline1", "headline2", however there is another complexType

<complexType name="TextAd">
    <complexContent>
    <extension base="impl:Ad">
    <sequence>

<element name="description1" nillable="true" type="xsd:string"/>
<element name="description2" nillable="true" type="xsd:string"/>
<element name="headline" nillable="true" type="xsd:string"/>
</sequence>

</extension>
</complexContent>
</complexType>

So, the thing is when you are working with php_soap be aware of complexType extensions which does not work in php_soap when you try to do things like:

<?php

$client = new
    SoapClient(
       "https://adwords.google.com/api/adwords/v11/AdService?wsdl",
        array(  'trace'      => true,
                'exceptions' => true,
             )

    );

$entropy     = substr(md5(rand(0, time())), 0, 10);
//create Ad test structure
$sample_ad =  array(
               "id" => 0,
               "adGroupId" => 0,
               "adType" => 'TextAd',
               "disapproved" => false,
               "destinationUrl" => 'http://test.com',
               "displayUrl" => 'www.Test.com',
               "status" => "Paused", //  Enabled / Disabled
               "descr_iption1" => 'D1_'.$entropy,
               "des_cription2" => 'D2_'.$entropy,
               "head_line" => 'H_'.$entropy
        );

$client->addAds(array('ads' => array($sample_ad) );
?>
Samil Abud 19-Dec-2007 12:00
Hi,
This is a good example, for the SOAP function "__call".
However it is deprecated.

<?php
$wsdl = "http://webservices.tekever.eu/ctt/?wsdl";
$int_zona = 5;
$int_peso = 1001;
$cliente = new SoapClient($wsdl);
print "<p>Envio Internacional: ";
$vem = $cliente->__call('CustoEMSInternacional',array($int_zona, $int_peso));
print $vem;
print "</p>";
?>


Constructeur SoapClient

  • « SoapClient::__call
  • SoapClient::__doRequest »
  • PHP Manual
  • SoapClient
  • Constructeur SoapClient

SoapClient::__construct

(PHP 5, PHP 7, PHP 8)

SoapClient::__construct — Constructeur SoapClient

Description

public SoapClient::__construct ( string|null $wsdl , array $options = [] )

Ce constructeur crée des objets SoapClient dans le mode WSDL ou non-WSDL.

Liste de paramètres

wsdl

URI du fichier WSDL ou null s'il travaille en mode non-WSDL.

Note:

Durant le stage de développement, vous devriez vouloir désactiver le cache WSDL via l'option de configuration soap.wsdl_cache_ttl de votre php.ini, sinon, les modifications faites sur le fichier WSDL n'auront aucun effet tant que le cache soap.wsdl_cache_ttl n'aura pas expiré.

options

Un tableau d'options. Si l'on travaille en mode WSDL, ce paramètre est optionnel. En mode non-WSDL, Les options location et uri doivent être définies, où location est l'URL du serveur SOAP vers lequel la requête est envoyée, et uri est l'espace de noms cible du service SOAP.

Les options style et use ne fonctionnent que dans le mode non-WSDL. En mode WSDL, ils viennent du fichier WSDL.

L'option soap_version doit valoir la constante SOAP_1_1 ou la constante SOAP_1_2 pour sélectionner, respectivement, SOAP 1.1 ou SOAP 1.2. Si omis, SOAP 1.1 sera utilisé.

Pour les identifications HTTP, vous devez utiliser les options login et password. Pour effectuer une connexion HTTP via un proxy, utilisez les options proxy_host, proxy_port, proxy_login et proxy_password. Pour les identifications à l'aide d'un certificat d'un client HTTPS, utilisez les options local_cert et passphrase. Une authentification peut être spécifiée dans l'option authentication. La méthode d'authentification peut être SOAP_AUTHENTICATION_BASIC (par défaut) ou SOAP_AUTHENTICATION_DIGEST.

L'option compression permet d'utiliser la compression sur les requêtes et les réponses HTTP SOAP.

L'option encoding définit le jeu d'encodage des caractères internes. Cette option ne modifie pas l'encodage des requêtes SOAP (il est toujours utf-8), mais convertit les chaînes en utilisant ce dernier.

L'option trace active le suivi des requêtes pour permettre le retraçage des défauts. false par défaut.

L'option classmap peut être utilisée pour lier quelques types WSDL avec des classes PHP. Cette option doit être un tableau avec les types WSDL en tant que clés et les noms des classes PHP en tant que valeurs.

Définir l'option trace active l'utilisation des méthodes

 SoapClient->__getLastRequest,

 SoapClient->__getLastRequestHeaders,

 SoapClient->__getLastResponse et

 SoapClient->__getLastResponseHeaders.

L'option exceptions est un booléen définissant si les erreurs SOAP doivent lancer des exceptions du type SoapFault..

L'option connection_timeout définit le délai de connexion en secondes pour la connexion au service SOAP. Cette option ne définit pas un délai de connexion pour les services avec des réponses lentes. Pour limiter la durée d'attente de fin des appels, l'option default_socket_timeout est disponible.

L'option typemap est un tableau dont les clés sont type_name, type_ns (URI de l'espace de noms), from_xml (fonction de rappel acceptant un paramètre de type chaîne) et to_xml (fonction de rappel acceptant un paramètre de type objet).

L'option cache_wsdl est une constante parmi WSDL_CACHE_NONE, WSDL_CACHE_DISK, WSDL_CACHE_MEMORY ou WSDL_CACHE_BOTH.

L'option user_agent spécifie la chaîne à utiliser dans l'en-tête User-Agent.

L'option stream_context est une ressource de contexte.

L'option features est un masque représentant les constantes SOAP_SINGLE_ELEMENT_ARRAYS, SOAP_USE_XSI_ARRAY_TYPE et, SOAP_WAIT_ONE_WAY_CALLS.

L'option keep_alive est un booléen définissant si l'on doit envoyer l'en-tête Connection: Keep-Alive ou l'en-tête Connection: close.

L'option ssl_method est une des constantes suivantes : SOAP_SSL_METHOD_TLS, SOAP_SSL_METHOD_SSLv2, SOAP_SSL_METHOD_SSLv3 ou SOAP_SSL_METHOD_SSLv23.

Erreurs / Exceptions

SoapClient::__construct() génèrera une erreur de type E_ERROR si les options location et uri ne sont pas fournies en mode non-WSDL.

Une exception de type SoapFault sera lancée si l'URI wsdl ne peut être chargée.

Exemples

Exemple #1 Exemple avec SoapClient::__construct()

<?php

$client = new SoapClient("some.wsdl");

$client = new SoapClient("some.wsdl", array('soap_version'   => SOAP_1_2));

$client = new SoapClient("some.wsdl", array('login'          => "some_name",
                                            'password'       => "some_password"));

$client = new SoapClient("some.wsdl", array('proxy_host'     => "localhost",
                                            'proxy_port'     => 8080));

$client = new SoapClient("some.wsdl", array('proxy_host'     => "localhost",
                                            'proxy_port'     => 8080,
                                            'proxy_login'    => "some_name",
                                            'proxy_password' => "some_password"));

$client = new SoapClient("some.wsdl", array('local_cert'     => "cert_key.pem"));

$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
                                     'uri'      => "http://test-uri/"));

$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
                                     'uri'      => "http://test-uri/",
                                     'style'    => SOAP_DOCUMENT,
                                     'use'      => SOAP_LITERAL));

$client = new SoapClient("some.wsdl",
  array('compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP));

$client = new SoapClient("some.wsdl", array('encoding'=>'ISO-8859-1'));

class MyBook {
    public $title;
    public $author;
}

$client = new SoapClient("books.wsdl", array('classmap' => array('book' => "MyBook")));

?>

User Contributed Notes

There are no user contributed notes for this page.


Exécute une requête SOAP

  • « SoapClient::__construct
  • SoapClient::__getCookies »
  • PHP Manual
  • SoapClient
  • Exécute une requête SOAP

SoapClient::__doRequest

(PHP 5, PHP 7, PHP 8)

SoapClient::__doRequest — Exécute une requête SOAP

Description

public SoapClient::__doRequest ( string $request , string $location , string $action , int $version , bool $oneWay = false ) : string|null

Exécute une requête SOAP.

Cette méthode peut être écrasée dans les sous-classes pour implémenter différents transporteurs, effectuer des opérations XML supplémentaires ou toute autre chose.

Liste de paramètres

request

La requête SOAP en XML.

location

L'URL de la requête.

action

L'action SOAP.

version

La version SOAP.

oneWay

Si one_way prend la valeur de 1, cette méthode ne retourne rien. Utilisez cette valeur quand une réponse n'est pas attendue.

Valeurs de retour

La réponse SOAP en XML.

Historique

Version | Description
8.0.0 | The type of oneWay is booléen now; formerly it was entier.

Exemples

Exemple #1 Exemple avec SoapClient::__doRequest()

<?php
function Add($x,$y) {
  return $x+$y;
}

class LocalSoapClient extends SoapClient {

  function __construct($wsdl, $options) {
    parent::__construct($wsdl, $options);
    $this->server = new SoapServer($wsdl, $options);
    $this->server->addFunction('Add');
  }

  function __doRequest($request, $location, $action, $one_way = 0) {
    ob_start();
    $this->server->handle($request);
    $response = ob_get_contents();
    ob_end_clean();
    return $response;
  }

}

$x = new LocalSoapClient(NULL,array('location'=>'test://',
                                   'uri'=>'http://testuri.org'));
var_dump($x->Add(3,4));
?>

User Contributed Notes

tschallacka 22-Mar-2016 02:01
I just wanted to note in plain english how to build up this request, because I made some assumptions by just misterpreting the parameters.

This is for future reference(for myself) and others that might end up a bit mistified by just not understanding the finesses of soap and are trying to learn.

    $this->__doRequest(string $request , string $location , string $action , int $version [, int $one_way = 0 ] );

$request = The XML Soap enveloppe
$location = The url to the WSDL file. No matter that you defined this before when setting up the object, you need to reuse it here.
$action = the soap action to be performed. This is defined in the wsdl file and can be in the form of a single form or an url. it's just a parameter and might not be an actual valid url
$version = SOAP_1_1 =  content headers (Content-Type: text/xml; CHARSET=Windows-1252?)
                  SOAP_1_2 = content headers (Content-Type: application/soap+xml; CHARSET=Windows-1252; action="somesoapaction defined in $action")

If you send a SOAP_1_2 request to a SOAP_1_1 server you might get a reply in the following form

    HTTP/1.1 415 Cannot process the message because the content type 'application/soap+xml; CHARSET=Windows-1252; action="somesoapaction defined in $action"' was not the expected type 'text/xml; CHARSET=Windows-1252'.

You need to switch down to SOAP_1_1 in that case to get the proper formatting the server can understand
tbernard at qcsupply dot com 02-Feb-2015 05:08
If you're having trouble connecting to an authenticated SOAP service there's something important to note here.

__doRequest() is only used when a SOAPClient function is called, NOT when the WSDL if fetched and parsed.  That means if your WSDL file is not publicly accessible but also resides behind your authentication it won't be accessible by default.  Instead you'll have to create an overloaded stream wrapper and register it for whatever protocol (probably HTTP) you'll be using.
darren dot yee at emc dot com 13-Mar-2013 10:45
Note when extending __doRequest, calling __getLastRequest will probably report incorrect information unless you make sure to update the internal __last_request variable. Save yourself some headaches.

function __doRequest($request, $location, $action, $version) {
      $request = preg_replace('/abc/', 'def', $request);
      $ret = parent::__doRequest($request, $location, $action, $version);
      $this->__last_request = $request;
      return $ret;
}
alireza dot meskin at gmail 02-Apr-2012 12:29
Change Blocking mode for Socket stream and set Timeout for Soap requests

<?php

class TimeoutSoapClient extends SoapClient
{
    const TIMEOUT = 20;
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
        $url_parts = parse_url($location);
        $host = $url_parts['host'];
        $http_req = 'POST '.$location.' HTTP/1.0'."\r\n";
        $http_req .= 'Host: '.$host."\r\n";
        $http_req .= 'SoapAction: '.$action."\r\n";
        $http_req .= "\r\n";
        $http_req .= $request;
        $port = 80;
        if ($url_parts['scheme'] == 'https')
        {
            $port = 443;
            $host = 'ssl://'.$host;
        }
        $socket = fsockopen($host, $port);
        fwrite($socket, $request);
        stream_set_blocking($socket, false);
        $response = '';
        $stop = microtime(true) + self::TIMEOUT;
        while (!feof($socket))
        {
            $response .= fread($socket, 2000);
            if (microtime(true) > $stop)
            {
                throw new SoapFault('Client', 'HTTP timeout');
            }
        }
        return $response;
    }
}
bwhitehead at tableausoftware dot no dot com dot spam 12-Aug-2011 02:49
Note that the SoapClient.__doRequest() method circumvents the throwing of SoapFault exceptions.

Specifically, if you call the __doRequest() method and it fails, it would normally throw a SoapFault exception.  However, the __doRequest() method doesn't actually throw the exception. Instead, the exception is saved in a class attribute called SoapFault.__soap_fault, and is actually thrown AFTER the __doRequest method completes (but the call stack will show that the exception was created inside the __doRequest method.

I successfully used the following code to query the locally cached exception object that was not thrown:

<?php
$exception = null;
try {
    $result = parent::__doRequest($request, $location, $action, $version, $one_way);
}
catch (SoapFault $sf) {
    //this code was not reached
    $exception = $sf;
}
catch (Exception $e) {
    //nor was this code reached either
    $exception = $e;
}
if((isset($this->__soap_fault)) && ($this->__soap_fault != null)) {
    //this is where the exception from __doRequest is stored
    $exception = $this->__soap_fault;
}

//decide what to do about the exception here
// [enter code here]
//or throw the exception
if($exception != null) {
    throw $exception;
}
//note: you may want to unset the __soap_fault value if you don't want it thrown again up the call stack
?>
psfere at hotmail dot com 21-Sep-2010 09:52
I was needing to add a blank soap header (<SOAP-ENV:Header /> and found no other place that has done this.  The only way I was able to support this was to extend SoapClient and re-define __doRequest.  Hope this helps someone or if there is support for this in the library, please point me in the right direction:

<?php
class MySoapCli extends SoapClient {
  function __doRequest($request, $location, $action, $version) {
    $dom = new DomDocument('1.0', 'UTF-8');
    $dom->preserveWhiteSpace = false;
    $dom->loadXML($request);
    $hdr = $dom->createElementNS('http://schemas.xmlsoap.org/soap/envelope/', 'SOAP-ENV:Header');
    $dom->documentElement->insertBefore($hdr, $dom->documentElement->firstChild);
    $request = $dom->saveXML();
    return parent::__doRequest($request, $location, $action, $version);
  }
}
?>
lepidosteus 19-Nov-2009 02:59
If you happen to get an error during your request which says "SOAP-ERROR: Encoding: Can't decode apache map, only Strings or Longs are allowd as keys", the reason seems to be the response xml using integer for keys and php failling to understand them

Here is something that worked for me (converts integer keys to strings):

<?php
class mySoap extends SoapClient
{
    public function __doRequest($request, $location, $action, $version)
    {
        $result = parent::__doRequest($request, $location, $action, $version);
        $result = str_replace('<key xsi:type="xsd:int">', '<key xsi:type="xsd:string">', $result);
        return $result;
    }
}

// $soap = new mySoap(...
?>
Artur Graniszewski 08-Nov-2009 04:35
Beware of PHP incosistent behaviour in __doRequest() method. It seems that some arguments passed to this method are passed by reference!

If you try to create your own __doRequest() method and store it's arguments as SoapClient properties you will find that after __soapCall all of them will be null or unknown.

<?php
    protected $__soapAction = '';

    public function __doRequest($request, $location, $action, $version, $oneWay = 0) {
        ob_start();
        $this->server->handle($request);
        $response = ob_get_contents();
        ob_end_clean();
        $this->__soapAction = $action;
        return $response;
    }
?>

In above example $this->__soapAction will be null after $obj->__soapCall()..

To store $action value, you must cast it to a string (so PHP will be forced to create a new variable with different memory pointer):

<?php
    public function __doRequest($request, $location, $action, $version, $oneWay = 0) {
        ob_start();
        $this->server->handle($request);
        $response = ob_get_contents();
        ob_end_clean();
        $this->__soapAction = (string)$action;
        return $response;
    }
?>
james dot ellis at gmail dot com 04-Feb-2008 04:12
If your application interacts with SOAP services and you wish to cache the responses for consumption later, then overriding SoapClient::__doRequest is the way to go.

For instance, if you know that the information presented doesn't change that often and you don't want to do a superfluous HTTP request, you can grab a response from a local cache and let SoapClient do the transformation to PHP data types.

<?php
class YourNamespace_SoapClient_Local extends SoapClient {
    protected $cacheDocument = "";
    public function __construct($wsdl, $options) {
        parent::__construct($wsdl, $options);
    }

    /**
     * SetCacheDocument() sets the previously cached document contents
     */
    public function SetCacheDocument($document) {
        $this->cacheDocument = $document;
    }

    /**
     * __doRequest() overrides the standard SoapClient to handle a local request
     */
    public function __doRequest() {
        return $this->cacheDocument;
    }
}

//---- code snippet showing usage within a class
//$document is a cached SOAP response document from a previous request, saved with SoapClient::__getLastResponse() to some cache somewhere
//for the purpose of this example, it is assumed that $this->wsdl, $this->options, $this->method and $this->params are set.

public function SoapRequest($document) {
    $method = $this->method;
    if($document == "") {
        //uncached
        try {
            //default options
            $client = new SoapClient($this->wsdl, $this->options);
            $result = $client->$method($this->params);
            //send the response to the cache
            $this->CacheResponse($client->__getLastResponse());
        } catch(SoapFault $fault) {
            //log something
            return FALSE;
        }
    } else {
        //cached document
        try {
            /**
             * the WSDL needs to be set to allow the method to be called on the client object
             * and to trigger SoapClient to decode the response to native data types
             */
            $client = new YourNamespace_SoapClient_Local($this->wsdl, $this->options);
            $client->SetCacheDocument($document);
            $result = $client->$method($this->params);
        } catch (SoapFault $fault) {
            //log something
            return FALSE;
        }
    }
    return $result;
}
?>

I'll leave you to work out the caching, plenty of options there.. ;)
albert at jool dot nl 26-Mar-2007 06:28
If you want to communicate with a default configured ASP.NET server with SOAP 1.1 support, override your __doRequest with the following code. Adjust the namespace parameter, and all is good to go.

<?php
class MSSoapClient extends SoapClient {

    function __doRequest($request, $location, $action, $version) {
        $namespace = "http://tempuri.com";

        $request = preg_replace('/<ns1:(\w+)/', '<$1 xmlns="'.$namespace.'"', $request, 1);
        $request = preg_replace('/<ns1:(\w+)/', '<$1', $request);
        $request = str_replace(array('/ns1:', 'xmlns:ns1="'.$namespace.'"'), array('/', ''), $request);

        // parent call
        return parent::__doRequest($request, $location, $action, $version);
    }
}

$client = new MSSoapClient(...);
?>

Hope this will save people endless hours of fiddling...
jfitz at spacelink dot com 05-Dec-2006 09:56
Note that __getLastRequest() data are buffered _before_ the call to __doRequest().  Thus any modifications you make to the XML while in __doRequest() will not be visible in the output of __getLastRequest().   This is so in at least v5.2.0
06-Jul-2006 01:17
Do you have problems with the PHP5 SoapClient when you need to send a request to a service with a ComplexType parameter?

Maybe because my service is build in Delphi with REMObjects SDK 3.0 I had the problems, maybe not. Anyway, this was my remedy:
<?php
$versie = new stdClass();//define a basic class object
$versie->versieID = $aVersie->versieID();//fill it with the exact attributes as your complextype Object in the wsdl is
$versie->versieNummer = $aVersie->versieNummer();
$versie->isActief = $aVersie->isActief();

$soapVersieType = new SoapVar($versie , SOAP_ENC_OBJECT, "Versie", "http://127.0.0.1:8999/SOAP?wsdl"); //create the complex soap type, Versie is the name of my complex type in the wsdl, the latter url beeing the location of my wsdl.

try{
  $result =  $soapClient->BewaarVersie($this->sessieId,$soapVersieType); //BewaarVersie is a function derived from my WSDL with two params.
}
catch(SoapFault $e){
  trigger_error('Something soapy went wrong: '.$e->faultstring,E_USER_WARNING);            }
?>
After some more testing i found out that the conversion to the StdClass() object was not required. My 'Versie' local object has the attributes for the 'Versie' wsdl complex type defined as private vars and give no pain when i create the SoapVar with an instance of the local 'Versie' Object.
metator at netcabo dot pt 20-Oct-2005 04:32
You can use this method to correct the SOAP request before sending it, if necessary. You can use the DOM API to accomplish that.

<?php

public ExtendedClient extends SoapClient {

   function __construct($wsdl, $options = null) {
      parent::__construct($wsdl, $options);
   }

   function __doRequest($request, $location, $action, $version) {
      $dom = new DOMDocument('1.0');

      try {

         //loads the SOAP request to the Document
         $dom->loadXML($request);

      } catch (DOMException $e) {
         die('Parse error with code ' . $e->code);
      }

      //create a XPath object to query the request
      $path = new DOMXPath($dom);

      //search for a node
      $nodesToFix = $path->query('//SOAP-ENV:Envelope/SOAP-ENV:Body/path/to/node');

      //check if nodes are ok
      $this->checkNodes($path, $nodesToFix);

      //save the modified SOAP request
      $request = $dom->saveXML();

      //doRequest
      return parent::__doRequest($request, $location, $action, $version);
   }

   function checkNodes(DOMXPath $path, DOMNodeList $nodes) {
      //iterate through the node list
      for ($i = 0; $ < $nodes->length; $i++) {
         $aNode = $nodes->item($i);

         //just an example
         if ($node->nodeValue == null) {
            //do something. For instance, let's remove it.
            $node->parentNode->removeChild($node);
         }
      }
   }
}
?>

This gives the developer the chance to solve interoperability problems with a web service.


Get list of cookies

  • « SoapClient::__doRequest
  • SoapClient::__getFunctions »
  • PHP Manual
  • SoapClient
  • Get list of cookies

SoapClient::__getCookies

(PHP 5 >= 5.4.30, PHP 7, PHP 8)

SoapClient::__getCookies — Get list of cookies

Description

public SoapClient::__getCookies ( ) : array

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Retourne une liste de fonctions SOAP publiées

  • « SoapClient::__getCookies
  • SoapClient::__getLastRequest »
  • PHP Manual
  • SoapClient
  • Retourne une liste de fonctions SOAP publiées

SoapClient::__getFunctions

(PHP 5, PHP 7, PHP 8)

SoapClient::__getFunctions — Retourne une liste de fonctions SOAP publiées

Description

public SoapClient::__getFunctions ( ) : array|null

SoapClient::__getFunctions() retourne un tableau de fonctions SOAP publiées décrites dans le WSDL.

Note:

Cette fonction n'est disponible qu'en mode WSDL.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Le array de fonctions SOAP avec le type de retour, le nom de la fonction et les types des paramètres qu'accepte celle-ci.

Exemples

Exemple #1 Exemple avec SoapClient::__getFunctions()

<?php
$client = new SoapClient('http://soap.amazon.com/schemas3/AmazonWebServices.wsdl');
var_dump($client->__getFunctions());
?>

L'exemple ci-dessus va afficher :

array(26) {
  [0]=>
  string(70) "ProductInfo KeywordSearchRequest(KeywordRequest $KeywordSearchRequest)"
  [1]=>
  string(79) "ProductInfo TextStreamSearchRequest(TextStreamRequest $TextStreamSearchRequest)"
  [2]=>
  string(64) "ProductInfo PowerSearchRequest(PowerRequest $PowerSearchRequest)"
...
  [23]=>
  string(107) "ShoppingCart RemoveShoppingCartItemsRequest(RemoveShoppingCartItemsRequest $RemoveShoppingCartItemsRequest)"
  [24]=>
  string(107) "ShoppingCart ModifyShoppingCartItemsRequest(ModifyShoppingCartItemsRequest $ModifyShoppingCartItemsRequest)"
  [25]=>
  string(118) "GetTransactionDetailsResponse GetTransactionDetailsRequest(GetTransactionDetailsRequest $GetTransactionDetailsRequest)"
}

Voir aussi

  • SoapClient::__construct() - Constructeur SoapClient

User Contributed Notes

jvanoort at simplexis dot nl 05-Jan-2016 03:32
_getFunctions can return null, not only array. This happens if the WSDL has not been parsed yet. This may be helpful to someone debugging, just like I was a few minutes ago when writing an extension to SoapClient.
Beebs 13-Nov-2013 02:26
The following code works for me while it appears soap.amazon.com has been deprecated and taken out of service. http://webservices.amazon.com has replaced Amazon's SOAP.

<?php
$client = new SoapClient('http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl');
var_dump($client->__getFunctions());
?>
hasegeli at arebt dot com 02-Jun-2009 12:19
This function did not work if schema is not in wsdl file.


Retourne la dernière requête SOAP

  • « SoapClient::__getFunctions
  • SoapClient::__getLastRequestHeaders »
  • PHP Manual
  • SoapClient
  • Retourne la dernière requête SOAP

SoapClient::__getLastRequest

(PHP 5, PHP 7, PHP 8)

SoapClient::__getLastRequest — Retourne la dernière requête SOAP

Description

public SoapClient::__getLastRequest ( ) : string|null

Retourne le code XML de la dernière requête SOAP émise.

Note:

Cette méthode fonctionne uniquement si l'objet SoapClient a été créé avec l'option trace configuré à true.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

La dernière requête SOAP, sous forme de chaîne de code XML.

Exemples

Exemple #1 Exemple avec SoapClient::__getLastRequest()

<?php
$client = new SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "REQUEST:\n" . $client->__getLastRequest() . "\n";
?>

Voir aussi

  • SoapClient::__getLastRequestHeaders() - Retourne les en-têtes de la dernière requête SOAP
  • SoapClient::__getLastResponse() - Retourne la dernière réponse SOAP
  • SoapClient::__getLastResponseHeaders() - Retourne les en-têtes de la dernière réponse SOAP

User Contributed Notes

hejdavladislav at gmail dot com 15-Sep-2016 10:20
Note that when you create SoapClient with option "trace" set to FALSE or omit it, than "__getLastRequest()" always returns NULL.
LZhang 11-Jul-2014 08:22
Creating an xml file and link to the file is my way.

$outputxml = '/output.xml';

file_put_contents($_SERVER['DOCUMENT_ROOT'] . $outputxml, $client->__getLastRequest());

echo '<a href="' . $outputxml . '">here</a>';
mayurvirkar at gmail dot com 09-Sep-2013 08:37
Just to make it a bit more readable

echo "REQUEST:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastRequest())) . "\n";
echo "Response:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastResponse())) . "\n";

PS: If you are using \n then you need to enclose above statements in <pre>. You can also use <br />, but it gets a bit messy.
Anonymous 26-Jan-2010 01:32
Adding htmlentities() can be helpful since it makes the XML visible in your browser without needing to view the source.

<?php

echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n";

?>
Ersin DOGAN 12-Apr-2009 10:40
I guess many peoples calls getLastRequest and it returns nothing. "Heey where is the my last request". Now we will see our request,  when you created a SoapClient instance, you should give a option parameter as below :

<?php
// below $option=array('trace',1);
// correct one is below
$option=array('trace'=>1);

$client=new SoapClient('some.wsdl',$option);

try{
  $client->aMethodAtRemote();
}catch(SoapFault $fault){
  // <xmp> tag displays xml output in html
  echo 'Request : <br/><xmp>',
  $client->__getLastRequest(),
  '</xmp><br/><br/> Error Message : <br/>',
  $fault->getMessage();
}
?>

"trace" parameter enables output of request. Now, you should see SOAP request.
Omar Nabil 12-Nov-2008 06:14
the getLastResult function doesn't require that the server answers.
as my browser handled and hided the xml code I thought the function doesn't return the last request


Retourne les en-têtes de la dernière requête SOAP

  • « SoapClient::__getLastRequest
  • SoapClient::__getLastResponse »
  • PHP Manual
  • SoapClient
  • Retourne les en-têtes de la dernière requête SOAP

SoapClient::__getLastRequestHeaders

(PHP 5, PHP 7, PHP 8)

SoapClient::__getLastRequestHeaders — Retourne les en-têtes de la dernière requête SOAP

Description

public SoapClient::__getLastRequestHeaders ( ) : string|null

Retourne les en-têtes de la dernière requête SOAP

Note:

Cette fonction n'est disponible que si l'objet SoapClient a été créé avec l'option trace à true

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Les dernieres entêtes SOAP.

Exemples

Exemple #1 SoapClient::__getLastRequestHeaders() example

<?php
$client = SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "REQUEST HEADERS:\n" . $client->__getLastRequestHeaders() . "\n";
?>

Voir aussi

  • SoapClient::__getLastResponseHeaders() - Retourne les en-têtes de la dernière réponse SOAP
  • SoapClient::__getLastRequest() - Retourne la dernière requête SOAP
  • SoapClient::__getLastResponse() - Retourne la dernière réponse SOAP

User Contributed Notes

mischa molhoek 02-Jun-2015 08:48
it seems to me that is does not return the SOAP headers as it states in the explanation, but the request headers....


Retourne la dernière réponse SOAP

  • « SoapClient::__getLastRequestHeaders
  • SoapClient::__getLastResponseHeaders »
  • PHP Manual
  • SoapClient
  • Retourne la dernière réponse SOAP

SoapClient::__getLastResponse

(PHP 5, PHP 7, PHP 8)

SoapClient::__getLastResponse — Retourne la dernière réponse SOAP

Description

public SoapClient::__getLastResponse ( ) : string|null

Retourne le code XML de la dernière réponse SOAP.

Note:

Cette fonction n'est disponible que si l'objet SoapClient a été créé avec l'option trace à true

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

La dernière réponse SOAP, sous forme de chaîne XML.

Exemples

Exemple #1 Exemple avec SoapClient::__getLastResponse()

<?php
$client = SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "Response:\n" . $client->__getLastResponse() . "\n";
?>

Voir aussi

  • SoapClient::__getLastResponseHeaders() - Retourne les en-têtes de la dernière réponse SOAP
  • SoapClient::__getLastRequest() - Retourne la dernière requête SOAP
  • SoapClient::__getLastRequestHeaders() - Retourne les en-têtes de la dernière requête SOAP

User Contributed Notes

mayurvirkar at gmail dot com 09-Sep-2013 08:38
Just to make it a bit more readable

echo "REQUEST:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastRequest())) . "\n";
echo "RESPONSE:\n" . htmlentities(str_ireplace('><', ">\n<", $client->__getLastResponse())) . "\n";

PS: If you are using \n then you need to enclose above statements in <pre>. You can also use <br />, but it gets a bit messy.
bshafs at gmail dot com 22-Jun-2011 12:45
You don't need to surround SoapClient in a try-catch block.  Just set the "exceptions" option to false, and the SoapFault instance will be returned instead of thrown.
ceo at l-i-e dot com 04-Jan-2006 01:31
D'oh!
That example needs:
$soapClient = new SoapClient($url, array('trace'=>1));
to turn ON tracing in the first place.
ceo at l-i-e dot com 04-Jan-2006 01:30
You almost for sure will need to wrap a try/catch block around your SOAP call in order to use these to debug something that's not working.

Otherwise, PHP throws a fatal error before you can execute this function.

For example:
<?php
    $soapClient = new SoapClient($url);
    echo htmlentities($soapClient->__getFunctions());
    //Assume that has output 'someFunction' (among others)
    try {
        $results = $soapClient->someFunction(...);
    }
    catch (SoapFault $soapFault) {
        var_dump($soapFault);
        echo "Request :<br>", htmlentities($soapClient->__getLastRequest()), "<br>";
        echo "Response :<br>", htmlentities($soapClient->__getLastResponse()), "<br>";
    }
?>

Without try/catch, your just get the Fatal Error and PHP commits suicide before you can call __getLastRequest/__getLastResponse


Retourne les en-têtes de la dernière réponse SOAP

  • « SoapClient::__getLastResponse
  • SoapClient::__getTypes »
  • PHP Manual
  • SoapClient
  • Retourne les en-têtes de la dernière réponse SOAP

SoapClient::__getLastResponseHeaders

(PHP 5, PHP 7, PHP 8)

SoapClient::__getLastResponseHeaders — Retourne les en-têtes de la dernière réponse SOAP

Description

public SoapClient::__getLastResponseHeaders ( ) : string|null

Retourne les entêtes de la dernière réponse SOAP.

Note:

Cette fonction n'est disponible que si l'objet SoapClient a été créé avec l'option trace à true

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Les en-têtes de la dernière réponse SOAP.

Exemples

Exemple #1 Exemple avec SoapClient::__getLastResponseHeaders()

<?php
$client = SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "RESPONSE HEADERS:\n" . $client->__getLastResponseHeaders() . "\n";
?>

Voir aussi

  • SoapClient::__getLastRequestHeaders() - Retourne les en-têtes de la dernière requête SOAP
  • SoapClient::__getLastRequest() - Retourne la dernière requête SOAP
  • SoapClient::__getLastResponse() - Retourne la dernière réponse SOAP

User Contributed Notes

noncey 30-Sep-2015 12:33
For long running scripts which may be set to a longer timeout in the PHP script, be aware that the IIS connection timeout settings do not restart when you initiate a SOAP call even though you are using a new web address than your current running script.

Because of this, we noted a SOAP call that seemed to not return headers from a Web Service. It was found to be related to IIS timing out. This was in IIS 7.5. The resolution was to increase the connection timeout for IIS at the website/domain level.

There were no faults or exceptions captured when this occurred so your only indicator is that you have no header information.
jeroen{at}asystance{dot}nl 17-Aug-2009 03:20
Note SoapClient does not wait for a response for one-way operations (i.e. <wsdl:operation>s that do not have a <wsdl:response>)! To see if a request failed, use
$sc = new SoapClient( 'some.wsdl', array('features'=>SOAP_WAIT_ONE_WAY_CALLS));

See http://bugs.php.net/bug.php?id=36083 and http://bugs.php.net/bug.php?id=49278


Retourne une liste des types SOAP

  • « SoapClient::__getLastResponseHeaders
  • SoapClient::__setCookie »
  • PHP Manual
  • SoapClient
  • Retourne une liste des types SOAP

SoapClient::__getTypes

(PHP 5, PHP 7, PHP 8)

SoapClient::__getTypes — Retourne une liste des types SOAP

Description

public SoapClient::__getTypes ( ) : array|null

SoapClient::__getTypes() retourne la liste des types SOAP décrits dans le fichier WSDL du service Web courant.

Note:

Cette fonction n'est disponible qu'en mode WSDL.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un array de types SOAP détaillant toutes les structures et les types

Exemples

Exemple #1 Exemple avec SoapClient::__getTypes()

<?php
$client = new SoapClient("http://soap.amazon.com/schemas3/AmazonWebServices.wsdl");
var_dump($client->__getTypes());
?>

L'exemple ci-dessus va afficher :

array(88) {
  [0]=>
  string(30) "ProductLine ProductLineArray[]"
  [1]=>
  string(85) "struct ProductLine {
 string Mode;
 string RelevanceRank;
 ProductInfo ProductInfo;
}"
  [2]=>
  string(105) "struct ProductInfo {
 string TotalResults;
 string TotalPages;
 string ListName;
 DetailsArray Details;
}"
...
  [85]=>
  string(32) "ShortSummary ShortSummaryArray[]"
  [86]=>
  string(121) "struct GetTransactionDetailsRequest {
 string tag;
 string devtag;
 string key;
 OrderIdArray OrderIds;
 string locale;
}"
  [87]=>
  string(75) "struct GetTransactionDetailsResponse {
 ShortSummaryArray ShortSummaries;
}"
}

Voir aussi

  • SoapClient::__construct() - Constructeur SoapClient

User Contributed Notes

felipe dot cwb at hotmail dot com 21-Jul-2014 06:50
<?php
// to see formated types

$soap = new SoapClient('http://domain.com/ws.php?WSDL');

echo '<pre>';
echo '<h2>Types:</h2>';
$types = $soap->__getTypes();
foreach ($types as $type) {
    $type = preg_replace(
        array('/(\w+) ([a-zA-Z0-9]+)/', '/\n /'),
        array('<font color="green">${1}</font> <font color="blue">${2}</font>', "\n\t"),
        $type
    );
    echo $type;
    echo "\n\n";
}
echo '</pre>';


Définit un cookie pour les requêtes SOAP

  • « SoapClient::__getTypes
  • SoapClient::__setLocation »
  • PHP Manual
  • SoapClient
  • Définit un cookie pour les requêtes SOAP

SoapClient::__setCookie

(PHP 5 >= 5.0.4, PHP 7, PHP 8)

SoapClient::__setCookie — Définit un cookie pour les requêtes SOAP

Description

public SoapClient::__setCookie ( string $name , string|null $value = null ) : void

Définit le cookie qui sera envoyé avec la requête SOAP.

Note:

L'appel à cette méthode affectera tous les appels suivants aux méthodes SoapClient.

Liste de paramètres

name

Le nom du cookie.

value

La valeur du cookie. Si non spécifié, le cookie sera effacé.

Valeurs de retour

Aucune valeur n'est retournée.

Historique

Version | Description
8.0.0 | value is now nullable.

User Contributed Notes

Jaygiri Goswami 17-Dec-2011 01:22
You can access the cookies sent by SOAP server using $client->_cookies

Most you need to send session cookies back to server.
lukasz at szostak dot biz 14-Aug-2006 10:53
On the server side you can access the cookie via $_COOKIE['cookie_name'].

Also remember that since HTTP is a stateless protocol, you have to send the cookie with every single SOAP call in order for it to be visible at server site.

It seems obvious but might save one a lot of time.


Configure l'URL du service Web à utiliser

  • « SoapClient::__setCookie
  • SoapClient::__setSoapHeaders »
  • PHP Manual
  • SoapClient
  • Configure l'URL du service Web à utiliser

SoapClient::__setLocation

(PHP 5 >= 5.0.4, PHP 7, PHP 8)

SoapClient::__setLocation — Configure l'URL du service Web à utiliser

Description

public SoapClient::__setLocation ( string $location = "" ) : string|null

Configure l'URL cible, à qui seront envoyés les requêtes SOAP. Ce revient à spécifier l'option location lors de la construction du client SoapClient.

Note:

Cette méthode est optionnelle. SoapClient utilise l'URL indiquée dans le fichier WDSL par défaut.

Liste de paramètres

location

La nouvelle URL.

Valeurs de retour

L'ancienne URL.

Exemples

Exemple #1 Exemple avec SoapClient::__setLocation()

<?php
$client = new SoapClient('http://example.com/webservice.php?wsdl');

$client->__setLocation('http://www.somethirdparty.com');

$old_location = $client->__setLocation(); // unsets the location option

echo $old_location;

?>

Résultat de l'exemple ci-dessus est similaire à :

http://www.somethirdparty.com

Voir aussi

  • SoapClient::__construct() - Constructeur SoapClient

User Contributed Notes

maoneid at gmail dot com 24-May-2018 07:24
for some cases , ignoring location from initialization throw exception

PHP Fatal error:  Uncaught SoapFault exception: [HTTP] Could not connect to host

Better call and define the end point location manually.


Ajoute un en-tête SOAP pour les requêtes suivantes

  • « SoapClient::__setLocation
  • SoapClient::__soapCall »
  • PHP Manual
  • SoapClient
  • Ajoute un en-tête SOAP pour les requêtes suivantes

SoapClient::__setSoapHeaders

(PHP 5 >= 5.0.5, PHP 7, PHP 8)

SoapClient::__setSoapHeaders — Ajoute un en-tête SOAP pour les requêtes suivantes

Description

public SoapClient::__setSoapHeaders ( SoapHeader|array|null $headers = null ) : bool

Définit un en-tête à utiliser dans les requêtes SOAP.

Note:

Cette méthode va remplacer la valeur précédente.

Liste de paramètres

headers

L'en-tête à configurer. Il peut être un objet SoapHeader ou un tableau d'objetcs SoapHeader. Si ce paramètre n'est pas spécifié ou défini à null, les en-têtes seront supprimés.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec SoapClient::__setSoapHeaders()

<?php

$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
                                     'uri'      => "http://test-uri/"));
$header = new SoapHeader('http://soapinterop.org/echoheader/',
                            'echoMeStringRequest',
                            'hello world');

$client->__setSoapHeaders($header);

$client->__soapCall("echoVoid", null);
?>

Exemple #2 Configuration d'en-têtes multiples pour SOAP

<?php

$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
                                     'uri'      => "http://test-uri/"));
$headers = array();

$headers[] = new SoapHeader('http://soapinterop.org/echoheader/',
                            'echoMeStringRequest',
                            'hello world');

$headers[] = new SoapHeader('http://soapinterop.org/echoheader/',
                            'echoMeStringRequest',
                            'hello world again');

$client->__setSoapHeaders($headers);

$client->__soapCall("echoVoid", null);
?>

User Contributed Notes

mlconnor at yahoo dot com 11-Nov-2010 01:28
Does anyone know how to get the response headers?  The getLastResponseHeader returns a string response, not the complex object I was expecting...
peamik1953 at NOSPAM dot btinternet dot com 12-Jul-2010 11:06
You cannot add an additional header. If you want two headers, and one already exists, first delete it with $client->__setSoapHeaders(NULL). Then issue $client->__setSoapHeaders($headers) where $headers is an array of soapHeader() objects.
kedar dot purohit @ mavs dot uta dot edu 10-Sep-2009 12:58
To create complex SOAP Headers, you can do something like this:

Required SOAP Header:

<soap:Header>
    <RequestorCredentials xmlns="http://namespace.example.com/">
      <Token>string</Token>
      <Version>string</Version>
      <MerchantID>string</MerchantID>
      <UserCredentials>
        <UserID>string</UserID>
        <Password>string</Password>
      </UserCredentials>
    </RequestorCredentials>
</soap:Header>

Corresponding PHP code:

<?php

$ns = 'http://namespace.example.com/'; //Namespace of the WS.

//Body of the Soap Header.
$headerbody = array('Token' => $someToken,
                    'Version' => $someVersion,
                    'MerchantID'=>$someMerchantId,
                      'UserCredentials'=>array('UserID'=>$UserID,
                                             'Password'=>$Pwd));

//Create Soap Header.
$header = new SOAPHeader($ns, 'RequestorCredentials', $headerbody);

//set the Headers of Soap Client.
$soap_client->__setSoapHeaders($header);

?>
jayrajput at gmail dot com 30-Mar-2009 01:07
With multiple SOAP headers, when using SoapVar for creation of SoapHeader the PHP code just terminates (command terminated). I am not sure if that is a bug.

Without the SOAPVar the code worked fine for me

There are different way to creart SoapHeader I was using SoapVar and the code was not working. I am still a novice with this SOAP stuff.

Tried using normal strings and it worked fine. SoapHeader can take SoapVar or string as the third argument.

my code:

<?php
// first soap header.
$var = new SoapVar($header, XSD_ANYXML);
$soapHeader = new SoapHeader(NAME_SPACE, "Security", $var);
// second soap header.
$var2 = new SoapVar($header2, XSD_ANYXML);
$soapHeader2 = new SoapHeader(DIFF_NAME_SPACE, "ID", $var2);

$client = new SoapClient($wsdl, array("location" => $location));

$headers = array();
$headers[] = $soapHeader;
$headers[] = $soapHeader2;

// Here my code was just terminating.
$client->__setSoapHeaders($headers);
?>


Appelle une fonction SOAP

  • « SoapClient::__setSoapHeaders
  • SoapServer »
  • PHP Manual
  • SoapClient
  • Appelle une fonction SOAP

SoapClient::__soapCall

(PHP 5, PHP 7, PHP 8)

SoapClient::__soapCall — Appelle une fonction SOAP

Description

public SoapClient::__soapCall ( string $name , array $args , array|null $options = null , SoapHeader|array|null $inputHeaders = null , array &$outputHeaders = null ) : mixed

Ceci est une fonction bas niveau de l'API qui est utilisée pour faire des appels SOAP. Habituellement, en mode WSDL, vous pouvez appeler simplement les fonctions SOAP comme des méthodes SoapClient. Cette méthode est pratique en mode non-WSDL lorsque soapaction est inconnu, uri est différente de la valeur par défaut ou lors de l'envoi et/ou de la réception d'en-têtes SOAP.

En cas d'erreur, un appel à une fonction SOAP peut causer un lancement d'exception par PHP ou retourner un objet SoapFault si les exceptions sont désactivées. Pour vérifier si l'appel à cette fonction n'arrive pas à attraper les exceptions SoapFault, vérifiez le résultat avec la fonction is_soap_fault().

Liste de paramètres

name

Le nom de la fonction SOAP à appeler.

args

Un tableau d'arguments à passer à la fonction. Cela peut être un tableau associatif ou ordonné. Notez que la plupart des serveurs SOAP nécessite des noms de paramètres, auquel cas, ce doit être un tableau associatif.

options

Un tableau associatif d'options à passer au client.

Une option de location pour le service Web distant.

Une option uri avec l'espace de noms cible du service SOAP.

L'option soapaction est l'action à appeler.

inputHeaders

Un tableau d'entêtes à envoyer avec la requête SOAP.

outputHeaders

Si fourni, ce tableau sera rempli avec les entêtes de la réponse SOAP retournée.

Valeurs de retour

Les fonctions SOAP retournent une ou plusieurs valeurs. Si une seule valeur est retournée par la fonction SOAP, la valeur retournée de __soapCall sera une valeur simple (e.g. un entier, une chaîne de caractères, etc.). Si plusieurs valeurs sont retournées, __soapCall retournera un tableau associatif contenant les noms des paramètres affichés.

En cas d'erreur, si l'objet SoapClient a été construit avec l'option exceptions qui valait false, un objet SoapFault sera retourné.

Exemples

Exemple #1 Exemple avec SoapClient::__soapCall()

<?php

$client = new SoapClient("some.wsdl");
$client->SomeFunction($a, $b, $c);

$client->__soapCall("SomeFunction", array($a, $b, $c));
$client->__soapCall("SomeFunction", array($a, $b, $c), NULL,
                    new SoapHeader(), $output_headers);

$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
                                     'uri'      => "http://test-uri/"));
$client->SomeFunction($a, $b, $c);
$client->__soapCall("SomeFunction", array($a, $b, $c));
$client->__soapCall("SomeFunction", array($a, $b, $c),
                    array('soapaction' => 'some_action',
                          'uri'        => 'some_uri'));
?>

Voir aussi

  • SoapClient::__construct() - Constructeur SoapClient
  • SoapParam::__construct() - Constructeur SoapParam
  • SoapVar::__construct() - Constructeur SoapVar
  • SoapHeader::__construct() - Constructeur SoapHeader
  • SoapFault::__construct() - Constructeur SoapFault
  • is_soap_fault() - Vérifie si SOAP retourne une erreur

User Contributed Notes

arturklesun at gmail dot com 10-Aug-2016 06:16
Sharing my experience cuz i believe it is most important for you if you decide to use this Soap Client implementation.

At php 7.0.8 the stdClass generated by SoapClient from the response does not use "minOccurs" and "maxOccurs" WSDL modifiers to distinct properties in stdClass-es (aka keys in "associative arrays") and elements in arrays ("aka indexed arrays").

Instead, the implementation decides whether tag is _a key in associative array_ or _one of elements with same tag in indexed array_ by simply the fact whether there is just one element with such tag in the sequence or many.

Consider alive example from my case:
<?php
response xml:
...
<ValidatingCarrier>
    <Alternate>AA</Alternate>
</ValidatingCarrier>
...
<ValidatingCarrier>
    <Alternate>AA</Alternate>
    <Alternate>AY</Alternate>
</ValidatingCarrier>
...

response structure generated by SoapClient:
...
[ValidatingCarrier] => stdClass Object(
    [Alternate] => AA // here it is a string
)
...
[ValidatingCarrier] => stdClass Object (
    [Alternate] => Array ( // and here this is an array
        [0] => AA
        [1] => AY
    )
)
...

field XSD definition:
<xs:element name="Alternate" type="CarrierCode" minOccurs="0" maxOccurs="24">
?>

You see, the definition in XSD tells us this tag can be repeated up to 24 times, what means it would be an indexed array, but SoapClient does not take that into account and treats the first <Alternate> in example as a value instead of array containing this value.

Undoubtedly, a value should be a property in the stdClass (a key in associative array) _only_ when maxOccurs is 1 or less or not specified (default is 1, see https://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints). Hope this info will be useful for you when you will be implementing your own, correctly working, SoapClient.
ub at sturmundbraem dot ch 11-Jun-2016 12:51
To avoid the SOAP client returning sometimes objects and sometimes arrays of objects, there's a setting:

   $this->soapClient = new \SoapClient($wsdlUrl, array(
    'features' => SOAP_SINGLE_ELEMENT_ARRAYS,
    'trace' => DEBUG_SOAP
   ));
pmeth at softersoftware dot com 12-May-2014 04:44
Note, when trying to overload the __soapCall function, you should not use type hints or STRICT_STANDARDS will complain.
The correct signature is as follows:

<?php
class MySoapClient extends \SoapClient
{
    ...
    public function __soapCall($function_name, $arguments, $options = null, $input_headers = null, &$output_headers = null)
     {
        ...
    }
    ....
}
?>
vb 17-Oct-2012 04:23
Note that calling __soapCall and calling the generated method from WSDL requires specifying parameters in two different ways.

For example, if you have a web service with method login that takes username and password, you can call it the following way:
<?php
$params = array('username'=>'name', 'password'=>'secret');
$client->login($params);
?>

If you want to call __soapCall, you must wrap the arguments in another array as follows:
<?php
$client->__soapCall('login', array($params));
?>
snuufix+nospam at gmail dot com 11-Feb-2011 03:23
I am using SOAP call response headers to sign request results.

After alot of hours, I finally got the best way to get SOAP response headers (other than parsing __getLastResponse() witch requires trace option enabled) is using __soapCall() wrapper.

You can extend SoapClient class and wrap some functions to make sure you get the headers.

<?php

class API extends SoapClient
{

    // ... Constructor, etc.

    // Get SOAP Server response headers
    public function __soapCall($function, $arguments, $options = array(), $input_headers = null, &$output_headers = null)
    {
        parent::__soapCall($function, $arguments, $options, $input_headers, $output_headers);

        print_r($output_headers); // Array of response headers
    }

    // If you are using WSDL you need this, so you still can call functions directly without calling __soapCall manualy
    public function __call($func, $args)
    {
        return $this->__soapCall($func, $args);
    }

?>
niko dot hujanen at gmail dot com 09-Nov-2010 11:06
I was integrating a local warehouse system with a SOAP to our system and noticed some things.

1) Service uses "dot-namespacing" (fe. Item.Price) I classmapped this to Item_Price and used magical __get() and __set() to strip off 'Item.' from variable names. Works like a charm.

Example:
<Item.Price>1.52</Item.Price>

<?php
class Item_Price {
    public $price;
    public function __get($field) { $field = str_replace('Item.', '', $field); return $this->$field; }
    public function __set($field, $value) { $field = str_replace('Item.', '', $field); $this->$field = $value; }
?>

2) I noticed that classmapping a segment with attributes and value is possible. Class uses variables as attributes and $_ is the value.

Example:
<?php
class Foo {
    public $item = 'Bar';
    public $_ = 'Value here';
}
?>
Turns to <Foo item="Bar">Value here</Foo>

Example of using classes with soapcalls:
<?php
    $client = ExtendSoapClient::getInstance();
    $foo = new Foo();
    $response = $client->sendFoo($foo);
?>

Posted these since I think the documentation is lacking and very obsolete. Hopefully someone's burden eases.
james dot ellis at gmail dot com 09-Jun-2010 07:12
If you are using this method, remember that the array of arguments need to be passed in with the ordering being the same order that the SOAP endpoint expects.

e.g
<?php
//server expects: Foo(string name, int age)

//won't work
$args = array(32, 'john');
$out = $client->__soapCall('Foo', $args);

//will work
$args = array('john', 32);
$out = $client->__soapCall('Foo', $args);
?>
lesley at casbah dot com dot au 21-Apr-2009 06:55
If you are calling a weblogic service with a certificate and you are getting this error on the soap method call statement:

[EJB:010160]Security Violation: User: '<anonymous>' has insufficient permission to access EJB: type=<ejb>, application=app2_0_52_3, module=appsejb.jar, ejb=AppMethod, method=AppMethod, methodInterface=Remote, signature={java.lang.String}.

then check the wsdl in the soap open call - it must be https.  Supplied with an http wsdl this took some time to figure out.

<?php
    $client = new SoapClient("https://example.com/AppWs/Service?WSDL",
                array('trace'=>true,
                      'exceptions'=>true,
                      'local_cert' => "/var/www/html/app/newcert.pem",
                      'passphrase' => "thepassphrase"));
    $response = $client->__soapCall("MyMethod", array("param1" => $value1));
?>

Thanks to the authors for their comments on enabling openssl and curl by uncommenting extension=php_opensll.dll and extension=php_curl.dll in php.ini.  Also for Olaf's instructions "append the content of the private key file and the certificate file to a single file". I did this using copy command on the DOS prompt:

copy mycert.pem+mykey.pem newcert.pem
Tim Williams 08-Apr-2009 06:55
One little gotcha when passing the parameters where you need to have attributes and a simpletype value:

To get the xml

<foo bar="moo">cheese</foo>

You'd pass in:

<?php
array("foo" => array("_" => "cheese", "bar"=>"moo"));
?>

See that "_" bit? It really wasn't obvious from the documentation.
deWarlock 02-Apr-2009 04:10
The most annoying thing is that you'll get no warning trying to pass object not matching wsdl e.g. if server expects smth like $Object->expName->... and you would pass $Object->otherName the client will send empty request without notifying you.
Also pay attention that names are key sensitive.

In my case I spent hours trying to pass $Post->Lead->... object instead of $Post->lead-> ...
Shto 03-Mar-2009 03:17
One thing to note.

This happened to me and it took a while until I discovered what the problem was.

I was trying to get .NET objects from a provided web service, however it always seemed to return empty objects. It did return the backbone, but nothing within the objects that made up the structure.

Anyhow, it seems that you have to be very precise with the arrays when calling these functions. Par example, do this:

<?php
$obj = $client->__soapCall($SOAPCall, array('parameters'=>$SoapCallParameters));
?>

meaning that you must put an array as the second argument with 'parameters' as the key and the soap call parameters as the value.

Also make sure that the parameter variable, in my case $SoapCallParameters is in the form of what is requested by the webservice.

So, don't just make an array of the form:
<?php

(
   [0] => 'Mary',
   [1] => 1983
)

?>

but if the webservice requests a 'muid' variable as 'Mary' and a 'birthyear' as 1983, then make your array like this:

<?php

(
   [muid] => 'Mary',
   [birthyear] => 1983
)

?>

The above arrays refer to the $SoapCallParameters variable.

Hope this helps somebody, not having to spend too much time figuring out the problems.
Alejandro Cavallo 19-Mar-2008 07:38
I get the same problem reported above by ryan:
"ryan at grunt dot tv
22-Sep-2005 01:38
If you want to pass an xml document node as a function parameter, your need to create a SoapVar object with a text represention of the xml node and the XSD_ANYXML encoding constant. However, this constant is not exported by the extension and is not documented for some unknown reason."

When defined variable soapVar I assigned the type XSD_STRING rather than as XSD_ANYXML.
And when calls to the function you must pass the soapVar in an associative array.

For example if the function (called myFunc) expect a parameter called xmlInput you should do something like this:
$soapvar = new SoapVar($query, XSD_STRING);
$result = $client->myFunc(array('xmlInput'=>$soapvar));

This XML fragment are wrapped around xmlImput tags.-
stefan at datax dot biz 24-Oct-2007 07:28
The call to __soapCall returned an object to me either. This is the function which makes my life easier:

function obj2array($obj) {
  $out = array();
  foreach ($obj as $key => $val) {
    switch(true) {
        case is_object($val):
         $out[$key] = obj2array($val);
         break;
      case is_array($val):
         $out[$key] = obj2array($val);
         break;
      default:
        $out[$key] = $val;
    }
  }
  return $out;
}

Usage:
...
$response = $client ->__soapCall("track", array('parameters' => $request));
$response = obj2array($response);

Hope it helps.
temp at mailinator dot com 30-Jan-2007 04:43
The options in the third argument is documented in http://php.net/manual/en/function.soap-soapclient-construct.php
paulsjv at gmail dot com 11-Jan-2006 07:44
I was working with SOAP for the first time and I had to create a client that sent a date range to a WSDL (Web Services Description Language) to return some information I needed.  I didn't know how to pass the params and there really was no documentation about it.  The main thing you have to make sure to do is when you pass params to a method that is definied by the WSDL that you are calling is that you use the same param name for the key of the array or the object variable as shown below.  Also, if you don't know what the methods/functions that a WSDL has or the params that you need to pass it you can use the __getFunctions() and __getTypes() methods after you declare your new SoapClient.

<?php
// From and to are the two params that the execute function needs
// when called from the WSDL so make you to have them as the
// key to an array like below
$params["From"] = "06/01/2005"; // also can use $params->From = "date";
$params["to"] = "12/31/2005"; // also can use $params->to = "date";

$client = new SoapClient("some.wsdl");

try {
        print($client->execute($params));
} catch (SoapFault $exception) {
        echo $exception;
}
?>
ryan at grunt dot tv 21-Sep-2005 09:38
If you want to pass an xml document node as a function parameter, your need to create a SoapVar object with a text represention of the xml node and the XSD_ANYXML encoding constant. However, this constant is not exported by the extension and is not documented for some unknown reason.

Therefore, to get this to work you must either register the XSD_ANYXML #define as a PHP constant, or use the integer value of the constant when creating the SoapVar, which is 147.

$soapvar = new SoapVar($xml_text, 147);

$params = array("ItemXml" => $soapvar, "PropertyView" => "blah");
$result = $this->soapclient->__soapCall("SaveItem", array("parameters"=>$params), null, $this->soapheaders);

However, this still doesnt give the correct result. For some reason, the ItemXml parameter node is not wrapped around the associated xml parameter in the soap request, and the following soap is produced (assumming '<item>blah</item>' is used as the $xml_text):

<SOAP-ENV:Envelope xmlns:SOAP-ENV="..." xmlns:ns1="...">
<SOAP-ENV:Header>...</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:SaveItem>
<item>blah</item>
<ns1:PropertyView>blah</ns1:PropertyView>
</ns1:SaveItem>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
DesmondJ 04-May-2005 03:36
Following OrionI's example:

<?php
 $client = new SoapClient("http://server/sumservice.asmx?WSDL");
 $params->a = 2;
 $params->b = 3;
 $objectresult = $client->Sum($params);
 $simpleresult = $objectresult->SumResult;
 print($simpleresult); //produces "-1"
?>

Please note that the lines:

"$client->Sum($params);"

and

"$simpleresult = $objectresult->SumResult;"

are based off of each other. If your web service function is called "Sum", then add "Result" to the end of it to get the results of the call.

EG:

<?php
 $client = new SoapClient("http://server/mathservice.asmx?WSDL");
 $params->a = 2;
 $params->b = 3;
 $objectresult = $client->Minus($params); // note the name of the function is "Minus"
 $simpleresult = $objectresult->MinusResult; // note the name of the result is referenced as "MinusResult"
 print($simpleresult); //produces "5"
?>
OrionI 18-Apr-2005 07:27
Correction on the previously submitted code snippet...the incoming parameter for .NET also has to be in object or array form for it to be correctly converted to the XML form that .NET expects (as already mentioned by Llu?s P?mies). The full example (when using WSDL) should be like this:
<?php
 $client = new SoapClient("http://server/myservice.asmx?WSDL");
 $params->param1 = $value1;
 $params->param2 = $value2;
 $objectresult = $client->MyMethod($params);
 $simpleresult = $objectresult->MyMethodResult;
?>
So if you have a C# function like this:
//sumservice.asmx
...
[WebMethod]
public int Sum(int a, int b)
{
  return a + b;
}
...
The PHP client would be this:
<?php
 $client = new SoapClient("http://server/sumservice.asmx?WSDL");
 $params->a = 2;
 $params->b = 3;
 $objectresult = $client->Sum($params);
 $simpleresult = $objectresult->SumResult;
 print($simpleresult); //produces "5"
?>
OrionI 15-Apr-2005 11:46
When calling over SOAP to a .NET application, you may end up with an object as a result instead of a simple type, even if you're just grabbing a simple type (like a boolean result). Use a property accessor to get the actual result, like this:
<?php
 $client = new SoapClient("http://server/myservice.asmx?WSDL");
 $objectresult = $client->MyMethod($param1, $param2);
 $simpleresult = $objectresult->MyMethodResult;
?>
Note that .NET seems to name the result MethodNameResult for method MethodName.
17-Feb-2005 03:19
If your service is a .NET doc/lit, which means the input message has a single part named 'parameters' that is a structure that wraps the parameters.  Your call should look like this:

<?php

$params = array('param_name_1'=>$val_1,'param_name_2'=>$val_2);
$client->call('MethodName', array('parameters' => $params));

?>


La classe SoapServer

(PHP 5, PHP 7, PHP 8)

Introduction

La classe SoapServer fournit un serveur pour les protocoles » SOAP 1.1 et » SOAP 1.2. Il peut être utilisé avec ou sans fichier de description de service WSDL.

Synopsis de la classe

SoapServer {
/* Méthodes */
public __construct ( string|null $wsdl , array $options = [] )
public addFunction ( array|string|int $functions ) : void
public addSoapHeader ( SoapHeader $header ) : void
public fault ( string $code , string $string , string $actor = "" , mixed $details = null , string $name = "" ) : void
public getFunctions ( ) : array
public handle ( string|null $request = null ) : void
public setClass ( string $class , mixed ...$args ) : void
public setObject ( object $object ) : void
public setPersistence ( int $mode ) : void
}

Sommaire

  • SoapServer::addFunction — Ajoute une ou plusieurs fonctions qui vont gérer les requêtes SOAP
  • SoapServer::addSoapHeader — Ajoute un en-tête SOAP à une réponse
  • SoapServer::__construct — Constructeur SoapServer
  • SoapServer::fault — Emet une erreur SoapServer
  • SoapServer::getFunctions — Retourne la liste des fonctions définies
  • SoapServer::handle — Traite une requête SOAP
  • SoapServer::setClass — Configure la classe qui sera utilisée pour gérer les requêtes SOAP
  • SoapServer::setObject — Configure l'objet qui sera utilisé pour gérer les requêtes SOAP
  • SoapServer::setPersistence — Active le mode persistant de SoapServer

User Contributed Notes

mail at borisd dot ru 08-Feb-2019 12:43
If you want to run dummy SoapServer as a daemon for tests on linux, you need to:

1. Set up location "localhost:12312/soapServer.php" in your wsdl like:

<wsdl:service name="ServiceName">
        <wsdl:port name="ServiceNamePort" binding="tns:ServiceNameBinding">
            <soap:address location="http://localhost:12312/soapServer.php" />
        </wsdl:port>
</wsdl:service>

2. Write your test server like:

<?php
/*
  * Server
  */
class TestSoapServer
{
    public function getMessage()
    {
        return 'Hello, World!';
    }
}
$options = ['uri' => 'http://localhost:12312/'];
$server = new SoapServer(null, $options);
$server->setClass('TestSoapServer');
$server->handle();

?>

3. Run it with `php -S localhost:12312` (in the same folder)

Whenever you make a request according to your wsdl, it will end up at your "server".
softontherocks at gmail dot com 29-Oct-2014 06:20
I posted in this URL http://softontherocks.blogspot.com/2014/02/web-service-soap-con-php.html a full example of a nusoap web service.

There is defined the server and the cliente who calls the web service.

I hope it would be useful for you.
s at dumdeedum dot com 12-Sep-2013 05:32
I was running PHP 5.3.2 and couldn't for the life of me get SOAP headers to work, no matter how carefully I built my class/wsdl/client.  What finally fixed it was updating to the latest PHP.  No idea if there was a bug somewhere or what, but it's never a bad idea to stay current and it might save you weeks of frustration!
phpman dot fulter47 at recursor dot net 04-Jul-2012 05:36
For those (like me) coming from other SOAP frameworks and getting confused:

- A PHP SOAP server application created using the SoapServer class can not be used as a standalone SOAP server.
It needs an HTTP server to receive SOAP requests, which must run a PHP engine to execute the PHP SOAP server script as a CGI.

- For this reason, there are no settings in PHP that control the Interface/Port under which the SOAP server will wait for requests - it is the HTTP server who is responsible for that.

- The "uri" parameter is an "id value", used as the namespace for the SOAP response. It is only required if no WSDL file is used (that contains this setting), i.e. "wsdl" is set to NULL. It does _not_ control the Hostname/Port under which the HTTP server will be reachable for requests.
php1221 at klox dot net 18-Aug-2011 01:39
While there are plenty of mentions online that SoapServer doesn't support SOAP Headers, this isn't true.

In your class, if you declare a function with the name of the header, the function will be called when that header is received.

<?php
class MySoapService {
  private $user_is_valid;

  function MyHeader($header) {
    if ((isset($header->Username)) && (isset($header->Password))) {
      if (ValidateUser($header->Username, $header->Password)) {
        $user_is_valid = true;
      }
    }
  }

  function MySoapRequest($request) {
    if ($user_is_valid) {
      // process request
    }
    else {
      throw new MyFault("MySoapRequest", "User not valid.");
    }
  }
}
?>
hawky83 at googlemail dot com 21-Jan-2011 02:46
Another simple example for SOAP_SERVER with errorhandling an params and wsdl:

SERVER (soap_all_srv.php):

<?php
// PEAR::SOAP einbinden
require_once "SOAP/Server.php";
$skiptrace =& PEAR::getStaticProperty('PEAR_Error', 'skiptrace');
$skiptrace = true;

// Service-Class
class mytimeserv {

  // __dispatch_map
  public $__dispatch_map = array ();

  // In/Out param -> __dispatch_map
  public function __construct() {
    $this->__dispatch_map["now"] =
      array ("in" => array("format" => "string"),
             "out" => array("time" => "string"));
  }

  // get back __dispatch_map in __dispatch
  public function __dispatch($methodname) {

    if (isset($this->__dispatch_map[$methodname])) {
      return $this->__dispatch_map[$methodname];
    }

    return NULL;
  }

  // servicemthod with parameters
  function now ($format) {

    // formaterror?
    if (($format == null) || (trim($format) == "")) {

      // send errormessage
      return new SOAP_Fault("Kein Parameter angegeben","0815", "Client");
    }

    date_default_timezone_set('Europe/Berlin');

    $time = date ($format);

    // return SOAP-Obj.
    return (new SOAP_Value('time','string', $time));
  }
}

// service-class
$service = new mytimeserv();

// server
$ss = new SOAP_Server();

// add service with name
$ss->addObjectMap (&$service,"urn:mytimeserv");

// service or wsdl
if (isset($_SERVER["REQUEST_METHOD"])&& $_SERVER["REQUEST_METHOD"] == "POST") {

    // postdata -> service
    $ss->service ($HTTP_RAW_POST_DATA);

} else {

  // wsdl-param in url
  if (isset($_SERVER['QUERY_STRING']) && strcasecmp($_SERVER['QUERY_STRING'],'wsdl') == 0) {

    // DISCO_Server for WSDL
    require_once "SOAP/Disco.php";
    $disco = new SOAP_DISCO_Server ($ss,"mytimeserv","My Time Service");

    // set HTML-Header
    header("Content-type: text/xml");

    // return wsdl
    print $disco->getWSDL ();
  }
}

?>

CLIENT (soap_all_client.php) (for wsdl: http://example.com/soap_all_srv.php?wsdl):
<?php

require_once "SOAP/Client.php";

// SOAP/WSDL
$sw = new SOAP_WSDL ("http://example.com/soap_all_srv.php?wsdl");

// Proxy-Obj.
$proxy = $sw->getProxy ();

// servicemthod
$erg = $proxy->now ("H:i:s");

// return
print $erg."\n";

?>
mikkel at nsales dot dk 02-Jun-2010 03:15
If you want to return a custom object array from a nusoap webservice, you have to cast the objects to arrays like so:

<?php
$users = array();
while($res = $db_obj->fetch_row())
{
  $user = new user();
  $user->Id = $res['id'];
  $user->Username = $res['username'];
  $user->Email = $res['email'];

  $users[] = (array) $user;
}

return ($users);
?>
junk2cm at gmx dot de 25-May-2010 12:54
As the SoapServer class lacks the possibility of dealing with SOAP-Headers, my following workaround is suitable to my needs when I had to do authentication via the SOAP-Headers:
1. Use a class which handles SOAP requests and let the constructor of this class take the sent headers.
2. Before invoking the SoapServer extract the SOAP-Header from the incoming raw data.
3. When using setClass pass the extracted header to the handling class.

In Your Server-Skript do things like this
<?php
$hdr = file_get_contents("php://input");
if (strpos($hdr,'<s:Header>')===false) {
    $hdr = null;
} else {
    $hdr = explode('<s:Header>',$hdr);
    $hdr = explode('</s:Header>',$hdr[1]);
    $hdr = $hdr[0];
}
$srv = new SoapServer('Your_wsdl');
$srv->setClass("ServiceClass",$hdr);
$srv->handle();
?>

And the service class is like this:
<?php
class ServiceClass {
    var $IsAuthenticated;

    function __construct($hdr) {
        $this->IsAuthenticated = false;
        if ($hdr!=null) {
            $this->header = simplexml_load_string($hdr);
            //Your authentication stuff goes here...
        }
    }

    function SomeFunctionOfTheService($a) {
        if ($this->IsAuthenticated) {
            //here Your function...
        }
    }

}
?>
carlos dot vini at gmail dot com 20-May-2010 01:55
SoapServer does not support WSDL with literal/document. I have a class:

<?php
class My_Soap {
    /**
     * Returns Hello World.
     *
     * @param string $world
     * @return string
     */
    public function getInterAdmins($world) {
        return 'hello' . $world;
    }
}
?>

To fix this I had to create proxy class:
<?php
class My_Soap_LiteralDocumentProxy {
   public function __call($methodName, $args) {
       $soapClass = new My_Soap();
       $result = call_user_func_array(array($soapClass, $methodName),  $args[0]);
       return array($methodName . 'Result' => $result);
   }
}
?>

Now make sure that the WSDL is created using My_Soap. And that the Server is created using My_Soap_LiteralDocumentProxy:

<?php

if (isset($_GET['wsdl'])) {
    $wsdl = new Zend_Soap_AutoDiscover(); // It generates the WSDL
    $wsdl->setOperationBodyStyle(array(
        'use' => 'literal'
    ));
    $wsdl->setBindingStyle(array(
        'style' => 'document'
    ));
    $wsdl->setClass('My_Soap');
    $wsdl->handle();
} else {
    $server = new Zend_Soap_Server('http://localhost/something/webservice.php?wsdl');
    $server->setClass('My_Soap_LiteralDocumentProxy');
    $server->handle();
}

?>
dsubar at interna dot com 25-Dec-2009 09:49
Do not put a SoapServer and a SoapClient in the same PHP file. This seems to cause arbitrary behavior. On the PHP interpreter in Eclipse, everything worked fine. Under MAMP, I got an undocumented error. In moving the client from the same file as the server, everything worked fine.


Ajoute une ou plusieurs fonctions qui vont gérer les requêtes SOAP

  • « SoapServer
  • SoapServer::addSoapHeader »
  • PHP Manual
  • SoapServer
  • Ajoute une ou plusieurs fonctions qui vont gérer les requêtes SOAP

SoapServer::addFunction

(PHP 5, PHP 7, PHP 8)

SoapServer::addFunction — Ajoute une ou plusieurs fonctions qui vont gérer les requêtes SOAP

Description

public SoapServer::addFunction ( array|string|int $functions ) : void

Exporte une ou plusieurs fonctions pour les clients distants.

Liste de paramètres

functions

Pour exporter une seule fonction, il faut passer son nom dans ce paramètre en tant que chaîne de caractères.

Pour exporter plusieurs fonctions, il faut utiliser un tableau de noms de fonctions.

Pour exporter toutes les fonctions, il faut utiliser la constante spéciale SOAP_FUNCTIONS_ALL.

Note:

functions doit recevoir tous les arguments d'entrée dans le même ordre que celui défini dans le fichier WSDL (il ne doit recevoir aucun paramètre de sortie en tant qu'argument) et retourne une ou plusieurs valeurs. Pour retourner plusieurs valeurs, il doit retourner un tableau contenant le nom des paramètres de sortie.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec SoapServer::addFunction()

<?php

function echoString($inputString)
{
    return $inputString;
}

$server->addFunction("echoString");

function echoTwoStrings($inputString1, $inputString2)
{
    return array("outputString1" => $inputString1,
                 "outputString2" => $inputString2);
}
$server->addFunction(array("echoString", "echoTwoStrings"));

$server->addFunction(SOAP_FUNCTIONS_ALL);

?>

Voir aussi

  • SoapServer::__construct() - Constructeur SoapServer
  • SoapServer::setClass() - Configure la classe qui sera utilisée pour gérer les requêtes SOAP

User Contributed Notes

dotpointer at gmail dot com 26-Oct-2007 06:52
Be careful with SOAP_FUNCTIONS_ALL, as it adds ALL availiable PHP functions to your server.

This can be a potential security threat, imagine clients doing this:

echo $client->file_get_contents("c:\\my files\\my_passwords.doc");

And voila, they have the contents of your file my_passwords.doc.
Evan Borgstrom 23-Aug-2006 03:42
In response to comment by Nathan O'Sullivan about returning (or passing) a complex type, you can also use the stdClass() object.

Assume you define a complex type like so:

<xsd:complexType name="TestType">
        <xsd:all>
                <xsd:element name="A" type="xsd:string" />
                <xsd:element name="B" type="xsd:int" />
                <xsd:element name="C" type="xsd:boolean" />
        </xsd:all>
</xsd:complexType>

To use an object in place of an array you can do:

$test = new stdClass();
$test->A = "test string";
$test->B = 45;
$test->C = false;

$result = $client->Test($test);
Nathan O'Sullivan 28-Apr-2005 11:36
You may be left wondering, as I was, how to return a complex type - consider the following WSDL snippets, for a method called Login:

 <xs:element name="Login">
        <xs:complexType>
          <xs:sequence>
            <xs:element minOccurs="0" maxOccurs="1" name="username" type="xs:string" />
            <xs:element minOccurs="0" maxOccurs="1" name="password" type="xs:string" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>

   <xs:complexType name="UserInfo">
        <xs:sequence>
          <xs:element minOccurs="0" maxOccurs="1" name="Id" type="xs:string" />
          <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
          <xs:element minOccurs="0" maxOccurs="1" name="Nickname" type="xs:string" />
          <xs:element minOccurs="0" maxOccurs="1" name="Email" type="xs:string" />
        </xs:sequence>
      </xs:complexType>

   <xs:element name="LoginResponse">
        <xs:complexType>
          <xs:sequence>
            <xs:element minOccurs="0" maxOccurs="1" name="LoginResult" type="s0:UserInfo" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>

Here's a working Login function  that I've added with add SoapServer::addFunction

function Login($username, $password)
{
  return array("LoginResult", array("Id"=>1, "Name"=>"Nathan", "Nickname"=>"Nathan", "Email"=>"email address") );
}

The UserInfo complextype is represented by the inner array.  The outer array has just one element, "LoginResult".  The LogineResponse element  seems to be treated as a one-member array by PHP.


Ajoute un en-tête SOAP à une réponse

  • « SoapServer::addFunction
  • SoapServer::__construct »
  • PHP Manual
  • SoapServer
  • Ajoute un en-tête SOAP à une réponse

SoapServer::addSoapHeader

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

SoapServer::addSoapHeader — Ajoute un en-tête SOAP à une réponse

Description

public SoapServer::addSoapHeader ( SoapHeader $header ) : void

Ajoute un en-tête SOAP à la réponse courante.

Liste de paramètres

header

L'en-tête à renvoyer.

Valeurs de retour

Aucune valeur n'est retournée.

User Contributed Notes

vladimir at bashkirtsev dot com 21-Nov-2016 09:30
Notably addSoapHeaders() must be called within handling class/object.

If you call addSoapHeaders() like this:

$server = new SoapServer("some.wsdl");
$server->setObject(new Service());
$server->addSoapHeaders(new SoapHeader("ns", "Header", "value"));
$server->handle();

Your SOAP header will not be added to the server response as it will be overwritten by result of handle() function.

If you want to add SOAP headers to the resulting response you should make $server global/static variable and then call addSoapHeaders() from within of the method of Service class which will handle the request.


Constructeur SoapServer

  • « SoapServer::addSoapHeader
  • SoapServer::fault »
  • PHP Manual
  • SoapServer
  • Constructeur SoapServer

SoapServer::__construct

(PHP 5, PHP 7, PHP 8)

SoapServer::__construct — Constructeur SoapServer

Description

public SoapServer::__construct ( string|null $wsdl , array $options = [] )

Ce constructeur permet la création d'objets SoapServer en mode WSDL ou non-WSDL.

Liste de paramètres

wsdl

Pour utiliser le mode WSDL, il faut définir l'URI du fichier WSDL dans ce paramètre. Avec les autres situations, il faut définir ce paramètre à null et définir l'option uri.

options

Permet de définir une version SOAP par défaut (soap_version), un jeu de caractères d'encodage interne (encoding) et un URI acteur (actor).

L'option classmap peut être utilisée pour lier quelques types WSDL à des classes PHP. Cette option doit être un tableau avec les types WSDL en tant que clés et les noms des classes PHP en tant que valeurs.

L'option typemap est un tableau dont les clés sont type_name, type_ns (URI de l'espace de noms), from_xml (fonction de rappel acceptant un paramètre de type chaîne de caractères) et to_xml (fonction de rappel acceptant un paramètre de type objet).

L'option cache_wsdl prend une des valeurs WSDL_CACHE_NONE, WSDL_CACHE_DISK, WSDL_CACHE_MEMORY ou WSDL_CACHE_BOTH.

La dernière option est features qui peut être défini à SOAP_WAIT_ONE_WAY_CALLS, SOAP_SINGLE_ELEMENT_ARRAYS, SOAP_USE_XSI_ARRAY_TYPE.

L'option send_errors peut être défini à false pour envoyer un message d'erreur générique ("Internal error") au lieu du message d'erreur spécifique.

Exemples

Exemple #1 Exemples avec SoapServer::__construct()

<?php
$server = new SoapServer("some.wsdl");

$server = new SoapServer("some.wsdl", array('soap_version' => SOAP_1_2));

$server = new SoapServer("some.wsdl", array('actor' => "http://example.org/ts-tests/C"));

$server = new SoapServer("some.wsdl", array('encoding'=>'ISO-8859-1'));

$server = new SoapServer(null, array('uri' => "http://test-uri/"));

class MyBook {
    public $title;
    public $author;
}

$server = new SoapServer("books.wsdl", array('classmap' => array('book' => "MyBook")));

?>

Voir aussi

  • SoapClient::__construct() - Constructeur SoapClient

User Contributed Notes

Anonymous 10-Jun-2012 02:35
// Workin Server with Client for localhost

// server.php

<?php
class MyClass {
  public function helloWorld() {

    return 'Hallo Welt '. print_r(func_get_args(), true);
  }
}

try {
  $server = new SOAPServer(
    NULL,
    array(
     'uri' => 'http://localhost/soap/server.php'
    )
  );

  $server->setClass('MyClass');
  $server->handle();
}

catch (SOAPFault $f) {
  print $f->faultstring;
}

?>

// client.php:

<?php
$client = new SoapClient(null, array(
      'location' => "http://localhost/soap/server.php",
      'uri'      => "http://localhost/soap/server.php",
      'trace'    => 1 ));

echo $return = $client->__soapCall("helloWorld",array("world"));
?>

// Hope you like it


Emet une erreur SoapServer

  • « SoapServer::__construct
  • SoapServer::getFunctions »
  • PHP Manual
  • SoapServer
  • Emet une erreur SoapServer

SoapServer::fault

(PHP 5, PHP 7, PHP 8)

SoapServer::fault — Emet une erreur SoapServer

Description

public SoapServer::fault ( string $code , string $string , string $actor = "" , mixed $details = null , string $name = "" ) : void

Envoie une réponse au client de la requête courante, avec un message d'erreur.

Note:

Cela n'est possible que durant l'exécution de la requête.

Liste de paramètres

code

Le code d'erreur à retourner.

string

Une description de l'erreur.

actor

Une chaîne identifiant l'acteur en cause.

details

Plus de détails sur la faute.

name

Le nom de l'erreur. Cela peut être utilisé pour sélectionner un nom dans un fichier WSDL.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • SoapFault::__construct() - Constructeur SoapFault

User Contributed Notes

christian at cmjdesign dot dk 06-Jun-2013 10:41
hi,
to control the fault output one may do the following

/**
 * mySoapServer class
 */
class mySoapServer extends SoapServer {
    public function __construct($wsdl, array $options = null) {
        parent::SoapServer($wsdl, $options);
    }
    public function fault ($code, $string, $actor = null, $details = null, $name = null) {
        throw new SoapFault($code, $string, $actor, $details, $name);
    }
}

Use:
try {
    $server = new mySoapServer(null, array('uri' => $_SERVER['REQUEST_URI']));
    $server->setClass('mySoapAPI');
    $server->handle();
} catch (SoapFault $exc) {
    echo $exc->getTraceAsString();
}

that how i did this,
hope iot can help some one.
brian dot reynolds at risaris dot com 21-Feb-2012 09:44
Example Usage:

return new SoapFault( "Client", "foo or bar must be supplied");

SOAP Fault Codes

VersionMismatch: Found an invalid namespace for the SOAP Envelope element
MustUnderstand    : An immediate child element of the Header element, with the mustUnderstand attribute set to "1", was not understood
Client: The message was incorrectly formed or contained incorrect information
Server: There was a problem with the server so the message could not proceed
dub357 at gmail dot com 08-Feb-2012 08:01
This function also sends a 500 response code back to the client with the request.
This was causing issues with an Apache Axis 1.2 client I had so I instead implemented by own fault handling:

<?php
header("Content-Type: text/xml");
header("Status: 200");
die("<SOAP-ENV:Envelope xmlns:SOAP-ENV=\\"http://schemas.xmlsoap.org/soap/envelope/\\">
  <SOAP-ENV:Body>
    <SOAP-ENV:Fault>
      <faultcode>500</faultcode>
      <faultstring>".$ex->getMessage())."</faultstring>
    </SOAP-ENV:Fault>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>");
?>
Amr Mostafa 09-Sep-2009 06:16
This function currently terminates execution as well, which may be undesirable. See: http://bugs.php.net/bug.php?id=49513
Anonymous 16-Jul-2008 12:12
If you use Adobe Flex, Flash or AIR as SOAP client and are unable to get the error message in case of a soap fault, upgrade to PHP 5.2.6.

Details in:
http://bugs.php.net/bug.php?id=43507


Retourne la liste des fonctions définies

  • « SoapServer::fault
  • SoapServer::handle »
  • PHP Manual
  • SoapServer
  • Retourne la liste des fonctions définies

SoapServer::getFunctions

(PHP 5, PHP 7, PHP 8)

SoapServer::getFunctions — Retourne la liste des fonctions définies

Description

public SoapServer::getFunctions ( ) : array

SoapServer::getFunctions() retourne la liste de toutes les fonctions ajoutées à l'objet serveur SoapServer. Elle retourne la liste de toutes les fonctions ajoutées à l'aide des méthodes SoapServer::addFunction() et SoapServer::setClass().

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un tableau de toutes les fonctions.

Exemples

Exemple #1 Exemple avec SoapServer::getFunctions()

<?php
$server = new SoapServer(NULL, array("uri" => "http://test-uri"));
$server->addFunction(SOAP_FUNCTIONS_ALL);
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $server->handle();
} else {
  echo "Ce serveur SOAP peut gérer les fonctions suivantes : ";
  $functions = $server->getFunctions();
  foreach($functions as $func) {
    echo $func . "\n";
  }
}
?>

Voir aussi

  • SoapServer::__construct() - Constructeur SoapServer
  • SoapServer::addFunction() - Ajoute une ou plusieurs fonctions qui vont gérer les requêtes SOAP
  • SoapServer::setClass() - Configure la classe qui sera utilisée pour gérer les requêtes SOAP

User Contributed Notes

There are no user contributed notes for this page.


Traite une requête SOAP

  • « SoapServer::getFunctions
  • SoapServer::setClass »
  • PHP Manual
  • SoapServer
  • Traite une requête SOAP

SoapServer::handle

(PHP 5, PHP 7, PHP 8)

SoapServer::handle — Traite une requête SOAP

Description

public SoapServer::handle ( string|null $request = null ) : void

Effectue une requête SOAP, appelle les fonctions nécessaires et envoie une réponse en retour.

Liste de paramètres

request

La requête SOAP. Si cet argument est omis, la requête est supposée être dans les données POST brûtes de la requête HTTP.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec SoapServer::handle()

<?php
function test($x)
{
    return $x;
}

$server = new SoapServer(null, array('uri' => "http://test-uri/"));
$server->addFunction("test");
$server->handle();
?>

Historique

Version | Description
8.0.0 | request is now nullable.

Voir aussi

  • SoapServer::__construct() - Constructeur SoapServer

User Contributed Notes

Bas van Dorst 19-Feb-2014 02:58
Additional information to the comment of "Joeri Thissen" (http://www.php.net/manual/en/soapserver.handle.php#113866)

In some cases the replacements generates a timeout (looks like it is in combination with Nginx). The problem is that PHP has already sent a content-length, and the webserver is still waiting for new content.

To fix this you have to reset the HTTP Content-Length with the right value:

<?php
ob_start();
$soapServer->handle();
$result = ob_get_contents();
ob_end_clean();

$result = str_replace("abcdef", "abc", $result);
$length = strlen($result);

header("Content-Length: ".$length);
echo $result;
Joeri Thissen 11-Dec-2013 10:59
Sometimes returned data can contain characters which are not valid in xml 1.0. This causes the xml being output by SoapServer::handle to be invalid. Although it's probably better to sanitize the data ealier, a combination of output buffering and a simple regular expression can be used as a quick fix to make sure the output is indeed valid xml.

For example:

<?php
    ob_start();
    $soapServer->handle();
    $soapXml = ob_get_contents();
    ob_end_clean();
    $soapXml = preg_replace ('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $soapXml);
    echo $soapXml;
?>
dub357 at gmail dot com 08-Feb-2012 10:54
After much headache and looking through PHP source code, I finally found out why the handle() function would immediately send back a fault with the string "Bad Request".
Turns out that my client was sending valid XML, but the first line of the XML was the actual XML declaration:

<?xml version="1.0" encoding="UTF-8"?>

When the "handle" function in the SoapServer class is called, it first tries to parse the XML.  When the XML document can't be parsed, a "Bad Request" fault is returned and execution of the script immediately stops.  I assume that the XML parser built into PHP (libxml2) already assumes the document to be XML and when it finds the declaration, it thinks it isn't valid.

I added some XML parsing calls to my service before the handle() function is called to check for valid XML and avoid the "Bad Request" fault.  This also allows me to send back a more suitable error message:

<?php
$parser = xml_parser_create("UTF-8");
if (!xml_parse($parser,$HTTP_RAW_POST_DATA,true)){
   $webService->fault("500", "Cannot parse XML: ".
      xml_error_string(xml_get_error_code($parser)).
       " at line: ".xml_get_current_line_number($parser).
       ", column: ".xml_get_current_column_number($parser));
}
?>
prenaud at profideo dot com 09-Jan-2012 02:23
Please note that when defining several services in one wsdl file, and calling one of those services, you may always get the response for your first service.

This is a known bug. You will find its description and some workarounds here  : https://bugs.php.net/bug.php?id=49169
Artur Graniszewski 15-Nov-2009 10:19
Be aware that SoapServer::handle(); method sends additional HTTP headers to the browser. One of them is "Content-Type: application/soap+xml". If you want to execute SOAP methods locally as a part of SoapClient::__doRequest() (see example at http://pl2.php.net/manual/en/soapclient.dorequest.php ) you may need to reset (override) this header back to "Content-Type: text/html" like so:

<?php
function Add($x,$y) {
  return $x+$y;
}

class LocalSoapClient extends SoapClient {

  function __construct($wsdl, $options) {
    parent::__construct($wsdl, $options);
    $this->server = new SoapServer($wsdl, $options);
    $this->server->addFunction('Add');
  }

  function __doRequest($request, $location, $action, $version) {
    ob_start();
    $this->server->handle($request);
    $response = ob_get_contents();
    ob_end_clean();
    return $response;
  }

}

$x = new LocalSoapClient(NULL,array('location'=>'test://',
                                   'uri'=>'http://testuri.org'));

header("Content-Type: text/html");

var_dump($x->Add(3,4));

?>
tom at backslashinteractive dot com 03-Oct-2008 10:54
In response to Blizzke:

Sometimes this problem can be hidden by an Apache segmentation fault along with an HTTP headers error SoapFault thrown to the client.

If you get either of those 2, try checking to make sure that style="rpc" in your WSDL file's soap:operation's.

-T
Blizzke at gmail dot com 12-Mar-2008 04:39
Seems pretty logical once you find the solution, but it took me quite a while to figure this one out:
If you are using WSDL based SOAP requests and you have more than one operation in your binding (with the same parameters), make sure the <soap:operation> style is set to rpc, NOT body!

When you specify 'body' here, all that will be transmitted in the request is the parameters for the function call, and SoapServer->handle() will use the first function it finds with the same parameter-makeup to handle the call.

ie If you have 2 functions:
<?php
function One ( string $blah );
function Two ( string $blah );
?>
Making a client call with SoapClient -> Two ( 'test' ); will result in One ( ) being called when your 'type' is set to 'body'

The actual method to call will only be included in the request when your type is set to 'rpc', resulting in the expected behavior
king dot maxemilian at noos dot fr 21-Aug-2007 09:23
Sometime, it happens that PHP does not detect anything in $HTTP_RAW_POST_DATA.

To solve this problem and make it work in any case:

function soaputils_autoFindSoapRequest()    {
    global $HTTP_RAW_POST_DATA;

    if($HTTP_RAW_POST_DATA)
        return $HTTP_RAW_POST_DATA;

    $f = file("php://input");
    return implode(" ", $f);
}

$server = new SoapServer($wsdl);
$server->setClass($MyClass);

$server->handle(soaputils_autoFindSoapRequest());


Configure la classe qui sera utilisée pour gérer les requêtes SOAP

  • « SoapServer::handle
  • SoapServer::setObject »
  • PHP Manual
  • SoapServer
  • Configure la classe qui sera utilisée pour gérer les requêtes SOAP

SoapServer::setClass

(PHP 5, PHP 7, PHP 8)

SoapServer::setClass — Configure la classe qui sera utilisée pour gérer les requêtes SOAP

Description

public SoapServer::setClass ( string $class , mixed ...$args ) : void

Exporte toute les méthodes de la classe spécifiée.

SoapServer::setClass() configure une classe qui servira de gestionnaire aux requêtes SOAP. L'objet pourra alors être rendu persistant à travers les requêtes pour une session PHP, avec la méthode SoapServer::setPersistence().

Liste de paramètres

class

Le nom de la classe exportée.

args

Ces paramètres optionnels seront passé par défaut au constructeur de la classe, durant la phase de création de l'objet.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • SoapServer::__construct() - Constructeur SoapServer
  • SoapServer::addFunction() - Ajoute une ou plusieurs fonctions qui vont gérer les requêtes SOAP
  • SoapServer::setPersistence() - Active le mode persistant de SoapServer

User Contributed Notes

funky2step at gmail dot com 25-Nov-2011 01:54
When passing arguments to the default class constructor, make sure that you don't try and use the magic __construct method because that won't work.

<?php

class MyClass
{
  function MyClass($arg1, $arg2)
  {

  }
}

// Not:

class MyClass
{
  function __construct($arg1, $arg2)
  {

  }
}

?>
christiaan at oakfox dot net 04-May-2009 04:21
You can also retrieve object properties the following way while using __autoload($class_name).

<?php

# Start Session
session_start();

# Auto Load Class as Required
function __autoload($class_name)
{
    require_once "/var/www/example/class/". $class_name. ".php";
}

//service

$_SESSION[_bogus_session_name] = unserialize($_SESSION[_bogus_session_name]);
$server = new SoapServer('service.wsdl');
$server->setClass("MyClass");
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();
$_SESSION[_bogus_session_name] = serialize($_SESSION[_bogus_session_name])

?>
Ariz Jacinto 04-Dec-2008 04:38
If you want your SOAP client to be able to save and then retrieve the object properties, you need to set the SOAP server to be persistent by setting session.auto_start=0, invoking session_start(), and SoapServer->setPersistence(SOAP_PERSISTENCE_SESSION) in the following manner:

<?php
  //set ini
  ini_set("soap.wsdl_cache_enabled", 0);
  ini_set("session.auto_start", 0);

  //class file
  require_once('MyClass.php');

  //for persistent session
  session_start();

  //service
  $server = new SoapServer('service.wsdl');
  $server->setClass("MyClass");
  $server->setPersistence(SOAP_PERSISTENCE_SESSION);
  $server->handle();
?>


Configure l'objet qui sera utilisé pour gérer les requêtes SOAP

  • « SoapServer::setClass
  • SoapServer::setPersistence »
  • PHP Manual
  • SoapServer
  • Configure l'objet qui sera utilisé pour gérer les requêtes SOAP

SoapServer::setObject

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

SoapServer::setObject — Configure l'objet qui sera utilisé pour gérer les requêtes SOAP

Description

public SoapServer::setObject ( object $object ) : void

SoapServer::setObject() configure un objet qui servira de gestionnaire aux requêtes SOAP, plutôt qu'une simple classe, comme avec SoapServer::setClass().

Liste de paramètres

object

L'objet qui va gérer les requêtes.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • SoapServer::setClass() - Configure la classe qui sera utilisée pour gérer les requêtes SOAP

User Contributed Notes

There are no user contributed notes for this page.


Active le mode persistant de SoapServer

  • « SoapServer::setObject
  • SoapFault »
  • PHP Manual
  • SoapServer
  • Active le mode persistant de SoapServer

SoapServer::setPersistence

(PHP 5, PHP 7, PHP 8)

SoapServer::setPersistence — Active le mode persistant de SoapServer

Description

public SoapServer::setPersistence ( int $mode ) : void

Cette fonction permet de changer la persistance d'un objet SoapServer entre les requêtes. Elle permet de sauvegarder les données entre les requêtes, au moyen des sessions PHP. Cette fonction n'a d'effet qu'après avoir exporté la liste des fonctions au moyen de SoapServer::setClass().

Note:

La constante de persistence SOAP_PERSISTENCE_SESSION rend uniquement les objets de la classe donnée persistants, mais non pas les données statiques. Dans ce cas, $this->bar au lieu de self::$bar.

Note:

SOAP_PERSISTENCE_SESSION serialise les données de l'objet entre les requêtes. Dans le cas des ressources, (par exemple PDO), __wakeup() et __sleep() devraient être utilisées.

Liste de paramètres

mode

Une des constantes suivantes :

SOAP_PERSISTENCE_REQUEST - Les données de SoapServer ne sont pas persistantes entre les requêtes. C'est le comportement par défaut de tout objet SoapServer après appel à setClass().

SOAP_PERSISTENCE_SESSION - Les données de SoapServer persistent entre les requêtes. Ceci est réalisé en linéarisant les données de la classe SoapServer dans $_SESSION['_bogus_session_name'], et ainsi session_start() doit être appelée avant de passer sous ce mode de persistance.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple SoapServer::setPersistence()

<?php
 class MyFirstPersistentSoapServer {
     private $resource; // (Par exemple PDO, mysqli, etc..)
     public $myvar1;
     public $myvar2;

     public function __construct() {
         $this->__wakeup(); // On appelle notre wakeup pour relancer notre ressource
     }

     public function __wakeup() {
         $this->resource = CodeToStartOurResourceUp();
     }

     public function __sleep() {
         // On s'assure d'enlever $resource ici, ainsi nos données peuvent persister en session
         // Si on oublie, la désérialisation lors de la prochaine requête échouera et notre objet
         // SoapObject ne sera donc pas persistant entre les requêtes.
         return array('myvar1','myvar2');
     }
 }

 try {
     session_start();
     $server = new SoapServer(null, array('uri' => $_SERVER['REQUEST_URI']));
     $server->setClass('MyFirstPersistentSoapServer');
     // setPersistence() DOIT être appelée après setClass(), car le comportement de setClass()
     // affecte SESSION_PERSISTENCE_REQUEST.
     $server->setPersistence(SOAP_PERSISTENCE_SESSION);
     $server->handle();
 } catch(SoapFault $e) {
     error_log("SOAP ERROR: ". $e->getMessage());
 }
?>

Voir aussi

  • SoapServer::setClass() - Configure la classe qui sera utilisée pour gérer les requêtes SOAP

User Contributed Notes

csnaitsirch at web dot de 01-Apr-2010 05:25
I want to give one example for the order of commands if you want to use a class in persistence mode.

<?php
// 1. class definition or include
class UserService
{
    public function __construct() { }
}

// 2. start the session after defining or including the class!!
session_start();

// 3. instanciate the server
$server = new SoapServer(null, array("something"));

// 4. set the class to use
$server->setClass('UserService');

// 5. set persistance mode
$server->setPersistence(SOAP_PERSISTENCE_SESSION);

// 6. handle the request
$server->handle();
?>
doug dot manley at gmail dot com 30-May-2008 12:54
When using "SoapServer::setPersistence( SOAP_PERSISTENCE_SESSION )", you apparently MUST include the class that was used in "SoapServer::setClass()" BEFORE any "session_*" commands.

I found this out using "__autoload()" and a whole lot of "syslog()"; it kept failing to include the class that I was using for my soap server, but that class is ONLY ever referenced by the page itself, and even then only for the purposes of setting the class for the soap server; none of my code would ever cause it to autoload.  The problem was that I was including my session-handling code first.

If the session gets started BEFORE the page defines the class definition, then persistence CANNOT happen.

The order should be:
1. Include the class for use with the soap server.
2. Start up your session.
3. Set up your soap server.
4. Handle your soap request.
boogiebug at gmail dot com 25-Mar-2008 07:40
setPersistence works only for a single instance of service class.

To use multiple instance of services objects, you need to instantiate the classes into objects and use an undocumented SoapServer's method - setObject() to add the service object into the SoapServer object, and handle the service object persistence with $_SESSION instead.

For example:

$ServiceObjects = array()
$ServiceObjects[0] = new ServiceClass1();
$ServiceObjects[1] = new ServiceClass2();
$ServiceObjects[2] = new ServiceClass3();

$_SESSION['ServiceClass1'] = $ServiceObjects[0];
$_SESSION['ServiceClass2'] = $ServiceObjects[1];
$_SESSION['ServiceClass3'] = $ServiceObjects[2];

...

$Servers = array()
for ( $i = 0; $i < count($ServiceObjects); i++)
{
  $s = new SoapServer($wsdl);
  $s->setObject($ServiceObject[$i]);
  $Servers[] = $s;
}

...

$Server[$i]->handle()

...
jan at pinna dot nl 26-Jan-2008 03:28
I found that using both modes (SOAP_PERSISTENCE_SESSION and SOAP_PERSISTENCE_REQUEST) cannot be used simultaniously. Because it didn't work at once, I started experimenting by using different settings and as stated below in the comments, "...also use SOAP_PERSISTENCE_REQUEST to save objects between requests" led me to think it was nessecary to use both modes. Well, it might for others, be but for me it turned out a day of freaking out ;) (trying all kinds of session stuff, etc etc).
Also, if persistence doesn't work, please check if session_start() is called somewhere in the script and try not to call it twice or whatsoever: it won't work...
jared at ws-db dot com 28-Aug-2005 12:07
I had some issues getting session persistence (SOAP_PERSISTENCE_SESSION) to work. I finally got it working after setting session.auto_start=0, and then only calling session_start() in the script containing the SoapServer. Maybe this is obvious, but took me a bit to figure it out.

I only tried it with session.use_cookies=1, so if the settings above don't work for you, make sure cookies are enabled, though it may work without the need for cookies.
cperez1000 at hotmail dot com 28-May-2005 08:54
Always remember to place the "setPersistence" method before the handle method, otherwise it won't work.  It sounds obvious, but it's still a very common mistake, since no errors are shown.


La classe SoapFault

(PHP 5, PHP 7, PHP 8)

Introduction

Représente une erreur SOAP.

Synopsis de la classe

SoapFault extends Exception {
/* Propriétés héritées */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* Méthodes */
public __construct ( array|string|null $code , string $string , string|null $actor = null , mixed $details = null , string|null $name = null , mixed $headerFault = null )
public __toString ( ) : string
/* Méthodes héritées */
final public Exception::getMessage ( ) : string
final public Exception::getPrevious ( ) : Throwable
final public Exception::getCode ( ) : mixed
final public Exception::getFile ( ) : string
final public Exception::getLine ( ) : int
final public Exception::getTrace ( ) : array
final public Exception::getTraceAsString ( ) : string
public Exception::__toString ( ) : string
final private Exception::__clone ( ) : void
}

Sommaire

  • SoapFault::__construct — Constructeur SoapFault
  • SoapFault::__toString — Produit une représentation chaîne d'un objet SoapFault

User Contributed Notes

fbernoldi at gmail dot com 03-Oct-2012 05:46
Hi all,

I've decided to post this since it may be helpful, I've spend a couple of days trying to do this.

In order to use wsdl's specified faults with complex types, i.e:

WSDL definitions:

(xsd:schema namespace, ns1 = target namespace)

<xsd:element name="doubleFault">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="detail1" type="xsd:string"/>
      <xsd:element name="detail2" type="xsd:string"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

WSDL messages:

<message name="fault_specified">
    <part name="relevant_name" element="ns1:doubleFault"/>
</message>

WSDL port type:

<portType name="test">
  <operation name="operationTest">
  <input message="ns1:not_relevant_request"/>
  <output message="ns1:not_relevant_response"/>
  <fault name="FaultSpecified" message="ns1:fault_specified"/>
  ....
</portType>

You have to specify the response in the detail parameter as an array corresponding the tag names.

PHP Code:

<?php

function operationTest($request_param ...) {

    // ...
    $array_details = array("detail1" => "Explanation 1", "detail2" => "Explanation 2");

    return new SoapFault("Server", "example fault string", null, $array_details, "FaultSpecified");

}

$server = new SOAPServer("handmade.wsdl");
$server->addFunction("operationTest");
$server->handle();

?>

that should respond something like this:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://mynamespace">
   <SOAP-ENV:Body>
      <SOAP-ENV:Fault>
         <faultcode>SOAP-ENV:Server</faultcode>
         <faultstring>example fault string</faultstring>
         <detail>
            <ns1:doubleFault>
               <detail1>Explanation 1</detail1>
               <detail2>Explanation 2</detail2>
            </ns1:doubleFault>
         </detail>
      </SOAP-ENV:Fault>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

I Hope it helps,
Federico.
chris AT cmbuckley DOT co DOT uk 13-May-2010 03:53
A bit more digging in ext/soap/soap.c and the set_soap_fault function reveals the other undocumented properties from the constructor:

<?php
try {
    throw new SoapFault('code', 'string', 'actor', 'detail', 'name', 'header');
} catch (Exception $ex) {
    var_dump($ex->faultcode, $ex->faultstring, $ex->faultactor, $ex->detail, $ex->_name, $ex->headerfault);
}
?>
dmitry dot koterov at gmail dot com 29-Oct-2009 02:21
You may use undocumented and invisible property $e->faultcode to access string version of $code. Because standard $e->getCode() does not work:

<?php
$e = new SoapFault("test", "msg");
var_dump($e->getCode()); // prints "0"
var_dump($e->faultcode); // prints "test"
?>

Also you may use namespaced fault codes:

<?php
$e = new SoapFault(array("namespace", "test"), "msg");
?>

- see ext/soap/soap.php, PHP_METHOD(SoapFault, SoapFault). To access the namespace, use $e->faultcodens


Constructeur SoapFault

  • « SoapFault
  • SoapFault::__toString »
  • PHP Manual
  • SoapFault
  • Constructeur SoapFault

SoapFault::__construct

(PHP 5, PHP 7, PHP 8)

SoapFault::__construct — Constructeur SoapFault

Description

public SoapFault::__construct ( array|string|null $code , string $string , string|null $actor = null , mixed $details = null , string|null $name = null , mixed $headerFault = null )

SoapFault sert à envoyer des erreurs SOAP depuis le PHP.faultcode, faultstring, faultactor et detail sont les éléments standards SOAP.

Liste de paramètres

faultcode

Le code erreur de SoapFault.

faultstring

Le message d'erreur de SoapFault.

faultactor

Une chaîne identifiant l'acteur qui a causé l'erreur.

detail

faultname

Peut être utilisé pour sélectionner l'encodage qui convient depuis WSDL.

headerfault

Peut être utilisé durant la gestion de l'entête SOAP pour rapporter une erreur dans l'en-tête de réponse.

Exemples

Exemple #1 Quelques exemples avec SoapFault

<?php
function test($x)
{
    return new SoapFault("Server", "Un message d'erreur");
}

$server = new SoapServer(null, array('uri' => "http://test-uri/"));
$server->addFunction("test");
$server->handle();
?>

Il est possible d'utiliser le mécanisme des exceptions de PHP pour lancer des exceptions SoapFault.

Exemple #2 Emission d'exceptions SoapFault

<?php
function test($x)
{
    throw new SoapFault("Server", "Un message d'erreur");
}

$server = new SoapServer(null, array('uri' => "http://test-uri/"));
$server->addFunction("test");
$server->handle();
?>

Voir aussi

  • SoapServer::fault() - Emet une erreur SoapServer
  • is_soap_fault() - Vérifie si SOAP retourne une erreur

User Contributed Notes

csnaitsirch at web dot de 01-Apr-2010 05:04
The first Parameter of the constructor, the faultcode, of SoapFault must be a string. Otherwise it will lead to an error.

<?php
throw new SoapFault(1, "Error message!"); // wrong
throw new SoapFault("1", "Error message!"); // right
?>


Produit une représentation chaîne d'un objet SoapFault

  • « SoapFault::__construct
  • SoapHeader »
  • PHP Manual
  • SoapFault
  • Produit une représentation chaîne d'un objet SoapFault

SoapFault::__toString

(PHP 5, PHP 7, PHP 8)

SoapFault::__toString — Produit une représentation chaîne d'un objet SoapFault

Description

public SoapFault::__toString ( ) : string

Retourne une représentation en chaîne de l'objet SoapFault.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Une chaîne décrivant l'objet SoapFault.

User Contributed Notes

There are no user contributed notes for this page.


La classe SoapHeader

(PHP 5, PHP 7, PHP 8)

Introduction

Représente un entête SOAP.

Synopsis de la classe

SoapHeader {
/* Méthodes */
__construct ( string $namespace , string $name , mixed $data = ? , bool $mustunderstand = ? , string $actor = ? )
}

Sommaire

  • SoapHeader::__construct — Constructeur SoapHeader

User Contributed Notes

ericvaneldik at gmail dot com 08-Apr-2019 07:16
If you want to create an soap header wihtout namespace and without an item key value setup, you can use SoapVar

To get this:
<SOAP-ENV:Header>
    <IdentityHeader>
      <SessionID>123456789</SessionID>
    </IdentityHeader>
  </SOAP-ENV:Header>

you can use this php code:
<?php
$headerVar = new SoapVar('<IdentityHeader><SessionID>123456789</SessionID></IdentityHeader>',
      XSD_ANYXML);
$header = new SoapHeader('http://tempuri.org/','RequestParams',
      $headerVar);
?>
abdul dot rashid at paytabs dot co 13-Mar-2016 10:06
Just to add some note regarding his john at jtresponse dot co dot uk

In PHP you can try following code to avoid the <item><key/>

$Auth = new stdClass();
$Auth->SystemId = "DATA";
$Auth->UserName = "USERNAME";
$Auth->Password = "PASSWORD";

$header = new SoapHeader('NAMESPACE','Auth',$Auth,false);
$soapClient->__setSoapHeaders($header);

  <SOAP-ENV:Header>
    <ns1:Auth>
      <ns1:SystemId>DATA</ns1:SystemId>
      <ns1:UserName>USERNAME</ns1:UserName>
      <ns1:Password>PASSWORD</ns1:Password>
    </ns1:Auth>
  </SOAP-ENV:Header>
voroks at logics dot net dot au 03-Jul-2015 12:43
Example by john at jtresponse dot co dot uk does miss one important point: to be able to add attributes they must be mentioned in WSDL. If they not exist in WSDL they WILL NOT appear as attributes but rather <item><key/><value/></item> elements.
john at jtresponse dot co dot uk 13-Mar-2012 01:30
None of the examples really do it for me.
Note: you should NOT need to hard-code any XML.

Here is an example of creating a nested header and including a parameter.

$client = new SoapClient(WSDL,array());

$auth = array(
        'UserName'=>'USERNAME',
        'Password'=>'PASSWORD',
        'SystemId'=> array('_'=>'DATA','Param'=>'PARAM'),
        );
  $header = new SoapHeader('NAMESPACE','Auth',$auth,false);
  $client->__setSoapHeaders($header);

Gives the following header XML:

  <SOAP-ENV:Header>
    <ns1:Auth>
      <ns1:SystemId Param="PARAM">DATA</ns1:SystemId>
      <ns1:UserName>USERNAME</ns1:UserName>
      <ns1:Password>PASSWORD</ns1:Password>
    </ns1:Auth>
  </SOAP-ENV:Header>


Constructeur SoapHeader

  • « SoapHeader
  • SoapParam »
  • PHP Manual
  • SoapHeader
  • Constructeur SoapHeader

SoapHeader::__construct

(PHP 5, PHP 7, PHP 8)

SoapHeader::__construct — Constructeur SoapHeader

Description

SoapHeader::__construct ( string $namespace , string $name , mixed $data = ? , bool $mustunderstand = ? , string $actor = ? )

Construit un nouvel objet SoapHeader.

Liste de paramètres

namespace

L'espace de noms de l'élément d'entête SOAP.

name

Le nom de l'élément d'entête SOAP.

data

Un contenu de l'en-tête SOAP. Il peut être une valeur PHP ou un objet SoapVar.

mustUnderstand

Valeur de l'attribut mustUnderstand de l'élément d'entête SOAP.

actor

Valeur de l'attribut actor de l'élément d'entête SOAP.

Exemples

Exemple #1 Exemple avec SoapHeader::__construct()

<?php
$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
                                     'uri'      => "http://test-uri/"));
$client->__soapCall("echoVoid", null, null,
                new SoapHeader('http://soapinterop.org/echoheader/',
                               'echoMeStringRequest',
                               'hello world'));
?>

Voir aussi

  • SoapClient::__soapCall() - Appelle une fonction SOAP
  • SoapVar::__construct() - Constructeur SoapVar
  • SoapParam::__construct() - Constructeur SoapParam
  • SoapServer::addSoapHeader() - Ajoute un en-tête SOAP à une réponse

User Contributed Notes

There are no user contributed notes for this page.


La classe SoapParam

(PHP 5, PHP 7, PHP 8)

Introduction

Représente un paramètre dans un appel SOAP.

Synopsis de la classe

SoapParam {
/* Méthodes */
public __construct ( mixed $data , string $name )
}

Sommaire

  • SoapParam::__construct — Constructeur SoapParam

User Contributed Notes

There are no user contributed notes for this page.


Constructeur SoapParam

  • « SoapParam
  • SoapVar »
  • PHP Manual
  • SoapParam
  • Constructeur SoapParam

SoapParam::__construct

(PHP 5, PHP 7, PHP 8)

SoapParam::__construct — Constructeur SoapParam

Description

public SoapParam::__construct ( mixed $data , string $name )

Construit un nouvel objet SoapParam.

Liste de paramètres

data

Les données à passer ou à retourner. Vous pouvez passer ce paramètre directement en tant qu'une valeur PHP, mais dans ce cas, il sera nommé paramN et le service SOAP ne le comprendra pas.

name

Le nom du paramètre.

Exemples

Exemple #1 Exemple avec SoapParam::__construct()

<?php
$client = new SoapClient(null,array('location' => "http://localhost/soap.php",
                                    'uri'      => "http://test-uri/"));
$client->SomeFunction(new SoapParam($a, "a"),
                      new SoapParam($b, "b"),
                      new SoapParam($c, "c"));
?>

Voir aussi

  • SoapClient::__soapCall() - Appelle une fonction SOAP
  • SoapVar::__construct() - Constructeur SoapVar

User Contributed Notes

There are no user contributed notes for this page.


La classe SoapVar

(PHP 5, PHP 7, PHP 8)

Introduction

Une classe représentant une variable ou un objet qui utilise des services SOAP.

Synopsis de la classe

SoapVar {
/* Méthodes */
public __construct ( mixed $data , int|null $encoding , string $typeName = "" , string $typeNamespace = "" , string $nodeName = "" , string $nodeNamespace = "" )
}

Sommaire

  • SoapVar::__construct — Constructeur SoapVar

User Contributed Notes

seth dot johnson at gmail dot com 25-Feb-2015 12:09
It is not documented and thus may be subject to change but if you need to inspect the constructed SoapVar it sets everything you pass it on public variables:

<?php
$foo = new \stdClass();
$foosoap = new \SoapVar($foo, SOAP_ENC_OBJECT, 'Foo');
var_dump($foosoap);
echo $foosoap->enc_stype;
echo get_class($foosoap->enc_value);
?>

Will output (tested in PHP 5.3.3 cli):

object(SoapVar)#2 (3) {
  ["enc_type"]=>
  int(301)
  ["enc_value"]=>
  object(stdClass)#1 (0) {
  }
  ["enc_stype"]=>
  string(3) "Foo"
}

Foo
stdClass


Constructeur SoapVar

  • « SoapVar
  • Yar »
  • PHP Manual
  • SoapVar
  • Constructeur SoapVar

SoapVar::__construct

(PHP 5, PHP 7, PHP 8)

SoapVar::__construct — Constructeur SoapVar

Description

public SoapVar::__construct
 ( mixed $data
, int|null $encoding
, string $typeName = ""
, string $typeNamespace = ""
, string $nodeName = ""
, string $nodeNamespace = ""
)

Construit un nouvel objet SoapVar.

Liste de paramètres

data

Les données à passer ou à retourner.

encoding

L'ID d'encodage, une des constantes XSD_....

type_name

Le nom du type.

type_namespace

Le type de l'espace de noms.

node_name

Le nom du nœud XML.

node_namespace

L'espace de noms du nœud XML.

Exemples

Exemple #1 Exemple avec SoapVar::__construct()

<?php
class SOAPStruct {
    function SOAPStruct($s, $i, $f)
    {
        $this->varString = $s;
        $this->varInt = $i;
        $this->varFloat = $f;
    }
}
$client = new SoapClient(null, array('location' => "http://localhost/soap.php",
                                     'uri'      => "http://test-uri/"));
$struct = new SOAPStruct('arg', 34, 325.325);
$soapstruct = new SoapVar($struct, SOAP_ENC_OBJECT, "SOAPStruct", "http://soapinterop.org/xsd");
$client->echoStruct(new SoapParam($soapstruct, "inputStruct"));
?>

Voir aussi

  • SoapClient::__soapCall() - Appelle une fonction SOAP
  • SoapParam::__construct() - Constructeur SoapParam

User Contributed Notes

There are no user contributed notes for this page.


Yet Another RPC Framework

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Exemples
  • Yar_Server — La classe Yar_Server
    • Yar_Server::__construct — Enregistre un serveur
    • Yar_Server::handle — Démarre un serveur RPC
  • Yar_Client — La classe Yar_Client
    • Yar_Client::__call — Service d'appel
    • Yar_Client::__construct — Crée un client
    • Yar_Client::setOpt — Défini le contexte d'appel
  • Yar_Concurrent_Client — La classe Yar_Concurrent_Client
    • Yar_Concurrent_Client::call — Enregistre un appel concurrent
    • Yar_Concurrent_Client::loop — Envoi tous les appels
    • Yar_Concurrent_Client::reset — Nettoie tous les appels enregistré
  • Yar_Server_Exception — La classe Yar_Server_Exception
    • Yar_Server_Exception::getType — Récupérer le type de l'exception
  • Yar_Client_Exception — La classe Yar_Client_Exception
    • Yar_Client_Exception::getType — Récupérer le type de l'exception

User Contributed Notes

There are no user contributed notes for this page.


Introduction

Yar est un framework RPC qui a pour but de fournir une façon simple de communication entre les applications PHP. Il apporte la possibilité d'appeler plusieurs services distants simultanément.

User Contributed Notes

There are no user contributed notes for this page.


Pré-requis

Si vous voulez utiliser msgpack comme packager, vous devez compiler Yar vous même avec l'option de configuration ./configure --enable-msgpack

User Contributed Notes

There are no user contributed notes for this page.


Installation

Cette extension » PECL n'est pas intégrée à PHP.

Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » https://pecl.php.net/package/yar.

Aucune bibliothèque DLL pour cette extension PECL n'est actuellement disponible. Reportez-vous à la section Compilation sous Windows.

User Contributed Notes

liubinn_208391 at qq dot com 08-Dec-2013 05:35
Yar Concurrent Client doesn't work on Mac OS.  It is because the cURL shipped with Mac has some difference.

you can resolve that by install a new cURL, like (brew install curl).

then use :
"export DYLD_LIBRARY_PATH=/path-to-new-curl/lib:$DYLD_LIBRARY_PATH"

make the PHP use the new cURL.

of course you can also re-compile your PHP with --with-curl=/path-to-new-curl/


Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration Yar
Nom | Défaut | Modifiable | Historique
yar.packager | php | PHP_INI_SYSTEM |
yar.debug | Off | PHP_INI_ALL |
yar.connect_timeout | 1000 | PHP_INI_ALL |
yar.timeout | 5000 | PHP_INI_ALL |
yar.expose_info | On | PHP_INI_SYSTEM |

Voici un éclaircissement sur l'utilisation des directives de configuration.

yar.packager string

peut être php, json, et msgpack (nécessite une compilation avec le support msgpack)

yar.debug string

yar.connect_timeout int

délai d'attente maximal en ms

yar.timeout int

délai d'attente maximal en ms

yar.expose_info bool

si l'on doit ou non exposer les informations du service (lors de l'accès au serveur via GET)

User Contributed Notes

There are no user contributed notes for this page.


Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

YAR_VERSION (string)
YAR_CLIENT_PROTOCOL_HTTP (int)
YAR_OPT_PACKAGER (int)
YAR_OPT_TIMEOUT (int)
YAR_OPT_CONNECT_TIMEOUT (int)
YAR_OPT_HEADER (array)
Depuis 2.0.4
YAR_PACKAGER_PHP (string)
YAR_PACKAGER_JSON (string)
YAR_ERR_OKEY (int)
YAR_ERR_OUTPUT (int)
YAR_ERR_TRANSPORT (int)
YAR_ERR_REQUEST (int)
YAR_ERR_PROTOCOL (int)
YAR_ERR_PACKAGER (int)
YAR_ERR_EXCEPTION (int)

User Contributed Notes

There are no user contributed notes for this page.


Exemples

Exemple #1 Exemple de serveur Yar

<?php

/* supposons que cette page est accessible via l'URL http://example.com/operator.php */

class Operator {

    /**
     * Ajout de deux opérandes
     * @param interge
     * @return interge
     */
    public function add($a, $b) {
        return $this->_add($a, $b);
    }

    /**
     * Sub
     */
    public function sub($a, $b) {
        return $a - $b;
    }

    /**
     * Mul
     */
    public function mul($a, $b) {
        return $a * $b;
    }

    /**
     * Les méthodes protégées ne seront pas exposées
     * @param interge
     * @return interge
     */
    protected function _add($a, $b) {
        return $a + $b;
    }
}

$server = new Yar_Server(new Operator());
$server->handle();
?>

Exemple #2 Accès au serveur depuis un navigateur (requête GET)

Résultat de l'exemple ci-dessus est similaire à :

Information du serveur Yar

Exemple #3 Exemple de client Yar

<?php
$client = new yar_client("http://example.com/operator.php");

/* Appel direct */
var_dump($client->add(1, 2));

/* Appel via un appel */
var_dump($client->call("add", array(3, 2)));

/* la méthode __add ne peut être appelée */
var_dump($client->_add(1, 2));
?>

Résultat de l'exemple ci-dessus est similaire à :

int(3)
int(5)
PHP Fatal error:  Uncaught exception 'Yar_Server_Exception' with message 'call to api Operator::_add() failed' in *

Exemple #4 Exemple de client Yar concurrent

<?php
function callback($ret, $callinfo) {
    echo $callinfo['method'] , " result: ", $ret , "\n";
}

/* enregistre l'appel async aux services distants */
Yar_Concurrent_Client::call("http://example.com/operator.php", "add", array(1, 2), "callback");
Yar_Concurrent_Client::call("http://example.com/operator.php", "sub", array(2, 1), "callback");
Yar_Concurrent_Client::call("http://example.com/operator.php", "mul", array(2, 2), "callback");

/* envoi toutes les requêtes et attend les réponses */
Yar_Concurrent_Client::loop();
?>

Résultat de l'exemple ci-dessus est similaire à :

mul result: 4
sub result: 1
add result: 3

User Contributed Notes

124960772 at qq dot com 10-Nov-2015 11:03
<?php
function callback($ret, $callinfo) {
    echo $callinfo['method'] , " result: ", $ret , "\n";
}

/* ???????? */
Yar_Concurrent_Client::call("http://example.com/operator.php", "add", array(1, 2), "callback");
/* ?????????, ????, ???Yar???callback???? */
Yar_Concurrent_Client::loop();
/* ??call ,?????call???*/
Yar_Concurrent_Client::reset();
Yar_Concurrent_Client::call("http://example.com/operator.php", "sub", array(2, 1), "callback");
Yar_Concurrent_Client::loop();

?>


La classe Yar_Server

(No version information available, might only be in Git)

Introduction

Synopsis de la classe

Yar_Server {
/* Propriétés */
protected $_executor ;
/* Méthodes */
final public __construct ( Object $obj )
public handle ( ) : bool
}

Propriétés

_executor

Sommaire

  • Yar_Server::__construct — Enregistre un serveur
  • Yar_Server::handle — Démarre un serveur RPC

User Contributed Notes

There are no user contributed notes for this page.


Enregistre un serveur

  • « Yar_Server
  • Yar_Server::handle »
  • PHP Manual
  • Yar_Server
  • Enregistre un serveur

Yar_Server::__construct

(PECL yar >= 1.0.0)

Yar_Server::__construct — Enregistre un serveur

Description

final public Yar_Server::__construct ( Object $obj )

Configure un serveur Yar HTTP RPC. Toutes les méthodes publiques de l'objet $obj seront enregistrées comme un service RPC.

Liste de paramètres

obj

Un objet. Toutes les méthodes publiques de cet objet seront enregistrées comme services RPC.

Valeurs de retour

Une instance de la classe Yar_Server.

Exemples

Exemple #1 Exemple avec Yar_Server::__construct()

<?php
class API {
    /**
     * les informations seront générées automatiquement sur la page d'information du service.
     * @params
     * @return
     */
    public function some_method($parameter, $option = "foo") {
         return "some_method";
    }

    protected function client_can_not_see() {
    }
}

$service = new Yar_Server(new API());
$service->handle();
?>

Résultat de l'exemple ci-dessus est similaire à :

Voir aussi

  • Yar_Server::handle() - Démarre un serveur RPC
    •

User Contributed Notes

There are no user contributed notes for this page.


Démarre un serveur RPC

  • « Yar_Server::__construct
  • Yar_Client »
  • PHP Manual
  • Yar_Server
  • Démarre un serveur RPC

Yar_Server::handle

(PECL yar >= 1.0.0)

Yar_Server::handle — Démarre un serveur RPC

Description

public Yar_Server::handle ( ) : bool

Démarre un serveur RPC HTTP, et le rend prêt à accepter des requêtes RPC.

Note:

Les appels RPC sont envoyés par des requêtes HTTP POST. Si une requête HTTP GET est envoyé à l'URI, les informations du service (commenté dans la section ci-dessous) seront affichées sur la page.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un booléen.

Exemples

Exemple #1 Exemple avec Yar_Server::handle()

<?php
class API {
    /**
     * les informations seront générées automatiquement sur la page d'informations du service.
     * @params
     * @return
     */
    public function some_method($parameter, $option = "foo") {
    }

    protected function client_can_not_see() {
    }
}

$service = new Yar_Server(new API());
$service->handle();
?>

Résultat de l'exemple ci-dessus est similaire à :

Voir aussi

  • Yar_Server::__construct() - Enregistre un serveur
    •

User Contributed Notes

There are no user contributed notes for this page.


La classe Yar_Client

(No version information available, might only be in Git)

Introduction

Synopsis de la classe

Yar_Client {
/* Propriétés */
protected $_protocol ;
protected $_uri ;
protected $_options ;
protected $_running ;
/* Méthodes */
public __call ( string $method , array $parameters ) : void
final public __construct ( string $url , array $options = ? )
public setOpt ( int $name , mixed $value ) : Yar_Client|false
}

Propriétés

_protocol

_uri

_options

_running

Sommaire

  • Yar_Client::__call — Service d'appel
  • Yar_Client::__construct — Crée un client
  • Yar_Client::setOpt — Défini le contexte d'appel

User Contributed Notes

porschegt23 at foxmail dot com 05-Jul-2016 11:07
A simple example on here:

server.php
<?php
class API {

    public function api($parameter = "", $option = "foo") {
          return $this->client_can_not_see($parameter);
    }

    public function doAdd($a = 0, $b = 0) {
          return $a+$b;
    }

    protected function client_can_not_see( $name ) {
      return "??$name~";
    }
}

$service = new Yar_Server ( new API () );
$service->handle ();
?>
client.php
<?php
  $client = new Yar_Client("http://host/server.php");
  $result = $client->api("parameter");
  echo $result.'<hr>';
  echo $client->doAdd(10, 20);
?>


Service d'appel

  • « Yar_Client
  • Yar_Client::__construct »
  • PHP Manual
  • Yar_Client
  • Service d'appel

Yar_Client::__call

(PECL yar >= 1.0.0)

Yar_Client::__call — Service d'appel

Description

public Yar_Client::__call ( string $method , array $parameters ) : void

Envoi un appel à la méthode RPC distante.

Liste de paramètres

method

Nom de la méthode RPC distante.

parameters

Paramètres.

Valeurs de retour

Exemples

Exemple #1 Exemple avec Yar_Client::__call()

<?php

$client = new Yar_Client("http://host/api/");

/* Appel un service distant */
$result = $client->some_method("parameter");
?>

Résultat de l'exemple ci-dessus est similaire à :

Voir aussi

  • Yar_Client::setOpt() - Défini le contexte d'appel
    •

User Contributed Notes

There are no user contributed notes for this page.


Crée un client

  • « Yar_Client::__call
  • Yar_Client::setOpt »
  • PHP Manual
  • Yar_Client
  • Crée un client

Yar_Client::__construct

(PECL yar >= 1.0.0)

Yar_Client::__construct — Crée un client

Description

final public Yar_Client::__construct ( string $url , array $options = ? )

Crée un Yar_Client sur un serveur Yar_Server.

Liste de paramètres

url

URL du serveur Yar.

Valeurs de retour

Une instance Yar_Client.

Exemples

Exemple #1 Exemple avec Yar_Client::__construct()

<?php
$client = new Yar_Client("http://host/api/");
?>

Résultat de l'exemple ci-dessus est similaire à :

Voir aussi

  • Yar_Client::__call() - Service d'appel
    •

  • Yar_Client::setOpt() - Défini le contexte d'appel
    •

User Contributed Notes

There are no user contributed notes for this page.


Défini le contexte d'appel

  • « Yar_Client::__construct
  • Yar_Concurrent_Client »
  • PHP Manual
  • Yar_Client
  • Défini le contexte d'appel

Yar_Client::setOpt

(PECL yar >= 1.0.0)

Yar_Client::setOpt — Défini le contexte d'appel

Description

public Yar_Client::setOpt ( int $name , mixed $value ) : Yar_Client|false

Liste de paramètres

name

Peut être : YAR_OPT_PACKAGER, YAR_OPT_PERSISTENT (à besoin du support serveur), YAR_OPT_TIMEOUT, YAR_OPT_CONNECT_TIMEOUT YAR_OPT_HEADER (depuis 2.0.4)

value

Valeurs de retour

Retourne $this en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec Yar_Client::setOpt()

<?php

$cient = new Yar_Client("http://host/api/");

//Défini le délai d'attente maximal à 1s
$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, 1000);

//Défini le packager à JSON
$client->SetOpt(YAR_OPT_PACKAGER, "json");

//Défini l'en-tête personnalisée
$client->SetOpt(YAR_OPT_HEADER, array("hr1: val1", "hd2: val2"));

/* Appel le service distant */
$result = $client->some_method("parameter");
?>

Résultat de l'exemple ci-dessus est similaire à :

Voir aussi

  • Yar_Client::__call() - Service d'appel
    •

User Contributed Notes

There are no user contributed notes for this page.


La classe Yar_Concurrent_Client

(No version information available, might only be in Git)

Introduction

Synopsis de la classe

Yar_Concurrent_Client {
/* Propriétés */
static $_callstack ;
static $_callback ;
static $_error_callback ;
/* Méthodes */
public static call ( string $uri , string $method , array $parameters = ? , callable $callback = ? , callable $error_callback = ? , array $options = ? ) : int
public static loop ( callable $callback = ? , callable $error_callback = ? ) : bool
public static reset ( ) : bool
}

Propriétés

_callstack

_callback

_error_callback

Sommaire

  • Yar_Concurrent_Client::call — Enregistre un appel concurrent
  • Yar_Concurrent_Client::loop — Envoi tous les appels
  • Yar_Concurrent_Client::reset — Nettoie tous les appels enregistré

User Contributed Notes

There are no user contributed notes for this page.


Enregistre un appel concurrent

  • « Yar_Concurrent_Client
  • Yar_Concurrent_Client::loop »
  • PHP Manual
  • Yar_Concurrent_Client
  • Enregistre un appel concurrent

Yar_Concurrent_Client::call

(PECL yar >= 1.0.0)

Yar_Concurrent_Client::call — Enregistre un appel concurrent

Description

public static Yar_Concurrent_Client::call ( string $uri , string $method , array $parameters = ? , callable $callback = ? , callable $error_callback = ? , array $options = ? ) : int

Enregistre un appel RPC, mais ne l'envoie pas immédiatement ; il sera envoyé pendant l'appel à la méthode Yar_Concurrent_Client::loop()

Liste de paramètres

uri

L'URI du serveur RPC (http, tcp)

method

Nom du service (i.e. le nom de la méthode)

parameters

Paramètres

callback

Une fonction de rappel, qui sera appelée par le retour de la réponse.

Valeurs de retour

Un ID unique ; peut être utilisé pour identifier l'appel.

Exemples

Exemple #1 Exemple avec Yar_Concurrent_Client::call()

<?php
function callback($retval, $callinfo) {
     var_dump($retval);
}

function error_callback($type, $error, $callinfo) {
    error_log($error);
}

Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback");
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"));   // si la fonction de rappel n'est pas spécifiée,
                                                                               // la fonction de rappel de la boucle sera utilisée
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", NULL, array(YAR_OPT_PACKAGER => "json"));
                                                                               // ce serveur accepte le packager json
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", NULL, array(YAR_OPT_TIMEOUT=>1));
                                                                               // Délai d'attente maximal personnalisé

//Les requêtes ne sont pas envoyées pour le moment
?>

Résultat de l'exemple ci-dessus est similaire à :

Voir aussi

  • Yar_Concurrent_Client::loop() - Envoi tous les appels
    •

  • Yar_Concurrent_Client::reset() - Nettoie tous les appels enregistré
    •

  • Yar_Server::__construct() - Enregistre un serveur
    •

  • Yar_Server::handle() - Démarre un serveur RPC
    •

User Contributed Notes

There are no user contributed notes for this page.


Envoi tous les appels

  • « Yar_Concurrent_Client::call
  • Yar_Concurrent_Client::reset »
  • PHP Manual
  • Yar_Concurrent_Client
  • Envoi tous les appels

Yar_Concurrent_Client::loop

(PECL yar >= 1.0.0)

Yar_Concurrent_Client::loop — Envoi tous les appels

Description

public static Yar_Concurrent_Client::loop ( callable $callback = ? , callable $error_callback = ? ) : bool

Envoi tous les appels distants RPC enregistrés.

Liste de paramètres

callback

Si la fonction de rappel est définie, alors Yar appelera cette fonction de rappel après avoir envoyé tous les appels, et avant le retour des réponses, avec $callinfo vallant NULL.

Alors, si l'utilisateur ne spécifie pas de fonction de rappel lors de l'enregistrement d'appel concurrent, cette fonction de rappel sera utilisée pour gérer les réponses, sinon, la fonction de rappel spécifiée pendant l'enregistrement sera utilisée.

error_callback

Si la fonction de rappel est définie, alors Yar l'appelera lorsqu'une erreur surviendra.

Valeurs de retour

Exemples

Exemple #1 Exemple avec Yar_Concurrent_Client::loop()

<?php
function callback($retval, $callinfo) {
     if ($callinfo == NULL) {
        echo "Maintenant, toutes les requêtes ont été émises, et aucune réponse n'est pour l'instant disponible\n";
     } else {
        echo "Ceci est une réponse à un appel distant, le nom de la méthode est ", $callinfo["method"],
             ". La séquence d'appel est " , $callinfo["sequence"] , "\n";
        var_dump($retval);
     }
}

function error_callback($type, $error, $callinfo) {
    error_log($error);
}

Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback");
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"));   // Si la fonction de rappel n'est pas spécifiée
                                                                               // la fonction de rappel de la boucle sera utilisée
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", NULL, array(YAR_OPT_PACKAGER => "json"));
                                                                               // ce serveur accepte le packager json
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", NULL, array(YAR_OPT_TIMEOUT=>1));
                                                                               //Délai d'attente maximal personnalisé

Yar_Concurrent_Client::loop("callback", "error_callback"); //Envoi les requêtes,
                                                           //error_callback est optionnel
?>

Résultat de l'exemple ci-dessus est similaire à :

Maintenant, toutes les requêtes ont été émises, et aucune réponse n'est pour l'instant disponible
Ceci est une réponse à un appel distant, le nom de la méthode est some_method. La séquence d'appel est 4
string(11) "some_method"
Ceci est une réponse à un appel distant, le nom de la méthode est some_method. La séquence d'appel est 1
string(11) "some_method"
Ceci est une réponse à un appel distant, le nom de la méthode est some_method. La séquence d'appel est 2
string(11) "some_method"
Ceci est une réponse à un appel distant, le nom de la méthode est some_method. La séquence d'appel est 3
string(11) "some_method"

Voir aussi

  • Yar_Concurrent_Client::call() - Enregistre un appel concurrent
  • Yar_Concurrent_Client::reset() - Nettoie tous les appels enregistré
  • Yar_Server::__construct() - Enregistre un serveur
  • Yar_Server::handle() - Démarre un serveur RPC

User Contributed Notes

There are no user contributed notes for this page.


Nettoie tous les appels enregistré

  • « Yar_Concurrent_Client::loop
  • Yar_Server_Exception »
  • PHP Manual
  • Yar_Concurrent_Client
  • Nettoie tous les appels enregistré

Yar_Concurrent_Client::reset

(PECL yar >= 1.2.4)

Yar_Concurrent_Client::reset — Nettoie tous les appels enregistré

Description

public static Yar_Concurrent_Client::reset ( ) : bool

Nettoie tous les appels enregistré.

Liste de paramètres

Valeurs de retour

Exemples

Exemple #1 Exemple avec Yar_Concurrent_Client::reset()

Résultat de l'exemple ci-dessus est similaire à :

Voir aussi

  • Yar_Concurrent_Client::call() - Enregistre un appel concurrent
    •

  • Yar_Concurrent_Client::loop() - Envoi tous les appels
    •

  • Yar_Server::__construct() - Enregistre un serveur
    •

  • Yar_Server::handle() - Démarre un serveur RPC
    •

User Contributed Notes

There are no user contributed notes for this page.


La classe Yar_Server_Exception

(No version information available, might only be in Git)

Introduction

If service threw exceptions, A Yar_Server_Exception will be threw in client side.

Synopsis de la classe

Yar_Server_Exception extends Exception {
/* Propriétés */
protected $_type ;
/* Méthodes */
public getType ( ) : string
/* Méthodes héritées */
final public Exception::getMessage ( ) : string
final public Exception::getPrevious ( ) : Throwable
final public Exception::getCode ( ) : mixed
final public Exception::getFile ( ) : string
final public Exception::getLine ( ) : int
final public Exception::getTrace ( ) : array
final public Exception::getTraceAsString ( ) : string
public Exception::__toString ( ) : string
final private Exception::__clone ( ) : void
}

Propriétés

message

code

file

line

_type

Sommaire

  • Yar_Server_Exception::getType — Récupérer le type de l'exception

User Contributed Notes

There are no user contributed notes for this page.


Récupérer le type de l'exception

  • « Yar_Server_Exception
  • Yar_Client_Exception »
  • PHP Manual
  • Yar_Server_Exception
  • Récupérer le type de l'exception

Yar_Server_Exception::getType

(PECL yar >= 1.0.0)

Yar_Server_Exception::getType — Récupérer le type de l'exception

Description

public Yar_Server_Exception::getType ( ) : string

Récupère le type de l'exception émise par le serveur.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Une chaîne de caractères.

Exemples

Exemple #1 Exemple avec Yar_Server_Exception::getType()

//Server.php
<?php
class Custom_Exception extends Exception {};

class API {
    public function throw_exception($name) {
        throw new Custom_Exception($name);
    }
}

$service = new Yar_Server(new API());
$service->handle();
?>

//Client.php
<?php
$client = new Yar_Client("http://host/api.php");

try {
    $client->throw_exception("client");
} catch (Yar_Server_Exception $e) {
    var_dump($e->getType());
    var_dump($e->getMessage());
}

Résultat de l'exemple ci-dessus est similaire à :

string(16) "Custom_Exception"
string(6) "client"

Voir aussi

User Contributed Notes

There are no user contributed notes for this page.


La classe Yar_Client_Exception

(No version information available, might only be in Git)

Introduction

Synopsis de la classe

Yar_Client_Exception extends Exception {
/* Propriétés */
/* Méthodes */
public getType ( ) : void
/* Méthodes héritées */
final public Exception::getMessage ( ) : string
final public Exception::getPrevious ( ) : Throwable
final public Exception::getCode ( ) : mixed
final public Exception::getFile ( ) : string
final public Exception::getLine ( ) : int
final public Exception::getTrace ( ) : array
final public Exception::getTraceAsString ( ) : string
public Exception::__toString ( ) : string
final private Exception::__clone ( ) : void
}

Propriétés

message

code

file

line

Sommaire

  • Yar_Client_Exception::getType — Récupérer le type de l'exception

User Contributed Notes

There are no user contributed notes for this page.


Récupérer le type de l'exception

  • « Yar_Client_Exception
  • XML-RPC »
  • PHP Manual
  • Yar_Client_Exception
  • Récupérer le type de l'exception

Yar_Client_Exception::getType

(PECL yar >= 1.0.0)

Yar_Client_Exception::getType — Récupérer le type de l'exception

Description

public Yar_Client_Exception::getType ( ) : void

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Exemples

Exemple #1 Exemple avec Yar_Client_Exception::getType()

<?php

/* ... */

?>

Résultat de l'exemple ci-dessus est similaire à :

...

Voir aussi

User Contributed Notes

There are no user contributed notes for this page.


XML-RPC

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Fonctions XML-RPC
    • xmlrpc_decode_request — Décode le code XML en variables PHP natives
    • xmlrpc_decode — Décode le XML en types PHP natifs
    • xmlrpc_encode_request — Génère le XML pour une méthode
    • xmlrpc_encode — Génère le code XML pour une valeur PHP
    • xmlrpc_get_type — Retourne le type XMLRPC d'une valeur PHP
    • xmlrpc_is_fault — Détermine si un tableau de valeurs représente un XMLRPC
    • xmlrpc_parse_method_descriptions — Décode le code XML en une liste de descriptions de méthodes
    • xmlrpc_server_add_introspection_data — Ajoute des données d'introspection
    • xmlrpc_server_call_method — Analyse une requête XML et appelle les méthodes associées
    • xmlrpc_server_create — Crée un serveur XMLRPC
    • xmlrpc_server_destroy — Détruit un serveur XMLRPC
    • xmlrpc_server_register_introspection_callback — Enregistre une fonction PHP pour générer la documentation
    • xmlrpc_server_register_method — Enregistre une fonction PHP avec une méthode
    • xmlrpc_set_type — Définit le type xmlrpc, base64 ou datetime, d'une valeur PHP

User Contributed Notes

There are no user contributed notes for this page.


Introduction

Ces fonctions servent à écrire sur les serveurs XML-RPC, mais aussi sur les clients. Vous pouvez trouver plus d'informations sur XML-RPC sur » http://www.xmlrpc.com/, et plus de documentations sur cette extension et ces fonctions, sur » http://xmlrpc-epi.sourceforge.net/.

Avertissement

Cette extension est EXPERIMENTALE. Le comportement de cette extension, les noms de ses fonctions, et toute la documentation autour de cette extension peut changer sans préavis dans une prochaine version de PHP. Cette extension doit être utilisée à vos risques et périls.

User Contributed Notes

giunta dot gaetano at gmail dot com 29-Dec-2020 01:21
If you have troubles installing the php extension, there is an alternative package which tries to implement the same API  as pure-php library and can be installed via Composer: phpxmlrpc/polyfill-xmlrpc


Installation

Le support de XML-RPC n'est pas activé par défaut en PHP. Vous devez l'activer avec l'option de compilation --with-xmlrpc[=DIR].

User Contributed Notes

pitje 31-Jan-2021 07:40
according to php(dot)watch/versions/8.0/xmlrpc ,
PHP 8.0: XMLRPC extension is moved to PECL

checked, xmlrpc-1.0.0RC2 works for me
giunta dot gaetano at gmail dot com 29-Dec-2020 01:18
Here's what I had to do in order to install the xmlrpc extension on php 8 (from sury repos) on Ubuntu 16, as there is no package available via pecl or apt:

# build
git clone https://git.php.net/repository/pecl/networking/xmlrpc.git
export CPPFLAGS=-I/usr/include/libxml2/
cd xmlrpc && phpize && ./configure --with-expat && make && make install

# enable - this varies depending on your configuration; apache/nginx/fpm will also need to be restarted
echo "extension=xmlrpc.so" > /etc/php/8.0/mods-available/xmlrpc.ini
ln -s /etc/php/8.0/mods-available/xmlrpc.ini /etc/php/8.0/cli/conf.d/20-xmlrpc.ini
ln -s /etc/php/8.0/mods-available/xmlrpc.ini /etc/php/8.0/fpm/conf.d/20-xmlrpc.ini
Anonymous 15-Dec-2020 02:11
for centos try:
yum install php-xmlrpc
cnunez at cyberargsistemas dot com dot ar 17-Oct-2019 08:07
sudo apt-get install php7.2-xmlrpc


Types de ressources

Cette extension définit une ressource serveur XML-RPC, retournée par la fonction xmlrpc_server_create().

User Contributed Notes

There are no user contributed notes for this page.


Fonctions XML-RPC

Sommaire

  • xmlrpc_decode_request — Décode le code XML en variables PHP natives
  • xmlrpc_decode — Décode le XML en types PHP natifs
  • xmlrpc_encode_request — Génère le XML pour une méthode
  • xmlrpc_encode — Génère le code XML pour une valeur PHP
  • xmlrpc_get_type — Retourne le type XMLRPC d'une valeur PHP
  • xmlrpc_is_fault — Détermine si un tableau de valeurs représente un XMLRPC
  • xmlrpc_parse_method_descriptions — Décode le code XML en une liste de descriptions de méthodes
  • xmlrpc_server_add_introspection_data — Ajoute des données d'introspection
  • xmlrpc_server_call_method — Analyse une requête XML et appelle les méthodes associées
  • xmlrpc_server_create — Crée un serveur XMLRPC
  • xmlrpc_server_destroy — Détruit un serveur XMLRPC
  • xmlrpc_server_register_introspection_callback — Enregistre une fonction PHP pour générer la documentation
  • xmlrpc_server_register_method — Enregistre une fonction PHP avec une méthode
  • xmlrpc_set_type — Définit le type xmlrpc, base64 ou datetime, d'une valeur PHP

User Contributed Notes

digibrisk at gmail dot NOSPAM dot SPAMNO dot com 05-Oct-2007 03:24
Adding to what giunta dot gaetano at sea-aeroportimilano dot it and astrolox at lawyersonline dot co dot uk said about the Sourceforge PHP XML-RPC project: You can probably use function_exists() to determine whether the extension is installed so you don't have to incur performance costs. If it's not installed, then the function won't exist, and function_exists() returns false. You can then fall back on the alternative library if that's the case. For example:

<?php

if(!function_exists("xmlrpc_server_create")) {
    // include necessary files.
}

?>
handco at gmail dot com 20-Feb-2007 08:19
Hi,

A little snippet to implement OO XML RPC Server.

File RPCPlugin.php :

class RPCPlugins {

    private $plugins;

    function __construct ($pathname, $rpcServer) {
        $d = dir($pathname);
        while (($file = $d->read()) !== false) {
            if (ereg('(.*)\.php$', $file, $regs)) {
                include_once ($pathname . '/' . $file);
                $class=$regs[1];
                $this->plugins = new $class($rpcServer);
            }
        }
    }

}

class RPCPlugin {

    private $_rpcServer;

    function __construct($rpcServer) {
        $this->_rpcServer = $rpcServer;

        $methods = get_class_methods($this);

        foreach ($methods as $method) {
            if (substr($method, 0,1) != '_') {
                xmlrpc_server_register_method($rpcServer,get_class($this) . "." . $method,array(&$this,$method));
            }
        }

    }

}

An example of plugin in plugins/Test.php  :

 class Test extends RPCPlugin {

     function HelloWorld ($method, $params) {
         return "Hello World --->>" . $params[0];
     }

 }

Now the real server :

require_once 'RPCPlugin.php';

 $rpcServer = xmlrpc_server_create();

$plugins = new RPCPlugins(realpath('plugins/'), $rpcServer);

 $resp = xmlrpc_server_call_method($rpcServer,$HTTP_RAW_POST_DATA,null);
 if ($resp) {
     header ('Content-Type: text/xml');
     echo $resp;
 }
 xmlrpc_server_destroy($rpcServer)

Then you can call ethod by classname.method.
For this sample Test.HelloWorld

Hn'Co
giunta dot gaetano at sea-aeroportimilano dot it 13-Sep-2006 06:40
If you need to use this extension but are stuck on a server where it can not be installed, the php-xmlrpc library found at http://phpxmlrpc.sourceforge.net includes an emulation layer that aims to be 100% compatible with the API of the native extension (as part of the "extras" package since version 0.2).
This means your code should be able to run unmodified on top of the php-xmlrpc library. Of course performance will be at least an order of magnitude worse...
keithNO dot SPAMthornhill at gmail dot com 17-May-2006 02:16
for others attempting the same thing, here is what a function would look like if you wanted to send a base64 encoded file from a client and then save it onto the server. the other code necessary to call this function via an RPC is available in other comments so i won't repeat it.

parameters:
1 - name of file
2 - base64 encoded data of file

note the use of $file_data->scalar

<?
    function sendFile($method_name, $params, $user_data) {
        $file = "/somedir/" . $params[0];
        $file_data = $params[1];

        $fh = @fopen($file, "wb");
        if ($fh) {
            if (@fwrite($fh, $file_data->scalar)) {
                $msg = "success msg";
            } else {
                $msg = "couldn't write to file";
            }
            fclose($fh);
            return $msg;
        } else {
            return "couldn't open file";
        }
    }
?>
09-Mar-2006 12:47
This XML-RPC Service makes the use XML-RPC very esay.

<?php

/**
* function myfun() returns
*@return array
*/
function myfunc(){
    return $some_array;
}

$ws = new XML_RPC_Server();
$ws->registerFunction('myfunc');
$ws->run();

?>

http://www.pure-php.de/node/31

It creates also a simple docu.
http://www.pure-php.com/php/service.php?doc
john # curioussymbols com 19-Oct-2005 04:37
I couldn't make the 'xmlrpc_errors' php.ini setting do anything
noticeable (PHP 4.3.11), so I used the following code to report errors
from my XMLRPC server. Hope it's helpful for someone.

<?php
function return_xmlrpc_error($errno,$errstr,$errfile=NULL,$errline=NULL
       ,$errcontext=NULL){
    global $xmlrpc_server;
    if(!$xmlrpc_server)die("Error: $errstr in '$errfile', line '$errline'");

    header("Content-type: text/xml; CHARSET=Windows-1252");
    print(xmlrpc_encode(array(
        'faultCode'=>$errno
        ,'faultString'=>"Remote XMLRPC Error from
          ".$_SERVER['HTTP_HOST'].": $errstr in at $errfile:$errline"
    )));
    die();
}
set_error_handler('return_xmlrpc_error');
?>

In my server function, I just trigger_error("message",E_USER_ERROR)]
 if something can't be completed.

Then on the client side,
<?php
        $data =& xmlrpc_decode($response['body']);

        if(xmlrpc_is_fault($data)){
            trigger_error($data['faultString'],E_USER_ERROR);
        }
?>
martin dot rode at programmfabrik dot de 04-Aug-2005 05:28
To connect to a python xmlrpc server I use:

function do_call($host, $port, $request) {

    $url = "http://$host:$port/";
    $header[] = "Content-type: text/xml";
    $header[] = "Content-length: ".strlen($request);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $request);

    $data = curl_exec($ch);
    if (curl_errno($ch)) {
        print curl_error($ch);
    } else {
        curl_close($ch);
        return $data;
    }
}

$request = xmlrpc_encode_request('add', array(3, 4));
$response = do_call($host, $port, $request);
astrolox at lawyersonline dot co dot uk 22-Mar-2005 04:20
The PHP XML-RPC project at SourceForge makes life a hell of a lot easier. However, the project uses some function names which are identical to thoses provided by the XML-RPC extention.

If you are on a server with XML-RPC extension compiled in but wish to use the PHP based version then you will have to rename some of the functions.

I notice that sourceforce says there is activity on the project in 2005 but the last release was January 12, 2003.

I recommend that you use this not so friendly PHP extention if available. However this sourceforce project is still a good idea if you don't control which extenions are be available on the server.

http://phpxmlrpc.sourceforge.net/
Jerome Delamarche 14-Oct-2004 02:58
The documentation lacks an example that shows how to send a fault in a response. Here is how to do it:

$args = array("faultCode" => $errcode, "faultString" => $errmsg);
$resp = xmlrpc_encode_request(NULL,$args);
//echo $resp;
php at hendrik-krauss dot de 13-Aug-2004 12:38
On "datetime" values:

If you implement an XML-RPC server with these functions and a client calls a method on your server, sending a datetime as parameter (in ISO 8601 format, as specified at http://www.xmlrpc.com/spec), the PHP XML-RPC will pass your registered server method an object as parameter. That object, for example, looks like:
obj->type="datetime"
obj->scalar="20040420T13:32:40"
obj->timestamp=1082460760

If you do xmlrpc_get_type(obj), it will return "datetime", so presumably that function just returns the value of 'type'. 'scalar' seems to be the on-the-wire representation of the datetime (ISO 8601, exactly as received). 'timestamp' appears to be the ISO value in 'scalar' converted into a normal PHP timestamp (i.e. Unix time_t).

Note on 'scalar': Using a MySQL DB, we did something like  "select blah where start_time >= $obj->scalar ;". That actually worked and returned expected results, so MySQL appears to handle that ISO 8601 format correctly.
swunderlin at REMOVE-telemedia dot ch 09-Jun-2004 03:20
pear hs an XML_RPC package, if you can't recompile your php:
http://pear.php.net/package/XML_RPC
steph at zend dot com 08-Jun-2004 04:04
It took me a while to get a client together without external libraries.  This very basic client/server pair works on my home set-up - hopefully it will save the next xml-rpc virgin some grief.

/* clienttest.php */
<?php
function do_call($host, $port, $request) {

    $fp = fsockopen($host, $port, $errno, $errstr);
    $query = "POST /home/servertest.php HTTP/1.0\nUser_Agent: My Egg Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n";

    if (!fputs($fp, $query, strlen($query))) {
        $errstr = "Write error";
        return 0;
    }

    $contents = '';
    while (!feof($fp)) {
        $contents .= fgets($fp);
    }

    fclose($fp);
    return $contents;
}

$host = 'localhost';
$port = 80;
$request = xmlrpc_encode_request('cycle', 'egg');
$response = do_call($host, $port, $request);
/* do something with $response, e.g. print it */
?>

/* servertest.php */
<?php
function lifecycle($method, $params) {
/* $method = 'cycle', $params = (array of) request parameter(s); $data is also passed from xmlrpc_server_call_method, if we had any data to pass */
    switch($params[0]) {
        case 'egg':
            $reply = 'All eggs will be birds one day.';
        break;
        default:
            $reply = 'That must have been an otheregg';
    }
    return $reply;
}

$server = xmlrpc_server_create();

/* register the 'external' name and then the 'internal' name */
xmlrpc_server_register_method($server, "cycle", "lifecycle");

$request = $HTTP_RAW_POST_DATA; // no you don't need 'always on', and no $_POST doesn't work.

/* the parameters here are 'server, xml-string and user data'.  There's supposed to be an optional 'output options' array too, but I can't get it working :( hence header() call */
$response = xmlrpc_server_call_method($server, $request, null);
header('Content-Type: text/xml');
print $response;

xmlrpc_server_destroy($server);
?>
mboeren at php dot net 25-Feb-2004 04:34
Just a quick addition to my previous xmlrpc_client class: since you cannot use remote methods containing capital letters or methods from subhandlers (like 'system.listMethods()'), I added a 'call(...)' method to the class.

<?php
    // this method should be copy/pasted in the
    // xmlrpc_client class

    function call($function)
    {
        $return = NULL;
        $argv = func_get_args();
        array_shift($argv); // remove function argument
        $this->__call($function, $argv, &$return);
        return $return;
    }

    // now, you can also do
    $result = $client->call('system.listMethods');
    $sum = client->call('add', '1', '2');
?>
mboeren at php dot net 24-Feb-2004 07:01
I use the following code (requires the overload extension) to make developing clients easier:

<?php
include("utils/utils.php"); // from xmlrpc-epi utils

/*
Usage:
    $client = new xmlrpc_client("http://localhost:7080");
    print $client->echo('x')."\n";
    print $client->add(1, 3)."\n";

*/
class xmlrpc_client
{
    var $url;
    var $urlparts;

    function xmlrpc_client($url)
    {
        $this->url = $url;
        $this->urlparts = parse_url($this->url);
        foreach(array('scheme', 'host', 'user', 'pass', 'path',
                      'query', 'fragment')
                as $part) {
            if (!isset($this->urlparts[$part])) {
                $this->urlparts[$part] = NULL;
                }
            }
    }

    function __call($function, $arguments, &$return)
    {
        $requestprms['host'] = $this->urlparts['host'];
        $requestprms['port'] = $this->urlparts['port'];
        $requestprms['uri'] = $this->urlparts['path'];
        $requestprms['method'] = $function;
        $requestprms['args'] = $arguments;
        $requestprms['debug'] = 0;
        $requestprms['timeout'] = 0;
        $requestprms['user'] = NULL;
        $requestprms['pass'] = NULL;
        $requestprms['secure'] = 0;

        $result = xu_rpc_http_concise($requestprms);
        if (is_array($result) && isset($result['faultCode'])) {
            print('Error in xmlrpc call \''.$function.'\''."\n");
            print('  code   : '.$result['faultCode']."\n");
            print('  message: '.$result['faultString']."\n");
            return false;
            }
        $return = $result;
        return true;
    }

}
overload('xmlrpc_client');

?>
bmichael at goldparrot dot com 08-Feb-2003 09:52
If anyone is interested in making XMLRPC requests directly from the client, I have been able to get xmlrpc to
work with vcXMLRPC javascript backend.

After about 1 week of scanning the market, I found this solution to be the best on Javascript back end.  It uses the Microsoft.HTTP activeX control for IE, or HTTPRequest Object for Mozilla.

You include vc(Virtual Cowboys) vcXMLRPC.js file into your pages and make the rpc calls from with javascript to create the requests.

It works both ways.

Two Notes:

I have tested it on IE 6.02 and you need to change lines in ProcessRequest :
function to read:

  dom = this.getObject("XMLDOM",http.responseText);

and change the getObject function to use the latest ActiveX Control:

 MSXML2.XMLHTTP.3.0  (or 4.0)
 MSXML2.DOMDocument.3.0  (or 4.0)

The controls are found on MSDN in the Web Services -> XML area.

As another note, you DO NOT NEED the rpcproxy.cgi script to use this.  That is a proxy script to get around JS Security.  You can use PHP to build the proxy.  But, I was able to get the CGI working with GCC compiler on Solaris (change the -KPCI, depend and -x03 optimizer settings in the Makefile )
steve at orangeNOSPAMimagineering dot com 24-Aug-2002 01:32
There's a handy library by Keith Devens (version 2.2.1) at
http://www.keithdevens.com/software/xmlrpc/

Here is a sample client. It remotely calls sample.sumAndDifference
with two parameters (3 and 5).
It returns:

sum => 8
difference => -2

<?php
include ("kd_xmlrpc.php");
// define("XMLRPC_DEBUG", 0);    // Set to 1 for handy debugging

$method = "sample.sumAndDifference";
$params = XMLRPC_prepare(array(3,5));

$site = "xmlrpc-c.sourceforge.net";
$location = "/api/sample.php";

list($success, $result) = XMLRPC_request( $site, $location, $method, $params );

// XMLRPC_debug_print();    // uncomment for debugging

foreach ( $result as $key => $value ) {
          echo(" $key => $value \n");
}

?>
hfuecks at pinkgoblin dot com 15-Aug-2002 08:32
This extension does not handle the process of making making XML-RPC client requests via HTTP; it only prepares the XML-RPC request payload.

This differs from many other XML-RPC implementations but offers greater flexibility, allowing SSL connections, authentication headers and XML-RPC via other transports like SMTP.
ivanr at webkreator dot com 21-Jun-2002 11:50
For a really easy way to use this XML-RPC extension take a look at

XML-RPC Class Server (http://www.webkreator.com/php/xcs/)

It automatically creates servers out of PHP classes. Creating clients is almost as easy, especially with the recent addition of the overload extension to PHP (see http://www.php.net/manual/en/ref.overload.php).
nic at uklinux dot NOSPAM dot net 24-Apr-2002 09:05
An alternative XML-RPC implementation is available at http://xmlrpc.usefulinc.com - it's written in PHP so you can use it on servers for which you don't have the luxury of rebuilding PHP on.

nic


Décode le code XML en variables PHP natives

  • « Fonctions XML-RPC
  • xmlrpc_decode »
  • PHP Manual
  • Fonctions XML-RPC
  • Décode le code XML en variables PHP natives

xmlrpc_decode_request

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_decode_request — Décode le code XML en variables PHP natives

Description

xmlrpc_decode_request ( string $xml , string &$method , string $encoding = ? ) : mixed
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

User Contributed Notes

e dot sand at elisand dot com 22-Jun-2009 08:20
This function works exactly the same as xmlrpc_decode() except it gives you access to the method being called as well (xmlrpc_decode() only outputs the params from the XML-RPC call).

To use this function, simply create an empty variable to store the method string in, and then pass by reference like so:

<?php
$method = null;
$params = xmlrpc_decode_request('<xml rpc request>', &$method);
?>

What you will get back are the params stored in $params, and $method will have the method being requested.


Décode le XML en types PHP natifs

  • « xmlrpc_decode_request
  • xmlrpc_encode_request »
  • PHP Manual
  • Fonctions XML-RPC
  • Décode le XML en types PHP natifs

xmlrpc_decode

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_decode — Décode le XML en types PHP natifs

Description

xmlrpc_decode ( string $xml , string $encoding = "iso-8859-1" ) : mixed
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Liste de paramètres

xml

Réponse XML retournée par la méthode XMLRPC.

encoding

Encodage d'entrée, supporté par iconv.

Valeurs de retour

Retourne soit un tableau, soit un entier, soit une chaîne, soit un booléen, en fonction de la réponse retournée par la méthode XMLRPC.

Exemples

Voir l'exemple fourni avec la documentation de la fonction xmlrpc_encode_request().

Voir aussi

  • xmlrpc_encode_request() - Génère le XML pour une méthode
  • xmlrpc_is_fault() - Détermine si un tableau de valeurs représente un XMLRPC

User Contributed Notes

Alwin 18-May-2016 02:24
Note that from libxml 2.7.9+ there is a limit of 10MB for the XML-RPC response.

If the response is larger, xmlrpc_decode will simply return NULL.

There is currently no way to override this limit like we can with the other xml functions (LIBXML_PARSEHUGE)
carmageddon at gmail dot com 03-Jun-2013 07:42
Apparently there is a slight problem with xmlrpc_decode (or php) which re-formats this input: <value><double>0.000000</double></value>

As the double number 0.

To get around it, use: number_format($val, 2);
Output would be 0.00
phil dot berry at elise-international dot net 05-Sep-2011 08:09
Make sure the server isn't returning a string with a space for the first character, this fails in version 5.3.3 and the function returns null (though seems to be ok in 5.2).

Easily sorted by  trimming the response data:

<?php xmlrpc_decode( trim($response) ); ?>
ryon dot sherman at gmail dot com 21-Aug-2009 04:18
64 bit (i8) integers are not parsed by xmlrpc_decode().
Use a string replacement to work around this:

<?php

$xml = str_replace('i8>', 'i4>', $xml);

$decoded_xml = xmlrpc_decode($xml);

?>
david dot bachelart at polytechnique dot org 18-Jul-2004 08:18
Be careful with encodings, the xmlrpc-decode function is rather strict. For example, the following response parse returns NULL :

<?xml version="1.0"?>
<methodResponse>
   <params>
      <param>
         <value><string>a & b</string></value>
         </param>
      </params>
   </methodResponse>

You should use entities :
<?xml version="1.0"?>
<methodResponse>
   <params>
      <param>
         <value><string>a &amp; b</string></value>
         </param>
      </params>
   </methodResponse>

If your server does not encode responses properly, you may have to process responses before parse.
hfuecks at pinkgoblin dot com 16-Aug-2002 03:57
Use this with an XML-RPC client to decode a server response into native PHP variables. It will automatically translate the response XML-RPC data types into their PHP equivalents.

This function will return only false is there is any problem with format of the XML it receives.

The HTTP response header will need to be stripped off with something like;

<?php
$xml=(substr($response, strpos($response, "\r\n\r\n")+4));

$phpvars = xmlrpc_decode ($xml);
?>


Génère le XML pour une méthode

  • « xmlrpc_decode
  • xmlrpc_encode »
  • PHP Manual
  • Fonctions XML-RPC
  • Génère le XML pour une méthode

xmlrpc_encode_request

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_encode_request — Génère le XML pour une méthode

Description

xmlrpc_encode_request ( string $method , mixed $params , array $output_options = ? ) : string
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Liste de paramètres

method

Nom de la méthode à appeler.

params

Paramètres de la méthode, compatibles avec la signature de la méthode.

output_options

Tableau spécifiant les options de sortie pouvant contenir (les valeurs par défaut sont en gras) :

  • output_type: php, xml

  • verbosity: no_white_space, newlines_only, pretty

  • escaping: cdata, non-ascii, non-print, markup (peut être une chaîne avec une valeur ou un tableau avec plusieurs valeurs)

  • version: simple, xmlrpc, soap 1.1, auto

  • encoding: iso-8859-1, autres jeux de caractères supportés par iconv

Valeurs de retour

Retourne une chaîne contenant la représentation XML de la demande.

Exemples

Exemple #1 Exemple avec XMLRPC

<?php
$request = xmlrpc_encode_request("method", array(1, 2, 3));
$context = stream_context_create(array('http' => array(
    'method' => "POST",
    'header' => "Content-Type: text/xml",
    'content' => $request
)));
$file = file_get_contents("http://www.example.com/xmlrpc", false, $context);
$response = xmlrpc_decode($file);
if ($response && xmlrpc_is_fault($response)) {
    trigger_error("xmlrpc: $response[faultString] ($response[faultCode])");
} else {
    print_r($response);
}
?>

Voir aussi

  • stream_context_create() - Crée un contexte de flux
  • file_get_contents() - Lit tout un fichier dans une chaîne
  • xmlrpc_decode() - Décode le XML en types PHP natifs

User Contributed Notes

Anonymous 27-Aug-2009 12:33
ever tried transmitting an array like the following with xmlrpc?
$var1=array(7=>14,9=>18);

The output array looks quite different! It will look like that:
$var2=array(14,18);

The only solution i found is to prepend a space to the index:
$var3=array(' 7'=>14,' 9'=>18);

Using that method you'll get the right result. ($var1)
cometfish at hotmail dot com 01-Sep-2008 12:47
The example above is incorrect - the header needs to be an array, see post by "chris dot vigelius at gmx dot net": http://au.php.net/manual/en/function.stream-context-create.php#74431
His post also shows how to do browser authentication, as below:
<?php
   $request = xmlrpc_encode_request("methodName", array("methodParam"));
   $auth = base64_encode($username.":".$password);
   $header = (version_compare(phpversion(), '5.2.8'))
     ? array("Content-Type: text/xml","Authorization: Basic $auth")
     : "Content-Type: text/xml\r\nAuthorization: Basic $auth" ; //[1]
   $context = stream_context_create(array('http' => array(
      'method' => "POST",
      'header' => $header,
      'content' => $request
   )));
   $webservice="http://www.example.com/rpc";
   $file = file_get_contents($webservice, false, $context);
   $response = xmlrpc_decode($file);
   if (xmlrpc_is_fault($response)) {
      return "xmlrpc: $response[faultString] ($response[faultCode])";
   } else {
      return $response;
   }
?>

1 - EDITOR NOTE: THIS IS A FIX FROM "SandersWang dt php at gmail dot com"
fredrik at it dot cdon dot com 06-Feb-2008 05:05
It should be noted that encoding does not seem to encode anything, just specify what goes into the XML header.

We had problems with double-encoded UTF strings being saved to database when using this function, sending it of to a apache xml-rpc servlet and storing it in mysql database. It was solved by setting 'escaping' to just 'markup' and 'encoding' to 'UTF-8' (don't forget to set 'utf-8' in xmlrpc_decode too).

It seems that UTF-8 encoded strings gets escaped with their bytes as entities instead of their characters as entites.
handco at gmail dot com 12-Mar-2007 08:39
Simple OO client with function Overload :

the php metho test_helloworld is translated to xmlrpc method test.helloworld.

class RpcClient {

    private $_methods;
    private $_context;
    private $_url;

    function __construct ($url, $user, $passwd) {
        $auth = base64_encode(sprintf('%s:%s', $user,$passwd));
        $this->_context = stream_context_create(array(
            'http' => array(
                'method' => 'POST',
                'header' => "Content-Type: text/xml\r\n".
                            "Authorization: Basic $auth" ,

            )
        ));
        $this->_url = $url;

        $this->registerMethod ("Test_HelloWorld");

    }

    function __call($methodName, $params) {
        if (array_key_exists($methodName,$this->_methods)) {
            // on appelle la fonction RPC
            $m = str_replace('_', '.', $methodName);
            $r = xmlrpc_encode_request($m, $params,array('verbosity'=>'newlines_only'));
            $c = $this->_context;
            stream_context_set_option($c,'http','content',$r);
            $f = file_get_contents($this->_url,false,$c);
            $resp = xmlrpc_decode($f);
            return $resp;
        } else {
            // on appelle la fonction de l'objet
            call_user_method_array($methodName, $this,$params);
        }
    }

    private function registerMethod ($method) {
        $this->_methods[$method] = true;
    }

}
giunta dot gaetano at sea-aeroportimilano dot it 21-Aug-2006 03:54
Take care that this function will generate invalid xmlrpc content when invoked with certain parameters (said content will be happily parsed by the lib itself, but not by other implementations).

xmlrpc_encode_request(null, null)
will generate a response without a value

xmlrpc_encode_request('myfunc', array('faultCode' => 666, 'faultString' => 'hello world')
will generated a request containing a <fault> member instead of <params>
php at hendrik dash krauss dot de 28-May-2005 02:29
For examples / documentation of the array output_options, see http://xmlrpc-epi.sourceforge.net/main.php?t=php_api#output_options

In short, output_options lets you send compact xmlrpc (without all the "pretty whitespace" xmlrpc_encode adds normally), apply an own escaping table prior to sending, set the encoding, and a couple of other things (the page even says something about soap 1.1 ... I don't know details).
<URL:http://www.dlitz.net/go/contact/> 03-May-2004 11:28
Note that as far as I can tell, the &#10; characters generated by PHP in the base64 fields don't appear to violate the XML-RPC standard at all.  XML-RPC messages *are* in XML format, and as such, the XML entities should be getting decoded before being passed to a base64 decoder.  So, the previously-mentioned Jakarta-based XML-RPC server appears to violate the XML spec.  i.e. There's nothing here that needs to be "fixed" in PHP.
kelly at seankelly dot biz 28-Dec-2002 04:02
Binary strings (set with xmlrpc_set_type) go into a <base64>...</base64> block like you'd expect. But after every 80th character, this function inserts the XML entity "&#10;", which is a Unicode newline, as if to cause a line-wrap, which is admittedly silly.

Silly though it may be, it causes real problems for some XML-RPC servers, such as http://jakarta.apache.org/xmlrpc/ (nee Helma). Stripping out those entities with something like

$req = preg_replace('/&#10;/', '', xmlrpc_encode_request("my.method", $args));

works around the problem.
hfuecks at pinkgoblin dot com 15-Aug-2002 09:06
This function should be used by an XML-RPC client to create an XML payload for an XML-RPC request;

<?php
$params = "system.methodSignature";
$method = "system.methodHelp";
$request = xmlrpc_encode_request($method,$params);
echo ( $request );
?>

Produces;

<?xml version='1.0' encoding="iso-8859-1" ?>
<methodCall>
<methodName>system.methodHelp</methodName>
<params>
 <param>
  <value>
   <string>system.methodSignature</string>
  </value>
 </param>
</params>
</methodCall>

The second argument recognises the type of variable and generates the correct XML-RPC structure. See xmlrpc_encode() for more details.


Génère le code XML pour une valeur PHP

  • « xmlrpc_encode_request
  • xmlrpc_get_type »
  • PHP Manual
  • Fonctions XML-RPC
  • Génère le code XML pour une valeur PHP

xmlrpc_encode

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_encode — Génère le code XML pour une valeur PHP

Description

xmlrpc_encode ( mixed $value ) : string
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

User Contributed Notes

remi 13-May-2009 01:56
This xmlrpc_encode function doesn't generate the "methodResponse" tag required by some clients.

Using xmlrpc_encode_request seems better:

<?php
$xmlresponse = xmlrpc_encode_request(NULL, $phpresponse);

xmlrpc_encode(1) generate
<?xml version="1.0" encoding="utf-8"?>
<params>
<param>
 <value>
  <int>1</int>
 </value>
</param>
</params>

xmlrpc_encode_request(NULL,1) generate
<?xml version="1.0" encoding="iso-8859-1"?>
<methodResponse>
<params>
 <param>
  <value>
   <int>1</int>
  </value>
 </param>
</params>
</methodResponse>
?>
dave dot wilcock at gmail dot com 21-Sep-2007 07:05
Worth noting, you can use this function to generate fault response xml.

If you pass a pre-determined array into this function, as follows

<?
$myArray = array ("faultCode"=>1,"faultString"=>"Too many params");
$xml = xmlrpc_encode($myArray);
?>

... you will get output much like the following:

<?xml version="1.0" encoding="utf-8"?>
<fault>
<value>
 <struct>
  <member>
   <name>faultCode</name>
   <value>
    <int>4</int>
   </value>
  </member>
  <member>
   <name>faultString</name>
   <value>
    <string>Too many params</string>
   </value>
  </member>
 </struct>
</value>
</fault>

All that is needed to do here to make it valid XML-RPC is inject some of your own methodResponse tags.

Check the XML-RPC specification at http://www.xmlrpc.com/spec
08-Jun-2006 07:32
Another quirk (more of a bug i think) is the automatic encoding of hashes where all keys that begin with a digit between 1 and 9 are lost:
http://bugs.php.net/bug.php?id=37746

Luckily I found a quick workaround. Just append chr(0x00) to your keys and the xmlrpc response will be correct. Maybe this will apply to encoding of hashes for requests too.
Amir.LaherATcomplinetDOTcom 26-Aug-2005 01:54
Beware this quirk: when you xmlrpc_encode a hash into xmlrpc, numeric keys will not be kept. Even strings containing numbers-only will be lost.

i.e.: xmlrpc_decode(xmlrpc_encode(array('123'=>456)));
returns: array(0=>456);

Apparently this is intentional functionality (see http://bugs.php.net/bug.php?id=21949)

2 workarounds:
1. prepend/append a string (even whitespace) to all keys, and strip them out at the other end. eg array('key_123'=>456);
2. create an array of hashes. array(array('key'=>123,'value'=>456));

I favour the second option because it's more deliberate.

... this also applies to xmlrpc_encode_request()
hfuecks at pinkgoblin dot com 15-Aug-2002 08:16
This function would be used by an XML-RPC server to convert PHP variables into an XML-RPC response.

It would be used within the PHP functions defined using xmlrpc_server_register_method()

Uses PHP variable reflection to assign the correct data types for the XML-RPC response. For example;

<?php
$params = array ( "one"=>"red","two"=>"blue","three"=>"green" );

$response = xmlrpc_encode ( $params );

echo ( $response );
?>

Produces;

<?xml version='1.0' encoding="utf-8" ?>
<params>
<param>
 <value>
  <struct>
   <member>
    <name>one</name>
    <value>
     <string>red</string>
    </value>
   </member>
   <member>
    <name>two</name>
    <value>
     <string>blue</string>
    </value>
   </member>
   <member>
    <name>three</name>
    <value>
     <string>green</string>
    </value>
   </member>
  </struct>
 </value>
</param>
</params>

While
<?php
$params = array ( "red", "blue", "green" );

$response = xmlrpc_encode ( $params );

echo ( $response );
?>

produces;

<?xml version='1.0' encoding="utf-8" ?>
<params>
<param>
 <value>
  <array>
   <data>
    <value>
     <string>red</string>
    </value>
    <value>
     <string>blue</string>
    </value>
    <value>
     <string>green</string>
    </value>
   </data>
  </array>
 </value>
</param>
</params>

And

<?php
$params = 1;

$response = xmlrpc_encode ( $params );

echo ( $response );
?>

produces

<?xml version='1.0' encoding="utf-8" ?>
<params>
<param>
 <value>
  <int>1</int>
 </value>
</param>
</params>

It's useful to be aware of the settype() function (http://www.php.net/settype).

For binary base64 data and XML-RPC iso8601 date times the xmlrpc_set_type() function should be used on a PHP variable before using xmlrpc_encode()


Retourne le type XMLRPC d'une valeur PHP

  • « xmlrpc_encode
  • xmlrpc_is_fault »
  • PHP Manual
  • Fonctions XML-RPC
  • Retourne le type XMLRPC d'une valeur PHP

xmlrpc_get_type

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_get_type — Retourne le type XMLRPC d'une valeur PHP

Description

xmlrpc_get_type ( mixed $value ) : string

Particulièrement pratique pour les types chaînes de type base64 et datetime.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

value

Valeur PHP

Valeurs de retour

Retourne le type XML-RPC.

Exemples

Exemple #1 Exemple de type XML-RPC

<?php
echo xmlrpc_get_type(null) . "\n"; // base64
echo xmlrpc_get_type(false) . "\n"; // boolean
echo xmlrpc_get_type(1) . "\n"; // int
echo xmlrpc_get_type(1.0) . "\n"; // double
echo xmlrpc_get_type("") . "\n"; // string
echo xmlrpc_get_type(array()) . "\n"; // array
echo xmlrpc_get_type(new stdClass) . "\n"; // array
echo xmlrpc_get_type(STDIN) . "\n"; // int
?>

Voir aussi

  • xmlrpc_set_type() - Définit le type xmlrpc, base64 ou datetime, d'une valeur PHP

User Contributed Notes

hfuecks at pinkgoblin dot com 16-Aug-2002 10:41
This function returns the type of a PHP variable in XML-RPC terms. It won't "spot" base64 or iso8601 types unless they have been defined using xmlrpc_set_type().

For iso8601 type it returns "datetime".

Otherwise it returns strings corresponding directly the XML-RPC data types e.g. "struct","int","string","base64" etc.


Détermine si un tableau de valeurs représente un XMLRPC

  • « xmlrpc_get_type
  • xmlrpc_parse_method_descriptions »
  • PHP Manual
  • Fonctions XML-RPC
  • Détermine si un tableau de valeurs représente un XMLRPC

xmlrpc_is_fault

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

xmlrpc_is_fault — Détermine si un tableau de valeurs représente un XMLRPC

Description

xmlrpc_is_fault ( array $arg ) : bool
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Liste de paramètres

arg

Tableau retourné par la fonction xmlrpc_decode().

Valeurs de retour

Retourne true si l'argument signifie fault, false sinon. La description de fault est disponible dans la variable $arg["faultString"], le code de fault est disponible dans la variable $arg["faultCode"].

Exemples

Retrouvez un exemple avec la fonction xmlrpc_encode_request().

Voir aussi

  • xmlrpc_decode() - Décode le XML en types PHP natifs

User Contributed Notes

angelo at at dot com 25-Jan-2011 12:31
A note, response from xmlrpc_decode is not always an array. Whenever the XMLRPC server returns a string, xmlrpc_is_fault will complain about not being an array.

Best way to detect errors is

<?php

    $response = xmlrpc_decode($file);

    if (is_array($response) && xmlrpc_is_fault($response)) {
        throw new Exception($response['faultString'], $response['faultCode']);
    }

?>


Décode le code XML en une liste de descriptions de méthodes

  • « xmlrpc_is_fault
  • xmlrpc_server_add_introspection_data »
  • PHP Manual
  • Fonctions XML-RPC
  • Décode le code XML en une liste de descriptions de méthodes

xmlrpc_parse_method_descriptions

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_parse_method_descriptions — Décode le code XML en une liste de descriptions de méthodes

Description

xmlrpc_parse_method_descriptions ( string $xml ) : array
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

User Contributed Notes

giunta dot gaetano at gmail dot com 29-Dec-2020 05:05
The format for the xml string is the same that has to be returned by functions registered via calls to `xmlrpc_server_register_introspection_callback`.

It is documented at http://xmlrpc-epi.sourceforge.net/specs/rfc.system.describeMethods.php


Ajoute des données d'introspection

  • « xmlrpc_parse_method_descriptions
  • xmlrpc_server_call_method »
  • PHP Manual
  • Fonctions XML-RPC
  • Ajoute des données d'introspection

xmlrpc_server_add_introspection_data

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_server_add_introspection_data — Ajoute des données d'introspection

Description

xmlrpc_server_add_introspection_data ( resource $server , array $desc ) : int
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

User Contributed Notes

giunta dot gaetano at gmail dot com 29-Dec-2020 05:03
The format to be used for data in the $desc array is the same as returned by calls to function `xmlrpc_parse_method_descriptions`


Analyse une requête XML et appelle les méthodes associées

  • « xmlrpc_server_add_introspection_data
  • xmlrpc_server_create »
  • PHP Manual
  • Fonctions XML-RPC
  • Analyse une requête XML et appelle les méthodes associées

xmlrpc_server_call_method

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_server_call_method — Analyse une requête XML et appelle les méthodes associées

Description

xmlrpc_server_call_method ( resource $server , string $xml , mixed $user_data , array $output_options = ? ) : string
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

User Contributed Notes

marco.buratto at tiscali punto it 28-Dec-2006 08:15
xmlrpc_server_call_method() with class methods

<?php
require_once ('Connections/adodb_mysql_connection.php');

// Instantiating my own class
$my_report = new external_report($db_connection);

// Setting up the XML-RPC "server"
$xmlrpc_server_handler = xmlrpc_server_create();
xmlrpc_server_register_method($xmlrpc_server_handler, "external_method", array(&$my_report, "export"));

// Creating XML return data
if ($response = xmlrpc_server_call_method($xmlrpc_server_handler, $HTTP_RAW_POST_DATA, null))
    {
    header('Content-Type: text/xml');
    echo $response;
    }

// **************** class definition ****************

class external_report
    {
    protected $db_connection;

    public function __construct($db_connection_pointer)
        {
        if (method_exists($db_connection_pointer, "Execute")) $this->db_connection = $db_connection_pointer;
        else die("...");
        }

    public function export($method_name, $params_array)
        {
        $id_dir = (int)$params_array[0];
        $id_usr = (int)$params_array[1]; // not used, just an example
        // We have to add arguments' validating code here and NOT inside the constructor (as usual)
        // because arguments are passed directly by xmlrpc_server_call_method (?!!)

        $myexport = array();

        $dirs_query = "SELECT documento_id FROM tabella_cartelle WHERE cartella_id = ".$id_dir;
        $dirs_result = $this->db_connection->Execute($dirs_query) or die("...");

        $index = 0;
        while(!$dirs_result->EOF)
            {
            $docs_query = "SELECT codice, titolo FROM tabella_documenti WHERE id_documento = ".$dirs_result->Fields('documento_id');
            $docs_result = $this->db_connection->Execute($docs_query) or die("...");

            $myexport[$index]['codice'] = $docs_result->Fields('codice');
            $myexport[$index]['titolo'] = $docs_result->Fields('titolo');

            $index++;
            $dirs_result->MoveNext();
            }

        return $myexport;
        }
    }
?>
nyvsld at gmail dot com 27-Nov-2005 05:08
<?php
/* method implementation */
function impl($method_name,$params,$user_data){
  var_dump(func_get_args('impl'));
  return array_sum($params);
}

/* create server */
$s=xmlrpc_server_create();
xmlrpc_server_register_method($s,'add','impl');

/* calling server method */
$req=xmlrpc_encode_request('add',array(1,2,3));
$resp=xmlrpc_server_call_method($s,$req,array(3,4));

/* process result */
$decoded=xmlrpc_decode($resp);
if(xmlrpc_is_fault($decoded)){
    echo 'fault!';
}

var_dump($decoded);
?>


Crée un serveur XMLRPC

  • « xmlrpc_server_call_method
  • xmlrpc_server_destroy »
  • PHP Manual
  • Fonctions XML-RPC
  • Crée un serveur XMLRPC

xmlrpc_server_create

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_server_create — Crée un serveur XMLRPC

Description

xmlrpc_server_create ( ) : resource
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

User Contributed Notes

There are no user contributed notes for this page.


Détruit un serveur XMLRPC

  • « xmlrpc_server_create
  • xmlrpc_server_register_introspection_callback »
  • PHP Manual
  • Fonctions XML-RPC
  • Détruit un serveur XMLRPC

xmlrpc_server_destroy

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_server_destroy — Détruit un serveur XMLRPC

Description

xmlrpc_server_destroy ( resource $server ) : bool
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

User Contributed Notes

nospam at bigbadweb dot co dot uk 22-Nov-2005 02:26
This function returns true (1) if successful and false (0) if resource is invalid or could not be destroyed.


Enregistre une fonction PHP pour générer la documentation

  • « xmlrpc_server_destroy
  • xmlrpc_server_register_method »
  • PHP Manual
  • Fonctions XML-RPC
  • Enregistre une fonction PHP pour générer la documentation

xmlrpc_server_register_introspection_callback

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_server_register_introspection_callback — Enregistre une fonction PHP pour générer la documentation

Description

xmlrpc_server_register_introspection_callback ( resource $server , string $function ) : bool
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

User Contributed Notes

giunta dot gaetano at gmail dot com 29-Dec-2020 01:58
The introspection callback function should return an XML string with the following format:

<?xml version='1.0'?>
<introspection version='1.0'>
 <methodList>
  <methodDescription name='introspection.hello'>
   <author>Dan Libby</author>
   <purpose>greets the caller and demonstrates use of introspection mechanism</purpose>
   <signatures>
    <signature>
     <params>
      <value type='string' name='name'>name of the caller</value>
     </params>
     <returns>
      <value type='string'>a greeting to the caller</value>
     </returns>
    </signature>
   </signatures>
   <see><item>system.listMethods</item></see>
   <examples/>
   <errors>
      <item>returns fault code 1 if the caller's name is not specified</item>
   </errors>
   <notes>
    <item>this is a lame example</item>
    <item>example of multiple notes</item>
   </notes>
   <bugs/>
   <todo/>
  </methodDescription>
 </methodList>
</introspection>


Enregistre une fonction PHP avec une méthode

  • « xmlrpc_server_register_introspection_callback
  • xmlrpc_set_type »
  • PHP Manual
  • Fonctions XML-RPC
  • Enregistre une fonction PHP avec une méthode

xmlrpc_server_register_method

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_server_register_method — Enregistre une fonction PHP avec une méthode

Description

xmlrpc_server_register_method ( resource $server , string $method_name , string $function ) : bool
Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

User Contributed Notes

giunta dot gaetano at gmail dot com 30-Dec-2020 09:02
Note 1: even if you add introspection data via calls to `xmlrpc_server_register_introspection_callback` or `xmlrpc_server_add_introspection_data`, the server will not validate for you the number or type of received parameters.
This means that you have to implement all required validation of the received parameters in your php function.

Note 2: take care about dealing with base64 and datetime values in the received parameters: those are not automatically transformed into php scalar values, but into stdClass objects with members `xmlrpc_type` and `scalar`
giunta dot gaetano at sea-aeroportimilano dot it 11-Aug-2006 06:55
To have an xmlrpc fault response programatically generated by the server, the php function registered as method handler must return an array containing a FaultCode and a FaultString members.

function $myfunc($methodname, $vals, $extra_data)
{
...
return array('faultCode' => 666, 'faultString' => 'DOH!');
}
nyvsld at gmail dot com 27-Nov-2005 05:03
prototype of registered function:

function method_impl(string $method_name, array $params, array $user_data);

$method_name
    the public method name, known by calling client
$params
    parameters specified by calling client
$user_data
    any local data, passed by `xmlrpc_server_call_method'
dante at lorenso dot com 11-Aug-2005 12:46
To register a callback to a 'static' function within the same class, consider a syntax like the following:
<code>
$callback = array (__CLASS__, "my_function_name");
xmlrpc_server_register_method($xmlrpc_server, "my_function", $callback);
</code>
Doing it this way makes it easier to rename your class later.
eiriks at hollowmatrix dot com 28-Mar-2005 03:08
Remember that you can't do like Chrigu and Nate said if you want to add methods from a static class (Hence you can't create any instances of it).
A workaround is to create lambda functions calling the
methods:

// Our static handler class
static class MyHandler
{
    public function getPrice($item)
    {
        $prices = array("apple" => 4, "orange" => 5);
        return $prices[$item];
    }
    public function buy($item, $number)
    {
        $price = self::getPrice($item) * $number;
        do_thing_to_sell_the_item();
        return $price;
    }
}

// Use reflection to get method names and parameters
$mirror = new ReflectionClass("MyHandler");
foreach ($mirror->getMethods() as $method)
{
    // Create new "lambda" function for each method

    // Generate argument list
    $args = array();
    foreach ($method->getParameters() as $param)
    {
        $args[] = '$'.$param->getName();
    }
    $args = implode(',', $args);

    // Generate code
    $methodname = $method->getName();
    $code = "return {$real_class}::{$methodname}({$args});";

    // Create function, retrieve function name
    $function_name = create_function($args, $code);

    // Register the function
    xmlrpc_server_register_method($myserver, $methodname, $function_name);
}
Nate Parsons 29-Apr-2003 03:12
In case its not completely obvious what Chrigu meant,

You can register a method inside your class by doing the following:

xml_rpc_server_register_methode($xmlrpc_server, "myClientCall", array(&$this, "handleClientCallFunc"));

where $this == the magic class $this. =)
18-Nov-2002 10:40
Here is an example how to register a class methode:

xml_rpc_server_register_methode($xmlrpc_server, "foo", array(&$bar, "foo_func"));

where $bar is the instance of your class and foo_func a methode of this class. Don't forget the '&'!

hope this may be useful...

Chrigu


Définit le type xmlrpc, base64 ou datetime, d'une valeur PHP

  • « xmlrpc_server_register_method
  • Extensions pour Windows uniquement »
  • PHP Manual
  • Fonctions XML-RPC
  • Définit le type xmlrpc, base64 ou datetime, d'une valeur PHP

xmlrpc_set_type

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

xmlrpc_set_type — Définit le type xmlrpc, base64 ou datetime, d'une valeur PHP

Description

xmlrpc_set_type ( string &$value , string $type ) : bool

xmlrpc_set_type() définit le type XMLRPC, base64 ou datetime, pour une chaîne PHP.

Avertissement

Cette fonction est EXPERIMENTALE. Le comportement de cette fonction, son nom, et toute la documentation autour de cette fonction peut changer sans préavis dans une prochaine version de PHP. Cette fonction doit être utilisée à vos risques et périls.

Liste de paramètres

value

Valeur dont on veut modifier le type

type

base64 ou datetime

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient. En cas de réussite, value sera converti en objet.

Exemples

Exemple #1 Exemple avec xmlrpc_set_type()

<?php

$params = date("Ymd\TH:i:s", time());
xmlrpc_set_type($params, 'datetime');
echo xmlrpc_encode($params);

?>

Résultat de l'exemple ci-dessus est similaire à :

<?xml version="1.0" encoding="utf-8"?>
<params>
<param>
 <value>
  <dateTime.iso8601>20090322T23:43:03</dateTime.iso8601>
 </value>
</param>
</params>

Erreurs / Exceptions

Émet une alerte de type E_WARNING lorsque le type n'est pas supporté par XMLRPC.

User Contributed Notes

bmatheny at mobocracy dot net 24-Mar-2006 03:08
The following code segfaults some older (pre 5.1.2) versions of PHP:

$foo = date('c', time());
xmlrpc_set_type($foo, 'datetime');

Please upgrade before reporting as a bug.
shem((at))etkDOTca [aka.Przemyslaw Szot] 30-Oct-2004 02:23
Once you use the xmlrpc_set_type function, the data is encoded into a PHP object.  In your XMLRPC server, in order to access the data you must be able to access the necessary part of the object.

So.. to expend on the example above:

<---------- CLIENT ---------->
$string = "My logging event.";
$date = "20030115T12:22:37"; // Must be this format
$binary = fread($fp, 128);
xmlrpc_set_type(&$date, "datetime");
xmlrpc_set_type(&$binary, "base64");
$xmlrpcReq = xmlrpc_encode_request("log.data", array($string, $date, $binary));

In order to retrieve the binary file data you would need to get the scalar portion of the object:

<---------- SERVER ------------>
$string=$params[0];
$date_obj=$params[1];
$binary_obj=$params[2];

$date=$date_obj->scalar;
$binary_data=$binary_obj->scalar;

// Then you can proceed to write the binary
fwrite($handle,$binary_data);
kelly at seankelly dot biz 28-Dec-2002 07:53
The problem is that PHP has a string type which is also used to hold binary data and dates.  But XML-RPC defines three separate types for strings, binary data, and dates.  How do you tell how you want strings encoded?  That's where this function comes in.

Suppose the XML-RPC method "log.data" took a string, a date, and a binary object.  To tell XML-RPC that the date (which is a PHP string) is a really a date and that the binary data (which is also a PHP string) is really binary data, try:

$string = "My logging event.";
$date = "20030115T12:22:37"; // Must be this format
$binary = fread($fp, 128);
xmlrpc_set_type(&$date, "datetime");
xmlrpc_set_type(&$binary, "base64");
$xmlrpcReq = xmlrpc_encode_request("log.data", array($string, $date, $binary));

Note the reference passing in the calls to xmlrpc_set_type; that enables the function to change the values from strings into what xmlrpc_encode/_request expects (which are objects that include a bonus field that tells the desired XML-RPC type).


Extensions pour Windows uniquement

  • COM — COM et .Net (Windows)
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Erreur et gestion des erreurs
    • Exemples
    • com — La classe com
    • dotnet — La classe dotnet
    • variant — La classe variant
    • COMPersistHelper — The COMPersistHelper class
    • com_exception — La classe The com_exception
    • Fonctions COM et .Net (Windows)
  • win32service
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Win32ServiceException — La class Win32ServiceException
    • Exemples
    • Fonctions win32service

User Contributed Notes

There are no user contributed notes for this page.


COM et .Net (Windows)

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Erreur et gestion des erreurs
  • Exemples
    • For Each
    • Tableaux et propriétés à la façon des tableaux de COM
  • com — La classe com
    • com::__construct — Constructeur de la classe com
  • dotnet — La classe dotnet
    • dotnet::__construct — Constructeur de la classe dotnet
  • variant — La classe variant
    • variant::__construct — Constructeur de la classe variant
  • COMPersistHelper — The COMPersistHelper class
    • COMPersistHelper::__construct — Construct a COMPersistHelper object
    • COMPersistHelper::GetCurFileName — Get current filename
    • COMPersistHelper::GetMaxStreamSize — Get maximum stream size
    • COMPersistHelper::InitNew — Initialize object to default state
    • COMPersistHelper::LoadFromFile — Load object from file
    • COMPersistHelper::LoadFromStream — Load object from stream
    • COMPersistHelper::SaveToFile — Save object to file
    • COMPersistHelper::SaveToStream — Save object to stream
  • com_exception — La classe The com_exception
  • Fonctions COM et .Net (Windows)
    • com_create_guid — Génère un identifiant unique global (GUID)
    • com_event_sink — Connecte des événements d'un objet COM sur un objet PHP
    • com_get_active_object — Retourne un objet représentant l'instance actuelle d'un objet COM
    • com_load_typelib — Charge un Typelib
    • com_message_pump — Traite un message COM dans un délai donné
    • com_print_typeinfo — Affiche une définition de classe PHP pour une interface répartissable
    • variant_abs — Retourne la valeur absolue d'un variant
    • variant_add — "Ajoute" deux valeurs de variants et retourne le résultat
    • variant_and — Effectue un ET entre deux variants et retourne le résultat
    • variant_cast — Convertit un variant en un nouvel objet variant de type différent
    • variant_cat — Assemble deux valeurs variantes ensemble et retourne le résultat
    • variant_cmp — Compare deux variants
    • variant_date_from_timestamp — Retourne une représentation date en variant d'un timestamp Unix
    • variant_date_to_timestamp — Convertit une valeur date/temps variante en un timestamp Unix
    • variant_div — Retourne le résultat de la division de deux variants
    • variant_eqv — Effectue une équivalence de bits de deux variants
    • variant_fix — Récupère la portion entière d'un variant
    • variant_get_type — Retourne le type d'un objet variant
    • variant_idiv — Convertit des variants en valeurs entières, et effectue alors une division
    • variant_imp — Exécute une implication sur les bits de deux variants
    • variant_int — Retourne la partie entière d'un variant
    • variant_mod — Divise deux variantes et retourne le reste
    • variant_mul — Multiplie les valeurs de deux variants
    • variant_neg — Effectue une négation logique sur un variant
    • variant_not — Exécute une négation sur les bits sur un variant
    • variant_or — Performe une disjonction logique sur deux variants
    • variant_pow — Retourne le résultat de la fonction puissance avec deux variants
    • variant_round — Arrondit le variant au nombre spécifié de décimales
    • variant_set_type — Convertit un variant en un autre type "sur-place"
    • variant_set — Assigne une nouvelle valeur pour un objet variant
    • variant_sub — Soustrait la valeur du variant de droite de la valeur de celui de gauche
    • variant_xor — Exécute une exclusion logique sur deux variants

User Contributed Notes

robert dot johnson at icap dot com 24-Jul-2012 09:30
(From?) PHP 5.4.5 for Windows:

If you are seeing this in your error log:

Fatal error:  Class 'COM' not found

You require this in php.ini:

[PHP_COM_DOTNET]
extension=php_com_dotnet.dll

Previously it was compiled as built-in on the Windows build.  I assume this has happened because the com extension can now be built as a shared component.
Anonymous 23-Sep-2009 05:00
Add hyperlink at a Word Document's bookmark

<?php
// Create COM instance to word
       function clsMSWord($Visible = false)
       {
           $this->handle = new COM("word.application") or die("Unable to instanciate Word");
           $this->handle->Visible = $Visible;
       }

function WriteHyperlink($Bookmark,$Path,$Text)
       {
               $objBookmark = $this->handle->ActiveDocument->Bookmarks($Bookmark);
               $range = $objBookmark->Range;
               $objHyperlink = $this->handle->ActiveDocument->Hyperlinks;
               $objHyperlink->add($range,$Path,"","",$Text);

       }
?>
Dave Bachtel 27-May-2009 02:20
Hello everybody!

Here is some helpful advice for people attempting to use COM with Microsoft MapPoint 2006 or 2009 with PHP.

If you are using apache, it MUST be running under the same credentials as a desktop user that has already installed/run mappoint or modifiy the service and select the "Allow Service to Interact with Desktop" option.  Otherwise, it won't work due to the EULA popup having to be accepted.  Mappoint 2004 works just fine, this only applies to 2006 and 2009.

For troubleshooting, the error that appears in the System event viewer is:
The server {31851F82-AFE6-11D2-A3C9-00C04F72F340} did not register with DCOM within the required timeout.

The error generated by PHP, if you happen to get lucky and let the COM() function timeout by cranking up set_time_limit() timeout is:
<?php

set_time_limit(1000) ;

$mapoint =  new COM("MapPoint.Application") or die("Unable to instantiate Mappoint COM object");

?>
Generates:
Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `MapPoint.Application': Server execution failed ' in [somefile.php]:9 Stack trace: #0 [somefile.php](9): com->com('MapPoint.Applic...') #1 {main} thrown in [somefile.php] on line 9

Also, if you have multiple versions of MapPoint installed, you will need to run:
c:\path\to\mappoint\MapPoint.exe /registerserver

(using the correct folder path) to select the right version of the com object to use.  Gooood luck!
acsandeep at gmail dot com 04-Apr-2009 09:40
If you are trying to get the properties of a Word document opened via COM object, you may need to define some constants in your script like so.

<?php
define('wdPropertyTitle', 1);
define('wdPropertySubject', 2);
define('wdPropertyAuthor', 3);
define('wdPropertyKeywords', 4);
define('wdPropertyComments', 5);
define('wdPropertyTemplate', 6);
define('wdPropertyLastAuthor', 7);

$word = new COM("word.application") or die ("Could not initialise MS Word object.");
$word->Documents->Open(realpath("Sample.doc"));
$Author = $word->ActiveDocument->BuiltInDocumentProperties(wdPropertyAuthor);

echo $Author;
?>
long2hu3 ATT yahoo DOTT com 18-Mar-2009 04:38
When you work with MS Excel, Word, ... and other applications, never forget that COM doesn’t know their predefined constants, thus if you want to do sth. that would look like this in VB:

With myRange.Borders(xlEdgeBottom)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
End With

you should either use numbers or define constants above, like this:

<?php

define('xlEdgeBottom', 9);
define('xlContinuous', 1);
define('xlThin', 2);
define('xlAutomatic', -4105);

$ex = new COM("Excel.Application", NULL, CP_UTF8) or Die ("Did not instantiate Excel");
$wb = $ex->Application->Workbooks->Add();
$ws = $wb->Worksheets(1);

$xra = $ws->Range("A1:A6");

$bs = $xra->Borders(xlEdgeBottom);
$bs->LineStyle = xlContinuous;
$bs->Weight = xlThin;
$bs->ColorIndex = xlAutomatic;

?>

It is pointless to try to use text strings, i.e.

<?php

$bs = $xra->Borders('xlEdgeBottom');
$bs->Weight = 'xlThin';

?>

this will cause an error: Unable to set property Weight of class Border ...
ilayansmano at gmail dot com 26-Aug-2008 01:39
Extracting text from Word Documents via PHP and COM

<?php
$word = new COM("word.application") or die ("Could not initialise MS Word object.");
$word->Documents->Open(realpath("Sample.doc"));

// Extract content.
$content = (string) $word->ActiveDocument->Content;

echo $content;

$word->ActiveDocument->Close(false);

$word->Quit();
$word = null;
unset($word);
?>


Introduction

COM est un acronyme pour Component Object Model; c'est une couche orientée objet (et services associés) au-dessus de DCE RPC (un standard libre) qui définit une convention de nommage commune permettant à un code écrit en n'importe quel langage de communiquer avec du code écrit dans un autre langage, pour peu que ces deux langages soient compatibles avec COM. Les codes n'ont pas besoin de faire partie du même exécutable. le code peut être chargé à partir d'une DLL, trouvé dans un autre processus fonctionnant sur le même serveur, ou, avec DCOM (Distributed COM), trouvé sur une machine distante, sans même que votre code ait à savoir où il se trouve.

Il y a une partie de COM connue sous le nom de OLE Automation qui comprend un jeu d'interfaces COM qui permettent de perdre l'attache aux objets COM, pour qu'ils puissent être découverts et appelés en cours d'exécution sans savoir au moment de la compilation comment l'objet fonctionne. L'extension COM de PHP utilise les interfaces OLE Automation pour vous permettre de créer et appeler des objets compatibles depuis vos scripts. Techniquement parlant, cela devrait vraiment s'appeler "the OLE Automation Extension for PHP", puisque tous les objets COM ne sont pas forcément compatibles OLE.

Maintenant, pourquoi voudriez-vous ou devriez-vous utiliser COM ? COM est l'une des méthodes les plus utilisées pour faire communiquer des applications et des composants sur les plates-formes Windows. En utilisant COM, vous pouvez ouvrir un document Microsoft Word, remplir un fichier de gabarit et le sauvegarder pour l'envoyer par courrier à votre visiteur. Vous pouvez aussi utiliser COM pour effectuer des tâches administratives sur votre réseau et configurer IIS ; ce ne sont que les utilisations les plus habituelles, vous pouvez faire beaucoup plus avec COM.

De plus, nous supportons l'instanciation et la création d'assemblées .Net utilisant une couche d'interopérabilité COM fournie par Microsoft.

User Contributed Notes

There are no user contributed notes for this page.


Pré-requis

Les fonctions COM ne sont disponibles que sous les versions Windows de PHP.

Le support .Net nécessite le gestionnaire .Net.

User Contributed Notes

There are no user contributed notes for this page.


Installation

Depuis PHP 5.3.15 / 5.4.5, cette extension requiert que la bibliothèque php_com_dotnet.dll soit activée dans votre php.ini pour pouvoir utiliser ces fonctions. Les précédentes versions de PHP activaient cette extension par défaut.

Vous êtes responsable de l'installation des divers objets COM dont vous auriez besoin (comme Ms Word) ; nous ne pouvons tous les inclure dans PHP.

User Contributed Notes

There are no user contributed notes for this page.


Configuration à l'exécution

Le comportement de ces fonctions est affecté par la configuration dans le fichier php.ini.

Options de configuration pour COM
Nom | Défaut | Modifiable | Historique
com.allow_dcom | "0" | PHP_INI_SYSTEM |
com.autoregister_typelib | "0" | PHP_INI_ALL |
com.autoregister_verbose | "0" | PHP_INI_ALL |
com.autoregister_casesensitive | "1" | PHP_INI_ALL |
com.code_page | "" | PHP_INI_ALL |
com.dotnet_version | "" | PHP_INI_SYSTEM | Depuis PHP 8.0.0
com.typelib_file | "" | PHP_INI_SYSTEM |
Pour plus de détails sur les modes PHP_INI_*, reportez-vous à Où une directive de configuration peut être modifiée.

Voici un éclaircissement sur l'utilisation des directives de configuration.

com.allow_dcom

Si cette directive est activée, PHP aura la permission d'opérer comme un client D-COM (Distributed COM) et permettra à PHP d'instancier des objets COM sur un serveur distant.

com.autoregister_typelib

Si cette directive est activée, PHP essayera de déclarer des constantes provenant de la bibliothèque typelibrary des objets COM qu'il instancie, si ces objets implémentent l'interface demandée pour obtenir les données demandées. La sensibilité des constantes à la casse est contrôlée par la directive de configuration .

com.autoregister_verbose

Quand cette directive est activée, tout problème rencontré lors du chargement d'une typelibrary durant l'instanciation de l'objet sera reporté en utilisant le mécanisme d'erreurs de PHP. Par défaut, elle est désactivée, ce qui ne donne aucune indication sur l'échec de l'opération lors d'une recherche ou d'un chargement de la bibliothèque de type.

com.autoregister_casesensitive

Cette directive est activée par défaut et fait que les constantes trouvées dans les bibliothèques de types auto-chargé lors de l'instanciation d'objets COM seront enregistrées en mode sensible à la casse. Voyez com_load_typelib() pour plus de détails.

com.code_page

Cette directive permet de spécifier le code-page des jeux de caractères à utiliser lors de l'envoi et la réception de chaînes vers des objets COM. Si elle est vide, PHP pensera que vous voulez CP_ACP, qui est le code-page système ANSI par défaut.

Si le texte dans vos scripts est encodé avec un différent encodage ou jeu de caractères par défaut, configurer cette directive vous évitera d'avoir à passer tout votre code comme paramètre du constructeur de la classe com. Notez qu'en utilisant cette directive (comme toute configuration de PHP), votre code PHP perd en portabilité. Vous devez utiliser le paramètre du constructeur à chaque fois que possible.

com.dotnet_version

La version du framework .NET framework à utiliser pour les objets dotnet. La valeur de cette configuration correspond aux trois premiers numéros du numéro de la version du framework, séparé par des poins, et préxié par la lettre v, i.e. v4.0.30319.

com.typelib_file

Lorsqu'elle est configurée, cette directive doit être le chemin vers un fichier qui contient une liste de bibliothèques à charger au démarrage. Chaque ligne sera interprétée comme le nom de la bibliothèque de types et chargée comme si vous aviez utilisé com_load_typelib(). Les constantes seront enregistrées de façon persistante, pour que la bibliothèque ne soit chargée qu'une seule fois. Si le nom d'une bibliothèque de types se termine par #cis ou #case_insensitive, alors les constantes de cette bibliothèque de types seront enregistrées en mode insensible à la casse.

User Contributed Notes

There are no user contributed notes for this page.


Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

Constantes COM
Constante | Valeur | Description | Notes
CLSCTX_INPROC_SERVER (entier) | 1 | Le code qui crée et gère les objets de cette classe est une bibliothèque DLL qui est exécutée dans le même processus que l'appelant de la fonction, spécifiant ainsi le contexte de la classe. |
CLSCTX_INPROC_HANDLER (entier) | 2 | Le code qui gère les objets de cette classe est un gestionnaire du processus. C'est une bibliothèque DLL qui s'exécute dans le processus client et implémente les structures côté client de cette classe lorsque l'on accède à ses instances à distance. |
CLSCTX_LOCAL_SERVER (entier) | 4 | Le code d'exécution qui crée et gère les objets de cette classe s'exécute sur la même machine mais est chargé dans un espace séparé du processus. |
CLSCTX_REMOTE_SERVER (entier) | 16 | Le contexte distant. Le code qui crée et gère les objets de cette classe s'exécute sur une machine différente. |
CLSCTX_SERVER (entier) | 21 | Indique le code serveur, et si le processus est local ou distant. Correspond aux constantes CLSCTX_INPROC_SERVER, CLSCTX_LOCAL_SERVER et CLSCTX_REMOTE_SERVER. |
CLSCTX_ALL (entier) | 23 | Indique tous les contextes de la classe. Correspond aux constantes CLSCTX_INPROC_HANDLER et CLSCTX_SERVER. |
VT_NULL (entier) | 1 | Référence de pointeur NULL. |
VT_EMPTY (entier) | 0 | Une propriété, dont le type de l'indicateur est VT_EMPTY, n'a aucune donné accosiée ; aussi, la taille de la valeur est de zéro. |
VT_INT (entier) | 22 | Valeur entière signée sur 4 octets (équivalent à VT_I4). |
VT_I1 (entier) | 16 | Entier signé sur 1 octet. |
VT_I2 (entier) | 2 | 2 octets représentant une valeur entière signée sur 2 octets. |
VT_I4 (entier) | 3 | Entier signé sur 4 octets. |
VT_I8 (entier) | 20 | Entier signé sur 8 octets. | Disponible à partir de PHP 7.0.0 (x64 uniquement).
VT_UINT (entier) | 23 | Entier non signé sur 4 octets (équivalent à VT_UI4). |
VT_UI1 (entier) | 17 | Entier non signé sur 1 octet. |
VT_UI2 (entier) | 18 | Entier non signé sur 2 octets. |
VT_UI4 (entier) | 19 | Entier non signé sur 4 octets. |
VT_UI8 (entier) | 21 | Entier non signé sur 8 octets. | Disponible à partir de PHP 7.0.0 (x64 uniquement).
VT_R4 (entier) | 4 | Valeur à virgule flottante IEEE sur 32 bits. |
VT_R8 (entier) | 5 | Valeur à virgule flottante IEEE sur 64 bits. |
VT_BOOL (entier) | 11 | Valeur booléenne. |
VT_ERROR (entier) | 10 | Code erreur ; contient le code statut associé avec l'erreur. |
VT_CY (entier) | 6 | Entier complémentaire de 8 octets (par tranche de 10.000). |
VT_DATE (entier) | 7 | Nombre à virgule flottante de 64 bits, représentant le nombre de jours (et non de secondes) depuis le 01 Décembre 1899. Par exemple, January 1, 1900, vaut 2.0, January 2, 1900, vaut 3.0, et ainsi de suite). Stocké sous la même représentation que la constante VT_R8. |
VT_BSTR (entier) | 8 | Pointeur vers une chaîne Unicode finissant par NULL. |
VT_DECIMAL (entier) | 14 | Une structure décimale. |
VT_UNKNOWN (entier) | 13 | Un pointeur vers un objet qui implémente l'interface IUnknown. |
VT_DISPATCH (entier) | 9 | Un pointeur vers un objet a été spécifié. |
VT_VARIANT (entier) | 12 | Un indicateur de type suivi par la valeur correspondante. VT_VARIANT peut être utilisé uniquement avec VT_BYREF. |
VT_ARRAY (entier) | 8192 | Si l'indicateur de type est combiné avec VT_ARRAY via un opérateur OR, la valeur sera un pointeur vers un SAFEARRAY. VT_ARRAY peut utiliser l'opérateur OR avec les types de données suivantes : VT_I1, VT_UI1, VT_I2, VT_UI2, VT_I4, VT_UI4, VT_INT, VT_UINT, VT_R4, VT_R8, VT_BOOL, VT_DECIMAL, VT_ERROR, VT_CY, VT_DATE, VT_BSTR, VT_DISPATCH, VT_UNKNOWN et VT_VARIANT. |
VT_BYREF (entier) | 16384 | Si l'indicateur de type est combiné avec VT_BYREF via un opérateur OR, la valeur sera une référence. Les types de référence sont interprétés comme une référence vers les données, similaire au type de référence en C++. |
CP_ACP (entier) | 0 | Le code page ANSI par défaut. |
CP_MACCP (entier) | 2 | Le code page Macintosh. |
CP_OEMCP (entier) | 1 | Le code page OEM par défaut. |
CP_UTF7 (entier) | 65000 | Unicode (UTF-7). |
CP_UTF8 (entier) | 65001 | Unicode (UTF-8). |
CP_SYMBOL (entier) | 42 | Traduction des SYMBOL. |
CP_THREAD_ACP (entier) | 3 | Le code page ANSI du thread courant. |
VARCMP_LT (entier) | 0 | Le bstr de gauche est plus petit que le bstr de droite. |
VARCMP_EQ (entier) | 1 | Les 2 paramètres sont égaux. |
VARCMP_GT (entier) | 2 | Le bstr de gauche est plus grand que le bstr de droite. |
VARCMP_NULL (entier) | 3 | Chaque expression vaut NULL. |
NORM_IGNORECASE (entier) | 1 | Ignore la casse. |
NORM_IGNORENONSPACE (entier) | 2 | Ignore les caractères non espacés. |
NORM_IGNORESYMBOLS (entier) | 4 | Ignore les symboles. |
NORM_IGNOREWIDTH (entier) | 131072 | Ignore la taille des caractères. |
NORM_IGNOREKANATYPE (entier) | 65536 | Ignore le type Kana. |
NORM_IGNOREKASHIDA (entier) | 262144 | Ignore les caractères Arabe kashida. | La disponibilité dépend de la bibliothèque sous-jacente.
DISP_E_DIVBYZERO (entier) | -2147352558 | Une erreur retournée qui indique qu'une division par zéro a eu lieu. | À partir de PHP 7.0.0, la valeur est 2147614738 sur x64.
DISP_E_OVERFLOW (entier) | -2147352566 | Une erreur qui indique qu'une valeur n'a pû être convertie en la représentation attendue. | À partir de PHP 7.0.0, la valeur est 2147614730 de sur x64
DISP_E_BADINDEX (entier) | -2147352565 | Une erreur qui indique qu'un index de tableau n'existe pas. | À partir de PHP 7.0.0, la valeur est 2147614731 sur x64.
MK_E_UNAVAILABLE (entier) | -2147221021 | Code statut iMoniker COM, retourné lors d'erreurs générées lorsque l'on a tenté d'appeler une fonction qui n'est pas disponible. | À partir de PHP 7.0.0, la valeur est 2147746275 sur x64.

User Contributed Notes

There are no user contributed notes for this page.


Erreur et gestion des erreurs

Cette extension lancera des instances de la classe com_exception pour toute erreur fatale reportée par COM. Toutes les exceptions COM ont une propriété code qui correspond à la valeur de retour HRESULT des diverses opérations COM. Vous pouvez utiliser ce code pour choisir de façon automatique comment gérer cette exception.

User Contributed Notes

There are no user contributed notes for this page.


Exemples

Sommaire

  • For Each
  • Tableaux et propriétés à la façon des tableaux de COM

User Contributed Notes

There are no user contributed notes for this page.


For Each

Vous pouvez utiliser la structure de contrôle foreach de PHP pour passer en boucle à travers le contenu d'un IEnumVariant COM/OLE standard. Cela signifie que vous pouvez utiliser foreach aux endroits où vous auriez pu utiliser For Each dans du code VB/ASP.

Exemple #1 For Each en ASP

<%
Set domainObject = GetObject("WinNT://Domain")
For Each obj in domainObject
  Response.Write obj.Name & "<br />"
Next
%>

Exemple #2 Foreach en PHP

<?php
$domainObject = new COM("WinNT://Domain");
foreach ($domainObject as $obj) {
   echo $obj->Name . "<br />";
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Tableaux et propriétés à la façon des tableaux de COM

Plusieurs objets COM exposent leurs propriétés comme tableaux, ou en utilisant un chemin d'accès à la façon des tableaux.

Vous pouvez :

  • Accédez aux tableaux multidimensionnels ou aux propriétés COM qui requièrent plusieurs paramètres comme si vous accédiez à un tableau. Vous pouvez aussi écrire ces propriétés en utilisant cette technique.

  • Bouclez sur les SafeArrays ("vrais" tableaux) en utilisant la structure de contrôle foreach. Cela fonctionne car un SafeArrays comporte des informations à propos de sa taille. Si une propriété à la façon des tableaux implémente IEnumVariant, alors vous pouvez aussi utiliser foreach pour cette propriété ; lisez For Each pour plus d'informations à ce sujet.

User Contributed Notes

There are no user contributed notes for this page.


La classe com

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

Introduction

La classe m vous permet d'instancier un objet COM compatible OLE et d'appeler ses méthodes et d'accéder à ses propriétés.

Synopsis de la classe

com extends variant {
/* Méthodes */
public __construct ( string $module_name , array|string|null $server_name = null , int $codepage = CP_ACP , string $typelib = "" )
}

Méthodes surchargées

L'objet retourné est un objet surchargé, ce qui signifie que PHP ne voit aucune méthode fixe comme il le fait avec les classes habituelles ; au lieu de cela, chaque accès à une propriété ou une méthode est effectué à travers COM.

PHP will automatically detect methods that accept parameters by reference, and will automatically convert regular PHP variables to a form that can be passed by reference. This means that you can call the method very naturally; you needn't go to any extra effort in your code. PHP détectera automatiquement les méthodes qui acceptent les paramètres par référence, et convertira automatiquement les variables PHP classiques en une forme pouvant être passée par référence. Cela signifie que vous pouvez appeler les méthodes de façon naturelle ; vous n'avez pas d'efforts supplémentaires à faire dans votre code.

Exemples com

Exemple #1 Exemple com (1)

<?php
// démarrer Word
$word = new com("word.application") or die("Unable to instantiate Word");
echo "Loaded Word, version {$word->Version}\n";

// l'ammener devant
$word->Visible = 1;

// ouvrir un document vide
$word->Documents->Add();

// faire des choses
$word->Selection->TypeText("This is a test...");
$word->Documents[1]->SaveAs("Useless test.doc");

// fermer Word
$word->Quit();

// libérer l'objet
$word = null;
?>

Exemple #2 Exemple com (2)

<?php

$conn = new com("ADODB.Connection") or die("Cannot start ADO");
$conn->Open("Provider=SQLOLEDB; Data Source=localhost;
Initial Catalog=database; User ID=user; Password=password");

$rs = $conn->Execute("SELECT * FROM sometable");    // Recordset

$num_columns = $rs->Fields->Count();
echo $num_columns . "\n";

for ($i=0; $i < $num_columns; $i++) {
    $fld[$i] = $rs->Fields($i);
}

$rowcount = 0;
while (!$rs->EOF) {
    for ($i=0; $i < $num_columns; $i++) {
        echo $fld[$i]->value . "\t";
    }
    echo "\n";
    $rowcount++;            // incrémente rowcount
    $rs->MoveNext();
}

$rs->Close();
$conn->Close();

$rs = null;
$conn = null;

?>

Sommaire

  • com::__construct — Constructeur de la classe com

User Contributed Notes

info at ensostudio dot ru 26-Jul-2020 09:52
Complete example of using WScript.Shell:
<?php
/**
  * Methods & properties
  * @link https://msdn.microsoft.com/en-us/library/2f38xsxe(v=vs.84).aspx
  */
$shell = new com('WScript.Shell', null, CP_UTF8);
var_dump($shell->CurrentDirectory);
foreach ($shell->Environment as $value) {
    var_dump($value);
}
// check file 'Test.php'
$process = $shell->Exec('.../php.exe --syntax-check --file=".../src/Test.php"');
// wait complete: 1 - done
while (! $process->Status) {
    usleep(5000);
}
// results: -1 - syntax error, 0 - no error
var_dump($process->ExitCode);
// show responce
var_dump($process->StdOut->ReadAll());
// show errors
var_dump($process->StdErr->ReadAll());
?>
Danil_lll 14-Aug-2018 10:14
Hello. There is a code c# which works with the COM-library (written on C++) - hybrid.dll.
I need to rewrite this code from C# to PHP (that is connect the COM-library to the PHP code)

Here is the function that is called inside C#:
Gr = HybridLib.Hybrid_Color.GREEN;

And here is the list of "Hybrid_Color"which in the library:
enum Hybrid_Color
{
    GREEN = 0x00000001,
    BLACK = 0x00000002,
    BLUE = 0x00000004,
};

The library itself was launched in PHP:
$PHP_Lib = new COM("HybridLib.Hybrid");

Can not assign value:
$gr = $PHP_Lib -> ..... ?????

What I write next, I don't know...
Tell me, please, who knows...
IceNV 13-Dec-2016 02:17
Under PHP7(.x) 64-bit, there is a documentation error (on the MSDN side, already reported) causing problems if you try to manipulate the registry (StdRegProv) through COM.

Indeed, MSDN reports that the registry hive/root must be reported as a uint32, which means that, in PHP 64-bit, one would create a new Variant($root,VT_UI4).

This would throw a type mismatch error.
It seems internally and contrary to what MSDN says (as of now, 2016-12-13), the root parameter must actually be passed as an int32.

So you have to :
1. convert your root number to a negative int to avoid out-of-bounds exceptions when creating the variant below (basically the integer being >= 2^31, you have to wrap it around the 32-bit signed integer maximum yourself) ;
2. create a new Variant($root,VT_I4) ;
3. pass that Variant to your COM API call.

This did not happen before PHP 7.0 as it always used VT_I4 internally before (see https://bugs.php.net/bug.php?id=73605), but now it respects (and is right to do so) the real integer length, so without an explicit conversion, PHP7 would now output a VT_I8 on x64, versus VT_I4 for PHP5.
juan156_elias at gmail dot com 08-Nov-2015 03:22
This is an example of using .Net using the NetPhp library that is based on the COM/DOTNET classes.

You can use any .dll file,  wether it is or not COM decorated and any of the .Net framework types out of the box. You can also target any version of the .Net framework.

<?php

$runtime = new \NetPhp\Core\NetPhpRuntime('COM', 'netutilities.NetPhpRuntime');

// Add both SpreadsheetLight and the OpenXML it depends on.
$runtime->RegisterAssemblyFromFile('/binaries/SpreadsheetLight.dll', 'SpreadsheetLight');
$runtime->RegisterAssemblyFromFile('/binaries/DocumentFormat.OpenXml.dll', 'DocumentFormat.OpenXml');
$runtime->RegisterAssemblyFromFile('/binaries/AjaxMin.dll', 'AjaxMin');

// Using the FullName of a type that belongs to an assembly that has already been registered.
$datetime = $runtime->TypeFromName("System.DateTime");

// Using the FullName of a type that has not been registered yet (from a file)
$minifier = $runtime->TypeFromFile("Microsoft.Ajax.Utilities.Minifier", APPLICATION_ROOT . '/binaries/AjaxMin.dll');

// Using the FullName of a type that has not been registered yet (autodiscoverable)
$datetime2 = $runtime->TypeFromAssembly("System.DateTime", "mscorlib, ....");

$datetime->Instantiate();
echo $datetime->ToShortDateString()->Val(); // Outputs 01/01/0001

// We can only use Int32 from native PHP, so parse
// an Int64 that is equivalent to (long) in the DateTime constructor.
$ticks = $runtime->TypeFromName("System.Int64")->Parse('98566569856565656');

$datetime->Instantiate($ticks);
echo $datetime->ToShortDateString()->Val(); // Outputs 07/05/0313

// We can only use Int32 from native PHP, so parse
// an Int64 that is equivalent to (long) in the DateTime constructor.
$ticks = $runtime->TypeFromName("System.Int64")->Parse('98566569856565656');

// Dump a .Net System.Timers.Timer object!
$data = $timer->GetPhpFromJson();

var_dump($data);

    // Outputs:
    //  object(stdClass)[38]
    //     public 'AutoReset' => boolean true
    //     public 'Enabled' => boolean false
    //     public 'Interval' => int 100
    //     public 'Site' => null
    //     public 'SynchronizingObject' => null
    //     public 'Container' => null

// Check if today is monday
$IsMonday = $runtime->TypeFromName("System.DateTime")->Now->DayOfWeek->
Equals($runtime->TypeFromName("System.DayOfWeek")->Enum('Monday'));

?>
Eion Robb 12-Feb-2014 09:59
All the examples here show
<?php $var = new COM('Whatever.Something') or die(); ?>
however the 'or die()' bit is redundant as a fatal 'com_exception' exception will be thrown, killing your script.  If you want to handle the 'or' condition you need to catch the exception, eg
<?php
try {
$var = new COM('Whatever.Something');
} catch (com_exception $e) {
 //couldn't load, do something else like register
exec('regsvr32 /s whatever.dll');
}
?>
rogier 28-Oct-2011 10:09
Took me a while to figure this out by trial and error:

If your frustrated when getting a com-exception like "Error [0x80004002] ..." (with a message nagging you about an unsupported interface), and you're calling a class method through COM that expects a char as an argument, you should NOT call the method with a single-character string.

The correct way of calling a method like this is to use a VARIANT with a type of VT_UI1.

COM enabled method definition:

public bool DoSomething(char arg);

<?php

$com = new COM('Some.Class.Name');

// This will fail
$var = 'a';
$com->DoSomething($var);

// This works correctly
$var = new VARIANT(ord('a'), VT_UI1);
$com->DoSomething($var);

?>

I hope this helps some people
sparrowstail at googlemail dot com 12-Nov-2010 11:35
This script reports all Windows drives, drive type, status (if not available), free space and total drive size:

<?php

    $fso = new COM('Scripting.FileSystemObject');
    $D = $fso->Drives;
    $type = array("Unknown","Removable","Fixed","Network","CD-ROM","RAM Disk");
    foreach($D as $d ){
       $dO = $fso->GetDrive($d);
       $s = "";
       if($dO->DriveType == 3){
           $n = $dO->Sharename;
       }else if($dO->IsReady){
           $n = $dO->VolumeName;
           $s = file_size($dO->FreeSpace) . " free of: " . file_size($dO->TotalSize);
       }else{
           $n = "[Drive not ready]";
       }
   echo "Drive " . $dO->DriveLetter . ": - " . $type[$dO->DriveType] . " - " . $n . " - " . $s . "<br>";

    }

      function file_size($size)
      {
      $filesizename = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
      return $size ? round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $filesizename[$i] : '0 Bytes';
      }

?>

There are a number of other properties of the drive object which can be called this way - see:

http://msdn.microsoft.com/en-us/library/ts2t8ybh%28VS.85%29.aspx
z3n at overflow dot biz 24-Sep-2009 08:35
On a query reply using ADODB.Connection object, all my $rs->Fields['field_name']->Value returned `variable Object` when inserted into a array, like this:

<?php
for ($rl[$v]=array(),_qm($_query);!$res->EOF;$res->MoveNext()) {
    $rl[$v][]=$res->Fields['x']->Value;
}
?>

I figured out that converting the value into a INT fixed the issue:

<?php $rl[$v][]=intval($res->Fields['x']->Value); ?>
pavanphp Gudipati 17-Jun-2009 06:49
Here I Am describing a Program from which you can connect any exe(software) using COM component.
pdf2swf is a software for converting PDf to SWF files.

This is best example for  WScript.Shell

<?php
#code for pdf to swf using pdf2swf software
#this codeworks in windows environment.

## Important Parameters
$software_path  ="C:\\SWFTools\\pdf2swf" ;
$pdf_path       ="C:\\SWFTools\\abcd.pdf" ;
$argument       = "-o";
$swf_output     ="C:\\SWFTools\\abcd.swf" ;

#actual code
$cmd        =" $software_path $pdf_path  $argument $swf_output";

$WshShell   = new COM("WScript.Shell");
$oExec      = $WshShell->Run("cmd /C $cmd ", 0, true);

# 0 for command prompt invisible mode
# 3 for visible

?>
tsintra at humansoft dot pt 11-May-2009 08:18
After one week of trying to understand what was wrong with my PHP communication with MS Word, i finally got it working...
It seems that if you're running IIS, the COM object are invoked with restricted privileges.
If you're having permission problems like not being able to opening or saving a document and you're getting errors like:

 - This command is not available because no document is open
or
 - Command failed

try this (if you're running IIS):

- Execute "dcomcnfg"
- Open Component Services > Computers > My Computer > DCOM Config
- Search for Microsoft Office Word 97-2003 Document (it will be something like this translated to your language, so take a while and search for it)
- Right-Click on it and open the properties
- Choose "Identity" tab
- Normally this is set to "the launching user". You have to change this to "the interactive user" or a admin user of your choice.
- Apply these new settings and test your COM application. It should work fine now.

I hope I save lots and lots of hours of headaches to some of you :)
dpchiesa at hotmail dot com 27-Mar-2009 09:35
Here's a way to create an AES-Encrypted ZIP file in PHP, using DotNetZip via the COM class.

<?php
try
{
  $fname = "zip-generated-from-php-" . date('Y-m-d-His') . ".zip";
  $zipOutput = "c:\\temp\\" . $fname;
  $zip = new COM("Ionic.Zip.ZipFile");
  $zip->Name = $zipOutput;
  $dirToZip= "c:\\temp\\psh";
  #$dirToZip= "c:\\dinoch\\webs\\php";
  $zip->Encryption = 3;
  $zip->Password = "AES-Encryption-Is-Secure";
  $zip->AddDirectory($dirToZip);
  $zip->Save();
  $zip->Dispose();

  if (file_exists($zipOutput))
  {
    header('Cache-Control: no-cache, must-revalidate');
    header('Content-Type: application/x-zip');
    header('Content-Disposition: attachment; filename=' . $fname);
    header('Content-Length: ' . filesize($zipOutput));
    readfile($zipOutput);
    unlink($zipOutput);
  }
  else
  {
    echo '<html>';
    echo '  <head>';
    echo '  <title>Calling DotNetZip from PHP through COM</title>';
    echo '  <link rel="stylesheet" href="basic.css"/>';
    echo '  </head>';
    echo '<body>';
    echo '<h2>Whoops!</h2>' . "<br/>\n";
    echo '<p>The file was not successfully generated.</p>';
    echo '</body>';
    echo '</html>';
  }
}
catch (Exception $e)
{
    echo '<html>';
    echo '  <head>';
    echo '  <title>Calling DotNetZip from PHP through COM</title>';
    echo '  <link rel="stylesheet" href="basic.css"/>';
    echo '  </head>';
    echo '<body>';
    echo '<h2>Whoops!</h2>' . "<br/>\n";
    echo '<p>The file was not successfully generated.</p>';
    echo '<p>Caught exception: ',  $e->getMessage(), '</p>', "\n";
    echo '<pre>';
    echo $e->getTraceAsString(), "\n";
    echo '</pre>';
    echo '</body>';
    echo '</html>';
}

?>
james dot m dot love at gmail dot com 07-Jan-2009 03:27
If you're using COM to create a DSN Less connection to an MS Access 2007 database, you'll find through Googling that you need to use an updated version of Jet, so the connection string I've found looks like this:

<?php
$databaselocation = "C:\Path\to\db.accdb";
$conn = new COM('ADODB.Connection') or exit('Cannot start ADO.');
$conn->Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=$databaselocation") or die('Cannot start with Jet');
?>

However, on my setup (WinVista, Access 2007, PHP526) I found that it always 'dies' with "Cannot start with Jet", even if the connection was successful ($conn->State reads "1").

I figured to just drop the die() command on $conn->Open(). If something catastrophic happens with the ADO connection then it's own error handling engine passes stack traces, etc back to the console/standard output.

Therefore, my Open() command looks like this:

<?php
$conn->Open("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=$databaselocation");
?>
casanoteva at yahoo dot com 26-Dec-2008 01:19
Hi, just wanna share to everyone after tried and tested many many times to create report in PDF format from Crystal Report.
Finally I can do it without any error.
 Here is my system; PHP 5.1.6, MSSQL2005 and Crystal Report Server XI RL2

<?php

//- Variables - for your RPT and PDF
echo "Print Report Test";
$my_report = "D:\\Folder1\\SubFolder1\\Report.rpt"; //
rpt source file
$my_pdf = "D:\\Folder1\\SubFolder1\\Report.pdf"; // RPT export to pdf file
//-Create new COM object-depends on your Crystal Report version
$ObjectFactory= new COM("CrystalReports115.ObjectFactory.1") or die ("Error on load"); // call COM port
$crapp = $ObjectFactory-> CreateObject("CrystalDesignRunTime.Application"); // create an instance for Crystal
$creport = $crapp->OpenReport($my_report, 1); // call rpt report

// to refresh data before

//- Set database logon info - must have
$creport->Database->Tables(1)->SetLogOnInfo("servername", "DBname", "user", "password");

//- field prompt or else report will hang - to get through
$creport->EnableParameterPrompting = 0;

//- DiscardSavedData - to refresh then read records
$creport->DiscardSavedData;
$creport->ReadRecords();

//export to PDF process
$creport->ExportOptions->DiskFileName=$my_pdf; //export to pdf
$creport->ExportOptions->PDFExportAllPages=true;
$creport->ExportOptions->DestinationType=1; // export to file
$creport->ExportOptions->FormatType=31; // PDF type
$creport->Export(false);

//------ Release the variables ------
$creport = null;
$crapp = null;
$ObjectFactory = null;

//------ Embed the report in the webpage ------
print "<embed src=\"D:\\Folder1\\SubFolder1\\Report.pdf\" width=\"100%\" height=\"100%\">"

?>

 That's all for me, anyway in Crystal Report I have to check DisCardSavedData, Save data with report and AutoSave (1 min) in Option Tab and also in Report Options I have to check save dat with report, too.

Hope this should be help to anybody

Casanoteva
johnno1985 at gmail dot com 21-Aug-2008 11:34
I couldn't find an example anywhere on what I was trying to do.  After taking bits from everyone I ended up with something that worked.

Im using Crystal Reports 10, MS SQL Server 2005, Apache2, and PHP5.

My report uses an SQL Store Procedure and passes some parameter to get the report data, so our PHP must set the database logon info and pass the parameters.

Below is the solution I came up with:

<?php

//------  Variables ------
$my_report = "C:\\Apache2\htdocs\\test\\MyReport.rpt";  //This must be the full path to the file
$my_pdf = "C:\\Apache2\htdocs\\test\\MyReport.pdf";

//------ Create a new COM Object of Crytal Reports 10 ------
$ObjectFactory= new COM("CrystalReports10.ObjectFactory.1");

//------ Create a instance of library Application -------
$crapp = $ObjectFactory->CreateObject("CrystalDesignRunTime.Application.10");

//------ Open your rpt file ------
$creport = $crapp->OpenReport($my_report, 1);

//------ Set database logon info ------
$creport->Database->Tables(1)->SetLogOnInfo("MYSERVER", "Database", "user", "password");

//------ Suppress the Parameter field prompt or else report will hang ------
$creport->EnableParameterPrompting = 0;

//------ DiscardSavedData make a Refresh in your data -------
$creport->DiscardSavedData;
$creport->ReadRecords();

//------ Pass formula fields --------
$creport->FormulaFields->Item(1)->Text = ("'My Report Title'");
$creport->ParameterFields(1)->AddCurrentValue ("FirstParameter");
$creport->ParameterFields(2)->AddCurrentValue (2000);

//------ Export to PDF -------
$creport->ExportOptions->DiskFileName=$my_pdf;
$creport->ExportOptions->FormatType=31;
$creport->ExportOptions->DestinationType=1;
$creport->Export(false);

//------ Release the variables ------
$creport = null;
$crapp = null;
$ObjectFactory = null;

//------ Embed the report in the webpage ------
print "<embed src=\"MyReport.pdf\" width=\"100%\" height=\"100%\">"

?>

Obviously there's plenty of room for refinement in there, but it works and should get you going on the right track.  I also found that during testing, the script was hanging before supressing the parameter prompt. Once this had happened, some exports that had been working earlier stopped completely and wouldn't work again untill I restarted Apache.  This might be something worth doing if you keep having issues after a script has hung.
mastrboy.servebeer.com 13-Jun-2008 05:03
quick wmi query example:

<?php
    $obj = new COM ( 'winmgmts://localhost/root/CIMV2' );
    $wmi_computersystem =     $obj->ExecQuery("Select * from Win32_ComputerSystem");
    $wmi_bios             =    $obj->ExecQuery("Select * from Win32_BIOS");
    foreach ( $wmi_computersystem as $wmi_call )
    {
        $model = $wmi_call->Model;
    }

    foreach ( $wmi_bios as $wmi_call )
    {
        $serial = $wmi_call->SerialNumber;
        $bios_version = $wmi_call->SMBIOSBIOSVersion;
    }
    echo "Bios version   : $bios_version\n".
         "Serial number  : $serial\n".
         "Hardware Model : $model\n";
?>
mbirth at webwriters dot de 08-Jun-2008 03:19
Using the DynamicWrapper from http://freenet-homepage.de/gborn/WSHBazaar/WSHDynaCall.htm and after registering it via "regsvr32 dynwrap.dll", you can easily set output colors to make colorful CLI scripts even on Windows.

<?php

$dw = new COM('DynamicWrapper');  // needs dynwrap.dll (regsvr32 dynwrap.dll)

// register needed features
$dw->Register('kernel32.dll', 'GetStdHandle', 'i=h', 'f=s', 'r=l');
$dw->Register('kernel32.dll', 'SetConsoleTextAttribute', 'i=hl', 'f=s', 'r=t');
$dw->Register('kernel32.dll', 'SetConsoleTitle', 'i=s', 'f=s', 'r=l');

// get console handle
$ch = self::$dw->GetStdHandle(-11);  // -11 = STD_OUTPUT_HANDLE

?>

After these initialization steps, you can set the console output color using:

<?php
$dw->SetConsoleTextAttribute($ch, 14);
echo 'This is yellow text!';
$dw->SetConsoleTextAttribute($ch, 7);
echo 'Back to normal gray!';
?>

Using SetConsoleTitle you can even set the title displayed in the console window.

Color values are 0..7 for dark colors and 8..15 for light colors. Sequence is (black/silver, blue, green, cyan, red, magenta, yellow/brown, white/gray). I also found that if you add 16384 to the value, it should be inverse. 32768 added should get underlined text. But these latter two didn't work for me.
amenthes at NOSPAM dot gmail dot com 03-Mar-2008 10:13
If you ever want to save an Excel(.xls) file into the Office Excel 2003 XML format, just use

$excel->Workbooks[1]->SaveAs('new_file_name.xml', 46);

That's the number you need, 46.
halfer 21-Jun-2007 05:03
Thanks to paul at completewebservices who added a note earlier; I have used his code to solve a particularly difficult issue with the Crystal 9 runtime component. For some reason, VBA/VBS can pass a native Date type as a parameter to a Crystal Report requiring a date, but in PHP I've tried all manner of strings, unix timestamps, COM variant dates etc and all of these resulted in a com_exception.

My solution was to employ VBScript to borrow the CDate function, which works correctly. Not the most elegant of solutions, but this parameterised approach is to be preferred to search-n-replacing the RecordSelectionFormula string. Of course if anyone here has an even better approach, do post it here - I am sure it would be of use.

<?php
// $rptParam is a report parameter object having a type of date
$oScript = new COM("MSScriptControl.ScriptControl");
$oScript->Language = "VBScript";
$oScript->AllowUI = false;
$oScript->AddObject('rptParam', $rptParam, true);
$oScript->AddCode('Function SetDateParameter(strDate)
rptParam.AddCurrentValue(CDate(strDate))
End Function');
$oScript->Run("SetDateParameter", "25 April 2006");
?>
hwcshirley at gmail dot com 21-May-2006 10:59
Reply to: djogopatrao at gmail dot com
I have change little bit your code. Its work.

$COM_Object = "CrystalDesignRunTime.Application";
$my_report = "C:\\appserv\\www\\mc\\test.rpt";
$my_pdf = "C:\\appserv\www\\mc\\test.pdf";

$crapp= New COM($COM_Object) or die("Unable to Create Object");
$creport = $crapp->OpenReport($my_report, 1);
$creport->ReadRecords(); // attention!

$creport->ExportOptions->DiskFileName=$my_pdf;
$creport->ExportOptions->PDFExportAllPages=true;
$creport->ExportOptions->DestinationType=1; // Export to File
$creport->ExportOptions->FormatType=31; // Type: PDF
$creport->Export(false);
djogopatrao at gmail dot com 05-Apr-2006 12:25
My previous notes about Crystal Reports have vanished away, but anyway I was up to correct them.

The code above connects to COM (beware of the version number! search on the Registry Editor for the correct name to put in $COM_Object), opens a report from a file ($my_report), reload records from database and then exports it to a PDF file ($my_pdf).

* IMPORTANT * this code, when invoked from the browser (I'm using Apache) AND with a report that connects to a ODBC database, does not work (the problem is specificly the line ReadRecords(), but may arise without it too when data is not saved into the report file).

But when you run this code by PHP-CLI (that is, by the command line), it works ok! I bug-reported this, but have no answer till now ( give it a vote, if you thing it's important: http://bugs.php.net/bug.php?id=36959 ).

Also, exceptions may arise, so put it on a try_catch block.

--------------------------

// by dfcp '06 (djogopatrao@gmail.com)

$COM_Object = "CrystalReports11.ObjectFactory.1";
$my_report = "C:\\report.rpt";
$my_pdf = "C:\\report.pdf";

$ObjectFactory= New COM($COM_Object);
$crapp = $ObjectFactory->CreateObject("CrystalDesignRunTime.Application");
$creport = $crapp->OpenReport($my_report, 1);
$creport->ReadRecords(); // attention!

$creport->ExportOptions->DiskFileName=$my_pdf;
$creport->ExportOptions->PDFExportAllPages=true;
$creport->ExportOptions->DestinationType=1; // Export to File
$creport->ExportOptions->FormatType=31; // Type: PDF
$creport->Export(false);
djogopatrao at gmail dot com 04-Mar-2006 07:27
I found somewhere (http://www.recrystallize.com/merchant/supportfaq/supportfaq0003.htm) a list relating each version of Crystal Reports to its respective progID - it may help some fellows out there.

7          Crystal.CRPE.Application

8.0        CrystalRuntime.Application or CrystalRuntime.Application.8

8.5        CrystalRuntime.Application or CrystalRuntime.Application.8.5

9 (RDC)    CrystalRuntime.Application.9
9 (RAS)    CrystalReports.ObjectFactory.2
10 (RDC)   CrystalRuntime.Application.11
10 (CEE)   CrystalReports10.ObjectFactory.1

XI (RDC)   CrystalRuntime.Application.11
XI (RAS)   CrystalReports11.ObjectFactory.1
paul at completewebservices dot com dot au 28-Jan-2006 03:49
It seems that PHP does not support setting of properties with arguments.  This is how I got around the problem:

        // Object with method I want to set
        $auth = new COM("AUTHXOCX.AuthXOCXCtrl.1");

        // ScriptControl
        $oScript = new COM("MSScriptControl.ScriptControl");
        $oScript->Language = "VBScript";
        $oScript->AllowUI = TRUE;

        // Add out object to the control
        $oScript->AddObject('auth', $auth, true);

        // Create a VBScript function that allow me to set them
       $oScript->AddCode(
'Function fixAccess(accessname)
    auth.AuthDataReferrerEnabled(accessname) = 1
    auth.AuthDataAuthentiXDBEnabled(accessname) = 0
End Function');

        // Execute function
        $oScript->Run("fixAccess", $dir);
volker at kybs dot de 07-Oct-2005 12:51
To use the windows speech system install the "Speech SDK 5.1 for Windows? applications" from the Microsoft homepage (free download).
Then you can do Text2Speech like this:

$voice = new COM("SAPI.SpVoice");
$voice->Speak("Hello, lets have a conversation");
sadi at unicornsoftbd dot com 06-Oct-2005 01:56
If your PHP is configured as ISAPI module then the COM object you create in ur php page will use the same memory space as the web server. If your COM object takes too much memory then this may force some COM error as PHP does not handle the memory usage of COM itself. And also Web server doesnt know what do to free COM memory. But if you use PHP as CGI then PHP itself handle the memory usage of COM. Once in a script where i used COM and PHP as ISAPI module i got unknown COM error.But when i used PHP as CGI there was no error. So those who want to use COM object in your application please be careful about it.
deletethis@bjoern(at)syltonline(doot)de 15-Sep-2005 07:36
If you can get the old "TaskScheduler.dll" and register it, it is quite simple to handle and start Windows tasks from PHP.
This is extremely useful when you got things to do which must be run in a different user context. Prepare a task with the user and use PHP & Com to build a webinterface for it.

Here is an example how to start a Windows task:

  function start_task ($taskname) {
    $SchedObj = new COM("Scheduler.SchedulingAgent.1");
    foreach ($SchedObj->Tasks as $task) {
      if (strtolower( (string) $task) == strtolower( $taskname.".job" )) {
         $task->Run();
      }
    }
  }

I'm also working on a class to handle infos, adding and removing of tasks via PHP. If you are interested drop me a line.
csaba at alum dot mit dot edu 03-Mar-2005 05:21
Getting IE to the foreground
If you are using a command line (CLI) version of PHP on a Win32 platform (e.g. XP Pro, SP2), you might want to have output directed to IE (perhaps you'll want to work with the output there) when Popup does not suffice (see my earlier post, below).

It's easy enough to get an instance of IE using $ie = new COM("InternetExplorer.Application");.  The problem is, you don't necessarily see it in the foreground (especially if you already have one open) and who wants to waste keystrokes getting to it?  The code below has been working for me (If you want to do other adjustments (e.g. $ie->Document->ParentWindow->resizeTo(800,500); or $ie->Document->Body->bgColor = "yellow";), doing them before the $ie->Visible = true; line will avoid screen distractions):

<?php
function newIEtoForeground($title, $evtPrefix="") {
    // brings new instance of IE to foreground with title $title
    if (!$extPrefix) $ie = new COM("InternetExplorer.Application");
    else $ie = new COM("InternetExplorer.Application", $evtPrefix);
    $ie->Navigate2("about:blank");
    $oWSH = new COM("WScript.Shell");
    while ($ie->ReadyState!=4) usleep(10000);

    $ie->Document->Title = ($tmpTitle = mt_rand());  //unique title
    $ie->Visible = true;
    while (!$oWSH->AppActivate("$tmpTitle - M")) usleep(10000);

    $ie->Document->Title = $title;
    $ie->Document->ParentWindow->opener="me";  // allows self.close()
    return $ie;
}
?>

Csaba Gabor from Vienna
csaba at alum dot mit dot edu 14-Feb-2005 12:22
Basic Windows IO
If you are using a command line (CLI) version of PHP on a Win32 platform, you might like to have a simple graphical interface to get input and output.  The following gives an illustration for both.

<?php
    // first we get some input
    $oScript = new COM("MSScriptControl.ScriptControl");
    $oScript->Language = "VBScript";
    $title = "I/O Demo: Input half";
    $initial = "Change this value";
    $prompt = "Please enter a value";

    $code = <<<EOF
Function getInput()
    inVal = InputBox("$prompt", "$title", "$initial")
    getInput = inVal         'how return values are assigned in VB
End Function
EOF;

    $oScript->AddCode($code);
    $input = $oScript->Eval("getInput()");
    if (gettype($input)=="NULL") $input = "Input box was cancelled";

    // now we show some output
    $oWSH = new COM("WScript.Shell");
    $title = "I/O Demo: Output half";
    $timeout = 2;        // 0 for no timeout
    $style = 0 + 48;    // buttons to show + alert symbol
    $oWSH->Popup($input, $timeout, $title, $style);
?>

This is example is overblown for illustrative purposes.  The whole input part collapses if the amount of code used is a single statement.  So, this would have sufficed:
$code = "InputBox(\"$prompt\", \"$title\", \"$initial\")";
$input = $oScript->Eval($code);

This technique exposes quite a bit of scripting power tied into the Windows operating system and VBScript.  However, you should have a really specific reason for using it since VBScript tends to be dog slow when compared to PHP in my tests.  Simple IO like this is good, however, and the popup size can be quite large.  Furthermore, this could be a viable route to go for accessing WinAPI's.

http://www.ss64.com/wsh/popup.html shows some documentation for $oWSH->Popup

Csaba Gabor from Vienna
phpguy _from_ toshpro _dot_ com 12-Nov-2004 05:55
if you ever need to connect to an access database (on the server, using the IIS or APACHE user account), here is code below that can help to ease the process.  It is written like this because we have a MySQL as well as an Access database and need to be able to switch back and forth.  The runQuery function will return a 2 dimensional array and can use column names or numbers for the index of the internal arrays.  External arrays are always integer-indexed.  We also have found issues with Access staying open and growing from 7MB to 2.5GB within two hours, so we open and close it each time we run a query.  If it is not a select query it will return TRUE.  if it fails with errors, it will return false.

There is a showErr flag that we mostly only use for MySQL, since you can output MySQL errors without PHP errors.  Access doesn't appear to be that friendly.

<?php

function runQuery(&$conn,
                    $strSQL,
                    $associative=true,
                    $debug=false,
                    $showSQL=false,
                    $showErr=false) {
    return runMSQuery($conn,$strSQL,$associative,$debug,$showSQL,$showErr);
    //return runMyQuery($conn,$strSQL,$associative,$debug,$showSQL,$showErr);
}

function openMSDB($dbfile="c:/path/and/filename.mdb") {
    if (!@$conn = new COM("ADODB.Connection"))
        exit("Unable to create an ADODB connection<br>");
    $strConn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=".$dbfile;
    @$conn->open($strConn);
    if($conn->State == 0) return false;
    return $conn;
}

function closeMSDB(&$conn) {
    @$conn->Close();
    $conn = null;
    return true;
}

function runMSQuery(&$conn,
                    $strSQL,
                    $associative=true,
                    $debug=false,
                    $showSQL=false,
                    $showErr=false) {
    if(!is_object($conn)) if(!$conn=openMSDB()) return false;
    if( $showSQL || $debug ) echo $strSQL."\n<br>\n";
    $rtn = false;
    if($debug) $rs = $conn->execute($strSQL);
    else $rs = @$conn->execute($strSQL);

    if(!$rs) {
        if($showErr) echo "Error running SQL.<br>\n";
        closeMSDB($conn);
        return false;
    }
    if ($rs->State == 0) {
        closeMSDB($conn);
        return true;
    } else {
        $rows=0;
        while(!$rs->EOF) {
            for($i=0;$i<$rs->Fields->count;$i++) {
                $rsf = $rs->Fields($i);
                if($associative) $rtn[$rows][$rsf->Name] = $rsf->value;
                else $rtn[$rows][$i] = $rsf->value;
            }
            $rows++;
            $rs->MoveNext();
        }
        if($rs->State != 0) $rs->Close();
        $rs = null;
    }
    if($debug) var_dump($rtn);
    closeMSDB($conn);
    return $rtn;
}
?>
sodeh at dana dot ir 30-Oct-2004 03:11
for connection to sql server and know the utf-8 code
use this method to connect the database

$db = new COM("ADODB.Connection",NULL, 65001 );
jon at jonroig dot com 03-Dec-2003 12:28
Here's a simple example of printing formatted templates with MS Word.

To begin with, I've already built my invoice in Word and saved it as an RTF file.
In this case, I'm using "sampleInvoice.php"

Fields that will be replaced have been marked as ||CUSTOMER ID|| and so on.

<?php
$dataText = "";

// open the file
if(!($fp= fopen ("C:\wordTest\sampleInvoice.rtf", "r"))) die ("Can't open");
$dataText = fread($fp, 2000000);
fclose ($fp);

// replace the template fields
$dataText = str_replace ("||CUSTOMER ID||",$customerIDValue, $dataText);

// save the file as an rtf
$timeStamp = time();
$saveFile = "C:/wordTemp/".$timeStamp."-invoice-".$customerIDValue.".rtf";
if(!($fq= fopen ($saveFile, "w+"))) die ("Can't open");
fwrite ($fq, $dataText);
fclose ($fq);

// initialize the word components
$word = new COM("word.application") or die("Unable to instantiate Word");

print "Loaded word version ($word->Version)\n";
$word->visible = true;
$word->Documents->Add();

// open the file
$word->Documents->Open("$saveFile");

// output the file to the default printer
$word->ActiveDocument->PrintOut(1);

// shutdown word
$word->Quit();
?>
drich at nea-online dot net 18-Nov-2003 02:47
Changing Fields (Not FORMFIELDS) In MS Word....

Searched most of the afternoon for this, as it is something needed here for our projects.  Maybe this can help someone else as well.

<?php
$input = "x:\\path\\to\\test.doc";
$word = @new COM("word.application") or die("Unable to instantiate Word");
print "Loaded Word, version {$word->Version}\n<br>";
$word->Visible = 1;
print "Set Word To Visible<br>";
$word->Documents->Open($input);
print "Opened $input<br>";
$word->Activate;
print "Activated Word<br>";

print "Editing Fields<br>";
$Field = $word->ActiveDocument->Fields(1);
$fieldData = $Field->Result;
$fieldData->Text = "Testing";

// Print the document.
$word->Printout();

// closing word
$word->Quit();

// free the object
$word->Release();
$word = null;

?>
admin at CdnDomainRegistry dot ca 20-Sep-2003 03:57
Here's an example/comparison of VBScript vs PHP's COM component to connect to an IIS Webserver.
The examples backup the IIS MetaBase (your server's website(s) configuration) in IIS.

VBScript:
  Dim obj, iFlags
  Set obj = GetObject("IIS://LocalHost")
  ' Backup to next available version number.
  ' Set flags to save the metabase first and
  ' force the backup even if save fails.
  iFlags = (MD_BACKUP_SAVE_FIRST or MD_BACKUP_FORCE_BACKUP)
  obj.Backup "MyBackups", MD_BACKUP_NEXT_VERSION, iFlags
  ' Note: The above was copied from Microbucks.
  ' This is how you would have to do it.
  ' i.e. use the actual constant's value.
  iFlags = (2 or 4)
  obj.Backup "MyBackups", &HFFFFFFFF, iFlags

PHP:
  <?php
  $obj = new COM("IIS://LocalHost")or die("Unable to instantiate IIS");
  $err = com_invoke ($obj, "Backup", "MyBackups", "&HFFFFFFFF", 2|4 );
  $obj = null;
  print "err=".$err; // returns 0 on success
  ?>

Glen
rickardsjoquist at hotmail dot com 09-Jul-2003 10:33
If you want to use a DSN-less connection to a database (access for example) and return the results of a query as a multidimensional array with the fieldnames as identifier try this. Hope it helps someone :-)
--------------------------------------------------------

<?php
function db($sql) {
    $c = new COM("ADODB.Connection");
    $c->open('DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=' . realpath("relative_path/db.mdb"));
    $r = $c->execute($sql);
    $i = 0;
    $num_fields = $r->fields->count();
    while (!$r->EOF)
        {
            for($j = 0;$j<$num_fields;$j++) {
            $key = $r->Fields($j);
            $r_items[$i][$key->name] = $key->value;
        }
        $i++;
        $r->MoveNext();
    }
    $r->close();
    $c->close();
    $r = null;
    $c = null;
    return $r_items;
}
?>

--------------------------------------------------------
use it like this:
--------------------------------------------------------
<?php
$results = db("SELECT field_a, field_b FROM table");
foreach($result as $i => $item) {
    echo $item['field_a'];
    echo $item['field_b'];
}
?>
--------------------------------------------------------
You can also use: print_r($result); if you want the structure of the array to be printed.
info at sharedprojects dot nl 16-Jun-2003 09:41
<?php
// An other way to connect
// this connect to a ODBC-datasourced added in the
// ODBC Data Source Administrator under System DSN

$odbcname = "northwind";
$conn->Open("DSN=$odbcname");
?>
eguan1ao_at_yahoo_dot_com 20-Nov-2002 01:35
An example of connecting to a Microsoft Access database, executing an SQL query, and displaying the results in HTML.

<?php

$db = 'C:\\Program Files\\Microsoft Office\\Office\\Samples\\Northwind.mdb';

$conn = new COM('ADODB.Connection');

// Two ways to connect. Choose one.
$conn->Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=$db");
//$conn->Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=$db");

$sql = 'SELECT   ProductName, QuantityPerUnit, UnitPrice
         FROM     Products
          ORDER BY ProductName';
$rs = $conn->Execute($sql);

?>

<table>
<tr>
          <th>Product Name</th>
         <th>Quantity Per Unit</th>
         <th>Unit Price</th>
</tr>
<?php while (!$rs->EOF): ?>
         <tr>
                  <td><?= $rs->Fields['ProductName']->Value ?></td>
                   <td><?= $rs->Fields['QuantityPerUnit']->Value ?></td>
                  <td><?= $rs->Fields['UnitPrice']->Value ?></td>
          </tr>
         <?php $rs->MoveNext() ?>
<?php endwhile ?>
</table>

<?php

$rs->Close();
$conn->Close();

?>
yinon at xacct dot com 06-Apr-2002 12:33
In order to get the Word exaple running, do the following on the server side.
Worked for me...
1. Click START-->RUN and enter "dcomcnfg"
2. In the "Applications" tab, go down to "Microsoft Word Document"
3. Click PROPERTIES button
4. Go to the "Security" Tab
5. Click "Use custom access permissions", and then click EDIT
6. Click ADD and then click SHOW USERS
7. Highlight the IIS anonymous user account (usually IUSR_<machinename>), click ADD
8. Go back to the "Security" tab by hitting OK
9. Click "Use custom launch permissions", and the click EDIT
10. Click ADD and then click SHOW USERS
11. Highlight the IIS anonymous user account (usually IUSR_<machinename>), click ADD
12. Hit OK, and then hit APPLY.

Also, you should look at the "Identity" tab in the Microsoft Word Document PROPERTIES and see that it is set to "Interactive User"

ALSO, log into the machine AS the IUSR_<machinename> account, start word, and make sure to click through the dialog boxes that Word shows the first time it is run for a certain user.  In other words, make sure Word opens cleanly for the IUSR_ user.

More useful information could be found here:
http://www.email-screen.com/support-doc2txt.html
mstaiger at informatik dot uni-siegen dot de 23-Jan-2002 06:17
The example above (MS Word) is quiet unsatisfying, as I find. Especially since I couldn't find anybody who actually got it running, including myself.

You might therefore give this Powerpoint-example a chance:
----------------------------------
#Instantiate a PowerPoint object.
$ppoint = new COM("PowerPoint.application") or die("Unable to instantiate PowerPoint");

<?php
#Create a new presentation
$ppoint->Presentations->Add() or die ("Could not create presentation");

//Add a slide
$slide=$ppoint->Presentations[1]->Slides->Add(1,1);

//Get the name of this slide
$slidename = $slide->Name();
echo"<br>slidename : $slidename";

//Change the name of this new slide
$slide->Name = "New Slidename";
$slidename = $slide->Name();
echo"<br>NEW slidename : $slidename";

//Save the presentation
$ppoint->Presentations[1]->SaveAs("c:/InetPub/www/test.ppt");
$ppoint->Presentations[1]->Close();

//closing powerpoint
$ppoint->Quit();

//free the object
$ppoint->Release();
$ppoint = null;
-----------------------
?>

the config is :
w2k-server/office2k/iis5/php 4.1.1 isapi

If you happen to run into a working word2k-example, please let me know.

Marc


Constructeur de la classe com

  • « com
  • dotnet »
  • PHP Manual
  • com
  • Constructeur de la classe com

com::__construct

(PHP 4 > 4.1.0, PHP 5, PHP 7, PHP 8)

com::__construct — Constructeur de la classe com

Description

public com::__construct ( string $module_name , array|string|null $server_name = null , int $codepage = CP_ACP , string $typelib = "" )

Construit un nouveau objet com.

Liste de paramètres

module_name
Peut être un ProgID, Class ID ou Moniker qui nomme le composant à charger. Un ProgID est typiquement le nom de l'application ou du DDL, suivit d'un point, suivit du nom de l'objet. Par exemple : Word.Application. Un Class ID est l'UUID qui identifie uniquement une classe donnée. Un Moniker est une forme spécial de nommage, similaire en concept à un schéma URL, qui identifie une ressource et spécifie comment il devrait être chargé? Pour un exemple, vous pouvez démarrer Word et récupérer un objet représentant un document word en spécifiant le chemin complet du document word en tant que nom de module, ou vous pouvez utiliser LDAP: en tant que Moniker pour utiliser l'interface ADSI à LDAP.
server_name
Le nom du server DCOM sur lequel le composant devrait être chargé et exécuté. Si null, l'objet est exécuté en utilisant le défaut pour l'application. La valeur par défaut est typiquement d'exécuter sur la machine locale, cependant l'administrateur peut avoir configuré l'application d'être lancé sur une machine différente. Si vouz définissez une valeur non-null pour un serveur, PHP refusera de charger l'objet sauf si l'option de configuration est défini à true

Si server_name est un tableau, il devrait contenir les éléments suivant (sensible à la case!). À noter qu'ils sont tous optionnel (cependant vous devez définir l'Utilisateur et le Mot de Passe ensemble) ; si vous ommetez le paramètre Server, le serveur par défaut sera utilisé (comme dit ci-dessus), et l'instantiation de l'objet ne sera pas affecté par la directive .

Nom de serveur DCOM
Clé | Type | Description
Server | chaîne de caractères | Le nom du serveur
Username | chaîne de caractères | Le nom d'utilisateur pour se connecter en tant que.
Password | chaîne de caractères | Le mot de passe pour Username.
Domain | chaîne de caractères | Le domaine du serveur.
Drapeaux | entier | Une ou plusieur des constantes suivantes, assemblé ensemble grâce au OU logique : CLSCTX_INPROC_SERVER, CLSCTX_INPROC_HANDLER, CLSCTX_LOCAL_SERVER, CLSCTX_REMOTE_SERVER, CLSCTX_SERVER et CLSCTX_ALL. La valeur par défaut si non définie ici est CLSCTX_SERVER si vous ommetez aussi Server, ou CLSCTX_REMOTE_SERVER si vous définissez un serveur. Vous devriez consultez la documentation de Microsoft pour CoCreateInstance pour plus d'information sur la signification de ces constantes ; vous devrez typiquement jamais les utiliser.

codepage
Défini la codepage qui est utilisé pour convertir les chaîne de caractères en chaîne de caractères unicode et vice versa. La conversion est appliqué quand une chaîne de caractères PHP est passé en tant que paramètre ou retourné depuis une méthode de cet objet COM. La code page est "collante", ce qui signifie que ça sera propagé aux objets et variants retourné depuis l'objet. Les valeurs possibles sont : CP_ACP (utilise la code page ANSI système par défaut - par défaut si ce paramètre est omit), CP_MACCP, CP_OEMCP, CP_SYMBOL, CP_THREAD_ACP (utilise codepage/locale définie pour le thread en cours d'exécution ), CP_UTF7 et CP_UTF8. Vous pouvez aussi utiliser le numéro pour une codepage donnée ; consultez la documentation de Microsoft pour plus de détails sur les codepages et leurs valeurs numériques.

User Contributed Notes

There are no user contributed notes for this page.


La classe dotnet

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

Introduction

La classe dotnet vous autorise à instancier une classe depuis un ensemble .NET et d'appeler et accéder à ses propriétés, si la classe et les méthodes et les propriétés sont » visible pour COM.

Ni l'instantiation de classes static ni l'appel de méthodes statique est supporté.

Quelque classes .Net n'implémente pas IDispatch, donc bien qu'elles peuvent être instancié, appeller des méthodes ou accéder aux propriétés sur ces classes n'est pas supporté.

Note:

Vous devez installer le moteur d'exécution .Net sur votre serveur web pour tirer avantage de cette fonctionnalité.

Note:

.Net framework 4.0 et ultérieur ne sont pas supporté par la classe dotnet. Si des assemblages ont été régistré avec regasm.exe, les classes peuvent être instanciées en tant qu'objets com.

Synopsis de la classe

dotnet extends variant {
/* Méthodes */
public __construct ( string $assembly_name , string $datatype_name , int $codepage = CP_ACP )
}

Méthodes surchargées

L'objet retourné est un objet surchargé, ceci signifie que PHP ne voit pas les méthodes fixé comme il le fait avec les classes normales ; à la place tout accès de propriété ou méthode sont passés à travers COM et à partir de là à DOTNET. Dans d'autres mots, l'objet .Net est mappé via la couche d'interopérabilité COM fournie par le moteur d'exécution .Net.

Une fois que vous avez crée un objet dotnet, PHP le traite de façon identique à n'importe quel autre objet COM ; les mêmes règles s'appliquent.

Exemples dotnet

Exemple #1 Exemple dotnet

<?php
$stack = new dotnet("mscorlib", "System.Collections.Stack");
$stack->Push(".Net");
$stack->Push("Hello ");
echo $stack->Pop() . $stack->Pop();
?>

Sommaire

  • dotnet::__construct — Constructeur de la classe dotnet

User Contributed Notes

Bitterblue 30-Jul-2018 02:54
I worked with this the last few days and figured it out.
On stack overflow: https://stackoverflow.com/a/51541801/1442225
jcastromail at yahoo dot es 18-Nov-2016 09:04
using dotnet with visual studio 2015 (and net framework 4.6.1 but its the same with others).

1) In visual studio 2015, created a library project (in this case a C#)
2) Double click in the project -> build events -> post build

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\gacutil.exe"  /i "$(TargetPath)"

When the project its compiled, it adds to the GAC automatically. Please changes the bin folder according your installation.

3) in tools -> External tools, add the next external tool
Title: Get Qualified Assembly Name
Command: Powershell.exe
Arguments: -command "[System.Reflection.AssemblyName]::GetAssemblyName(\"$(TargetPath)\").FullName"
User Output Windows : checks

4) run tools -> Get qualified Assembly Name and checks the output windows

5) Creates the next class (Class1 may be its already creates)

namespace ClassLibrary2 // <-- changes it.
{
    public class Class1
    {
        public string Ping(string t1,string t2)
        {
            return "pong "+t1+t2;
        }
    }
}

6) in php

$full="ClassLibrary2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=746927f9726d7222"; // its from the output windows
$class = 'ClassLibrary2.Class1'; // its the namespace and the class.

 $stack = new DOTNET($full,$class);
 $r1="hello";
 $r2="world";
 echo $stack->Ping($r1,$r2);

IMPORTANT NOTE: PHP "caches" the dll library, so every time that the dll library is compiled, the php service should be restarted (restart the apache service).
IMPORTANT NOTE 2: May be you should run Visual Studio as an Administrator.
juan156_elias at gmail dot com 04-Jun-2015 08:00
Using COM and DOTNET directly is quite a nightmare. DOTNET only allows you to target .Net 3.5 and below, and all the binaries need to be COM  Visible. This basically means that you will need to write your own .Net binaries for everything, at least wrappers.

There is a library out there (NetPhp) built on top of the COM class that will solve all these issues, so you can get code like this:

$manager = new \NetPhp\Core\NetManager();
$manager->RegisterAssembly('mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089', 'mscorlib');
$manager->RegisterClass('mscorlib', 'System.IO.File', 'File');
$manager->RegisterClass('mscorlib', 'System.IO.FileOptions', 'FileOptions');
$file = $manager->Create('mscorlib', 'File');
$fileoptions = $manager->Create('mscorlib', 'System.IO.FileOptions')->Enum('Encrypted');

$file->Create("C:\\www\\prueba.tres", 2048, $fileoptions);
m dot atifmajeed at gmail dot com 11-Feb-2015 04:29
How to use donet class for creating object of parameterized constructor

http://php.net/manual/en/class.dotnet.php

private SGF ingerPrintManager m_FPM; //member variable
SGFPMDeviceName device_name = SGFPMDeviceName.DEV_ FDU02 ;
m_FPM = new SGF ingerPrintManager (device_name);
ricardopsj at gmail dot com 14-Apr-2014 01:30
Create an Excel Workbook using DOTNET.

<?php

$full_assembly_string = 'Microsoft.Office.Interop.Excel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c';
$full_class_name = 'Microsoft.Office.Interop.Excel.ApplicationClass';

$e = new DOTNET($full_assembly_string, $full_class_name);
$wb = $e->workbooks->add();
$Precios = $wb->Worksheets(1);
$Precios->Name = 'Precios';
$Venta = $wb->Worksheets(2);
$Venta->Name = 'Venta';
$Tons = $wb->Worksheets(3);
$Tons->Name = 'Tons';

$Meses = Array('2014-01', '2014-02', '2014-03', '2014-04', '2014-05', '2014-06', '2014-07', '2014-08', '2014-09', '2014-10', '2014-11', '2014-12');
foreach ($Meses as $Numero => $Mes) {
   $Precios->Range("A" . ($Numero+1))->Value = $Mes;
}

$wb->SaveAs('c:\temp\Meta.2014.05.xlsx');
$wb->Close();

?>

Go to c:\windows\assembly to know what value to put in $full_assembly_string.

If you don't know the assembly, use http://www.red-gate.com/products/dotnet-development/reflector/ to browse it, use what you learn there to fill $full_class_name.

Enjoy,

Ricardo.
jan dot zahradnik at data3s dot com 06-Jan-2014 09:17
PHP searches only GAC for .NET 2.0 runtime, so your DLL has to be targeted 2.0 - 3.5 framework.

Also it recognize only classes, not stucts, so you can't instantiate DateTime for example.
sandips (yardi) 29-Jun-2011 02:57
exercise to try different type of method signature and calling them in php.

VB.net Code
Public Class Class1
    Public Function SayHello(ByVal input As String) As String
        Return "Php input: " & input & "</BR>Dot net library said- 'Hello'"
    End Function
    Public Function ConcatArray(ByVal Values As Object()) As String
        Dim ret As String = String.Empty
        For Each sval As Object In Values
            ret = ret & sval.ToString & " "
        Next
        Return ret.Substring(1, ret.Length - 1)
    End Function
    Public Function ReturnObject(ByVal FirstName As String, ByVal LastName As String) As Name
        Dim obj As New Name
        obj.FirstName = FirstName
        obj.LastName = LastName
        Return obj
    End Function
'To explain Byref doesn't work with php
    Public Function CallByRef(ByRef value As String) As String
        value = "Value to ByRef parameter set in dot net."
        Return "ByRef CallByRef() method called."
    End Function
End Class

Public Class Name
    Public FirstName As String = String.Empty
    Public LastName As String = String.Empty
End Class

Php code to test .net library
<?php
  $class1 = new DOTNET("DotNetTest,"
              ."Version=1.0.0.0,"
                          ."Culture=neutral,"
                      ."PublicKeyToken=6675daefc27eafc4"
              ,"DotNetTest.Class1");
 echo $class1->SayHello("Hi PHP!!!!");
 echo "</P>";

 $parameter[0] = 12345;
 $parameter[1] = "MyString";
 $parameter[2] = false;
 $ret = $class1 -> ConcatArray($parameter);
 echo $ret;
 echo "</P>";

 $Obj = $class1 -> ReturnObject("Sandip","Shimpi");
 echo $Obj->FirstName." ".$Obj->LastName;

 echo "</P>";
 $myByRef = "";
 echo "Value of ByRef Variable before calling .net CallByRef() method: ".$myByRef;
 echo "</BR>";
 echo $class1 -> CallByRef($myByRef);
 echo "</BR>";
 echo "Now value of ByRef Variable: ".$myByRef;
 echo $myByRef;
?>
Anonymous 04-Jul-2010 05:17
As suggested before, you'll likely have to use a full assembly string including the assembly name, the assembly version (not the dll file version), the culture, and the public key token.  Otherwise, you'll get a 'file not found' catchable error.  To quickly find this on your own system to get the ball rolling, open C:\Windows\assembly in explorer (not in cmd as that shows a different view), scroll down the list until you find the assembly you want to work with, hover the mouse over it, and the tooltip shows the exact string to use (though processcorArchitecture if shown is optional).  You'll have to use .net utilities or other methods to automate collecting this info on other machines.

You'll also have to use the fully-qualified class name.  In other words, if you want to use the 'Form' class within 'System.Windows.Forms', you have to use the full class hierarchy 'System.Windows.Forms.Form'.  Otherwise you'll get an unhelpful 'Failed to instantiate .Net object' catchable error.

The following example shows the correct syntax to use the 'Form' class to pop up a blank form from php-cli, which can be used in leu of many Windows GUI PHP extensions out there.  Replace Version with your local version, and PublicKeyToken with your own local key token.

<?php

$full_assembly_string = 'System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=a8425bc35256e463';
$full_class_name = 'System.Windows.Forms.Form';
$form = new DOTNET($full_assembly_string, $full_class_name);

// code to add buttons, menus, text, etc

$form->Show();

$form_event = '';
while($form_event !== 'close') {

  // handle form functions and events

  }
?>
murat at muratyaman dot co dot uk 11-Feb-2010 05:46
First, I hit the same mine:

"... Failed to instantiate .Net object [Unwrapped, QI for IDispatch] [0x80004002] No such interface supported ..."

In order to load the assembly and class in it successfully, I had to change my AssemblyInfo.cs file regarding the visibility of the types in it.

// some code above

// This sets the default COM visibility of types in the assembly to invisible.
// If you need to expose a type to COM, use [ComVisible(true)] on that type.
[assembly: ComVisible(true)]

// some code below
m holmes at windowlogic dot com dot au 21-Sep-2009 09:31
For strongly-named NET assemblies that are registered in the GAC, you can just use the assembly name
e.g: $x = new DOTNET ("myAssembly", "myClass");

For strongly-named NET assemblies that aren't registered in the GAC, you need to use the full assembly string
e.g. $x = new DOTNET('myAssembly, Version=X.X.X.X, Culture=neutral, PublicKeyToken=ZZZZZZZZZZZZ', 'myClass');

You can't instantiate assemblies that haven't been strongly named.

"Strongly named" means that the assembly has a public key. To strongly name your own classes in Visual Studio, go to the Signing tab in the project properties and click the 'sign the assembly' box and choose a key file name.

To register an assembly in the GAC, there are various tools around to do that, but the easiest method is to drag-and-drop the compiled assembly into c:\windows\assembly using windows explorer (a shell extension is installed by default that handles registering dragged files).
kschroeder at mirageworks dot com 08-Apr-2009 11:55
In order to find out what the PublicKeyToken value is, open up Explorer and go to c:\windows\assembly.  In that directory you will see all of the registered assemblies along with their PublicKeyToken value.
sam at bitopia dot co dot uk 02-May-2008 08:54
If you want to load any other assembly apart from mscorlib, you'll need to include it like the following

$x = new DOTNET('The.Assembly.Name, Version=X.X.X.X, Culture=neutral, PublicKeyToken=ZZZZZZZZZZZZ', 'The.Class.Name');

Replace all relevant details.


Constructeur de la classe dotnet

  • « dotnet
  • variant »
  • PHP Manual
  • dotnet
  • Constructeur de la classe dotnet

dotnet::__construct

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

dotnet::__construct — Constructeur de la classe dotnet

Description

public dotnet::__construct ( string $assembly_name , string $datatype_name , int $codepage = CP_ACP )

Construit un nouvel objet dotnet.

Liste de paramètres

assembly_name
Spécifie l'assemblage qui doit être chargé.
datatype_name
Spécifie la classe dans cet assemblage à instancier.
codepage
Codepage à utiliser pour les transformations de chaîne de caractères unicode ; voir la classe com pour plus de détails sur les codepages.

User Contributed Notes

There are no user contributed notes for this page.


La classe variant

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

Introduction

Le VARIANT est l'équivalent COM de zval pour PHP ; c'est une structure qui peut contenir une valeur avec un intervalle de différent types possibles. La classe variant fournie par l'extension COM vous permet d'avoir plus de contrôle sur ce que PHP envoie et reçoit de COM.

Synopsis de la classe

variant {
/* Méthodes */
public __construct ( mixed $value = null , int $type = VT_EMPTY , int $codepage = CP_ACP )
}

Exemples variant

Exemple #1 Exemple variant

<?php
$v = new variant(42);
print "The type is " . variant_get_type($v) . "<br/>";
print "The value is " . $v . "<br/>";
?>

Note:

Lors du retour d'une valeur ou récupérer une propriété variant, le variant est converti en une valeur PHP seulement quand il y a une correspondance directe entre les types qui ne produiraient pas une perte d'information. Dans tous les autres cas, la valeur est retourné en tant qu'une instance de la classe variant. Vous pouvez forcer PHP de convertir ou évaluer le variant en tant que type PHP natif en utilisant les opérateurs de transtypage explicitement, ou implicitement vers une chaîne de caractères en l'affichant grâce à print. Vous pouvez utiliser la grande variété de fonctions variant pour effectuer des opérations arithmétrique sans forcer une conversion et risquer une perte de données.

Voir aussi variant_get_type().

Sommaire

  • variant::__construct — Constructeur de la classe variant

User Contributed Notes

darren at dcook dot org 17-Jul-2007 05:59
If you are frustrated that print_r($obj) (where $obj is something returned from a call to a function on a COM object) does not return anything helpful, and that variant_get_type($obj) just returns a number, the function you are actually after is:
  com_print_typeinfo($obj);

It lists all functions, variables, their types in a human-readable (well, programmer-readable) format. Lovely!
richard dot quadling at carval dot co dot uk 26-Feb-2003 05:50
With thanks to Harald Radi and Wez Furlong.

Some VBA functions have optional parameters. Sometimes the parameters you want to pass are not consecutive.

e.g.

GoTo What:=wdGoToBookmark, Name="BookMarkName"
GoTo(wdGoToBookmark,,,"BookMarkName)

In PHP, the "blank" parameters need to be empty.

Which is ...

<?php
// Some servers may have an auto timeout, so take as long as you want.
set_time_limit(0);

// Show all errors, warnings and notices whilst developing.
error_reporting(E_ALL);

// Used as a placeholder in certain COM functions where no parameter is required.
$empty = new VARIANT();

// Load the appropriate type library.
com_load_typelib('Word.Application');

// Create an object to use.
$word = new COM('word.application') or die('Unable to load Word');
print "Loaded Word, version {$word->Version}\n";

// Open a new document with bookmarks of YourName and YourAge.
$word->Documents->Open('C:/Unfilled.DOC');

// Fill in the information from the form.
$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourName'); // Note use of wdGoToBookmark, from the typelibrary and the use of $empty.
$word->Selection->TypeText($_GET['YourName']);

$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourAge');
$word->Selection->TypeText($_GET['YourAge']);

// Save it, close word and finish.
$word->Documents[1]->SaveAs("C:/{$_GET['YourName']}.doc");
$word->Quit();
$word->Release();
$word = null;
print "Word closed.\n";
?>

The example document is ...

Hello [Bookmark of YourName], you are [Bookmark of YourAge] years old.

and it would be called ...

word.php?YourName=Richard%20Quadling&YourAge=35

Regards,

Richard.


Constructeur de la classe variant

  • « variant
  • COMPersistHelper »
  • PHP Manual
  • variant
  • Constructeur de la classe variant

variant::__construct

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

variant::__construct — Constructeur de la classe variant

Description

public variant::__construct ( mixed $value = null , int $type = VT_EMPTY , int $codepage = CP_ACP )

Construit un nouvel objet variant.

Liste de paramètres

value
Valeur initiale. Si omit, ou défini à null un objet VT_EMPTY vide est crée.
type
Spécifie le type de contenue de l'objet variant. Les valeurs possibles sont l'une des constantes VT_XXX Constantes pré-définies. PHP peut détecter les paramètres passé par référence automatiquement ; Ils n'ont pas besoin d'être passé an tant qu'objets variant. Consultez la bibliothèque MSDN pour des informations additionnelles sur le type VARIANT.
codepage
Spécifie la codepage qui est utilisé pour convertir les chaîne de caractères vers unicode. Voir le paramètre avec le même nom dans la classe com pour plus d'informations.

User Contributed Notes

There are no user contributed notes for this page.


The COMPersistHelper class

(PHP 5, PHP 7, PHP 8)

Introduction

COMPersistHelper improves the interoperability of COM and PHP with regard to the php.ini directive open_basedir, and stream ressources.

Synopsis de la classe

final COMPersistHelper {
/* Méthodes */
public __construct ( variant|null $variant = null )
public GetCurFileName ( ) : string|false
public GetMaxStreamSize ( ) : int
public InitNew ( ) : bool
public LoadFromFile ( string $filename , int $flags = 0 ) : bool
public LoadFromStream ( resource $stream ) : bool
public SaveToFile ( string|null $filename , bool $remember = true ) : bool
public SaveToStream ( resource $stream ) : bool
}

Sommaire

  • COMPersistHelper::__construct — Construct a COMPersistHelper object
  • COMPersistHelper::GetCurFileName — Get current filename
  • COMPersistHelper::GetMaxStreamSize — Get maximum stream size
  • COMPersistHelper::InitNew — Initialize object to default state
  • COMPersistHelper::LoadFromFile — Load object from file
  • COMPersistHelper::LoadFromStream — Load object from stream
  • COMPersistHelper::SaveToFile — Save object to file
  • COMPersistHelper::SaveToStream — Save object to stream

User Contributed Notes

There are no user contributed notes for this page.


Construct a COMPersistHelper object

  • « COMPersistHelper
  • COMPersistHelper::GetCurFileName »
  • PHP Manual
  • COMPersistHelper
  • Construct a COMPersistHelper object

COMPersistHelper::__construct

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::__construct — Construct a COMPersistHelper object

Description

public COMPersistHelper::__construct ( variant|null $variant = null )

Constructs a persistence helper object, usually associated with a variant.

Liste de paramètres

variant
A COM object which implements IDispatch. To be able to successfully call any of COMPersistHelper's methods, the object has to implement IPersistFile, IPersistStream and/or IPersistStreamInit. Passing null as variant is only useful if the object is to be loaded from a stream by calling COMPersistHelper::LoadFromStream().

User Contributed Notes

There are no user contributed notes for this page.


Get current filename

  • « COMPersistHelper::__construct
  • COMPersistHelper::GetMaxStreamSize »
  • PHP Manual
  • COMPersistHelper
  • Get current filename

COMPersistHelper::GetCurFileName

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::GetCurFileName — Get current filename

Description

public COMPersistHelper::GetCurFileName ( ) : string|false

Retrieves the current name of the file associated with the object.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Returns the current name of the file associated with the object.

Erreurs / Exceptions

A com_exception is thrown if the associated object does not implement the COM interface IPersistFile, or when calling the IPersistFile::GetCurFile() method failed.

User Contributed Notes

There are no user contributed notes for this page.


Get maximum stream size

  • « COMPersistHelper::GetCurFileName
  • COMPersistHelper::InitNew »
  • PHP Manual
  • COMPersistHelper
  • Get maximum stream size

COMPersistHelper::GetMaxStreamSize

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::GetMaxStreamSize — Get maximum stream size

Description

public COMPersistHelper::GetMaxStreamSize ( ) : int

Retrieves the size of the stream (in bytes) needed to save the object.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Returns the size of the stream (in bytes) needed to save the object.

Erreurs / Exceptions

A com_exception is thrown if the associated object does neither implement the COM interface IPersistStream nor IPersistStreamInit, or when calling the IPersistStream::GetSizeMax() method failed.

User Contributed Notes

There are no user contributed notes for this page.


Initialize object to default state

  • « COMPersistHelper::GetMaxStreamSize
  • COMPersistHelper::LoadFromFile »
  • PHP Manual
  • COMPersistHelper
  • Initialize object to default state

COMPersistHelper::InitNew

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::InitNew — Initialize object to default state

Description

public COMPersistHelper::InitNew ( ) : bool

Initializes an object to a default state.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

A com_exception is thrown if the associated object does not implement the COM interface IPersistStreamInit, or when calling its IPersistStreamInit::Init() method failed.

User Contributed Notes

There are no user contributed notes for this page.


Load object from file

  • « COMPersistHelper::InitNew
  • COMPersistHelper::LoadFromStream »
  • PHP Manual
  • COMPersistHelper
  • Load object from file

COMPersistHelper::LoadFromFile

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::LoadFromFile — Load object from file

Description

public COMPersistHelper::LoadFromFile ( string $filename , int $flags = 0 ) : bool

Opens the specified file and initializes an object from the file contents.

Liste de paramètres

filename
The name of the file from which to load the object.
flags
The access mode to be used when opening the file. Possible values are taken from the » STGM enumeration. The method can treat this value as a suggestion, adding more restrictive permissions if necessary. If flags is 0, the implementation is supposed to open the file using whatever default permissions are used when a user opens the file.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

A com_exception is thrown if the associated object does not implement the COM interface IPersistFile, or when calling the IPersistFile::Load() method failed.

User Contributed Notes

There are no user contributed notes for this page.


Load object from stream

  • « COMPersistHelper::LoadFromFile
  • COMPersistHelper::SaveToFile »
  • PHP Manual
  • COMPersistHelper
  • Load object from stream

COMPersistHelper::LoadFromStream

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::LoadFromStream — Load object from stream

Description

public COMPersistHelper::LoadFromStream ( resource $stream ) : bool

Initializes an object from the stream where it was saved previously.

Liste de paramètres

stream
The stream ressource from which to load the object.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

A com_exception is thrown if the associated object does not implement the COM interface IPersistStream, or when calling the IPersistStream::Load() method failed.

User Contributed Notes

There are no user contributed notes for this page.


Save object to file

  • « COMPersistHelper::LoadFromStream
  • COMPersistHelper::SaveToStream »
  • PHP Manual
  • COMPersistHelper
  • Save object to file

COMPersistHelper::SaveToFile

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::SaveToFile — Save object to file

Description

public COMPersistHelper::SaveToFile ( string|null $filename , bool $remember = true ) : bool

Saves a copy of the object to the specified file.

Liste de paramètres

filename
The name of the file to which to save the object.
remember
Indicates whether the filename parameter is to be used as the current working file. If true, filename becomes the current file and the object is supposed to clear its dirty flag after the save. If false, this save operation is a "Save A Copy As ..." operation. In this case, the current file is unchanged and the object is not supposed to clear its dirty flag.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

A com_exception is thrown if the associated object does not implement the COM interface IPersistFile, or when calling the IPersistFile::Save() method failed.

Exemples

Exemple #1 Basic COMPersistHelper::saveToFile() Usage

<?php
$word = new COM('Word.Application');
$doc = $word->Documents->Add();
$ph = new COMPersistHelper($doc);
$ph->SaveToFile('C:\\Users\\cmb\\Documents\\my.docx');
$word->Quit();
?>

User Contributed Notes

There are no user contributed notes for this page.


Save object to stream

  • « COMPersistHelper::SaveToFile
  • com_exception »
  • PHP Manual
  • COMPersistHelper
  • Save object to stream

COMPersistHelper::SaveToStream

(PHP 5, PHP 7, PHP 8)

COMPersistHelper::SaveToStream — Save object to stream

Description

public COMPersistHelper::SaveToStream ( resource $stream ) : bool

Saves an object to the specified stream.

Liste de paramètres

stream
The stream ressource to which to save the object.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

A com_exception is thrown if the associated object does neither implement the COM interface IPersistStream nor IPersistStreamInit, or when calling the IPersistStream::Save() method failed.

User Contributed Notes

There are no user contributed notes for this page.


La classe The com_exception

(PHP 5, PHP 7, PHP 8)

Introduction

Synopsis de la classe

com_exception extends Exception implements Throwable {
/* Propriétés héritées */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* Méthodes héritées */
final public Exception::getMessage ( ) : string
final public Exception::getPrevious ( ) : Throwable
final public Exception::getCode ( ) : mixed
final public Exception::getFile ( ) : string
final public Exception::getLine ( ) : int
final public Exception::getTrace ( ) : array
final public Exception::getTraceAsString ( ) : string
public Exception::__toString ( ) : string
final private Exception::__clone ( ) : void
}

User Contributed Notes

There are no user contributed notes for this page.


Fonctions COM et .Net (Windows)

Voir aussi

Pour plus d'informations sur les objets COM, lisez les » spécifications COM. Vous pouvez trouver des informations utiles dans notre FAQ pour PHP et COM. Si vous voulez utiliser des applications MS Office sur le serveur, vous devez lire les informations ici : » Considerations for Server-Side Automation of Office.

Sommaire

  • com_create_guid — Génère un identifiant unique global (GUID)
  • com_event_sink — Connecte des événements d'un objet COM sur un objet PHP
  • com_get_active_object — Retourne un objet représentant l'instance actuelle d'un objet COM
  • com_load_typelib — Charge un Typelib
  • com_message_pump — Traite un message COM dans un délai donné
  • com_print_typeinfo — Affiche une définition de classe PHP pour une interface répartissable
  • variant_abs — Retourne la valeur absolue d'un variant
  • variant_add — "Ajoute" deux valeurs de variants et retourne le résultat
  • variant_and — Effectue un ET entre deux variants et retourne le résultat
  • variant_cast — Convertit un variant en un nouvel objet variant de type différent
  • variant_cat — Assemble deux valeurs variantes ensemble et retourne le résultat
  • variant_cmp — Compare deux variants
  • variant_date_from_timestamp — Retourne une représentation date en variant d'un timestamp Unix
  • variant_date_to_timestamp — Convertit une valeur date/temps variante en un timestamp Unix
  • variant_div — Retourne le résultat de la division de deux variants
  • variant_eqv — Effectue une équivalence de bits de deux variants
  • variant_fix — Récupère la portion entière d'un variant
  • variant_get_type — Retourne le type d'un objet variant
  • variant_idiv — Convertit des variants en valeurs entières, et effectue alors une division
  • variant_imp — Exécute une implication sur les bits de deux variants
  • variant_int — Retourne la partie entière d'un variant
  • variant_mod — Divise deux variantes et retourne le reste
  • variant_mul — Multiplie les valeurs de deux variants
  • variant_neg — Effectue une négation logique sur un variant
  • variant_not — Exécute une négation sur les bits sur un variant
  • variant_or — Performe une disjonction logique sur deux variants
  • variant_pow — Retourne le résultat de la fonction puissance avec deux variants
  • variant_round — Arrondit le variant au nombre spécifié de décimales
  • variant_set_type — Convertit un variant en un autre type "sur-place"
  • variant_set — Assigne une nouvelle valeur pour un objet variant
  • variant_sub — Soustrait la valeur du variant de droite de la valeur de celui de gauche
  • variant_xor — Exécute une exclusion logique sur deux variants

User Contributed Notes

Sorin Negulescu 05-Nov-2016 10:49
I have spent a lot of hours trying to make word.application work on a Windows Server using Apache as a service.
The application was working if Apache was started from command line (not as a service).

In the hope that this will help others not to lose hours of trying to solve this problem here is what I found out:

- In php.ini make sure you have the following key under the [COM_DOT_NET]: extension=php_com_dotnet.dll
- Apache shall run under a normal user account (not SYSTEM account). Run services.msc and fill-in the info of the user under the Apache service's Properties tab.
- Make sure you are able to start MS Word normally under that user account and dismiss all the dialogs that may appear (license, your info with initials, etc.). Start Word once again and make sure no dialogs appear.
- Launch dcomcnfg.exe->Console Root->Component Services->Computers->My Computer->DCOM Config->Microsoft Office Word 97 - 2003->Right Click(Properties)->Identity Tab and fill in the same user account information as for Apache service.
- If you cannot find the Microsoft Office Word 97 - 2003, make sure you are launching the correct DCOM Config (64 bit vs 32 bit) depending on what version of Office you have installed. To launch the 32 bit version run: mmc comexp.msc /32

Before following the steps described above, the winword.exe app appears in task manager but, if you look at the memory consumption you can notice two things:
- it increases slowly
- it stops usually at about 7-8 MB.

Keywords: COM, word.application, Apache, service, winword, timeout, no error
larrywalker at at chelseagroton dot com 02-Sep-2008 08:53
To run a php script in a background process and pass it you var use

<?php

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("c:\\xampp\\php\\php.exe

c:\\xampp\\Not_on_Web\\ftptestback.php --user=$username", 7, false);

?>

Works for me.
monica at digitaldesignservices dot com 27-Dec-2007 02:41
Working with Word 2003 COM object.

Have you been trying to work with the Word.Application COM and the Word Document would crash and the PHP script would hang?

Turns out that there is an issue within the Office COM object that doesn't let the web application (IIS, Apache) scripting engine release the object after instancing the COM.  The Service Pack 3 office update claims to remedy this.  Will test and post findings.
tomfmason at nospam-gmail dot com 08-Oct-2007 07:26
To get the cpu load percentage you can do something like this.

<?php
$wmi = new COM('winmgmts://');
$processor = $wmi->ExecQuery("SELECT * FROM Win32_Processor");
foreach($processor as $obj){
    $cpu_load_time = $obj->LoadPercentage;
}
echo $cpu_load_time;
?>

reference http://msdn2.microsoft.com/en-us/library/aa394373.aspx

To list current apache instances

<?php
$wmi = new COM('winmgmts://');
$processes = $wmi->ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'httpd.exe'");
foreach($processes as $process){
    echo $process->CommandLine . "<br />";
    echo $process->ProcessId . "<br />";
}
?>

reference http://msdn2.microsoft.com/en-us/library/aa394372.aspx

To run a php script in a background process

<?php
$dir = "C:\\path\\to\\dir";
$php_path = "C:\\path\\to\\php.exe";
$file = "somescript.php";
//send time current timestamp
$cmd_options = "-t " . time();
$wscript = new COM('WScript.Shell');
$wscript->Run("cmd /K CD $php_path $dir\\$file  &  ", 0, false);
?>

Enjoy

Tom
naveed at php dot net 10-Mar-2007 05:24
Here is a spell check implementation that displays the suggestion list for each misspelled word.

<?php
function SpellCheck($input)
{
    $word=new COM("word.application") or die("Cannot create Word object");
    $word->Visible=false;
    $word->WindowState=2;
    $word->DisplayAlerts=false;
    $doc=$word->Documents->Add();
    $doc->Content=$input;
    $doc->CheckSpelling();
    $result= $doc->SpellingErrors->Count;
    if($result!=0)
    {
        echo "Input text contains misspelled words.\n\n";
        for($i=1; $i <= $result; $i++)
        {
            echo "Original Word: " .$doc->SpellingErrors[$i]->Text."\n";
            $list=$doc->SpellingErrors[$i]->GetSpellingSuggestions();
            echo "Suggestions: ";
            for($j=1; $j <= $list->Count; $j++)
            {
                $correct=$list->Item($j);
                echo $correct->Name.",";
            }
            echo "\n\n";
        }
    }
    else
    {
        echo "No spelling mistakes found.";
    }
    $word->ActiveDocument->Close(false);
    $word->Quit();
    $word->Release();
    $word=null;
}

$str="Hellu world. There is a spellling error in this sentence.";
SpellCheck($str);
?>
Francois-R dot Boyer at PolyMtl dot ca 13-Feb-2007 08:32
I had the problem when trying to call Access VBA scripts from PHP; the call was working but Access would never quit.  The problem was that the Apache server is running as SYSTEM, and not a user we normally use to run Office.  And as the first time a user runs Office, it asked the SYSTEM user to enter its name and initials! ;-)

To correct this problem: Stop Apache, go to Services, Apache, Properties, "Log On" tab, and check "Allow service to interact with desktop.  Restart Apache, then open your office application, in a page loaded by the Apache server, with a small PHP code like this, :

<?php
$app = new COM("Access.Application"); // or Word.Application or Excel.Application ...
$app->Visible = true; // so that we see the window on screen
?>

Put the name you want and quit the application.  Now your Office application should terminate correctly the next time you load it with a COM object in PHP.  You can stop Apache uncheck the "Allow service to interact with desktop", and restart Apache if you like.  I don't even require a Quit or anything to be sent to Access, it quits automatically when PHP terminates.

And for those who wish to know how I'm calling Access VBA scripts, instead of using ODBC or any other way to send SQL requests, which does not seem to work to call VBA scripts, I open the database as a COM object and it works fine:

<?php
$db_com = new COM("pathname of the file.mdb");
$result = $db_com->Application->Run("function_name", 'param1', 'param2', '...');
?>
03-Oct-2006 04:11
If someone want to get a COM object out of a DCOM object can do something like that:

<?php
  $dcom_obj = new COM('dacom.object','remotehost') or die("Unable to get DCOM object!");
  $com_obj = new Variant(NULL);
  $dcom_obj->Get_Module($com_obj); //user function which returns a custom IDispatch (casted as variant*)
?>

Hopefully this will help someone, because it took me quite long to figure this out.
kiotech at hotmail dot com 18-Jul-2006 06:35
For use parameters with PHP this is a Code Example

<?php
$ObjectFactory= New COM("CrystalReports11.ObjectFactory.1");
  $crapp = $ObjectFactory->CreateObject("CrystalDesignRunTime.Application");
  $creport = $crapp->OpenReport("//report1.rpt", 1);

      $z= $creport->ParameterFields(1)->SetCurrentValue("Mango");
      $z= $creport->ParameterFields(2)->SetCurrentValue(5000);

  $creport->ExportOptions->DiskFileName="reportin.pdf";
  $creport->ExportOptions->PDFExportAllPages=true;
  $creport->ExportOptions->DestinationType=1;   $creport->ExportOptions->FormatType=31;
  $creport->Export(false);

$len = filesize("reportin.pdf");
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=reportin.pdf");
readfile("reportin.pdf");
?>
a dot kulikov at pool4tool dot com 13-Mar-2006 09:36
In case you are wondering how to group rows or columns in the freshly created EXCEL files, then this may help you

<?php
   /***
    * Grouping Rows optically in Excel Using a COM Object
    *
    * That was not easy, I have spent several hours of trial and error to get
    * this thing to work!!!
    *
    * @author Kulikov Alexey <a.kulikov@gmail.com>
    * @since  13.03.2006
    *
    * @see    Open Excel, Hit Alt+F11, thne Hit F2 -- this is your COM bible
    ***/

   //starting excel
   $excel = new COM("excel.application") or die("Unable to instanciate excel");
   print "Loaded excel, version {$excel->Version}\n";

   //bring it to front
   #$excel->Visible = 1;//NOT

   //dont want alerts ... run silent
   $excel->DisplayAlerts = 0;

   //create a new workbook
   $wkb = $excel->Workbooks->Add();

   //select the default sheet
   $sheet=$wkb->Worksheets(1);

   //make it the active sheet
   $sheet->activate;

   //fill it with some bogus data
   for($row=1;$row<=7;$row++){
       for ($col=1;$col<=5;$col++){

          $sheet->activate;
          $cell=$sheet->Cells($row,$col);
          $cell->Activate;
          $cell->value = 'pool4tool 4eva ' . $row . ' ' . $col . ' ak';
       }//end of colcount for loop
   }

   ///////////
   // Select Rows 2 to 5
   $r = $sheet->Range("2:5")->Rows;

   // group them baby, yeah
   $r->Cells->Group;

   // save the new file
   $strPath = 'tfile.xls';
   if (file_exists($strPath)) {unlink($strPath);}
   $wkb->SaveAs($strPath);

   //close the book
   $wkb->Close(false);
   $excel->Workbooks->Close();

   //free up the RAM
   unset($sheet);

   //closing excel
   $excel->Quit();

   //free the object
   $excel = null;
?>
Pedro Heliodoro 05-Mar-2006 02:38
Using the Windows Media Player OCX and the latest snap of PHP 5.1 i was able to eject a CD-ROM drive

<?php
//create an instance of Windows Media Player
$mp = new COM("WMPlayer.OCX");
//ejects the first cd-rom on the drive list
$mp->cdromcollection->item(0)->eject();

?>
allan666 at gmail dot com 29-Sep-2005 03:37
If you are using a COM object that opens windows or dialogs (like Office applications), those windows or dialogs will not appear and will stay invisible even if you use codes like

$word->visible = true;

To solve this problem, go to the web service properties (Administrative Tools) and click (in the Logon TAB) "Allow the Service to Iterate with desktop".

This explain lots of problems to close applications. When you try to close, the dialos asking to save the file must appear, but only in the option to iterate with desktop is on.

Hope it helps.
bruce at yourweb dot com dot au 23-Apr-2005 05:47
Simple convert xls to csv
<?php
// starting excel
$excel = new COM("excel.application") or die("Unable to instanciate excel");
print "Loaded excel, version {$excel->Version}\n";

//bring it to front
#$excel->Visible = 1;//NOT
//dont want alerts ... run silent
$excel->DisplayAlerts = 0;

//open  document
$excel->Workbooks->Open("C:\\mydir\\myfile.xls");
//XlFileFormat.xlcsv file format is 6
//saveas command (file,format ......)
$excel->Workbooks[1]->SaveAs("c:\\mydir\\myfile.csv",6);

//closing excel
$excel->Quit();

//free the object
$excel->Release();
$excel = null;
?>
michael at example dot com 23-Feb-2005 12:42
After alot of trouble with IIS 6/Windows 2003 and PHP 5.0.2 I figured out how to use Imagemagick COM+/OLE interface. Seems you have to recreate the COM object after each convert() otherwise it will sometimes fail with very strange errors, since the PHP COM interface is not as stable as the old ASP one apparently is.
06-Jan-2005 09:11
if you want to add a new hyperlink with excel :

<?php
$cell=$sheet->Range('O'.$j);
$cell->Hyperlinks->Add($cell ,'here_your_file');
?>

I write this note because is very difficult to find
the good method to do that .

Merci beaucoup
sorin dot andrei at mymail dot ro 25-Sep-2004 02:24
[Editor's Note:
Serializing the object, storing it and then (on the next page) unserializing it WILL work.
End Note]

the big problem for PHP is it can't save in session an COM object

an samples code is here. This works just first time, then give the error:
Call to undefined method com::Refresh() on line  $mMap->Refresh();
the reson is he can't save the object $mMap in session

<?php
    session_start();
      if (isset($_SESSION['map'])) {
            $mMap = $_SESSION['map'];
        }
        else
        {
        $ArcIMSConnector = new COM ("aims.ArcIMSConnector")  or die("can not create AIMS message object");
            echo "Loaded ArcIMSConnector, <br>";
            $ArcIMSConnector->ServerName = "map.sdsu.edu";
            $ArcIMSConnector->ServerPort = 5300;

            $mMap = new COM ("aims.Map")  or die("can not create aims.Map message object");
            echo "Loaded aims.Map, <br>";
            print "AIMS-ServerName= $ArcIMSConnector->ServerName <br>";

            $resultInit= $mMap->InitMap($ArcIMSConnector,"Worldgeography");

            $mMap->Width    = 400;            //                                'Width of the map in pixels
            $mMap->Height   = 300;            //                                'Height of the map in pixels
            $mMap->BackColor = 15130848;
            $_SESSION['map'] = $mMap;
        }

    $resultRefresh = $mMap->Refresh();                                //Refresh the map
    $urlImage      = $mMap->GetImageAsUrl();
    print "<br>urlImage=$urlImage<br>";

    print "<br><IMG SRC='$urlImage'>";

/*
    $ArcIMSConnector->Release();
    $ArcIMSConnector = null;

    $mMap->Release();
    $mMap = null;
*/

?>
ferozzahid [at] usa [dot] com 24-Aug-2004 12:06
To pass a parameter by reference to a COM function, you need to pass VARIANT to it. Common data types like integers and strings will not work for it.

As an example, calling a function that retrieves the name of a person will look like:

<?php
$Name = new VARIANT;

$comobj = new COM("MyCOMOBj.Component") or die("Couldn't create the COM Component");

if(!$comobj->GetName($Name)) {
    echo("Could not retrieve name");
}
else {
    echo("The name retrieved is : " . $Name->value);
}
?>

$Name->type will contain the type of the value stored in the VARIANT e.g. VT_BSTR.

Note For PHP 5:

Insted of '$Name->value', we can use only '$Name' for getting the value stored in the VARIANT. To get the type of the value stored in the VARIANT, use 'variant_get_type($Name)'.

Feroz Zahid
Shawn Coppock 11-Aug-2004 01:15
For those of us that are not experts with object models, if you have Microsoft Excel or Microsoft Word available, go into the Visual Basic Editor (Alt+F11). Now you can open the object browser window (F2) and see what you find.

If you select "Word" in the object browser, then the classes and members of that class are displayed below. For example, if you click on "Selection" in the classes column, and then "Font" in the members column, you will then see "Property Font As Font Member of Word.Selection" displayed at the bottom. Click on the "Font" link there.

Click on Word "Selection" again in the classes column, and then "PageSetup" in the members column, you will then see "Property PageSetup As PageSetup Member of word.Selection" displayed at the bottom. Click on the "PageSetup" link there.

Using the above examples, you can now formulate your Word Document from php. Here is a simple example that creates a 1 & 1/2" space for text based on the margin settings & with dark red text and an 8pt Helvetica font face:

<?php
$content = "Insert Sample Text Here\n\nThis starts a new paragraph line.";
$word= new COM("word.application") or die("Unable to create Word document");
print "Loaded Word, version {$word->Version}\n";
$word->Visible = 0;
$word->Documents->Add();
$word->Selection->PageSetup->LeftMargin = '3"';
$word->Selection->PageSetup->RightMargin = '4"';
$word->Selection->Font->Name = 'Helvetica';
$word->Selection->Font->Size = 8;
$word->Selection->Font->ColorIndex= 13; //wdDarkRed = 13
$word->Selection->TypeText("$content");
$word->Documents[1]->SaveAs("some_tst.doc");
$word->quit();
echo "done";
?>

This example (and others) worked for me with Microsoft Word 10.0 Object Library (MS Word 2002), Apache & PHP on Windows XP. Experimenting using the Visual Basic editor will yield some amazing documents from PHP as it will help you see the relationships of the objects used and give you an idea as to how to construct your code. But be prepared for an occaisional PHP.exe crash if your code is way off base.

Hope this helps!
angelo [at] mandato <dot> com 18-May-2004 04:30
Useful PHP functions I created (similar to other standard PHP database functions) for working with an ADO datasource:
<?php
    // ado.inc.php

    $ADO_NUM = 1;
    $ADO_ASSOC = 2;
    $ADO_BOTH = 3;

    function ado_connect( $dsn )
    {
        $link = new COM("ADODB.Connection");
        $link->Open($dsn);
        return $link;
    }

    function ado_close( $link )
    {
        $link->Close();
    }

    function ado_num_fields( $rs )
    {
        return $rs->Fields->Count;
    }

    function ado_error($link)
    {
        return $link->Errors[$link->Errors->Count-1]->Number;
    }

    function ado_errormsg($link)
    {
        return $link->Errors[$link->Errors->Count-1]->Description;
    }

    function ado_fetch_array( $rs, $result_type,  $row_number = -1 )
    {
        global $ADO_NUM, $ADO_ASSOC, $ADO_BOTH;
        if( $row_number > -1 ) // Defined in adoint.h - adBookmarkFirst    = 1
            $rs->Move( $row_number, 1 );

        if( $rs->EOF )
            return false;

        $ToReturn = array();
        for( $x = 0; $x < ado_num_fields($rs); $x++ )
        {
            if( $result_type == $ADO_NUM || $result_type == $ADO_BOTH )
                $ToReturn[ $x ] = $rs->Fields[$x]->Value;
            if( $result_type == $ADO_ASSOC || $result_type == $ADO_BOTH )
                $ToReturn[ $rs->Fields[$x]->Name ] = $rs->Fields[$x]->Value;
        }
        $rs->MoveNext();
        return $ToReturn;
    }

    function ado_num_rows( $rs )
    {
        return $rs->RecordCount;
    }

    function ado_free_result( $rs )
    {
        $rs->Close();
    }

    function ado_query( $link, $query )
    {
        return $link->Execute($query);
    }

    function ado_fetch_assoc( $rs,  $row_number = -1 )
    {
        global $ADO_ASSOC;
        return  ado_fetch_array( $rs, $ADO_ASSOC, $row_number);
    }

    function ado_fetch_row( $rs,  $row_number = -1 )
    {
        global $ADO_NUM;
        return ado_fetch_array( $rs, $ADO_NUM, $row_number);
    }

    // Extra functions:
    function ado_field_len( $rs, $field_number )
    {
        return $rs->Fields[$field_number]->Precision;
    }

    function ado_field_name( $rs, $field_number )
    {
        return $rs->Fields[$field_number]->Name;
    }

    function ado_field_scale( $rs, $field_number )
    {
        return $rs->Fields[$field_number]->NumericScale;
    }

    function ado_field_type( $rs, $field_number )
    {
        return $rs->Fields[$field_number]->Type;
    }

?>

The aod version was a typo.
mark dickens at mindspring dot com 29-Feb-2004 08:03
Just a note to those wanting to use COM to interface to printers under Windows 2000/XP.  If it doesn't work or seems to hang, try changing the logon identity under which the Apache (assuming you're using Apache) service is running from the System account to another account.  By default most services will install to run under the System account and although the System account has total authority on the computer it is running on, it has no authority outside of that realm as I understand it.  Apparently accessing printers is considered "outside the realm".  I used this technique to interface a Dymo thermal label printer to my server and it works now.
alanraycom at el hogar dot net com 03-Dec-2003 03:50
XSLT transformations using MSXML can be done with this code

<?php
function xsltransform1($xslpath,$xmlstring)
 {
  $xml= new COM("Microsoft.XMLDOM");
  $xml->async=false;
  // $xmlstring is an xml string
  $xml->load($xmlstring);
  $xsl = new COM("Microsoft.XMLDOM");
  $xsl->async=false;
  // $xslpath is path to an xsl file
  $xsl->load($xslpath);
  $response=$xml->transformNode($xsl);
  unset($xml);
  unset($xsl);
  return $response;
 }
?>

enjoy
Alan Young
chris at hitcatcher dot com 01-Dec-2003 04:19
Many COM objects don't do well when passing long (win32) filenames as function parameters.  You can get the 8.3 name of the folder or file on *most* (some win platforms don't support it, and it can be toggled off in the registry for performance reasons) servers using the following:

<?php
//create FSO instance
$exFSO = new COM("Scripting.FileSystemObject") or die ("Could not create Scripting.FileSystemObject");

//set vars
$myDir = "C:\\Program Files\\";
$myFile = "a long file name.txt";

//get folder & file objects
$exDir = $exFSO->GetFolder($myDir);
$exFile = $exFSO->GetFile($myDir . $myFile);
echo $exDir->ShortPath;
echo $exFile->ShortPath;
?>
23-Nov-2003 09:57
Here is an example of reading the custom properties like Author, Keywords, etc. which are stored in MS Office and other Windows files. You must install and register dsofile as described at http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q224351. The .frm file in that distribution lists most of the available properties.

<?php
// the file you wish to access
$fn = '/docs/MFA.xls';

$oFilePropReader = new COM('DSOleFile.PropertyReader');
$props = $oFilePropReader->GetDocumentProperties($fn);

// one syntax
$au = com_get($props, 'Author');
print "au: $au \n";

//another syntax
$str = 'LastEditedBy';
$lsb = $props->$str;
var_dump($lsb);

// set a property if you wish
if (!$props->IsReadOnly()) {
  $props->Subject = 'tlc';
}
?>
brana 17-Nov-2003 05:17
How to send email via MAPI (works with Windows NT4, apache launched as a service)

<?php
#New MAPI session...
$session = new COM("MAPI.Session");

#Login
$strProfileInfo = "exchange_server" . chr(10) . "exchange_user";
$session->Logon("", "", 0, 1, 0, 1, $strProfileInfo);

# New message...
$msg = $session->Outbox->Messages->Add();
$msg->Subject = "Subject";
$msg->Text = "body";

#set recipients...
$rcpts = $msg->Recipients;
$rcpts->AddMultiple("toto@toto.com", 1);   #To...
$rcpts->AddMultiple("titi@titi.com", 2);   #Cc...
$rcpts->AddMultiple("tutu@tutu.com", 3);   #Bcc...

# Resolve senders
$rcpts->Resolve();

#Send message
$msg->Send();

#Logoff
$session->Logoff();

#Cleanup
if($msg!=null) {
    $msg->Release();
    $msg = null;
}
if($session!=null) {
    $session->Release();
    $session = null;
}
?>

ps : NT account launching the service and exchange user must match !
php at dictim dot com 06-Sep-2003 01:17
This took me days to work out how to do so I gotta share it:

How to get the word count from a MS Word Document:

<?php
#Instantiate the Word component.

$word = new COM("word.application") or die("Unable to instantiate Word");

$word->Visible = 1;

$word->Documents->Open("c:/anydocument.doc");
$temp = $word->Dialogs->Item(228);
$temp->Execute();
$numwords = $temp->Words();

echo $numwords;

$word->Quit();
?>

Note that this is the only way to get the word count accurately:
$word->ActiveDocument->Words->Count;
Will see all carriage returns and punctuation as words so is wildy innaccurate.
tomas dot pacl at atlas dot cz 16-Jun-2003 06:07
Passing parameters by reference in PHP 4.3.2 (and in a future releases of PHP )

In PHP 4.3.2 allow_call_time_pass_reference option is set to "Off" by default and future versions may not support this option any longer.
Some COM functions has by-reference parameters. VARIANT object must be used to call this functions, but it would be passed without an '&' before variable name.

Example:

<?php
$myStringVariant = new VARIANT("over-write me", VT_BSTR);

/* works */
$result = $comobj->DoSomethingTo($myStringVariant );

/* works only with allow_call_time_pass_reference option set to "On" and may not work in a future release of PHP */
$result = $comobj->DoSomethingTo(&$myStringVariant );

/* The value in the variant can be retrieved by: */
$theActualValue = $myStringVariant->value;
?>
php at racinghippo dot co dot uk 22-Mar-2003 05:47
PASSING/RETURNING PARAMETERS BY REFERENCE
=========================================

Some COM functions not only return values through the return value, but also act upon a variable passed to it as a parameter *By Reference*:

RetVal = DoSomethingTo (myVariable)

Simply sticking an '&' in front of myVariable doesn't work - you need to pass it a variant of the correct type, as follows:

  $myStringVariant = new VARIANT("over-write me", VT_BSTR);
  $result = $comobj->DoSomethingTo( &$myStringVariant );

The value in the variant can then be retrieved by:

  $theActualValue = $myStringVariant->value;

Other types of variant can be created as your needs demand - see the preceding section on the VARIANT type.
richard dot quadling at carval dot co dot uk 26-Feb-2003 05:51
With thanks to Harald Radi and Wez Furlong.

Some VBA functions have optional parameters. Sometimes the parameters you want to pass are not consecutive.

e.g.

GoTo What:=wdGoToBookmark, Name="BookMarkName"
GoTo(wdGoToBookmark,,,"BookMarkName)

In PHP, the "blank" parameters need to be empty.

Which is ...

<?php
// Some servers may have an auto timeout, so take as long as you want.
set_time_limit(0);

// Show all errors, warnings and notices whilst developing.
error_reporting(E_ALL);

// Used as a placeholder in certain COM functions where no parameter is required.
$empty = new VARIANT();

// Load the appropriate type library.
com_load_typelib('Word.Application');

// Create an object to use.
$word = new COM('word.application') or die('Unable to load Word');
print "Loaded Word, version {$word->Version}\n";

// Open a new document with bookmarks of YourName and YourAge.
$word->Documents->Open('C:/Unfilled.DOC');

// Fill in the information from the form.
$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourName'); // Note use of wdGoToBookmark, from the typelibrary and the use of $empty.
$word->Selection->TypeText($_GET['YourName']);

$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourAge');
$word->Selection->TypeText($_GET['YourAge']);

// Save it, close word and finish.
$word->Documents[1]->SaveAs("C:/{$_GET['YourName']}.doc");
$word->Quit();
$word->Release();
$word = null;
print "Word closed.\n";
?>

The example document is ...

Hello [Bookmark of YourName], you are [Bookmark of YourAge] years old.

and it would be called ...

word.php?YourName=Richard%20Quadling&YourAge=35

Regards,

Richard.
pchason at juno dot com 11-Dec-2002 11:23
Searched for days on how to set up a multi-column html output grid that didn't use an array when creating an ADODB connection. Couldn't find one so I figured it out myself. Pretty simple. Wish I would have tried it myself sooner. Commented code with database connection is below...

<html>
<body>
<table>
<?php
//create the database connection
$conn = new COM("ADODB.Connection");
$dsn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("mydb.mdb");
$conn->Open($dsn);
//pull the data through SQL string
$rs = $conn->Execute("select clients from web");
$clients = $rs->Fields(1);
//start the multicolumn data output
$i = 0;
$columns = 5;
while (!$rs->EOF){
//if $i equals 0, start a row
if($i == 0){
echo "<tr>";
}
//then start writing the cells in the row, increase $i by one, and move to the next record
echo "<td>" . $clients->value . "</td>";
$i++;
$rs->movenext();
//once $i increments to equal $columns, end the row,
//and start the process over by setting $i to 0
if($i == $columns || $rs->EOF) {
echo "</tr>";
$i = 0;
    }
}
//end multicolumn data output

//close the ADO connections and release resources
$rs->Close();
$conn->Close();
$rs = null;
$conn = null; ?>
</table>
</body>
</html>
tedknightusa at hotmail dot com 26-Sep-2002 09:29
A Notes example:

<?php
$session = new COM "Lotus.NotesSession" );
$session->Initialize($password);

$someDB = "C:\Lotus\Notes\Data\somedb.nsf";
$db = $session->GetDatabase("", $someDB) or die("Cannot get someDB.nsf");
$view = $db->GetView("some_view") or die("Some View not found");

$doc = $view->GetFirstDocument() or die("Unable to get Initial Some Document");

// loop through
while($doc){
  $col_vals = $doc->ColumnValues();
  echo $col_vals[0];
  $doc = $view->GetNextDocument($doc);
}
?>
dwt at myrealbox dot com 27-Aug-2002 03:31
When first writing applications instancing COM objects I always faced the problem of the instanced program not terminating correctly although everything else worked fine. In fact the process had to be killed manually by using the task manager. When experimenting a bit I was able to isolate the cause for this peculiar behaviour to be illustrated by the sample code below:

<?php

//Accessing arrays by retrieving elements via function ArrayName(Index) works, but certainly is neither efficient nor good style
$excel=new COM("Excel.Application");
$excel->sheetsinnewworkbook=1;
$excel->Workbooks->Add();

$book=$excel->Workbooks(1);
$sheet=$book->Worksheets(1);

$sheet->Name="Debug-Test";
$book->saveas("C:\\debug.xls");

$book->Close(false);
unset($sheet);
unset($book);
$excel->Workbooks->Close();
$excel->Quit();
unset($excel);

//Accessing arrays as usual (using the [] operator) works, buts leads to the application not being able to terminate by itself
$excel=new COM("Excel.Application");
$excel->sheetsinnewworkbook=1;
$excel->Workbooks->Add();

$excel->Workbooks[1]->Worksheets[1]->Name="Debug-Test";
$excel->Workbooks[1]->saveas("C:\\debug.xls");

$excel->Workbooks[1]->Close(false);
$excel->Workbooks->Close();
$excel->Quit();
unset($excel);

?>

The sample code performs the same action twice and each time the file is properly created. Yet for some mysterious reason the instanced excel process won't terminate once you've accessed an array the way most programmers (especially those who do a lot of oop in c++) do! Therefore until the PHP developers become aware of this problem we'll have to use the inefficient coding style illustrated in the first example.
madon at cma-it dot com 07-Mar-2002 12:59
I thought this excel chart example could be useful.

Note the use of Excel.application vs Excel.sheet.

<pre>
<?php
    print "Hi";
#Instantiate the spreadsheet component.
#    $ex = new COM("Excel.sheet") or Die ("Did not connect");
$exapp = new COM("Excel.application") or Die ("Did not connect");

#Get the application name and version
print "Application name:{$ex->Application->value}<BR>" ;
print "Loaded version: {$ex->Application->version}<BR>";

$wkb=$exapp->Workbooks->add();
#$wkb = $ex->Application->ActiveWorkbook or Die ("Did not open workbook");
print "we opened workbook<BR>";

$ex->Application->Visible = 1; #Make Excel visible.
print "we made excell visible<BR>";

$sheets = $wkb->Worksheets(1); #Select the sheet
print "selected a sheet<BR>";
$sheets->activate; #Activate it
print "activated sheet<BR>";

#This is a new sheet
$sheets2 = $wkb->Worksheets->add(); #Add a sheet
print "added a new sheet<BR>";
$sheets2->activate; #Activate it
print "activated sheet<BR>";

$sheets2->name="Report Second page";

$sheets->name="Report First page";
print "We set a name to the sheet: $sheets->name<BR>";

# fills a columns
$maxi=20;
for ($i=1;$i<$maxi;$i++) {
    $cell = $sheets->Cells($i,5) ; #Select the cell (Row Column number)
    $cell->activate; #Activate the cell
    $cell->value = $i*$i; #Change it to 15000
}

$ch = $sheets->chartobjects->add(50, 40, 400, 100); # make a chartobject

$chartje = $ch->chart; # place a chart in the chart object
$chartje->activate; #activate chartobject
$chartje->ChartType=63;
$selected = $sheets->range("E1:E$maxi"); # set the data the chart uses
$chartje->setsourcedata($selected); # set the data the chart uses
print "set the data the chart uses <BR>";

$file_name="D:/apache/Apache/htdocs/alm/tmp/final14.xls";
if (file_exists($file_name)) {unlink($file_name);}
#$ex->Application->ActiveWorkbook->SaveAs($file_name); # saves sheet as final.xls
$wkb->SaveAs($file_name); # saves sheet as final.xls
print "saved<BR>";

#$ex->Application->ActiveWorkbook->Close("False");
$exapp->Quit();
unset($exapp);
?>

</pre>

Alex Madon


Génère un identifiant unique global (GUID)

  • « Fonctions COM et .Net (Windows)
  • com_event_sink »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Génère un identifiant unique global (GUID)

com_create_guid

(PHP 5, PHP 7, PHP 8)

com_create_guid — Génère un identifiant unique global (GUID)

Description

com_create_guid ( ) : string|false

Génère un identifiant unique global (GUID).

Un GUID est généré de la même façon que DCE UUID, excepté le fait que la convention Microsoft inclut le GUID dans une parenthèse.

Valeurs de retour

Retourne le GUID, sous la forme d'une chaîne de caractères, ou false si une erreur survient.

Voir aussi

  • uuid_create() dans l'extension PECL uuid

User Contributed Notes

internmail (at the google mail).com 22-Jan-2020 02:26
function create_guid() { // Create GUID (Globally Unique Identifier)
        $guid = '';
        $namespace = rand(11111, 99999);
        $uid = uniqid('', true);
        $data = $namespace;
        $data .= $_SERVER['REQUEST_TIME'];
        $data .= $_SERVER['HTTP_USER_AGENT'];
        $data .= $_SERVER['REMOTE_ADDR'];
        $data .= $_SERVER['REMOTE_PORT'];
        $hash = strtoupper(hash('ripemd128', $uid . $guid . md5($data)));
        $guid = substr($hash,  0,  8) . '-' .
                substr($hash,  8,  4) . '-' .
                substr($hash, 12,  4) . '-' .
                substr($hash, 16,  4) . '-' .
                substr($hash, 20, 12);
        return $guid;
    }
rogervila dot es 10-Sep-2019 02:16
I implemented a com_create_guid implementation for systems that do not support it as a Composer package in order to keep it separated from my applications

https://github.com/rogervila/com_create_guid
Dave Pearson (dave at pds-uk dot com) 14-Apr-2016 10:07
Here's my final version of a GUIDv4 function (based on others work here) that should work on all platforms and gracefully fallback to less cryptographically secure version if others are not supported...

<?php
/**
 * Returns a GUIDv4 string
 *
 * Uses the best cryptographically secure method
 * for all supported pltforms with fallback to an older,
 * less secure version.
 *
 * @param bool $trim
 * @return string
 */
function GUIDv4 ($trim = true)
{
    // Windows
    if (function_exists('com_create_guid') === true) {
        if ($trim === true)
            return trim(com_create_guid(), '{}');
        else
            return com_create_guid();
    }

    // OSX/Linux
    if (function_exists('openssl_random_pseudo_bytes') === true) {
        $data = openssl_random_pseudo_bytes(16);
        $data[6] = chr(ord($data[6]) & 0x0f | 0x40);    // set version to 0100
        $data[8] = chr(ord($data[8]) & 0x3f | 0x80);    // set bits 6-7 to 10
        return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
    }

    // Fallback (PHP 4.2+)
    mt_srand((double)microtime() * 10000);
    $charid = strtolower(md5(uniqid(rand(), true)));
    $hyphen = chr(45);                  // "-"
    $lbrace = $trim ? "" : chr(123);    // "{"
    $rbrace = $trim ? "" : chr(125);    // "}"
    $guidv4 = $lbrace.
              substr($charid,  0,  8).$hyphen.
              substr($charid,  8,  4).$hyphen.
              substr($charid, 12,  4).$hyphen.
              substr($charid, 16,  4).$hyphen.
              substr($charid, 20, 12).
              $rbrace;
    return $guidv4;
}
?>
indrora 08-Nov-2015 07:09
If you're going to generate random UUIDs, at least make them conform:

* The uppermost byte of the third stanza must be 4
* the uppermost byte of the fourth stanza may be any of (8 9 a b)

see also: The wikipedia page for UUIDs: https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29
pavel.volyntsev(at)gmail 27-Aug-2015 12:37
Use more cryptographically strong algorithm to generate pseudo-random bytes and format it as GUID v4 string

function guidv4()
{
    if (function_exists('com_create_guid') === true)
        return trim(com_create_guid(), '{}');

    $data = openssl_random_pseudo_bytes(16);
    $data[6] = chr(ord($data[6]) & 0x0f | 0x40); // set version to 0100
    $data[8] = chr(ord($data[8]) & 0x3f | 0x80); // set bits 6-7 to 10
    return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
Alix Axel 16-Aug-2010 03:59
The phunction PHP framework (http://sourceforge.net/projects/phunction/) uses the following function to generate valid version 4 UUIDs:

<?php

function GUID()
{
    if (function_exists('com_create_guid') === true)
    {
        return trim(com_create_guid(), '{}');
    }

    return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
}

?>

The output generated by the sprintf() and mt_rand() calls is identical to com_create_guid() results.


Connecte des événements d'un objet COM sur un objet PHP

  • « com_create_guid
  • com_get_active_object »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Connecte des événements d'un objet COM sur un objet PHP

com_event_sink

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

com_event_sink — Connecte des événements d'un objet COM sur un objet PHP

Description

com_event_sink ( variant $variant , object $sink_object , array|string|null $sink_interface = null ) : bool

Connecte des événements de l'objet COM variant sur un l'objet PHP sink_object.

Soyez prudent sur l'utilisation de cette fonctionnalité ; si vous faites quelque chose de similaire à l'exemple ci-dessous, cela n'a pas de sens de le lancer sur un serveur Web.

Liste de paramètres

variant

sink_object

sink_object devra être une instance de la classe avec des noms de méthodes suivant le dispinterface désiré ; vous devriez utiliser com_print_typeinfo() pour l'aide à la génération d'un gabarit de classe pour cela.

sink_interface

PHP devrait être capable d'utiliser le type par défaut de dispinterface spécifié par la Typelib associée avec l'objet variant, mais vous pouvez changer cela en spécifiant dans le paramètre sink_interface le dispinterface que vous souhaitez utiliser.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | sink_interface is nullable now.

Exemples

Exemple #1 Exemple de connexions d'événements COM

<?php
class IEEventSinker {
    var $terminated = false;

   function ProgressChange($progress, $progressmax) {
      echo "Progression du téléchargement : $progress / $progressmax\n";
    }

    function DocumentComplete(&$dom, $url) {
      echo "Document $url terminé\n";
    }

    function OnQuit() {
      echo "Quit!\n";
      $this->terminated = true;
    }
}
$ie = new COM("InternetExplorer.Application");
$sink = new IEEventSinker();
com_event_sink($ie, $sink, "DWebBrowserEvents2");
$ie->Visible = true;
$ie->Navigate("http://www.example.org");
while(!$sink->terminated) {
  com_message_pump(4000);
}
$ie = null;
?>

Notes

Attention

Antérieur à PHP 8.0.0, Prior to PHP 8.0.0, appeller exit() depuis n'importe quel gestionnaire d'événement n'est pas supporté, et peut causer PHP à planter. Ceci peut être contourné en lançant une exception depuis un gestionnaire d'événement, attrapant l'exception dans le code principal, et appeller exit() là.

Voir aussi

  • com_print_typeinfo() - Affiche une définition de classe PHP pour une interface répartissable
  • com_message_pump() - Traite un message COM dans un délai donné

User Contributed Notes

veggie 25-Dec-2016 10:23
I got voice recognition working. I'm not sure why the way I called the sink function made it work but I'm more about results right now. This small example had me rolling on the floor laughing.

<?php
/*
 * Search this for more info on the voice stuff:
 * Automation Interfaces and Objects (SAPI 5.4)
 */

//directions:
//php friend.php
//then fire up windows voice recognition and turn it on and say stuff

$voice = new COM("SAPI.SpVoice");

print "Hit control+c to end.\n";
print "Friend: Hello friend!\n";

$voice->Speak("Hello friend!");

class listen
{

    function Recognition($StreamNumber, $StreamPosition, $RecognitionType, $ISpeechRecoResult)
    {

        $phrase = $ISpeechRecoResult->PhraseInfo;
        $text = $phrase->GetText();

        print "\nYou:$text\n";

        global $voice;
        $say = array('oh', 'nice', 'humm', 'interesting', 'you dont say', 'uh huh', 'right', 'what', 'ha ha', 'you have got to be joking', 'right back at you buddy');
        $idx = rand(0, count($say)-1);

        print "Friend: " . $say[$idx] . "\n";
        $voice->Speak($say[$idx]);

    }

}

$recog = new COM("SAPI.SpSharedRecognizer");

$context = $recog->CreateRecoContext();

//SRERecognition = 16 (default)
//SREAllEvents = 393215
//$context->EventInterests = 393215;

//try to listen to events on context
$listen = new listen(); //event handler
if (!com_event_sink($context, $listen, "RecognizerStateChange"))
{
    print "Unable to sink events\n";
    exit;
}

$grammar = $context->CreateGrammar();

$i = $grammar->DictationLoad();

$s = $grammar->DictationSetState(1); //1=on, 0=off

while(true)
{

    if(!com_message_pump(1000))
    {
        print ".";
    }

}

?>
fjortiz 14-Jul-2005 12:33
In case someone needs a skeleton sink for ADODB.Connection events:

class ADOConnectionEventSink    {

    function BeginTransComplete( $translevel, $objerror, $status, $objconn )    {
        return 0;
    }

    function CommitTransComplete( $objerror, $status, $objconn )    {
        return 0;
    }

    function RolbackTransComplete( $objerror, $status, $objconn )    {
        return 0;
    }

    function WillConnect ( $ConnectionString, $userid, $psword, $options, $status, $objconn )    {
        return 0;
    }

    function ConnectComplete ( $objerror, $status, $objconn)    {
        return 0;
    }

    function Disconnect( $status, $objConn )    {
        return 0;
    }

    function WillExecute ( $src, $cursortyp, $locktyp, $options, $status, $objcomm, $objrs, $objconn )    {
        return 0;
    }

    function ExecuteComplete ( $recaffected, $objerror, $status, $objcomm, $objrs, $objconn )    {
        return 0;
    }

    function InfoMessage ( $objerror, $status, $objconn)    {
        return 0;
    }
}

// later on...
$db = new COM("ADODB.Connection", NULL, $charPage);
$sink = new ADOConnectionEventSink();
com_event_sink($db, $sink, "ConnectionEvents");
//...


Retourne un objet représentant l'instance actuelle d'un objet COM

  • « com_event_sink
  • com_load_typelib »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Retourne un objet représentant l'instance actuelle d'un objet COM

com_get_active_object

(PHP 5, PHP 7, PHP 8)

com_get_active_object — Retourne un objet représentant l'instance actuelle d'un objet COM

Description

com_get_active_object ( string $prog_id , int|null $codepage = null ) : variant

com_get_active_object() est similaire à la création d'une nouvelle instance comd'un objet COM, excepté qu'elle ne retournera un objet à votre script uniquement si l'objet est actuellement instancié. Les applications OLE utilisent quelque chose de connu en tant que "Running Object Table" qui permet aux applications connues d'être exécutées juste une fois ; cette fonction expose la fonction GetActiveObject() de la bibliothèque COM pour récupérer un objet d'une instance en cours d'utilisation.

Liste de paramètres

prog_id

Le paramètre prog_id doit être soit le ProgID, soit le CLSID de l'objet dont vous voulez avoir l'accès (par exemple, Word.Application).

codepage

utilise les mêmes règles que dans la com classe.

Valeurs de retour

Si l'objet demandé est en cours d'exécution, la fonction retournera à votre script ce que toute autre objet COM retournerait.

Erreurs / Exceptions

Il y a beaucoup de raisons pour lesquelles cette fonction peut échouer. Dans cette situation, le code erreur de l'exception devrait être MK_E_UNAVAILABLE ; vous pouvez utiliser la méthode getCode de l'objet exception pour vérifier le code de l'exception.

Historique

Version | Description
8.0.0 | codepage est désormais nullable.

Notes

Avertissement

Utiliser la fonction com_get_active_object() sur un serveur web n'est pas toujours la meilleure idée. La plupart des applications COM/OLE ne sont pas faites pour gérer plus d'un client en concurrence, comme (et surtout !!) Microsoft Office. Vous devriez lire les » considérations pour les automatismes coté serveur pour Office pour plus d'informations sur les comportements généraux.

User Contributed Notes

gerrit at timingteam dot nl 04-Jan-2009 09:25
Please note the next behavior (Apache 2.2.8, W2K, WXP)

If Apache runs as a service, com_get_active_object() always returns MK_E_UNAVAILABLE, even when it is definitely sure that the Running Object Table contains a reference to the required object.

If Apache runs in a console, com_get_active_object()  returns the object handle as required.

This apparently is a Windows issue.


Charge un Typelib

  • « com_get_active_object
  • com_message_pump »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Charge un Typelib

com_load_typelib

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

com_load_typelib — Charge un Typelib

Description

com_load_typelib ( string $typelib , bool $case_insensitive = true ) : bool

Charge un Typelib et enregistre son contenu dans le moteur, comme s'ils avaient été définis en utilisant define().

Notez qu'il est plus efficace d'utiliser l'option de configuration pour précharger et enregistrer les constantes, même si cela est moins flexible.

Si vous devez activer , alors PHP essayera d'enregistrer automatiquement les constantes associées à l'objet COM lorsque vous créerez l'objet. Cela dépendra de l'interface fournie par l'objet COM lui-même et ne sera pas toujours possible.

Liste de paramètres

typelib

typelib peut être une des valeurs suivantes :

  • Le nom d'un fichier .tlb ou le module exécutable contenant le Typelib.

  • Le GUID du Typelib, suivi du numéro de version ; par exemple {00000200-0000-0010-8000-00AA006D2EA4},2,0.

  • Le nom du Typelib, e.g Microsoft OLE DB ActiveX Data Objects 1.0 Library.

PHP va essayer de résoudre le Typelib dans cet ordre, et le processus prendra de plus en plus de ressources pour arriver à la fin de la liste ; la recherche du Typelib par son nom est manipulée physiquement en énumérant le registre jusqu'à ce qu'un résultat y soit trouvé.

case_insensitive

Le paramètre case_insensitive se comporte à l'inverse du paramètre $case_insensitive de la fonction define().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

User Contributed Notes

tomas dot burba at softneta dot lt 12-Mar-2012 11:38
I had some problems with a third-party Word-controlling code that is somewhat similar to Richard's example. (Word 2007 SP1, XP SP2.) Rewrote some parts according to that example, no luck. Error messages from Word were crazy:

"Bad parameter" -- it didn't like wdGoToBookmark but was ok with its numeric equivalent -1;

"Call to undefined method variant::SaveAs()" -- the same with Save() that was suitable in my case, so no options were remaining.

But then I ran the example via php.exe in the command line, and it worked! Eventually it turned out that Apache service must be run as some real user instead of SYSTEM.
RQuadling at GMail dot com 17-Jun-2008 03:40
Some libraries load other libraries as part of their functionality. For example Crystal Reports Object Factory uses the CreateObject() method to create an instance of a Crystal Design RunTime Application. If you want to use constants defined in the newly loaded library, you will need to manually register the library - even with com.autoregister_typelib set to true.

<?php
echo 'com.autoregister_typelib = ', ini_get('com.autoregister_typelib'), PHP_EOL;

$o_CrObjectFactory = New COM('CrystalReports11.ObjectFactory.1');

$o_CrApplication = $o_CrObjectFactory->CreateObject("CrystalDesignRunTime.Application");

echo 'Will not be defined : ', crOpenReportByDefault, PHP_EOL;

com_load_typelib('CrystalDesignRunTime.Application');

echo 'Will now be defined : ', crOpenReportByDefault, PHP_EOL;
?>

outputs ...

com.autoregister_typelib = 1
Will not be defined :
Notice: Use of undefined constant crOpenReportByDefault - assumed 'crOpenReportByDefault' in C:\refl.php on line 8
crOpenReportByDefault
Will now be defined : 0
03-May-2004 07:18
In case any of you were wondering what com_load_typelib actually DOES, I have found that it loads constants\enums that the COM obeject has defined.  The example below is using the Nero COM object (from Nero Burning rom, version 6+).  The Nero object defines a bunch of constants, but they can not be used as PHP constants unless you use the mentioned function.  So the example below will work just fine:

<?php
$aNero = new COM("Nero.Nero") or die ("Nero didn't load, too bad");
com_load_typelib("Nero.Nero");
$aNero->GetDrives(NERO_MEDIA_CD);
?>

But this one will not, since PHP will return a message saying that the constant is undefined:

<?php
$aNero = new COM("Nero.Nero") or die ("Nero didn't load, too bad");
$aNero->GetDrives(NERO_MEDIA_CD);
?>

This one took me a while to figure out, hope it helps.

Also, check out http://www.php.net/manual/en/faq.com.php to find out how to get COM events working in PHP.
ojpp at webdevfm dot com 30-Jan-2004 06:33
Hello PHP community, I want to help in a problem I found in this COM built-in function: com_load_typelib(), when I executed it in order to open a COM Server process (for example: Word, Excel, etc.) I was in trouble to release the object from memory, I figured it out, this is the solution:

Change a configuration in the php.ini:

; autoregister constants of a components typlib on com_load()
com.autoregister_typelib = true

When com.autoregister_typelib directive is true, PHP parser manage the COM server type library, I hope it helps.
richard dot quadling at carval dot co dot uk 26-Feb-2003 05:55
<?php
// Some servers may have an auto timeout, so take as long as you want.
set_time_limit(0);

// Show all errors, warnings and notices whilst developing.
error_reporting(E_ALL);

// Used as a placeholder in certain COM functions where no parameter is required.
$empty = new VARIANT();

// Load the appropriate type library.
com_load_typelib('Word.Application');

// Create an object to use.
$word = new COM('word.application') or die('Unable to load Word');
print "Loaded Word, version {$word->Version}\n";

// Open a new document with bookmarks of YourName and YourAge.
$word->Documents->Open('C:/Unfilled.DOC');

// Fill in the information from the form.
$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourName'); // Note use of wdGoToBookmark, from the typelibrary and the use of $empty.
$word->Selection->TypeText($_GET['YourName']);

$word->Selection->GoTo(wdGoToBookmark,$empty,$empty,'YourAge');
$word->Selection->TypeText($_GET['YourAge']);

// Save it, close word and finish.
$word->Documents[1]->SaveAs("C:/{$_GET['YourName']}.doc");
$word->Quit();
$word->Release();
$word = null;
print "Word closed.\n";
?>

The example document is ...

Hello [Bookmark of YourName], you are [Bookmark of YourAge] years old.

and it would be called ...

word.php?YourName=Richard%20Quadling&YourAge=35

Regards,

Richard.


Traite un message COM dans un délai donné

  • « com_load_typelib
  • com_print_typeinfo »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Traite un message COM dans un délai donné

com_message_pump

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

com_message_pump — Traite un message COM dans un délai donné

Description

com_message_pump ( int $timeout_milliseconds = 0 ) : bool

Traite un message COM en attendant jusqu'à timeout_milliseconds millisecondes, ou bien en attendant qu'un message arrive dans la file d'attente.

Le but de cette fonction est d'acheminer les appels COM entre les éléments et de gérer les différentes synchronisations. Cela permet à votre script d'attendre efficacement les événements à déclencher, tout en gérant d'autres événements ou bien d'exécuter d'autres scripts en arrière-plan. Vous devriez l'utiliser dan une boucle, comme dans l'exemple de la fonction com_event_sink(), jusqu'à ce que vous ayez fini d'utiliser les objets COM liés à des événements.

Liste de paramètres

timeout_milliseconds

Le délai, en millisecondes.

Si vous ne spécifiez pas de valeur pour le paramètre timeout_milliseconds, alors il voudra 0. Une valeur à 0 signifie que les messages seront traités immédiatement ; s'il y a des messages dans la file d'attente, ils seront distribués aussitôt ; s'il n'y a aucun message dans la file d'attente, la fonction retournera false immédiatement sans attendre.

Valeurs de retour

Si un ou plusieurs messages arrivent avant le délai d'expiration, ils seront distribués et la fonction retournera true. Si le délai d'expiration survient et qu'aucun message n'est traité, la valeur retournée sera false.

User Contributed Notes

There are no user contributed notes for this page.


Affiche une définition de classe PHP pour une interface répartissable

  • « com_message_pump
  • variant_abs »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Affiche une définition de classe PHP pour une interface répartissable

com_print_typeinfo

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

com_print_typeinfo — Affiche une définition de classe PHP pour une interface répartissable

Description

com_print_typeinfo ( variant|string $variant , string|null $dispatch_interface = null , bool $display_sink = false ) : bool

Aide à générer un squelette de classe pour l'utiliser comme évier d'événement. Vous pouvez également l'utiliser pour générer une sauvegarde de n'importe quel objet COM, à condition qu'il supporte assez d'interfaces d'introspection et que vous connaissiez le nom de l'interface que vous désirez afficher.

Liste de paramètres

variant

variant doit être soit une instance d'un objet COM, soit le nom d'une bibliothèque type (qui doit être résolu en accord des règles définies dans la fonction com_load_typelib()).

dispatch_interface

Le nom d'une interface descendante IDispatch que vous souhaitez afficher.

display_sink

Si le paramètre wantsink vaut true, l'interface d'évier correspondante sera affichée à la place.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • com_event_sink() - Connecte des événements d'un objet COM sur un objet PHP
  • com_load_typelib() - Charge un Typelib

User Contributed Notes

Richard Lynch 03-Oct-2006 04:51
In my particular version of PHP, the second and third arguments are not, in fact, optional.

Passing in '' for both, however, yielded a bucketful of information.

YMMV
csaba at alum dot mit dot edu 14-Feb-2005 12:49
com_print_typeinfo is really useful if you're trying to figure out what properties and methods you have access to.  For example, I might do:

<?php
    $oExplorer = new COM("Shell.Application");
    com_print_typeinfo($oExplorer);
?>

The first line shows me the class of the object (what VBScript calls 'typename'), in my case IShellDispatch4.  It's frequently the case that if you plunk that in as the second argument to com_print_typeinfo, you get way more methods/properties coming back.  Thus:

<?php
    $oExplorer = new COM("Shell.Application");
    com_print_typeinfo($oExplorer, "IShellDispatch4");
?>

Furthermore, you might get additional functions listed if you try lower number suffixes (or not).  At any rate, it would be useful for PHP to have a typename function like VBScript does.  For example, if you iterate through the Windows of $oExplorer you get both IE and Explorer windows and typename is the easy way to differentiate between them.  Here's what I'm using:

<?php
    function typeName($objCOM) {
    if (empty($objCOM)) return "no COM object";
    if (gettype($objCOM)!="object") return "not a COM object";
    ob_start();
    com_print_typeinfo($objCOM);
    $typeInfo = ob_get_contents();
    ob_end_clean();
    $pattern = "/^\\s*class (.*) \\{/";
    if (!($matchCnt = preg_match($pattern, $typeInfo, $aMatch))) return "Not found";
    return $aMatch[1];
}
?>

Csaba Gabor from Vienna


Retourne la valeur absolue d'un variant

  • « com_print_typeinfo
  • variant_add »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Retourne la valeur absolue d'un variant

variant_abs

(PHP 5, PHP 7, PHP 8)

variant_abs — Retourne la valeur absolue d'un variant

Description

variant_abs ( mixed $value ) : variant

Retourne la valeur absolue d'un variant.

Liste de paramètres

value

Le variant.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Retourne la valeur absolue de value.

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • abs() - Valeur absolue

User Contributed Notes

There are no user contributed notes for this page.


"Ajoute" deux valeurs de variants et retourne le résultat

  • « variant_abs
  • variant_and »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • "Ajoute" deux valeurs de variants et retourne le résultat

variant_add

(PHP 5, PHP 7, PHP 8)

variant_add — "Ajoute" deux valeurs de variants et retourne le résultat

Description

variant_add ( mixed $left , mixed $right ) : variant

Ajoute left à right selon les règles suivantes (prises de la bibliothèque MSDN), qui correspondent à celles de Visual Basic :

Règle d'ajout des variants
Si | Alors
Les deux expressions sont des chaînes | Concaténation
Une expression est de type chaîne et l'autre est un caractère | Addition
Une expression est numérique est l'autre est une chaîne | Addition
Les deux expressions sont numériques | Addition
Une expression est NULL | NULL est retourné
Les deux expressions sont vides | Le sous-type entier est retourné

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Retourne le résultat.

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • variant_sub() - Soustrait la valeur du variant de droite de la valeur de celui de gauche

User Contributed Notes

There are no user contributed notes for this page.


Effectue un ET entre deux variants et retourne le résultat

  • « variant_add
  • variant_cast »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Effectue un ET entre deux variants et retourne le résultat

variant_and

(PHP 5, PHP 7, PHP 8)

variant_and — Effectue un ET entre deux variants et retourne le résultat

Description

variant_and ( mixed $left , mixed $right ) : variant

Effectue un ET sur les bits, selon la table de vérité suivante ; notez que cela est différent du ET normal.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Règles du ET variant
Si left est | Si right est | alors le résultat est
true | true | true
true | false | false
true | null | null
false | true | false
false | false | false
false | null | false
null | true | null
null | false | false
null | null | null

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • variant_or() - Performe une disjonction logique sur deux variants

User Contributed Notes

There are no user contributed notes for this page.


Convertit un variant en un nouvel objet variant de type différent

  • « variant_and
  • variant_cat »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Convertit un variant en un nouvel objet variant de type différent

variant_cast

(PHP 5, PHP 7, PHP 8)

variant_cast — Convertit un variant en un nouvel objet variant de type différent

Description

variant_cast ( variant $variant , int $type ) : variant

Cette fonction crée une copie de variant et effectue alors un transtypage pour forcer la copie à avoir le type donné par type.

Cette fonction est en fait la fonction VariantChangeType() de la bibliothèque COM ; consultez MSDN pour plus d'informations.

Liste de paramètres

variant

Le variant.

type

type doit être un type parmi les constantes VT_XXX.

Valeurs de retour

Retourne un variant du type fourni.

Voir aussi

  • variant_set_type() - Convertit un variant en un autre type "sur-place"

User Contributed Notes

There are no user contributed notes for this page.


Assemble deux valeurs variantes ensemble et retourne le résultat

  • « variant_cast
  • variant_cmp »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Assemble deux valeurs variantes ensemble et retourne le résultat

variant_cat

(PHP 5, PHP 7, PHP 8)

variant_cat — Assemble deux valeurs variantes ensemble et retourne le résultat

Description

variant_cat ( mixed $left , mixed $right ) : variant

Assemble left avec right et retourne le résultat.

Cette fonction est équivalente à $left . $right.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Retourne le résultat de la concaténation.

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • Opérateurs de chaînes pour l'opérateur de concaténation

User Contributed Notes

There are no user contributed notes for this page.


Compare deux variants

  • « variant_cat
  • variant_date_from_timestamp »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Compare deux variants

variant_cmp

(PHP 5, PHP 7, PHP 8)

variant_cmp — Compare deux variants

Description

variant_cmp ( mixed $left , mixed $right , int $locale_id = LOCALE_SYSTEM_DEFAULT , int $flags = 0 ) : int

Compare left avec right.

Cette fonction ne comparera que des valeurs scalaires, pas de tableaux ni d'enregistrements variants.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

locale_id

Locale Identifier valide à utiliser lors des comparaisons des chaînes (cela affecte la collation de la chaîne).

flags

flags peut être une ou plusieurs des valeurs suivantes, jointes avec des OR, et affecte les comparaisons de chaînes :

Options de comparaison Variant
Valeur | Signification
NORM_IGNORECASE | Compare avec sensibilité à la casse
NORM_IGNORENONSPACE | Ignore les caractères non-espaçants
NORM_IGNORESYMBOLS | Ignore les symboles
NORM_IGNOREWIDTH | Ignore la taille de la chaîne
NORM_IGNOREKANATYPE | Ignore le type Kana
NORM_IGNOREKASHIDA | Ignore les caractères arabes kashida

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Retourne une des valeurs suivantes :

Résultats des comparaisons sur variants
Valeur | Signification
VARCMP_LT | left est plus petit que right
VARCMP_EQ | left est égal à right
VARCMP_GT | left est plus grand que right
VARCMP_NULL | left, right ou les deux sont null

User Contributed Notes

There are no user contributed notes for this page.


Retourne une représentation date en variant d'un timestamp Unix

  • « variant_cmp
  • variant_date_to_timestamp »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Retourne une représentation date en variant d'un timestamp Unix

variant_date_from_timestamp

(PHP 5, PHP 7, PHP 8)

variant_date_from_timestamp — Retourne une représentation date en variant d'un timestamp Unix

Description

variant_date_from_timestamp ( int $timestamp ) : variant

Convertit timestamp depuis un timestamp Unix vers le type variant VT_DATE. Cela permet une interopérabilité plus facile des systèmes Unix de PHP et COM.

Liste de paramètres

timestamp

Un timestamp Unix.

Valeurs de retour

Retourne un variant VT_DATE.

Voir aussi

  • variant_date_to_timestamp() - Convertit une valeur date/temps variante en un timestamp Unix
  • mktime() - Retourne le timestamp UNIX d'une date
  • time() - Retourne le timestamp UNIX actuel

User Contributed Notes

There are no user contributed notes for this page.


Convertit une valeur date/temps variante en un timestamp Unix

  • « variant_date_from_timestamp
  • variant_div »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Convertit une valeur date/temps variante en un timestamp Unix

variant_date_to_timestamp

(PHP 5, PHP 7, PHP 8)

variant_date_to_timestamp — Convertit une valeur date/temps variante en un timestamp Unix

Description

variant_date_to_timestamp ( variant $variant ) : int|null

Convertit variant d'une valeur VT_DATE (ou similaire) en un timestamp unix. Cela permet l'interopérabilité facile entre les parties Unix de PHP et COM.

Liste de paramètres

variant

Le variant.

Valeurs de retour

Retourne un timestamp Unix, ou null en cas d'échec.

Voir aussi

  • variant_date_from_timestamp() - Retourne une représentation date en variant d'un timestamp Unix
  • date() - Formate une date/heure locale
  • strftime() - Formate une date/heure locale avec la configuration locale

User Contributed Notes

radek at tetik dot cz 25-Dec-2015 03:21
variant_date_to_timestamp() assumes the COM date in the current Windows time zone and converts it to the current PHP time zone


Retourne le résultat de la division de deux variants

  • « variant_date_to_timestamp
  • variant_eqv »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Retourne le résultat de la division de deux variants

variant_div

(PHP 5, PHP 7, PHP 8)

variant_div — Retourne le résultat de la division de deux variants

Description

variant_div ( mixed $left , mixed $right ) : variant

Divise left par right et retourne le résultat.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Règle de division des variants
Si | Alors
Les deux expressions sont des chaînes, dates, caractères, booléens | Double est retourné
Une expression est une chaîne et l'autre est un caractère | Division et double retournés
Une expression est numérique et l'autre est une chaîne | Division et double retournés
Les deux expressions sont numériques | Division et double retournés
Une des expressions est NULL | NULL est retourné
right est vide et left est tout mais non vide | Une com_exception avec code DISP_E_DIVBYZERO est lancée
left est vide et right est tout mais non vide. | 0 en tant que double est retourné
Les deux expressions sont vides | Une com_exception avec code DISP_E_OVERFLOW est lancée

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • variant_idiv() - Convertit des variants en valeurs entières, et effectue alors une division

User Contributed Notes

There are no user contributed notes for this page.


Effectue une équivalence de bits de deux variants

  • « variant_div
  • variant_fix »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Effectue une équivalence de bits de deux variants

variant_eqv

(PHP 5, PHP 7, PHP 8)

variant_eqv — Effectue une équivalence de bits de deux variants

Description

variant_eqv ( mixed $left , mixed $right ) : variant

Effectue une équivalence de bits de deux variants.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Si chaque bit dans left est égal au bit correspondant dans right alors la fonction retourne true, sinon elle retourne false.

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

User Contributed Notes

There are no user contributed notes for this page.


Récupère la portion entière d'un variant

  • « variant_eqv
  • variant_get_type »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Récupère la portion entière d'un variant

variant_fix

(PHP 5, PHP 7, PHP 8)

variant_fix — Récupère la portion entière d'un variant

Description

variant_fix ( mixed $value ) : variant

Récupère la portion entière d'un variant.

Liste de paramètres

value

Le variant.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Si value est négatif, le premier entier négatif plus grand ou égal au variant est retourné, sinon cette fonction retourne la portion entière de la valeur de value.

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Notes

Avertissement

Cette documentation est basée sur la documentation MSDN ; il apparaît que cette fonction est la même que variant_int(), ou alors, il y a une erreur dans la documentation de MSDN.

Voir aussi

  • variant_int() - Retourne la partie entière d'un variant
  • variant_round() - Arrondit le variant au nombre spécifié de décimales
  • floor() - Arrondit à l'entier inférieur
  • ceil() - Arrondit au nombre supérieur
  • round() - Arrondit un nombre à virgule flottante

User Contributed Notes

There are no user contributed notes for this page.


Retourne le type d'un objet variant

  • « variant_fix
  • variant_idiv »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Retourne le type d'un objet variant

variant_get_type

(PHP 5, PHP 7, PHP 8)

variant_get_type — Retourne le type d'un objet variant

Description

variant_get_type ( variant $variant ) : int

Retourne le type d'un objet variant.

Liste de paramètres

variant

L'objet variant.

Valeurs de retour

Retourne une valeur entière qui indique le type de variant, qui peut être une instance de com, dotnet ou de variant. La valeur de retour peut être comparée à l'une des constantes VT_XXX.

La valeur de retour pour les objets COM et DOTNET sera la plupart du temps VT_DISPATCH ; la seule raison qui fait que cette fonction marche avec ces classes est que COM et DOTNET sont des descendants de VARIANT.

Voir aussi

  • variant_set_type() - Convertit un variant en un autre type "sur-place"

User Contributed Notes

There are no user contributed notes for this page.


Convertit des variants en valeurs entières, et effectue alors une division

  • « variant_get_type
  • variant_imp »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Convertit des variants en valeurs entières, et effectue alors une division

variant_idiv

(PHP 5, PHP 7, PHP 8)

variant_idiv — Convertit des variants en valeurs entières, et effectue alors une division

Description

variant_idiv ( mixed $left , mixed $right ) : variant

Convertit left et right en valeurs entières, et effectue alors une division entière.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Règles de divisions internes des variants
Si | Alors
Les deux expressions sont des chaînes, dates, caractères, booléens | Division et entier retournés
Une expression est une chaîne et l'autre est un caractère | Division
Une expression est numérique et l'autre est une chaîne | Division
Les deux expressions sont numériques | Division
Une des expressions est NULL | NULL est retourné
Les deux expressions sont vides | Une com_exception avec code DISP_E_DIVBYZERO est lancée

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • variant_div() - Retourne le résultat de la division de deux variants

User Contributed Notes

There are no user contributed notes for this page.


Exécute une implication sur les bits de deux variants

  • « variant_idiv
  • variant_int »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Exécute une implication sur les bits de deux variants

variant_imp

(PHP 5, PHP 7, PHP 8)

variant_imp — Exécute une implication sur les bits de deux variants

Description

variant_imp ( mixed $left , mixed $right ) : variant

Exécute une implication sur les bits de deux variants.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Table d'implication des variants
Si left est | Si right est | alors le résultat est
true | true | true
true | false | false
true | null | true
false | true | true
false | false | true
false | null | true
null | true | true
null | false | null
null | null | null

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

User Contributed Notes

There are no user contributed notes for this page.


Retourne la partie entière d'un variant

  • « variant_imp
  • variant_mod »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Retourne la partie entière d'un variant

variant_int

(PHP 5, PHP 7, PHP 8)

variant_int — Retourne la partie entière d'un variant

Description

variant_int ( mixed $value ) : variant

Récupère la partie entière d'un variant.

Liste de paramètres

value

Le variant.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Si value est négatif, le premier entier négatif supérieur ou égal à ce variant est retourné, sinon cette fonction retourne la partie entière de la valeur de value.

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • variant_fix() - Récupère la portion entière d'un variant
  • variant_round() - Arrondit le variant au nombre spécifié de décimales
  • floor() - Arrondit à l'entier inférieur
  • ceil() - Arrondit au nombre supérieur
  • round() - Arrondit un nombre à virgule flottante

User Contributed Notes

There are no user contributed notes for this page.


Divise deux variantes et retourne le reste

  • « variant_int
  • variant_mul »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Divise deux variantes et retourne le reste

variant_mod

(PHP 5, PHP 7, PHP 8)

variant_mod — Divise deux variantes et retourne le reste

Description

variant_mod ( mixed $left , mixed $right ) : variant

Divise left par right et retourne le reste.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Retourne le reste de la division.

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • variant_div() - Retourne le résultat de la division de deux variants
  • variant_idiv() - Convertit des variants en valeurs entières, et effectue alors une division

User Contributed Notes

There are no user contributed notes for this page.


Multiplie les valeurs de deux variants

  • « variant_mod
  • variant_neg »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Multiplie les valeurs de deux variants

variant_mul

(PHP 5, PHP 7, PHP 8)

variant_mul — Multiplie les valeurs de deux variants

Description

variant_mul ( mixed $left , mixed $right ) : variant

Multiplie left par right.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Les valeurs booléennes sont converties en -1 pour false et en 0 pour true

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Règles de multiplication des variants
Si | Alors
Les deux expressions sont du type chaîne, date, caractère ou booléen | Multiplication
Une expression est une chaîne et l'autre est un caractère | Multiplication
Une expression est numérique et l'autre est une chaîne | Multiplication
Les deux expressions sont numériques | Multiplication
Une des expressions est NULL | NULL est retourné
Les deux expressions sont vides | Une chaîne vide est retournée

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • variant_div() - Retourne le résultat de la division de deux variants
  • variant_idiv() - Convertit des variants en valeurs entières, et effectue alors une division

User Contributed Notes

There are no user contributed notes for this page.


Effectue une négation logique sur un variant

  • « variant_mul
  • variant_not »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Effectue une négation logique sur un variant

variant_neg

(PHP 5, PHP 7, PHP 8)

variant_neg — Effectue une négation logique sur un variant

Description

variant_neg ( mixed $value ) : variant

Effectue une négation logique sur value.

Liste de paramètres

value

Le variant.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Retourne le résultat de la négation logique.

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

User Contributed Notes

There are no user contributed notes for this page.


Exécute une négation sur les bits sur un variant

  • « variant_neg
  • variant_or »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Exécute une négation sur les bits sur un variant

variant_not

(PHP 5, PHP 7, PHP 8)

variant_not — Exécute une négation sur les bits sur un variant

Description

variant_not ( mixed $value ) : variant

Exécute une négation sur les bits sur le paramètre value et retourne le résultat.

Liste de paramètres

value

Le variant.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Retourne la négation. Si value vaut null, le résultat sera également null.

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

User Contributed Notes

There are no user contributed notes for this page.


Performe une disjonction logique sur deux variants

  • « variant_not
  • variant_pow »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Performe une disjonction logique sur deux variants

variant_or

(PHP 5, PHP 7, PHP 8)

variant_or — Performe une disjonction logique sur deux variants

Description

variant_or ( mixed $left , mixed $right ) : variant

Effectue une opération sur les bits de types OR, selon la table de vérité suivante. Notez que ceci est différent de l'expression OR normale.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Règles du OR Variant
Si left est | Si right est | alors le résultat est
true | true | true
true | false | true
true | null | true
false | true | true
false | false | false
false | null | null
null | true | true
null | false | null
null | null | null

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • variant_and() - Effectue un ET entre deux variants et retourne le résultat
  • variant_xor() - Exécute une exclusion logique sur deux variants

User Contributed Notes

There are no user contributed notes for this page.


Retourne le résultat de la fonction puissance avec deux variants

  • « variant_or
  • variant_round »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Retourne le résultat de la fonction puissance avec deux variants

variant_pow

(PHP 5, PHP 7, PHP 8)

variant_pow — Retourne le résultat de la fonction puissance avec deux variants

Description

variant_pow ( mixed $left , mixed $right ) : variant

Retourne le résultat de left à la puissance right.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Retourne le résultat de left à la puissance right.

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • pow() - Expression exponentielle

User Contributed Notes

There are no user contributed notes for this page.


Arrondit le variant au nombre spécifié de décimales

  • « variant_pow
  • variant_set_type »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Arrondit le variant au nombre spécifié de décimales

variant_round

(PHP 5, PHP 7, PHP 8)

variant_round — Arrondit le variant au nombre spécifié de décimales

Description

variant_round ( mixed $value , int $decimals ) : variant|null

Retourne la valeur de value arrondi à decimals décimales.

Liste de paramètres

value

Le variant.

decimals

Nombre de décimales.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Retourne la valeur arrondie, ou null en cas d'échec.

Voir aussi

  • round() - Arrondit un nombre à virgule flottante

User Contributed Notes

There are no user contributed notes for this page.


Convertit un variant en un autre type "sur-place"

  • « variant_round
  • variant_set »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Convertit un variant en un autre type "sur-place"

variant_set_type

(PHP 5, PHP 7, PHP 8)

variant_set_type — Convertit un variant en un autre type "sur-place"

Description

variant_set_type ( variant $variant , int $type ) : void

Cette fonction est similaire variant_cast() à part que le variant est modifié "sur-place" ; aucun nouveau variant n'est créé. Les paramètres de cette fonction ont la même signification que ceux de variant_cast().

Liste de paramètres

variant

Le variant.

type

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • variant_cast() - Convertit un variant en un nouvel objet variant de type différent
  • variant_get_type() - Retourne le type d'un objet variant

User Contributed Notes

martin at itmission dot com 22-May-2009 10:55
In my application I was using ADODB to retrieve data from Microsoft Access.  During queries, fields defined as "Date/Time" in Access were being returned to PHP as instances of the Variant class.

For some reason, the variant_date_to_timestamp function returned incorrect timestamps.  As a workaround, I used variant_set_type($variant, VT_BSTR) to get a string representation of the date.  This can be used for most variant types PHP doesn't handle.


Assigne une nouvelle valeur pour un objet variant

  • « variant_set_type
  • variant_sub »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Assigne une nouvelle valeur pour un objet variant

variant_set

(PHP 5, PHP 7, PHP 8)

variant_set — Assigne une nouvelle valeur pour un objet variant

Description

variant_set ( variant $variant , mixed $value ) : void

Convertit value en un variant et l'assigne à l'objet variant. Aucun nouvel objet n'est créé et l'ancienne valeur de variant est libérée.

Liste de paramètres

variant

Le variant.

value

Valeurs de retour

Aucune valeur n'est retournée.

User Contributed Notes

There are no user contributed notes for this page.


Soustrait la valeur du variant de droite de la valeur de celui de gauche

  • « variant_set
  • variant_xor »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Soustrait la valeur du variant de droite de la valeur de celui de gauche

variant_sub

(PHP 5, PHP 7, PHP 8)

variant_sub — Soustrait la valeur du variant de droite de la valeur de celui de gauche

Description

variant_sub ( mixed $left , mixed $right ) : variant

Soustrait right de left.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Règles de soustraction des variants
Si | Alors
Les deux expressions sont des chaînes | Soustraction
Une expression est une chaîne et l'autre est un caractère | Soustraction
Une expression est numérique et l'autre est une chaîne | Soustraction.
Les deux expressions sont numériques | Soustraction
Une des expressions est NULL | NULL est retourné
Les deux expressions sont vides | Une chaîne vide est retournée

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • variant_add() - "Ajoute" deux valeurs de variants et retourne le résultat

User Contributed Notes

There are no user contributed notes for this page.


Exécute une exclusion logique sur deux variants

  • « variant_sub
  • win32service »
  • PHP Manual
  • Fonctions COM et .Net (Windows)
  • Exécute une exclusion logique sur deux variants

variant_xor

(PHP 5, PHP 7, PHP 8)

variant_xor — Exécute une exclusion logique sur deux variants

Description

variant_xor ( mixed $left , mixed $right ) : variant

Exécute une exclusion logique sur deux variants.

Liste de paramètres

left

L'opérande de gauche.

right

L'opérande de droite.

Note:

Comme pour toutes les fonctions arithmétiques, les paramètres pour cette fonction peuvent être soit un type PHP natif (entier, chaîne de caractères, nombre à virgule flottante, booléen ou null), ou une instance de la classe COM, VARIANT ou DOTNET. Les types PHP natifs seront convertis en VARIANT en utilisant les mêmes règles que celles trouvées dans le constructeur de la classe variant. Les objets COM et DOTNET auront la valeur de leur propriété par défaut récupérée et utilisée en tant que valeur VARIANT.

Les fonctions arithmétiques VARIANT sont interfacées sur les fonctions de la bibliothèque COM équivalentes ; pour plus d'informations sur ces fonctions, veuillez consulter la bibliothèque MSDN. Les fonctions PHP sont nommées de façon légèrement différentes : par exemple, variant_add(), en PHP, correspond à VarAdd() dans la documentation MSDN.

Valeurs de retour

Règles XOR pour les Variant
Si left est | Si right est | alors le résultat est
true | true | false
true | false | true
false | true | true
false | false | false
null | null | null

Erreurs / Exceptions

Lance une com_exception en cas d'échec.

Voir aussi

  • variant_or() - Performe une disjonction logique sur deux variants
  • variant_and() - Effectue un ET entre deux variants et retourne le résultat

User Contributed Notes

tinelbarb at yahoo dot com 30-Aug-2010 12:21
I've been using a lot the VARIANT_XOR function (all the VARIANT functions ar cool) and I was faceing the problem that some custom copilation of PHP, especially LAMP packs, doesn't have the VARANT functions included, so the scripts halts.
I had to find an alternative for those who doesn't have an implamentation of VARIANT_XOR.
I'd love if somebody improve my "A_XOR_B" function by changing the name in "VARIANT_XOR" and to run the original VARIANT_XOR function (being optimized) if it is already in the PHP compilation, else run the custom XOR code.

<?php
function a_xor_b($a=0, $b=0) {
    return ( ($a!=$b) && ($a||$b) ) ? TRUE : FALSE ;
}
?>

If using this function, make sure you use the same type for arguments ;-)

Here is a sample code using it:

<?php
if ( a_xor_b(strlen($column1)>0,strlen($column2)>0) ) {
  $add_and='';
}
if ( !a_xor_b(strlen($column1)>0,strlen($column2)>0 ) && strlen($column1)>0 ) {
  $add_and=' and ';
}
$some_sql_filter=$query_str.' having '.$column1.$add_and.$column2;
?>

The use of VARIANT_XOR was identical.

@PHP TEAM: the VARIANT set is so great :-)
tinelbarb at yahoo dot com 30-Aug-2010 12:20
I've been using a lot the VARIANT_XOR function (all the VARIANT functions ar cool) and I was faceing the problem that some custom copilation of PHP, especially LAMP packs, doesn't have the VARANT functions included, so the scripts halts.
I had to find an alternative for those who doesn't have an implamentation of VARIANT_XOR.
I'd love if somebody improve my "A_XOR_B" function by changing the name in "VARIANT_XOR" and to run the original VARIANT_XOR function (being optimized) if it is already in the PHP compilation, else run the custom XOR code.

<?php
function a_xor_b($a=0, $b=0) {
    return ( ($a!=$b) && ($a||$b) ) ? TRUE : FALSE ;
}
?>

If using this function, make sure you use the same type for arguments ;-)

Here is a sample code using it:

<?php
if ( a_xor_b(strlen($column1)>0,strlen($column2)>0) ) {
  $add_and='';
}
if ( !a_xor_b(strlen($column1)>0,strlen($column2)>0 ) && strlen($column1)>0 ) {
  $add_and=' and ';
}
$some_sql_filter=$query_str.' having '.$column1.$add_and.$column2;
?>

The use of VARIANT_XOR was identical.

@PHP TEAM: the VARIANT set is so great :-)
tinelbarb at yahoo dot com dot RE-MO-VE dot ME 30-Aug-2010 12:20
I've been using a lot the VARIANT_XOR function (all the VARIANT functions ar cool) and I was faceing the problem that some custom copilation of PHP, especially LAMP packs, doesn't have the VARANT functions included, so the scripts halts.
I had to find an alternative for those who doesn't have an implamentation of VARIANT_XOR.
I'd love if somebody improve my "A_XOR_B" function by changing the name in "VARIANT_XOR" and to run the original VARIANT_XOR function (being optimized) if it is already in the PHP compilation, else run the custom XOR code.

<?php
function a_xor_b($a=0, $b=0) {
    return ( ($a!=$b) && ($a||$b) ) ? TRUE : FALSE ;
}
?>

If using this function, make sure you use the same type for arguments ;-)

Here is a sample code using it:

<?php
if ( a_xor_b(strlen($column1)>0,strlen($column2)>0) ) {
  $add_and='';
}
if ( !a_xor_b(strlen($column1)>0,strlen($column2)>0 ) && strlen($column1)>0 ) {
  $add_and=' and ';
}
$some_sql_filter=$query_str.' having '.$column1.$add_and.$column2;
?>

The use of VARIANT_XOR was identical.

@PHP TEAM: the VARIANT set is so great :-)


win32service

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
    • Security consideration
  • Constantes pré-définies
    • Masque binaire de type de Service de Win32Service
    • Constantes de Status du Service de Win32Service
    • Constantes du Service de Control de Message de Win32Service
    • Masque binaire de Message de Control de Service de Win32Service
    • Constantes de Type de Demarrage du Service de Win32Service
    • Constantes de Control d'Erreur de Win32Service
    • Constantes de Service Flag de Win32Service
    • Codes d'Erreur Win32
    • Classes de Priorité de Base Win32
    • Actions de récupération Win32
    • Win32 Service informations
  • Win32ServiceException — La class Win32ServiceException
  • Exemples
  • Fonctions win32service
    • win32_continue_service — Reprise d'un service en pause
    • win32_create_service — Crée une nouvelle entrée pour service dans la base de données SCM
    • win32_delete_service — Supprime une entrée de service de la base de données SCM
    • win32_get_last_control_message — Retourne le dernier message de contrôle qui a été envoyé à ce service
    • win32_pause_service — Met en pause un service
    • win32_query_service_status — Questionne le statut d'un service
    • win32_send_custom_control — Envoyer un contrôle personnalisé au service
    • win32_set_service_exit_code — Définir ou renvoyer le code de sortie pour le service en cours d'exécution
    • win32_set_service_exit_mode — Définir ou renvoyer le mode de sortie pour le service en cours d'exécution
    • win32_set_service_status — Met à jour le statut d'un service
    • win32_start_service_ctrl_dispatcher — Enregistre un script avec SCM, alors il peut être interprété en tant que service avec le nom donné
    • win32_start_service — Démarre un service
    • win32_stop_service — Arrête un service

User Contributed Notes

jbnahan at php dot net 12-Jun-2019 11:45
The version 0.4 allow now to send and receive a custom control code.
gospodin dot p dot zh at gmail dot com 04-Oct-2012 06:49
win32service extension does not realize very important (as for me) method of ServiceBase::OnCustomCommand
----
http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.oncustomcommand.aspx
"OnCustomCommand lets you specify additional functionality beyond starting, stopping, pausing and continuing services."


Introduction

L'extension win32service est une extension spécifique à Windows qui autorise PHP à communiquer avec la Gestion de Contrôle de Service pour démarrer, arrêter, enregistrer ou effacer des services, et autorise aussi vos scripts PHP à s'exécuter en tant que service.

User Contributed Notes

There are no user contributed notes for this page.


Installation/Configuration

Sommaire

  • Pré-requis
  • Installation
  • Configuration à l'exécution
  • Types de ressources
  • Security consideration

User Contributed Notes

There are no user contributed notes for this page.


Pré-requis

Les versions de Windows prises en charge sont les mêmes que le package redistribuable Visual C++ utilisé pour construire PHP.

User Contributed Notes

There are no user contributed notes for this page.


Installation

Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » https://pecl.php.net/package/win32service

User Contributed Notes

alphp 10-Jan-2017 03:08
Para actualizar esta extensión a PHP-7 se está trabajando en https://github.com/win32service/win32service
Ya ha disponibles algunos binarios para poder probar.

To update this extension to PHP-7 is working at https://github.com/win32service/win32service
Some binaries have already been available for testing.


Security consideration

Cette extension nécessite des privilèges d'administrateur pour certaines actions telles que create, delete, start, stop, pause et continue. Cette exigence peut provoquer une élévation des privilèges si le contrôle de service est disponible à partir de l'interface Web ou du contrôle à distance.

Vous pouvez définir l'ACL sur le service après l'avoir ajouté dans SCM pour déléguer les tâches d'administration courantes à un compte non administrateur ou à un compte de service. Pour plus d'instructions, voir la » Microsoft Knowledge Base.

User Contributed Notes

There are no user contributed notes for this page.


Constantes pré-définies

Sommaire

  • Masque binaire de type de Service de Win32Service
  • Constantes de Status du Service de Win32Service
  • Constantes du Service de Control de Message de Win32Service
  • Masque binaire de Message de Control de Service de Win32Service
  • Constantes de Type de Demarrage du Service de Win32Service
  • Constantes de Control d'Erreur de Win32Service
  • Constantes de Service Flag de Win32Service
  • Codes d'Erreur Win32
  • Classes de Priorité de Base Win32
  • Actions de récupération Win32
  • Win32 Service informations

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

User Contributed Notes

There are no user contributed notes for this page.


Masque binaire de type de Service de Win32Service

  • « Constantes pré-définies
  • Constantes de Status du Service de Win32Service »
  • PHP Manual
  • Constantes pré-définies
  • Masque binaire de type de Service de Win32Service
Masque binaire de type de Service de Win32Service
Constante | Valeur | Description
WIN32_SERVICE_WIN32_OWN_PROCESS | 0x00000010 | Le service s'exécute dans son propre processus.
WIN32_SERVICE_INTERACTIVE_PROCESS | 0x00000100 | Le service peut interagir avec le bureau. Cette option n'est pas disponible sur Windows Vista ou version ultérieure.
WIN32_SERVICE_WIN32_OWN_PROCESS_INTERACTIVE | 0x00000110 | Le service s'exécute dans son propre processus et peut interagir avec le bureau. Cette option n'est pas disponible sous Windows Vista et suivant.

User Contributed Notes

There are no user contributed notes for this page.


Constantes de Status du Service de Win32Service

  • « Masque binaire de type de Service de Win32Service
  • Constantes du Service de Control de Message de Win32Service »
  • PHP Manual
  • Constantes pré-définies
  • Constantes de Status du Service de Win32Service
Constantes de Status du Service de Win32Service
Constante | Valeur | Description
WIN32_SERVICE_CONTINUE_PENDING | 0x00000005 | La continuation du service est en attente.
WIN32_SERVICE_PAUSE_PENDING | 0x00000006 | La pause du service est en attente.
WIN32_SERVICE_PAUSED | 0x00000007 | Le service est en pause.
WIN32_SERVICE_RUNNING | 0x00000004 | Le service est en cours d'exécution.
WIN32_SERVICE_START_PENDING | 0x00000002 | Le service est en cours de démarrage.
WIN32_SERVICE_STOP_PENDING | 0x00000003 | Le service est en cours d'arrêt.
WIN32_SERVICE_STOPPED | 0x00000001 | Le service est arrêté.

User Contributed Notes

There are no user contributed notes for this page.


Constantes du Service de Control de Message de Win32Service

  • « Constantes de Status du Service de Win32Service
  • Masque binaire de Message de Control de Service de Win32Service »
  • PHP Manual
  • Constantes pré-définies
  • Constantes du Service de Control de Message de Win32Service
Constantes du Service de Control de Message de Win32Service
Constante | Valeur | Description
WIN32_SERVICE_CONTROL_CONTINUE | 0x00000003 | Avertit un service suspendu qu'il devrait reprendre.
WIN32_SERVICE_CONTROL_DEVICEEVENT | 0x0000000B |
WIN32_SERVICE_CONTROL_HARDWAREPROFILECHANGE | 0x0000000C |
WIN32_SERVICE_CONTROL_INTERROGATE | 0x00000004 | Avertit un service qu'il doit rendre compte de informations sur son état actuel au gestionnaire de contrôle de service.
WIN32_SERVICE_CONTROL_NETBINDADD | 0x00000007 | Avertit un service réseau qu'il existe un nouveau composant pour la liaison.
WIN32_SERVICE_CONTROL_NETBINDDISABLE | 0x0000000A | Avertit un service réseau que l'une de ses liaisons a été désactivée.
WIN32_SERVICE_CONTROL_NETBINDENABLE | 0x00000009 | Avertit un service réseau qu'une liaison désactivée a été activée.
WIN32_SERVICE_CONTROL_NETBINDREMOVE | 0x00000008 | Avertit un service réseau qu'un composant pour la liaison a été supprimé.
WIN32_SERVICE_CONTROL_PARAMCHANGE | 0x00000006 | Avertit un service que ses paramètres de démarrage ont changé.
WIN32_SERVICE_CONTROL_PAUSE | 0x00000002 | Avertit un service qu'il doit se mettre en pause.
WIN32_SERVICE_CONTROL_POWEREVENT | 0x0000000D |
WIN32_SERVICE_CONTROL_PRESHUTDOWN | 0x0000000F | Avertit un service que le système va s'arrêter. Un service qui gère cette notification bloque l'arrêt du système jusqu'à l'arrêt du service ou jusqu'à ce que le délai preshutdown expire. Cette valeur n'est pas pris en charge par Windows Server 2003 et Windows XP/2000.
WIN32_SERVICE_CONTROL_SESSIONCHANGE | 0x0000000E |
WIN32_SERVICE_CONTROL_SHUTDOWN | 0x00000005 | Avertit un service que le système s'arrête et que le service peut donc effectuer des tâches de nettoyage. Si un service accepte ce code de contrôle, il doit s'arrêter dès qu'il s'acquitte de ses tâches de nettoyage. Après l'envoie ce code de contrôle par l'ACM, aucun autre code de contrôle ne sera envoyé au service.
WIN32_SERVICE_CONTROL_STOP | 0x00000001 | Avertit un service qu'il doit s'arrêter.

User Contributed Notes

There are no user contributed notes for this page.


Masque binaire de Message de Control de Service de Win32Service

  • « Constantes du Service de Control de Message de Win32Service
  • Constantes de Type de Demarrage du Service de Win32Service »
  • PHP Manual
  • Constantes pré-définies
  • Masque binaire de Message de Control de Service de Win32Service
Masque binaire de Message de Control de Service de Win32Service
Constante | Valeur | Description
WIN32_SERVICE_ACCEPT_HARDWAREPROFILECHANGE | 0x00000020 | Le service est notifié lorsque le profil matériel de l'ordinateur a changé. Cela permet au système d'envoyer des notifications WIN32_SERVICE_CONTROL_HARDWAREPROFILECHANGE au service.
WIN32_SERVICE_ACCEPT_NETBINDCHANGE | 0x00000010 | Le service est un composant réseau qui peut accepter les modifications de sa liaison sans être arrêté et redémarré. Ce code de contrôle permet au service de recevoir les notifications WIN32_SERVICE_CONTROL_NETBINDADD, WIN32_SERVICE_CONTROL_NETBINDREMOVE, WIN32_SERVICE_CONTROL_NETBINDENABLE, et WIN32_SERVICE_CONTROL_NETBINDDISABLE.
WIN32_SERVICE_ACCEPT_PARAMCHANGE | 0x00000008 | Le service peut relire ses paramètres de démarrage sans être arrêté et redémarré. Ce code de contrôle permet au service de recevoir des notifications WIN32_SERVICE_CONTROL_PARAMCHANGE.
WIN32_SERVICE_ACCEPT_PAUSE_CONTINUE | 0x00000002 | Le service peut être mis en pause et continué. Ce code de control permet au service de recevoir les notifications WIN32_SERVICE_CONTROL_PAUSE et WIN32_SERVICE_CONTROL_CONTINUE.
WIN32_SERVICE_ACCEPT_POWEREVENT | 0x00000040 | Le service est notifié lorsque l'état d'alimentation de l'ordinateur a changé. Cela permet au système d'envoyer des notifications WIN32_SERVICE_CONTROL_POWEREVENT au service.
WIN32_SERVICE_ACCEPT_PRESHUTDOWN | 0x00000100 | Le service peut effectuer des tâche d'avant arrêt. Ce code de control permet au service de recevoir la notification WIN32_SERVICE_CONTROL_PRESHUTDOWN. Cette valeur n'est pas pris en charge par Windows Server 2003 et Windows XP/2000.
WIN32_SERVICE_ACCEPT_SESSIONCHANGE | 0x00000080 | Le service est notifié lorsque l'état de session de l'ordinateur a changé. Cela permet au système d'envoyer des notifications WIN32_SERVICE_CONTROL_SESSIONCHANGE au service. Windows 2000: cette valeur n'est pas prise en charge.
WIN32_SERVICE_ACCEPT_SHUTDOWN | 0x00000004 | Le service est informé lorsque l'arrêt du système se produit. Ce code de control permet au service de recevoir la notification WIN32_SERVICE_CONTROL_SHUTDOWN.
WIN32_SERVICE_ACCEPT_STOP | 0x00000001 | Le service peut être stoppé. Ce control permet au service de recevoir la notification WIN32_SERVICE_CONTROL_STOP.
WIN32_SERVICE_ACCEPT_TIMECHANGE | 0x00000200 | Le service est notifié lorsque l'heure système a changé. Cela permet au système d'envoyer des notifications WIN32_SERVICE_CONTROL_TIMECHANGE au service. Windows Server 2008, Windows Vista, Windows Server 2003 et Windows XP/2000: ce code de contrôle n'est pas pris en charge.
WIN32_SERVICE_ACCEPT_TRIGGEREVENT | 0x00000400 | Le service est notifié lorsqu'un événement pour lequel le service s'est enregistré se produit. Cela permet au système d'envoyer des notifications WIN32_SERVICE_CONTROL_TRIGGEREVENT au service. Windows Server 2008, Windows Vista, Windows Server 2003 et Windows XP/2000: ce code de contrôle n'est pas pris en charge.

User Contributed Notes

There are no user contributed notes for this page.


Constantes de Type de Demarrage du Service de Win32Service

  • « Masque binaire de Message de Control de Service de Win32Service
  • Constantes de Control d'Erreur de Win32Service »
  • PHP Manual
  • Constantes pré-définies
  • Constantes de Type de Demarrage du Service de Win32Service
Constantes de Type de Demarrage du Service de Win32Service
Constante | Valeur | Description
WIN32_SERVICE_BOOT_START | 0x00000000 | Un pilote de périphérique Démarré par le chargeur système. Cette valeur est valide uniquement pour les services de pilote.
WIN32_SERVICE_SYSTEM_START | 0x00000001 | Un pilote de périphérique Démarré par la fonction IoInitSystem. Cette valeur est valide uniquement pour les services de pilote.
WIN32_SERVICE_AUTO_START | 0x00000002 | Un service lancé automatiquement par le gestionnaire de contrôle de service au démarrage du système.
WIN32_SERVICE_DEMAND_START | 0x00000003 | Un service a démarré par le gestionnaire de contrôle de service quand un processus appel la fonction StartService.
WIN32_SERVICE_DISABLED | 0x00000004 | Un service qui ne peut pas être démarré. Les tentatives pour démarrer retourne un code d'erreur WIN32_ERROR_SERVICE_DISABLED .

User Contributed Notes

There are no user contributed notes for this page.


Constantes de Control d'Erreur de Win32Service

  • « Constantes de Type de Demarrage du Service de Win32Service
  • Constantes de Service Flag de Win32Service »
  • PHP Manual
  • Constantes pré-définies
  • Constantes de Control d'Erreur de Win32Service
Constantes de Control d'Erreur de Win32Service
Constante | Valeur | Description
WIN32_SERVICE_ERROR_IGNORE | 0x00000000 | Le programme de démarrage ignore l'erreur et continue l'opération de démarrage.
WIN32_SERVICE_ERROR_NORMAL | 0x00000001 | Le programme de démarrage enregistre l'erreur dans le journal des événements, mais il continue l'opération de démarrage.
WIN32_SERVICE_ERROR_SEVERE | 0x00000002 | Le programme de démarrage consigne l'erreur dans le journal des événements. Si la dernière configuration connue est lancée, l'opération de démarrage se poursuit. Sinon, le système est redémarré avec la dernière configuration connue-bonne.
WIN32_SERVICE_ERROR_CRITICAL | 0x00000003 | Le programme de démarrage consigne l'erreur dans le journal des événements, si possible. Si la dernière configuration connue est lancée, l'opération de démarrage échoue. Sinon, le système est redémarré avec la dernière bonne configuration connue.

User Contributed Notes

There are no user contributed notes for this page.


Constantes de Service Flag de Win32Service

  • « Constantes de Control d'Erreur de Win32Service
  • Codes d'Erreur Win32 »
  • PHP Manual
  • Constantes pré-définies
  • Constantes de Service Flag de Win32Service
Constantes de Service Flag de Win32Service
Constante | Valeur | Description
WIN32_SERVICE_RUNS_IN_SYSTEM_PROCESS | 0x00000001 | Le service s'exécute dans un processus système qui doit toujours être en cours d'exécution.

User Contributed Notes

There are no user contributed notes for this page.


Codes d'Erreur Win32

  • « Constantes de Service Flag de Win32Service
  • Classes de Priorité de Base Win32 »
  • PHP Manual
  • Constantes pré-définies
  • Codes d'Erreur Win32

Note:

Ces constantes ne sont plus utilisées à partir de Win32Service 1.0.0.

Codes d'Erreur Win32
Constante | Valeur | Description
WIN32_ERROR_ACCESS_DENIED | 0x00000005 | Le gestionnaire de la base de données SMC ne dispose pas des droits d'accès appropriés.
WIN32_ERROR_CIRCULAR_DEPENDENCY | 0x00000423 | Une dépendance circulaire de service est spécifiée.
WIN32_ERROR_DATABASE_DOES_NOT_EXIST | 0x00000429 | La base de données spécifiée n'existe pas.
WIN32_ERROR_DEPENDENT_SERVICES_RUNNING | 0x0000041B | Le service ne peut être stoppé car d'autres services en cours d'exécution dépendent de lui.
WIN32_ERROR_DUPLICATE_SERVICE_NAME | 0x00000436 | Le nom d'affichage existe déjà dans la base de données du gestionnaire de service en tant que nom de service ou que nom d'affichage.
WIN32_ERROR_FAILED_SERVICE_CONTROLLER_CONNECT | 0x00000427 | Cette erreur est retournée si le programme est exécuté en application console plutôt qu'en tant que service. Si le programme est exécuté en tant qu'application console à des fins de débogage, il devrat être structuré afin que le code spécifique au service ne sois jamais appelé.
WIN32_ERROR_INSUFFICIENT_BUFFER | 0x0000007A | Le tampon est trop petit pour la structure d'état de service. Rien n'a été écrit à la structure.
WIN32_ERROR_INVALID_DATA | 0x0000000D | Le structure d'état de service indiquée n'est pas valide.
WIN32_ERROR_INVALID_HANDLE | 0x00000006 | Le handle pour le gestionnaire de service de control spécifié est invalide.
WIN32_ERROR_INVALID_LEVEL | 0x0000007C | Le paramètre InfoLevel contient une valeur non prise en charge.
WIN32_ERROR_INVALID_NAME | 0x0000007B | Le nom de service spécifié n'est pas valide.
WIN32_ERROR_INVALID_PARAMETER | 0x00000057 | Un paramètre spécifié n'est pas valide.
WIN32_ERROR_INVALID_SERVICE_ACCOUNT | 0x00000421 | Le nom d'utilisateur spécifié dans le paramètre user n'existe pas. Voir win32_create_service().
WIN32_ERROR_INVALID_SERVICE_CONTROL | 0x0000041C | Le code de control demandé n'est pas valide, ou il est inacceptable pour le service.
WIN32_ERROR_PATH_NOT_FOUND | 0x00000003 | Le service de fichier binaire n'a pu être trouvé.
WIN32_ERROR_SERVICE_ALREADY_RUNNING | 0x00000420 | Une instance du service est déjà en cours d'exécution.
WIN32_ERROR_SERVICE_CANNOT_ACCEPT_CTRL | 0x00000425 | Le code de control demandé ne peut être envoyé au service car l'état du service est WIN32_SERVICE_STOPPED, WIN32_SERVICE_START_PENDING ou WIN32_SERVICE_STOP_PENDING.
WIN32_ERROR_SERVICE_DATABASE_LOCKED | 0x0000041F | La base de données est verouillée.
WIN32_ERROR_SERVICE_DEPENDENCY_DELETED | 0x00000433 | Le service dépend d'un service qui n'existe pas ou qui a été marqué pour suppression.
WIN32_ERROR_SERVICE_DEPENDENCY_FAIL | 0x0000042C | Ce service dépend d'un autre service qui n'a pas pu démarrer.
WIN32_ERROR_SERVICE_DISABLED | 0x00000422 | Le service a été désactivé.
WIN32_ERROR_SERVICE_DOES_NOT_EXIST | 0x00000424 | Le service spécifié n'existe pas en tant que service installé.
WIN32_ERROR_SERVICE_EXISTS | 0x00000431 | Le service spécifié existe déjà dans la base de données.
WIN32_ERROR_SERVICE_LOGON_FAILED | 0x0000042D | Le service n'a pas démarré en raison d'un échec de connexion. Cette erreur se produit si le service est configuré pour s'exécuter sous un compte qui n'a pas les droits "connecter en tant que service".
WIN32_ERROR_SERVICE_MARKED_FOR_DELETE | 0x00000430 | Le service spécifié a déjà été marqué pour suppression.
WIN32_ERROR_SERVICE_NO_THREAD | 0x0000041E | Un thread n'a pas pu être créé pour le service.
WIN32_ERROR_SERVICE_NOT_ACTIVE | 0x00000426 | Le service n'a pas été démarré.
WIN32_ERROR_SERVICE_REQUEST_TIMEOUT | 0x0000041D | Le processus du service a été démarré, mais il n'a pas appelé StartServiceCtrlDispatcher, ou le thread qui a appelé StartServiceCtrlDispatcher peut être bloqué dans une fonction du gestionnaire de contrôle.
WIN32_ERROR_SHUTDOWN_IN_PROGRESS | 0x0000045B | Le système s'arrête, cette fonction ne peut pas être appelée.
WIN32_ERROR_SERVICE_SPECIFIC_ERROR | 0x0000042A | Le service a retourné un code d'erreur spécifique au service.
WIN32_NO_ERROR | 0x00000000 | Aucune erreur.

User Contributed Notes

There are no user contributed notes for this page.


Classes de Priorité de Base Win32

  • « Codes d'Erreur Win32
  • Actions de récupération Win32 »
  • PHP Manual
  • Constantes pré-définies
  • Classes de Priorité de Base Win32
Classes de Priorité de Base Win32
Constante | Valeur | Description
WIN32_ABOVE_NORMAL_PRIORITY_CLASS | 0x00008000 | Processus ayant une priorité supérieure WIN32_NORMAL_PRIORITY_CLASS mais inférieure à WIN32_HIGH_PRIORITY_CLASS.
WIN32_BELOW_NORMAL_PRIORITY_CLASS | 0x00004000 | Processsus ayant une priorité supperieur à WIN32_IDLE_PRIORITY_CLASS mais inférieure à WIN32_NORMAL_PRIORITY_CLASS.
WIN32_HIGH_PRIORITY_CLASS | 0x00000080 | Processus qui exécute des tâches critiques dans le temps qui doivent être exécutées immédiatement. Le thread du processus devance les threads de priorité normale ou au repos. Un exemple est la liste des tâches, qui doit répondre rapidement quand elle est appelée par l'utilisateur quel que sois la charge du système. Soyez extrêmement prudent lorsque vous utilisez la classe de haute priorité, car une application de classe de haute priorité peut utiliser presque tout le temps CPU disponible.
WIN32_IDLE_PRIORITY_CLASS | 0x00000040 | Processus dont les threads ne s'exécutent que lorsque le système est inactif. Les threads du processus sont devancés par les threads de tout processus en cours ayant une classe de plus grande priorité. Un exemple est un économiseur d'écran. Cette classe est héritée par les processus enfants.
WIN32_NORMAL_PRIORITY_CLASS | 0x00000020 | Processus sans planification de besoins spéciaux.
WIN32_REALTIME_PRIORITY_CLASS | 0x00000100 | Processus ayant la plus haute priorité possible. Les threads du processus devance les threads de tout autre processus, y compris les processus du système d'exploitation exécutant des tâches importantes. Par exemple, un processus en temps réel qui s'exécute un peu trop lentement peut causer des pertes d'ecriture du tampon sur le disque ou empecher à la souris de répondre.

User Contributed Notes

There are no user contributed notes for this page.


Actions de récupération Win32

  • « Classes de Priorité de Base Win32
  • Win32 Service informations »
  • PHP Manual
  • Constantes pré-définies
  • Actions de récupération Win32
Actions de récupération Win32
Constante | Valeur | Description
WIN32_SC_ACTION_NONE | 0x00000000 | Aucune action.
WIN32_SC_ACTION_REBOOT | 0x00000001 | Redémarrer le serveur.
WIN32_SC_ACTION_RESTART | 0x00000002 | Redémarrer le service.
WIN32_SC_ACTION_RUN_COMMAND | 0x00000003 | Exécuter un programme.

User Contributed Notes

There are no user contributed notes for this page.


Win32 Service informations

  • « Actions de récupération Win32
  • Win32ServiceException »
  • PHP Manual
  • Constantes pré-définies
  • Win32 Service informations
Win32 Service informations
Constant | Value | Description
WIN32_INFO_SERVICE | "service" |
WIN32_INFO_DISPLAY | "display" |
WIN32_INFO_USER | "user" |
WIN32_INFO_PASSWORD | "password" |
WIN32_INFO_PATH | "path" |
WIN32_INFO_PARAMS | "params" |
WIN32_INFO_DESCRIPTION | "description" |
WIN32_INFO_START_TYPE | "start_type" |
INFO_LOAD_ORDER | "load_order" |
INFO_SVC_TYPE | "svc_type" |
INFO_ERROR_CONTROL | "error_control" |
INFO_DELAYED_START | "delayed_start" |
INFO_BASE_PRIORITY | "base_priority" |
INFO_DEPENDENCIES | "dependencies" |
INFO_RECOVERY_DELAY | "recovery_delay" |
INFO_RECOVERY_ACTION_1 | "recovery_action_1" |
INFO_RECOVERY_ACTION_2 | "recovery_action_2" |
INFO_RECOVERY_ACTION_3 | "recovery_action_3" |
INFO_RECOVERY_RESET_PERIOD | "recovery_reset_period" |
INFO_RECOVERY_ENABLED | "recovery_enabled" |
INFO_RECOVERY_REBOOT_MSG | "recovery_reboot_msg" |
INFO_RECOVERY_COMMAND | "recovery_command" |

User Contributed Notes

There are no user contributed notes for this page.


La class Win32ServiceException

(PECL win32service >=1.0.0)

Introduction

L’exception remplace l’ancien mécanisme où la valeur d’erreur devait être comparée aux constantes pour détecter quelle erreur a été émise. Le code de l’exception est égal à la valeur de la constante d’erreur et le message de l’exception est basé sur le nom de la constante correspondante.

Synopsis de la classe

Win32ServiceException extends Exception {
/* Propriétés héritées */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* Méthodes héritées */
final public Exception::getMessage ( ) : string
final public Exception::getPrevious ( ) : Throwable
final public Exception::getCode ( ) : mixed
final public Exception::getFile ( ) : string
final public Exception::getLine ( ) : int
final public Exception::getTrace ( ) : array
final public Exception::getTraceAsString ( ) : string
public Exception::__toString ( ) : string
final private Exception::__clone ( ) : void
}

User Contributed Notes

There are no user contributed notes for this page.


Exemples

Exemple #1 Enregistre un script PHP pour exécuter en tant que service

<?php
win32_create_service(array(
    'service'     => 'dummyphp',                                           # nom du service
    'display'     => 'sample dummy PHP service',                           # description courte
    'description' => 'This is a dummy Windows service created using PHP.', # description longue
    'params'      => '"' . __FILE__ . '"  run',                            # chemin vers le script et paramètres
));
?>

Exemple #2 Efface un service

<?php
win32_delete_service('dummyphp');
?>

Exemple #3 Exécution d'un service

<?php
if ($argv[1] == 'run') {
  win32_start_service_ctrl_dispatcher('dummyphp');

  while (WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message()) {
    # effectuer votre travail ici.
    # essayez de ne pas prendre plus de 30 secondes avant de retourner au
    # début de la boucle
  }
}
?>

User Contributed Notes

There are no user contributed notes for this page.


Fonctions win32service

Sommaire

  • win32_continue_service — Reprise d'un service en pause
  • win32_create_service — Crée une nouvelle entrée pour service dans la base de données SCM
  • win32_delete_service — Supprime une entrée de service de la base de données SCM
  • win32_get_last_control_message — Retourne le dernier message de contrôle qui a été envoyé à ce service
  • win32_pause_service — Met en pause un service
  • win32_query_service_status — Questionne le statut d'un service
  • win32_send_custom_control — Envoyer un contrôle personnalisé au service
  • win32_set_service_exit_code — Définir ou renvoyer le code de sortie pour le service en cours d'exécution
  • win32_set_service_exit_mode — Définir ou renvoyer le mode de sortie pour le service en cours d'exécution
  • win32_set_service_status — Met à jour le statut d'un service
  • win32_start_service_ctrl_dispatcher — Enregistre un script avec SCM, alors il peut être interprété en tant que service avec le nom donné
  • win32_start_service — Démarre un service
  • win32_stop_service — Arrête un service

User Contributed Notes

brian dot ngure at gmail dot com 30-Apr-2010 03:03
An example of how it should be done:

<?php

class TestClass {
    private $args;

    function __construct($arg) {
        $this->args = $arg;
        $this->run();
    }

    private function run() {
        if ($this->args == 'run') {
            win32_start_service_ctrl_dispatcher('test_service');

            while (WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message()) {
                # do your work here.
                # try not to take up more than 30 seconds before going around the loop
                # again
            }
        }
    }
}

$object = new TestClass($argv[1]);

?>


Reprise d'un service en pause

  • « Fonctions win32service
  • win32_create_service »
  • PHP Manual
  • Fonctions win32service
  • Reprise d'un service en pause

win32_continue_service

(PECL win32service >=0.1.0)

win32_continue_service — Reprise d'un service en pause

Description

win32_continue_service ( string $servicename , string $machine = ? ) : void

Reprise d'un service en pause. Requiert des privilèges d'administrateur ou un compte avec les droits appropriés définis dans l'ACL du service.

Liste de paramètres

servicename

Le nom court du service.

machine

Nom de la machine (optionnel). Si omis, la machine locale sera utilisée.

Valeurs de retour

Aucune valeur n'est retournée.

Avant la version 1.0.0, retournait WIN32_NO_ERROR on success, false if there is a problem with the parameters or a Win32 Error Code on failure.

Erreurs / Exceptions

Une ValueError est levée si la valeur du paramètre servicename est vide.

Une Win32ServiceException est levée en cas d'erreur.

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.
PECL win32service 1.0.0 | Le type de retour est maintenant void, avant il était mixed.
PECL win32service 0.3.0 | Cette fonction ne requiert plus de compte d'administrateur si l'ACL est défini pour un autre compte.

Voir aussi

  • win32_start_service() - Démarre un service
  • win32_stop_service() - Arrête un service
  • win32_pause_service() - Met en pause un service
  • win32_send_custom_control() - Envoyer un contrôle personnalisé au service
  • Les codes erreur Win32

User Contributed Notes

There are no user contributed notes for this page.


Crée une nouvelle entrée pour service dans la base de données SCM

  • « win32_continue_service
  • win32_delete_service »
  • PHP Manual
  • Fonctions win32service
  • Crée une nouvelle entrée pour service dans la base de données SCM

win32_create_service

(PECL win32service >=0.1.0)

win32_create_service — Crée une nouvelle entrée pour service dans la base de données SCM

Description

win32_create_service ( array $details , string $machine = ? ) : void

Tente d'ajouter un service dans la base de données SCM. Des privilèges d'administrateur sont nécessaires pour que cela réussisse.

Liste de paramètres

details

Un tableau des détails des services :

service

Le nom court du service. C'est le nom que vous utiliserez pour contrôler le service en utilisant la commande net. Le service doit être unique (deux services ne peuvent partager le même nom), et idéalement, devrait éviter d'avoir des espaces dans son nom.

display

Le nom d'affichage du service. C'est le nom que vous verrez dans l'Applet Services.

description

La description longue du service. C'est la description que vous verrez dans l'Applet des services.

user

Le nom de l'utilisateur sous lequel vous voulez que le service s'exécute. Si oublié, le service fonctionnera en tant que LocalSystem. Si le nom de l'utilisateur est spécifié, vous devez aussi fournir un mot de passe.

password

Le mot de passe qui correspond à user.

path

Le chemin complet au module exécutable qui sera démarré lorsque le service est démarré. Si oublié, le chemin du processus courant de PHP sera utilisé.

params

Paramètres de commande à passer au service lorsqu'il démarre. Si vous voulez exécuter un script PHP en tant que service, alors le premier paramètre devrait être le chemin complet au script PHP que vous prévoyez exécuter. Si le nom du script ou le chemin contiennent des espaces, alors, entourez le chemin complet du script PHP par des "

load_order

Contrôle le load_order. Cela n'est pas encore complètement supporté.

svc_type

Fixe le type de service. Si oublié, la valeur par défaut est WIN32_SERVICE_WIN32_OWN_PROCESS. Ne changez pas ceci à moins que vous savez vraiment ce que vous faites.

start_type

Spécifie comment le service devrait être démarré. La valeur par défaut est WIN32_SERVIDE_AUTO_START qui signifie que le service sera démarré lorsque la machine démarrera.

error_control

Informe le SCM à propos de ce qu'il devrait faire lorsqu'il détecte un problème avec le service. La valeur par défaut est WIN32_SERVER_ERROR_IGNORE. Le changement de cette valeur n'est pas encore complètement supporté.

delayed_start

Si delayed_start est défini à true, alors il informera le SCM que ce service doit être démarré après les services démarrés automatiquement et un certain délai.

N'importe quel service peut être marqué comme étant un service retardé après le démarrage automatique ; cependant, cette configuration n'a aucun effet tant que le paramètre start_type du service vaut WIN32_SERVICE_AUTO_START.

Cette configuration n'est application que sous Windows Vista et les serveurs Windows 2008 et suivants.

base_priority

Pour réduire l'impacte sur l'utilisation du processeur, il peut être nécessaire de définir une priorité plus basse qu'à la normale.

Le paramètre base_priority peut être défini à une des constantes définies dans les classes de basse priorité Win32.

dependencies

Pour définir les dépendances de votre service, il est nécessaire de définir ce paramètre avec la liste des noms des service dans un tableau.

recovery_delay

Ce paramètre défini le délai entre la défaillance et l'exécution de l'action de récupération. La valeur est en millisecondes.

La valeur par défaut est 60000.

recovery_action_1

L'action qui sera exécuté lors de la première défaillance. L'action par défaut est WIN32_SC_ACTION_NONE.

Le paramètre recovery_action_1 peut être défini avec l'une des constantes définie dans les Actions de récupération Win32.

recovery_action_2

L'action qui sera exécuté lors de la deuxième défaillance. L'action par défaut est WIN32_SC_ACTION_NONE.

Le paramètre recovery_action_2 peut être défini avec l'une des constantes définie dans les Actions de récupération Win32.

recovery_action_3

L'action qui sera exécuté lors des défaillances suivantes. L'action par défaut est WIN32_SC_ACTION_NONE.

Le paramètre recovery_action_3 peut être défini avec l'une des constantes définie dans les Actions de récupération Win32.

recovery_reset_period

Le compteur des défaillance sera réinitialisé après le délai défini dans ce paramètre. Le délai est exprimé en secondes.

La valeur par défaut est 86400.

recovery_enabled

Définir ce paramètre à true pour activer les options de récupération, et false pour les désactiver.

La valeur par défaut est false

recovery_reboot_msg

Ajouter ce paramètre pour définir le message enregistré dans le jounal d'évènements Windows avant le redémarrage. Utilisé uniquement si l'une des actions est défini à WIN32_SC_ACTION_REBOOT.

recovery_command

Ajouter ce paramètre pour définir la commande a exécuter lorsqu'une action est définie à WIN32_SC_ACTION_RUN_COMMAND.

machine

Le nom optionnel de la machine sur lequel vous voulez créer le service. Si oublié, cela utilisera la machine locale.

Valeurs de retour

Aucune valeur n'est retournée.

Avant la version 1.0.0, retournait WIN32_NO_ERROR on success, false if there is a problem with the parameters or a Win32 Error Code on failure.

Erreurs / Exceptions

Une ValueError est levée si la valeur du paramètre serviceest vide.

Une ValueError est levée si la valeur du paramètre path est omis ou vide.

Une ValueError est levée si la valeur du paramètre svc_type est incorrect.

Une ValueError est levée si la valeur du paramètre start_type est incorrect.

Une ValueError est levée si la valeur du paramètre error_control est incorrect.

Une ValueError est levée si la valeur du paramètre base_priority est incorrect.

Une ValueError est levée si la valeur du paramètre recovery_delay n'est pas entre 0 et PHP_INT_MAX.

Une ValueError est levée si la valeur du paramètre recovery_action_1 est incorrect.

Une ValueError est levée si la valeur du paramètre recovery_action_2 est incorrect.

Une ValueError est levée si la valeur du paramètre recovery_action_3 est incorrect.

Une ValueError est levée si la valeur du paramètre recovery_reset_period n'est pas entre 0 et PHP_INT_MAX.

Une Win32ServiceException est levée en cas d'erreur.

Exemples

Exemple #1 Exemple avec win32_create_service()

Crée un service dont le nom court est 'dummyphp'.

<?php
$x = win32_create_service(array(
    'service'     => 'dummyphp',                                        // le nom de votre service
    'display'     => 'service PHP simple PHP',                            // la description courte
    'description' => 'Ceci est un service Windows créé en utilisant PHP', // la description longue
    'params'      => '"' . __FILE__ . '"  run',                           // chemin vers le script ainsi que les paramètres
));
debug_zval_dump($x);
?>

Exemple #2 Un exemple win32_create_service() avec les dépendances

Crée un service dont le nom court est 'dummyphp' avec des dépendances.

<?php
$x = win32_create_service(array(
    'service'      => 'dummyphp',                                       // Le nom du service
    'display'               => 'service PHP simple PHP',                             // Une courte description
    'description'           => 'Ceci est un service Windows créé en utilisant PHP.', // Une longue description
    'params'                => '"' . __FILE__ . '"  run',                            // chemin vers le script ainsi que les paramètres
    'dependencies' => array("Netman"),                                      // La liste des dépendances
));
debug_zval_dump($x);
?>

Exemple #3 Exemple de win32_create_service() avec les options de récupération

Crée un service dont le nom court est 'dummyphp' avec les options de récupération.

<?php
$x = win32_create_service(array(
    'service'               => 'dummyphp',                                           // Le nom du service
    'display'               => 'service PHP simple PHP',                             // Une courte description
    'description'           => 'Ceci est un service Windows créé en utilisant PHP.', // Une longue description
    'params'                => '"' . __FILE__ . '"  run',                            // chemin vers le script ainsi que les paramètres
    'recovery_delay'        => 120000,                                               // Les actions de récupération seront exécuté après 2 minutes
    'recovery_action_1'     => WIN32_SC_ACTION_RESTART,                              // Première défaillance, redémarrage du service
    'recovery_action_2'     => WIN32_SC_ACTION_RUN_COMMAND,                          // Deuxième défaillance, exécution d'une commande
    'recovery_action_3'     => WIN32_SC_ACTION_NONE,                                 // Défaillance suivante, ne rien faire
    'recovery_reset_period' => 86400,                                                // Réinitialiser le compteur des défaillance après 1 jour (86400 minutes)
    'recovery_enabled'      => true,                                                 // Activer les options de récupération
    'recovery_reboot_msg'   => null,                                                 // Ne pas définir de message de redémarrage, il n'est pas utile.
    'recovery_command'      => "c:\clean-service.bat",                               // Lorsque l'action est WIN32_SC_ACTION_RUN_COMMAND, exécuter cette commande.
));
debug_zval_dump($x);
?>

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.
PECL win32service 1.0.0 | Le type de retour est maintenant void, avant il était mixed.
PECL win32service 0.4.0 | Les paramètres dependencies, recovery_delay, recovery_action_1, recovery_action_2, recovery_action_3, recovery_reset_period, recovery_enabled, recovery_reboot_msg et recovery_command ont été ajoutés.

Voir aussi

  • win32_delete_service() - Supprime une entrée de service de la base de données SCM
  • Les classes de basse priorité Win32
  • Les actions de récupération Win32
  • Les codes erreurs Win32

User Contributed Notes

Anonymous 08-Oct-2010 10:05
[An example of how to create a Windows service.  Evaluate code first and use at your own risk!]

<?php

//No timeouts, Flush Content immediatly
    set_time_limit(0);
    ob_implicit_flush();

//Service Settings
    $phpPath = "D:\\php\\php5.2.9";
    $ServiceName = 'phpServiceName';
    $ServiceDisplay = 'phpDisplayName';

//Windows Service Control
    $ServiceAction = "status";
    //$ServiceAction = "debug";
    if ( isset($_GET['ServiceAction']) and strlen($_GET['ServiceAction']) ) {
        $ServiceAction = addslashes($_GET['ServiceAction']);
    } else if ( isset($argv) and isset($argv[1]) and strlen($argv[1]) ) {
        $ServiceAction = $argv[1];
    }
    if( $ServiceAction == "status" ) {
        $ServiceStatus = win32_query_service_status($ServiceName);
        if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_STOPPED ) {
            echo "Service Stopped\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_START_PENDING ) {
            echo "Service Start Pending\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_STOP_PENDING ) {
            echo "Service Stop Pending\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_RUNNING ) {
            echo "Service Running\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_CONTINUE_PENDING ) {
            echo "Service Continue Pending\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_PAUSE_PENDING ) {
            echo "Service Pause Pending\n\n";
        } else if ( $ServiceStatus['CurrentState'] == WIN32_SERVICE_PAUSED ) {
            echo "Service Paused\n\n";
        } else{
            echo "Service Unknown\n\n";
        }
      exit;
    } else if ( $ServiceAction == "install" ) {
    //Install Windows Service
        win32_create_service( Array(
            'service' => $ServiceName,
            'display' => $ServiceDisplay,
            'params' => __FILE__ . " run",
            'path' => $phpPath."\\php.exe",
        ));
        echo "Service Installed\n\n";
        exit;
    } else if ( $ServiceAction == "uninstall" ) {
    //Remove Windows Service
        win32_delete_service($ServiceName);
        echo "Service Removed\n\n";
        exit;
    } else if( $ServiceAction == "start") {
    //Start Windows Service
      win32_start_service($ServiceName);
      echo "Service Started\n\n";
      exit;
    } else if( $ServiceAction == "stop" ) {
    //Stop Windows Service
      win32_stop_service($ServiceName);
      echo "Service Stopped\n\n";
      exit;
    } else if ( $ServiceAction == "run" ) {
    //Run Windows Service
        win32_start_service_ctrl_dispatcher($ServiceName);
        win32_set_service_status(WIN32_SERVICE_RUNNING);
    } else if ( $ServiceAction == "debug" ) {
    //Debug Windows Service
        set_time_limit(10);
    } else {
        exit();
    }

//Server Loop
    while (1) {
    //Handle Windows Service Request
        usleep(100*1000);
        if ( $ServiceAction == "run" ) {
            switch ( win32_get_last_control_message() ) {
                case WIN32_SERVICE_CONTROL_CONTINUE:
                    break;
                case WIN32_SERVICE_CONTROL_INTERROGATE:
                    win32_set_service_status(WIN32_NO_ERROR);
                break;
                case WIN32_SERVICE_CONTROL_STOP:
                    win32_set_service_status(WIN32_SERVICE_STOPPED);
                    exit;
                default:
                    win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED);
            }
        }
    //User Loop
        sleep(1);
        echo "\n<BR>YOUR CODE HERE";
    }

//Exit
    if ( $ServiceAction == "run" ) {
        win32_set_service_status(WIN32_SERVICE_STOPPED);
    }
    exit();
?>
pauljamesthomson at gmail dot com 22-Jan-2007 04:54
Other start_type values:

0x00000002: A service started automatically by the service control manager during system startup. For more information, see Automatically Starting Services.

0x00000000: A device driver started by the system loader. This value is valid only for driver services.

0x00000003: A service started by the service control manager when a process calls the win32_start_service() function.

0x00000004: A service that cannot be started. Attempts to start the service result in the error code

0x00000001: A device driver started by the IoInitSystem function. This value is valid only for driver services.

I can confirm that 0x00000003 works as expected (service is created, but must be started manually).

More here:

http://msdn2.microsoft.com/en-us/library/ms682450.aspx


Supprime une entrée de service de la base de données SCM

  • « win32_create_service
  • win32_get_last_control_message »
  • PHP Manual
  • Fonctions win32service
  • Supprime une entrée de service de la base de données SCM

win32_delete_service

(PECL win32service >=0.1.0)

win32_delete_service — Supprime une entrée de service de la base de données SCM

Description

win32_delete_service ( string $servicename , string $machine = ? ) : void

Essaie de supprimer un service de la base de données SCM. Les privilèges d'administrateur sont requis pour que cette fonction réussisse.

Cette fonction ne fait que marquer le service pour suppression. Si d'autre processus (comme l'Applet Services) sont ouverts, alors la suppression sera reportée jusqu'à ce que ces applications soient fermées. Si un service est marqué pour suppression, d'autres tentatives de suppression échoueront et les tentatives de créer un nouveau service avec ce nom échoueront aussi.

Liste de paramètres

servicename

Le nom court du service.

machine

Le nom optionnel de la machine. Si oublié, cela utilisera la machine locale.

Valeurs de retour

Aucune valeur n'est retournée.

Avant la version 1.0.0, retournait WIN32_NO_ERROR on success, false if there is a problem with the parameters or a Win32 Error Code on failure.

Erreurs / Exceptions

Une ValueError est levée si la valeur du paramètre servicename est vide.

Une Win32ServiceException est levée en cas d'erreur.

Exemples

Exemple #1 Exemple avec win32_delete_service()

Supprime le service dummyphp.

<?php
win32_delete_service('dummyphp');
?>

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.
PECL win32service 1.0.0 | Le type de retour est maintenant void, avant il était mixed.

Voir aussi

  • win32_create_service() - Crée une nouvelle entrée pour service dans la base de données SCM
  • Les codes erreur Win32

User Contributed Notes

There are no user contributed notes for this page.


Retourne le dernier message de contrôle qui a été envoyé à ce service

  • « win32_delete_service
  • win32_pause_service »
  • PHP Manual
  • Fonctions win32service
  • Retourne le dernier message de contrôle qui a été envoyé à ce service

win32_get_last_control_message

(PECL win32service >=0.1.0)

win32_get_last_control_message — Retourne le dernier message de contrôle qui a été envoyé à ce service

Description

win32_get_last_control_message ( ) : int

Retourne le code de contrôle qui a été envoyé en dernier à ce processus de service. Lorsqu'il fonctionne en tant que service, vous devriez vérifier périodiquement pour déterminer si le service doit être arrêté.

Attention

Depuis la version 0.2.0, cette fonction fonctionne uniquement en ligne de commande. Elle est désactivé dans les autres cas.

Valeurs de retour

Retourne une constante de contrôle qui sera une parmi les constantes de contrôle des messages de service Win32Service : WIN32_SERVICE_CONTROL_CONTINUE, WIN32_SERVICE_CONTROL_DEVICEEVENT, WIN32_SERVICE_CONTROL_HARDWAREPROFILECHANGE, WIN32_SERVICE_CONTROL_INTERROGATE, WIN32_SERVICE_CONTROL_NETBINDADD, WIN32_SERVICE_CONTROL_NETBINDDISABLE, WIN32_SERVICE_CONTROL_NETBINDENABLE, WIN32_SERVICE_CONTROL_NETBINDREMOVE, WIN32_SERVICE_CONTROL_PARAMCHANGE, WIN32_SERVICE_CONTROL_PAUSE, WIN32_SERVICE_CONTROL_POWEREVENT, WIN32_SERVICE_CONTROL_PRESHUTDOWN, WIN32_SERVICE_CONTROL_SESSIONCHANGE, WIN32_SERVICE_CONTROL_SHUTDOWN, WIN32_SERVICE_CONTROL_STOP.

Si la valeur se situe entre 128 et 255, le code de contrôle est personnalisé.

Erreurs / Exceptions

Avant la version 1.0.0, si cette fonction est utilisé en dehors du SAPI "cli", une erreur E_ERROR sera émise.

À partir de la version 1.0.0, lancera une Win32ServiceException si le SAPI n'est pas "cli"

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.
PECL win32service 0.2.0 | Cette fonction fonctionne uniquement en ligne de commande.

Voir aussi

  • win32_start_service_ctrl_dispatcher() - Enregistre un script avec SCM, alors il peut être interprété en tant que service avec le nom donné
  • win32_set_service_status() - Met à jour le statut d'un service
  • win32_set_service_exit_mode() - Définir ou renvoyer le mode de sortie pour le service en cours d'exécution
  • win32_set_service_exit_code() - Définir ou renvoyer le code de sortie pour le service en cours d'exécution
  • les constantes de contrôle des messages de service Win32Service

User Contributed Notes

There are no user contributed notes for this page.


Met en pause un service

  • « win32_get_last_control_message
  • win32_query_service_status »
  • PHP Manual
  • Fonctions win32service
  • Met en pause un service

win32_pause_service

(PECL win32service >=0.1.0)

win32_pause_service — Met en pause un service

Description

win32_pause_service ( string $servicename , string $machine = ? ) : void

Met en pause un service. Requiert des privilèges d'administrateur ou un compte avec les droits appropriés définis dans l'ACL du service.

Liste de paramètres

servicename

Le nom court du service.

machine

Nom de la machine (optionnel). Si omis, la machine locale sera utilisée.

Valeurs de retour

Aucune valeur n'est retournée.

Avant la version 1.0.0, retournait WIN32_NO_ERROR on success, false if there is a problem with the parameters or a Win32 Error Code on failure.

Erreurs / Exceptions

Une ValueError est levée si la valeur du paramètre servicename est vide.

Une Win32ServiceException est levée en cas d'erreur.

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.
PECL win32service 1.0.0 | Le type de retour est maintenant void, avant il était mixed.
PECL win32service 0.3.0 | Cette fonction ne requiert plus de compte d'administrateur si l'ACL est défini pour un autre compte.

Voir aussi

  • win32_start_service() - Démarre un service
  • win32_stop_service() - Arrête un service
  • win32_continue_service() - Reprise d'un service en pause
  • win32_send_custom_control() - Envoyer un contrôle personnalisé au service
  • Les codes erreur Win32

User Contributed Notes

There are no user contributed notes for this page.


Questionne le statut d'un service

  • « win32_pause_service
  • win32_send_custom_control »
  • PHP Manual
  • Fonctions win32service
  • Questionne le statut d'un service

win32_query_service_status

(PECL win32service >=0.1.0)

win32_query_service_status — Questionne le statut d'un service

Description

win32_query_service_status ( string $servicename , string $machine = ? ) : array

Questionne le statut courant pour un service, retournant un tableau d'informations.

Liste de paramètres

servicename

Le nom court du service.

machine

Le nom optionnel de la machine. Si oublié, cela utilisera la machine locale.

Valeurs de retour

Retourne un tableau contenant les informations suivantes en cas de succès.

Avant la version 1.0.0, false if there is a problem with the parameters or a Win32 Error Code on failure.

ServiceType

Le dwServiceType. Voir les masques de type de service Win32Service.

CurrentState

Le dwCurrentState. Voir les constantes de statut des services Win32Service.

ControlsAccepted

Quels contrôles de service sont acceptés par le service. Voir les masques acceptés pour les messages de contrôle de service Win32Service.

Win32ExitCode

Si le service quitte, le code de retour du processus. Cette valeur est égale à WIN32_ERROR_SERVICE_SPECIFIC_ERROR si le mode de sortie n'est pas gracieux. Voir codes d'erreur Win32Service et win32_set_service_exit_mode().

ServiceSpecificExitCode

Si le service quitte avec une condition d'erreur, le code spécifique du service qui sera enregistré dans le journal d'évènements est visible ici. Cette valeur est égale à la valeur définie par win32_set_service_exit_code().

CheckPoint

Si le service s'arrête, garde le nombre courant de point de contrôle. Ceci est utilisé par SCM comme un genre de battement de coeur pour détecter un processus de service arrêté. La valeur du point de contrôle est mieux interprétée en conjonction avec la valeur WaitHint.

WaitHint

Si le service s'arrête, il fixera un WaitHint à une valeur de point de contrôle qui indiquera l'exécution 100%. Cela peut être utilisé pour implanter un indicateur de progrès.

ProcessId

L'identifiant de processus de fenêtre. Si 0, le processus ne fonctionne pas.

ServiceFlags

Le dwServiceFlags. Voir les constantes utilisées pour les drapeaux des services Win32Service.

Erreurs / Exceptions

Une ValueError est levée si la valeur du paramètre servicename est vide.

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.
PECL win32service 1.0.0 | Le type de retour est maintenant array, avant il était mixed.

Voir aussi

  • Les constantes Win32Service prédéfinies

User Contributed Notes

demers dot alex at gmail dot com 21-Jul-2009 08:39
This function will return an array containing the above information as a return value, but if this fails it will return an integer which is a System Error Code. All the System Error Codes can be found here:

http://msdn.microsoft.com/en-us/library/ms681381%28VS.85%29.aspx

In my case, it returned 5, in which I immediately knew why and fixed the issue right away.

In the case of mnemotronic at netscape dot net, here in the documentation notes, it returned 1060 which is:

ERROR_SERVICE_DOES_NOT_EXIST
1060 (0x424)
The specified service does not exist as an installed service.

Again, it should not return FALSE, instead an System Error Code for Windows.


Envoyer un contrôle personnalisé au service

  • « win32_query_service_status
  • win32_set_service_exit_code »
  • PHP Manual
  • Fonctions win32service
  • Envoyer un contrôle personnalisé au service

win32_send_custom_control

(PECL win32service >=0.4.0)

win32_send_custom_control — Envoyer un contrôle personnalisé au service

Description

win32_send_custom_control ( string $servicename , int $control , string $machine = ? ) : void

Voir » Microsoft ControlService function pour plus de détails.

Liste de paramètres

servicename

Le nom abrégé du service.

control

La valeur de contrôle personnalisé entre 128 et 255.

machine

Nom de la machine en option. Si omis, l'ordinateur local est utilisé.

Valeurs de retour

Aucune valeur n'est retournée.

Avant la version 1.0.0, retournait WIN32_NO_ERROR on success, false if there is a problem with the parameters or a Win32 Error Code on failure.

Erreurs / Exceptions

Avant la version 1.0.0, si la valeur de contrôle n'est pas compris entre 128 et 255, cette fonction émet une erreur de niveau E_ERROR.

Une ValueError est levée si la valeur du paramètre servicename est vide.

Une ValueError est levé si la valeur du paramètre control n'est pas entre 128 et 255.

Une Win32ServiceException est levée en cas d'erreur.

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.
PECL win32service 1.0.0 | Le type de retour est maintenant void, avant il était mixed.

Voir aussi

  • win32_start_service() - Démarre un service
  • win32_stop_service() - Arrête un service
  • win32_pause_service() - Met en pause un service
  • win32_continue_service() - Reprise d'un service en pause
  • Win32 Error Codes

User Contributed Notes

There are no user contributed notes for this page.


Définir ou renvoyer le code de sortie pour le service en cours d'exécution

  • « win32_send_custom_control
  • win32_set_service_exit_mode »
  • PHP Manual
  • Fonctions win32service
  • Définir ou renvoyer le code de sortie pour le service en cours d'exécution

win32_set_service_exit_code

(PECL win32service >=0.4.0)

win32_set_service_exit_code — Définir ou renvoyer le code de sortie pour le service en cours d'exécution

Description

win32_set_service_exit_code ( int $exitCode = 1 ) : int

Change ou retourne le code de sortie. Le code de sortie est utilisé uniquement si le mode de sortie n'est pas gracieux. Si la valeur n'est pas zéro, la configuration de récupération peut être utilisée après l'échec du service. Voir » les codes d'erreur système Microsoft pour plus de détails

Attention

Cette fonction fonctionne uniquement dans SAPI "cli". Sur d'autres SAPI, cette fonction est désactivée.

Liste de paramètres

exitCode

Le code de retour utilisé à la sortie.

Valeurs de retour

Retourne le code de sortie actuel ou l'ancien.

Erreurs / Exceptions

Avant la version 1.0.0, si cette fonction est utilisé en dehors du SAPI "cli", une erreur E_ERROR sera émise.

À partir de la version 1.0.0, lancera une Win32ServiceException si le SAPI n'est pas "cli"

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.

Voir aussi

  • win32_start_service_ctrl_dispatcher() - Enregistre un script avec SCM, alors il peut être interprété en tant que service avec le nom donné
  • win32_set_service_status() - Met à jour le statut d'un service
  • win32_set_service_exit_mode() - Définir ou renvoyer le mode de sortie pour le service en cours d'exécution

User Contributed Notes

There are no user contributed notes for this page.


Définir ou renvoyer le mode de sortie pour le service en cours d'exécution

  • « win32_set_service_exit_code
  • win32_set_service_status »
  • PHP Manual
  • Fonctions win32service
  • Définir ou renvoyer le mode de sortie pour le service en cours d'exécution

win32_set_service_exit_mode

(PECL win32service >=0.4.0)

win32_set_service_exit_mode — Définir ou renvoyer le mode de sortie pour le service en cours d'exécution

Description

win32_set_service_exit_mode ( bool $gracefulMode = true ) : bool

Si le paramètre gracefulMode est fourni, le mode de sortie est modifié. Lorsque le mode de sortie n'est pas gracefuly, le code de sortie utilisé peut être défini avec la fonction win32_set_service_exit_code().

Attention

Cette fonction fonctionne uniquement dans SAPI "cli". Sur d'autres SAPI, cette fonction est désactivée.

Liste de paramètres

gracefulMode

true pour la sortie gracieuse. false pour la sortie avec erreur.

Valeurs de retour

Retournez le mode de sortie actuel ou ancien.

Erreurs / Exceptions

Avant la version 1.0.0, si cette fonction est utilisé en dehors du SAPI "cli", une erreur E_ERROR sera émise.

À partir de la version 1.0.0, lancera une Win32ServiceException si le SAPI n'est pas "cli"

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.

Voir aussi

  • win32_start_service_ctrl_dispatcher() - Enregistre un script avec SCM, alors il peut être interprété en tant que service avec le nom donné
  • win32_set_service_status() - Met à jour le statut d'un service
  • win32_set_service_exit_code() - Définir ou renvoyer le code de sortie pour le service en cours d'exécution

User Contributed Notes

There are no user contributed notes for this page.


Met à jour le statut d'un service

  • « win32_set_service_exit_mode
  • win32_start_service_ctrl_dispatcher »
  • PHP Manual
  • Fonctions win32service
  • Met à jour le statut d'un service

win32_set_service_status

(PECL win32service >=0.1.0)

win32_set_service_status — Met à jour le statut d'un service

Description

win32_set_service_status ( int $status , int $checkpoint = 0 ) : void

Informe le SCM d'un statut courant d'un service qui fonctionne. Cet appel est seulement valide pour un processus de service qui fonctionne.

Attention

Depuis la version 0.2.0, cette fonction fonctionne uniquement en ligne de commande. Elle est désactivé dans les autres cas.

Liste de paramètres

status

Le code de statut de service, un de WIN32_SERVICE_RUNNING, WIN32_SERVICE_STOPPED, WIN32_SERVICE_STOP_PENDING, WIN32_SERVICE_START_PENDING, WIN32_SERVICE_CONTINUE_PENDING, WIN32_SERVICE_PAUSE_PENDING, WIN32_SERVICE_PAUSED.

checkpoint

Cette valeur sera incrémentée par le service périodiquement pour reporter sa progression lors des opérations de démarrage, d'arrêt, de pause ou de reprise. Par exemple, le service incrémentera cette valeur lorsqu'il aura terminé chaque étape de son initialisation lors de son démarrage.

checkpoint n'est valide que lorsque status est une des constantes suivantes : WIN32_SERVICE_STOP_PENDING, WIN32_SERVICE_START_PENDING, WIN32_SERVICE_CONTINUE_PENDING ou WIN32_SERVICE_PAUSE_PENDING.

Valeurs de retour

Aucune valeur n'est retournée.

Avant la version 1.0.0, retournait WIN32_NO_ERROR on success, false if there is a problem with the parameters or a Win32 Error Code on failure.

Erreurs / Exceptions

Avant la version 1.0.0, si cette fonction est utilisé en dehors du SAPI "cli", une erreur E_ERROR sera émise.

À partir de la version 1.0.0, lancera une Win32ServiceException si le SAPI n'est pas "cli"

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.
PECL win32service 1.0.0 | Le type de retour est maintenant void, avant il était mixed.
PECL win32service 0.2.0 | Cette fonction fonctionne uniquement en ligne de commande.

Voir aussi

  • win32_start_service_ctrl_dispatcher() - Enregistre un script avec SCM, alors il peut être interprété en tant que service avec le nom donné
  • win32_get_last_control_message() - Retourne le dernier message de contrôle qui a été envoyé à ce service
  • win32_set_service_exit_mode() - Définir ou renvoyer le mode de sortie pour le service en cours d'exécution
  • win32_set_service_exit_code() - Définir ou renvoyer le code de sortie pour le service en cours d'exécution
  • Les constantes de statut des services Win32Service

User Contributed Notes

paul_nelson57071 at yahoo dot com 13-May-2010 11:04
So after much searching I finally found all the peices to make a working windows service & server including:
- Installing & Uninstalling the service
- Starting & Stopping the Service
- Actually running a basic Server
- Responding to windows Service to Stop/Start/Restart

I hope you find this useful! I did this using PHP 5.2 and the PECL library for 5.2 (PHP 5.3 at the time does not have a PECL Library compiled for it)

<?php
    //Service Settings
    $Service = 'MyServiceFinal';
    $Display = 'My PHP Service';

    //Server Settings
    $host = '127.0.0.1';        //Bind to IP #
    $port = 23;                            //On port #
    $max = 20;                            //Maximum Clients

    //Exit if no start-up argument is passed
    if (!isset($argv[1])){ShowHelp(); exit;}

    //Create Windows Service
    if ($argv[1] == 'install') {
    $x = win32_create_service(array(
        'service' => $Service,
        'display' => $Service,
        'params' => __file__ . ' run',
        'path' => 'c:\\php\\php.exe',
    ));
    debug_zval_dump($x);
    echo "Service Installed\n\n";
    exit;

  //Remove Windows Service
    } else if ($argv[1] == 'uninstall') {
        $x = win32_delete_service($Service);
        debug_zval_dump($x);
        echo "Service Removed\n\n";
        exit;

  //Start Windows Service
    } elseif($argv[1] == "start") {
      $x = win32_start_service($Service);
      debug_zval_dump($x);
      echo "Service Started\n\n";
      exit;

    //Stop Windows Service
    } elseif($argv[1] == "stop") {
      $x = win32_stop_service($Service);
      debug_zval_dump($x);
      echo "Service Stopped\n\n";
      exit;

    //Unkown Command
    } else if ($argv[1] != 'run') {
        ShowHelp(); exit();
    }

//Tell windows the service has started...
if (!win32_start_service_ctrl_dispatcher($Service)) die("Could not connect to service : $Service");
win32_set_service_status(WIN32_SERVICE_RUNNING);

// No timeouts, flush content immediatly
set_time_limit(0);
ob_implicit_flush();

//Server Loop
while (1) {
    usleep(500);

    //Handle Windows Service Request
    switch (win32_get_last_control_message()) {
        case WIN32_SERVICE_CONTROL_CONTINUE: break; // Continue server routine
        case WIN32_SERVICE_CONTROL_INTERROGATE: win32_set_service_status(WIN32_NO_ERROR); break; // Respond with status
        case WIN32_SERVICE_CONTROL_STOP: win32_set_service_status(WIN32_SERVICE_STOPPED); exit; // Terminate script
        default: win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED); // Add more cases to handle other service calls
    }
    //Acutal Server Code

}

//Clean up and Exit
win32_set_service_status(WIN32_SERVICE_STOPPED);
exit;

//*************** FUNCTIONS ***************
function ShowHelp(){
    echo "Usage:
    install:\t installs servce
    uninstall:\t deletes service
    start:\t\t Start the windows service
    stop:\t\t Stops the windows service
    run:\t\t called by CMS to run the service

For information on code numbers type 'net helpmsg xxxx'
EXAMPEL: 'net helpmsg 1072'

    ";
}
?>
m dot hald at surfto dot ch 12-May-2008 04:16
On my Machine (Win XP SP2) the function "win32_get_last_control_message" never returns 4 so i will have to reply to 0 also.

finally after mixing several examples i now have a version working woithout filling my event log with errors:

<?php

/*
 * PHP SAMPLE TEMPLATE
 */

/*
 * APP MAIN FUNCTION
 * Called each second after the function last time finished
 * Should not take longer than max 20 seconds to execute
 * ELSE you should call NTServiceResponder(); at least each 20 secs
 * WARNING: NTServiceResponder will exit; if there was a STOP request
 */
function Service_Main()
{
    // YOU APPLICATION CODE HERE !!!
    sleep(1); // dummy something
}

/********************************************************************
 *
 * SERVICE CONTROLLING
 *
 ********************************************************************/

$SERVICE_NAME = "phptestservice";
$SERVICE_DISPLAY = "Test Service with PHP";

// so u can get: $SERVICE_PATH_PARTS["dirname"] $SERVICE_PATH_PARTS["basename"]  $SERVICE_PATH_PARTS["extension"]
$SERVICE_PATH_PARTS = pathinfo(__FILE__);

$SERVICE_PARAMS = " run";

    if (!isset($argv[1]))
    {
        die("this application need to be installed as a service.\n run with param install");
    }

    if ($argv[1] == 'install')
    {
        $x = win32_create_service(array(
                                        'service' => $SERVICE_NAME,
                                        'display' => $SERVICE_DISPLAY,
                                        'params' =>  __FILE__ . $SERVICE_PARAMS,
                                        //'path' =>  $SERVICE_PATH_PARTS["dirname"] . '\php.exe'
                                        ));
        debug_zval_dump($x);
        exit;
    }
    else if ($argv[1] == 'uninstall')
    {
        $x = win32_delete_service('dummyphp');
        debug_zval_dump($x);
        exit;
    }
    else if ($argv[1] != 'run')
    {
        die("bogus args, needs to run as service");
    }

    // Connect to service dispatcher and notify that startup was successful
    if (!win32_start_service_ctrl_dispatcher($SERVICE_NAME)) die('Could not connect to service :'.$SERVICE_NAME);
    win32_set_service_status(WIN32_SERVICE_RUNNING);

    // Main Server Loop
    while (1)
    {
        NTServiceResponder();

        // Main script goes here
        Service_Main();

        sleep(1); // at least 1 sec delay per loop
    }
    win32_set_service_status(WIN32_SERVICE_STOPPED);

/*
 * Response to NTServiceRequests
 */
function NTServiceResponder()
{

    switch (win32_get_last_control_message())
    {
    case 0: // PATCH for: seems never to go to 4 (WIN32_SERVICE_CONTROL_INTERROGATE)
        win32_set_service_status(WIN32_SERVICE_RUNNING);
        return TRUE;
        break;
    case WIN32_SERVICE_CONTROL_CONTINUE:
        return TRUE; // "Continue"
    case WIN32_SERVICE_CONTROL_INTERROGATE:
        win32_set_service_status(WIN32_SERVICE_RUNNING);
        return TRUE; // Respond with status
    case WIN32_SERVICE_CONTROL_STOP:
        win32_set_service_status(WIN32_SERVICE_STOPPED);
        exit; // Terminate script
    default:
        win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED); // Add more cases to handle other service calls
    }

    return FALSE;
}

?>


Enregistre un script avec SCM, alors il peut être interprété en tant que service avec le nom donné

  • « win32_set_service_status
  • win32_start_service »
  • PHP Manual
  • Fonctions win32service
  • Enregistre un script avec SCM, alors il peut être interprété en tant que service avec le nom donné

win32_start_service_ctrl_dispatcher

(PECL win32service >=0.1.0)

win32_start_service_ctrl_dispatcher — Enregistre un script avec SCM, alors il peut être interprété en tant que service avec le nom donné

Description

win32_start_service_ctrl_dispatcher ( string $name , bool $gracefulMode = true ) : void

Lorsque exécuté via le Gestionnaire de Contrôle de Service, un processus de service est requis pour "archiver" avec lui pour établir un service de surveillance et de communication ergonomique. Cette fonction effectue un archivage en démarrant un thread pour gérer les communications de bas niveau avec le gestionnaire de contrôle de service.

Une fois démarré, le processus du service doit faire 2 choses. La première est d'indiquer au Service Control Manager que le service est en cours d'exécution. La seconde est d'appeler la fonction win32_set_service_status() avec la constante WIN32_SERVICE_RUNNING. Si vous avez besoin de lancer des processus longs avant que le service ne soit lancé, alors vous pouvez utiliser la constante WIN32_SERVICE_START_PENDING. La seconde est de continuer à vérifier en utilisant le Service Control Manager sachant qu'il peut déterminer si le service se termine ou non. Ceci consiste à appeler, périodiquement, la fonction win32_get_last_control_message() et à traiter le code retourné.

Attention

Depuis la version 0.2.0, cette fonction fonctionne uniquement en ligne de commande. Elle est désactivé dans les autres cas.

Liste de paramètres

name

Le court nom du service, comme enregistré par win32_create_service().

gracefulMode

true pour la sortie gracieuse. false pour la sortie avec erreur. Voir win32_set_service_exit_mode() pour plus de détails.

Valeurs de retour

Aucune valeur n'est retournée.

Avant la version 1.0.0, retournait WIN32_NO_ERROR on success, false if there is a problem with the parameters or a Win32 Error Code on failure.

Erreurs / Exceptions

Avant la version 1.0.0, si cette fonction est utilisé en dehors du SAPI "cli", une erreur E_ERROR sera émise.

À partir de la version 1.0.0, lancera une Win32ServiceException si le SAPI n'est pas "cli"

Exemples

Exemple #1 Exemple avec win32_start_service_ctrl_dispatcher()

Vérifie si le service fonctionne sous SCM.

<?php
if (!win32_start_service_ctrl_dispatcher('dummyphp')) {
  die("Je ne fonctionne probablement pas sous le gestionnaire de contrôle de service");
}

win32_set_service_status(WIN32_SERVICE_START_PENDING);

// Quelques processus longs à récupérer pendant que le service fonctionne.

win32_set_service_status(WIN32_SERVICE_RUNNING);

while (WIN32_SERVICE_CONTROL_STOP != win32_get_last_control_message()) {
  # effectuer votre travail ici.
  # essayez de ne pas prendre plus de 30 secondes avant de retourner au
}
?>

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.
PECL win32service 1.0.0 | Le type de retour est maintenant void, avant il était mixed.
PECL win32service 0.4.0 | Le paramètre gracefulMode a été ajouté.
PECL win32service 0.2.0 | Cette fonction fonctionne uniquement en ligne de commande.

Voir aussi

  • win32_set_service_status() - Met à jour le statut d'un service
  • win32_get_last_control_message() - Retourne le dernier message de contrôle qui a été envoyé à ce service
  • win32_set_service_exit_mode() - Définir ou renvoyer le mode de sortie pour le service en cours d'exécution
  • win32_set_service_exit_code() - Définir ou renvoyer le code de sortie pour le service en cours d'exécution
  • Les codes erreur Win32

User Contributed Notes

andrea 09-Oct-2009 03:07
Insert value of params between " if the string have a space:

<?php
// First you need to create a service, you only need to do this once
/*
win32_create_service(array(
    'service' => 'myphpservice',
    'display' => 'My PHP Service',
    'params' => '"c:\\my folder\myphpservice.php"',
    'path' => 'c:\\PHP\\php.exe'));
*/
?>
dylan at nopower dot org 14-Jul-2007 07:59
<?php
// First you need to create a service, you only need to do this once
/*
win32_create_service(array(
    'service' => 'myphpservice',
    'display' => 'My PHP Service',
    'params' => 'c:\\myphpservice.php',
    'path' => 'c:\\PHP\\php.exe'));
*/

$myservicename = 'myphpservice';

// Connect to service dispatcher and notify that startup was successful
if (!win32_start_service_ctrl_dispatcher($myservicename)) die('Could not connect to service :'.$myservicename);
win32_set_service_status(WIN32_SERVICE_RUNNING);

// Main Server Loop
while (1) {
    switch (win32_get_last_control_message()) {
        case WIN32_SERVICE_CONTROL_CONTINUE: break; // Continue server routine
        case WIN32_SERVICE_CONTROL_INTERROGATE: win32_set_service_status(WIN32_NO_ERROR); break; // Respond with status
        case WIN32_SERVICE_CONTROL_STOP: win32_set_service_status(WIN32_SERVICE_STOPPED); exit; // Terminate script
        default: win32_set_service_status(WIN32_ERROR_CALL_NOT_IMPLEMENTED); // Add more cases to handle other service calls
    }

    // Main script goes here

    sleep(10); // Run every 10 seconds
}
win32_set_service_status(WIN32_SERVICE_STOPPED);
?>
Guibod 10-Jul-2007 05:41
Don't try to call "win32_start_service_ctrl_dispatcher" too late in your code. You'd trigger a #2186 error : "The service is not responding to the control function." (from commande line) or a #1053 error : "The service did not respond to the start or control request in a timely fashion." (from services GUI).

Try not to load a bunch of PEAR classes before to register php script as Service like I did.

Another good hint, to get a verbose version of the return code, you can call "NET HELPMSG ###" from command line where ### is your error code.


Démarre un service

  • « win32_start_service_ctrl_dispatcher
  • win32_stop_service »
  • PHP Manual
  • Fonctions win32service
  • Démarre un service

win32_start_service

(PECL win32service >=0.1.0)

win32_start_service — Démarre un service

Description

win32_start_service ( string $servicename , string $machine = ? ) : void

Essaie de démarrer le service nommé. Requiert des privilèges d'administrateur ou un compte avec les droits appropriés définis dans l'ACL du service.

Liste de paramètres

servicename

Le nom court du service.

machine

Le nom optionnel de la machine. Si oublié, cela utilisera la machine locale.

Valeurs de retour

Aucune valeur n'est retournée.

Avant la version 1.0.0, retournait WIN32_NO_ERROR on success, false if there is a problem with the parameters or a Win32 Error Code on failure.

Erreurs / Exceptions

Une ValueError est levée si la valeur du paramètre servicename est vide.

Une Win32ServiceException est levée en cas d'erreur.

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.
PECL win32service 1.0.0 | Le type de retour est maintenant void, avant il était mixed.
PECL win32service 0.3.0 | Cette fonction ne requiert plus de compte d'administrateur si l'ACL est défini pour un autre compte.

Voir aussi

  • win32_stop_service() - Arrête un service
  • win32_pause_service() - Met en pause un service
  • win32_continue_service() - Reprise d'un service en pause
  • win32_send_custom_control() - Envoyer un contrôle personnalisé au service
  • Codes erreur Win32

User Contributed Notes

There are no user contributed notes for this page.


Arrête un service

  • « win32_start_service
  • Manipulation XML »
  • PHP Manual
  • Fonctions win32service
  • Arrête un service

win32_stop_service

(PECL win32service >=0.1.0)

win32_stop_service — Arrête un service

Description

win32_stop_service ( string $servicename , string $machine = ? ) : void

Arrête un service nommé. Requiert des privilèges d'administrateur ou un compte avec les droits appropriés définis dans l'ACL du service.

Liste de paramètres

servicename

Le nom court du service.

machine

Le nom optionnel de la machine. Si oublié, cela utilisera la machine locale.

Valeurs de retour

Aucune valeur n'est retournée.

Avant la version 1.0.0, retournait WIN32_NO_ERROR on success, false if there is a problem with the parameters or a Win32 Error Code on failure.

Erreurs / Exceptions

Une ValueError est levée si la valeur du paramètre servicename est vide.

Une Win32ServiceException est levée en cas d'erreur.

Historique

Version | Description
PECL win32service 1.0.0 | Lance une ValueError si un paramètre est invalide, avant false était retourné.
PECL win32service 1.0.0 | Lance une Win32ServiceException en cas d'erreur, avant un Code d'erreur Win32 était retourné.
PECL win32service 1.0.0 | Le type de retour est maintenant void, avant il était mixed.
PECL win32service 0.3.0 | Cette fonction ne requiert plus de compte d'administrateur si l'ACL est défini pour un autre compte.

Voir aussi

  • win32_start_service() - Démarre un service
  • win32_pause_service() - Met en pause un service
  • win32_continue_service() - Reprise d'un service en pause
  • win32_send_custom_control() - Envoyer un contrôle personnalisé au service
  • Codes erreur Win32

User Contributed Notes

There are no user contributed notes for this page.


Manipulation XML

  • DOM — Model Objet d'un document
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Exemples
    • DOMAttr — La classe DOMAttr
    • DOMCdataSection — La classe DOMCdataSection
    • DOMCharacterData — La classe DOMCharacterData
    • DOMComment — La classe DOMComment
    • DOMDocument — La classe DOMDocument
    • DOMDocumentFragment — La classe DOMDocumentFragment
    • DOMDocumentType — La classe DOMDocumentType
    • DOMElement — La classe DOMElement
    • DOMEntity — La classe DOMEntity
    • DOMEntityReference — La classe DOMEntityReference
    • DOMException — La classe DOMException
    • DOMImplementation — La classe DOMImplementation
    • DOMNamedNodeMap — La classe DOMNamedNodeMap
    • DOMNode — La classe DOMNode
    • DOMNodeList — La classe DOMNodeList
    • DOMNotation — La classe DOMNotation
    • DOMProcessingInstruction — La classe DOMProcessingInstruction
    • DOMText — La classe DOMText
    • DOMXPath — La classe DOMXPath
    • DOM Fonctions
  • libxml
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • libXMLError — La classe libXMLError
    • Fonctions libxml
  • SimpleXML
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Exemples
    • SimpleXMLElement — La classe SimpleXMLElement
    • SimpleXMLIterator — La classe SimpleXMLIterator
    • Fonctions SimpleXML
  • WDDX
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Exemples
    • WDDX Fonctions
  • XMLDiff — XML : Différence et fusion
    • Introduction
    • Installation/Configuration
    • XMLDiff\Base — La classe XMLDiff\Base
    • XMLDiff\DOM — La classe XMLDiff\DOM
    • XMLDiff\Memory — La classe XMLDiff\Memory
    • XMLDiff\File — La classe XMLDiff\File
  • Analyseur syntaxique XML
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • gestionnaires d'événements
    • Problèmes de casse
    • Codes d'erreurs
    • Codage des caractères
    • Exemples
    • Fonctions d'analyse de fichier XML
    • XmlParser — The XmlParser class
  • XMLReader
    • Introduction
    • Installation/Configuration
    • XMLReader — La classe XMLReader
  • XMLWriter
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Exemples
    • XMLWriter — La classe XMLWriter
  • XSL
    • Introduction
    • Installation/Configuration
    • Constantes pré-définies
    • Exemples
    • XSLTProcessor — La classe XSLTProcessor

User Contributed Notes

There are no user contributed notes for this page.


Model Objet d'un document

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Exemples
  • DOMAttr — La classe DOMAttr
    • DOMAttr::__construct — Crée un nouvel objet DOMAttr
    • DOMAttr::isId — Vérifie si l'attribut est un identifiant défini
  • DOMCdataSection — La classe DOMCdataSection
    • DOMCdataSection::__construct — Construit un nouvel objet DOMCdataSection
  • DOMCharacterData — La classe DOMCharacterData
    • DOMCharacterData::appendData — Ajoute la chaîne à la fin des données dans le nœud
    • DOMCharacterData::deleteData — Supprime une sous-chaîne dans le nœud
    • DOMCharacterData::insertData — Insère une chaîne à la position spécifiée d'unité 16-bit
    • DOMCharacterData::replaceData — Remplace une sous-chaîne dans le nœud DOMCharacterData
    • DOMCharacterData::substringData — Extrait un morceau de données dans le nœud
  • DOMComment — La classe DOMComment
    • DOMComment::__construct — Crée un nouvel objet DOMComment
  • DOMDocument — La classe DOMDocument
    • DOMDocument::__construct — Crée un nouvel objet DOMDocument
    • DOMDocument::createAttribute — Crée un nouvel attribut
    • DOMDocument::createAttributeNS — Crée un nouvel attribut avec un espace de noms associé
    • DOMDocument::createCDATASection — Crée un nouveau nœud cdata
    • DOMDocument::createComment — Crée un nouveau nœud de commentaire
    • DOMDocument::createDocumentFragment — Crée un nouveau fragment de document
    • DOMDocument::createElement — Crée un nouveau nœud
    • DOMDocument::createElementNS — Crée un nouveau nœud avec un espace de noms associé
    • DOMDocument::createEntityReference — Crée un nouveau nœud de référence d'entité
    • DOMDocument::createProcessingInstruction — Crée un nouveau nœud PI
    • DOMDocument::createTextNode — Crée un nouveau nœud de texte
    • DOMDocument::getElementById — Cherche un élément avec un certain identifiant
    • DOMDocument::getElementsByTagName — Cherche tous les éléments qui ont le nom de la balise locale donné
    • DOMDocument::getElementsByTagNameNS — Recherche tous les éléments avec un nom de balise donné dans un espace de noms spécifié
    • DOMDocument::importNode — Importe un nœud dans le document courant
    • DOMDocument::load — Charge du XML depuis un fichier
    • DOMDocument::loadHTML — Charge du code HTML à partir d'une chaîne de caractères
    • DOMDocument::loadHTMLFile — Charge du HTML à partir d'un fichier
    • DOMDocument::loadXML — Charge du XML depuis une chaîne de caractères
    • DOMDocument::normalizeDocument — Normalise le document
    • DOMDocument::registerNodeClass — Enregistre la classe étendue utilisée pour créer un type de base de nœud
    • DOMDocument::relaxNGValidate — Effectue une validation relaxNG sur le document
    • DOMDocument::relaxNGValidateSource — Effectue une validation relaxNG sur le document
    • DOMDocument::save — Sauvegarde l'arbre interne XML dans un fichier
    • DOMDocument::saveHTML — Sauvegarde le document interne dans une chaîne en utilisant un formatage HTML
    • DOMDocument::saveHTMLFile — Sauvegarde un document interne dans un fichier en utilisant un formatage HTML
    • DOMDocument::saveXML — Sauvegarde l'arbre interne XML dans une chaîne de caractères
    • DOMDocument::schemaValidate — Valide un document selon un schéma. Seuls les schémas XML 1.0 sont supportés.
    • DOMDocument::schemaValidateSource — Valide un document selon un schéma
    • DOMDocument::validate — Valide un document en se basant sur sa DTD
    • DOMDocument::xinclude — Remplace les XIncludes dans un objet DOMDocument
  • DOMDocumentFragment — La classe DOMDocumentFragment
    • DOMDocumentFragment::appendXML — Ajoute des données XML
  • DOMDocumentType — La classe DOMDocumentType
  • DOMElement — La classe DOMElement
    • DOMElement::__construct — Crée un nouvel objet DOMElement
    • DOMElement::getAttribute — Retourne la valeur d'un attribut
    • DOMElement::getAttributeNode — Retourne le nœud d'attribut
    • DOMElement::getAttributeNodeNS — Retourne le nœud d'attribut
    • DOMElement::getAttributeNS — Retourne la valeur de l'attribut
    • DOMElement::getElementsByTagName — Retourne les éléments par leur nom de balise
    • DOMElement::getElementsByTagNameNS — Récupère les éléments par leur espace de noms et leur localName
    • DOMElement::hasAttribute — Vérifie si un attribut existe
    • DOMElement::hasAttributeNS — Vérifie si un attribut existe
    • DOMElement::removeAttribute — Efface un attribut
    • DOMElement::removeAttributeNode — Efface un attribut
    • DOMElement::removeAttributeNS — Efface un attribut
    • DOMElement::setAttribute — Ajoute un nouvel attribut
    • DOMElement::setAttributeNode — Ajoute un nouvel attribut à l'élément
    • DOMElement::setAttributeNodeNS — Ajoute un nouvel attribut à l'élément
    • DOMElement::setAttributeNS — Ajoute un nouvel attribut
    • DOMElement::setIdAttribute — Déclare l'attribut spécifié par son nom à être de type ID
    • DOMElement::setIdAttributeNode — Déclare l'attribut spécifié par le nœud à être de type ID
    • DOMElement::setIdAttributeNS — Déclare l'attribut spécifié par son nom local et son espace de nom URI à être de type ID
  • DOMEntity — La classe DOMEntity
  • DOMEntityReference — La classe DOMEntityReference
    • DOMEntityReference::__construct — Crée un nouvel objet DOMEntityReference
  • DOMException — La classe DOMException
  • DOMImplementation — La classe DOMImplementation
    • DOMImplementation::__construct — Crée un nouvel objet DOMImplementation
    • DOMImplementation::createDocument — Crée un objet DOM Document du type spécifié avec ses éléments
    • DOMImplementation::createDocumentType — Crée un objet DOMDocumentType vide
    • DOMImplementation::hasFeature — Teste si l'implémentation DOM implémente une fonctionnalité spécifique
  • DOMNamedNodeMap — La classe DOMNamedNodeMap
    • DOMNamedNodeMap::count — Récupère le nombre de nœuds dans la collection non triée (map)
    • DOMNamedNodeMap::getNamedItem — Retourne un nœud spécifié par son nom
    • DOMNamedNodeMap::getNamedItemNS — Retourne un nœud spécifié par son nom local et son espace de noms
    • DOMNamedNodeMap::item — Retourne un nœud selon son index
  • DOMNode — La classe DOMNode
    • DOMNode::appendChild — Ajoute un nouveau fils à la fin des fils
    • DOMNode::C14N — Canonise des nœuds en une chaîne
    • DOMNode::C14NFile — Canonise des nœuds en fichier
    • DOMNode::cloneNode — Clone un nœud
    • DOMNode::getLineNo — Lit le numéro de ligne d'un noeud
    • DOMNode::getNodePath — Récupère un XPath pour un nœud
    • DOMNode::hasAttributes — Vérifie si le noeud possède un attribut
    • DOMNode::hasChildNodes — Vérifie si le noeud possède des enfants
    • DOMNode::insertBefore — Ajoute un nouveau fils avant le nœud référencé
    • DOMNode::isDefaultNamespace — Vérifie si l'espace de nom spécifié est l'espace de noms par défaut ou non
    • DOMNode::isSameNode — Indique si deux nœuds sont identiques
    • DOMNode::isSupported — Vérifie si la fonctionnalité est disponible pour la version spécifiée
    • DOMNode::lookupNamespaceUri — Retourne l'URI de l'espace de noms selon le préfixe
    • DOMNode::lookupPrefix — Retourne le préfixe de l'espace de noms selon l'URI de l'espace de noms
    • DOMNode::normalize — Normalise le noeud
    • DOMNode::removeChild — Supprime un fils de la liste des enfants
    • DOMNode::replaceChild — Remplace un fils
  • DOMNodeList — La classe DOMNodeList
    • DOMNodeList::count — Récupère le nombre de nœuds dans la collection triée (list)
    • DOMNodeList::item — Retourne un nœud spécifié par son index
  • DOMNotation — La classe DOMNotation
  • DOMProcessingInstruction — La classe DOMProcessingInstruction
    • DOMProcessingInstruction::__construct — Crée un nouvel objet DOMProcessingInstruction
  • DOMText — La classe DOMText
    • DOMText::__construct — Crée un nouvel objet DOMText
    • DOMText::isElementContentWhitespace — Rapporte si le nœud textuel contient des caractères d'espacement blanc
    • DOMText::isWhitespaceInElementContent — Indique si ce noeud de texte contient des espaces blancs
    • DOMText::splitText — Coupe le nœud en deux nœuds à l'endroit spécifié
  • DOMXPath — La classe DOMXPath
    • DOMXPath::__construct — Crée un nouvel objet DOMXPath
    • DOMXPath::evaluate — Évalue une expression XPath donnée et retourne un résultat typé si possible
    • DOMXPath::query — Évalue l'expression XPath donnée
    • DOMXPath::registerNamespace — Enregistre l'espace de noms avec l'objet DOMXPath
    • DOMXPath::registerPhpFunctions — Enregistre une fonction PHP comme fonction XPath
  • DOM Fonctions
    • dom_import_simplexml — Transforme un objet SimpleXMLElement en un objet DOMElement

User Contributed Notes

chealer at gmail dot com 05-Jul-2018 05:12
This extension allows editing an HTML snippet, for example removing an element:
??$dom = new DOMDocument();
??$dom->loadHTML('keep<b id="simple">REMOVE</b>');
$??remove = $dom->getElementById('simple');
??$dom->removeChild($??remove);
echo ??$dom->saveHTML();
...would output "keep".

But it does not preserve formatting. If your code defines attributes using double quotes, saveHTML() may for instance return single quotes instead.
emmanuellutula at hotmail dot com 24-Apr-2018 04:35
If you want to  use DOMDocument in your PHPUnit Tests drive on Symfony Controller (testing form)! Use like :

namespace Tests\YourBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use YourBundle\Controller\TextController;

class DefaultControllerTest extends WebTestCase
{
    public function testIndex()
    {
        $client = static::createClient(array(), array());

        $crawler = $client->request('GET', '/text/add');
        $this->assertTrue($crawler->filter("form")->count() > 0, "Text form exist !");

        $form = $crawler->filter("form")->form();

        $domDocument = new \DOMDocument;

        $domInput = $domDocument->createElement('input');
        $dom = $domDocument->appendChild($domInput);
        $dom->setAttribute('slug', 'bloc');

        $formInput = new \Symfony\Component\DomCrawler\Field\InputFormField($domInput);
        $form->set($formInput);

        $crawler = $client->submit($form);

        if ($client->getResponse()->isRedirect())
        {
            $crawler = $client->followRedirect(false);
        }

       // $this->assertTrue($client->getResponse()->isSuccessful());
        //$this->assertEquals(200, $client->getResponse()->getStatusCode(),
        //             "Unexpected HTTP status code for GET /backoffice/login");

    }
}
ohcc at 163 dot com 29-Oct-2015 05:31
<?php
    // this note is about how to get a DOMNode's outerHTML and innerHTML.
    $dom = new DOMDocument('1.0','UTF-8');
    $dom->loadHTML('<html><body><div><p>p1</p><p>p2</p></div></body></html>');
    $node = $dom->getElementsByTagName('div')->item(0);
    $outerHTML = $node->ownerDocument->saveHTML($node);
    $innerHTML = '';
    foreach ($node->childNodes as $childNode){
        $innerHTML .= $childNode->ownerDocument->saveHTML($childNode);
    }
    echo '<h2>outerHTML: </h2>';
    echo htmlspecialchars($outerHTML);
    echo '<h2>innerHTML: </h2>';
    echo htmlspecialchars($innerHTML);
?>
super dot puma at gmail dot com 13-May-2014 04:57
If  you want to print the DOM XML file content, you can use the next code:

$doc = new DOMDocument();
$doc->load($xmlFileName);
echo "<br>" . $doc->documentURI;
$x = $doc->documentElement;
getNodeContent($x->childNodes, 0);

function getNodeContent($nodes, $level){
    foreach ($nodes AS $item) {
    //  print "<br><br>TIPO: " . $item->nodeType ;
      printValues($item, $level);
      if ($item->nodeType == 1) { //DOMElement
          foreach ($item->attributes AS $itemAtt) {
              printValues($itemAtt, $level+3);
          }
          if($item->childNodes || $item->childNodes->lenth > 0) {
              getNodeContent($item->childNodes, $level+5);
          }
      }
    }
}

function printValues($item, $level){
    if ($item->nodeType == 1) { //DOMElement
        printLevel($level);
        print $item->nodeName . " = " . $item->nodeValue;
    }
    if ($item->nodeType == 2) { //DOMAttr
        printLevel($level);
        print $item->name . " = " . $item->value ;
    }
    if ($item->nodeType == 3) { //DOMText
      if ($item->isWhitespaceInElementContent() == false){
        printLevel($level);
        print $item->wholeText ;
      }
    }
}

function printLevel($level)
{
    print "<br>";
    if ($level == 0) {
        print "<br>";
    }
    for($i=0; $i < $level; $i++) {
        print "-";
    }
}
Drupella 16-Sep-2011 09:18
Here is a fast innerHTML function that returns the result without iterating over child nodes.

<?php
function innerHTML($el) {
  $doc = new DOMDocument();
  $doc->appendChild($doc->importNode($el, TRUE));
  $html = trim($doc->saveHTML());
  $tag = $el->nodeName;
  return preg_replace('@^<' . $tag . '[^>]*>|</' . $tag . '>$@', '', $html);
}
?>

Example
<?php
$doc = new DOMDocument();
// A corrupt HTML string
$doc->loadHTML('<HTML><A HREF="ss">asd</A>');
$body = $doc->getElementsByTagName('body')->item(0);
print htmlspecialchars(innerHTML($body));
// Prints <a href="ss">asd</a>
?>
ben_demott at hotmail dot com 23-Apr-2010 01:36
A function among several others to parse a google results page, I wrote this some time ago - google has probably changed their site since then, but I thought this might be helpful to someone.

I'm moving servers, but I will probably throw this up on my blog when I get it back up.

<?php

function googleResult($listItem) {
    // given a LIST ITEM element, this will validate, and return an array for that LI entry as an inline result from google.
    /*
     * <li class='g w0'>
     *   <h3 class='r'>
     *     <a href='the URL' class='l'>
     *       Description <em>description</em>
     *     </a>
     *   </h3>
     * </li>
     *
       UPDATE:
       This function will now look for any subcontainer that has an href, it doesn't have to be an H3
       this will make it work with a few more formatted search results.
     */

    $listItem = $listItem->childNodes;
        // Yes I don't use instanceof - I guess you'll have to deal.
    foreach($listItem as $element) {
        if(is_object($element) && get_class($element) == 'DOMElement' && $element->hasChildNodes()) {
            $hrefContainer = $element->childNodes;
            foreach($hrefContainer as $element2) {
                if(is_object($element2) && get_class($element2) == 'DOMElement' && $element2->nodeName == 'a' && $element2->hasAttribute('href')) {
                    $anchor = $element2;
                    unset($h3);
                    unset($element2);
                    break;
                } else {
                  //print __LINE__ ." :: Breaking out of loop (normal result) element is not an annchor Element='".$element2->nodeName."'\n";
                }
            }
            unset($element);
            unset($listItem);
            break;
        }
    }
    if(empty($anchor) || !is_object($anchor) || get_class($anchor) != 'DOMElement') {
        //print __LINE__ ." :: Returning false, did not locate anchor through iteration...";
        return false;
    }
    $href = $anchor->getAttribute('href');
    if(empty($href)) {
        //print __LINE__ ." :: Found anchor object, could not read href attribute / href is empty? href='$href'\n";
        return false;
    }
    $description = $anchor->childNodes;
    $urlDescription = '';
    foreach($description as $words) {
        $name =  trim($words->nodeName);
        if($name == 'em' || $name == '#text' || $name == 'b') {
            if(!empty($words->nodeValue)) {
                $text = trim($words->nodeValue);
                $urlDescription = $urlDescription . $text . ' ';
            }
        }
    }
    $urlDescription = htmlspecialchars_decode($urlDescription, ENT_QUOTES);
    $urlDescription = trim($urlDescription);
    return array('description' => $urlDescription, 'href' => $href);
}
sweisman at pobox dot com 24-Sep-2009 01:19
I had problems with the dom2array_full function by "nospam at ya dot ru". Here's my function, which works correctly for my project, and might work for yours:

<?php
function dom_to_array($root)
{
    $result = array();

    if ($root->hasAttributes())
    {
        $attrs = $root->attributes;

        foreach ($attrs as $i => $attr)
            $result[$attr->name] = $attr->value;
    }

    $children = $root->childNodes;

    if ($children->length == 1)
    {
        $child = $children->item(0);

        if ($child->nodeType == XML_TEXT_NODE)
        {
            $result['_value'] = $child->nodeValue;

            if (count($result) == 1)
                return $result['_value'];
            else
                return $result;
        }
    }

    $group = array();

    for($i = 0; $i < $children->length; $i++)
    {
        $child = $children->item($i);

        if (!isset($result[$child->nodeName]))
            $result[$child->nodeName] = dom_to_array($child);
        else
        {
            if (!isset($group[$child->nodeName]))
            {
                $tmp = $result[$child->nodeName];
                $result[$child->nodeName] = array($tmp);
                $group[$child->nodeName] = 1;
            }

            $result[$child->nodeName][] = dom_to_array($child);
        }
    }

    return $result;
}
?>
odessa131 at aol dot nospam dot com 20-Sep-2009 06:49
I had the hardest time updating a complex XML document. Here's a quick example on how to do it.

<?php

// Load the XML from a file.
$xml = "a2062.xml"; // This is an XFDL form previously unencoded and ungzipped.
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->Load($xml);

// Create an XPath query.
// Note: you must define the namespace if the XML document has defined namespaces.
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('xfdl', "http://www.PureEdge.com/XFDL/6.5");

// Locate the value for the first Item Description field.
$query = "//xfdl:page/xfdl:field[@sid='ITEMDESA']/xfdl:value";
$nodeList = $xpath->query($query);

$nodeList->item(0)->nodeValue = "This is the text in the value node of the first Item Description field inside the DA 2062 PureEdge form.";

$dom->save($xml);

?>

I hope this helps someone.
philipwaynerollins at gmail dot com 29-Jul-2009 02:06
You can get the "innerHTML" by nodeValue so

<?php
    $doc = new DOMDocument( );
    $ele = $doc->createElement( 'p', 'Sensei Ninja' );
    print $ele->nodeValue;
?>

You can even set it if you want

<?php
    $doc = new DOMDocument( );
    $ele = $doc->createElement( 'p' );
    $ele->nodeValue = 'Sensei Ninja';
    $doc->appendChild( $ele );
    print $doc->saveHTML( );
?>
Junior 20-Mar-2009 01:26
innerHTML in PHP DOM

<?php
function DOMinnerHTML($element)
{
    $innerHTML = "";
    $children = $element->childNodes;
    foreach ($children as $child)
    {
        $tmp_dom = new DOMDocument();
        $tmp_dom->appendChild($tmp_dom->importNode($child, true));
        $innerHTML.=trim($tmp_dom->saveHTML());
    }
    return $innerHTML;
}
?>

Example:

<?php
$dom= new DOMDocument();
$dom->load($html_string);
$dom->preserveWhiteSpace = false;

$domTable = $dom->getElementsByTagName("table");

foreach ($domTable as $tables)
{
    echo DOMinnerHTML($tables);
}
?>
nospam at ya dot ru 06-Jan-2009 10:18
<?PHP
function dom2array_full($node){
    $result = array();
    if($node->nodeType == XML_TEXT_NODE) {
        $result = $node->nodeValue;
    }
    else {
        if($node->hasAttributes()) {
            $attributes = $node->attributes;
            if(!is_null($attributes))
                foreach ($attributes as $index=>$attr)
                    $result[$attr->name] = $attr->value;
        }
        if($node->hasChildNodes()){
            $children = $node->childNodes;
            for($i=0;$i<$children->length;$i++) {
                $child = $children->item($i);
                if($child->nodeName != '#text')
                if(!isset($result[$child->nodeName]))
                    $result[$child->nodeName] = dom2array($child);
                else {
                    $aux = $result[$child->nodeName];
                    $result[$child->nodeName] = array( $aux );
                    $result[$child->nodeName][] = dom2array($child);
                }
            }
        }
    }
    return $result;
}
?>
fantasyman3000 at gmail dot com 06-Dec-2008 05:37
In response to "simlee at indiana dot edu",
- First of all thanks for sharing your funciton.
- It didn't work for me so i rewrite it from scratch using different method.

Here is the new version, hope it helps someone :

<?php
/**
* result sample : /html[1]/body[1]/span[1]/fieldset[1]/div[1]
* @return string
*/
function getNodeXPath( $node ) {
    $result='';
    while ($parentNode = $node->parentNode) {
        $nodeIndex=-1;
        $nodeTagIndex=0;
        do {
            $nodeIndex++;
            $testNode = $parentNode->childNodes->item( $nodeIndex );

            if ($testNode->nodeName==$node->nodeName and $testNode->parentNode->isSameNode($node->parentNode) and $testNode->childNodes->length>0) {
                //echo "{$testNode->parentNode->nodeName}-{$testNode->nodeName}-{}<br/>";
                $nodeTagIndex++;
            }

        } while (!$node->isSameNode($testNode));

        $result="/{$node->nodeName}[{$nodeTagIndex}]".$result;
        $node=$parentNode;
    };
    return $result;
}
?>

By Sina.Salek.ws
miguelangelhdz at NOSPAM dot com 22-Sep-2008 06:19
After searching how to extend the DOMDocument and DOMElement I found a way in the bug: http://bugs.php.net/bug.php?id=35104. The following code shows how:

<?php
class extDOMDocument extends DOMDocument {
 public function createElement($name, $value=null) {
  $orphan = new extDOMElement($name, $value); // new  sub-class object
  $docFragment = $this->createDocumentFragment(); // lightweight container maintains "ownerDocument"
  $docFragment->appendChild($orphan); // attach
  $ret = $docFragment->removeChild($orphan); // remove
  return $ret; // ownerDocument set; won't be destroyed on  method exit
 }
 // .. more class definition
}

class extDOMElement extends DOMElement {
 function __construct($name, $value='', $namespaceURI=null) {
  parent::__construct($name, $value, $namespaceURI);
 }
  //  ... more class definition here
}

$doc = new extDOMDocument('test');
$el = $doc->createElement('tagname');
$el->setAttribute("attr", "val");
$doc->appendChild($el);

// append discards the DOMDocumentFragment and just adds its child nodes, but ownerDocument is maintained.
echo get_class($el)."<br/>";
echo get_class($doc->documentElement)."<br/>";
echo "<xmp>".$doc->saveXML()."</xmp>";
?>
tobiasz.cudnik[at]gmail.com 29-Jul-2008 06:47
If you need simple interface to DOM check out phpQuery - jQuery port to PHP:
http://code.google.com/p/phpquery/

It uses CSS selectors to fetch nodes.
Here's example how it works:
<?php
// just one file to include
require('phpQuery/phpQuery.php');

$html = '
<div>
    mydiv
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
</div>';

// intialize new DOM from markup
phpQuery::newDocument($markup)
    ->find('ul > li')
        ->addClass('my-new-class')
        ->filter(':last')
            ->addClass('last-li');

// query all unordered lists in last used DOM
pq('ul')->insertAfter('div');

// iterate all LIs from last used DOM
foreach(pq('li') as $li) {
    // iteration returns plain DOM nodes, not phpQuery objects
    pq($li)->addClass('my-second-new-class');
}

// same as pq('anything')->htmlOuter()
// but on document root (returns doctype etc)
print phpQuery::getDocument();
?>

It uses DOM extension and XPath so it works only in PHP5.
Sven Arduwie 16-Mar-2008 06:28
I needed a function that quickly converts an xml with key/value pairs to an array.

for example:
<?xml version="1.0" encoding="UTF-8"?>
<test>
    <key id="Array key #1" value="Value #1"/>
    <key id="Array key #2" value="Value #2"/>
    <key id="Dupe" value="Duplicate keys"/>
    <key id="Dupe" value="create numeric arrays"/>
    <key id="And another key">
        <![CDATA[
            Multiline
            data
            works
            just
            as
            well.
        ]]>
    </key>
    <nested>
        <key id="Nested key" value="Nested data works as well, but it still results in a 1 dimensional array."/>
    </nested>
</test>

Results in the following array:
array(5) {
  ["Array key #1"]=>
  string(8) "Value #1"
  ["Array key #2"]=>
  string(8) "Value #2"
  ["Dupe"]=>
  array(2) {
    [0]=>
    string(14) "Duplicate keys"
    [1]=>
    string(21) "create numeric arrays"
  }
  ["And another key"]=>
  string(49) "Multiline
            data
            works
            just
            as
            well."
  ["Nested key"]=>
  string(73) "Nested data works as well, but it still results in a 1 dimensional array."
}

Here's the code:
<?php
    function xml2array($xml) {
        $domDocument = new DOMDocument;
        $domDocument->loadXML($xml);
        $domXPath = new DOMXPath($domDocument);
        $array = array();
        foreach ($domXPath->query('//key') as $keyDOM) {
            $id = $keyDOM->getAttribute('id');
            $value = $keyDOM->hasAttribute('value') ? $keyDOM->getAttribute('value') : trim($keyDOM->textContent);
            if (array_key_exists($id, $array)) {
                if (is_array($array[$id])) {
                    $array[$id][] = $value;
                } else {
                    $array[$id] = array($array[$id]);
                    $array[$id][] = $value;
                }
            } else {
                $array[$id] = $value;
            }
        }
        return $array;
    }
?>
danf dot 1979 at []gmail[] dot com 24-Feb-2008 07:47
This is a couple of classes to deal with yahoo yui menu.

/*
  $menubar = new MenuBar();

  $file = new Menu("File");
  $file->setAttribute("href", "http://file.com");

  $quit = new Menu("Quit");
  $quit->setAttribute("href", "http://quit.com");

  $file->appendChild($quit);
  $menubar->appendChild($file);

  echo $menubar->grab();
*/

//
// Author: Daniel Queirolo.
// LGPL
//

/** ---------------------------------
/**  Class MenuBar()
/**  Creates a the menubar and appends
/**  yuimenubaritems to it.
/** ---------------------------------*/

class MenuBar extends DOMDocument
{

  public $menuID = "nav_menu";  // holds the css id that javascript yui menu code should have to recognize
  private $UL;                  // This node holds every menu, This is THE node.

  /** ---------------------------------
  /**  Constructor
  /**  Generates a menubar skeleton and the UL node
  /** ---------------------------------*/

  public function __construct() {

    parent::__construct();

    $rootdiv = parent::createElement("div");
    $rootdiv->setAttribute("class", "yui-skin-sam");

    parent::appendChild($rootdiv);

    $yui_menubar = parent::createElement("div");
    $yui_menubar->setAttribute("id", $this->menuID);
    $yui_menubar->setAttribute("class", "yuimenubar");

    $rootdiv->appendChild($yui_menubar);

    $bd = parent::createElement("div");
    $bd->setAttribute("class", "bd");

    $yui_menubar->appendChild($bd);

    $ul = parent::createElement("ul");
    $ul->setAttribute("class", "first-of-type");

    // ALL Menu() instances ocurr inside an <ul> tag.

    $this->UL = $bd->appendChild($ul);

  }

  /** ---------------------------------
  /**  appendChild()
  /**  Appends a new yuimenubaritem to the menubar UL node.
  /**  This function changes <li> and <a> classes to yuiMENUBARsomething
  /** ---------------------------------*/

  public function appendChild($child) {

    $li = parent::importNode($child->LI, true);

    $li->setAttribute("class", "yuimenubaritem");

    $li->getElementsByTagName("a")->item(0)->setAttribute("class", "yuimenubaritemlabel");

    $this->UL->appendChild($li);

  }

  public function grab() {

    return parent::saveHTML();

  }

}

/** ---------------------------------
/**  Class Menu()
/**  Creates a yuimenuitem li node
/** ---------------------------------*/

class Menu extends DOMDocument {

  public $LI; // stores the <li> node (THE link) that will be exported to MenuBar() or used on appendChild()

  /** ---------------------------------
  /**  Constructor
  /**  Generates a yuimenuitem li node
  /**  No yuimenubar items are created here. MenuBar handles that.
  /** ---------------------------------*/

  public function __construct($link_name) {

    parent::__construct();

    $li = parent::createElement("li");
    $li->setAttribute("class", "yuimenuitem");

    // LI node stores THE link.
    // if appendChild is used, the new (sub) Menu() would be LI node child.

    $this->LI = parent::appendChild($li);

    $a = parent::createElement("a", $link_name);
    $a->setAttribute("class", "yuimenuitemlabel");

    $li->appendChild($a);

    $this->li = $li;
    $this->a = $a;

  }

  /** ---------------------------------
  /**  appendChild
  /**  Appends a (sub) Menu() to current Menu() in LI
  /** ---------------------------------*/

  public function appendChild($child) {

    $yuimenu = parent::createElement("div");
    $yuimenu->setAttribute("class", "yuimenu");

    $this->LI->appendChild($yuimenu);

    $bd = parent::createElement("div");
    $bd->setAttribute("class", "bd");

    $yuimenu->appendChild($bd);

    $ul = parent::createElement("ul");

    $bd->appendChild($ul);

    // child->NODE holds THE link from the new child (from child's __construct())

    $ul->appendChild(parent::importNode($child->LI, true));

  }

  public function setAttribute($name, $value, $node="a") {

      if ($node == "a") {
        $this->a->setAttribute($name, $value);
      }

      else {
        $this->li->setAttribute($name, $value);
      }
  }

}
Anonymous 29-Jan-2008 11:37
In response to...
"If you create your own custom element extending DOMElement and append him in place of the document element, you cannot access to any new members newly defined in your custom class via DOMDocument::$documentElement."

... it is not a bug, it is a feature. The DOMDocument::$documentElement property name may be misleading but according to the DOM Level 2 Core specification it is a convenience attribute meant to access the root element of your DOMDocument. See here: http://www.w3.org/TR/DOM-Level-2-Core/core.html#i-Document
ryoroxdahouse at hotmail dot com 25-Jan-2008 12:14
I use DOM to generate dynamically XHTML document.

When trying to extend the DOMDocument and DOMElement classes, I found a very annoying bug concerning DOMDocument::$documentElement.

If you create your own custom element extending DOMElement and append him in place of the document element, you cannot access to any new members newly defined in your custom class via DOMDocument::$documentElement.

In my situation, I cannot use DOMDocument::registerNodeClass() because the document element is not necessarily the base class for all the elements in my document.

*******
problem
*******

See bellow for the repro step:

<?php
    class MyElement extends DOMElement{
        public $myProp="myProp";
        public function myMethod(){
            return 'myMethod()';
        }
    }

    $myDocument=new DOMDocument();
    $myDocument->appendChild(new MyElement('myElement','myElement'));
    echo ('$myElement->myProp :'.$myDocument->documentElement->myProp.'<br />');
    echo ('$myElement->myMethod :'.$myDocument->documentElement->myMethod().'<br />');
?>

will output:

Notice: Undefined property: DOMElement::$myProp in C:\Program Files\EasyPHP 2.0b1\www\testDOMBug\test2.php on line 11
$myElement->myProp :

Fatal error: Call to undefined method DOMElement::myMethod() in C:\Program Files\EasyPHP 2.0b1\www\testDOMBug\test2.php on line 12

*******
solution
*******

After searching around, I found a pretty odd way to fix this problem. It seems that you have to stock a reference to your appended document element in an user-defined (and persistent) variable (in other words, not only in DOMDocument::$documentElement). See below:

<?php
    class MyElement extends DOMElement{
        public $myProp="myProp";
        public function myMethod(){
            return 'myMethod()';
        }
    }

    $myDocument=new DOMDocument();
    $mydocumentElement=$myDocument->appendChild(new MyElement('myElement','myElement')); //here is the hack
    echo ('$myElement->myProp :'.$myDocument->documentElement->myProp.'<br />');
    echo ('$myElement->myMethod :'.$myDocument->documentElement->myMethod().'<br />');
?>

will output:

$myElement->myProp :myProp
$myElement->myMethod :myMethod()

Hope it will help.
naudyj at aus3d.com 03-Jan-2008 05:06
The following can take a XML_TEXT_NODE node and return the contents in an array. Yanick's contribution rocks - but
it overwrote with duplicates only keeping the last line
in the returned array. All the other functions i tested from various sources failed to handle text nodes correctly. Hope this helps someone. It is adapted from code on this site.

function myTextNode($n, &$a)
{
 static $depth = 0;
 static $sz = '';

 if ($cn = $n->firstChild)
 {
  while ($cn)
  {
   if ($cn->nodeType == XML_TEXT_NODE)
   {
    $sz .= $cn->nodeValue;
   }
   elseif ($cn->nodeType == XML_ELEMENT_NODE)
   {
    $b = 1;
    if ($cn->hasChildNodes())
    {
     $depth++;
     if ($this->myHeadings($cn, $a))
     {
      if ($sz){
       array_push($a, $sz);
       $sz = '';
      }
     }
     $depth--;
    }
   }
   $cn = $cn->nextSibling;
  }
  return $b;
 }
}

so you could use:

$nodes = $dom->getElementsByTagName("td");
if($nodes){
 foreach ($nodes as $node){
  $a = Array();
  myTextNode($node, $a);
 }
}
jim.filter (at gmail.com) 03-Nov-2007 07:42
Array to DOM

Here is a recursive function to turn a multidimensional array into an XML document.  It will handle multiple elements of the same tag, but only one per parent element. IE:

Can't generate:         Can generate:
<root>                  <root>
  <sub1>data1</sub1>      <subs1>
  <sub1>data2</sub1>         <value>data1</value>
  <sub2>data1</sub2>         <value>data2</value>
  <sub2>data2</sub2>      </subs1>
</root>                   <subs2>
                            <value>data1</value>
                            <value>data2</value>
                          <subs2>
                        </root>

Also, the function performs no type of error checking on your array and will throw a DOMException if a key value you used in your array contains invalid characters for a proper DOM tag. This function is untested for "deep" multidimensional arrays.

Complete code ready to run with example:

<?PHP
  function AtoX($array, $DOM=null, $root=null){

    if($DOM  == null){$DOM  = new DOMDocument('1.0', 'iso-8859-1');}
    if($root == null){$root = $DOM->appendChild($DOM->createElement('root'));}

    $name = $array['#MULTIPLE_ELEMENT_NAME'];

      foreach($array as $key => $value){
        if(is_int($key) && $name != null){
          if(is_array($value)){
            $subroot = $root->appendChild($DOM->createElement($name));
            AtoX($value, $DOM, $subroot);
          }
          else if(is_scalar($value)){
            $root->appendChild($DOM->createElement($name, $value));
          }
        }
        else if(is_string($key) && $key != '#MULTIPLE_ELEMENT_NAME'){
          if(is_array($value)){
            $subroot = $root->appendChild($DOM->createElement($key));
            AtoX($value, $DOM, $subroot);
          }
          else if(is_scalar($value)){
            $root->appendChild($DOM->createElement($key, $value));
          }
        }
      }
    return $DOM;
  }

  $array = array(
                    '#MULTIPLE_ELEMENT_NAME' => 'GenericDatas',
                    'Date'      => 'November 03, 2007',
                    'Company'   => 'Facility One',
                    'Field'     => 'Facility Management Software',
                    'Employees' => array(
                                      '#MULTIPLE_ELEMENT_NAME' => 'Employee',
                                      'Cindy',
                                      'Sean',
                                      'Joe',
                                      'Owen',
                                      'Jim',
                                      'Dale',
                                      'Kelly',
                                      'Ryan',
                                      'Johnathan',
                                      'Robin',
                                      'William Marcus',
                                      'NewCoops' => array(
                                                          '#MULTIPLE_ELEMENT_NAME' => 'Coop',
                                                          'John',
                                                          'Tyler',
                                                          'Ray',
                                                          'Dawn'
                                                         )
                                    ),
                    'Datas',
                    'DATAS',
                    'OtherDatas'
                );

  $DOM  = new DOMDocument('1.0', 'iso-8859-1');
  $root = $DOM->appendChild($DOM->createElement('CompanyData'));
  $DOM  = AtoX($array, $DOM, $root);
  $DOM->save('C:\test.xml');
?>
PHPdeveloper 06-Sep-2007 02:46
The Yanik's dom2array() function (added on 14-Mar-2007 08:40) does not handle multiple nodes with the same name, i.e.:

<foo>
  <name>aa</name>
  <name>bb</name>
</foo>

It will overwrite former and your array will contain just the last one ("bb")
Francois Hill 01-Aug-2007 11:21
In response to lutfi at smartconsultant dot us :

(see my post on
http://fr2.php.net/manual/en/
function.dom-domdocument-getelementsbytagname.php
)

Use this class I wrote:

class XPathableNode extends DOMNode
{
    protected $Node;
    protected $DOMDocument_from_node;
    protected $DOMXpath_for_node;

    public function __construct(/* DOMNode */ $node)
    {
        $this->Node=$node;
        $this->DOMDocument_from_node=new
                                                          DomDocument();
        $domNode=$this->DOMDocument_from_node
                                  ->importNode($this->Node, true);
        $this->DOMDocument_from_node
                                 ->appendChild($domNode);
        $this->DomXpath_for_node =
                    new Domxpath($this->
                                         DOMDocument_from_node);
    }

    public function convertHTML()
    {    return $this->DOMDocument_from_node
                                                             ->saveHTML();
    }

    public /*DomNodeList*/ function applyXpath($xpath)
    {    return $this->DomXpath_for_node
                                                       ->query($xpath);
    }
}

(sorry for the display... What a terrible hinderance on the
part of php.net !)

Then :
Make a new XPathableNode out of your parent node.
You may then retrieve a DOMNodeList from it by applying a
xpath (thus being able to specify the depth  and name of
elements you want).

Has got me around some (of the many) DOM awkwardnesses a few times.

;o)
Sanados at failure dot at 05-Jun-2007 02:45
appended to
brian dot reynolds at risaris dot com
20-Feb-2007 10:09

when you got variable nodes at start you array fails and looses nodes  beneath.
solution that counts occurance though eats up performance:

function xmlToArray($n)
{
    $xml_array = array();
    $occurance = array();

     foreach($n->childNodes as $nc)
     {
         $occurance[$nc->nodeName]++;
     }

    foreach($n->childNodes as $nc){
        if( $nc->hasChildNodes() )
        {
            if($occurance[$nc->nodeName] > 1)
            {
                $xml_array[$nc->nodeName][] = xmlToArray($nc);
            }
            else
            {
                $xml_array[$nc->nodeName] = xmlToArray($nc);
            }
        }
        else
        {
            return utf8_decode($nc->nodeValue);
        }
    }
    return $xml_array;
}
Yanik <clonyara(at)ahoo(dot)com> 13-Mar-2007 11:40
I hate DOM model !
so I wrote dom2array simple function (simple for use):

function dom2array($node) {
  $res = array();
  print $node->nodeType.'<br/>';
  if($node->nodeType == XML_TEXT_NODE){
      $res = $node->nodeValue;
  }
  else{
      if($node->hasAttributes()){
          $attributes = $node->attributes;
          if(!is_null($attributes)){
              $res['@attributes'] = array();
              foreach ($attributes as $index=>$attr) {
                  $res['@attributes'][$attr->name] = $attr->value;
              }
          }
      }
      if($node->hasChildNodes()){
          $children = $node->childNodes;
          for($i=0;$i<$children->length;$i++){
              $child = $children->item($i);
              $res[$child->nodeName] = dom2array($child);
          }
      }
  }
  return $res;
}
Nevyn at N dot O dot S dot P dot A dot M dot emai dot it 10-Mar-2007 07:35
I wrote a couple of functions to:
 - create a DOMDocument from a file
 - parse the namespaces in it
 - create a XPath object with all the namespaces registered
 - load the schemalocations
 - validate the file on the main schema (the one without prefix)

It is useful for me, see if it is also for someone else!!

Giulio

function decodeNode($node)
{
    $out = $node->ownerDocument->saveXML($node);
    $re = "{^<((?:\\w*:)?\\w*)". //the tag name
    "[\\s\n\r]*((?:[\\s\n\r]*".
    "(?:\\w*:)?\\w+[\\s\n\r]*=[\\s\n\r]*". //possible attribute name
    "(?:\"[^\"]*\"|\'[^\']*\'))*)". //attribute value
    "[\\s\n\r]*>[\r\n]*".
    "((?:.*[\r\n]*)*)". //content
    "[\r\n]*</\\1>$}"; //closing tag
    preg_match($re, $out, $mat);
    return $mat;
}

function innerXml($node)
{
    $mat = decodeNode($node);
    return $mat[3];
}

function getnodeAttributes($node)
{
    $mat = decodeNode($node);
    $txt = $mat[2];
    $re = "{((?:\\w*:)?\\w+)[\\s\n\r]*=[\\s\n\r]*(\"[^\"]*\"|\'[^\']*\')}";
    preg_match_all($re, $txt, $mat);
    $att = array();
    for ($i=0; $i<count($mat[0]); $i++)
    {
        $value = $mat[2][$i];
        if ($value[0] == "\'" || $value[0] == "\"")
        {
            $len = strlen($value);
            $value = substr($value, 1, strlen($value)-2);
        }
        $att[ $mat[1][$i] ] = $value;
    }
    return $att;
}

function loadXml($file)
{
    $doc = new DOMDocument();
    $doc->load($file);
    //cerca l'attributo xmlns
    $xsi = false;
    $doc->namespaces = array();
    $doc->xpath = new DOMXPath($doc);

    $attr = getnodeAttributes($doc->documentElement);
    foreach ($attr as $name => $value)
    {
        if (substr($name,0,5) == "xmlns")
        {
            $uri = $value;
            $pre = $doc->documentElement->lookupPrefix($uri);
            if ($uri == "http://www.w3.org/2001/XMLSchema-instance")
                $xsi = $pre;
            $doc->namespaces[$pre] = $uri;
            if ($pre == "")
                $pre = "noname";
            $doc->xpath->registerNamespace($pre, $uri);
        }
    }

    if ($xsi)
    {
        $doc->schemaLocations = array();
        $lst = $doc->xpath->query("//@$xsi:schemaLocation");
        foreach($lst as $el)
        {
            $re = "{[\\s\n\r]*([^\\s\n\r]+)[\\s\n\r]*([^\\s\n\r]+)}";
            preg_match_all($re, $el->nodeValue, $mat);
            for ($i=0; $i<count($mat[0]); $i++)
            {
                $value = $mat[2][$i];
                $doc->schemaLocations[ $mat[1][$i] ] = $value;
            }
        }

        $olddir = getcwd();
        chdir(dirname($file));
        $schema = $doc->schemaLocations[$doc->namespaces[""]];
        if (substr($schema,0,7) == "file://")
        {
            $schema = substr($value,7);
        }
        if (!$doc->schemaValidate($schema))
            dbg()->err("Invalid file");
        chdir($olddir);
    }

    return $doc;
}
brian dot reynolds at risaris dot com 20-Feb-2007 01:09
I found the xml2array function below very useful, but there seems to be a bug in it. The $item variable was never getting set. I've expanded this out to be a bit more readable, and the corrected code is :

function xmlToArray($n)
{
    $return=array();

    foreach($n->childNodes as $nc){
        if( $nc->hasChildNodes() ){
            if( $n->firstChild->nodeName== $n->lastChild->nodeName&&$n->childNodes->length>1){
                $item = $n->firstChild;
                $return[$nc->nodeName][]=$this->xmlToArray($item);
            }
            else{
                 $return[$nc->nodeName]=$this->xmlToArray($nc);
            }
       }
       else{
           $return=$nc->nodeValue;
       }
    }
    return $return;
}
cooper at asu dot ntu-kpi dot kiev dot ua 22-Nov-2006 02:32
If you are using not object-oriented functions and it takes too much time to change them all (or you'll be replacing them later) then as a temporary decision can be used this modules:

For DOM XML:
http://alexandre.alapetite.net/doc-alex/domxml-php4-php5/

For XSLT:
http://alexandre.alapetite.net/doc-alex/xslt-php4-php5/
sean at lookin3d dot com 17-Aug-2006 10:21
$xmlDoc=<<<XML
<?xml version="1.0"?>
<methodCall>
   <methodName>examples.getStateName</methodName>
   <params>
      <param>
         <value><i4>41</i4></value>
         </param>
      </params>
   </methodCall>
XML;

$xml= new DOMDocument();
$xml->preserveWhiteSpace=false;
$xml->loadXML($xmlDoc);
print_r(xml2array($xml));

function xml2array($n)
{
    $return=array();
    foreach($n->childNodes as $nc)
    ($nc->hasChildNodes())
    ?($n->firstChild->nodeName== $n->lastChild->nodeName&&$n->childNodes->length>1)
    ?$return[$nc->nodeName][]=xml2array($item)
    :$return[$nc->nodeName]=xml2array($nc)
    :$return=$nc->nodeValue;
    return $return;
}
simlee at indiana dot edu 29-Dec-2005 12:16
The project I'm currently working on uses XPaths to dynamically navigate through chunks of an XML file.  I couldn't find any PHP code on the net that would build the XPath to a node for me, so I wrote my own function.  Turns out it wasn't as hard as I thought it might be (yay recursion), though it does entail using some PHP shenanigans...

Hopefully it'll save someone else the trouble of reinventing this wheel.

<?php
    function getNodeXPath( $node ) {
        // REMEMBER THAT XPATHS USE BASE-1 INSTEAD OF BASE-0!!!

        // Get the index for the current node by looping through the siblings.
        $parentNode = $node->parentNode;
        if( $parentNode != null ) {
            $nodeIndex = 0;
            do {
                $testNode = $parentNode->childNodes->item( $nodeIndex );
                $nodeName = $testNode->nodeName;
                $nodeIndex++;

                // PHP trickery!  Here we create a counter based on the node
                //  name of the test node to use in the XPath.
                if( !isset( $$nodeName ) ) $$nodeName = 1;
                else $$nodeName++;

                // Failsafe return value.
                if( $nodeIndex > $parentNode->childNodes->length ) return( "/" );
            } while( !$node->isSameNode( $testNode ) );

            // Recursively get the XPath for the parent.
            return( getNodeXPath( $parentNode ) . "/{$node->nodeName}[{$$nodeName}]" );
        } else {
            // Hit the root node!  Note that the slash is added when
            //  building the XPath, so we return just an empty string.
            return( "" );
        }
    }
?>
johanwthijs-at-hotmail-dot-com 14-Dec-2005 06:25
Being an experienced ASP developer I was wondering how to replace textual content of a node (with msxml this is simply acheived by setting the 'text' property of a node). Out of frustration I started to play around with SimpleXml but I could not get it to work in combination with xPath.

I took me a lot of time to find out so I hope this helps others:

function replaceNodeText($objXml, $objNode, $strNewContent){
    /*
    This function replaces a node's string content with strNewContent
    */
    $objNodeListNested = &$objNode->childNodes;
    foreach ( $objNodeListNested as $objNodeNested ){
         if ($objNodeNested->nodeType == XML_TEXT_NODE)$objNode->removeChild ($objNodeNested);
    }

    $objNode->appendChild($objXml->createTextNode($strNewContent));
}

$objXml= new DOMDocument();
$objXml->loadXML('<root><node id="1">bla</note></root>');
$objXpath = new domxpath($objXml);

$strXpath="/root/node[@id='1']";
$objNodeList = $objXpath ->query($strXpath);
foreach ($objNodeList as $objNode){
//pass the node by reference
replaceNodeText($objXml, &$objNode, $strImportedValue);
}
mark at vectrex dot org dot uk 17-Nov-2005 02:10
Note that these DOM functions expect (and presumably return) all their data in UTF-8 character encoding, regardless of what PHP's current encoding is. This means that text nodes, attribute values etc, should be in utf8.

This applies even if you're generating an XML document which is not ultimately in utf8.

Mark
toby at tobiasly dot com 22-Oct-2005 11:08
This module is not included by default either in the CentOS 4 "centosplus" repository. For those using PHP5 on CentOS 4, a simple "yum --enablerepo=centosplus install php-xml" will do the trick (this will install both the XML and DOM modules).
pes_cz 29-Sep-2005 12:32
When I tried to parse my XHTML Strict files with DOM extension, it couldn't understand xhtml entities (like &copy;). I found post about it here (14-Jul-2005 09:05) which adviced to add resolveExternals = true, but it was very slow. There was some small note about xml catalogs but without any glue. Here it is:

XML catalogs is something like cache. Download all needed dtd's to /etc/xml, edit file /etc/xml/catalog and add this line: <public publicId="-//W3C//DTD XHTML 1.0 Strict//EN" uri="file:///etc/xml/xhtml1-strict.dtd" />

Thats all. Thanks to http://www.whump.com/moreLikeThis/link/03815
amir.laherATcomplinet.com 22-Aug-2005 05:09
This particular W3C page provides invaluable documentation for the DOM classes implemented in php5 (via libxml2). It fills in plenty of php.net's gaps:

http://www.w3.org/TR/DOM-Level-2-Core/core.html

Some key examples:
* concise summary of the class heirachy (1.1.1)
* clarification that DOM level 2 doesn't allow for population of internal DTDs
* explanation of DOMNode->normalize()
* explanation of the DOMImplementation class

The interfaces are described in OMG's Interface Definition Language
aidan at php dot net 19-Jul-2005 06:04
As of PHP 5.1, libxml options may be set using constants rather than the use of proprietary DomDocument properties.

DomDocument->resolveExternals is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDATTR

DomDocument->validateOnParse is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDVALID

PHP 5.1 users are encouraged to use the new constants.

Example:

DomDocument->load($file, LIBXML_DTDLOAD|LIBXML_DTDATTR);

DomDocument->load($file, LIBXML_DTDLOAD|LIBXML_DTDVALID);
aidan at php dot net 18-Jul-2005 08:27
When dealing with validation or loading, the output errors can be quite annoying.

PHP 5.1 introduces libxml_get_errors().

http://php.net/libxml_get_errors
php at webdevelopers dot cz 14-Jul-2005 12:05
[Editor's Note: If you're using entities, then you have no choice. XML Catalogs can speed DTD resolution.]

Never use

$dom->resolveExternals=true;

when parsing XHTML document that has the DOCTYPE declaration with DTD URL specified in it.

Otherwise parsing the XHTML with DOCTYPE like this one:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

will result in PHP/DOM downloading the DTD file from W3C site when parsing your document. It will add extra delay to your script - I experienced that $dom->load()'s total time was from 1 to 16 seconds.

elixon
spammable69 at hotmail dot com 11-Apr-2005 10:18
I wrote a framework to implement the StyleSheet interfaces as specified on the W3C website.  The code is written in PHP, and is NOT a complete implementation.  Use it how ya like.  I was planning on adding the CSSStyleSheet interfaces as well.  Feel free to ask.

<?
    class StyleSheetList {
        public length;
        private self;

        function __construct ( ) {
            $this->self = array();
        }

        function __get($property, $&ret) {
            if($property == 'length')
                $ret = count($this->self);
            return true;
        }

        function __set($property, $val) {
            if($property == 'length')
                return true;
        }

        function item( $index ) {
            return $this->self[$index];
        }
    }

    class MediaList extends StyleSheetList {

        function appendMedium ( $newMedium ) {
            array_push($this->self, $newMedium);
        }

        function deleteMedium ( $oldMedium ) {
            foreach($this->self as $item) {
                if( $item == $oldMedium ) {
                    $item = $this->self[ $this->length-1 ];
                    array_pop($this->self);
                    break;
                }
            }
        }
    }

    class DocumentStyle {
        public styleSheets;

        function __construct ( ) {
            $this->styleSheets = new StyleSheetList();
        }

        function __set($property, $val) {
            if($property == 'styleSheets')
                return true;
        }
    }

    class LinkStyle {
        public sheet;

        function __construct () {
            $this->sheet = new StyleSheet();
        }

        function __set($property, $val) {
            if($property == 'sheet')
                return true;
        }
    }

    class StyleSheet {
        public type;
        public disabled;
        public ownerNode;
        public parentStyleSheet;
        public href;
        public title;
        public media;

        function __construct( $type, $disabled, $ownerNode, $parentStyleSheet, $href, $title){
            $this->type = $type;
            $this->disabled = $disabled;
            $this->media = new MediaList();
            $this->ownerNode = $ownerNode;
            $this->parentStyleSheet = $parentStyleSheet;
            $this->href = $href;
            $this->title = $title;
        }
    }
?>

Only contactable via http://murpsoft.com/contact.html


Introduction

L'extension DOM vous permet d'utiliser des documents XML via l'API DOM de PHP.

Note:

L'extension DOM utilise l'encodage UTF-8. Utilisez utf8_encode() et utf8_decode() pour travailler avec des textes dans l'encodage ISO-8859-1 ou iconv pour d'autre encodages.

User Contributed Notes

Anonymous 15-Apr-2020 06:01
On some linux package managers, namely apt, this is called 'xml' for example as in:

sudo apt-get install -y php7.3-xml
captainjester at hotmail dot com 27-Mar-2020 12:59
Be careful when using this for partial HTML. This will only take complete HTML documents with at least an HTML element and a BODY element. If you are working on partial HTML and you fill in the missing elements around it and don't specify in META elements the character encoding then it will be treated as ISO-8859-1 and will mangle UTF-8 strings. Example:

<?php
$body = getHtmlBody();
$doc = new DOMDocument();
$doc->loadHtml("<html><body>".$body."</body></html>");
// $doc will treat your HTML ISO-8859-1.
// this is correct but may not be what you want if your source is UTF-8
?>

<?php
$body = getHtmlBody();
$doc = new DOMDocument();
$doc->loadHtml("<html><head><meta charset=\"UTF-8\"><meta http-equiv=\"Content-Type\" content=\"text/html; CHARSET=Windows-1252\"></head><body>".$body."</body></html>");
// $doc will treat your HTML correctly as UTF-8.
?>


Installation/Configuration

Sommaire

  • Pré-requis
  • Installation
  • Configuration à l'exécution
  • Types de ressources

User Contributed Notes

d at duane dot com 10-May-2012 05:02
On Fedora 16, you can use
yum -y install php-xml
and then be sure to add
extension=dom.so
in the php.ini file for this to work.
Anonymous 05-Oct-2011 07:40
In Redhat 5.5 using php53 you need to not only install php53-xml but php53-devel as well to install DOMDocument
eugenekay at kashpureff dot org 24-Jan-2011 10:08
Certain Linux distributions do not have this extension included in the minimum PHP package. It can usually be found in one of the "optional" php-* packages.

For CentOS, you will need to run "yum install php-xml", which provides this extension.
Sergey A. 05-Apr-2010 05:38
don't forget
extension=dom.so
in extensions.ini
on freebsd
z1mok at yahoo dot com 22-Apr-2009 05:45
You need the DOM MODULE installed if you want to use Youtube Data Api with the Zend GData Library.

Otherwise you cannot obtain a valid Upload Form Token.


Pré-requis

Cette extension requière l'extension PHP libxml. Ceci signifie passer l'option de configuration --with-libxml, ou antérieur à PHP 7.4 l'option de configuration --enable-libxml, bien que ceci est accomplie implicitement car libxml est activé par défaut.

User Contributed Notes

david at brayworth dot com dot au 12-Jun-2011 05:55
Under Fedora packaging ssystems you will need php-xml
 => yum install php-xml
James 18-Apr-2010 10:58
You also need to check libxml is installed. Check phpinfo() > Dom to see if it is. Bug report filed to get this added here.


Installation

Cette extension est activée par défaut. Elle peut être désactivée en utilisant l'option de configuration : --disable-dom

User Contributed Notes

smleimberg at NOSPAM dot gmail dot com 26-Dec-2017 10:08
For Ubuntu:
sudo apt-get install php7.0-xml

For Fedora:
yum -y install php-xml


Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

Constantes XML
Constante | Valeur | Description
XML_ELEMENT_NODE (entier) | 1 | Le nœud est un DOMElement
XML_ATTRIBUTE_NODE (entier) | 2 | Le nœud est un DOMAttr
XML_TEXT_NODE (entier) | 3 | Le nœud est un DOMText
XML_CDATA_SECTION_NODE (entier) | 4 | Le nœud est un DOMCharacterData
XML_ENTITY_REF_NODE (entier) | 5 | Le nœud est un DOMEntityReference
XML_ENTITY_NODE (entier) | 6 | Le nœud est un DOMEntity
XML_PI_NODE (entier) | 7 | Le nœud est un DOMProcessingInstruction
XML_COMMENT_NODE (entier) | 8 | Le nœud est un DOMComment
XML_DOCUMENT_NODE (entier) | 9 | Le nœud est un DOMDocument
XML_DOCUMENT_TYPE_NODE (entier) | 10 | Le nœud est un DOMDocumentType
XML_DOCUMENT_FRAG_NODE (entier) | 11 | Le nœud est un DOMDocumentFragment
XML_NOTATION_NODE (entier) | 12 | Le nœud est un DOMNotation
XML_HTML_DOCUMENT_NODE (entier) | 13 |
XML_DTD_NODE (entier) | 14 |
XML_ELEMENT_DECL_NODE (entier) | 15 |
XML_ATTRIBUTE_DECL_NODE (entier) | 16 |
XML_ENTITY_DECL_NODE (entier) | 17 |
XML_NAMESPACE_DECL_NODE (entier) | 18 |
XML_ATTRIBUTE_CDATA (entier) | 1 |
XML_ATTRIBUTE_ID (entier) | 2 |
XML_ATTRIBUTE_IDREF (entier) | 3 |
XML_ATTRIBUTE_IDREFS (entier) | 4 |
XML_ATTRIBUTE_ENTITY (entier) | 5 |
XML_ATTRIBUTE_NMTOKEN (entier) | 7 |
XML_ATTRIBUTE_NMTOKENS (entier) | 8 |
XML_ATTRIBUTE_ENUMERATION (entier) | 9 |
XML_ATTRIBUTE_NOTATION (entier) | 10 |
Constantes DOMException
Constante | Valeur | Description
DOM_PHP_ERR (entier) | 0 | Code erreur ne faisant pas parti de la spécification DOM. Utile pour les erreurs PHP.
DOM_INDEX_SIZE_ERR (entier) | 1 | Si l'index ou la taille sont négatifs ou plus grands que la valeur autorisée.
DOMSTRING_SIZE_ERR (entier) | 2 | Si la rangée spécifiée de texte ne tient pas dans le DOMString.
DOM_HIERARCHY_REQUEST_ERR (entier) | 3 | Si un nœud est inséré à un endroit non autorisé
DOM_WRONG_DOCUMENT_ERR (entier) | 4 | Si un nœud est utilisé dans un document autre que celui qui l'a créé.
DOM_INVALID_CHARACTER_ERR (entier) | 5 | Si un caractère invalide ou non autorisé est spécifié, par exemple, dans un nom.
DOM_NO_DATA_ALLOWED_ERR (entier) | 6 | Si des données sont spécifiées dans un nœud qui ne supporte pas les données.
DOM_NO_MODIFICATION_ALLOWED_ERR (entier) | 7 | Si une tentative est faite de modifier un objet où les modifications ne sont pas autorisées.
DOM_NOT_FOUND_ERR (entier) | 8 | Si une tentative est faite de référencer un nœud dans un contexte où il n'existe pas.
DOM_NOT_SUPPORTED_ERR (entier) | 9 | Si l'implémentation ne supporte pas le type requis de l'objet ou de l'opération.
DOM_INUSE_ATTRIBUTE_ERR (entier) | 10 | Si une tentative est faite d'ajouter un attribut qui est déjà utilisé autre part.
DOM_INVALID_STATE_ERR (entier) | 11 | Si une tentative est faite d'utiliser un objet qui n'est pas, ou n'est plus, utilisable.
DOM_SYNTAX_ERR (entier) | 12 | Si une chaîne de caractères invalide ou illégale est spécifiée.
DOM_INVALID_MODIFICATION_ERR (entier) | 13 | Si une tentative est faite de modifier le type d'un objet fondamental.
DOM_NAMESPACE_ERR (entier) | 14 | Si une tentative est faite de créer ou de modifier un objet dans un sens qui est incorrect au regard de l'espace de noms.
DOM_INVALID_ACCESS_ERR (entier) | 15 | Si un paramètre ou une opération n'est pas supporté par l'objet fondamental.
DOM_VALIDATION_ERR (entier) | 16 | Si un appel à une méthode tel que insertBefore ou removeChild voudrait rendre le nœud invalide avec le respect de la validation partielle, cette exception sera exécutée et l'opération ne sera pas effectuée.

User Contributed Notes

There are no user contributed notes for this page.


Exemples

Beaucoup d'exemples de cette documentation requièrent un fichier XML. Nous allons utiliser le fichier book.xml qui contient les élements suivants :

Exemple #1 book.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
 "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
]>
<book id="listing">
 <title>My lists</title>
 <chapter id="books">
  <title>My books</title>
  <para>
   <informaltable>
    <tgroup cols="4">
     <thead>
      <row>
       <entry>Title</entry>
       <entry>Author</entry>
       <entry>Language</entry>
       <entry>ISBN</entry>
      </row>
     </thead>
     <tbody>
      <row>
       <entry>The Grapes of Wrath</entry>
       <entry>John Steinbeck</entry>
       <entry>en</entry>
       <entry>0140186409</entry>
      </row>
      <row>
       <entry>The Pearl</entry>
       <entry>John Steinbeck</entry>
       <entry>en</entry>
       <entry>014017737X</entry>
      </row>
      <row>
       <entry>Samarcande</entry>
       <entry>Amine Maalouf</entry>
       <entry>fr</entry>
       <entry>2253051209</entry>
      </row>
      <!-- TODO: I have a lot of remaining books to add.. -->
     </tbody>
    </tgroup>
   </informaltable>
  </para>
 </chapter>
</book>

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMAttr

(PHP 5, PHP 7)

Introduction

DOMAttr représente un attribut dans l'objet DOMElement.

Synopsis de la classe

DOMAttr étend DOMNode {
/* Propriétés */
public readonly string $name ;
public readonly DOMElement $ownerElement ;
public readonly bool $schemaTypeInfo ;
public readonly bool $specified ;
public string $value ;
/* Propriétés héritées */
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes */
public __construct ( string $name , string $value = "" )
public isId ( ) : bool
/* Méthodes héritées */
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Propriétés

name

Le nom de l'attribut

ownerElement

L'élément qui contient l'attribut

schemaTypeInfo

Non implémenté, vaut toujours null

specified

Non implémenté, vaut toujours null

value

La valeur de l'attribut

Voir aussi

  • » spécification W3C de l'Attr

Sommaire

  • DOMAttr::__construct — Crée un nouvel objet DOMAttr
  • DOMAttr::isId — Vérifie si l'attribut est un identifiant défini

User Contributed Notes

greubel at nkey dot de 06-Dec-2014 03:04
Please take care on debugging DOMAttr related code. This will cause an E_WARNING that retrieving schemaTypeInfo attribute is not implemented yet. An IDE like Eclipse will inspect the object and its member elements. In conjunction with registered error handlers, which will translate the E_WARNING into Exception your debugging session will end unexpectedly. This has caused me some trouble while debugging my PHPUnit test case in eclipse using "Makegood" plugin.

A possible workarround is to deactivate the error handling during debugging using error_reporting(0). Remove the statement after finishing your debugging session.

Notable ticket in Bugtracker: https://bugs.php.net/bug.php?id=61858
And a xdebug tracker ticket: http://bugs.xdebug.org/view.php?id=910
chregu at php dot net 23-Mar-2009 11:20
See also the properties from the inherited class DOMNode ( http://php.net/manual/en/class.domnode.php ), eg. namespaceURI, prefix, localName, etc, especially if you have to deal with namespaced attributes


Crée un nouvel objet DOMAttr

  • « DOMAttr
  • DOMAttr::isId »
  • PHP Manual
  • DOMAttr
  • Crée un nouvel objet DOMAttr

DOMAttr::__construct

(PHP 5, PHP 7)

DOMAttr::__construct — Crée un nouvel objet DOMAttr

Description

public DOMAttr::__construct ( string $name , string $value = "" )

Crée un nouvel objet DOMAttr. Cet objet est en lecture seule. Il peut être ajouté à un document, mais les nœuds additionnels ne peuvent pas être ajoutés à ce nœud tant que ce nœud est associé à un document. Pour créer un nœud accessible en écriture, utilisez DOMDocument::createAttribute.

Liste de paramètres

name

Le nom de l'attribut.

value

La valeur de l'attribut.

Exemples

Exemple #1 Création d'un nouvel objet DOMAttr

<?php

$dom = new DOMDocument('1.0', 'iso-8859-1');
$element = $dom->appendChild(new DOMElement('root'));
$attr = $element->setAttributeNode(new DOMAttr('attr', 'attrvalue'));
echo $dom->saveXML();

?>

L'exemple ci-dessus va afficher :

<?xml version="1.0" encoding="iso-8859-1"?>
<root attr="attrvalue" />

Voir aussi

  • DOMDocument::createAttribute() - Crée un nouvel attribut

User Contributed Notes

Anonymous 18-Sep-2014 10:48
The output should be:

<?xml version="1.0" encoding="iso-8859-1"?>
<root attr="attrvalue"/>


Vérifie si l'attribut est un identifiant défini

  • « DOMAttr::__construct
  • DOMCdataSection »
  • PHP Manual
  • DOMAttr
  • Vérifie si l'attribut est un identifiant défini

DOMAttr::isId

(PHP 5, PHP 7)

DOMAttr::isId — Vérifie si l'attribut est un identifiant défini

Description

public DOMAttr::isId ( ) : bool

Cette fonction vérifie si l'attribut est un identifiant défini.

En accord avec le standard DOM, ceci requiert une DTD qui définit l'attribut ID qui est du type ID. Vous devez valider votre document avec la fonction DOMDocument::validate ou la fonction DOMDocument::validateOnParse avant d'utiliser cette fonction.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec DOMAttr::isId()

<?php

$doc = new DomDocument;

// Nous devons valider notre document avant de nous référer à l'ID
$doc->validateOnParse = true;
$doc->Load('book.xml');

// Nous récupérons l'attribut nommé id de l'élément chapter
$attr = $doc->getElementsByTagName('chapter')->item(0)->getAttributeNode('id');

var_dump($attr->isId()); // bool(true)

?>

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMCdataSection

(PHP 5, PHP 7)

Introduction

DOMCdataSection hérite de la classe DOMText pour la représentation textuelle de la construction du bloc CData.

Synopsis de la classe

DOMCdataSection étend DOMText {
/* Propriétés héritées */
public readonly string $wholeText ;
public string $data ;
public readonly int $length ;
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes */
public __construct ( string $data )
/* Méthodes héritées */
public DOMText::isElementContentWhitespace ( ) : bool
public DOMText::isWhitespaceInElementContent ( ) : bool
public DOMText::splitText ( int $offset ) : DOMText|false
public DOMCharacterData::appendData ( string $data ) : bool
public DOMCharacterData::deleteData ( int $offset , int $count ) : bool
public DOMCharacterData::insertData ( int $offset , string $data ) : bool
public DOMCharacterData::replaceData ( int $offset , int $count , string $data ) : bool
public DOMCharacterData::substringData ( int $offset , int $count ) : string|false
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Sommaire

  • DOMCdataSection::__construct — Construit un nouvel objet DOMCdataSection

User Contributed Notes

There are no user contributed notes for this page.


Construit un nouvel objet DOMCdataSection

  • « DOMCdataSection
  • DOMCharacterData »
  • PHP Manual
  • DOMCdataSection
  • Construit un nouvel objet DOMCdataSection

DOMCdataSection::__construct

(PHP 5, PHP 7)

DOMCdataSection::__construct — Construit un nouvel objet DOMCdataSection

Description

public DOMCdataSection::__construct ( string $data )

Construit un nouveau nœud CDATA. Fonctionne comme la classe DOMText.

Liste de paramètres

data

La valeur du nœud CDATA. Si non fourni, un nœud CDATA vide sera créé.

Exemples

Exemple #1 Création d'un nouvel objet DOMCdataSection

<?php

$dom = new DOMDocument('1.0', 'utf-8');
$element = $dom->appendChild(new DOMElement('root'));
$text = $element->appendChild(new DOMCdataSection('root value'));
echo $dom->saveXML();

?>

L'exemple ci-dessus va afficher :

<?xml version="1.0" encoding="utf-8"?>
<root><![CDATA[root value]]></root>

Voir aussi

  • DOMText::__construct() - Crée un nouvel objet DOMText
  • DOMDocument::createTextNode() - Crée un nouveau nœud de texte

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMCharacterData

(PHP 5, PHP 7)

Introduction

Représente un nœud contenant des données. Aucun nœud ne correspond à cette classe, mais d'autres nœuds en hérite.

Synopsis de la classe

DOMCharacterData extends DOMNode {
/* Propriétés */
public string $data ;
public readonly int $length ;
/* Propriétés héritées */
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes */
public appendData ( string $data ) : bool
public deleteData ( int $offset , int $count ) : bool
public insertData ( int $offset , string $data ) : bool
public replaceData ( int $offset , int $count , string $data ) : bool
public substringData ( int $offset , int $count ) : string|false
/* Méthodes héritées */
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Propriétés

data

Le contenu du nœud.

length

La taille du contenu.

Voir aussi

  • » spécification W3C de CharacterData

Sommaire

  • DOMCharacterData::appendData — Ajoute la chaîne à la fin des données dans le nœud
  • DOMCharacterData::deleteData — Supprime une sous-chaîne dans le nœud
  • DOMCharacterData::insertData — Insère une chaîne à la position spécifiée d'unité 16-bit
  • DOMCharacterData::replaceData — Remplace une sous-chaîne dans le nœud DOMCharacterData
  • DOMCharacterData::substringData — Extrait un morceau de données dans le nœud

User Contributed Notes

jesdisciple dot FOO at gmail dot BAR dot com 08-Jul-2010 04:35
In case you're looking for the CDATA class to which nodes /do/ correspond, it's called DOMCdataSection (per my PHP installation) and isn't documented on php.net.  Presumably, it doesn't add anything to this API.

See also: http://www.php.net/manual/en/domdocument.createcdatasection.php


Ajoute la chaîne à la fin des données dans le nœud

  • « DOMCharacterData
  • DOMCharacterData::deleteData »
  • PHP Manual
  • DOMCharacterData
  • Ajoute la chaîne à la fin des données dans le nœud

DOMCharacterData::appendData

(PHP 5, PHP 7)

DOMCharacterData::appendData — Ajoute la chaîne à la fin des données dans le nœud

Description

public DOMCharacterData::appendData ( string $data ) : bool

Ajoute la chaîne data à la fin des données dans le nœud.

Liste de paramètres

data

La chaîne à ajouter.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • DOMCharacterData::deleteData() - Supprime une sous-chaîne dans le nœud
  • DOMCharacterData::insertData() - Insère une chaîne à la position spécifiée d'unité 16-bit
  • DOMCharacterData::replaceData() - Remplace une sous-chaîne dans le nœud DOMCharacterData
  • DOMCharacterData::substringData() - Extrait un morceau de données dans le nœud

User Contributed Notes

There are no user contributed notes for this page.


Supprime une sous-chaîne dans le nœud

  • « DOMCharacterData::appendData
  • DOMCharacterData::insertData »
  • PHP Manual
  • DOMCharacterData
  • Supprime une sous-chaîne dans le nœud

DOMCharacterData::deleteData

(PHP 5, PHP 7)

DOMCharacterData::deleteData — Supprime une sous-chaîne dans le nœud

Description

public DOMCharacterData::deleteData ( int $offset , int $count ) : bool

Efface count caractères à partir de la position offset.

Liste de paramètres

offset

La position à partir de laquelle on doit commencer à effacer.

count

Le nombre de caractères à effacer. SI la somme de offset et de count excède la longueur totale de la chaîne, alors tous les caractères jusqu'à la fin de la chaîne seront effacés.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

DOM_INDEX_SIZE_ERR

Lancé si offset est négatif ou plus grand que le nombre d'unités 16-bits dans les données ou si count est négatif.

Voir aussi

  • DOMCharacterData::appendData() - Ajoute la chaîne à la fin des données dans le nœud
  • DOMCharacterData::insertData() - Insère une chaîne à la position spécifiée d'unité 16-bit
  • DOMCharacterData::replaceData() - Remplace une sous-chaîne dans le nœud DOMCharacterData
  • DOMCharacterData::substringData() - Extrait un morceau de données dans le nœud

User Contributed Notes

There are no user contributed notes for this page.


Insère une chaîne à la position spécifiée d'unité 16-bit

  • « DOMCharacterData::deleteData
  • DOMCharacterData::replaceData »
  • PHP Manual
  • DOMCharacterData
  • Insère une chaîne à la position spécifiée d'unité 16-bit

DOMCharacterData::insertData

(PHP 5, PHP 7)

DOMCharacterData::insertData — Insère une chaîne à la position spécifiée d'unité 16-bit

Description

public DOMCharacterData::insertData ( int $offset , string $data ) : bool

Insère la chaîne data à la position offset.

Liste de paramètres

offset

La position de l'insertion.

data

La chaîne à insérer.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

DOM_INDEX_SIZE_ERR

Lancé si offset est négatif ou plus grand que le nombre d'unités 16-bits dans les données.

Voir aussi

  • DOMCharacterData::appendData() - Ajoute la chaîne à la fin des données dans le nœud
  • DOMCharacterData::deleteData() - Supprime une sous-chaîne dans le nœud
  • DOMCharacterData::replaceData() - Remplace une sous-chaîne dans le nœud DOMCharacterData
  • DOMCharacterData::substringData() - Extrait un morceau de données dans le nœud

User Contributed Notes

There are no user contributed notes for this page.


Remplace une sous-chaîne dans le nœud DOMCharacterData

  • « DOMCharacterData::insertData
  • DOMCharacterData::substringData »
  • PHP Manual
  • DOMCharacterData
  • Remplace une sous-chaîne dans le nœud DOMCharacterData

DOMCharacterData::replaceData

(PHP 5, PHP 7)

DOMCharacterData::replaceData — Remplace une sous-chaîne dans le nœud DOMCharacterData

Description

public DOMCharacterData::replaceData ( int $offset , int $count , string $data ) : bool

Remplace count caractères en partant de la position offset par les données data.

Liste de paramètres

offset

La position à partir de laquelle on commence le remplacement.

count

Le nombre de caractères à remplacer. Si la somme de offset et de count excède la longueur totale de la chaîne, alors tous les caractères jusqu'à la fin des données seront remplacés.

data

La chaîne utilisée pour remplacer les caractères sélectionnés.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

DOM_INDEX_SIZE_ERR

Lancé si offset est négatif ou plus grand que le nombre d'unités 16-bits dans les données ou si count est négatif.

Voir aussi

  • DOMCharacterData::appendData() - Ajoute la chaîne à la fin des données dans le nœud
  • DOMCharacterData::deleteData() - Supprime une sous-chaîne dans le nœud
  • DOMCharacterData::insertData() - Insère une chaîne à la position spécifiée d'unité 16-bit
  • DOMCharacterData::substringData() - Extrait un morceau de données dans le nœud

User Contributed Notes

There are no user contributed notes for this page.


Extrait un morceau de données dans le nœud

  • « DOMCharacterData::replaceData
  • DOMComment »
  • PHP Manual
  • DOMCharacterData
  • Extrait un morceau de données dans le nœud

DOMCharacterData::substringData

(PHP 5, PHP 7)

DOMCharacterData::substringData — Extrait un morceau de données dans le nœud

Description

public DOMCharacterData::substringData ( int $offset , int $count ) : string|false

Retourne la sous-chaîne spécifiée.

Liste de paramètres

offset

La position du début de la chaîne à extraire.

count

Le nombre de caractères à extraire.

Valeurs de retour

La sous-chaîne spécifiée. Si la somme de offset et de count excède la longueur totale de la chaîne, alors toutes les unités 16-bits jusqu'à la fin des données seront retournées.

Erreurs / Exceptions

DOM_INDEX_SIZE_ERR

Lancé si offset est négatif ou plus grand que le nombre d'unités 16-bits dans les données ou si count est négatif.

Voir aussi

  • DOMCharacterData::appendData() - Ajoute la chaîne à la fin des données dans le nœud
  • DOMCharacterData::deleteData() - Supprime une sous-chaîne dans le nœud
  • DOMCharacterData::insertData() - Insère une chaîne à la position spécifiée d'unité 16-bit
  • DOMCharacterData::replaceData() - Remplace une sous-chaîne dans le nœud DOMCharacterData

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMComment

(PHP 5, PHP 7)

Introduction

Représente un nœud de commentaire, délimité par <!-- et -->.

Synopsis de la classe

DOMComment étend DOMCharacterData {
/* Propriétés héritées */
public string $data ;
public readonly int $length ;
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes */
public __construct ( string $data = "" )
/* Méthodes héritées */
public DOMCharacterData::appendData ( string $data ) : bool
public DOMCharacterData::deleteData ( int $offset , int $count ) : bool
public DOMCharacterData::insertData ( int $offset , string $data ) : bool
public DOMCharacterData::replaceData ( int $offset , int $count , string $data ) : bool
public DOMCharacterData::substringData ( int $offset , int $count ) : string|false
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Voir aussi

  • » spécification W3C de Comment

Sommaire

  • DOMComment::__construct — Crée un nouvel objet DOMComment

User Contributed Notes

There are no user contributed notes for this page.


Crée un nouvel objet DOMComment

  • « DOMComment
  • DOMDocument »
  • PHP Manual
  • DOMComment
  • Crée un nouvel objet DOMComment

DOMComment::__construct

(PHP 5, PHP 7)

DOMComment::__construct — Crée un nouvel objet DOMComment

Description

public DOMComment::__construct ( string $data = "" )

Crée un nouvel objet DOMComment. Cet objet est en lecture seule. Il peut être ajouté à un document, mais les nœuds additionnels ne peuvent pas être ajoutés à ce nœud tant que ce nœud n'est pas associé à un document. Pour créer un nœud accessible en écriture, utilisez DOMDocument::createComment.

Liste de paramètres

data

La valeur du commentaire.

Exemples

Exemple #1 Création d'un nouveau DOMComment

<?php

$dom = new DOMDocument('1.0', 'iso-8859-1');
$element = $dom->appendChild(new DOMElement('root'));
$comment = $element->appendChild(new DOMComment('root comment'));
echo $dom->saveXML(); /* <?xml version="1.0" encoding="iso-8859-1"?><root><!--root comment--></root> */

?>

Voir aussi

  • DOMDocument::createComment() - Crée un nouveau nœud de commentaire

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMDocument

(PHP 5, PHP 7)

Introduction

Représente un document HTML ou XML entier ; ce sera la racine de l'arbre document.

Synopsis de la classe

DOMDocument extends DOMNode {
/* Propriétés */
public readonly string $actualEncoding ;
public readonly DOMConfiguration $config ;
public readonly DOMDocumentType $doctype ;
public readonly DOMElement $documentElement ;
public string|null $documentURI ;
public string $encoding ;
public bool $formatOutput ;
public readonly DOMImplementation $implementation ;
public bool $preserveWhiteSpace = true ;
public bool $recover ;
public bool $resolveExternals ;
public bool $standalone ;
public bool $strictErrorChecking = true ;
public bool $substituteEntities ;
public bool $validateOnParse = false ;
public string $version ;
public readonly string|null $xmlEncoding ;
public bool $xmlStandalone ;
public string $xmlVersion ;
/* Propriétés héritées */
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes */
public __construct ( string $version = "1.0" , string $encoding = "" )
public createAttribute ( string $localName ) : DOMAttr|false
public createAttributeNS ( string|null $namespace , string $qualifiedName ) : DOMAttr|false
public createCDATASection ( string $data ) : DOMCdataSection|false
public createComment ( string $data ) : DOMComment|false
public createDocumentFragment ( ) : DOMDocumentFragment|false
public createElement ( string $localName , string $value = "" ) : DOMElement|false
public createElementNS ( string|null $namespace , string $qualifiedName , string $value = "" ) : DOMElement|false
public createEntityReference ( string $name ) : DOMEntityReference|false
public createProcessingInstruction ( string $target , string $data = "" ) : DOMProcessingInstruction|false
public createTextNode ( string $data ) : DOMText|false
public getElementById ( string $elementId ) : DOMElement|null
public getElementsByTagName ( string $qualifiedName ) : DOMNodeList
public getElementsByTagNameNS ( string $namespace , string $localName ) : DOMNodeList
public importNode ( DOMNode $node , bool $deep = false ) : DOMNode|false
public load ( string $filename , int $options = 0 ) : DOMDocument|bool
public loadHTML ( string $source , int $options = 0 ) : DOMDocument|bool
public loadHTMLFile ( string $filename , int $options = 0 ) : DOMDocument|bool
public loadXML ( string $source , int $options = 0 ) : DOMDocument|bool
public normalizeDocument ( ) : void
public registerNodeClass ( string $baseClass , string|null $extendedClass ) : bool
public relaxNGValidate ( string $filename ) : bool
public relaxNGValidateSource ( string $source ) : bool
public save ( string $filename , int $options = 0 ) : int|false
public saveHTML ( DOMNode|null $node = null ) : string|false
public saveHTMLFile ( string $filename ) : int|false
public saveXML ( DOMNode|null $node = null , int $options = 0 ) : string|false
public schemaValidate ( string $filename , int $flags = 0 ) : bool
public schemaValidateSource ( string $source , int $flags = 0 ) : bool
public validate ( ) : bool
public xinclude ( int $options = 0 ) : int|false
/* Méthodes héritées */
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Propriétés

actualEncoding

Obsolète. L'encodage actuel du document, en lecture seule, équivalent àencoding.

config

Obsolète. Configuration utilisée lorsque DOMDocument::normalizeDocument() est appelé.

doctype

Le doctype associé au document.

documentElement

C'est un attribut de convenance, qui permet un accès direct au nœud fils, qui est l'élément document du document.

documentURI

La localisation du document, ou null si indéfini.

encoding

L'encodage du document, tel que spécifié par la déclaration XML. Cet attribut n'est pas présent dans la spécification DOM Level 3 finale, mais représente la seule façon de manipuler l'encodage du document XML dans cette implémentation.

formatOutput

Formate élégamment le résultat avec une indentation et des espaces supplémentaires. Ce paramètre n'a aucun effet si le document a été chargé avec l'activation de preserveWhitespace.

implementation

L'objet DOMImplementation qui gère ce document.

preserveWhiteSpace

Ne pas supprimer les espaces redondants. Vaut par défaut true. Définir ce paramètre à false a le même effet de définir à LIBXML_NOBLANKS le paramètre option de la méthode DOMDocument::load().

recover

Propriétaire. Active le mode "recovery", i.e. tente d'analyser un document mal formé. Cet attribut ne fait pas parti de la spécification DOM et est spécifique à libxml.

resolveExternals

Définissez-le à true pour charger des entités externes depuis la déclaration doctype. C'est utile pour inclure des entités dans vos documents XML.

standalone

Obsolète. Si le document est "standalone", ou non, tel que spécifié par la déclaration XML, correspondant à xmlStandalone.

strictErrorChecking

Lance une DOMException en cas d'erreur. Par défaut, vaut true.

substituteEntities

Propriétaire. Si l'on doit ou non substituer les entités. Cet attribut ne fait pas parti de la spécification DOM et est spécifique à libxml.

Attention

Activer la substitution d'entitées peut faciliter les attaques XML External Entity (XXE).

validateOnParse

Charge et valide la DTD. Par défaut, vaut false.

version

Obsolète. Version du XML, correspond à xmlVersion.

xmlEncoding

Un attribut spécifiant l'encodage du document. Il vaut null lorsque l'encodage n'est pas spécifié, ou lorsqu'il est inconnu, comme c'est le cas lorsque le document a été créé en mémoire.

xmlStandalone

Un attribut spécifiant si le document est "standalone". Il vaut false lorsque non spécifié.

xmlVersion

Un attribut spécifiant le numéro de version du document. S'il n'y a pas de déclaration et si le document supporte la fonctionnalité "XML", la valeur sera "1.0".

Notes

Note:

L'extension DOM utilise l'encodage UTF-8. Utilisez utf8_encode() et utf8_decode() pour travailler avec des textes dans l'encodage ISO-8859-1 ou iconv pour d'autre encodages.

Note:

Lors de l'utilisation de json_encode() sur un objet DOMDocument le résultat sera celui d'encoder un objet vide.

Voir aussi

  • » spécification W3C de Document

Sommaire

  • DOMDocument::__construct — Crée un nouvel objet DOMDocument
  • DOMDocument::createAttribute — Crée un nouvel attribut
  • DOMDocument::createAttributeNS — Crée un nouvel attribut avec un espace de noms associé
  • DOMDocument::createCDATASection — Crée un nouveau nœud cdata
  • DOMDocument::createComment — Crée un nouveau nœud de commentaire
  • DOMDocument::createDocumentFragment — Crée un nouveau fragment de document
  • DOMDocument::createElement — Crée un nouveau nœud
  • DOMDocument::createElementNS — Crée un nouveau nœud avec un espace de noms associé
  • DOMDocument::createEntityReference — Crée un nouveau nœud de référence d'entité
  • DOMDocument::createProcessingInstruction — Crée un nouveau nœud PI
  • DOMDocument::createTextNode — Crée un nouveau nœud de texte
  • DOMDocument::getElementById — Cherche un élément avec un certain identifiant
  • DOMDocument::getElementsByTagName — Cherche tous les éléments qui ont le nom de la balise locale donné
  • DOMDocument::getElementsByTagNameNS — Recherche tous les éléments avec un nom de balise donné dans un espace de noms spécifié
  • DOMDocument::importNode — Importe un nœud dans le document courant
  • DOMDocument::load — Charge du XML depuis un fichier
  • DOMDocument::loadHTML — Charge du code HTML à partir d'une chaîne de caractères
  • DOMDocument::loadHTMLFile — Charge du HTML à partir d'un fichier
  • DOMDocument::loadXML — Charge du XML depuis une chaîne de caractères
  • DOMDocument::normalizeDocument — Normalise le document
  • DOMDocument::registerNodeClass — Enregistre la classe étendue utilisée pour créer un type de base de nœud
  • DOMDocument::relaxNGValidate — Effectue une validation relaxNG sur le document
  • DOMDocument::relaxNGValidateSource — Effectue une validation relaxNG sur le document
  • DOMDocument::save — Sauvegarde l'arbre interne XML dans un fichier
  • DOMDocument::saveHTML — Sauvegarde le document interne dans une chaîne en utilisant un formatage HTML
  • DOMDocument::saveHTMLFile — Sauvegarde un document interne dans un fichier en utilisant un formatage HTML
  • DOMDocument::saveXML — Sauvegarde l'arbre interne XML dans une chaîne de caractères
  • DOMDocument::schemaValidate — Valide un document selon un schéma. Seuls les schémas XML 1.0 sont supportés.
  • DOMDocument::schemaValidateSource — Valide un document selon un schéma
  • DOMDocument::validate — Valide un document en se basant sur sa DTD
  • DOMDocument::xinclude — Remplace les XIncludes dans un objet DOMDocument

User Contributed Notes

pastormontesinos at gmail dot com 04-Mar-2021 10:34
For using safely with script nodes when parsing, best option is extending DOMDocument, keeping script tags while DOMDocument process and rearrange them just after saveHTML function is called. Here is my custom class.

<?php

class SafeDOMDocument extends \DOMDocument
{
    const REGEX_JS            = '#(\s*<!--(\[if[^\n]*>)?\s*(<script.*</script>)+\s*(<!\[endif\])?-->)|(\s*<script.*</script>)#isU';
    const SUBSTITUTION_FORMAT = '<!--<script class="script_%s"></script>-->';
    private $matchedScripts = [];

    public function loadHTML($source, $options = 0)
    {
        $this->formatOutput        = false;
        $this->preserveWhiteSpace  = true;
        $this->validateOnParse     = false;
        $this->strictErrorChecking = false;
        $this->recover             = false;
        $this->resolveExternals    = false;
        $this->substituteEntities  = false;
        $matches = [];
        $success = preg_match_all(self::REGEX_JS, $source, $matches);

        if ($success && !empty($matches)) {
            foreach ($matches[0] as $match) {
                $storedScript = rtrim(ltrim($match, "\n\r\t "), "\n\r\t ");
                $scriptId = md5($storedScript);
                $key = sprintf(self::SUBSTITUTION_FORMAT, $scriptId);
                $source = str_replace($match, $key, $source);
                $this->matchedScripts[$key] = $storedScript;
            }
        }

        return parent::loadHTML($source, $options);
    }

    public function saveHTML(DOMNode $node = null)
    {
        $output = parent::saveHTML($node);

        if (count($this->matchedScripts)) {
            foreach ($this->matchedScripts as $substitution => $originalSnippet) {
                $output = str_replace($substitution, $originalSnippet, $output);
            }
        }

        return $output;
    }
}
?>
ashjkshdu283 at gmail dot com 07-Jul-2018 11:39
/* Function evolved from jay at jaygilford dot com post
  * This function will return an array of the values of the specified
  * attribute ($attr) for all the Dom Document object's elements
  */

<?php

function getAttrData(string $attr, DomDocument $dom) {
    // Empty array to hold all classes to return
    $attrData = array();

    //Loop through each tag in the dom and add it's attribute data to the array
    foreach($dom->getElementsByTagName('*') as $tag) {
        if(empty($tag->getAttribute($attr)) === false) {
            array_push($attrData, $tag->getAttribute($attr));
        }
    }

    //Return the array of attribute data
    return array_unique($attrData);
}

$html = '
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<a href="#someLink" id="someLink" class="link-class">Some Link</a>
<a href="#someOtherLink" id="someOtherLink" class="link-class">Some Other Link</a>
<h1 id="header1" class="header-class">My First Heading</h1>
<p id="para1" class="para-class">My first paragraph.</p>
</body>
</html>';
$dom = new DOMDocument();
$dom->loadHtml($html);
$dom->saveHTML();
var_dump(getAttrData('class', $dom));
biker dot mike at gmx dot com 22-Aug-2016 01:36
Look out for the following gotcha when loading XML from a string:

<?php
$doc = new \DOMDocument;
$doc->documentURI = $myXmlFilename;
$doc->loadXML($myXmlString);
?>

documentURI is now set to the value of $myXmlFilename, right?

Wrong!

It's set to the current working directory.  If you want to manually set documentURI to something other than the CWD, do so AFTER the call to loadXML().

E.g.:
<?php
$doc = new \DOMDocument;
$doc->loadXML($myXmlString);
$doc->documentURI = $myXmlFilename;
?>

documentURI really is now set to the value of $myXmlFilename.
developer at nabtron dot com 17-Dec-2015 07:34
For those landing here and checking for encoding issue with utf-8 characteres, it's pretty easy to correct it, without adding any additional output tag to your html.

We'll be utilizing: mb_convert_encoding

Thanks to the user who shared: SmartDOMDocument in previous comments, I got the idea of solving it. However I truly wish that he shared the method instead of giving a link.

Anyway coming back to the solution, you can simply use:

<?php

            // checks if the content we're receiving isn't empty, to avoid the warning
            if ( empty( $content ) ) {
                return false;
            }

            // converts all special characters to utf-8
            $content = mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8');

            // creating new document
            $doc = new DOMDocument('1.0', 'utf-8');

            //turning off some errors
            libxml_use_internal_errors(true);

            // it loads the content without adding enclosing html/body tags and also the doctype declaration
            $doc->LoadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

            // do whatever you want to do with this code now

?>

I hope it solves the issue for someone! If you need my help or service to fix your code, you can reach me on nabtron.com or contact me at the email mentioned with this comment.
ingjetel at gmail dot com 13-May-2015 11:54
Easy function for basic output of XML file via DOM parsing

<?php
$dom = new DomDocument();
$dom->load("./file.xml") or die("error");
$start = $dom->documentElement;
fc($start);

function fc($node) {
  $child = $node->childNodes;
  foreach($child as $item) {
    if ($item->nodeType == XML_TEXT_NODE) {
      if (strlen(trim($item->nodeValue))) echo trim($item->nodeValue)."<br/>";
    }
    else if ($item->nodeType == XML_ELEMENT_NODE) fc($item);
  }
}
?>
qrworld.net 11-Nov-2014 04:35
In this post http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url_11.html I found a simple way to get the content of a URL with DOMDocument, loadHTMLFile and saveHTML().

function getURLContent($url){
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = FALSE;
    @$doc->loadHTMLFile($url);
    return $doc->saveHTML();
}
danny dot nunez15 at gmail dot com 28-Oct-2013 02:54
A simple function to grab all links in a page.

    function get_links($url) {

        // Create a new DOM Document to hold our webpage structure
        $xml = new DOMDocument();

        // Load the url's contents into the DOM

        $xml->loadHTMLFile($url);

        // Empty array to hold all links to return
        $links = array();

        //Loop through each <a> tag in the dom and add it to the link array
        foreach ($xml->getElementsByTagName('a') as $link) {
            $url = $link->getAttribute('href');
            if (!empty($url)) {
                $links[] = $link->getAttribute('href');
            }
        }

        //Return the links
        return $links;
    }
sites.sitesbr.net 22-Jan-2013 12:37
How to objetify a DomDocument with hierarchy like:
<root>
    <item>
          <prop1>info1</prop1>
          <prop2>info2</prop2>
          <prop3>info3</prop3>
     </item>
    <item>
          <prop1>info1</prop1>
          <prop2>info2</prop2>
          <prop3>info3</prop3>
     </item>
</root>

It's possible to use in object style to retrieve information, as:

<?php
     $theNodeValue = $aitem->prop1;
?>

Here is the code: one Class and 2 functions.

<?php
 class ArrayNode{
       public $nodeName, $nodeValue;
 }

 function getChildNodeElements( $domNode ){
     $nodes = array();
     for( $i=0; $i < $domNode->childNodes->length; $i++){
       $cn = $domNode->childNodes->item($i);
       if( $cn->nodeType == 1){
           $nodes[] = $cn;
           }
     }
    return $nodes;
 }

 function getArrayNodes( $domDoc ){
     $res = array();

       for( $i=0; $i < $domDoc->childNodes->length; $i++){
       $cn = $domDoc->childNodes->item($i);
       # The first is the root tag...
          if( $cn->nodeType == 1){
               # But we want it's childNodes.
                $sub_cn = getChildNodeElements( $cn);
                # Found the tagName:
                $baseItemTagName = $sub_cn[0]->nodeName;
                break;
            }
        }

       $dnl = $domDoc->getElementsByTagName( $baseItemTagName);

       for( $i=0; $i< $dnl->length; $i++){
          $arrayNode = new ArrayNode();

      # Summary
      $arrayNode->nodeName = $dnl->item($i)->nodeName;
      $arrayNode->nodeValue = $dnl->item($i)->nodeValue;

      # Child Nodes
      $cn = $dnl->item($i)->childNodes;
      for( $k=0; $k<$cn->length; $k++){
           if( $cn->item($k)->nodeName == "#text" && trim($cn->item($k)->nodeValue) == "") continue;
           $arrayNode->{$cn->item($k)->nodeName} = $cn->item($k)->nodeValue;
      }

      # Attributes
      $attr = $dnl->item($i)->attributes;
      for( $k=0; $k < $attr->length; $k++){
           if(! is_null($attr)){
            if( $attr->item($k)->nodeName == "#text" && trim($attr->item($k)->nodeValue) == "") continue;
            $arrayNode->{$attr->item($k)->nodeName} = $attr->item($k)->nodeValue;
           }
      }

      $res[] = $arrayNode;

       }

     return $res;
 }
?>

To use it:

<?php

  # First you load a XML in a DomDocument variable.

   $url = "/path/to/yourxmlfile.xml";
   $domSrc = file_get_contents($url);
   $dom = new DomDocument();
   $dom->loadXML( $domSrc );

  # Then, you get the ArrayNodes from the DomDocument.

    $ans = getArrayNodes( $dom );

    for( $i=0; $i < count( $ans ) ; $i++){

    $cn =  $ans[ $i];

    $info1 =  $cn->prop1;
    $info2 =  $cn->prop2;
    $info3 =  $cn->prop3;

         // ...

   }

?>
Nick M 01-Jun-2011 10:16
You may need to save all or part of a DOMDocument as an XHTML-friendly string, something compliant with both XML and HTML 4. Here's the DOMDocument class extended with a saveXHTML method:

<?php

/**
 * XHTML Document
 *
 * Represents an entire XHTML DOM document; serves as the root of the document tree.
 */
class XHTMLDocument extends DOMDocument {

  /**
   * These tags must always self-terminate. Anything else must never self-terminate.
   *
   * @var array
   */
  public $selfTerminate = array(
      'area','base','basefont','br','col','frame','hr','img','input','link','meta','param'
  );

  /**
   * saveXHTML
   *
   * Dumps the internal XML tree back into an XHTML-friendly string.
   *
   * @param DOMNode $node
   *         Use this parameter to output only a specific node rather than the entire document.
   */
  public function saveXHTML(DOMNode $node=null) {

    if (!$node) $node = $this->firstChild;

    $doc = new DOMDocument('1.0');
    $clone = $doc->importNode($node->cloneNode(false), true);
    $term = in_array(strtolower($clone->nodeName), $this->selfTerminate);
    $inner='';

    if (!$term) {
      $clone->appendChild(new DOMText(''));
      if ($node->childNodes) foreach ($node->childNodes as $child) {
        $inner .= $this->saveXHTML($child);
      }
    }

    $doc->appendChild($clone);
    $out = $doc->saveXML($clone);

    return $term ? substr($out, 0, -2) . ' />' : str_replace('><', ">$inner<", $out);

  }

}

?>

This hasn't been benchmarked, but is probably significantly slower than saveXML or saveHTML and should be used sparingly.
evert at er dot nl 20-Nov-2010 02:17
A nice and simple node 2 array I wrote, worth a try ;)

<?php
function getArray($node)
{
    $array = false;

    if ($node->hasAttributes())
    {
        foreach ($node->attributes as $attr)
        {
            $array[$attr->nodeName] = $attr->nodeValue;
        }
    }

    if ($node->hasChildNodes())
    {
        if ($node->childNodes->length == 1)
        {
            $array[$node->firstChild->nodeName] = $node->firstChild->nodeValue;
        }
        else
        {
            foreach ($node->childNodes as $childNode)
            {
                if ($childNode->nodeType != XML_TEXT_NODE)
                {
                    $array[$childNode->nodeName][] = $this->getArray($childNode);
                }
            }
        }
    }

    return $array;
}
?>
admin at beerpla dot net 12-Mar-2010 02:12
After seeing many complaints about certain DOMDocument shortcomings, such as bad handling of encodings and always saving HTML fragments with <html>, <head>, and DOCTYPE, I decided that a better solution is needed.

So here it is: SmartDOMDocument. You can find it at http://beerpla.net/projects/smartdomdocument/

Currently, the main highlights are:

- SmartDOMDocument inherits from DOMDocument, so it's very easy to use - just declare an object of type SmartDOMDocument instead of DOMDocument and enjoy the new behavior on top of all existing functionality (see example below).

- saveHTMLExact() - DOMDocument has an extremely badly designed "feature" where if the HTML code you are loading does not contain <html> and <body> tags, it adds them automatically (yup, there are no flags to turn this behavior off).
Thus, when you call $doc->saveHTML(), your newly saved content now has <html><body> and DOCTYPE in it. Not very handy when trying to work with code fragments (XML has a similar problem).
SmartDOMDocument contains a new function called saveHTMLExact() which does exactly what you would want - it saves HTML without adding that extra garbage that DOMDocument does.

- encoding fix - DOMDocument notoriously doesn't handle encoding (at least UTF-8) correctly and garbles the output.
SmartDOMDocument tries to work around this problem by enhancing loadHTML() to deal with encoding correctly. This behavior is transparent to you - just use loadHTML() as you would normally.

- SmartDOMDocument Object As String - you can use a SmartDOMDocument object as a string which will print out its contents.
For example:
<?php
echo "Here is the HTML: $smart_dom_doc";
?>

I'm going to maintain this code and try to fix bugs as they come in.

Enjoy.
tloach at gmail dot com 05-Feb-2010 10:01
For anyone else who has been having issues with formatOuput not working, here is a work-around:

rather than just doing something like:

<?php
$outXML = $xml->saveXML();
?>

force it to reload the XML from scratch, then it will format correctly:

<?php
$outXML = $xml->saveXML();
$xml = new DOMDocument();
$xml->preserveWhiteSpace = false;
$xml->formatOutput = true;
$xml->loadXML($outXML);
$outXML = $xml->saveXML();
?>
jay at jaygilford dot com 27-Jan-2010 08:46
Here's a small function I wrote to get all page links using the DOMDocument which will hopefully be of use to others

<?php
/**
 * @author Jay Gilford
 */

/**
 * get_links()
 *
 * @param string $url
 * @return array
 */
function get_links($url) {

    // Create a new DOM Document to hold our webpage structure
    $xml = new DOMDocument();

    // Load the url's contents into the DOM
    $xml->loadHTMLFile($url);

    // Empty array to hold all links to return
    $links = array();

    //Loop through each <a> tag in the dom and add it to the link array
    foreach($xml->getElementsByTagName('a') as $link) {
        $links[] = array('url' => $link->getAttribute('href'), 'text' => $link->nodeValue);
    }

    //Return the links
    return $links;
}
?>
fcartegnie 31-Oct-2009 01:30
Be careful with formatOutput().

Creating an empty node like this:
createElement('foo','')
instead of
createElement('foo')
will break formatOutput.
PhilipWayneRollins at gmail dot com 15-Aug-2009 01:32
If you want to use the DOMDocument to create xHTML documents here is a simple class

Note this is designed for creating xHTML documents from scratch but could be easily extended to work with xHTML documents. Also this is for xHTML not XML.

<?php
    class Document
    {
        public $doctype;
        public $head;
        public $title = 'Sensei Ninja';
        public $body;
        private $styles;
        private $metas;
        private $scripts;
        private $document;

        function __construct (  )
        {
            $this->document = new DOMDocument( );
            $this->head = $this->document->createElement( 'head', ' ' );
            $this->body = $this->document->createElement( 'body', ' ' );
        }

        public function addStyleSheet ( $url, $media='all' )
        {
            $element = $this->document->createElement( 'link' );
            $element->setAttribute( 'type', 'text/css' );
            $element->setAttribute( 'href', $url );
            $element->setAttribute( 'media', $media );
            $this->styles[] = $element;
        }

        public function addScript ( $url )
        {
            $element = $this->document->createElement( 'script', ' ' );
            $element->setAttribute( 'type', 'text/javascript' );
            $element->setAttribute( 'src', $url );
            $this->scripts[] = $element;
        }

        public function addMetaTag ( $name, $content )
        {
            $element = $this->document->createElement( 'meta' );
            $element->setAttribute( 'name', $name );
            $element->setAttribute( 'content', $content );
            $this->metas[] = $element;
        }

        public function setDescription ( $dec )
        {
            $this->addMetaTag( 'description', $dec );
        }

        public function setKeywords ( $keywords )
        {
            $this->addMetaTag( 'keywords', $keywords );
        }

        public function createElement ( $nodeName, $nodeValue=null )
        {
          return $this->document->createElement( $nodeName, $nodeValue );
        }

        public function assemble ( )
        {
            // Doctype creation
            $doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML TRANSITIONAL 1.0//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';

            // Create the head element
            $title = $this->document->createElement( 'title', $this->title );
            // Add stylesheets if needed
            if ( is_array( $this->styles ))
                foreach ( $this->styles as $element )
                    $this->head->appendChild( $element );
            // Add scripts if needed
            if(  is_array( $this->scripts ))
                foreach ( $this->scripts as $element )
                    $this->head->appendChild( $element );
            // Add meta tags if needed
            if ( is_array( $this->metas ))
                foreach ( $this->metas as $element )
                    $this->head->appendChild( $element );
            $this->head->appendChild( $title );

            // Create the document
            $html = $this->document->createElement( 'html' );
            $html->setAttribute( 'xmlns', 'http://www.w3.org/1999/xhtml' );
            $html->setAttribute( 'xml:lang', 'en' );
            $html->setAttribute( 'lang', 'en' );
            $html->appendChild( $this->head );
            $html->appendChild( $this->body );

            $this->document->appendChild( $html );
            return $doctype . $this->document->saveXML( );
        }

    }

?>

Small example

<?php
        $document = new Document( );
    $document->title = 'Hello';
    $document->addStyleSheet( 'StyleSheets/main.css' );
    $div = $document->createElement( 'div' );
    $div->nodeValue = 'Hello, world!';
    $div->setAttribute( 'style', 'color: red;' );
    $document->body->appendChild( $div );
    printf( '%s', $document->assemble( ) );
?>
cmyk777 at gmail dot com 23-May-2009 12:31
This function may help to debug current dom element:

<?php
function dom_dump($obj) {
    if ($classname = get_class($obj)) {
        $retval = "Instance of $classname, node list: \n";
        switch (true) {
            case ($obj instanceof DOMDocument):
                $retval .= "XPath: {$obj->getNodePath()}\n".$obj->saveXML($obj);
                break;
            case ($obj instanceof DOMElement):
                $retval .= "XPath: {$obj->getNodePath()}\n".$obj->ownerDocument->saveXML($obj);
                break;
            case ($obj instanceof DOMAttr):
                $retval .= "XPath: {$obj->getNodePath()}\n".$obj->ownerDocument->saveXML($obj);
                //$retval .= $obj->ownerDocument->saveXML($obj);
                break;
            case ($obj instanceof DOMNodeList):
                for ($i = 0; $i < $obj->length; $i++) {
                    $retval .= "Item #$i, XPath: {$obj->item($i)->getNodePath()}\n".
"{$obj->item($i)->ownerDocument->saveXML($obj->item($i))}\n";
                }
                break;
            default:
                return "Instance of unknown class";
        }
    } else {
        return 'no elements...';
    }
    return htmlspecialchars($retval);
}
?>

Example usage:

<?php
$dom = new DomDocument();
$dom->load('test.xml');
$body = $dom->documentElement->getElementsByTagName('book');
echo '<pre>'.dom_dump($body).'<pre>';
?>

Output:

Instance of DOMNodeList, node list:
Item #0, XPath: /library/book[1]
<book isbn="0345342968">
<title>Fahrenheit 451</title>
<author>R. Bradbury</author>
<publisher>Del Rey</publisher>
</book>
Item #1, XPath: /library/book[2]
<book isbn="0048231398">
<title>The Silmarillion</title>
<author>J.R.R. Tolkien</author>
<publisher>G. Allen &amp; Unwin</publisher>
</book>
Item #2, XPath: /library/book[3]
<book isbn="0451524934">
<title>1984</title>
<author>G. Orwell</author>
<publisher>Signet</publisher>
</book>
Item #3, XPath: /library/book[4]
<book isbn="031219126X">
<title>Frankenstein</title>
<author>M. Shelley</author>
<publisher>Bedford</publisher>
</book>
Item #4, XPath: /library/book[5]
<book isbn="0312863551">
<title>The Moon Is a Harsh Mistress</title>
<author>R. A. Heinlein</author>
<publisher>Orb</publisher>
</book>
Fernando H 11-Apr-2008 12:48
Showing a quick example of how to use this class, just so that new users can get a quick start without having to figure it all out by themself. ( At the day of posting, this documentation just got added and is lacking examples. )

<?php

// Set the content type to be XML, so that the browser will   recognise it as XML.
header( "content-type: application/xml; charset=ISO-8859-15" );

// "Create" the document.
$xml = new DOMDocument( "1.0", "ISO-8859-15" );

// Create some elements.
$xml_album = $xml->createElement( "Album" );
$xml_track = $xml->createElement( "Track", "The ninth symphony" );

// Set the attributes.
$xml_track->setAttribute( "length", "0:01:15" );
$xml_track->setAttribute( "bitrate", "64kb/s" );
$xml_track->setAttribute( "channels", "2" );

// Create another element, just to show you can add any (realistic to computer) number of sublevels.
$xml_note = $xml->createElement( "Note", "The last symphony composed by Ludwig van Beethoven." );

// Append the whole bunch.
$xml_track->appendChild( $xml_note );
$xml_album->appendChild( $xml_track );

// Repeat the above with some different values..
$xml_track = $xml->createElement( "Track", "Highway Blues" );

$xml_track->setAttribute( "length", "0:01:33" );
$xml_track->setAttribute( "bitrate", "64kb/s" );
$xml_track->setAttribute( "channels", "2" );
$xml_album->appendChild( $xml_track );

$xml->appendChild( $xml_album );

// Parse the XML.
print $xml->saveXML();

?>

Output:
<Album>
  <Track length="0:01:15" bitrate="64kb/s" channels="2">
    The ninth symphony
    <Note>
      The last symphony composed by Ludwig van Beethoven.
    </Note>
  </Track>
  <Track length="0:01:33" bitrate="64kb/s" channels="2">Highway Blues</Track>
</Album>

If you want your PHP->DOM code to run under the .xml extension, you should set your webserver up to run the .xml extension with PHP ( Refer to the installation/configuration configuration for PHP on how to do this ).

Note that this:
<?php
$xml = new DOMDocument( "1.0", "ISO-8859-15" );
$xml_album = $xml->createElement( "Album" );
$xml_track = $xml->createElement( "Track" );
$xml_album->appendChild( $xml_track );
$xml->appendChild( $xml_album );
?>

is NOT the same as this:
<?php
// Will NOT work.
$xml = new DOMDocument( "1.0", "ISO-8859-15" );
$xml_album = new DOMElement( "Album" );
$xml_track = new DOMElement( "Track" );
$xml_album->appendChild( $xml_track );
$xml->appendChild( $xml_album );
?>

although this will work:
<?php
$xml = new DOMDocument( "1.0", "ISO-8859-15" );
$xml_album = new DOMElement( "Album" );
$xml->appendChild( $xml_album );
?>


Crée un nouvel objet DOMDocument

  • « DOMDocument
  • DOMDocument::createAttribute »
  • PHP Manual
  • DOMDocument
  • Crée un nouvel objet DOMDocument

DOMDocument::__construct

(PHP 5, PHP 7)

DOMDocument::__construct — Crée un nouvel objet DOMDocument

Description

public DOMDocument::__construct
 ( string $version = "1.0"
, string $encoding = ""
)

Crée un nouvel objet DOMDocument.

Liste de paramètres

version

Le numéro de version du document en tant que partie de la déclaration XML.

encoding

L'encodage du document en tant que partie de la déclaration XML.

Exemples

Exemple #1 Création d'un nouveau DOMDocument

<?php

$dom = new DOMDocument('1.0', 'iso-8859-1');

echo $dom->saveXML(); /* <?xml version="1.0" encoding="iso-8859-1"?> */

?>

Voir aussi

  • DOMImplementation::createDocument() - Crée un objet DOM Document du type spécifié avec ses éléments

User Contributed Notes

qrworld.net 11-Nov-2014 04:36
In this post http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url_11.html I found a simple way to get the content of a URL with DOMDocument, loadHTMLFile and saveHTML().

function getURLContent($url){
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = FALSE;
    @$doc->loadHTMLFile($url);
    return $doc->saveHTML();
}
_ michael 01-Jun-2010 07:23
The constuctor arguments are useful if you want to build a new document using createElement, appendChild etc.

By contrast, these arguments are overriden as soon as you load a document from source by calling load() or loadXML().

* If the source contains an XML declaration specifying an encoding, that encoding is used.
* If the XML declaration does not specify an encoding, or if the source does not contain a declaration at all, UTF-8 is assumed.

This behaviour applies no matter what you declared when you called new DOMDocument().
blackhailang at gmail dot com 09-Oct-2008 07:54
domdocument::domdocument() expects at least
At the least, I found that It due to ZEND optimizer, uninstall it,working well, but the speeds will be slowlly :-(.

Comment :
item 1 : 2008-10-03 17:10:58, gkrong said:
"Warning: domdocument::domdocument() expects at least 1
 parameter"
If you use PHP 5 in windows, you don't need to declare
php_domxml.dll in your php.ini file.
so u can give comment in the line php_domxml.dll in your
php.ini file.
you only need to comment it out, but do not delete the
php_domxml.dll file in the ext directory.
steve at mrclay dot org 08-Oct-2008 09:45
To expand on bholbrook's comment, if you receive this: "Warning: domdocument::domdocument() expects at least 1 parameter", it is due to the old domxml extension, which you need to disable.

domxml overwrites DOMDocument::_construct with an alias to domxml_open_mem, so this code:
<?php
$doc = new DOMDocument();
?>
...essentially does this:
<?php
$dom = domxml_open_mem();
?>
...which is why PHP complains about expecting at least 1 parameter (it expects a string of XML).
christian dot reinecke at web dot de 15-Jul-2008 07:09
If you get the error message "domdocument::domdocument() expects parameter 2 to be long, string given"  for a code sample like this:

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->xmlStandalone = false;
echo $dom->saveXML();

which is obviously correct if you compare the constructor signature:

__construct  ([ string $version  [, string $encoding  ]] )

make sure you're not overwritting this dom library by another (f.e. extension=php_domxml.dll in php.ini). XAMPP f.e. delivers its standard version with php_domxml.dll which ends up in this error message
dave at revlob dot com 14-Feb-2008 02:07
@Jarl

Not sure if this is what you meant when you said "The constructor example clearly shows that version and encoding only end up in the XML header", but you can also affect other parameters in the generated XML header, by accessing the DOMDocument's properties, for example:

<?php

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->xmlStandalone = false;
echo $dom->saveXML();

// <?xml version="1.0" encoding="UTF-8" standalone="no"?>
bholbrook at servillian dot com 05-Dec-2007 02:25
Make sure that php_domxml.dll on windows is removed before using the domdocument class as they cannot coexist.
jarl kringelding skim punt com 24-Sep-2007 02:22
Be aware using the encoding parameter in the constructor.
It does not mean that all data is automatically encoded for you in the supplied encoding. You need to do that yourself once you choose an encoding other than the default UTF-8. See the note on DOM Functions on how to properly work with other encodings...

The constructor example clearly shows that version and encoding only end up in the XML header.


Crée un nouvel attribut

  • « DOMDocument::__construct
  • DOMDocument::createAttributeNS »
  • PHP Manual
  • DOMDocument
  • Crée un nouvel attribut

DOMDocument::createAttribute

(PHP 5, PHP 7)

DOMDocument::createAttribute — Crée un nouvel attribut

Description

public DOMDocument::createAttribute ( string $localName ) : DOMAttr|false

Cette fonction crée une nouvelle instance de la classe DOMAttr. Ce nœud ne sera pas affiché dans le document, à moins qu'il ne soit inséré avec DOMNode::appendChild().

Liste de paramètres

localName

Le nom de l'attribut.

Valeurs de retour

Le nouveau DOMAttr ou false si une erreur survient.

Erreurs / Exceptions

DOM_INVALID_CHARACTER_ERR

Émise si localName contient un caractère invalide.

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils
  • DOMDocument::createAttributeNS() - Crée un nouvel attribut avec un espace de noms associé
  • DOMDocument::createCDATASection() - Crée un nouveau nœud cdata
  • DOMDocument::createComment() - Crée un nouveau nœud de commentaire
  • DOMDocument::createDocumentFragment() - Crée un nouveau fragment de document
  • DOMDocument::createElement() - Crée un nouveau nœud
  • DOMDocument::createElementNS() - Crée un nouveau nœud avec un espace de noms associé
  • DOMDocument::createEntityReference() - Crée un nouveau nœud de référence d'entité
  • DOMDocument::createProcessingInstruction() - Crée un nouveau nœud PI
  • DOMDocument::createTextNode() - Crée un nouveau nœud de texte

User Contributed Notes

Skateside 05-Apr-2013 04:16
This may be obvious to most people, but it gave me a few minutes of head-scratching before I figured it out, but ampersands need to be properly escaped as HTML entities.

<?php
$doc= new DOMDocument('1.0', "UTF-8");

$invalid_elem = $doc->createElement('field', 'incorrect attribute');
$invalid_attr = $doc->createAttribute('name');
$invalid_attr->value = 'foo&bar';
$invalid_elem->appendChild($invalid_attr);
$doc->appendChild($invalid_elem);

$valid_elem = $doc->createElement('field', 'correct attribute');
$valid_attr = $doc->createAttribute('name');
$valid_attr->value = 'foo&amp;bar';
$valid_elem->appendChild($valid_attr);
$doc->appendChild($valid_elem);

?>

Will output:
<?xml version="1.0" encoding="UTF-8"?>
<field name="foo">incorrect attribute</field>
<field name="foo&bar">correct attribute</field>

As near as I can figure out, no exception is thrown for an invalid attribute. This will affect DOMDocuments created as HTML as well as XML.
Beerkeeper 09-Nov-2011 07:19
Just in case it isn't clear (like I had), an example:

<?php

$domDocument = new DOMDocument('1.0', "UTF-8");
$domElement = $domDocument->createElement('field','some random data');
$domAttribute = $domDocument->createAttribute('name');

// Value for the created attribute
$domAttribute->value = 'attributevalue';

// Don't forget to append it to the element
$domElement->appendChild($domAttribute);

// Append it to the document itself
$domDocument->appendChild($domElement);

?>

Will output:
<?xml version="1.0" encoding="UTF-8"?>
<field name="attributevalue">some random data</field>


Crée un nouvel attribut avec un espace de noms associé

  • « DOMDocument::createAttribute
  • DOMDocument::createCDATASection »
  • PHP Manual
  • DOMDocument
  • Crée un nouvel attribut avec un espace de noms associé

DOMDocument::createAttributeNS

(PHP 5, PHP 7)

DOMDocument::createAttributeNS — Crée un nouvel attribut avec un espace de noms associé

Description

public DOMDocument::createAttributeNS ( string|null $namespace , string $qualifiedName ) : DOMAttr|false

Cette fonction crée une nouvelle instance de la classe DOMAttr. Ce nœud ne sera pas affiché dans le document, à moins qu'il ne soit inséré avec DOMNode::appendChild().

Liste de paramètres

namespace

L'URI de l'espace de noms.

qualifiedName

Le nom de la balise et le préfixe de l'attribut, sous cette forme : préfixe:nomBalise.

Valeurs de retour

Le nouveau DOMAttr ou false si une erreur survient.

Erreurs / Exceptions

DOM_INVALID_CHARACTER_ERR

Lancé si qualifiedName contient un caractère invalide.

DOM_NAMESPACE_ERR

Lancé si qualifiedName est un nom qualifié malformé ou si qualifiedName a un suffixe et que namespace est null.

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils
  • DOMDocument::createAttribute() - Crée un nouvel attribut
  • DOMDocument::createCDATASection() - Crée un nouveau nœud cdata
  • DOMDocument::createComment() - Crée un nouveau nœud de commentaire
  • DOMDocument::createDocumentFragment() - Crée un nouveau fragment de document
  • DOMDocument::createElement() - Crée un nouveau nœud
  • DOMDocument::createElementNS() - Crée un nouveau nœud avec un espace de noms associé
  • DOMDocument::createEntityReference() - Crée un nouveau nœud de référence d'entité
  • DOMDocument::createProcessingInstruction() - Crée un nouveau nœud PI
  • DOMDocument::createTextNode() - Crée un nouveau nœud de texte

User Contributed Notes

_ michael 01-Jun-2010 07:35
If a new namespace is introduced while creating and inserting an attribute, createAttributeNS() does not behave in the same way as createElementNS().

(1) Location: With createAttributeNS(), the new namespace is declared at the level of the document element. By contrast, createElementNS() declares the new namespace at the level of the affected element itself.

(2) Timing: With createAttributeNS(), the new namespace is declared in the document as soon as the attribute is created - the attribute does not actually have to be inserted. createElementNS() doesn't affect the document as long as the element is not inserted.

An example:

<?php

    $source = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<root><tag></tag></root>
XML;

    /*

     I. createAttributeNS:
     * a new namespace shows up immediately, even without insertion of the attribute
     * the new namespace is declared at the level of the document element

    */

    $doc = new DOMDocument( '1.0' );
    $doc->loadXML( $source );

    // (1) We just create a "namespace'd" attribute without appending it to any element.
    $attr_ns = $doc->createAttributeNS( '{namespace_uri_here}', 'example:attr' );

    print $doc->saveXML() . "\n";

    /*
      Result: The namespace declaration appears, having been added to the document element. Output:

      <?xml version="1.0" encoding="UTF-8"?>
      <root xmlns:example="{namespace_uri_here}"><tag/></root>

    */

    // (2) Next, we give the attribute a value and insert it.
    $attr_ns->value = 'value';
    $doc->getElementsByTagName( 'tag' )->item(0)->appendChild( $attr_ns );

    print $doc->saveXML() . "\n";

    /*
      Result: The "namespace'd" attribute shows up as well. Output:

      <?xml version="1.0" encoding="UTF-8"?>
      <root xmlns:example="{namespace_uri_here}"><tag example:attr="value"/></root>

    */

    /*

     II. createElementNS:
     * a new namespace shows up only when the element is inserted
     * the new namespace is declared at the level of the inserted element

    */

    $doc = new DOMDocument( '1.0' );
    $doc->loadXML( $source );

    // (1) We create a "namespace'd" element without inserting it into the document.
    $elem_ns = $doc->createElementNS( '{namespace_uri_here}', 'example:newtag' );

    print $doc->saveXML() . "\n";

    /*
      Result: The document remains unchanged. Output:

      <?xml version="1.0" encoding="UTF-8"?>
      <root><tag/></root>

    */

    // (2) Next, we insert the new element.
    $doc->getElementsByTagName( 'tag' )->item(0)->appendChild( $elem_ns );

    print $doc->saveXML() . "\n";

    /*
      Result: The namespace declaration appears, and it is embedded in the element using it. Output:

      <?xml version="1.0" encoding="UTF-8"?>
      <root><tag><example:newtag xmlns:example="{namespace_uri_here}"/></tag></root>

    */

?>


Crée un nouveau nœud cdata

  • « DOMDocument::createAttributeNS
  • DOMDocument::createComment »
  • PHP Manual
  • DOMDocument
  • Crée un nouveau nœud cdata

DOMDocument::createCDATASection

(PHP 5, PHP 7)

DOMDocument::createCDATASection — Crée un nouveau nœud cdata

Description

public DOMDocument::createCDATASection ( string $data ) : DOMCdataSection|false

Cette fonction crée une nouvelle instance de la classe DOMCDATASection. Ce nœud ne sera pas affiché dans le document, à moins qu'il ne soit inséré avec DOMNode::appendChild().

Liste de paramètres

data

Le contenu du cdata.

Valeurs de retour

Le nouveau DOMCDATASection ou false si une erreur survient.

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils
  • DOMDocument::createAttribute() - Crée un nouvel attribut
  • DOMDocument::createAttributeNS() - Crée un nouvel attribut avec un espace de noms associé
  • DOMDocument::createComment() - Crée un nouveau nœud de commentaire
  • DOMDocument::createDocumentFragment() - Crée un nouveau fragment de document
  • DOMDocument::createElement() - Crée un nouveau nœud
  • DOMDocument::createElementNS() - Crée un nouveau nœud avec un espace de noms associé
  • DOMDocument::createEntityReference() - Crée un nouveau nœud de référence d'entité
  • DOMDocument::createProcessingInstruction() - Crée un nouveau nœud PI
  • DOMDocument::createTextNode() - Crée un nouveau nœud de texte

User Contributed Notes

Marc info[at]braincast.nl 08-Mar-2011 01:55
Here's some code that takes an associative array and prints it asXML() but creates CDATA sections for each string

<?php
class SimpleXMLExtended extends SimpleXMLElement{
    public function addCData($string){
        $dom = dom_import_simplexml($this);
        $cdata = $dom->ownerDocument->createCDATASection($string);
        $dom->appendChild($cdata);
    }
}
function assocArrayToXML($root_element_name,$ar){
    $xml = new SimpleXMLExtended("<?xml version=\"1.0\"?><{$root_element_name}></{$root_element_name}>");
    $f = create_function('$f,$c,$a','
            foreach($a as $k=>$v) {
                if(is_array($v)) {
                    if (!is_numeric($k))$ch=$c->addChild($k);
                    else $ch = $c->addChild(substr($c->getName(),0,-1));
                    $f($f,$ch,$v);
                } else {
                    if (is_numeric($v)){ $c->addChild($k, $v);
                    }else{$n = $c->addChild($k); $n->addCData($v);}
                }
            }');
    $f($f,$xml,$ar);
    return $xml->asXML();
}

/* sample */
$result = array("title"=>"CDATA Sample");
$result['items'] = array();
$result['items'][] = array('title'=>'Some string', 'number' => 1);
$result['items'][] = array('title'=>'Some string', 'number' => 2);
$result['items'][] = array('title'=>'Some string', 'number' => 3);

echo assocArrayToXML('result',$result);
?>

The is_numeric check could be changed by a more elaborate regular expression to check if the string is actually xml unsafe but this worked for me.
jesdisciple dot FOO at gmail dot BAR dot com 08-Jul-2010 04:44
If you would like to refer to the documentation for the class of the returned object, see http://www.php.net/manual/en/class.domcharacterdata.php
info at troptoek dot com 24-Mar-2008 09:40
A common issue seems to be adding javascript to CDATA and the browser throwing a javascript error. To ensure the javascript works use the following code when adding CDATA:

<?php
/**
 * Append Caracter Data to a node and check for a javascript node
 *
 * @param DOMElement $appendToNode
 * @param string $text
 */
function appendCdata($appendToNode, $text)
{
    if (strtolower($appendToNode->nodeName) == 'script') {  // Javascript hack
        $cm = $appendToNode->ownerDocument->createTextNode("\n//");
        $ct = $appendToNode->ownerDocument->createCDATASection("\n" . $text . "\n//");
        $appendToNode->appendChild($cm);
        $appendToNode->appendChild($ct);
    } else {  // Normal CDATA node
        $ct = $appendToNode->ownerDocument->createCDATASection($text);
        $appendToNode->appendChild($ct);
    }
}
?>
The result should be:

<script type="text/javascript">
//<![CDATA[
function someJsText() {
   document.write('Some js with <a href="#">HTML</a> content');
}
//]]></script>
loathsome 04-Aug-2007 02:28
Here's a function that will create a CDATA-section around a string coming from SimpleXML.

<?php
function sxml_cdata($path, $string){
  $dom = dom_import_simplexml($path);
  $cdata = $dom->ownerDocument->createCDATASection($string);
  $dom->appendChild($cdata);
}
?>


Crée un nouveau nœud de commentaire

  • « DOMDocument::createCDATASection
  • DOMDocument::createDocumentFragment »
  • PHP Manual
  • DOMDocument
  • Crée un nouveau nœud de commentaire

DOMDocument::createComment

(PHP 5, PHP 7)

DOMDocument::createComment — Crée un nouveau nœud de commentaire

Description

public DOMDocument::createComment ( string $data ) : DOMComment|false

Cette fonction crée une nouvelle instance de la classe DOMComment. Ce nœud ne sera pas affiché dans le document, à moins qu'il ne soit inséré avec DOMNode::appendChild().

Liste de paramètres

data

Le contenu du commentaire.

Valeurs de retour

Le nouveau DOMComment ou false si une erreur survient.

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils
  • DOMDocument::createAttribute() - Crée un nouvel attribut
  • DOMDocument::createAttributeNS() - Crée un nouvel attribut avec un espace de noms associé
  • DOMDocument::createCDATASection() - Crée un nouveau nœud cdata
  • DOMDocument::createDocumentFragment() - Crée un nouveau fragment de document
  • DOMDocument::createElement() - Crée un nouveau nœud
  • DOMDocument::createElementNS() - Crée un nouveau nœud avec un espace de noms associé
  • DOMDocument::createEntityReference() - Crée un nouveau nœud de référence d'entité
  • DOMDocument::createProcessingInstruction() - Crée un nouveau nœud PI
  • DOMDocument::createTextNode() - Crée un nouveau nœud de texte

User Contributed Notes

php dot sirlancelot at spamgourmet dot com 25-Nov-2009 12:10
To prevent a parser error when the comment string would contain the character sequence "--", do this:

<?php

$CommentString = 'This contains -- some weird -- characters.';

$CommentNode = $DomDocument->createComment(
        str_replace('--', '-'.chr(194).chr(173).'-', $CommentString)
);
?>

This will insert a Soft Hyphen in between the two hyphens which will not cause the parser to error out.
capps at solareclipse dot net 29-Mar-2007 03:55
Use caution: this function does NOT escape, encode, or otherwise change the contents of the string.

This means that if your string contains two hyphens in a row (--), that will *end* the comment, which can easily create invalid XML when the document is serialized.


Crée un nouveau fragment de document

  • « DOMDocument::createComment
  • DOMDocument::createElement »
  • PHP Manual
  • DOMDocument
  • Crée un nouveau fragment de document

DOMDocument::createDocumentFragment

(PHP 5, PHP 7)

DOMDocument::createDocumentFragment — Crée un nouveau fragment de document

Description

public DOMDocument::createDocumentFragment ( ) : DOMDocumentFragment|false

Cette fonction crée une nouvelle instance de la classe DOMDocumentFragment. Ce nœud ne sera pas affiché dans le document, à moins qu'il ne soit inséré avec DOMNode::appendChild().

Valeurs de retour

Le nouveau DOMDocumentFragment ou false si une erreur survient.

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils
  • DOMDocument::createAttribute() - Crée un nouvel attribut
  • DOMDocument::createAttributeNS() - Crée un nouvel attribut avec un espace de noms associé
  • DOMDocument::createCDATASection() - Crée un nouveau nœud cdata
  • DOMDocument::createComment() - Crée un nouveau nœud de commentaire
  • DOMDocument::createElement() - Crée un nouveau nœud
  • DOMDocument::createElementNS() - Crée un nouveau nœud avec un espace de noms associé
  • DOMDocument::createEntityReference() - Crée un nouveau nœud de référence d'entité
  • DOMDocument::createProcessingInstruction() - Crée un nouveau nœud PI
  • DOMDocument::createTextNode() - Crée un nouveau nœud de texte

User Contributed Notes

There are no user contributed notes for this page.


Crée un nouveau nœud

  • « DOMDocument::createDocumentFragment
  • DOMDocument::createElementNS »
  • PHP Manual
  • DOMDocument
  • Crée un nouveau nœud

DOMDocument::createElement

(PHP 5, PHP 7)

DOMDocument::createElement — Crée un nouveau nœud

Description

public DOMDocument::createElement ( string $localName , string $value = "" ) : DOMElement|false

Cette fonction crée une nouvelle instance de la classe DOMElement. Ce nœud ne sera pas affiché dans le document, à moins qu'il ne soit inséré avec DOMNode::appendChild().

Liste de paramètres

name

Le nom du tag de l'élément.

value

La valeur de l'élément. Par défaut, un élément vide sera créé. La valeur peut également être définie plus tard avec DOMElement::$nodeValue.

La valeur est utilisé textuellement à l'exception des références d'entités < et > qui seront échappées. Notez que & doit être échappé manuellement ; sinon ceci est considéré comme le début d'une référence d'entité. De plus " ne sera pas échappé.

Valeurs de retour

Retourne une nouvelle instance de la classe DOMElement ou false si une erreur survient.

Erreurs / Exceptions

DOM_INVALID_CHARACTER_ERR

Lancé si localName contient un caractère invalide.

Exemples

Exemple #1 Création d'un nouvel élément et insertion en tant que racine

<?php

$dom = new DOMDocument('1.0', 'utf-8');

$element = $dom->createElement('test', 'Ceci est l\'élément racine !');

// Nous insérons le nouvel élément en tant que racine (enfant du document)
$dom->appendChild($element);

echo $dom->saveXML();
?>

L'exemple ci-dessus va afficher :

<?xml version="1.0" encoding="utf-8"?>
<test>Ceci est l'élément racine !</test>

Exemple #2 Passer comme value du texte contenant & non échappé

<?php
$dom = new DOMDocument('1.0', 'utf-8');
$element = $dom->createElement('foo', 'me & you');
$dom->appendChild($element);
echo $dom->saveXML();
?>

Résultat de l'exemple ci-dessus est similaire à :

Warning: DOMDocument::createElement(): unterminated entity reference             you in /in/BjTCg on line 4
<?xml version="1.0" encoding="utf-8"?>
<foo/>

Notes

Note:

La valeur value ne sera pas échappée. Utilisez la méthode DOMDocument::createTextNode() pour créer un nœud de texte avec le support de l'échappement.

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils
  • DOMDocument::createAttribute() - Crée un nouvel attribut
  • DOMDocument::createAttributeNS() - Crée un nouvel attribut avec un espace de noms associé
  • DOMDocument::createCDATASection() - Crée un nouveau nœud cdata
  • DOMDocument::createComment() - Crée un nouveau nœud de commentaire
  • DOMDocument::createDocumentFragment() - Crée un nouveau fragment de document
  • DOMDocument::createElementNS() - Crée un nouveau nœud avec un espace de noms associé
  • DOMDocument::createEntityReference() - Crée un nouveau nœud de référence d'entité
  • DOMDocument::createProcessingInstruction() - Crée un nouveau nœud PI
  • DOMDocument::createTextNode() - Crée un nouveau nœud de texte

User Contributed Notes

dignat at yahoo dot com 15-Nov-2017 10:25
To create an element with DomDocument and to escape ampersand in the value.

Do this:

$element = new DOMDocument('1.0', 'UTF-8');

$test = $element->createElement('text');

$test ->appendChild($element->createElement('name'))
      ->appendChild($element->createtextNode('& I am ampersand');
tschmieder at bitworks dot de 24-Mar-2015 05:42
Remember:

If you want to perform multiple actions with a new node, you may need to create a copy of it before

means:
## Create an address to an unique memory block !
$td = $dom->createElement('td');
## Change some things in this original unique pattern
$td->setAttribute('class', 'saldo');

## clone the unique pattern to two own one's
$td1 = clone $td;
$td2 = clone $td;

## alter properties in each one
$td1->nodeValue = 'Ich bin die erste neue Node';
$td2->nodeValue = 'Ich bin die zweite neue Node';

## find the parent element
$tr = $dom->getElementById('t001-tr001');
## find the first and the last child (here only for clearity)
$first = $tr->firstChild;
$last = $tr->lastChild;

## produce the new nodes
$newtd1 = $tr->insertBefore($td1, $first);
$newtd2 = $tr->appendChild($td2);

conclusion:
YOU NEED AN ORIGINAL NEW NODE FOR EACH ACTION!
funkathustra 04-Mar-2012 08:44
Although the built-in DOM functions are great, since they're designed to support generic XML, generating HTML DOMs becomes particularly verbose. I ended up writing this function to drastically speed things up.
Instead of calling something like
<?php
  $div = $dom->createElement("div");
  $div->setAttribute("class","MyClass");
  $div->setAttribute("id","MyID");
  $someOtherDiv->appendChild($div);
?>
you can accomplish the same thing with:
<?php
  $div = newElement("div", $someOtherDiv, "class=MyClass;id=MyID");
?>
The "key1=value;key2=value" syntax is really fast to use, but obviously doesn't hold up if your content has those characters in it. So, you can also pass it an array:
<?php
  $div = newElement("div", $someOtherDiv, array("class","MyClass"));
?>
Or an array of arrays, representing different attributes:
<?php
  $div = newElement("form", $someOtherDiv, array(array("method","get"), array("action","/refer/?id=5");
?>

Here's the function:

<?php
function newElement($type, $insertInto = NULL, $params=NULL, $content="")
    {
        $tempEl =  $this->dom->createElement($type, $content);
        if(gettype($params) == "string" && strlen($params) > 0)
        {
            $attributesCollection =split(";", $params);
            foreach($attributesCollection  as $attribute)
            {
                $keyvalue = split("=", $attribute);
                $tempEl->setAttribute($keyvalue[0], $keyvalue[1]);
            }
        }
        if(gettype($params) == "array")
        {
            if(gettype($params[0]) == "array")
            {
                foreach($params as $attribute)
                {
                    $tempEl->setAttribute($attribute[0], $attribute[1]);
                }
            } else {
                $tempEl->setAttribute($params[0], $params[1]);
            }
        }
?>
lars dot c dot magnusson at gmail dot com 26-Nov-2010 01:56
You may think insertBefore and insertAfter is a direct alternative for appendChild, this is not the case.

<?php
$dom = new DOMDocument();
$dom->load($file);

$dom->appendChild($newNode); //Works fine
$dom->insertBefore($newNode, $refNode); //Will fail

$refNode->parentNode->insertBefore($newNode, $refNode); // thanx to yasindagli (first post)
?>
yasindagli at gmail dot com 17-Jun-2009 02:01
To create elements with attributes,

<?php

function createElement($domObj, $tag_name, $value = NULL, $attributes = NULL)
{
    $element = ($value != NULL ) ? $domObj->createElement($tag_name, $value) : $domObj->createElement($tag_name);

    if( $attributes != NULL )
    {
        foreach ($attributes as $attr=>$val)
        {
            $element->setAttribute($attr, $val);
        }
    }

    return $element;
}

$dom = new DOMDocument('1.0', 'utf-8');

$elm = createElement($dom, 'foo', 'bar', array('attr_name'=>'attr_value'));

$dom->appendChild($elm);

echo $dom->saveXML();

?>

outputs :
<?xml version="1.0" encoding="utf-8"?>
<foo attr_name="attr_value">bar</foo>
chris AT cmbuckley DOT co DOT uk 26-May-2009 07:45
Note that the NUL character "\0" is not in the list of invalid characters for $name, so no error is triggered, but the tag name will be truncated at the null byte:

<?php

$dom = new DOMDocument('1.0', 'utf-8');
$el = $dom->createElement('foo' . "\0" . 'bar', 'Hello World');
echo $el->tagName; // outputs "foo"

?>
estill at gvtc dot com 12-Jun-2007 02:38
Note that the second parameter (value), although convenient, is non-standard. You should create elements like this instead:

<?php
$doc = new DOMDocument('1.0', 'iso-8859-1');

$root = $doc->createElement('test');
$doc->appendChild($root);

$root_text = $doc->createTextNode('This is the root element!');
$root->appendChild($root_text);

print $doc->saveXML();
?>

Or, alternatively, extend the DOMDocument class and add your own custom, convenience method to avoid intruding on the standard:

<?php
class CustomDOMDocument extends DOMDocument {
  function createElementWithText($name, $child_text) {
    // Creates an element with a child text node

    // @param  string  $name        element tag name
    // @param  string  $child_text  child node text

    // @return  object  new element

    $element = $this->createElement($name);

    $element_text = $this->createTextNode($child_text);
    $element->appendChild($element_text);

    return $element;
  }
}

$doc = new CustomDOMDocument('1.0', 'iso-8859-1');

$root = $doc->createElementWithText('test', 'This is the root element!');
$doc->appendChild($root);

print $doc->saveXML();
?>

Also use caution with (or avoid) the 'DOMElement->nodeValue' property. It can return some unexpected values and changing its value will replace (remove) all descendants of the element with a single text node. It's also non-standard; according to the DOM spec it should return NULL.
mikek dot nospam at nospam dot muonics dot com 03-Mar-2007 05:24
With regard to the note below about needing htmlentities to avoid warnings about unterminated entity references, I thought it worthwhile to mention that that you don't need to with createTextNode and DOMText::__construct.  If you mix both methods of setting text nodes and do (or don't) apply htmlentities consistently to all data to be displayed, you'll get &amp;s (or warnings and badly-formed xml).

It's probably in one's best interest to extend DOMElement and DOMDocument so that it creates a DOMText node and appends it, rather than passing it up to the DOMElement constructor.  Otherwise, good luck using (or not using) htmlentities in all the right places in your code, especially as code changes get made.

<?php

class XDOMElement extends DOMElement {
    function __construct($name, $value = null, $namespaceURI = null) {
        parent::__construct($name, null, $namespaceURI);
    }
}

class XDOMDocument extends DOMDocument {
    function __construct($version = null, $encoding = null) {
        parent::__construct($version, $encoding);
        $this->registerNodeClass('DOMElement', 'XDOMElement');
    }

    function createElement($name, $value = null, $namespaceURI = null) {
        $element = new XDOMElement($name, $value, $namespaceURI);
        $element = $this->importNode($element);
        if (!empty($value)) {
            $element->appendChild(new DOMText($value));
        }
        return $element;
    }
}

$doc1 = new XDOMDocument();
$doc1_e1 = $doc1->createElement('foo', 'bar & baz');
$doc1->appendChild($doc1_e1);
echo $doc1->saveXML();

$doc2 = new XDOMDocument();
$doc2_e1 = $doc2->createElement('foo');
$doc2->appendChild($doc2_e1);
$doc2_e1->appendChild($doc2->createTextNode('bar & baz'));
echo $doc2->saveXML();

?>

Text specified in createElement:
<?xml version=""?>
<foo>bar &amp; baz</foo>

Text added via createTextNode:
<?xml version=""?>
<foo>bar &amp; baz</foo>
sergsokolenko at gmail dot com 30-Jan-2007 04:11
To avoid warning message "unterminated entity reference" you may use htmlentities() for escaping supplied value:
<?php
//...
$dom->createElement('name', htmlentities($text))
//...
?>


Crée un nouveau nœud avec un espace de noms associé

  • « DOMDocument::createElement
  • DOMDocument::createEntityReference »
  • PHP Manual
  • DOMDocument
  • Crée un nouveau nœud avec un espace de noms associé

DOMDocument::createElementNS

(PHP 5, PHP 7)

DOMDocument::createElementNS — Crée un nouveau nœud avec un espace de noms associé

Description

public DOMDocument::createElementNS ( string|null $namespace , string $qualifiedName , string $value = "" ) : DOMElement|false

Cette fonction crée un nouveau nœud avec un espace de noms associé. Ce nœud ne sera pas affiché dans le document, à moins qu'il ne soit inséré avec DOMNode::appendChild().

Liste de paramètres

namespace

L'URI de l'espace de noms.

qualifiedName

Le nom qualifié de l'élément, en tant que préfixe:nomBalise.

value

La valeur de l'élément. Par défaut, un élément vide sera créé. Vous pouvez également définir la valeur plus tard en utilisant la fonction DOMElement::$nodeValue.

Valeurs de retour

Un nouveau DOMElement ou false si une erreur survient.

Erreurs / Exceptions

DOM_INVALID_CHARACTER_ERR

Lancé si qualifiedName contient un caractère invalide.

DOM_NAMESPACE_ERR

Lancé si qualifiedName est un nom qualifié malformé.

Exemples

Exemple #1 Création d'un nouvel élément et insertion en tant que racine

<?php

$dom = new DOMDocument('1.0', 'utf-8');

$element = $dom->createElementNS('http://www.example.com/XFoo', 'xfoo:test', 'Ceci est l\'élément racine !');

// Nous insérons le nouvel élément en tant que racine (fils du document)
$dom->appendChild($element);

echo $dom->saveXML();
?>

L'exemple ci-dessus va afficher :

<?xml version="1.0" encoding="iso-8859-1"?>
<xfoo:test xmlns:xfoo="http://www.example.com/XFoo">Ceci est l'élément racine !</xfoo:test>

Exemple #2 Un exemple avec un espace de noms en préfixe

<?php
$doc  = new DOMDocument('1.0', 'utf-8');
$doc->formatOutput = true;
$root = $doc->createElementNS('http://www.w3.org/2005/Atom', 'element');
$doc->appendChild($root);
$root->setAttributeNS('http://www.w3.org/2000/xmlns/' ,'xmlns:g', 'http://base.google.com/ns/1.0');
$item = $doc->createElementNS('http://base.google.com/ns/1.0', 'g:item_type', 'house');
$root->appendChild($item);

echo $doc->saveXML(), "\n";

echo $item->namespaceURI, "\n"; // Affiche : http://base.google.com/ns/1.0
echo $item->prefix, "\n";       // Affiche : g
echo $item->localName, "\n";    // Affiche : item_type
?>

L'exemple ci-dessus va afficher :

<?xml version="1.0" encoding="utf-8"?>
<element xmlns="http://www.w3.org/2005/Atom" xmlns:g="http://base.google.com/ns/1.0">
  <g:item_type>house</g:item_type>
</element>

http://base.google.com/ns/1.0
g
item_type

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils
  • DOMDocument::createAttribute() - Crée un nouvel attribut
  • DOMDocument::createAttributeNS() - Crée un nouvel attribut avec un espace de noms associé
  • DOMDocument::createCDATASection() - Crée un nouveau nœud cdata
  • DOMDocument::createComment() - Crée un nouveau nœud de commentaire
  • DOMDocument::createDocumentFragment() - Crée un nouveau fragment de document
  • DOMDocument::createElement() - Crée un nouveau nœud
  • DOMDocument::createEntityReference() - Crée un nouveau nœud de référence d'entité
  • DOMDocument::createProcessingInstruction() - Crée un nouveau nœud PI
  • DOMDocument::createTextNode() - Crée un nouveau nœud de texte

User Contributed Notes

Martin 27-Dec-2011 09:39
To avoid multiple xmlns re-declaration, make sure you appending ElementNS into actual DOMDocument tree (not into some currently-assembed derelict element).


Crée un nouveau nœud de référence d'entité

  • « DOMDocument::createElementNS
  • DOMDocument::createProcessingInstruction »
  • PHP Manual
  • DOMDocument
  • Crée un nouveau nœud de référence d'entité

DOMDocument::createEntityReference

(PHP 5, PHP 7)

DOMDocument::createEntityReference — Crée un nouveau nœud de référence d'entité

Description

public DOMDocument::createEntityReference ( string $name ) : DOMEntityReference|false

Cette fonction crée une nouvelle instance de la classe DOMEntityReference. Ce nœud ne sera pas affiché dans le document, à moins qu'il ne soit inséré avec DOMNode::appendChild().

Liste de paramètres

name

Le contenu de la référence de l'entité, e.g. la référence de l'entité sans le & initial et le ; final.

Valeurs de retour

Le nouveau DOMEntityReference ou false si une erreur survient.

Erreurs / Exceptions

DOM_INVALID_CHARACTER_ERR

Émise si name contient un caractère invalide.

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils
  • DOMDocument::createAttribute() - Crée un nouvel attribut
  • DOMDocument::createAttributeNS() - Crée un nouvel attribut avec un espace de noms associé
  • DOMDocument::createCDATASection() - Crée un nouveau nœud cdata
  • DOMDocument::createComment() - Crée un nouveau nœud de commentaire
  • DOMDocument::createDocumentFragment() - Crée un nouveau fragment de document
  • DOMDocument::createElement() - Crée un nouveau nœud
  • DOMDocument::createElementNS() - Crée un nouveau nœud avec un espace de noms associé
  • DOMDocument::createProcessingInstruction() - Crée un nouveau nœud PI
  • DOMDocument::createTextNode() - Crée un nouveau nœud de texte

User Contributed Notes

alicewonder at shastaherps dot org 24-Sep-2015 07:48
It appears that this does not work with numbered entities, only named entities.

$nbspace = $dom->createEntityReference('nbsp');

works

$nbspace = $dom->createEntityReference('#160');

does not. This makes this function rather useless when generating an XSL unless you modify the XSL doctype to include the named entity for the character you want.
Tuhin Bepari 04-Nov-2013 06:00
<?php
/*Entity is a group of words which print a special symbol.
Like if we want to show copy right symbol in html page then we use &copy; code and browser convert this to actual copyright symbol.
There have lots of entity, you can find them all form http://dev.w3.org/html5/html-author/charref
if you want to use < or > or both <> into a node value than xml will give and warning or make this value as a node.
So tell the xml parser that < or > is not tag symbol it is a entity.To do that you have to right &lt(<) and &gt;(>) instead of < and > symbol.

Entity references always begin with an ampersand (&) and end with a semicolon (;).
DO not need to use & and ; symbol begin and end of entity.Remove it when you want to use it to DOMDocument::createEntityReference
Then append to to a tag where you want to show this symbol.Like below
*/
$dom=new DOMDocument("1.0","UTF-8");
$example=$dom->createElement("example","This is copyright ");
$entity=$dom->createEntityReference("copy");
$example->appendChild($entity);
$dom->appendChild($example);
echo $dom->saveXML();

output is
This is copyright ©


Crée un nouveau nœud PI

  • « DOMDocument::createEntityReference
  • DOMDocument::createTextNode »
  • PHP Manual
  • DOMDocument
  • Crée un nouveau nœud PI

DOMDocument::createProcessingInstruction

(PHP 5, PHP 7)

DOMDocument::createProcessingInstruction — Crée un nouveau nœud PI

Description

public DOMDocument::createProcessingInstruction ( string $target , string $data = "" ) : DOMProcessingInstruction|false

Cette fonction crée une nouvelle instance de la classe DOMProcessingInstruction. Ce nœud ne sera pas affiché dans le document, à moins qu'il ne soit inséré avec DOMNode::appendChild().

Liste de paramètres

target

La cible de l'instruction gérée.

data

Le contenu de l'instruction gérée.

Valeurs de retour

Le nouveau DOMProcessingInstruction ou false si une erreur survient.

Erreurs / Exceptions

DOM_INVALID_CHARACTER_ERR

Emise si target contient un caractère invalide.

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils
  • DOMDocument::createAttribute() - Crée un nouvel attribut
  • DOMDocument::createAttributeNS() - Crée un nouvel attribut avec un espace de noms associé
  • DOMDocument::createCDATASection() - Crée un nouveau nœud cdata
  • DOMDocument::createComment() - Crée un nouveau nœud de commentaire
  • DOMDocument::createDocumentFragment() - Crée un nouveau fragment de document
  • DOMDocument::createElement() - Crée un nouveau nœud
  • DOMDocument::createElementNS() - Crée un nouveau nœud avec un espace de noms associé
  • DOMDocument::createEntityReference() - Crée un nouveau nœud de référence d'entité
  • DOMDocument::createTextNode() - Crée un nouveau nœud de texte

User Contributed Notes

romain at supinfo dot com 03-Feb-2009 11:57
A use exemple of this method :

Usefull for generating an XML linked with a XSLT !

<?php

// "Create" the document.
$xml = new DOMDocument( "1.0", "ISO-8859-15" );

//to have indented output, not just a line
$xml->preserveWhiteSpace = false;
$xml->formatOutput = true;

// ------------- Interresting part here ------------

//creating an xslt adding processing line
$xslt = $xml->createProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="base.xsl"');

//adding it to the xml
$xml->appendChild($xslt);

// ----------- / Interresting part here -------------

//adding some elements
$root = $xml->createElement("list");
$node = $xml->createElement("contact", "John Doe");
$root-> appendChild($node);
$xml-> appendChild($root);

//creating the file
$xml-> save("output.xml");

?>

output.xml :

<?xml version="1.0" encoding="ISO-8859-15"?>
<?xml-stylesheet type="text/xsl" href="base.xsl"?> //the line has been created successfully
<list>
  <contact>John Doe</contact>
</list>


Crée un nouveau nœud de texte

  • « DOMDocument::createProcessingInstruction
  • DOMDocument::getElementById »
  • PHP Manual
  • DOMDocument
  • Crée un nouveau nœud de texte

DOMDocument::createTextNode

(PHP 5, PHP 7)

DOMDocument::createTextNode — Crée un nouveau nœud de texte

Description

public DOMDocument::createTextNode ( string $data ) : DOMText|false

Cette fonction crée une nouvelle instance de la classe DOMText. Ce nœud ne sera pas affiché dans le document, à moins qu'il ne soit inséré avec DOMNode::appendChild().

Liste de paramètres

data

Le contenu du texte.

Valeurs de retour

Un nouveau DOMText ou false si une erreur survient.

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils
  • DOMDocument::createAttribute() - Crée un nouvel attribut
  • DOMDocument::createAttributeNS() - Crée un nouvel attribut avec un espace de noms associé
  • DOMDocument::createCDATASection() - Crée un nouveau nœud cdata
  • DOMDocument::createComment() - Crée un nouveau nœud de commentaire
  • DOMDocument::createDocumentFragment() - Crée un nouveau fragment de document
  • DOMDocument::createElement() - Crée un nouveau nœud
  • DOMDocument::createElementNS() - Crée un nouveau nœud avec un espace de noms associé
  • DOMDocument::createEntityReference() - Crée un nouveau nœud de référence d'entité
  • DOMDocument::createProcessingInstruction() - Crée un nouveau nœud PI

User Contributed Notes

drewish at katherinehouse dot com 16-Dec-2014 10:03
The docs don't mention it but this method performs escaping on the value. If you don't want that use createElement() instead.
Alex Kaye 25-Jul-2009 07:04
A quick note to anyone who is using character entities (e.g. &copy;) in this, and finding them automatically escaped. The correct thing to do here is to use the createEntityReference method (e.g. createEntityReference("copy");), and then appendChild this entity between text nodes.

Example:

<?php
$copyright_text_1 = $this->document->createTextNode("Copyright ");
$copyright_text_2 = $this->document->createTextNode(" Alex Kaye 2009");
$copyright_symbol = $this->document->createEntityReference("copy");
$copyright->appendChild($copyright_text_1);
$copyright->appendChild($copyright_symbol);
$copyright->appendChild($copyright_text_2);
?>


Cherche un élément avec un certain identifiant

  • « DOMDocument::createTextNode
  • DOMDocument::getElementsByTagName »
  • PHP Manual
  • DOMDocument
  • Cherche un élément avec un certain identifiant

DOMDocument::getElementById

(PHP 5, PHP 7)

DOMDocument::getElementById — Cherche un élément avec un certain identifiant

Description

public DOMDocument::getElementById ( string $elementId ) : DOMElement|null

Cette fonction est similaire à la fonction DOMDocument::getElementsByTagName mais cherche un élément avec un identifiant donné.

Pour que cette fonction fonctionne, vous devez soit définir les attributs ID avec DOMElement::setIdAttribute ou définir une DTD qui définit un attribut devant être de type ID. Dans le dernier cas, vous devez valider votre document avec DOMDocument::validate ou DOMDocument::$validateOnParse avant d'utiliser cette fonction.

Liste de paramètres

elementId

La valeur de l'identifiant unique pour un élément.

Valeurs de retour

Retourne un DOMElement ou null si l'élément n'est pas trouvé.

Exemples

Exemple #1 Exemple avec DOMDocument::getElementById()

L'exemple suivant utilise le fichier book.xml, dont le contenu est :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books [
  <!ELEMENT books   (book+)>
  <!ELEMENT book    (title, author+, xhtml:blurb?)>
  <!ELEMENT title   (#PCDATA)>
  <!ELEMENT blurb   (#PCDATA)>
  <!ELEMENT author  (#PCDATA)>
  <!ATTLIST books   xmlns        CDATA  #IMPLIED>
  <!ATTLIST books   xmlns:xhtml  CDATA  #IMPLIED>
  <!ATTLIST book    id           ID     #IMPLIED>
  <!ATTLIST author  email        CDATA  #IMPLIED>
]>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<books xmlns="http://books.php/" xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <book id="php-basics">
    <title>PHP Basics</title>
    <author email="jim.smith@basics.php">Jim Smith</author>
    <author email="jane.smith@basics.php">Jane Smith</author>
    <xhtml:blurb><![CDATA[
<p><em>PHP Basics</em> provides an introduction to PHP.</p>
]]></xhtml:blurb>
  </book>
  <book id="php-advanced">
    <title>PHP Advanced Programming</title>
    <author email="jon.doe@advanced.php">Jon Doe</author>
  </book>
</books>
<?php

$doc = new DomDocument;

// Nous devons valider notre document avant de nous référer à l'ID
$doc->validateOnParse = true;
$doc->Load('book.xml');

echo "L'élément dont l'ID est 'php-basics' est : " . $doc->getElementById('php-basics')->tagName . "\n";

?>

L'exemple ci-dessus va afficher :

L'élément dont l'ID est 'php-basics' est : chapter

Voir aussi

  • DOMDocument::getElementsByTagName() - Cherche tous les éléments qui ont le nom de la balise locale donné

User Contributed Notes

Hoi 07-Jul-2020 10:39
To set a hidden id that can be used by $dom->getElementById() apply setAttribute('id', true) as in the following example

                    $createItemNode = function ($data) use ($dom) {
                        $node = $dom->createElement("Item");
                        $node->setAttribute('id', $data->id);
                        $node->setAttribute('hed', $data->hed);
                        $node->setAttribute('run_time', $data->run_time);
                        $node->setAttribute('date', $data->date);

                        // Internally mark the id as 'xml:id' for getElementById to work. Adding xml:id manually to the tag will cause loadXML to throw an error DOMDocument: xml:id is not a NCName in Entity
                        $node->setIdAttribute('id', true);

                        return $node;
                    };

With $node->setIdAttribute('id', true), $dom->getElementById($id) will work

When you do $dom->saveXML(), the final doc will not contain any xml:id attribute.
ed at edgiardina dot com 13-Oct-2010 11:41
Please note that if your HTML does not contain a doctype declaration, then getElementById will always return null.
paradox_haze at live dot de 02-Mar-2010 10:53
Had some issues with getElementById() while searching for a specific element in a XHTML document.
I wrote a small function what was solving my problem:

<?php
function getElementById($id)
{
    $xpath = new DOMXPath($this->domDocument);
    return $xpath->query("//*[@id='$id']")->item(0);
}
?>
carl2088 at gmail dot com 11-Apr-2009 12:41
From my experience, getElementById seem to work fine without any setups if you have loaded a HTML document. But in order for getElementById to work with a simple XML document that you've "constructed", you have to set up the id with "xml:" prefix and use setIdAttribute on the element you created or it won't work. See following example, hope this will save someone's frustration. If you have loaded the xml file, then all you have to make sure is the ID has a xml: prefix for the attribute.  But if you start to append the XML document, don't forget to setIdAttribute on the id name or those elements or getElementById will return null when you try to find them.

<?php

    /* test.xml
    <?xml version="1.0" encoding="utf-8"?>
    <root>
        <child xml:id="id_xxxxxx" status="partial">
            <sub_child>Some Data</sub_child>
        </child>
    </root>
    */

    $xmlDom = new DOMDocument('1.0', 'utf-8');
    $xmlDom->formatOutput = true;                        // we want a nice output

    // create a root
    $eltRoot = $xmlDom->createElement("root");
    $xmlDom->appendChild($eltRoot);

    $eltChild = $xmlDom->createElement("child");
    $eltRoot->appendChild($eltChild);

    // add a id attribute
    $attr = $xmlDom->createAttribute("xml:id");    // needs xml prefix or getElementById won't work
    $eltChild->appendChild($attr);

    /// create the text node and append to the created element
    $tNode = $xmlDom->createTextNode("id_8120528");
    $attr->appendChild($tNode);
    $eltChild->setIdAttribute("xml:id", true);    // VERY IMPORT or getElementById won't work

    // add a id attribute
    $attr = $xmlDom->createAttribute("status");
    $eltChild->appendChild($attr);

    /// create the text node and append to the created element
    $tNode = $xmlDom->createTextNode("partial");
    $attr->appendChild($tNode);

    // add a subchild
    $eltSub = $xmlDom->createElement("sub_child");
    $eltChild->appendChild($eltSub);

    $tNode = $xmlDom->createTextNode("Some Data");
    $eltSub->appendChild($tNode);

    $id = null;
    $id = $xmlDom->getElementById("id_8120528");

    assert ($id != null);

    $strId = $id->getAttribute("xml:id"); // bug? empty
    $strStatus = $id->getAttribute("status"); // this works!

    assert ($id !=null);

    $xmlDom->save("./_data/test.xml");

    $xmlDom->load("./_data/test.xml"); // reloading fixes the problem

    $nodeRoot = $xmlDom->getElementsByTagName("root");
    if ($nodeRoot->length > 0) {
        $eltRoot = $nodeRoot->item(0);
    }

    assert($eltRoot != null);

    $id = null;
    $id = $xmlDom->getElementById("id_8120528");

    assert ($id != null);

    $strId = $id->getAttribute("xml:id"); // this works now!
    $strStatus = $id->getAttribute("status"); // this works!

?>
guillaume dot crico at gmail dot com 01-Oct-2008 07:55
You don't want to use "xml:id" ?
Here is the relaxNG trick (with a generic schema):
(tested with libxml 2.6.26)

<?php
$doc = new DOMDocument();
$doc->load(...);

$rng = '
<grammar xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
    <start>
        <element>
            <anyName/>
            <ref name="anythingID"/>
        </element>
    </start>
    <define name="anythingID">
        <zeroOrMore>
            <choice>
                <element>
                    <anyName/>
                    <ref name="anythingID"/>
                </element>
                <attribute name="id">
                    <data type="ID"/>
                </attribute>
                <zeroOrMore>
                    <attribute><anyName/></attribute>
                </zeroOrMore>
                <text/>
            </choice>
        </zeroOrMore>
    </define>
</grammar>
';

$doc->relaxNGValidateSource($rng);
var_dump($doc->getElementById('id1'));
?>

Note that ID values must be valid ones :
  - integers do no work!
  - @see http://www.w3.org/TR/REC-xml/#id
  - => (Letter | '_' | ':') ( Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender  )*
simon at somewhere dot com 29-Jan-2007 08:07
SAVE YOURSELF A MAJOR HEADACHE AND A LOT OF SEARCHING THROUGH DOCUMENTATION -

Instead of using $object->setAttribute('id', 'id_name_here')
USE THIS: $object->setAttribute('xml:id', 'id_name_here')

Then, to get the node value: $domDocumentObject->getElementById('id_name_here');

The xml:id attribute should AUTOMATICALLY be defined!!

Woohoo!  That was easy......
jonbarnett at gmail dot com 01-Nov-2006 08:36
If your XML document does not have a DTD that defines the "id" attribute as an ID, then the easiest thing to do is to use XPath->query() to find an element that matches "//[@id='x']"
Tangui dot Le-Pense at laposte dot net 08-Apr-2006 06:00
Validating a document from a DTD so as to use getElementById is sometimes impossible (for example when the head and body elements are not included yet in a XHtml document : the validation failed).
Fortunately, xml:id is supported by this function :)
That may be useful.
http://www.w3.org/TR/xml-id/
20-Dec-2005 07:04
If you're trying to use getElementById with a xml file validated on a xsd file you must first use the schemaValidate function or getElementById will return null
Example:

  $dom = new DomDocument();
  $dom->load("users.xml");
  $dom->schemaValidate("users.xsd");

  $curruser = $dom->getElementById($user->name);
bart at mediawave dot nl 11-Sep-2005 04:46
It seems getElementById works fine without setting validateOnParse to true. Which is nice since setting this to true caused some performance problems with my script.


Cherche tous les éléments qui ont le nom de la balise locale donné

  • « DOMDocument::getElementById
  • DOMDocument::getElementsByTagNameNS »
  • PHP Manual
  • DOMDocument
  • Cherche tous les éléments qui ont le nom de la balise locale donné

DOMDocument::getElementsByTagName

(PHP 5, PHP 7)

DOMDocument::getElementsByTagName — Cherche tous les éléments qui ont le nom de la balise locale donné

Description

public DOMDocument::getElementsByTagName ( string $qualifiedName ) : DOMNodeList

Cette fonction retourne une instance de la classe DOMNodeList contenant tous les éléments qui ont un nom de balise donné.

Liste de paramètres

qualifiedName

Le nom local (sans espace de nommage) de la balise à chercher. La valeur spéciale * correspond à toutes les balises.

Valeurs de retour

Un nouvel objet DOMNodeList contenant tous les éléments correspondants.

Exemples

Exemple #1 Exemple de base

<?php
$xml = <<< XML
<?xml version="1.0" encoding="utf-8"?>
<books>
 <book>Patterns of Enterprise Application Architecture</book>
 <book>Design Patterns: Elements of Reusable Software Design</book>
 <book>Clean Code</book>
</books>
XML;

$dom = new DOMDocument;
$dom->loadXML($xml);
$books = $dom->getElementsByTagName('book');
foreach ($books as $book) {
    echo $book->nodeValue, PHP_EOL;
}
?>

L'exemple ci-dessus va afficher :

Patterns of Enterprise Application Architecture
Design Patterns: Elements of Reusable Software Design
Clean Code

Voir aussi

  • DOMDocument::getElementsByTagNameNS() - Recherche tous les éléments avec un nom de balise donné dans un espace de noms spécifié

User Contributed Notes

Mateusz K 19-Dec-2019 08:04
If you want to move all nodes to another tag you can do it like that
Eg: replace <div> with nodes to <p> with the same nodes.

function replaceDomElementTag(DOMDocument $dom, DOMElement $node, string $tagName)
{
        $newElement = $dom->createElement($tagName);
        while ($node->childNodes->length)
            $newElement->appendChild($node->childNodes[0]);

        $node->parentNode->replaceChild($newElement, $node);
}

$dom = new DOMDocument();
replaceDomElementTag($dom, $divElementToReplace, 'p');
rsvvuuren at hotmail dot com 10-Jan-2014 10:00
I was in need of $dom->getElementsByTagName that would hist magic within a contextNode.

Why i needed getElementsByTagName instead of just simple using an xPath->query is because while looping through the returned nodelist, more nodes with the tagName i was looking for where created.

When using getElementsByTagName, the new nodes are "added" to the nodelist i already am looping through.

When using an xpath query, you wil only loop through the original nodelist, the newly created elements wil not appear in that nodelist.

I was already using an extended class on domDocument, so it was simple to create an kind of getElementsByTagName that would accept an contextNode.

<?php
class SmartDocument extends DOMDocument {
    private $localDom;
    public $xpath;
    private $serialize = array('localDom');

    private $elemName;
    private $elemCounter;

    /**
     * Constructor
     */
    function __construct() {
        parent::__construct ( '1.0', 'UTF-8' );
        $this->preserveWhiteSpace = false;
        $this->recover = TRUE;
        $this->xpath = new DOMXpath ( $this );
    }

    /**
     * GetElementsByTagname within an contextNode
     *
     * @param string $name
     * @param DomNode $contextNode
     * @return DOMNode|NULL
     */
    public function getElementsByTagNameContext($name, $contextNode) {

        if($this->elemName!=$name) {
            $this->elemCounter     = 0;
            $this->elemName        =$name;
        }

        $this->elemLength      = $this->xpath->evaluate('count(.//*[name()="'.$this->elemName.'"])', $contextNode);
        while($this->elemCounter < $this->elemLength) {
            $this->elemCounter++;
            $nl = $this->xpath->query('.//*[name()="'.$this->elemName.'"]['.$this->elemCounter.']', $contextNode);
            if($nl->length == 1) {
                return $nl->item(0);
            }
        }

        $this->elemLength      = null;
        $this->elemCounter     = null;
        $this->elemName        = null;
        return null;
    }
}

?>

Usage:

<?php

 $doc = new SmartDocument();
 $doc->load('book.xml');

 $nl = $doc->query('//books');
 foreach($nl as $node) {
  while($book = $doc->getElementsByTagNameContext('book', $node)) {
   //When you now create new nodes within this loop as child or following-sibling of this node
  // They show up within this loop
  }

 }

?>
simon at onepointltd dot com 10-Sep-2013 07:54
Here is a function to convert the populated tables in and HTML document into an array.

<?php
//Create an array containing all the populated tables in an HTML page
//Returned array: tables_to_array[table number][row number][column number]
function tables_to_array ($url) {
  $htmlDocDom = new DOMDocument();

  @$htmlDocDom->loadHTMLFile($url);
  $htmlDocDom->preserveWhiteSpace = false;
  $tableCounter = 0;
  $htmlDocTableArray = array();
  $htmlDocTables = $htmlDocDom->getElementsByTagName('table');
  foreach ($htmlDocTables as $htmlDocTable) {
    $htmlDocTableArray[$tableCounter] = array();
    $htmlDocRows= $htmlDocTable->getElementsByTagName('tr');
    $htmlDocRowCount = 0;
    $htmlDocTableArray[$tableCounter] = array();
    foreach ($htmlDocRows as $htmlDocRow) {
      if (strlen($htmlDocRow->nodeValue) > 1)
      {
        $htmlDocColCount = 0;
        $htmlDocTableArray[$tableCounter][$htmlDocRowCount] = array();
        $htmlDocCols = $htmlDocRow->getElementsByTagName('td');
        foreach ($htmlDocCols as $htmlDocCol) {
          $htmlDocTableArray[$tableCounter][$htmlDocRowCount][] = $htmlDocCol->nodeValue;
          $htmlDocColCount++;
        }
        $htmlDocRowCount++;
      }
    }
    if ($htmlDocRowCount > 1) $tableCounter++;
  }
  return($htmlDocTableArray);
}
?>
yaakov dot moddel at gmail dot com 28-Aug-2012 10:47
This is a very simplistic way to traverse xml nodes and childnodes using the DOMDocument class

<?php
$xml ='<?xml version="1.0" encoding="utf-8"?>
<root>
    <Parent>
        <child>child 1</child>
        <child>child 2</child>
        <child>child 3</child>
        <subParent>
            <Grandchild>Grandchild 1</Grandchild>
            <Grandchild>Grandchild 2</Grandchild>
            <Grandchild>Grandchild 3</Grandchild>
        </subParent>
    </Parent>
    <Parent>
        <child>child 4</child>
        <child>child 5</child>
        <child>child 6</child>
        <subParent>
            <Grandchild>Grandchild 4</Grandchild>
            <Grandchild>Grandchild 5</Grandchild>
            <Grandchild>Grandchild 6</Grandchild>
        </subParent>
    </Parent>
</root>';
      $doc = new DOMDocument();
      $doc->preserveWhiteSpace = false;
      $doc->loadXML($xml);
      $i=0;
            while(is_object($finance = $doc->getElementsByTagName("Parent")->item($i)))
            {
                     foreach($finance->childNodes as $nodename)
                     {
                             if($nodename->nodeName=='subParent')
                                {
                                     foreach($nodename->childNodes as $subNodes)
                                     {
                                     echo $subNodes->nodeName." - ".$subNodes->nodeValue."<br>";
                                     }
                                }
                             else
                                {
                                echo $nodename->nodeName." - ".$nodename->nodeValue."<br>";
                                }
                     }
      $i++;
            }
?>
metron at underhive-planet dot com 08-Oct-2010 05:28
My first try to get a stable solution with this function, failed with this Exception:

"Fatal error: Call to undefined method DOMNodeList::getElementsByTagName()"
This is the xml snipplet:
<?xml version="1.0" encoding="UTF-8"?>
<root>
 <component>
  <properties>
    ....<any element>
  </properties>
 </component>
</root>

So the php code to climb along the elements is:
<?php

$src = new DOMDocument('1.0', 'utf-8');
$src->formatOutput = true;
$src->preserveWhiteSpace = false;

//Loading extern file
$src->load('../xml/Item_component.xml');

//Check each child of first indexed branch node of: <component>
//First get element after root element: <component>

//1st level
$component = $src->getElementsByTagName('component')->item(0);

//2nd level, get next element after component, here it fails!!
$properties = $component->getElementsByTagName('properties')->item(0);
...
?>

I realised, that there is a different when using different libxml2 versions on Apache2. This code will fail with libxml2 version 2.6.23 and PHP version 5.2.6
--
->It works fine with libxml2 version 2.6.32 and PHP version 5.2.6-3ubuntu4.6
->...and finally it also works with libxml2 2.7.7 and PHP >= 5.3

So if you bored to search for solutions with DOM like I did, please ensure that your www environment has the correct libxml2 / PHP Version installed on your apache2 server.
calvin at g mail 02-Oct-2010 04:41
My first post!
And this is how I get elements by attribute and its value.
For an example, if I want to grab all DIV tags with class name 'className', then...

<?php
$some_link = 'some website';
$tagName = 'div';
$attrName = 'class';
$attrValue = 'className';

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
@$dom->loadHTMLFile($some_link);

$html = getTags( $dom, $tagName, $attrName, $attrValue );
echo $html;

function getTags( $dom, $tagName, $attrName, $attrValue ){
    $html = '';
    $domxpath = new DOMXPath($dom);
    $newDom = new DOMDocument;
    $newDom->formatOutput = true;

    $filtered = $domxpath->query("//$tagName" . '[@' . $attrName . "='$attrValue']");
    // $filtered =  $domxpath->query('//div[@class="className"]');
    // '//' when you don't know 'absolute' path

    // since above returns DomNodeList Object
    // I use following routine to convert it to string(html); copied it from someone's post in this site. Thank you.
    $i = 0;
    while( $myItem = $filtered->item($i++) ){
        $node = $newDom->importNode( $myItem, true );    // import node
        $newDom->appendChild($node);                    // append node
    }
    $html = $newDom->saveHTML();
    return $html;
}

?>

Please, improve it, and share it.
Philip N 01-Sep-2010 03:17
Note that when using getElementsByTagName that it is a dynamic list. Thus if you have code which adjusts the DOM structure it will change the results of the getElementsByTagName results list.

The following code iterates through a complete set of results and changes them all to a new tag:

<?php
 $nodes = $xml->getElementsByTagName ("oldtag");

 $nodeListLength = $nodes->length; // this value will also change
 for ($i = 0; $i < $nodeListLength; $i ++)
 {
    $node = $nodes->item(0);

    // some code to change the tag name from "oldtag" to something else
    // e.g. encrypting a tag element
 }
?>

Since the list is dynamically updating, $nodes->item(0) is the next "unchanged" tag.
Marco Maranao 27-Apr-2010 10:22
The following takes a list of news items from an XML file (or an RSS feed), assigning it to an array first for a name value pair and then generating an HTML list.

<?php

$xml  =<<<EOT
<?xml version="1.0" encoding="ISO-8859-1"?>
<news>
    <item>
        <title>News 1</title>
        <created>04/2/2010 08:00 EST</created>
        <url>http://news.example.com/news.pdf</url>
    </item>
    <item>
        <title>News 2</title>
        <created>04/25/2010 08:00 EST</created>
        <url>http://news.example.com/news.pdf</url>
    </item>
    <item>
        <title>News 3</title>
        <created>04/27/2010 08:00 EST</created>
        <url>http://news.example.com/news.pdf</url>
    </item>
</news>
EOT;

$doc = new DOMDocument();

if ($doc->loadXML($xml)) {
    $items = $doc->getElementsByTagName('item');
    $headlines = array();

    foreach($items as $item) {
        $headline = array();

        if($item->childNodes->length) {
            foreach($item->childNodes as $i) {
                $headline[$i->nodeName] = $i->nodeValue;
            }
        }

        $headlines[] = $headline;
    }

    if(!empty($headlines)) {
        $hc = 0;

        echo '<ul>';

        foreach($headlines as $headline) {
            if(++$hc <= 3) {
                echo '<li>'
                    .'<a href="'.$headline['url'].'" target="_blank">'
                        .'<span>'.date('F j, Y', strtotime($headline['created'])).'</span><br />'
                        .$headline['title']
                    .'</a>'
                .'</li>';
            }
        }

        echo '</ul>';
    }
}

?>
james 01-Feb-2010 07:03
Problem:
You have an XML document that contains filename references to, say, images. Each filename reference is defined by <file>filename.ext</file> tag. You'd like to perform perform additional validation, say, after running the XML document through XSD validation. The additional validation can be any of your choice, in this example, it would be ideal to convert the PHP code to a function. The function would then determine if the images exist and return either an integer value or a boolean.

<?xml version="1.0"?>
<root>
<box>
<file>example.png</file>
</box>
<content>
<item>
<image><file>example2.png</file></image>
<caption>The above image is an example</caption>
</item>
</content>
</root>

Solution:
<?php

$dom = new DomDocument();
$dom->prevservWhiteSpace = false;

if (!@$dom->load("example.xml")) {
    echo "example.xml doesn't exist!\n";
    return;
}

$imageList = $dom->getElementsByTagName('file');
$imageCnt  = $imageList->length;

for ($idx = 0; $idx < $imageCnt; $idx++) {
    print $imageList->item($idx)->nodeValue . "\n";
}

?>

The above PHP code could easily be turned into a function that returns an array of image filenames, an integer value relative to the number of images found, etc.

Hope this is helpful.
gurmukh24 at gmail dot com 03-Mar-2009 04:06
Following Example is of multiple attributes and multiple child nodes. this is being used to make joomla plugin for bulk upload of articles. Gurmukh Singh Bhatti

<?php
$xml =<<<EOT
<?xml version="1.0"?>
<root>
<section name="Section1">
  <category id="Category1" name="google">
   <arti name="article1">
   <p>any html code here</p>
   <b>my name is so so</b>
    </arti>
   <arti name="article2">value2</arti>
   <arti name="article3">value3</arti>
   <arti name="article4">value4</arti>
  </category>
    <category id="Category2" name="yahoo">
   <arti name="articleSection2">Test value</arti>
  </category>
</section>
<section name="Section2">
  <category id="category1_of_section2" name="msn">
   <arti name="article2">value1</arti>
   <arti name="article3">value2</arti>
  </category>
    <category id="Category2_of_section2" name="webcare">
    <arti name="param3">value4</arti>
   </category>
</section>
</root>
EOT;

$dom = new DomDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xml);
$params = $dom->getElementsByTagName('section'); // Find Sections
$k=0;
foreach ($params as $param) //go to each section 1 by 1
{
         echo "Section Attribute :-> ".$params->item($k)->getAttribute('name')."<br>";   //get section attribute
         $params2 = $params->item($k)->getElementsByTagName('category'); //digg categories with in Section
      $i=0; // values is used to iterate categories
        foreach ($params2 as $p) {
           echo "&nbsp;&nbsp;- Category Attribute Name :-> ".$params2->item($i)->getAttribute('name')."<br>"; //get Category attributes
            $params3 = $params2->item($i)->getElementsByTagName('arti'); //dig Arti into Categories
                 $j=0;//values used to interate Arti
                     foreach ($params3 as $p2)
                   {
                    echo "&nbsp;&nbsp;&nbsp;- Article Attribute Name : ".$params3->item($j)->getAttribute('name').""; //get arti atributes
echo "&nbsp;&nbsp; Value : ".$params3->item($j)->nodeValue."<br>"; //get Node value ;
                              $j++;
                   }
         $i++;
      }
$k++;

}
?>

output :
 Section Attribute :-> Section1
  - Category Attribute Name :-> google
            - Article Attribute Name : article1   Value : any html code heremy name is so so
            - Article Attribute Name : article2   Value : value2
            - Article Attribute Name : article3   Value : value3
            - Article Attribute Name : article4   Value : value4
  - Category Attribute Name :-> yahoo
            - Article Attribute Name : articleSection2   Value : Test value
Section Attribute :-> Section2
  - Category Attribute Name :-> msn
            - Article Attribute Name : article2   Value : value1
            - Article Attribute Name : article3   Value : value2
  - Category Attribute Name :-> webcare
            - Article Attribute Name : param3   Value : value4
James L 19-Aug-2008 04:04
Return if there are no matches is an empty DOMNodeList. Check using length property, e.g.:

<?php
$nodes=$domDocument->getElementsByTagName('book') ;
if ($nodes->length==0) {
   // no results
}
?>
jason at shaped dot ca 11-Feb-2008 04:59
in response to tildy at pr dot hu

my preferred way is (in example to gather country data from an iso 3166 xml flie)

$countries = new DOMDocument();
$countries->load("./lib/iso_3166.xml");

$countriesList = $countries->getElementsByTagName("ISO_3166-1_Entry");

foreach($countriesList as $country) {
    $values = $country->getElementsByTagName("*");
    foreach($values as $node) {
      echo $node->nodeName."=".$node->nodeValue;
    }
}
Finding values of a node 14-Mar-2007 02:01
I don't know if this is that obvious but it was not for me, so in addition to gem at rellim dot com's posting:
adding

<?php
echo $param -> nodeValue.'<br>';
?>

to the loop will output
value1
value2
value3
gem at rellim dot com 29-Sep-2004 04:20
Here is an example of getElementsByTagName():

<?php
$xml =<<<EOT
<?xml version="1.0"?>
<config>
  <section id="section1">
   <param name="param1">value1</param>
   <param name="param2">value2</param>
  </section>
  <section id="section2">
   <param name="param3">value3</param>
  </section>
</config>
EOT;

$dom = new DomDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xml);
$params = $dom->getElementsByTagName('param');

foreach ($params as $param) {
       echo $param -> getAttribute('name').'<br>';
}
?>

Expected result:
--------------
param1
param2
param3


Recherche tous les éléments avec un nom de balise donné dans un espace de noms spécifié

  • « DOMDocument::getElementsByTagName
  • DOMDocument::importNode »
  • PHP Manual
  • DOMDocument
  • Recherche tous les éléments avec un nom de balise donné dans un espace de noms spécifié

DOMDocument::getElementsByTagNameNS

(PHP 5, PHP 7)

DOMDocument::getElementsByTagNameNS — Recherche tous les éléments avec un nom de balise donné dans un espace de noms spécifié

Description

public DOMDocument::getElementsByTagNameNS ( string $namespace , string $localName ) : DOMNodeList

Retourne un DOMNodeList de tous les éléments avec un nom local donné et une URI d'espace de noms.

Liste de paramètres

namespace

L'URI de l'espace de noms des éléments à chercher. La valeur spéciale * représente tous les espaces de noms.

localName

Le nom local des éléments à chercher. La valeur spéciale * représente tous les noms locaux.

Valeurs de retour

Un nouvel objet DOMNodeList contenant tous les éléments trouvés.

Exemples

Exemple #1 Récupération de tous les éléments XInclude

<?php

$xml = <<<EOD
<?xml version="1.0" ?>
<chapter xmlns:xi="http://www.w3.org/2001/XInclude">
<title>Books of the other guy..</title>
<para>
 <xi:include href="book.xml">
  <xi:fallback>
   <error>xinclude: book.xml not found</error>
  </xi:fallback>
 </xi:include>
 <include>
  This is another namespace
 </include>
</para>
</chapter>
EOD;
$dom = new DOMDocument;

// load the XML string defined above
$dom->loadXML($xml);

foreach ($dom->getElementsByTagNameNS('http://www.w3.org/2001/XInclude', '*') as $element) {
    echo 'local name: ', $element->localName, ', prefix: ', $element->prefix, "\n";
}
?>

L'exemple ci-dessus va afficher :

local name: include, prefix: xi
local name: fallback, prefix: xi

Voir aussi

  • DOMDocument::getElementsByTagName() - Cherche tous les éléments qui ont le nom de la balise locale donné

User Contributed Notes

RiKdnUA at mail dot ru 19-Mar-2015 07:47
<?php
ini_set("display_errors","on"); error_reporting(-1);
$doc="<?xml version='1.0' encoding='WINDOWS-1251'?>
<htm:body xmlns:htm='w3.org'>
<span>Text</span>
<htm:img htm:src='imgSrc'/>
</htm:body>";
$dom = new DOMDocument('1.0','WINDOWS-1251');
$dom->preserveWhiteSpace=false;
$dom->loadXML($doc);
$domList=$dom->getElementsByTagNameNS('*','*');//all namespaces, all local names
echo "?????????? ?????????. The number of elements: ".$domList->length."<br />";// 2 (not 3)
for ($i=0; $i<$domList->length; $i++)
{echo "??????? $i. The element $i: ".$domList->item($i)->tagName."<br />";
}
/*
Tested in PHP 5.2.9-2 and 5.2.17
The above example will output:
?????????? ?????????. The number of elements: 2
??????? 0. The element 0: htm:body
??????? 1. The element 1: htm:img

?????. ?? ?????? ??????? span
Conclusion. Not found span element
*/
?>


Importe un nœud dans le document courant

  • « DOMDocument::getElementsByTagNameNS
  • DOMDocument::load »
  • PHP Manual
  • DOMDocument
  • Importe un nœud dans le document courant

DOMDocument::importNode

(PHP 5, PHP 7)

DOMDocument::importNode — Importe un nœud dans le document courant

Description

public DOMDocument::importNode ( DOMNode $node , bool $deep = false ) : DOMNode|false

Cette fonction retourne une copie du nœud à importer et l'associe avec le document courant.

Liste de paramètres

node

Le nœud à importer.

deep

Si défini à true, cette méthode importera récursivement le sous-arbre situé sous le nœud node.

Note:

Pour copier les attributs des nœuds, le paramètre deep doit être défini à true

Valeurs de retour

Le nœud copié ou false si la copie a échouée.

Erreurs / Exceptions

DOMException est lancé si le nœud ne peut pas être importé.

Exemples

Exemple #1 Exemple avec DOMDocument::importNode()

Copie de nœuds entre plusieurs documents.

<?php

$orgdoc = new DOMDocument;
$orgdoc->loadXML("<root><element><child>Texte dans un fils</child></element></root>");

// Le nœud que nous voulons importer dans le nouveau document
$node = $orgdoc->getElementsByTagName("element")->item(0);

// Création du nouveau document
$newdoc = new DOMDocument;
$newdoc->formatOutput = true;

// Ajout de quelques balises
$newdoc->loadXML("<root><someelement>Texte dans un élément</someelement></root>");

echo "Le nouveau document avant d'y copier le nœud :\n";
echo $newdoc->saveXML();

// Importation du nœud, ainsi que tous ses files, dans le document
$node = $newdoc->importNode($node, true);
// Et on l'ajoute dans le le nœud racine "<root>"
$newdoc->documentElement->appendChild($node);

echo "\nLe nouveau document après y avoir copié les nœuds :\n";
echo $newdoc->saveXML();
?>

L'exemple ci-dessus va afficher :

Le nouveau document avant d'y copier le nœud :
<?xml version="1.0"?>
<root>
  <someelement>Texte dans un élément</someelement>
</root>

Le nouveau document après y avoir copié les nœuds :
<?xml version="1.0"?>
<root>
  <someelement>Texte dans un élément</someelement>
  <element>
    <child>Texte dans un fils</child>
  </element>
</root>

User Contributed Notes

rikdnua at mail dot ru 11-Sep-2013 01:54
The behavior of importNode($node, false) is different in PHP 5.2.9-2 and PHP 5.2.17.
The second option is explicitly set to false. In PHP 5.2.9-2 importNode() imports the elements WITHOUT attributes. In PHP 5.2.17 the elements imported ALONG with their attributes.
<?php
$xml="
<html>
<a href='yandex.com'>Yandex.com</a>
<a href='rik.dn.ua'>RiK.dn.ua</a>
</html>
";
$doc=new domDocument('1.0');
$doc->loadXML($xml);
$list=$doc->getElementsByTagName('a');
$doc1=new domDocument('1.0');
$doc1->formatOutput=true;
for($i=0; $i<$list->length; $i++) $doc1->appendChild($doc1->importNode($list->item($i), false));
$doc1->save('file.xml');
?>

file.xml PHP 5.2.9-2
<?xml version="1.0"?>
<a/>
<a/>

file.xml PHP 5.2.17
<?xml version="1.0"?>
<a href="yandex.com"/>
<a href="rik.dn.ua"/>
c dot 1 at smithies dot org 19-Oct-2009 06:40
Assume that $source and $dest are instances of DOMDocument. Assume that $sourcedoc contains an element with ID 'sourceID' and that $destdoc contains an element with ID 'destID'. Assume that we have already set up source and destination element variables thus:

<?php
 $src = $sourcedoc->getElementById('sourceID');
 $dst = $destdoc->getElementById('destID');
?>

Finally, assume that $sel has more than one child node.

In order to import the child elements of $src as children of $dst, you might do something like this:

<?php
$src = $dest->importNode($src, TRUE);

foreach ($src->childNodes as $el) $dst->appendChild($el);
?>

But this does not work. foreach gets confused, because (as noted below) appending an imported element to another existing element in the same document causes it to be removed from its current parent element.

Therefore, the following technique should be used:

<?php
foreach ($src->childNodes as $el) $dst->appendChild($destdoc->importNode($el, TRUE));
?>
p dot reisinger at gmail dot com 29-Dec-2008 03:43
When you use function/method below, php automaticaly inserts namespaces (if you have some). If you want to join xml files exactly, then you can just use placeholders and treat xml as a string.
<?php
function joinXMLStrings($file1, $file2)
{
    //remove xml declaration
    $file2 = trim(preg_replace('/<\?xml.*\?>/', '', $file2, 1));

    //insert file2 in the place of placeholder in the first file
    $file1 = trim(preg_replace('/<\?file2\s\?>/', $file2, $file1, 1));
}
?>

so function looks like this and you insert two xml files. First file has to have placeholder (where you insert file2). Placeholder in this case will be <?file2 ?>

!!!this is only for ilustration - test before you use it
p dot reisinger at gmail dot com 23-Dec-2008 07:32
method (can be used as a function as well) that joins two xml files. first argument is parent xml (the one to be inserted into), second child (the one to be inserted) and third is optional argument that specifies the parent's tag where to insert children xml. If not specified then children is inserted as the last element, just before end of the root
<?php
    protected function joinXML($parent, $child, $tag = null)
    {
        $DOMChild = new DOMDocument;
        $DOMChild->loadXML($child);
        $node = $DOMChild->documentElement;

        $DOMParent = new DOMDocument;
        $DOMParent->formatOutput = true;
        $DOMParent->loadXML($parent);

        $node = $DOMParent->importNode($node, true);

        if ($tag !== null) {
            $tag = $DOMParent->getElementsByTagName($tag)->item(0);
            $tag->appendChild($node);
        } else {
            $DOMParent->documentElement->appendChild($node);
        }

        return $DOMParent->saveXML();
    }
?>
mailme at sove dot nl 11-Jun-2008 05:29
DOMDocument->importNode with seconds argument false will leave attributes behind. To fix this:

$__DOM->importNode
   (
      $__INPUT->cloneNode(false), true
   );

$__DOM (DOMDocument) will import the $__INPUT node (DOMElement) INCLUDING attributes.
mark at 4inloop dot de 05-Apr-2007 05:51
When you left out the second argument or enter false, not only the child nodes are ommited. The attributes of the node are also cut off.
adjwilli 05-Oct-2006 01:08
Editing XML with PHP can be a pain in the Secretary of State Powell, so here's a script to replace an XML node with a user-provided one through the POST. It's usually a good idea to run the $_POST['xml'] through a validation check and clean it for other thing before running this.

Pretty much this script expects a user-provided node called $_POST['xml'] and the XPath of the node in the original document that you want to replace called $_POST['XPath']. It also loads the original XML document from $xml. The function nodeRunner begins with the root node of the document you're editting and the XPath for the root element (these are more to make recursion easy than anything else).

$doc = new DOMDocument();
$doc->loadXML($xml); // $xml expects an XML string

function nodeRunner ($node,$xpath) {
    global $doc;
    if ($xpath == $_POST['XPath']) {

        $xmlPost = new DOMDocument();
        $xmlPost->loadXML($_POST['xml']);

        $newNode = $doc->importNode($xmlPost->firstChild,true);

        $node->parentNode->replaceChild($newNode,$node);
    } else {

        $page = 1;
        $section = 1;

        if ($node->hasChildNodes()) {
            foreach ($node->childNodes as $nodling) {
                $nodeName = $nodling->nodeName;
                if ($nodeName == 'page' || $nodeName == 'section') {
                    nodeRunner ($nodling,$xpath."/".$nodeName."[".$$nodeName."]");
                    $$nodeName++;
                }
            }
        }
    }
}

nodeRunner ($doc->documentElement,"/root[1]"); // /root should be explicit name of the root  element of the XPath

$doc->saveXML();
stomas 19-Sep-2006 06:14
I think this should do the same:

<?
 // Import $b into $a's document
 function myimport($a, $b)
 {
   if ($a->ownerDocument->isSameNode($b->ownerDocument))
   {
    return $b->cloneNode(TRUE);
   }
   else
   {
    return $a->ownerDocument->importNode($b, TRUE);
   }
 }
 ?>
Colin 12-Sep-2006 09:11
As of PHP 5.1.6 with libxml 2.6.26 and DOM/XML API version 20031129, importNode() does nothing if attempting to import from the same document.  Meaning, if you do an $ret = importNode and then appendChild($ret) or insertBefore($ret, ...) then you will end up *moving* the node instead of ending up with a copy.

If you expect importNode to give you a copy of the source (in this case, a deep copy) then you must account for them being from the same document.  This function addresses this:

<?
// Import $b into $a's document
function myimport($a, $b)
{
  if ($a->ownerDocument->isSameNode($b->ownerDocument))
  {
    $temp = new DOMDocument();
    $ret = $temp->importNode($b, TRUE);
    return $a->ownerDocument->importNode($ret, TRUE);
  }
  else
  {
    return $a->ownerDocument->importNode($b, TRUE);
  }
}
?>

(Function was freshly coded for this note but I based it off another, working function of mine.)

This function checks if the documents are the same and uses a new document (guaranteed to be different this way) to force a copy into $temp and then force a copy back into $a->ownerDocument.

Obviously, no error checking has been done.
andy dot clark at dial dot pipex dot com 15-Aug-2006 08:20
One useful use of importNode is to copy one node onto another.

function CopyXMLNode($SourceNode,$DestNode)
 {
  if ($SourceNode->nodeName != '#text')
   {
     //Copy this node
    $node = $DestNode->ownerDocument->importNode($SourceNode, true);
    $node = $DestNode->appendChild($node);
    //Now copy the child nodes
    foreach ($SourceNode->childNodes AS $item)
     {
     $this->CopyXMLNode($item,$node);
     }
    }
  }
Fitopaldi 03-Aug-2005 11:29
importNode returns a copy of the node to import and associates it with the current document, but not import the node to the current DOMDocument. Use appendChild for import the copy of the node to current DOMDocument.

<?
 $domNode = $dom->importNode($aDomNode, true);
 $currentDomDocument->appendChild($domNode);
?>


Charge du XML depuis un fichier

  • « DOMDocument::importNode
  • DOMDocument::loadHTML »
  • PHP Manual
  • DOMDocument
  • Charge du XML depuis un fichier

DOMDocument::load

(PHP 5, PHP 7)

DOMDocument::load — Charge du XML depuis un fichier

Description

public DOMDocument::load ( string $filename , int $options = 0 ) : DOMDocument|bool

Charge un document XML depuis un fichier.

Avertissement

Les chemins de style Unix avec des antislash peuvent conduire à des réductions de performance sous les systèmes Windows ; assurez-vous d'appeler la fonction realpath().

Liste de paramètres

filename

Le chemin vers le document XML.

options

L'opérateur OR des constantes de libxml.constants.html.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient. Si appelée statiquement, retourne un DOMDocument ou false si une erreur survient.

Erreurs / Exceptions

Si une chaîne vide est passée comme paramètre filename ou si le fichier est vide, une alerte sera générée. Cette alerte n'est pas générée par libxml, et ne peut être gérée en utilisant les fonctions de gestion d'erreur de libxml.

Cette méthode peut être appelée statiquement, mais enverra une erreur E_STRICT.

Exemples

Exemple #1 Création d'un Document

<?php
$doc = new DOMDocument();
$doc->load('book.xml');
echo $doc->saveXML();
?>

Voir aussi

  • DOMDocument::loadXML() - Charge du XML depuis une chaîne de caractères
  • DOMDocument::save() - Sauvegarde l'arbre interne XML dans un fichier
  • DOMDocument::saveXML() - Sauvegarde l'arbre interne XML dans une chaîne de caractères

User Contributed Notes

sainthyoga2003 at gmail dot com 09-Feb-2012 03:37
in the default example:

<?php
$doc = new DOMDocument();
$doc->load('book.xml');
echo $doc->saveXML();
?>

you must enter the absolute path for book.xml due for get a false result in load function.
sainthyoga2003 at gmail dot com 25-Feb-2011 05:38
i've found the partial solution for xml:id warning,is explained at this address: https://fosswiki.liip.ch/display/BLOG/GetElementById+Pitfalls

there explains that:
The ID does have to be a valid NCName, which for example means, that the first letter can't be a number.

and in my xml:id i had a number. :D
sainthyoga2003 at gmail dot com 16-Feb-2011 09:31
adding an id for a child, when i use abstract mode i get the following warning:

[quote]Warning: DOMDocument::load() [domdocument.load]: xml:id : attribute value xx is not an NCName in /fake/path/to/xmlfile[/quote]
_ michael 01-Jun-2010 08:34
load() will handle non-ASCII characters depending on the details of the XML declaration, but in a somewhat surprising way. One would assume that the declarations '<?xml version="1.0" encoding="UTF-8"?>' and '<?xml version="1.0"?>' are treated in the same way because UTF-8 is the default encoding anyway. But not so.

* If there is an XML declaration defining the encoding *explicitly*, the non-ASCII characters remain unchanged.
* If the XML declaration does not define the encoding explicitly, or if the XML declaration is missing, non-ASCII characters are converted into numeric entities.

So the document

    <?xml version="1.0"?>
    <root><nonascii>ä</nonascii></root>

will be converted to

    <?xml version="1.0"?>
    <root><nonascii>&#xE4;</nonascii></root>

The same happens if there is no XML declaration at all. On the other hand, the document

    <?xml version="1.0" encoding="UTF-8"?>
    <root><nonascii>ä</nonascii></root>

will remain as it is.

This behaviour applies to loadXML() as well.
_ michael 19-Apr-2010 07:50
XHTML and entities: The solution proposed below by zachatwork at gmail dot com didn't work for me. I checked on a number of servers (both LAMPP and WAMPP) - on each of them, calling loadXML() with the LIBXML_DTDLOAD option triggered an external request for the DTD. And that's bad news.

If allow_url_fopen is turned off, the request for the DTD fails with a warning. If it is turned on, the request fails because these w3c URLs return a 503 Service Unavailable.

HTML entities still generate a warning in either case.

The best solution, as far as I can tell, is simply to ignore the warnings and suppress them using '@'. I can't recommend parsing XHTML with loadHTML() instead of loadXML() - yes, you get rid of the entity problem, but loadHTML() changes the source while parsing it (tries to 'fix' it even though there is nothing to fix).
zachatwork at gmail dot com 30-Jun-2009 11:28
You can easily avoid the warning about &nbsp; references by using the LIBXML_DTDLOAD option.

<?php

$html = <<<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
  </head>
  <body>
    <p>&nbsp;</p>
  </body>
</html>
EOF;

// This one works perfectly.
$dom = new DOMDocument();
$dom->loadXML($html, LIBXML_DTDLOAD);
print $dom->saveXML();

// This one produces a warning.
$dom = new DOMDocument();
$dom->loadXML($html);
print $dom->saveXML();

?>

See also: http://www.php.net/manual/en/libxml.constants.php

Note that libxml will detect that your DTD is locally available via /etc/xml/catalog. So there is no worry about this causing your DOM loads to make external network requests.
Jonas Due Vesterheden 09-Jun-2009 08:18
I had a problem with loading documents over HTTP. I would get errors looking like this:

Warning: DOMDocument::load(http://external/document.xml): failed to open stream: HTTP request failed! HTTP/1.1 500 Internal Server Error

The document would load fine in browsers and using wget. The problem is that DOMDocument::load() on my systems (both OS X and Linux) didn't send any User-Agent header which for some weird reason made Microsoft-IIS/6.0 respond with the 500 error.

The solution is found on http://php.net/manual/en/function.libxml-set-streams-context.php :

<?php
$opts = array(
    'http' => array(
        'user_agent' => 'PHP libxml agent',
    )
);

$context = stream_context_create($opts);
libxml_set_streams_context($context);

// request a file through HTTP
$doc = DOMDocument::load('http://www.example.com/file.xml');
?>
syntaxiko 04-Apr-2009 10:16
Function will not work if using XML DOM PECL module
darren at viamedia dot co dot za 05-Aug-2008 07:17
If you are loading xml with the intention of validating it against an internal dtd and you have experienced issues with the validation it could be related to missing LIBXML constants.

I found this post by "aidan at php dot net" in root level dom docs and thought it might be more useful here:
As of PHP 5.1, libxml options may be set using constants rather than the use of proprietary DomDocument properties.

DomDocument->resolveExternals is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDATTR

DomDocument->validateOnParse is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDVALID

PHP 5.1 users are encouraged to use the new constants.

Example:
<?php
$dom = new DOMDocument;
// Resolve externals
$dom->load($file, LIBXML_DTDLOAD|LIBXML_DTDATTR);
// OR
// Validate against DTD
$dom->load($file, LIBXML_DTDLOAD|LIBXML_DTDVALID);
$dom->validate();
?>
the_N_Channel 15-Jul-2008 04:53
NOTE, will not load successfully if there is a comment at the beginning of the file before the <?xml version="1.0" ?> declaration!
hh dot lohmann at yahoo dot de 30-Aug-2007 03:48
BadGuy´s note may be confusing since what he depicts is no special property of the relevant method. PHP works always in and on a local file system which means that if you want to use resources from other systems or - what is, indeed, BadGuy´s problem - need resources that have been dealt with by other programs or processes, you have to state and manage that explicitly in your code. PHP is just a quite normal program in that.

BadGuy´s solution is using the "http wrapper" to get output from another process (see "wrappers" in the PHP manual). Doing this, the appropriate syntax for http calls has to be respected.
admin at tijnema dot tijnema dot info 02-Jun-2007 04:39
In reply to BadGuy [at] BadGuy [dot] nl

When the news.php file is located on the same server, like you said in the first example then http://my.beautiful-website.com/xmlsource/news.php wouldn't work, but you should use http://localhost/xmlsource/news.php or http://127.0.0.1/xmlsource/news.php
BadGuy [at] BadGuy [dot] nl 18-Jan-2007 08:50
Note that this method uses the local file system before doing anything remote. The 'disadvantage' would be that if you would do the following:
<?php
$xml = new DOMDocument;
$xml->load("xmlsource/news.php");
?>

This would not make the method read the actual output of the news.php file --presumably valid xml data--, but the file contents --obviously this would be php code. So this will return an error saying news.php is missing the xml declaration and maybe the xml start-tag

What would work is the following:

<?php
$xml = new DOMDocument;
$xml->load("http://my.beautiful-website.com/xmlsource/news.php");
?>

This will force a http request to be used to get this file instead of just locally reading it and the file just returning code
daevid at daevid dot com 18-Oct-2005 05:08
Suppose you wanted to dynamically load an array from an .XSD file. This method is your guy. just remember to use the actual xs: portion in xpaths and such.

All the other "load" methods will error out.

<?php
$attributes = array();
$xsdstring = "/htdocs/api/xsd/common.xsd";
$XSDDOC = new DOMDocument();
$XSDDOC->preserveWhiteSpace = false;
if ($XSDDOC->load($xsdstring))
{
    $xsdpath = new DOMXPath($XSDDOC);
    $attributeNodes =
              $xsdpath->
              query('//xs:simpleType[@name="attributeType"]')
              ->item(0);
    foreach ($attributeNodes->childNodes as $attr)
    {
        $attributes[ $attr->getAttribute('value') ] = $attr->getAttribute('name');
    }
    unset($xsdpath);
}
print_r($attributes);
?>


Charge du code HTML à partir d'une chaîne de caractères

  • « DOMDocument::load
  • DOMDocument::loadHTMLFile »
  • PHP Manual
  • DOMDocument
  • Charge du code HTML à partir d'une chaîne de caractères

DOMDocument::loadHTML

(PHP 5, PHP 7)

DOMDocument::loadHTML — Charge du code HTML à partir d'une chaîne de caractères

Description

public DOMDocument::loadHTML ( string $source , int $options = 0 ) : DOMDocument|bool

Cette fonction analyse un document HTML contenu dans la chaîne source. Contrairement au XML, le HTML n'a pas besoin d'être bien formé pour être chargé. Cette fonction peut aussi être appelée statiquement pour charger et créer un objet DOMDocument. L'appel statique peut être utilisé lorsque vous n'avez besoin de configurer aucune propriété de DOMDocument avant le chargement.

Liste de paramètres

source

La chaîne HTML.

options

Depuis PHP 5.4.0 et Libxml 2.6.0, vous pouvez également utiliser le paramètre options pour spécifier des paramètres additionnels à Libxml.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient. Si appelée statiquement, retourne un DOMDocument ou false si une erreur survient.

Erreurs / Exceptions

Si une chaîne vide est passée comme paramètre source, une alerte sera générée. Cette alerte n'est pas générée par libxml, et ne peut être gérée en utilisant les fonctions de gestion d'erreur de libxml.

Cette méthode peut être appelée statiquement, mais enverra une erreur E_STRICT.

Bien que le HTML mal-formé devrait se charger avec succès, cette fonction peut générer une alerte de type E_WARNING lorsqu'elle rencontre une mauvaise balise. Les fonctions de gestion des erreurs libxml peuvent être utilisées pour gérer ces erreurs.

Exemples

Exemple #1 Création d'un document

<?php
$doc = new DOMDocument();
$doc->loadHTML("<html><body>Test<br></body></html>");
echo $doc->saveHTML();
?>

Voir aussi

  • DOMDocument::loadHTMLFile() - Charge du HTML à partir d'un fichier
  • DOMDocument::saveHTML() - Sauvegarde le document interne dans une chaîne en utilisant un formatage HTML
  • DOMDocument::saveHTMLFile() - Sauvegarde un document interne dans un fichier en utilisant un formatage HTML

User Contributed Notes

deepakrajpal dot com at gmail dot com 20-Nov-2020 06:16
If we are loading html5 tags such as <section>, <svg> there is following error:

DOMDocument::loadHTML(): Tag section invalid in Entity

We can disable standard libxml errors (and enable user error handling) using libxml_use_internal_errors(true); before loadHTML();

This is quite useful in phpunit custom assertions as given in following example (if using phpunit test cases):

// Create a DOMDocument
$dom = new DOMDocument();

// fix html5/svg errors
libxml_use_internal_errors(true);

// Load html
$dom->loadHTML("<section></section>");
$htmlNodes = $dom->getElementsByTagName('section');

if ($htmlNodes->length == 0) {
    $this->assertFalse(TRUE);
} else {
    $this->assertTrue(TRUE);
}
divinity76+spam at gmail dot com 14-Sep-2020 09:25
if you want to get rid of all the "DOMText elements containing ONLY whitespace", maybe try

<?php

function loadHTML_noemptywhitespace(string $html, int $extra_flags = 0, int $exclude_flags = 0): DOMDocument
{
    $flags = LIBXML_HTML_NODEFDTD | LIBXML_NOBLANKS | LIBXML_NONET;
    $flags = ($flags | $extra_flags) & ~ $exclude_flags;

    $domd = new DOMDocument();
    $domd->preserveWhiteSpace = false;
    @$domd->loadHTML('<?xml encoding="UTF-8">' . $html, $flags);
    $removeAnnoyingWhitespaceTextNodes = function (\DOMNode $node) use (&$removeAnnoyingWhitespaceTextNodes): void {
        if ($node->hasChildNodes()) {
            // Warning: it's important to do it backwards; if you do it forwards, the index for DOMNodeList might become invalidated;
            // that's why i don't use foreach() - don't change it (unless you know what you're doing, ofc)
            for ($i = $node->childNodes->length - 1; $i >= 0; --$i) {
                $removeAnnoyingWhitespaceTextNodes($node->childNodes->item($i));
            }
        }
        if ($node->nodeType === XML_TEXT_NODE && !$node->hasChildNodes() && !$node->hasAttributes() && empty(trim($node->textContent))) {
            //echo "Removing annoying POS";
            // var_dump($node);
            $node->parentNode->removeChild($node);
        } //elseif ($node instanceof DOMText) { echo "not removed"; var_dump($node, $node->hasChildNodes(), $node->hasAttributes(), trim($node->textContent)); }
    };
    $removeAnnoyingWhitespaceTextNodes($domd);
    return $domd;
}
BychkovVV at mail dot ru 03-Apr-2020 08:30
If you are loading html content from any website, in "utf-8" encoding, when meta width content-type is not first child of HEAD, it would not be acknowledged by parser (encoding); So you can make this fix:
  function domLoadHTML($html)
           {$testDOM = new DOMDocument('1.0', 'UTF-8');
            $testDOM->loadHTML($html);
            $charset = NULL;
            $searchInElemnt = function(&$item) use (&$searchInElemnt, &$charset)
              {if($item->childNodes)
                 {foreach($item->childNodes as $childItem)
                    {switch($childItem->nodeName)
                       {case 'html':
                        case 'head':
                          $searchInElemnt($childItem);
                          break;
                        case 'meta':
                          $attributes = array();
                          foreach ($childItem->attributes as $attr)
                            {$attributes[mb_strtoupper($attr->localName)] = $attr->nodeValue;
                            }
                          if(array_key_exists('HTTP-EQUIV', $attributes) && (mb_strtoupper($attributes['HTTP-EQUIV']) == 'CONTENT-TYPE') && array_key_exists('CONTENT', $attributes) && preg_match('~[\s]*;[\s]*charset[\s]*=[\s]*([^\s]+)~', $attributes['CONTENT'], $matches))
                            {$charset = preg_replace('~[\s\']~', '', $matches[1]);
                            }
                       }
                    }
                 }
              };
            $searchInElemnt($testDOM);
            if(isset($charset))
              {$dom = new DOMDocument('1.0', $charset);
               $dom->loadHTML('<?xml encoding="'.$charset.'">'.$html);
               foreach ($dom->childNodes as $item)
               if($item->nodeType == XML_PI_NODE)
                 {$dom->removeChild($item);
                 }
               $dom->encoding = $charset;
              }
            else
              {$dom = $testDOM;
              }
            return $dom;
           };
kerim-yagmurcu at gmx dot de 24-Dec-2016 03:13
For those of you who want to get an external URL's class element, I have 2 usefull functions. In this example we get the '<h3 class="r">'
 elements back (search result headers) from google search:

1. Check the URL (if it is reachable, existing)
<?php
# URL Check
function url_check($url) {
    $headers = @get_headers($url);
    return is_array($headers) ? preg_match('/^HTTP\\/\\d+\\.\\d+\\s+2\\d\\d\\s+.*$/',$headers[0]) : false;
};
?>

2. Clean the element you want to get (remove all tags, tabs, new-lines etc.)
<?php
# Function to clean a string
function clean($text){
    $clean = html_entity_decode(trim(str_replace(';','-',preg_replace('/\s+/S', " ", strip_tags($text)))));// remove everything
    return $clean;
    echo '\n';// throw a new line
}
?>

After doing that, we can output the search result headers with following method:
<?php
$searchstring = 'djceejay';
$url = 'http://www.google.de/webhp#q='.$searchstring;
if(url_check($url)){
    $doc = new DomDocument;
    $doc->validateOnParse = true;
    $doc->loadHtml(file_get_contents($url));
    $output = clean($doc->getElementByClass('r')->textContent);
    echo $output . '<br>';
}else{
    echo 'URL not reachable!';// Throw message when URL not be called
}
?>
fr at felix-riesterer dot de 13-Feb-2016 01:43
Remember: If you use an HTML5 doctype and a meta element like so

<meta CHARSET=Windows-1252">

your HTML code will get interpreted as ISO-8859-something and non-ASCII chars will get converted into HTML entities. However the HTML4-like version will work (as has been pointed out 10 years ago by "bigtree at 29a"):

<meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1252">
finkenb2 at mail dot lib dot msu dot edu 05-Oct-2015 04:03
Warning:  This does not function well with HTML5 elements such as SVG.  Most of the advice on the Web is to turn off errors in order to have it work with HTML5.
cake at brothercake dot com 16-Dec-2012 05:57
Be aware that this function doesn't actually understand HTML -- it fixes tag-soup input using the general rules of SGML, so it creates well-formed markup, but has no idea which element contexts are allowed.

For example, with input like this where the first element isn't closed:

    <span>hello <div>world</div>

loadHTML will change it to this, which is well-formed but invalid:

    <span>hello <div>world</div></span>
Alex 10-Apr-2010 08:45
Beware of the "gotcha" (works as designed but not as expected): if you use loadHTML, you cannot validate the document. Validation is only for XML. Details here: http://bugs.php.net/bug.php?id=43771&edit=1
Shane Harter 04-Jan-2010 08:42
DOMDocument is very good at dealing with imperfect markup, but it throws warnings all over the place when it does.

This isn't well documented here. The solution to this is to implement a separate aparatus for dealing with just these errors.

Set libxml_use_internal_errors(true) before calling loadHTML. This will prevent errors from bubbling up to your default error handler. And you can then get at them (if you desire) using other libxml error functions.

You can find more info here http://www.php.net/manual/en/ref.libxml.php
mdmitry at gmail dot com 21-Dec-2009 09:02
You can also load HTML as UTF-8 using this simple hack:

<?php

$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="UTF-8">' . $html);

// dirty fix
foreach ($doc->childNodes as $item)
    if ($item->nodeType == XML_PI_NODE)
        $doc->removeChild($item); // remove hack
$doc->encoding = 'UTF-8'; // insert proper

?>
piopier 14-Jun-2009 08:29
Here is a function I wrote to capitalize the previous remarks about charset problems (UTF-8...) when using loadHTML and then DOM functions.
It adds the charset meta tag just after <head> to improve automatic encoding detection, converts any specific character to an html entity, thus PHP DOM functions/attributes will return correct values.

<?php
mb_detect_order("ASCII,UTF-8,ISO-8859-1,windows-1252,iso-8859-15");
function loadNprepare($url,$encod='') {
        $content        = file_get_contents($url);
        if (!empty($content)) {
                if (empty($encod))
                        $encod  = mb_detect_encoding($content);
                $headpos        = mb_strpos($content,'<head>');
                if (FALSE=== $headpos)
                        $headpos= mb_strpos($content,'<HEAD>');
                if (FALSE!== $headpos) {
                        $headpos+=6;
                        $content = mb_substr($content,0,$headpos) . '<meta http-equiv="Content-Type" content="text/html; charset='.$encod.'">' .mb_substr($content,$headpos);
                }
                $content=mb_convert_encoding($content, 'HTML-ENTITIES', $encod);
        }
        $dom = new DomDocument;
        $res = $dom->loadHTML($content);
        if (!$res) return FALSE;
        return $dom;
}
?>

NB: it uses mb_strpos/mb_substr instead of mb_ereg_replace because that seemed more efficient with huge html pages.
Errol 11-Feb-2009 08:05
It should be noted that when any text is provided within the body tag
outside of a containing element, the DOMDocument will encapsulate that
text into a paragraph tag (<p>).

For example:
<?php
$doc = new DOMDocument();
$doc->loadHTML("<html><body>Test<br><div>Text</div></body></html>");
echo $doc->saveHTML();
?>

will yield:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>Test<br></p>
<div>Text</div>
</body></html>

while:
<?php
$doc = new DOMDocument();
$doc->loadHTML(
    "<html><body><i>Test</i><br><div>Text</div></body></html>");
echo $doc->saveHTML();
?>

will yield:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<i>Test</i><br><div>Text</div>
</body></html>
jamesedwardcooke+php at gmail dot com 19-Oct-2008 11:37
Using loadHTML() automagically sets the doctype property of your DOMDocument instance(to the doctype in the html, or defaults to 4.0 Transitional). If you set the doctype with DOMImplementation it will be overridden.

I assumed it was possible to set it and then load html with the doctype I defined(in order to decide the doctype at runtime), and ran into a huge headache trying to find out where my doctype was going. Hopefully this helps someone else.
xuanbn at yahoo dot com 04-Oct-2007 01:38
If you use loadHTML() to process utf HTML string (eg in Vietnamese), you may experience result in garbage text, while some files were OK. Even your HTML already have meta charset  like

  <meta http-equiv="content-type" content="text/html; CHARSET=Windows-1252">

I have discovered that, to help loadHTML() process utf file correctly, the meta tag should come first, before any utf string appear. For example, this HTML file

<html>
 <head>
    <meta http-equiv="content-type" content="text/html; CHARSET=Windows-1252">
    <title> Vietnamese - Ti?ng Vi?t</title>
  </head>
<body></body>
</html>

will be OK with loadHTML() when <meta> tag appear <title> tag.

But the file below will not regcornize by loadHTML() because <title> tag contains utf string appear before <meta> tag.

<html>
 <head>
    <title> Vietnamese - Ti?ng Vi?t</title>
    <meta http-equiv="content-type" content="text/html; CHARSET=Windows-1252">
  </head>
<body></body>
</html>
hanhvansu at yahoo dot com 26-Apr-2007 08:50
When using loadHTML() to process UTF-8 pages, you may meet the problem that the output of dom functions are not like the input. For example, if you want to get "C?nh tranh", you will receive "Cáº¡nh tranh".  I suggest we use mb_convert_encoding before load UTF-8 page :
<?php
    $pageDom = new DomDocument();
    $searchPage = mb_convert_encoding($htmlUTF8Page, 'HTML-ENTITIES', "UTF-8");
    @$pageDom->loadHTML($searchPage);

?>
romain dot lalaut at laposte dot net 15-Feb-2007 08:31
Note that the elements of such document will have no namespace even with <html xmlns="http://www.w3.org/1999/xhtml">
bigtree at DONTSPAM dot 29a dot nl 26-Apr-2005 02:15
Pay attention when loading html that has a different charset than iso-8859-1. Since this method does not actively try to figure out what the html you are trying to load is encoded in (like most browsers do), you have to specify it in the html head. If, for instance, your html is in utf-8, make sure you have a meta tag in the html's head section:

<head>
<meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1252"/>
</head>

If you do not specify the charset like this, all high-ascii bytes will be html-encoded. It is not enough to set the dom document you are loading the html in to UTF-8.


Charge du HTML à partir d'un fichier

  • « DOMDocument::loadHTML
  • DOMDocument::loadXML »
  • PHP Manual
  • DOMDocument
  • Charge du HTML à partir d'un fichier

DOMDocument::loadHTMLFile

(PHP 5, PHP 7)

DOMDocument::loadHTMLFile — Charge du HTML à partir d'un fichier

Description

public DOMDocument::loadHTMLFile ( string $filename , int $options = 0 ) : DOMDocument|bool

Cette fonction analyse un document HTML contenu dans le fichier filename. Contrairement au XML, le HTML n'a pas besoin d'être bien formé pour être chargé.

Liste de paramètres

filename

Le chemin vers le fichier HTML.

options

Depuis PHP 5.4.0 et Libxml 2.6.0, vous pouvez aussi utiliser le paramètre options pour spécifier des paramètres additionnels à Libxml.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient. Si appelé statiquement, retourne un DOMDocument ou false si une erreur survient.

Erreurs / Exceptions

Si une chaîne vide est passée comme paramètre filename ou que le fichier est vide, une alerte sera générée. Cette alerte n'est pas générée par libxml, et ne peut être gérée en utilisant les fonctions de gestion d'erreur de libxml.

Cette méthode peut être appelée statiquement, mais enverra une erreur E_STRICT.

Bien que le HTML mal-formé devrait se charger avec succès, cette fonction peut générer une alerte de type E_WARNING lorsqu'elle rencontre une mauvaise balise. Les fonctions de gestion des erreurs libxml peuvent être utilisées pour gérer ces erreurs.

Exemples

Exemple #1 Création d'un document

<?php
$doc = new DOMDocument();
$doc->loadHTMLFile("filename.html");
echo $doc->saveHTML();
?>

Voir aussi

  • DOMDocument::loadHTML() - Charge du code HTML à partir d'une chaîne de caractères
  • DOMDocument::saveHTML() - Sauvegarde le document interne dans une chaîne en utilisant un formatage HTML
  • DOMDocument::saveHTMLFile() - Sauvegarde un document interne dans un fichier en utilisant un formatage HTML

User Contributed Notes

qrworld.net 11-Nov-2014 04:37
In this post http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url_11.html I found a simple way to get the content of a URL with DOMDocument, loadHTMLFile and saveHTML().

function getURLContent($url){
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = FALSE;
    @$doc->loadHTMLFile($url);
    return $doc->saveHTML();
}
onemanbanddan at gmail dot com 04-Mar-2014 12:28
The options for surpressing errors and warnings will not work with this as they do for loadXML()
e.g.
<?php
$doc->loadHTMLFile($file, LIBXML_NOWARNING | LIBXML_NOERROR);
?>
will not work.
you must use:
<?php
libxml_use_internal_errors(true);
$doc->loadHTMLFile($file);
?>
and handle the exceptions as neccesarry.
Mark Omohundro, ajamyajax dot com 28-Nov-2008 06:32
<?php
// try this html listing example for all nodes / includes a few getElementsByTagName options:

$file = $DOCUMENT_ROOT. "test.html";
$doc = new DOMDocument();
$doc->loadHTMLFile($file);

// example 1:
$elements = $doc->getElementsByTagName('*');
// example 2:
$elements = $doc->getElementsByTagName('html');
// example 3:
//$elements = $doc->getElementsByTagName('body');
// example 4:
//$elements = $doc->getElementsByTagName('table');
// example 5:
//$elements = $doc->getElementsByTagName('div');

if (!is_null($elements)) {
  foreach ($elements as $element) {
    echo "<br/>". $element->nodeName. ": ";

    $nodes = $element->childNodes;
    foreach ($nodes as $node) {
      echo $node->nodeValue. "\n";
    }
  }
}
?>
gzech at SPAMFILTER dot eso dot org 21-Feb-2007 02:09
If you want to suppress output warnings from loadHTMLFile($url), put an @ sign in front. This even works in:
<?php
$load = @$dom->loadHTMLFile($url);
?>
andy at carobert dot com 25-May-2005 01:24
This puts the HTML into a DOM object which can be parsed by individual tags, attributes, etc..  Here is an example of getting all the 'href' attributes and corresponding node values out of the 'a' tag. Very cool....

<?php
$myhtml = <<<EOF
<html>
<head>
<title>My Page</title>
</head>
<body>
<p><a href="/mypage1">Hello World!</a></p>
<p><a href="/mypage2">Another Hello World!</a></p>
</body>
</html>
EOF;

$doc = new DOMDocument();
$doc->loadHTML($myhtml);

$tags = $doc->getElementsByTagName('a');

foreach ($tags as $tag) {
       echo $tag->getAttribute('href').' | '.$tag->nodeValue."\n";
}
?>

This should output:

/mypage1 | Hello World!
/mypage2 | Another Hello World!
bens at effortlessis dot com 08-Apr-2005 05:11
Note that this function doesn't parse the individual tags WITHIN the html file - it's all loaded as a "black box", and you end up with an XML widget that comprises nothing but the complete chunk of HTML.

I was hoping it would function as a sort of HTML-validator/parser, but that doesn't seem to be the case.


Charge du XML depuis une chaîne de caractères

  • « DOMDocument::loadHTMLFile
  • DOMDocument::normalizeDocument »
  • PHP Manual
  • DOMDocument
  • Charge du XML depuis une chaîne de caractères

DOMDocument::loadXML

(PHP 5, PHP 7)

DOMDocument::loadXML — Charge du XML depuis une chaîne de caractères

Description

public DOMDocument::loadXML ( string $source , int $options = 0 ) : DOMDocument|bool

Charge un document XML depuis une chaîne de caractères.

Liste de paramètres

source

La chaîne de caractères contenant le XML.

options

L'opérateur OR des constantes libxml.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient. Si appelée statiquement, retourne un DOMDocument ou false si une erreur survient.

Erreurs / Exceptions

Si une chaîne vide est passée comme paramètre source, une alerte sera générée. Cette alerte n'est pas générée par libxml, et ne peut être gérée en utilisant les fonctions de gestion d'erreur de libxml.

Cette méthode peut être appelée statiquement, mais enverra une erreur E_STRICT.

Exemples

Exemple #1 Création d'un Document

<?php
$doc = new DOMDocument();
$doc->loadXML('<root><node/></root>');
echo $doc->saveXML();
?>

Exemple #2 Invocation statique de loadXML

<?php
// Emet une erreur E_STRICT
$doc = DOMDocument::loadXML('<root><node/></root>');
echo $doc->saveXML();
?>

Voir aussi

  • DOMDocument::load() - Charge du XML depuis un fichier
  • DOMDocument::save() - Sauvegarde l'arbre interne XML dans un fichier
  • DOMDocument::saveXML() - Sauvegarde l'arbre interne XML dans une chaîne de caractères

User Contributed Notes

Adrian Wiik 13-Nov-2019 09:02
A call to loadXML() will overwrite the XML declaration previously created in the constructor of DOMDocument. This can cause encoding problems if there is no XML declaration in the loaded XML and you don't have control over the source (e.g. if the XML is coming from a webservice). To fix this, set encoding AFTER loading the XML using the 'encoding' class property of DOMDocument. Example:

Bad situation:

test.xml:
<test>
    <hello>hi</hello>
    <field>ø</field>
</test>

test.php:
$xmlDoc = new DOMDocument("1.0", "utf-8"); // Parameters here are overwritten anyway when using loadXML(), and are not really relevant
$testXML = file_get_contents("test.xml");
$xmlDoc->loadXML($testXML);
// Print the contents to a file or in a log function to get the output, using $xmlDoc->saveXML()

Output:
<?xml version="1.0"?>
<test>
    <hello>hi</hello>
    <field>&#xF8;</field>
</test>

Good situation:

test.xml:
<test>
    <hello>hi</hello>
    <field>ø</field>
</test>

test.php:
$xmlDoc = new DOMDocument("1.0", "utf-8"); // Parameters here are overwritten anyway when using loadXML(), and are not really relevant
$testXML = file_get_contents("test.xml");
$xmlDoc->loadXML($testXML);
$xmlDoc->encoding = "utf-8";
// Print the contents to a file or in a log function to get the output, using $xmlDoc->saveXML()

Output:
<?xml version="1.0" encoding="utf-8"?>
<test>
    <hello>hi</hello>
    <field>ø</field>
</test>
Gustavo L. Fabro 14-Nov-2013 04:41
Always remember that with the default parameters this function doesn't handle well large files, i.e. if a text node is longer than 10Mb it can raise an exception stating:

DOMDocument::loadXML(): internal error Extra content at the end of the document in Entity

even though the XML is fine.

The cause is a definition in parserInternals.h of lixml:
#define XML_MAX_TEXT_LENGTH 10000000

To allow the function to process larger files, pass the LIBXML_PARSEHUGE as an option and it will work just fine:

$domDocument->loadXML($xml, LIBXML_PARSEHUGE);
szalma dot laszlo at zengo dot eu 27-Oct-2009 08:14
Loading from a string works fine without the <?xml version="1.0" encoding="utf-8"?> header, but in this case the xmlEncoding won't be set, and this makes the utf-8 characters (international, and special characters) to be encoded as hexa entities when saved with saveXML()!
remacg 26-Feb-2009 07:33
Instead of doing this:

<?php
$str = <<<XML
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE root [
<!ENTITY nbsp "&#160;">
]>
<div>This&nbsp;is a non-breaking space.</div>
XML;

$dd2 = new DOMDocument();
$dd2->loadXML($str);

echo $dd2->saveXML();
?>

simply use:

loadHTML() rather than loadXML().
olalonde at NOSPAM dot gmail dot com 21-Mar-2008 05:00
For some reason, when you set DOMDocument's property 'recover' to true, using '@' to mask errors thrown by loadXml() won't work.

Here's my workaround:

function maskErrors() {}
set_error_handler('maskErrors');
$dom->loadXml($xml);
restore_error_handler();

You could also simply do this: error_reporting(0); and then set back error_reporting to its original state.
Stuart Grimshaw 26-Jun-2007 01:57
Possible values for the options parameter can be found here:

http://us3.php.net/manual/en/ref.libxml.php#libxml.constants
Marc Liyanage 18-Jun-2007 07:08
The documentation states that loadXML can be called statically, but this is misleading. This feature seems to be a special case hack and its use seems to be discouraged according to http://bugs.php.net/bug.php?id=41398.

Calling the method statically will fail with an error if the code runs with E_STRICT error reporting enabled.

The documentation should be changed to make it clear that a static call is against recommended practice and won't work with E_STRICT.
jazzslider at hotmail dot com 30-Apr-2007 01:14
When using loadXML() to parse a string that contains entity references (e.g., &nbsp;), be sure that those entity references are properly declared through the use of a DOCTYPE declaration; otherwise, loadXML() will not be able to interpret the string.

Example:
<?php
$str = <<<XML
<?xml version="1.0" encoding="iso-8859-1"?>
<div>This&nbsp;is a non-breaking space.</div>
XML;

$dd1 = new DOMDocument();
$dd1->loadXML($str);

echo $dd1->saveXML();
?>

Given the above code, PHP will issue a Warning about the entity 'nbsp' not being properly declared.  Also, the call to saveXML() will return nothing but a trimmed-down version of the original processing instruction...everything else is gone, and all because of the undeclared entity.

Instead, explicitly declare the entity first:
<?php
$str = <<<XML
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE root [
<!ENTITY nbsp "&#160;">
]>
<div>This&nbsp;is a non-breaking space.</div>
XML;

$dd2 = new DOMDocument();
$dd2->loadXML($str);

echo $dd2->saveXML();
?>

Since the 'nbsp' entity is defined in the DOCTYPE, PHP no longer issues that Warning; the string is now well-formed, and loadXML() understands it perfectly.

You can also use references to external DTDs in the same way (e.g., <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">), which is particularly important if you need to do this for many different documents with many different possible entities.

Also, as a sidenote...entity references created by createEntityReference() do not need this kind of explicit declaration.
shaoyu73 at gmail dot com 15-Mar-2007 08:53
earth at anonymous dot com,

preserveWhiteSpace property needs to be set to false for formatOutput to work properly, for some reason.

$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->loadXML($xmlStr);
...
$element->appendChild(...);
...
$dom->formatOutput = true;
$xmlStr = $dom->saveXML();
echo $xmlStr;

This would format the output nicely.
Gavin Sinai gsinai at gmx dot net 30-Aug-2006 07:34
loadXml reports an error instead of throwing an exception when the xml is not well formed. This is annoying if you are trying to to loadXml() in a try...catch statement. Apparently its a feature, not a bug, because this conforms to a spefication.

If you want to catch an exception instead of generating a report, you could do something like

<?php
function HandleXmlError($errno, $errstr, $errfile, $errline)
{
    if ($errno==E_WARNING && (substr_count($errstr,"DOMDocument::loadXML()")>0))
    {
        throw new DOMException($errstr);
    }
    else
        return false;
}

function XmlLoader($strXml)
{
    set_error_handler('HandleXmlError');
    $dom = new DOMDocument();
    $dom->loadXml($strXml);
    restore_error_handler();
    return $dom;
 }

?>

Returning false in function HandleXmlError() causes a fallback to the default error handler.
mp at webfactory dot de 08-Aug-2006 08:26
While loadXML() expects its input to have a leading XML processing instruction to deduce the encoding used, there's no such concept in (non-XML) HTML documents. Thus, the libxml library underlying the DOM functions peeks at the <META> tags to figure out the encoding used.

See http://xmlsoft.org/encoding.html.
earth at anonymous dot com 12-Apr-2006 02:28
Note that loadXML crops off beginning and trailing whitespace and linebreaks.

When using loadXML and appendChild to add a chunk of XML to an existing document, you may want to force a linebreak between the end of the XML chunk and the next line (usually a close tag) in the output file:

$childDocument = new DOMDocument;
$childDocument>preserveWhiteSpace = true;
$childDocument->loadXML(..XML-Chunk..);
$mNewNode = $mainDOcument->importNode($childDocument->documentElement, true);
$ParentNode->appendChild($mNewNode);
$ParentNode->appendChild($mainDocument->createTextNode("\\n  ");

Although it is said that DOM should not be used to make 'pretty' XML output, it is something I struggled with to get something that was readable for testing.  Another solution is to use the createDocumentFragment()->appendXML(..XML-Chunk..) instead, which seems not to trim off linebreaks like DOMDocument->loadXML() does.


Normalise le document

  • « DOMDocument::loadXML
  • DOMDocument::registerNodeClass »
  • PHP Manual
  • DOMDocument
  • Normalise le document

DOMDocument::normalizeDocument

(PHP 5, PHP 7)

DOMDocument::normalizeDocument — Normalise le document

Description

public DOMDocument::normalizeDocument ( ) : void

Cette méthode fonctionne comme si vous sauvegardiez le document puis vous le chargiez de nouveau, rendant le document sous une forme "normale".

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • » La spécification DOM
  • DOMNode::normalize() - Normalise le noeud

User Contributed Notes

lingasamy dot sakthivel at gmail dot com 16-Apr-2015 05:44
You can use this in this way.

$doc = new DOMDocument('1.0', 'UTF-8');
$doc->loadHTML($content); // html content
$xpath = new DOMXPath($doc);
$doc->normalizeDocument();

Note that, you can use $doc->normalizeDocument(); at any point of time.


Enregistre la classe étendue utilisée pour créer un type de base de nœud

  • « DOMDocument::normalizeDocument
  • DOMDocument::relaxNGValidate »
  • PHP Manual
  • DOMDocument
  • Enregistre la classe étendue utilisée pour créer un type de base de nœud

DOMDocument::registerNodeClass

(PHP 5 >= 5.2.0, PHP 7)

DOMDocument::registerNodeClass — Enregistre la classe étendue utilisée pour créer un type de base de nœud

Description

public DOMDocument::registerNodeClass ( string $baseClass , string|null $extendedClass ) : bool

Cette méthode vous permet d'enregistrer votre propre classe étendue DOM à utiliser ensuite dans l'extension DOM de PHP.

Cette méthode ne fait pas partie du standard DOM.

Liste de paramètres

baseClass

La classe DOM qui vous voulez étendre. Vous pouvez trouver une liste de ces classes dans l'introduction du chapitre.

extendedClass

Le nom de votre classe étendue. Si la valeur null est fournie, toutes les classes enregistrées précédemment étendant baseClass seront supprimées.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Ajout d'un nouvelle méthode à DOMElement

<?php

class myElement extends DOMElement {
   function appendElement($name) {
      return $this->appendChild(new myElement($name));
   }
}

class myDocument extends DOMDocument {
   function setRoot($name) {
      return $this->appendChild(new myElement($name));
   }
}

$doc = new myDocument();
$doc->registerNodeClass('DOMElement', 'myElement');

// À partir d'ici, l'ajout d'un élément à un autre se fait en un seul appel !
$root = $doc->setRoot('root');
$child = $root->appendElement('child');
$child->setAttribute('foo', 'bar');

echo $doc->saveXML();

?>

L'exemple ci-dessus va afficher :

<?xml version="1.0"?>
<root><child foo="bar"/></root>

Exemple #2 Récupération d'éléments sous la forme d'une classe personnalisée

<?php
class myElement extends DOMElement {
    public function __toString() {
        return $this->nodeValue;
    }
}

$doc = new DOMDocument;
$doc->loadXML("<root><element><child>Text dans un fils</child></element></root>");
$doc->registerNodeClass("DOMElement", "myElement");

$element = $doc->getElementsByTagName("child")->item(0);
var_dump(get_class($element));

// Et utilisons les avantages de la méthode __toString..
echo $element;
?>

L'exemple ci-dessus va afficher :

string(9) "myElement"
Text dans un fils

Exemple #3 Récupération du propriétaire du document

Lors de l'instanciation d'un DOMDocument personnalisé, la propriété ownerDocument se réfère à la classe instanciée, signifiant qu'il n'est pas nécessaire (et en fait, par possible) d'utiliser DOMDocument::registerNodeClass() avec DOMDocument

<?php
class myDOMDocument extends DOMDocument {
}

class myOtherDOMDocument extends DOMDocument {
}

// Création d'un document myDOMDocument avec quelques fragments XML
$doc = new myDOMDocument;
$doc->loadXML("<root><element><child>texte dans un fils</child></element></root>");

$child = $doc->getElementsByTagName("child")->item(0);

// Le propriétaire courant du nœud est myDOMDocument
var_dump(get_class($child->ownerDocument));

// Importation d'un nœud depuis myDOMDocument
$newdoc = new myOtherDOMDocument;
$child = $newdoc->importNode($child);

// Le nouveau propriétaire du nœud a changé en myOtherDOMDocument
var_dump(get_class($child->ownerDocument));
?>

L'exemple ci-dessus va afficher :

string(13) "myDOMDocument"
string(18) "myOtherDOMDocument"

Exemple #4 Les objets personalisé sont éphémère

Attention

Les objets de la classe de noeux registré sont éphém_re, c.à.d. ils sont détruit quand ils ne sont plus référencer depuis du code PHP, et recréé quand ils sont denouveaux récupérer. Ceci implque que des valeurs de propriétés personalisé seront perdu après la recréation.

<?php
class MyDOMElement extends DOMElement
{
    public $myProp = 'default value';
}

$doc = new DOMDocument();
$doc->registerNodeClass('DOMElement', 'MyDOMElement');

$node = $doc->createElement('a');
$node->myProp = 'modified value';
$doc->appendChild($node);

echo $doc->childNodes[0]->myProp, PHP_EOL;
unset($node);
echo $doc->childNodes[0]->myProp, PHP_EOL;
?>

L'exemple ci-dessus va afficher :

modified value
default value

User Contributed Notes

crh3675 at gmail dot com 25-Sep-2009 08:23
Creating innerHTML and outerHTML

<?php

class DOMHTMLElement extends DOMElement
{
    function __construct() { parent::__construct();}

    public function innerHTML()
    {
        $doc = new DOMDocument();
      foreach ($this->childNodes as $child){
          $doc->appendChild($doc->importNode($child, true));
        }
        $content = $doc->saveHTML();
        return $content;
    }

    public function outerHTML()
    {
        $doc = new DOMDocument();
        $doc->appendChild($doc->importNode($this, true));
        $content = $doc->saveHTML();
        return $content;
    }
}

$dom = DOMDocument::loadHTMLFile($file);
$dom->registerNodeClass('DOMElement','DOMHTMLElement');

if($dom)
{
    $xpath = new DOMXpath($dom);
    $regions = $xpath->query("//*[contains(@class, 'editable')]");
    $content = '';

    foreach($regions as $region){
        $content .= $region->outerHTML();
    }

    return $content;

}else{
    throw new Exception('Cannot parse HTML.  Please verify the syntax is correct.');
}
?>
arnold at adaniels dot nl 22-Jul-2009 03:10
Note than save and saveXML are not affected by __toString().


Effectue une validation relaxNG sur le document

  • « DOMDocument::registerNodeClass
  • DOMDocument::relaxNGValidateSource »
  • PHP Manual
  • DOMDocument
  • Effectue une validation relaxNG sur le document

DOMDocument::relaxNGValidate

(PHP 5, PHP 7)

DOMDocument::relaxNGValidate — Effectue une validation relaxNG sur le document

Description

public DOMDocument::relaxNGValidate ( string $filename ) : bool

Effectue une validation » relaxNG sur le document selon le schéma RNG défini par filename.

Liste de paramètres

filename

Le fichier RNG.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • DOMDocument::relaxNGValidateSource() - Effectue une validation relaxNG sur le document
  • DOMDocument::schemaValidate() - Valide un document selon un schéma. Seuls les schémas XML 1.0 sont supportés.
  • DOMDocument::schemaValidateSource() - Valide un document selon un schéma
  • DOMDocument::validate() - Valide un document en se basant sur sa DTD

User Contributed Notes

scarywound at gmail dot com 17-Oct-2012 11:39
Keep in mind that this method can't handle schemas in compact syntax!
mitchell dot beaumont at mitchellbeaumont dot com 26-Aug-2007 07:28
It's worth noting that when validation fails this function also triggers a warning.

You can suppress the warning using the set_error_handler and restore_error_handler functions.


Effectue une validation relaxNG sur le document

  • « DOMDocument::relaxNGValidate
  • DOMDocument::save »
  • PHP Manual
  • DOMDocument
  • Effectue une validation relaxNG sur le document

DOMDocument::relaxNGValidateSource

(PHP 5, PHP 7)

DOMDocument::relaxNGValidateSource — Effectue une validation relaxNG sur le document

Description

public DOMDocument::relaxNGValidateSource ( string $source ) : bool

Effectue une validation » relaxNG sur le document selon le schéma RNG défini dans la chaîne source.

Liste de paramètres

source

Une chaîne contenant le schéma RNG.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • DOMDocument::relaxNGValidate() - Effectue une validation relaxNG sur le document
  • DOMDocument::schemaValidate() - Valide un document selon un schéma. Seuls les schémas XML 1.0 sont supportés.
  • DOMDocument::schemaValidateSource() - Valide un document selon un schéma
  • DOMDocument::validate() - Valide un document en se basant sur sa DTD

User Contributed Notes

There are no user contributed notes for this page.


Sauvegarde l'arbre interne XML dans un fichier

  • « DOMDocument::relaxNGValidateSource
  • DOMDocument::saveHTML »
  • PHP Manual
  • DOMDocument
  • Sauvegarde l'arbre interne XML dans un fichier

DOMDocument::save

(PHP 5, PHP 7)

DOMDocument::save — Sauvegarde l'arbre interne XML dans un fichier

Description

public DOMDocument::save ( string $filename , int $options = 0 ) : int|false

Crée un document XML depuis la représentation DOM. Cette fonction est habituellement appelée après la construction d'un nouveau document DOM, comme dans l'exemple ci-dessous.

Liste de paramètres

filename

Le chemin où sera sauvegardé le document XML.

options

Options additionnelles. Actuellement, seul LIBXML_NOEMPTYTAG est supporté.

Valeurs de retour

Retourne le nombre d'octets écrit ou false si une erreur survient.

Exemples

Exemple #1 Sauvegarde d'un arbre DOM dans un fichier

<?php

$doc = new DOMDocument('1.0');
// nous voulons un bel affichage
$doc->formatOutput = true;

$root = $doc->createElement('book');
$root = $doc->appendChild($root);

$title = $doc->createElement('title');
$title = $root->appendChild($title);

$text = $doc->createTextNode('This is the title');
$text = $title->appendChild($text);

echo 'Écrit : ' . $doc->save("/tmp/test.xml") . ' bytes'; // Écrit : 72 bytes

?>

Voir aussi

  • DOMDocument::save()
  • DOMDocument::load() - Charge du XML depuis un fichier
  • DOMDocument::loadXML() - Charge du XML depuis une chaîne de caractères

User Contributed Notes

dubois-holvoet dot patrick at neuf dot fr 25-Feb-2016 08:13
I just intend to bring my little contribution to the use of DOMDocument::save() function along with PHP serialize() function.

Sometimes you could have to serialize a PHP object before you put it into a XML structure (or other..). And then I suppose you could have to save this XML structure in a file. Of course, you will further need to read this file and unserialize it before to use its content.

The problem appears when there are some properties described as Protected in the object to be serialized.

As it’s written in the PHP documentation, serialize function add for those protected properties an asterisk before the name of the property along with a NULL character on each side of the asterisk.
In this case, the DOMDocument::save function will stop the save operation just before the first NULL character met in the string to be saved, because PHP consider it as a potential risk.
So, after that, the unserialize operation of the file become impossible.

To solve that, here is a first solution to apply :

For the serialize , before the DOMDocument::save() ::
$data_serial = explode("\x00\x2A\x00", serialize($object));  //take off the 'NULL * NULL' string
$data_serial = implode("\x5C\x30\x2A\x5C\x30", $data_serial);    //and replace with '\0*\0' string

Before the unserialize :
$data_serial = explode("\x5C\x30\x2A\x5C\x30", $serialized_object);    // take off the '\0*\0' string
$serial_object = implode("\x00\x2A\x00", $data_serial);      // and replace with 'NULL * NULL' string as included by the previous serialize

And a second solution :

For the serialize, before the DOMDocument::save() :
$serialized_object = addslashes(serialize($object)) ;

Before re-using the object in your application :
$object = unserialize(stripslashes($serialized_object)) ;

Hope this will help some.
ludvig at ergopedia dot no 31-Oct-2014 10:21
When creating a DOMDocument from scratch and saving it, the encoding will be utf-8, although it's declared as iso-8859-1.

When loading an XML-file declared and saved as iso-8859-1, php will keep the correct encoding when it's saved after changes are made.

Php converts files declared as iso-8859-1 to utf-8 internally. To add text containing special characters, the text must be encoded as utf-8. When the document is saved, special characters are converted to iso-8859-1.

To save an xml created from scratch, use fopen/fwrite and utf8_decode:

   $doc = new DOMDocument('1.0', 'iso-8859-1');

//Add som nodes and text with apropriate methods

   $f = fopen('xmlfile.xml', 'w+');
   fwrite($f, utf8_decode($doc->saveXML()));
   fclose($f);
john at johnreid dot it 06-Aug-2013 09:42
I had been hitting my head against the wall when I couldn't get an edited XML file to save due to file permissions, even though I knew that it was OK.

Eventually I realised that for some odd reason, when I went to save the XML file, it would try to write the file to the root directory.

As such, use realpath() to keep the complete system path to the XML file when you load it:

<?php
$myfile = 'myxml.xml';
$myfile = realpath($myfile);
$doc = new DOMDocument('1.0');
$doc->load($myfile);

// Let's just add a couple of elements for good measure
$root = $doc->documentElement;

$title = $doc->createElement('title');
$title = $root->appendChild($title);

$text = $doc->createTextNode('This is a title');
$text = $title->appendChild($text);

$doc->save($myfile);
?>
ss at littlerain dot com 01-Feb-2009 12:05
In addition to:
DOMDocument->formatOutput = true
DOMDocument->preserveWhiteSpace = false

...you also have to ensure you don't add text nodes as siblings of element nodes, or formatOutput won't work.
chenel324 at gmail dot com 19-Oct-2008 06:38
It took me forever to discover that
DOMDocument->formatOutput = true
will only have an effect on documents that are loaded from disk if one also sets
DOMDocument->preserveWhiteSpace = false ....

Hope this saves somebody a headache.
siegparr at NOSPAM dot web dot de 07-Jul-2006 08:00
The XML parser converts the text of an XML document into UTF-8, even if you have set the character encoding of the XML, for example as a second parameter of the DOMDocument constructor. After parsing the XML with the load() command all its texts have been converted to UTF-8.

In case you append text nodes with special characters (e. g. Umlaut) to your XML document you should therefore use utf8_encode() with your text to convert it into UTF-8 before you append the text to the document. Otherwise you will get an error message like "output conversion failed due to conv error" at the save() command. See example below:

<?php
// Text to insert into XML below
$txt = "a text with special characters like 'ä', 'ß', 'Ü' etc.";

// Create Instance of DOMDocument
$dom =  new DOMDocument;
// Load XML file
// Was created before with DOMDocument('1.0', 'iso-8859-1')
$dom = $dom->load("file.xml");
// Find the parent node
$parent = $dom->documentElement;
// Create Instance of DomXPath
$xpath = new DomXPath($dom);
// new node will be inserted before this node
$next = $xpath->query("//parentnode/childnode");
// Create the new element
$new_elem = $dom->createElement('new_elem');
// Insert the new element
$parent->insertBefore($new_elem, $next->item(0));
// DOMXML = utf-8! (will be converted to iso-8859-1 only at 'save()')
// prevents error message "output conversion failed due to conv error" at 'save()'
$txt = utf8_encode($txt);
// Create new text node with utf-8 encoded string
$nodetext = $dom->createTextNode("$txt");
// Append text node to new element
$nodetext = $new_elem->appendChild($nodetext);
// save
$dom->save("file.xml");
?>

Hope this helps someone.

siegparr


Sauvegarde le document interne dans une chaîne en utilisant un formatage HTML

  • « DOMDocument::save
  • DOMDocument::saveHTMLFile »
  • PHP Manual
  • DOMDocument
  • Sauvegarde le document interne dans une chaîne en utilisant un formatage HTML

DOMDocument::saveHTML

(PHP 5, PHP 7)

DOMDocument::saveHTML — Sauvegarde le document interne dans une chaîne en utilisant un formatage HTML

Description

public DOMDocument::saveHTML ( DOMNode|null $node = null ) : string|false

Crée un document HTML depuis une représentation DOM. Cette fonction est habituellement appelée après la construction d'un tout nouveau document DOM, comme dans l'exemple ci-dessous.

Liste de paramètres

node

Paramètre optionnel pour afficher une portion du document.

Valeurs de retour

Retourne le code HTML ou false si une erreur survient.

Exemples

Exemple #1 Sauvegarde d'un arbre HTML dans une chaîne de caractères

<?php

$doc = new DOMDocument('1.0');

$root = $doc->createElement('html');
$root = $doc->appendChild($root);

$head = $doc->createElement('head');
$head = $root->appendChild($head);

$title = $doc->createElement('title');
$title = $head->appendChild($title);

$text = $doc->createTextNode('Ceci est le titre');
$text = $title->appendChild($text);

echo $doc->saveHTML();

?>

Voir aussi

  • DOMDocument::saveHTML()
  • DOMDocument::loadHTML() - Charge du code HTML à partir d'une chaîne de caractères
  • DOMDocument::loadHTMLFile() - Charge du HTML à partir d'un fichier

User Contributed Notes

jeboy 28-Sep-2017 02:57
LIBXML_HTML_NOIMPLIED doesn't work on PHP 7.1.9 with libxml2-2.7.8
sasha @ goldnet dot ca 27-Jul-2017 04:21
When saving HTML fragment initiated with LIBXML_HTML_NOIMPLIED option, it will end up being "broken" as libxml requires root element. libxml will attempt to fix the fragment by adding closing tag at the end of string based on the first opened tag it encounters in the fragment.

For an example:

<h1>Foo</h1><p>bar</p>

will end up as:

<h1>Foo<p>bar</p></h1>

Easiest workaround is adding root tag yourself and stripping it later:

$html->loadHTML('<html>' . $content .'</html>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

$content = str_replace(array('<html>','</html>') , '' , $html->saveHTML());
contact at cathexis dot de 31-Aug-2016 10:41
If you load HTML from a string ensure the charset is set.

<?php
...
$html_src = '<html><head><meta content="text/html; CHARSET=Windows-1252" http-equiv="Content-Type"></head><body>';
$html_src .= '...';
...
?>

Otherwise the charset will be ISO-8859-1!
tomas dot strejcek at ghn dot cz 20-Aug-2016 12:34
As of PHP 5.4 and Libxml 2.6, there is currently simpler approach:

when you load html as this

$html->loadHTML($content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

in the output, there will be no doctype, html or body tags
Anonymous 11-Dec-2015 03:38
To solve the script tag problem just add an empty text node to the script node and DOMDocument will render <script src="your.js"></script> nicely.
RiKdnUA at mail dot ru 29-Apr-2015 03:49
Tested in PHP 5.2.9-2 and PHP 5.2.17.
saveHTML() ?????????? ???????? DOMDocument->encoding. ????? saveHTML() ????????? html-???????? ? ?????????, ??????? ??????? ? ???? <meta> ????????? (????????????) html-?????????.
saveHTML() ignores property DOMDocument->encoding. Method saveHTML() saves the html-document encoding, which is specified in the tag <meta> source (downloaded) html-document.
Example:
file.html. ????????? ????? ?????? ????????? ? ????????? ? ???? <meta>. The encoding of the file must match the specified tag <meta>.
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Russian language</title></head>
<body>??????? ????</body></html>

<?php
error_reporting(-1);
$document=new domDocument('1.0', 'UTF-8');
$document->preserveWhiteSpace=false;
$document->loadHTMLFile('file.html');
$document->formatOutput=true;
$document->encoding='UTF-8';
$htm=$document->saveHTML();
echo"???????? ????. Recorded bytes: ".file_put_contents('file_new.html', $htm);
?>
file_new.html ????? ? ????????? Windows-1251 (?? ? UTF-8).
file_new.html will be encoded in Windows-1251 (not in UTF-8).

saveHTML() ? file_put_contents() ????????? ?????????? ?????????? ?????? saveHTMLFile().
???????? ??? ??????????? ? ?????? saveHTMLFile().
saveHTML() and file_put_contents() allows you to overcome the lack of a method saveHTMLFile().
See my comment on the method saveHTMLFile().
http://php.net/manual/ru/domdocument.savehtmlfile.php
qrworld.net 11-Nov-2014 04:34
In this post http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url_11.html I found a simple way to get the content of a URL with DOMDocument, loadHTMLFile and saveHTML().

function getURLContent($url){
    $doc = new DOMDocument;
    $doc->preserveWhiteSpace = FALSE;
    @$doc->loadHTMLFile($url);
    return $doc->saveHTML();
}
alvaro at demogracia dot com 29-Mar-2011 11:04
Since PHP/5.3.6, DOMDocument->saveHTML() accepts an optional DOMNode parameter similarly to DOMDocument->saveXML():

http://bugs.php.net/bug.php?id=39771
Yajo 24-Nov-2010 07:21
Another way to workaround the <script/> problem is putting a semicolon (;) inside the script element.
Anonymous 09-Feb-2010 07:52
If you want a simpler way to get around the <script> tag problem try:

<?php

  $script = $doc->createElement ('script');\
  // Creating an empty text node forces <script></script>
  $script->appendChild ($doc->createTextNode (''));
  $head->appendChild ($script);

?>
Anonymous 12-May-2009 07:35
To avoid script tags from being output as <script />, you can use the DOMDocumentFragment class:

<?php

$doc = new DOMDocument();
$doc -> loadXML($xmlstring);
$fragment = $doc->createDocumentFragment();
/* Append the script element to the fragment using raw XML strings (will be preserved in their raw form) and if succesful proceed to insert it in the DOM tree */
if($fragment->appendXML("<script type='text/javascript' src='$source'></script>") {
  $xpath = new DOMXpath($doc);
  $resultlist = $xpath->query("//*[local-name() = 'html']/*[local-name() = 'head']"); /* namespace-safe method to find all head elements which are childs of the html element, should only return 1 match */
  foreach($resultlist as $headnode)  // insert the script tag
     $headnode->appendChild($fragment);
}
$doc->saveXML(); /* and our script tags will still be <script></script> */

?>
Bart Feenstra 18-Jan-2009 10:17
I am using this solution to prevent tags and the doctype from being added to the HTML string automatically:

<?php
$html = '<h1>Hello world!</h1>';
$html = '<div>' . $html . '</div>';
$doc = new DOMDocument;
$doc->loadHTML($html);
echo substr($doc->saveXML($doc->getElementsByTagName('div')->item(0)), 5, -6)

// Outputs: "<h1>Hello world!</h1>"
?>
m at hbblogs daught calm 18-Aug-2008 08:41
This method, as of 5.2.6, will automatically add <html><body> and <!DOCTYPE> tags to the document if they are missing, without asking whether you want them. In my application, I needed to use the DOM methods to manipulate just a fragment of html, so these tags were rather unhelpful.

Here's a simple hack to remove them in case, like me, all you wanted to do was perform a few operations on an HTML fragment.

$html_fragment = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $dom->saveHTML()));
Anonymous 25-Apr-2008 08:15
<?php
function getDOMString($retNode) {
  if (!$retNode) return null;
  $retval = strtr($retNode-->ownerDocument->saveXML($retNode),
  array(
    '></area>' => ' />',
    '></base>' => ' />',
    '></basefont>' => ' />',
    '></br>' => ' />',
    '></col>' => ' />',
    '></frame>' => ' />',
    '></hr>' => ' />',
    '></img>' => ' />',
    '></input>' => ' />',
    '></isindex>' => ' />',
    '></link>' => ' />',
    '></meta>' => ' />',
    '></param>' => ' />',
    'default:' => '',
    // sometimes, you have to decode entities too...
    '&quot;' => '&#34;',
    '&amp;' =>  '&#38;',
    '&apos;' => '&#39;',
    '&lt;' =>   '&#60;',
    '&gt;' =>   '&#62;',
    '&nbsp;' => '&#160;',
    '&copy;' => '&#169;',
    '&laquo;' => '&#171;',
    '&reg;' =>   '&#174;',
    '&raquo;' => '&#187;',
    '&trade;' => '&#8482;'
  ));
  return $retval;
}
?>
mjaque at ilkebenson dot com 19-Feb-2008 11:34
DOMDocument->saveXML() doesn't generate a proper XHTML format either.

There is a problem with "script" empty elements. For example:

This will be the code generated by saveXML, with an empty script tag.

<html>
  <head>
    <script type="text/JavaScript" src="myScript.js"/>
  </head>
  <body>
    <p>I will not appear</p>
    <script type="text/JavaScript">
    alert("Not working");
    </script>
  </body>
</html>

I don't know if this is valid XHTML (W3C Validator doesn't complain), but both FF 2.0 and IE 6 will not render it properly. Both will use </script> as the closing tag for the first script causing js errors and ignoring in between elements.

You can post-process saveXML string in order to close empty tags with the following function:

<?php
    function cerrarTag($tag, $xml){
        $indice = 0;
        while ($indice< strlen($xml)){
            $pos = strpos($xml, "<$tag ", $indice);
            if ($pos){
                $posCierre = strpos($xml, ">", $pos);
                if ($xml[$posCierre-1] == "/"){
                    $xml = substr_replace($xml, "></$tag>", $posCierre-1, 2);
                }
                $indice = $posCierre;
            }
            else break;
        }
        return $xml;
    }
?>

At least script and select empty elements should be closed. This example shows how it can be used:

<?php
    define("CABECERA_XHTML", '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">');

  $xhtml = $docXML->saveXML($docXML->documentElement);
  $xhtml = cerrarTag("script", $xhtml);
  $xhtml = cerrarTag("select", $xhtml);
  $xhtml = CABECERA_XHTML."\n".$xhtml;
  echo $xhtml;
?>
archanglmr at yahoo dot com 27-Nov-2007 03:28
If created your DOMDocument object using loadHTML() (where the source is from another site) and want to pass your changes back to the browser you should make sure the HTTP Content-Type header matches your meta content-type tags value because modern browsers seem to ignore the meta tag and trust just the HTTP header. For example if you're reading an ISO-8859-1 document and your web server is claiming UTF-8 you need to correct it using the header() function.

<?php
header('Content-Type: text/html; charset=iso-8859-1');
?>
xoplqox 20-Nov-2007 11:07
XHTML:

If the output is XHTML use the function saveXML().

Output example for saveHTML:

<select name="pet" size="3" multiple>
    <option selected>mouse</option>
    <option>bird</option>
    <option>cat</option>
</select>

XHTML conform output using saveXML:

<select name="pet" size="3" multiple="multiple">
    <option selected="selected">mouse</option>
    <option>bird</option>
    <option>cat</option>
</select>
tyson at clugg dot net 21-Apr-2005 05:44
<?php
// Using DOM to fix sloppy HTML.
// An example by Tyson Clugg <tyson@clugg.net>
//
// vim: syntax=php expandtab tabstop=2

function tidyHTML($buffer)
{
  // load our document into a DOM object
  $dom = @DOMDocument::loadHTML($buffer);
  // we want nice output
  $dom->formatOutput = true;
  return($dom->saveHTML());
}

// start output buffering, using our nice
// callback funtion to format the output.
ob_start("tidyHTML");

?>
<html>
<p>It's like comparing apples to oranges.
</html>
<?php

// this will be called implicitly, but we'll
// call it manually to illustrate the point.
ob_end_flush();

?>

The above code takes out sloppy HTML:
 <html>
 <p>It's like comparing apples to oranges.
 </html>

And cleans it up to the following:
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
 <html><body><p>It's like comparing apples to oranges.
 </p></body></html>


Sauvegarde un document interne dans un fichier en utilisant un formatage HTML

  • « DOMDocument::saveHTML
  • DOMDocument::saveXML »
  • PHP Manual
  • DOMDocument
  • Sauvegarde un document interne dans un fichier en utilisant un formatage HTML

DOMDocument::saveHTMLFile

(PHP 5, PHP 7)

DOMDocument::saveHTMLFile — Sauvegarde un document interne dans un fichier en utilisant un formatage HTML

Description

public DOMDocument::saveHTMLFile ( string $filename ) : int|false

Crée un document HTML depuis une représentation DOM. Cette fonction est habituellement appelée après la construction d'un tout nouveau document DOM, comme dans l'exemple ci-dessous.

Liste de paramètres

filename

Le chemin où l'on doit sauvegarder le document HTML.

Valeurs de retour

Retourne le nombre d'octets écrit ou false si une erreur survient.

Exemples

Exemple #1 Sauvegarde d'un arbre HTML dans un fichier

<?php

$doc = new DOMDocument('1.0');
// nous voulons un joli affichage
$doc->formatOutput = true;

$root = $doc->createElement('html');
$root = $doc->appendChild($root);

$head = $doc->createElement('head');
$head = $root->appendChild($head);

$title = $doc->createElement('title');
$title = $head->appendChild($title);

$text = $doc->createTextNode('Ceci est le titre');
$text = $title->appendChild($text);

echo 'Écrit : ' . $doc->saveHTMLFile("/tmp/test.html") . ' bytes'; // Écrit : 129 bytes

?>

Voir aussi

  • DOMDocument::saveHTML() - Sauvegarde le document interne dans une chaîne en utilisant un formatage HTML
  • DOMDocument::loadHTML() - Charge du code HTML à partir d'une chaîne de caractères
  • DOMDocument::loadHTMLFile() - Charge du HTML à partir d'un fichier

User Contributed Notes

RiKdnUA at mail dot ru 27-Jul-2013 04:15
saveHTMLFile() always saves the file in UTF-8. Even if the DOMDocument->encoding explicitly prescribe different from UTF-8 encoding. All "non-Latin" characters will be converted to HTML-entities. Tested in PHP 5.2.9-2 and PHP 5.2.17. Example:

<?php
$document=new domDocument('1.0', 'WINDOWS-1251');
$document->loadHTML('<html><head><title>Russian language</title></head><body>??????? ????</body></html>');
$document->formatOutput=true;
$document->encoding='WINDOWS-1251';
echo "???????? ????. Recorded bytes: ".$document->saveHTMLFile('html.html');
?>

Method recorded file in UTF-8 encoding. The contents of the file html.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1252">
<title>Russian language</title>
</head>
<body>Ðóññêèé ÿçûê</body>
</html>
naebeth at hotmail dot NOSPAM dot com 24-Sep-2012 10:03
Not mentioned in the documentation is the fact that using DOMDocument::saveHTMLFile() will automatically overwrite the contents if an existing file is used - with no notice, warning or error thrown.

Make sure you check the filename before using this function so that you don't accidentally overwrite important files.

Example:
<?php

$file = fopen('test.html', 'w');
fwrite($file, 'this is some text');
fclose($file);

$doc = new DOMDocument();
$doc->formatOutput = true;
$doc->loadHTML('<html><head><title>Test</title></head><body></body></html>');
$doc->saveHTMLFile('test.html');

// test.html
/*
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1252">
<title>Test</title>
</head>
<body></body>
</html>
*/

?>

If you're dynamically generating a series of pages using DOMDocument objects, make sure you are also dynamically generating the file or directory names using something that can't easily be confused for an existing file/folder, or check if the desired path already exists before saving so that you don't accidentally delete previous files.
deep42thouSPAMght42 at y_a_h_o_o dot com 14-Jan-2011 03:46
I foolishly assumed that this function was equivalent to
<?php
file_put_contents($filename, $document->saveHTML());
?>
but there are differences in the generated HTML:
<?php
$doc = new DOMDocument();
$doc->loadHTML(
    '<html><head><title>Test</title></head><body></body></html>'
);
$doc->encoding = 'iso-8859-1';

echo $doc->saveHTML();
#<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
#<html>
#<head><title>Test</title></head>
#<body></body>
#</html>

$doc->saveHTMLFile('output.html');
#<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
#<html><head><meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1252"><title>Test</title></head><body></body></html>

?>
Note that saveHTMLFile() adds a UTF-8 meta tag despite the ISO-8859-1 document encoding.


Sauvegarde l'arbre interne XML dans une chaîne de caractères

  • « DOMDocument::saveHTMLFile
  • DOMDocument::schemaValidate »
  • PHP Manual
  • DOMDocument
  • Sauvegarde l'arbre interne XML dans une chaîne de caractères

DOMDocument::saveXML

(PHP 5, PHP 7)

DOMDocument::saveXML — Sauvegarde l'arbre interne XML dans une chaîne de caractères

Description

public DOMDocument::saveXML ( DOMNode|null $node = null , int $options = 0 ) : string|false

Crée un document XML depuis la représentation DOM. Cette fonction est habituellement appelée après la création d'un tout nouveau document DOM, comme dans l'exemple ci-dessous.

Liste de paramètres

node

Utilisez ce paramètre pour afficher uniquement un noeud spécifique sans déclaration XML plutôt que la totalité du document.

options

Options additionnelles. Actuellement, seul LIBXML_NOEMPTYTAG est supporté.

Valeurs de retour

Retourne le XML ou false si une erreur survient.

Erreurs / Exceptions

DOM_WRONG_DOCUMENT_ERR

Lancé si node est issu d'un autre document.

Exemples

Exemple #1 Sauvegarde de l'arbre DOM dans une chaîne de caractères

<?php

$doc = new DOMDocument('1.0');
// nous voulons un joli affichage
$doc->formatOutput = true;

$root = $doc->createElement('book');
$root = $doc->appendChild($root);

$title = $doc->createElement('title');
$title = $root->appendChild($title);

$text = $doc->createTextNode('Ceci est le titre');
$text = $title->appendChild($text);

echo "Récupération de tout le document :\n";
echo $doc->saveXML() . "\n";

echo "Récupération du titre, uniquement :\n";
echo $doc->saveXML($title);

?>

L'exemple ci-dessus va afficher :

Récupération de tout le document :
<?xml version="1.0"?>
<book>
  <title>Ceci est le titre</title>
</book>

Récupération du titre, uniquement :
<title>Ceci est le titre</title>

Voir aussi

  • DOMDocument::save() - Sauvegarde l'arbre interne XML dans un fichier
  • DOMDocument::load() - Charge du XML depuis un fichier
  • DOMDocument::loadXML() - Charge du XML depuis une chaîne de caractères

User Contributed Notes

liumenglei0211 at 163 dot com 17-Jan-2019 07:50
How to display two tags when the node content is empty.

<?php
$dom     = new \DOMDocument('1.0');
$document = $dom->createElement('document');
$document = $dom->appendChild($document);
$head = $dom->createElement('title','this is title');
$content = $dom->createElement('content','');
$document->appendChild($head);
$document->appendChild($content);
echo $dom->saveXML();
?>

In XML, they are considered exactly the same thing, and any parser should recognize both forms.However, you can write it this way if you still need it

<?php
echo $dom->saveXML($dom->documentElement, LIBXML_NOEMPTYTAG);
?>

Example 1:

<?xml version="1.0"?>
<document>
    <title>this is title</title>
    <content/>
</document>

Example 2:
<document>
    <title>this is test</title>
    <content></content>
</document>
Frank 29-Mar-2017 06:40
I would like to create a DOM document Xml Guestbook ..can somebody help to me?

Username, Comments in form read/write the task.

Thanks if somebody save me :)
Alexander Fedulin 05-Mar-2014 08:29
As @fbernodi said earlier, there is a problem with saveXML of DOMNode when you have a number of defined namespaces. The simple solution for this:

<code>
   // $node is some node of some other document
   $temp_document = new DOMDocument('1.0', 'utf-8');
   $temp_document->appendChild($temp_document->importNode($node, true));
   echo $temp_document->saveXML();
</code>
fbernoldi at gmail dot com 01-Aug-2013 08:24
Hello,

I had an unexpected behavior in some parsing code, because of this saveXML method that is saving the tags without namespace specification. If you try to load into a DOMDocument a string saved from a DOMNode that has a referenced namespace but it the original document it was not defined in that element, you get a not well formed xml. In the example you can see the issue and a possible solution, the other solution may be add to the ChildElement node the namespace reference (<testNS:ChildElement testNS="http://example.org">), but in my scenario it was not needed.

<?php

//Test XML
$test_xml =
"<?xml version=\"1.0\"?>
<testNS:RootNode xmlns:testNS=\"http://example.org\">
    <testNS:ChildElement>
        <testNS:AnotherChildElement>I'm a Another Child node.</testNS:AnotherChildElement>
    </testNS:ChildElement>
</testNS:RootNode>";

//We define our Test DOMDocument
$domDoc = new DOMDocument("1.0");
$domDoc->loadXML($test_xml);

//We use xpath to search ChildElement:
$domXPath = new DOMXPath($domDoc);
$domXPath->registerNamespace("testNS", "http://example.org");
$DOMNodeList_ChildElement = $domXPath->query("//testNS:RootNode/testNS:ChildElement");
$ChildElement = $DOMNodeList_ChildElement->item(0);

echo "Not usefull xml to load in another document:\n\n";
echo $domDoc->saveXML($ChildElement);

/* Output here:
 *
 * Not usefull xml to load in another document:
 *
 *  <testNS:ChildElement>
 *        <testNS:AnotherChildElement>I'm a Another Child node.</testNS:AnotherChildElement>
 *    </testNS:ChildElement>
 *
 */

/**
 * Function to help us clone the element to another document.
 * @param DOMElement $node The node to clone.
 * @param DOMDocument $doc The document where we are going to reference the elements.
 * @return DOMElement The new cloned element without namespace.
 */
function cloneNode($node, $doc) {
    //Create new element with the original localName (w/o namespace)
    $nd = $doc->createElement($node->localName);

    //Clone attributes
    foreach($node->attributes as $value)
        $nd->setAttribute($value->localName, $value->value);

    //No more childs then we finish.
    if (!$node->childNodes)
        return $nd;
    //We have childs, add them
    foreach($node->childNodes as $child) {
        if ($child->nodeName=="#text") //Only needed to clone text nodes, i.e. text comments, spaces, tabs. etc.
            $nd->appendChild($doc->createTextNode($child->nodeValue));
        else
            $nd->appendChild(cloneNode($child, $doc)); //recursion to clone all children.
    }
    return $nd;
}

//New Document to reference the new node without namespaces
$domDoc2 = new DOMDocument("1.0");

//We clone this node taking out the namespace
$new_node = cloneNode($ChildElement, $domDoc2);

echo "\n\nWe can load this into a DOMDocument without problems:\n\n";
echo $domDoc2->saveXML($new_node);

/*
 * We can load this into a DOMDocument without problems:
 *
 *    <ChildElement>
 *        <AnotherChildElement>I'm a Another Child node.</AnotherChildElement>
 *    </ChildElement>
 */

?>
xianrenb at gmail dot com 15-Jul-2012 10:54
If you want to save xhtml (in a string), you may try the following method:
<?php
    $doc = new DOMDocument('1.0');

    // ...

    $xhtml = (string) $doc->saveXML($doc->doctype);
    $xhtml .= "\n";
    $xhtml .= (string) $doc->saveXML($doc->documentElement);
?>
samstah at gmail dot com 19-Mar-2010 03:56
We discovered using DOMDocument::saveHTML() that it converts to HTML 4.01 compatible markup; rather than XHTML. The simple answer is to use saveXML() instead, although this adds the XML declaration to the top.

To qjerry.com at gmail.com, thanks for the pointer below - but I think that the simplest way seems to be using:
<?php $domDocument->saveXML($domDocument->documentElement); ?>

Of course, if you're dealing with XHTML, this will strip any <!DOCTYPE> declarations in the document too.
qjerry.com at gmail.com 04-May-2009 04:24
The simpliest (and probably the fastest) way to strip an XML declaration (<?xml version="1.0" ... ?>) out of output document, is to output child nodes of DOMDocument separately:

<?php

$document = new DOMDocument();
$document->load('/some/file.xml');

// this will also output doctype and comments at top level
foreach($document->childNodes as $node)
    $result .= $document->saveXML($node)."\n";

echo $result;

?>

This might be userful when dealing with browser compatibility issues, for example, well known problem with valid XHTML in IE6.
vikramvmalhotra at hotmail dot com 27-Jan-2009 03:49
if you are storing multi-byte characters in XML, then saving the XML using saveXML() will create problems. It will spit out the characters converted in encoded format.

<?php
$str = domdoc->saveXML(); // gives "&x#1245;" some encoded data
?>

Instead do the following

<?php
$str = domdoc->saveXML(domdoc->documentElement); // gives "??????" correct multi-byte data
?>
shinsh at shinmugen dot net 23-May-2008 07:57
Be careful, this function has been changed in 5.2.6 version. Adding a required parameter which is not that required wasn't the most intelligent idea ever, especially for a function which is often used.

To fix your programs if you have an error, fill the first parameter like this:

$dom->saveXML($dom->documentElement);

Why didn't the devs simply implement this as optional parameter, fixing the default parameter as documentElement?
Kriogen 26-Dec-2007 12:57
Create before test.xml with:
<?xml version="1.0" encoding="utf-8"?>
<Photos>
</Photos>

and past after in your php-file:

<?php
$simp = simplexml_load_file('test.xml');
$node = $simp->addChild('home');
$node->addChild('mychild', 'insert text');
$s = simplexml_import_dom($simp);
$s->saveXML('test.xml');
?>

This code creating a child-nod in the root.
Owner http://www.mensfashion.ru
JITR 02-Aug-2007 05:10
Comment to `devin at SPAMISBAD dot tritarget dot com''s post:

Thanks for pointing out the pitfalls of `formatOutput' vs. `load*()'. This has certainly saved me from some possible surprises.

I think the seemingly strange behaviour can be explained. Warning: The following stuff is mostly based on deductions and experiments. Much less on studying the sources and specs (I'm not sure some of these would provide answer anyway, at least not easily).

As you point out, `preserveWhiteSpace' must be set before loading the DOM from the source string (I'm working with `loadXML()' but I believe the situation should be the same with `load()' you used). This looks logical, as this property seems to control the parsing and DOM creation process during which text nodes containing the whitespace are either included or dropped. This can be proven by dumping the DOM structure and comparing the results based on the value of `preserveWhiteSpace'. With `preserveWhiteSpace' set to `FALSE', no text nodes containing whitespace will be present in the returned DOM. When this property is `TRUE', these nodes will be present.

Note: When speaking about the whitespace in the previous paragraph, we're most certainly speaking about so called `whitespace in element content' or `element content whitespace', if I'm not mistaken. See also my comment in the notes of `DOMText->isWhitespaceInElementContent()' method.

As for the mysterious effect on the output of `saveXLM()', I think the explanation lies in the presence or absence of the above mentioned whitespace text nodes. This was also proven by experiments: After adding such a node into a DOM which contained none (the DOM was created using `loadXML()' with `preserveWhiteSpace' set to `FALSE'), the output formatting got affected in a such a way, the formatting got lost for the rest of the document after the added node. I think the presence of whitespace text nodes forces such rendering, that the content of these nodes is used to separate adjoining nodes thus disabling default formatting. Only when there are no such text nodes present, the ouput formatting takes effect (provided the `formatOutput' is set to `TRUE', of course).

Well, the thing I don't really understand is how you did get an output of a signle line with `formatOutput' set to `TRUE'. This has happened to me when no whitespace text nodes were present (ie. when loading the XML with `preserveWhiteSpace' set to `FALSE') *and* with `formatOutput' set to *`FALSE'* (with the opposite value of `formatOutput', the formatting should do it's work and you should not end up with just one line). But I haven't seen your source. Perhaps you had whitespace nodes containing no new-lines in your DOM?

As for the CAUTION about root element, I didn't see any problems with empty root element neither in shortened nor full form. What did you have in mind, when you said it `WORKS' or `DOES NOT WORK'?
Sander 25-Apr-2007 05:35
Note that for large DOM trees (tens of thousands of elements nested at least a few levels deep), setting formatOutput to true drives up memory usage to rather insane levels when you call saveXML(). (Tested with PHP 5.2.1) Pretty output is not worth that cost.
nevyn at NOSPAM dot email dot PLEASE dot it 27-Dec-2006 01:41
A little function to get the full xml contents of a Xml node.

function innerXml($node)
{
    $out = $node->ownerDocument->saveXML($node);
    $re = "{^<(\\w*)(?:\\s*\\w+=(?:\"[^\"]*\"|\'[^\']*\'))*\\s*>(.*)</\\1>$}";
    preg_match($re, $out, $mat);
    return $mat[2];
}
devin at SPAMISBAD dot tritarget dot com 14-Aug-2006 10:52
It took some searching to figure this one out. I didn't see much in the way of explaining this glitch in the manual thus far. (For PHP5 I believe)

formatOutput = true; appears to fail when the origin of the DOM came from a file via load(). EX:

<?php
    $dom = new DOMDocument();
    $dom->load ("test.xml");
    $dom->formatOutput = true;

    $new_tag = $dom->createElement ('testNode');
    $new_tag->appendChild (
        $dom->createElement ('test', 'this is a test'));
    $dom->documentElement->appendChild ($new_tag);

    printf ("<pre>%s</pre>", htmlentities ($dom->saveXML()));
?>

Will not indent the output and will display the modified nodes all in one long line. Makes for editing a config.xml a bit difficult when saving to a file.

By adding the preserveWhiteSpace = false; BEFORE the load() the formatOutput works as expected. EX:

<?php
    $dom = new DOMDocument();
    $dom->preserveWhiteSpace = false;
    $dom->load ("test.xml");
    $dom->formatOutput = true;

    $new_tag = $dom->createElement ('testNode');
    $new_tag->appendChild (
        $dom->createElement ('test', 'this is a test'));
    $dom->documentElement->appendChild ($new_tag);

    printf ("<pre>%s</pre>", htmlentities ($dom->saveXML()));
?>

CAUTION: If your loaded xml file (test.xml) has an empty root node that is not shortened or has no children this will NOT work.

Example:

DOES NOT WORK:
<?xml version="1.0"?>
<root>
</root>

WORKS:
<?xml version="1.0"?>
<root/>

WORKS:
<?xml version="1.0"?>
<root>
  <!-- comment -->
</root>

WORKS:
<?xml version="1.0"?>
<root>
  <child/>
</root>
26-Mar-2006 04:20
I used the function posted by "joe" but the following works to me for get the innerXML
<?php
$itemLeido = $XMLRespuesta->getElementsByTagName("articulos");
foreach($itemLeido as $node) {
    echo($node->ownerDocument->saveXML($node));
}
?>
mswiercz at mwerk dot com 10-Sep-2004 03:43
Quick tip to minimize memory when generating documents with DOM.

Rather than using
   $xmlStr = DOMDocument->saveXML();
   echo $xmlStr;

to dump a large DOM to the output buffer, use a PHP output stream, as in

   DOMDocument->save('php://output');

A lot of memory will be saved when generating large DOMs.
padys at tlen dot pl 05-Aug-2004 07:36
When you save whole document:
DOMDocument->saveXML() produces string in encoding defined in property DOMDocument->encoding.

When you save only one node:
DOMDocument->saveXML(DOMNode) produces always string in UTF-8.


Valide un document selon un schéma. Seuls les schémas XML 1.0 sont supportés.

  • « DOMDocument::saveXML
  • DOMDocument::schemaValidateSource »
  • PHP Manual
  • DOMDocument
  • Valide un document selon un schéma. Seuls les schémas XML 1.0 sont supportés.

DOMDocument::schemaValidate

(PHP 5, PHP 7)

DOMDocument::schemaValidate — Valide un document selon un schéma. Seuls les schémas XML 1.0 sont supportés.

Description

public DOMDocument::schemaValidate ( string $filename , int $flags = 0 ) : bool

Valide un document selon un schéma contenu dans un fichier donné.

Liste de paramètres

filename

Le chemin vers le fichier contenant le schéma.

flags

Un masque de drapeaux de validation du schéma Libxml. Actuellement, la seule valeur supportée est LIBXML_SCHEMA_CREATE. Disponible depuis PHP 5.5.2 et Libxml 2.6.14.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
5.5.2 | Ajout du paramètre flags

Voir aussi

  • DOMDocument::schemaValidateSource() - Valide un document selon un schéma
  • DOMDocument::relaxNGValidate() - Effectue une validation relaxNG sur le document
  • DOMDocument::relaxNGValidateSource() - Effectue une validation relaxNG sur le document
  • DOMDocument::validate() - Valide un document en se basant sur sa DTD

User Contributed Notes

mmamsch at googlemail dot com 16-Sep-2015 10:01
A note for people trying to validate complex schemas with PHP.  It seems that libxml will not automatically try to import referenced schemas, but simply skip the validation if the schemas were not explicitly imported.

In our example we tried to validate an XML file against a schema with the namespace "xttp://automotive-his.de/200706/rif" that contains a reference to the namespace "xttp://automotive-his.de/200706/rif-xhtml":

  <xsd:complexType name="XHTML-CONTENT">
    <xsd:sequence>
      <xsd:any namespace="xttp://automotive-his.de/200706/rif-xhtml"/>
    </xsd:sequence>
  </xsd:complexType>

which basically says that an xhtml-content element can contain any element from the rif-xhtml namespace.

However since libxml does not know where to find the schema file, it will stop the validation if the elements from the referenced namespace, passing also document with invalid xhtml content as valid.

The solution was to create a combined schema, which contains import statements for all files matching the referenced schemas:

<xsd:schema xmlns:xs="xttp://www.w3.org/2001/XMLSchema">
<xs:import namespace="xttp://automotive-his.de/200706/rif-xhtml" schemaLocation="rif-xhtml.xsd"/>
<xs:import namespace="xttp://automotive-his.de/200706/rif" schemaLocation="rif.xsd"/>
<xs:import namespace="xttp://www.w3.org/XML/1998/namespace" schemaLocation="../xml.xsd"/>
</xsd:schema>

Note that the schemaLocation tells the validator, where to find the files for the corresponding namespaces. When validating the XML document against this combined schema, libxml validated correctly the content inside the XHTML-Content.

Hope this helps someone out there.
wkoehler at ce-gmbh dot com 11-Jan-2011 02:37
In older versions of PHP5 this function might cause error messages when dealing with namespaces. I had problems with PHP 5.2.14 which comes with libXML V2.6.16. After switching to PHP 5.3.5 with libXML V2.7.7 I no longer had problems. Took me only about 30 hrs to figure that one out.
NetPanther 27-Mar-2009 01:42
Initial situation:
- Debian Lenny
- Apache 2 with PHP 5.2.6
- libxml 2.6.32

Problem: While trying to validate a manually created (!) DOMDocument against an existing XML Schema, I ran into a warning like the one below. Validation fails, even though the document IS valid and the command line tool xmllint confirms this (even with libxml 2.6.32, so this must be a problem with DOM). The validation works fine with libxml 2.7.3.

Warning: DOMDocument::schemaValidate() [domdocument.schemavalidate]: Element 'YourRootElementName': No matching global declaration available for the validation root. in /var/www/YourFile.php on line X

Solution: As libxml 2.7.3 is not provided for Debian Lenny yet and this problem seems to be caused by DOM (s.o.), I currently use the following workaround on my machines. DOM obviously has some namespace problems with documents, that have been created manually (i.e. they were not loaded from a file).

So my workaround is saving the DOMDocument temporarily, re-loading it and then validating the temporary DOMDocument. Strangely enough the validation of the same document (= same content) now works. Sure, creating a temporary file is not a nice solution, but unless this bug is fixed, this workaround should do just fine.

<?php

// Works with libxml 2.7.3 and higher.
public function isValid()
{
  return $this->dom->schemaValidate('schema.xsd');
}

// Workaround for prior libxml versions, e.g. 2.6.32.
public function isValid()
{
  // Create temporary file and save manually created DOMDocument.
  $tempFile = time() . '-' . rand() . '-document.tmp';
  $this->dom->save($tempFile);

  // Create temporary DOMDocument and re-load content from file.
  $tempDom = new DOMDocument();
  $tempDom->load($tempFile);

  // Delete temporary file.
  if (is_file($tempFile))
  {
    unlink($tempFile);
  }

  // Validate temporary DOMDocument.
  return $tempDom->schemaValidate('schema.xsd');
}

?>
poletto at jeuxvideo dot com 13-Feb-2008 12:32
I had a tricky issue using this method, i thought it was bug but i realized i misundestood something about namespaces.
When you want to use a schema to describe an xml document, you basically put the default namespace to a personnal namespace (and you refer to this namespace in the targetNamespace attribute of your schema).

<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://my.uri.net">
  <elt>
    <x>blabla</x>
    <y>blabla</y>
  </elt>
</root>

That xmlns attribute specifies a "default namespace" and means that the root element and its children are in this namespace.
What i misunderstood is that, there's no way with the DOM api to specify a "default namespace" for each children of the root element.
Thus you may need to use createElementNS() and createAttributeNS() methods for each created element or attribute in the document specifying the URI of your namespace each time ("http://my.uri.net").

This only applies if you want to validate a document built with the API, not with a document loaded from an xml file or stream.
justin at redwiredesign dot com 08-Nov-2006 03:32
In his previous comment, Mike A wrote about validating documents using an XSD. However, you can validate without one. In my case, I needed to ensure that the content entered was just valid XML or not, and I couldn't find an XSD to support that. So I wrote this:

public static function validate($xml)
{
    libxml_use_internal_errors(true);

    $doc = new DOMDocument('1.0', 'utf-8');
    $doc->loadXML($xml);

    $errors = libxml_get_errors();
    if (empty($errors))
    {
        return true;
    }

    $error = $errors[0];
    if ($error->level < 3)
    {
        return true;
    }

    $lines = explode("\r", $xml);
    $line = $lines[($error->line)-1];

    $message = $error->message.' at line '.$error->line.':<br />'.htmlentities($line);

    return $message;
}

The catch here is that the function only checks for the first error is LIBXML_ERR_FATAL, which would break XSL/XML compilation.

In my experience, the errors are returned by libxml_get_errors in descending severity, so this may be an OK thing to do.
Mike A. 17-Feb-2006 12:03
For more detailed feedback from DOMDocument::schemaValidate, disable libxml errors and fetch error information yourself.  See http://php.net/manual/en/ref.libxml.php for more info.

example.xml
<?xml version="1.0"?>
<example>
    <child_string>This is an example.</child_string>
    <child_integer>Error condition.</child_integer>
</example>

example.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
    <xs:element name="example">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="child_string" type="xs:string"/>
                <xs:element name="child_integer" type="xs:integer"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

<?php

function libxml_display_error($error)
{
    $return = "<br/>\n";
    switch ($error->level) {
        case LIBXML_ERR_WARNING:
            $return .= "<b>Warning $error->code</b>: ";
            break;
        case LIBXML_ERR_ERROR:
            $return .= "<b>Error $error->code</b>: ";
            break;
        case LIBXML_ERR_FATAL:
            $return .= "<b>Fatal Error $error->code</b>: ";
            break;
    }
    $return .= trim($error->message);
    if ($error->file) {
        $return .=    " in <b>$error->file</b>";
    }
    $return .= " on line <b>$error->line</b>\n";

    return $return;
}

function libxml_display_errors() {
    $errors = libxml_get_errors();
    foreach ($errors as $error) {
        print libxml_display_error($error);
    }
    libxml_clear_errors();
}

// Enable user error handling
libxml_use_internal_errors(true);

$xml = new DOMDocument();
$xml->load('example.xml');

if (!$xml->schemaValidate('example.xsd')) {
    print '<b>DOMDocument::schemaValidate() Generated Errors!</b>';
    libxml_display_errors();
}

?>

Old error message:
Warning: DOMDocument::schemaValidate() [function.schemaValidate]: Element 'child_integer': 'Error condition.' is not a valid value of the atomic type 'xs:integer'. in example.php on line 40

New error message:
DOMDocument::schemaValidate() Generated Errors!
Error 1824: Element 'child_integer': 'Error condition.' is not a valid value of the atomic type 'xs:integer'. in example.xml on line 4


Valide un document selon un schéma

  • « DOMDocument::schemaValidate
  • DOMDocument::validate »
  • PHP Manual
  • DOMDocument
  • Valide un document selon un schéma

DOMDocument::schemaValidateSource

(PHP 5, PHP 7)

DOMDocument::schemaValidateSource — Valide un document selon un schéma

Description

public DOMDocument::schemaValidateSource ( string $source , int $flags = 0 ) : bool

Valide un document selon le schéma défini dans la chaîne donnée.

Liste de paramètres

source

Une chaîne contenant le schéma.

flags

Un masque de drapeau de validation de schéma Libxml. Actuellement, la seule valeur supportée est LIBXML_SCHEMA_CREATE. Disponible depuis PHP 5.5.2 et Libxml 2.6.14.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
5.5.2 | Ajout du paramètre flags

Voir aussi

  • DOMDocument::schemaValidate() - Valide un document selon un schéma. Seuls les schémas XML 1.0 sont supportés.
  • DOMDocument::relaxNGValidate() - Effectue une validation relaxNG sur le document
  • DOMDocument::relaxNGValidateSource() - Effectue une validation relaxNG sur le document
  • DOMDocument::validate() - Valide un document en se basant sur sa DTD

User Contributed Notes

There are no user contributed notes for this page.


Valide un document en se basant sur sa DTD

  • « DOMDocument::schemaValidateSource
  • DOMDocument::xinclude »
  • PHP Manual
  • DOMDocument
  • Valide un document en se basant sur sa DTD

DOMDocument::validate

(PHP 5, PHP 7)

DOMDocument::validate — Valide un document en se basant sur sa DTD

Description

public DOMDocument::validate ( ) : bool

Valide un document en se basant sur sa DTD.

Vous pouvez utiliser la propriété validateOnParse de la classe DOMDocument pour effectuer une validation DTD.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient. Si le document n'a aucune DTD d'attachée, cette méthode retournera false.

Exemples

Exemple #1 Exemple de validation DTD

<?php
$dom = new DOMDocument;
$dom->load('book.xml');
if ($dom->validate()) {
    echo "Ce document est valide !\n";
}
?>

Vous pouvez également valider votre fichier XML en le chargeant :

<?php
$dom = new DOMDocument;
$dom->validateOnParse = true;
$dom->load('book.xml');
?>

Voir aussi

  • DOMDocument::schemaValidate() - Valide un document selon un schéma. Seuls les schémas XML 1.0 sont supportés.
  • DOMDocument::schemaValidateSource() - Valide un document selon un schéma
  • DOMDocument::relaxNGValidate() - Effectue une validation relaxNG sur le document
  • DOMDocument::relaxNGValidateSource() - Effectue une validation relaxNG sur le document

User Contributed Notes

cabral dot brc at gmail dot com 08-Sep-2010 12:46
I was trying to validate my SVG file just to get the IDs with getElementById(),

<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<text id="text_titulo" x="150" y="20" font-family="Arial" font-size="15px" style="font-weight:bold;">Title</text>
<text id="text_subtitulo" x="200" y="35" font-family="Arial" font-size="10px">Sub Title</text>
<g transform="translate(0,50) scale(0.1)">
  <a id="a_AC" ...... >
    <polygon id="polygon_AC" ....... />
  </a>
</g>
</svg>

but when calling $dom->load(), it was getting the errors "failed to open stream" and "Validation failed: no DTD found !I/O warning : failed to load external entity"
so I created my own validation wrapper (I just want to find the IDs with getElementById() )

<?php
  $docSVG = new DOMDocument();
  $docSVG->load(realpath($filepath));
  setAllId($docSVG);

function setAllId($DOMNode){
  if($DOMNode->hasChildNodes()){
    foreach ($DOMNode->childNodes as $DOMElement) {
      if($DOMElement->hasAttributes()){
        $id=$DOMElement->getAttribute("id");
        if($id){
          $DOMElement->setIdAttribute("id",$id);
        }
      }
      setAllId($DOMElement);
    }
  }
}
?>
a dot schaffhirt at sedna-soft dot de 17-Sep-2008 02:22
When validating documents with this method there are two issues I don't like about it. First, it creates a bunch of warnings, which one would not expect, as the plot of calling this method is preventing any warnings that could occur when erroneously relying on the document's validity. Second, it only returns a boolean with no chance of getting additional details about the reasons for rendering invalid.

That's the reason for me to use a little wrapper, which I post here in case anyone finds it useful.

Please note that it only works with PHP5 or later.

<?php
    class MyDOMDocument {
        private $_delegate;
        private $_validationErrors;

        public function __construct (DOMDocument $pDocument) {
            $this->_delegate = $pDocument;
            $this->_validationErrors = array();
        }

        public function __call ($pMethodName, $pArgs) {
            if ($pMethodName == "validate") {
                $eh = set_error_handler(array($this, "onValidateError"));
                $rv = $this->_delegate->validate();
                if ($eh) {
                    set_error_handler($eh);
                }
                return $rv;
            }
            else {
                return call_user_func_array(array($this->_delegate, $pMethodName), $pArgs);
            }
        }
        public function __get ($pMemberName) {
            if ($pMemberName == "errors") {
                return $this->_validationErrors;
            }
            else {
                return $this->_delegate->$pMemberName;
            }
        }
        public function __set ($pMemberName, $pValue) {
            $this->_delegate->$pMemberName = $pValue;
        }
        public function onValidateError ($pNo, $pString, $pFile = null, $pLine = null, $pContext = null) {
            $this->_validationErrors[] = preg_replace("/^.+: */", "", $pString);
        }
    }
?>

<?php
    // $doc is a DOMDocument object
    $myDoc = new MyDOMDocument($doc); // copy constructor

    // do anything with $myDoc that you would with $doc

    $isValid = $myDoc->validate(); // won't create warnings
    if (!$isValid) {
        print_r($myDoc->errors); // the array all warnings are collected in
    }
?>

Maybe you need to change the the part
preg_replace("/^.+: */", "", $pString)
to something different depending on your system's error reporting settings (HTML or plain text), whatsoever

Best Regards,

Anja
darren at viamedia dot co dot za 05-Aug-2008 07:19
If you are loading xml with the intention of validating it against an internal dtd and you have experienced issues with the validation it could be related to missing LIBXML constants.

I found this post by "aidan at php dot net" in root level dom docs and thought it might be more useful here:
As of PHP 5.1, libxml options may be set using constants rather than the use of proprietary DomDocument properties.

DomDocument->resolveExternals is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDATTR

DomDocument->validateOnParse is equivilant to setting
LIBXML_DTDLOAD
LIBXML_DTDVALID

PHP 5.1 users are encouraged to use the new constants.

Example:
<?php
$dom = new DOMDocument;
// Resolve externals
$dom->load($file, LIBXML_DTDLOAD|LIBXML_DTDATTR);
// OR
// Validate against DTD
$dom->load($file, LIBXML_DTDLOAD|LIBXML_DTDVALID);
$dom->validate();
?>


Remplace les XIncludes dans un objet DOMDocument

  • « DOMDocument::validate
  • DOMDocumentFragment »
  • PHP Manual
  • DOMDocument
  • Remplace les XIncludes dans un objet DOMDocument

DOMDocument::xinclude

(PHP 5, PHP 7)

DOMDocument::xinclude — Remplace les XIncludes dans un objet DOMDocument

Description

public DOMDocument::xinclude ( int $options = 0 ) : int|false

Cette méthode remplace les » XIncludes dans un objet DOMDocument.

Note:

Vu que la bibliothèque libxml2 résout automatiquement les entités, cette méthode peut produire des résultats non attendus si le fichier XML inclus a une DTD d'attachée.

Liste de paramètres

options

paramètres Libxml. Disponible depuis PHP 5.1.0 et Libxml 2.6.7.

Valeurs de retour

Retourne le nombre de XIncludes du document, -1 si une erreur survient lors du processus, ou false s'il n'y a aucune substitution.

Exemples

Exemple #1 Exemple avec DOMDocument::xinclude()

<?php

$xml = <<<EOD
<?xml version="1.0" ?>
<chapter xmlns:xi="http://www.w3.org/2001/XInclude">
 <title>Les livres d'une autre personne</title>
 <para>
  <xi:include href="book.xml">
   <xi:fallback>
    <error>xinclude: book.xml n'a pas été trouvé</error>
   </xi:fallback>
  </xi:include>
 </para>
</chapter>
EOD;

$dom = new DOMDocument;

// Nous voulons un joli affichage
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

// chargement de la chaîne XML définie ci-dessus
$dom->loadXML($xml);

// remplacement des xincludes
$dom->xinclude();

echo $dom->saveXML();

?>

Résultat de l'exemple ci-dessus est similaire à :

<?xml version="1.0"?>
<chapter xmlns:xi="http://www.w3.org/2001/XInclude">
  <title>Les livres d'une autre personne</title>
  <para>
    <row xml:base="/home/didou/book.xml">
       <entry>The Grapes of Wrath</entry>
       <entry>John Steinbeck</entry>
       <entry>en</entry>
       <entry>0140186409</entry>
      </row>
    <row xml:base="/home/didou/book.xml">
       <entry>The Pearl</entry>
       <entry>John Steinbeck</entry>
       <entry>en</entry>
       <entry>014017737X</entry>
      </row>
    <row xml:base="/home/didou/book.xml">
       <entry>Samarcande</entry>
       <entry>Amine Maalouf</entry>
       <entry>fr</entry>
       <entry>2253051209</entry>
      </row>
  </para>
</chapter>

User Contributed Notes

nicolas_rainardNOSPAM at yahoo dot fr 12-Jul-2007 04:56
If you use the loadXML() method instead of the load() one (let's say, to process the XML string before loading and parsing it), you will have problems with xinclude(), because the parser will not know where to find the files to include.
Using chdir() before xinclude() will not help.

The solution is to set the documentURI property of the DOMDocument object accordingly to it's original filename, and everything will work fine !

<?php

$xml = file_get_contents($file);
$xml = do_something_with($xml);

$doc = new DOMDocument;
$doc->documentURI = $file;
$doc->loadXML($xml);
$doc->xinclude();

?>


La classe DOMDocumentFragment

(PHP 5, PHP 7)

Synopsis de la classe

DOMDocumentFragment étend DOMNode {
/* Propriétés */
/* Propriétés héritées */
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes */
public appendXML ( string $data ) : bool
/* Méthodes héritées */
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Sommaire

  • DOMDocumentFragment::appendXML — Ajoute des données XML

User Contributed Notes

peter at softcoded dot com 03-May-2017 03:31
DOMDocumentFragment makes it easy to add (or replace)
nodes. Individually creating nodes using DOM methods can
be tedious. Instead, do something like this:

/**
* Create fragment of colgroup
* @param DOMDocument $doc The DOMDocument
* @return DOMDocumentFragment
*/
function makeFragment($d){
  $chunk = <<<HTML
  <colgroup>
    <col class="c1"/>
    <col class="c2"/>
    <col class="c3"/>
    <col class="c4"/>
  </colgroup>
HTML;
  $fragment = $d->createDocumentFragment();
  $fragment->appendXML($chunk);
  return $fragment;
}
Ricki 29-Mar-2011 06:00
DOMDocumentFragment only appears useful if created from a parent DOMDocument eg.

1. $dom = new DOMDocument("1.0","UTF-8");
2. $docFrag = $dom->createDocumentFragment();
3. Now append items to $docFrag
4. Graft $docFrag contents back onto $dom at the desired location

Conversely taking this approach:
1. $dom = new DOMDocument("1.0","UTF-8");
2. $docFrag = new DOMDocumentFragment();
3. Now append items to $docFrag

...will fail on step 3 with a "read only" error as $docFrag is not created as a child of  DOMDocument.

I'm not sure of the reason for this: on the web people have cited security, and others have cited poor design however whatever the reason, it is really limiting when wanting to encapsulating generic independent DocumentFragments into classes for easy grafting to the desired tree. The only workarounds i have seen look expensive from a performance perspective and cumbersome from a coding perspective ie. create a  dummy $dom for temporary use.

(This is valid as of PHP 5.3) I've put this here as i've wasted a lot of time finding it out - I hope this saves others some heartache.

Using new DOMDocumentFramt
matthijs at stdin dot nl 29-Mar-2011 03:06
Note that DOMDocumentFragment is a bit special when it's added to another node. When that happens, not the fragment itself is added as a child, but all of the children of the fragment are moved over to the new parent node.

For example, consider this script:

<?php

/* Create a document and a fragment containing a single node */
$doc = new DOMDocument();
$fragment = $doc->createDocumentFragment();
$fragment->appendChild($doc->createElement('foo'));

/* Now, the foo node is a child of the fragment */
var_dump($fragment->firstChild);

/* After appending the fragment to another node, the children of the
 * fragment will have been transfered to that node (and the fragment is
 * not present in the children list!) */
$doc->appendChild($fragment);
/* So the fragment has no children anymore */
var_dump($fragment->firstChild);
/* But $doc has a single child, which is the foo element, not the
 * fragment */
var_dump($doc->childNodes->length);
var_dump($doc->firstChild);

?>

This produces the following output:

object(DOMElement)#3 (0) {
}
NULL
int(1)
object(DOMElement)#3 (0) {
}


Ajoute des données XML

  • « DOMDocumentFragment
  • DOMDocumentType »
  • PHP Manual
  • DOMDocumentFragment
  • Ajoute des données XML

DOMDocumentFragment::appendXML

(PHP 5 >= 5.1.0, PHP 7)

DOMDocumentFragment::appendXML — Ajoute des données XML

Description

public DOMDocumentFragment::appendXML ( string $data ) : bool

Ajoute des données XML brutes à un DOMDocumentFragment.

Cette méthode ne fait pas partie du standard DOM. Elle a été créée pour simplifier l'ajout d'un fragment XML dans un DOMDocument.

Si vous voulez respecter les standards, vous devez créer un DOMDocument temporaire avec une racine et parcourir les noeuds enfants de vos données XML pour les ajouter.

Liste de paramètres

data

XML à ajouter.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Ajout de données XML à votre document

<?php
$doc = new DOMDocument();
$doc->loadXML("<root/>");
$f = $doc->createDocumentFragment();
$f->appendXML("<foo>text</foo><bar>text2</bar>");
$doc->documentElement->appendChild($f);
echo $doc->saveXML();
?>

L'exemple ci-dessus va afficher :

<?xml version="1.0"?>
<root><foo>text</foo><bar>text2</bar></root>

User Contributed Notes

lpetrov(AT)axisvista.com 20-Jul-2007 05:45
Here is (maybe) a better example:
/**
* Helper function for replacing $node (DOMNode)
* with an XML code (string)
*
* @var DOMNode $node
* @var string $xml
*/
public function replaceNodeXML(&$node,$xml) {
 $f = $this->dom->createDocumentFragment();
 $f->appendXML($xml);
 $node->parentNode->replaceChild($f,$node);
}

Copied from the "PHP5 Dom Based Template" article at:
http://blog.axisvista.com/?p=35


La classe DOMDocumentType

(PHP 5, PHP 7)

Introduction

Chaque DOMDocument a un attribut doctype dont la valeur est soit null, soit un objet DOMDocumentType.

Synopsis de la classe

DOMDocumentType extends DOMNode {
/* Propriétés */
public readonly string $publicId ;
public readonly string $systemId ;
public readonly string $name ;
public readonly DOMNamedNodeMap $entities ;
public readonly DOMNamedNodeMap $notations ;
public readonly string $internalSubset ;
/* Propriétés héritées */
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes héritées */
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Propriétés

publicId

L'identifiant public du subset externe.

systemId

L'identifiant système du subset externe. Ce peut être une URL absolue ou non.

name

Le nom de la DTD ; i.e., le nom suivant immédiatement le mot clé DOCTYPE.

entities

Un DOMNamedNodeMap contenant l'entité général, à la fois externe et interne, déclaré dans la DTD.

notations

Un DOMNamedNodeMap contenant les notations, déclarées dans la DTD.

internalSubset

Le subset interne, sous la forme d'une chaîne de caractères, ou null s'il n'y en a pas. Cette chaîne ne contient pas les crochets délimiteurs.

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMElement

(PHP 5, PHP 7)

Synopsis de la classe

DOMElement extends DOMNode {
/* Propriétés */
public readonly bool $schemaTypeInfo ;
public readonly string $tagName ;
/* Propriétés héritées */
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes */
public __construct ( string $qualifiedName , string|null $value = null , string $namespace = "" )
public getAttribute ( string $qualifiedName ) : string
public getAttributeNode ( string $qualifiedName ) : DOMAttr|DOMNamespaceNode|false
public getAttributeNodeNS ( string|null $namespace , string $localName ) : DOMAttr|DOMNamespaceNode|null
public getAttributeNS ( string|null $namespace , string $localName ) : string
public getElementsByTagName ( string $qualifiedName ) : DOMNodeList
public getElementsByTagNameNS ( string $namespace , string $localName ) : DOMNodeList
public hasAttribute ( string $qualifiedName ) : bool
public hasAttributeNS ( string|null $namespace , string $localName ) : bool
public removeAttribute ( string $qualifiedName ) : bool
public removeAttributeNode ( DOMAttr $attr ) : DOMAttr|false
public removeAttributeNS ( string|null $namespace , string $localName ) : void
public setAttribute ( string $qualifiedName , string $value ) : DOMAttr|bool
public setAttributeNode ( DOMAttr $attr ) : DOMAttr|null|false
public setAttributeNodeNS ( DOMAttr $attr ) : DOMAttr|null|false
public setAttributeNS ( string|null $namespace , string $qualifiedName , string $value ) : void
public setIdAttribute ( string $qualifiedName , bool $isId ) : void
public setIdAttributeNode ( DOMAttr $attr , bool $isId ) : void
public setIdAttributeNS ( string $namespace , string $qualifiedName , bool $isId ) : void
/* Méthodes héritées */
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Propriétés

schemaTypeInfo

Non implémenté, retourne toujours null

tagName

Le nom de l'élément

Notes

Note:

L'extension DOM utilise l'encodage UTF-8. Utilisez utf8_encode() et utf8_decode() pour travailler avec des textes dans l'encodage ISO-8859-1 ou iconv pour d'autre encodages.

Sommaire

  • DOMElement::__construct — Crée un nouvel objet DOMElement
  • DOMElement::getAttribute — Retourne la valeur d'un attribut
  • DOMElement::getAttributeNode — Retourne le nœud d'attribut
  • DOMElement::getAttributeNodeNS — Retourne le nœud d'attribut
  • DOMElement::getAttributeNS — Retourne la valeur de l'attribut
  • DOMElement::getElementsByTagName — Retourne les éléments par leur nom de balise
  • DOMElement::getElementsByTagNameNS — Récupère les éléments par leur espace de noms et leur localName
  • DOMElement::hasAttribute — Vérifie si un attribut existe
  • DOMElement::hasAttributeNS — Vérifie si un attribut existe
  • DOMElement::removeAttribute — Efface un attribut
  • DOMElement::removeAttributeNode — Efface un attribut
  • DOMElement::removeAttributeNS — Efface un attribut
  • DOMElement::setAttribute — Ajoute un nouvel attribut
  • DOMElement::setAttributeNode — Ajoute un nouvel attribut à l'élément
  • DOMElement::setAttributeNodeNS — Ajoute un nouvel attribut à l'élément
  • DOMElement::setAttributeNS — Ajoute un nouvel attribut
  • DOMElement::setIdAttribute — Déclare l'attribut spécifié par son nom à être de type ID
  • DOMElement::setIdAttributeNode — Déclare l'attribut spécifié par le nœud à être de type ID
  • DOMElement::setIdAttributeNS — Déclare l'attribut spécifié par son nom local et son espace de nom URI à être de type ID

User Contributed Notes

johnny 03-Mar-2014 03:48
Get html of a node
 $html .= $dom->saveHTML($node);
Janne Enberg 07-Nov-2013 11:02
This page doesn't list the inherited properties from DOMNode, e.g. the quite important textContent property. It would be immensely helpful if it would list those as well.
felix dot klee at inka dot de 26-Feb-2013 03:23
How to rename an element and preserve attributes:

<?php

// Changes the name of element $element to $newName.
function renameElement($element, $newName) {
  $newElement = $element->ownerDocument->createElement($newName);
  $parentElement = $element->parentNode;
  $parentElement->insertBefore($newElement, $element);

  $childNodes = $element->childNodes;
  while ($childNodes->length > 0) {
    $newElement->appendChild($childNodes->item(0));
  }

  $attributes = $element->attributes;
  while ($attributes->length > 0) {
    $attribute = $attributes->item(0);
    if (!is_null($attribute->namespaceURI)) {
      $newElement->setAttributeNS('http://www.w3.org/2000/xmlns/',
                                  'xmlns:'.$attribute->prefix,
                                  $attribute->namespaceURI);
    }
    $newElement->setAttributeNode($attribute);
  }

  $parentElement->removeChild($element);
}

function prettyPrint($d) {
  $d->formatOutput = true;
  echo '<pre>'.htmlspecialchars($d->saveXML()).'</pre>';
}

$d = new DOMDocument( '1.0' );
$d->loadXML('<?xml version="1.0"?>
<library>
  <data a:foo="1" x="bar" xmlns:a="http://example.com/a">
    <invite>
      <username>jmansa</username>
      <userid>1</userid>
    </invite>
    <update>1</update>
  </data>
</library>');

$xpath = new DOMXPath($d);
$elements = $xpath->query('/library/data');
if ($elements->length == 1) {
  $element = $elements->item(0);
  renameElement($element, 'invites');
}

prettyPrint($d);

?>
loopduplicate at burningtoken dot com 22-Apr-2011 02:34
This works perfect for me as well:

<?php $xml = $domElement->ownerDocument->saveXML($domElement); ?>
Anonymous 24-Dec-2010 08:22
you can use DOMNode::nodeValue
DOMElement inherits this public property.

$elem->nodeValue
dpetroff ( at ) gmail.com 04-Dec-2010 11:24
Hi!

Combining all th comments, the easiest way to get inner HTML of the node is to use this function:

<?php
function get_inner_html( $node ) {
    $innerHTML= '';
    $children = $node->childNodes;
    foreach ($children as $child) {
        $innerHTML .= $child->ownerDocument->saveXML( $child );
    }

    return $innerHTML;
}
?>
nawaman at gmail dot com 03-Sep-2009 08:08
The following code shows can text-only content be extracted from a document.

<?php
function getTextFromNode($Node, $Text = "") {
    if ($Node->tagName == null)
        return $Text.$Node->textContent;

    $Node = $Node->firstChild;
    if ($Node != null)
        $Text = getTextFromNode($Node, $Text);

    while($Node->nextSibling != null) {
        $Text = getTextFromNode($Node->nextSibling, $Text);
        $Node = $Node->nextSibling;
    }
    return $Text;
}

function getTextFromDocument($DOMDoc) {
    return getTextFromNode($DOMDoc->documentElement);
}

$Doc = new DOMDocument();
$Doc->loadHTMLFile("Test.html");
echo getTextFromDocument($Doc)."\n";
?>
Daniel Morlock 07-May-2009 09:22
It would be nice to have a function which converts a document/node/element into a string.

Anyways, I use the following code snippet to get the innerHTML value of a DOMNode:

<?php
function getInnerHTML($Node)
{
     $Body = $Node->ownerDocument->documentElement->firstChild->firstChild;
     $Document = new DOMDocument();
     $Document->appendChild($Document->importNode($Body,true));
     return $Document->saveHTML();
}
?>
patrick smith 04-Nov-2008 08:14
Although it may be preferable to use the dom to manipulate elements, sometimes it's useful to actually get the innerHTML from a document element (e.g. to load into a client-side editor).

To get the innerHTML of a specific element ($elem_id) in a specific html file ($filepath):

<?php
$innerHTML = '';
$doc = new DOMDocument();
$doc->loadHTMLFile($filepath);
$elem = $doc->getElementById($elem_id);

// loop through all childNodes, getting html
$children = $elem->childNodes;
foreach ($children as $child) {
    $tmp_doc = new DOMDocument();
    $tmp_doc->appendChild($tmp_doc->importNode($child,true));
    $innerHTML .= $tmp_doc->saveHTML();
}
?>
Pinochet 25-Oct-2008 05:33
Hi to get the value of DOMElement just get the nodeValue public parameter (it is inherited from DOMNode):
<?php
echo $domElement->nodeValue;
?>
Everything is obvious if you now about this thing ;-)
j DOT wagner ( AT ) medieninnovation.com 08-Oct-2008 09:11
Caveat!
It took me almost an hour to figure this out, so I hope it saves at least one of you some time.

If you want to debug your DOM tree and try var_dump() or similar you will be fooled into thinking the DOMElement that you are looking at is empty, because var_dump() says: object(DOMElement)#1 (0) { }

After much debugging I found out that all DOM objects are invisible to var_dump() and print_r(), my guess is because they are C objects and not PHP objects. So I tried saveXML(), which works fine on DOMDocument, but is not implemented on DOMElement.

The solution is simple (if you know it):
$xml = $domElement->ownerDocument->saveXML($domElement);

This will give you an XML representation of $domElement.
Severin 14-Sep-2008 06:18
I wanted to find similar Elements - thats why I built an Xpath-String like this - maybe somebody needs it... its not very pretty - but neither is domdocument :)

<?php

$dom->load($xmlFile))

$xpathQuery = '//*';
$xmlNodes = $xpath->query($xpathQuery);

$pathlist = array();
$attrlist = array();
foreach ($xmlNodes as $node) {

  $depth = $this->_getDomDepth($node);   //get Path-Depth (for array key)
  $pathlist[$depth] = $node->tagName;     // tagname

  $attrs = $node->attributes;
  $attr='';
  $a=0;
  foreach ($attrs as $attrName => $attrNode)  // attributes
            {
              if ($attrName !='reg')
              {
                if ($a++!=0) $attr .= ' and ';
                $attr .= '@'.$attrName.'='."'".$attrNode->value."'";
              }
            }

          $attrlist[$depth] = $attr?'['.$attr.']':'';

          $path = ''; for ($i=0;$i<=$depth;$i++) $path .= '/'.$pathlist[$i].$attrlist[$i];  // the xpath of the actual Element

    // ... now you can go on and user $path to find similar elements
    }
  }
}

 private function _getDomDepth(DomNode $node)
   {
     $r = -2;
     while ($node) {
       $r++;
       $node = $node->parentNode;
     }
     return  $r;
   }
?>
ae.fxx 18-Jul-2008 01:49
Hi there.

Remember to append a DOMNode (or any of its descendants) to a DOMDocument __BEFORE__ you try to append a child to it.

I don't know why it has to be this way but it can't be done without it.

bye


Crée un nouvel objet DOMElement

  • « DOMElement
  • DOMElement::getAttribute »
  • PHP Manual
  • DOMElement
  • Crée un nouvel objet DOMElement

DOMElement::__construct

(PHP 5, PHP 7)

DOMElement::__construct — Crée un nouvel objet DOMElement

Description

public DOMElement::__construct ( string $qualifiedName , string|null $value = null , string $namespace = "" )

Crée un nouvel objet DOMElement. Cet objet est en lecture seule. Il peut être ajouté à un document, mais les nœuds additionnels ne peuvent pas être ajoutés à ce nœud tant qu'il est associé à un document. Pour créer un nœud accessible en écriture, utilisez DOMDocument::createElement ou DOMDocument::createElementNS.

Liste de paramètres

qualifiedName

Le nom de l'élément. Lorsqu'il est passé dans l'URI de l'espace de nom, le nom de l'élément doit comporter un préfixe pour être associé à l'URI.

value

La valeur de l'élément.

namespace

Un espace de nom de l'URI pour créer l'élément dans un espace de nom spécifique.

Exemples

Exemple #1 Création d'un nouveau DOMElement

<?php

$dom = new DOMDocument('1.0', 'iso-8859-1');
$element = $dom->appendChild(new DOMElement('root'));
$element_ns = new DOMElement('pr:node1', 'thisvalue', 'http://xyz');
$element->appendChild($element_ns);
echo $dom->saveXML(); /* <?xml version="1.0" encoding="iso-8859-1"?>
<root><pr:node1 xmlns:pr="http://xyz">thisvalue</pr:node1></root> */

?>

Voir aussi

  • DOMDocument::createElement() - Crée un nouveau nœud
  • DOMDocument::createElementNS() - Crée un nouveau nœud avec un espace de noms associé

User Contributed Notes

Fabian dot Blech at gmx dot de 22-Jul-2010 08:30
Remember, Dom-Nodes mustn't start with a number:

allowed:
<t12345t4>Value</t12345t4>

Not allowed:
<12345t4>VALUE</12345t4>
troelskn at gmail dot com 03-Jun-2008 07:46
Note that this function is buggy. You have to manually escape the $value argument with htmlspecialchars.
See: http://bugs.php.net/bug.php?id=31191
adar at darkpoetry dot de 07-May-2007 01:27
If you like to view an element simply do:

<?php
echo htmlentities($element->C14N());
?>

Undocumented but found ;)


Retourne la valeur d'un attribut

  • « DOMElement::__construct
  • DOMElement::getAttributeNode »
  • PHP Manual
  • DOMElement
  • Retourne la valeur d'un attribut

DOMElement::getAttribute

(PHP 5, PHP 7)

DOMElement::getAttribute — Retourne la valeur d'un attribut

Description

public DOMElement::getAttribute ( string $qualifiedName ) : string

Récupère la valeur d'un attribut avec le nom qualifiedName pour le nœud courant.

Liste de paramètres

qualifiedName

Le nom de l'attribut.

Valeurs de retour

La valeur de l'attribut ou une chaîne vide si aucun attribut avec le nom qualifiedName donné n'est trouvé.

Voir aussi

  • DOMElement::hasAttribute() - Vérifie si un attribut existe
  • DOMElement::setAttribute() - Ajoute un nouvel attribut
  • DOMElement::removeAttribute() - Efface un attribut

User Contributed Notes

mpalmer at cybersource dot com 09-Nov-2007 03:32
- - - - - - - - - - - - - -

XML Data:
<data>
<Report ID="1">
    <Date>REVIEW</Date>
    <AuthorID>1</AuthorID>
</Report>
<Report ID="2">
    <Date>REVIEW</Date>
    <AuthorID>2</AuthorID>
</Report>
</data>

- - - - - - - - - - - - - -

<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load( 'data.xml' );

$searchNode = $xmlDoc->getElementsByTagName( "Report" );

foreach( $searchNode as $searchNode )
{
    $valueID = $searchNode->getAttribute('ID');

    $xmlDate = $searchNode->getElementsByTagName( "Date" );
    $valueDate = $xmlDate->item(0)->nodeValue;

    $xmlAuthorID = $searchNode->getElementsByTagName( "AuthorID" );
    $valueAuthorID = $xmlAuthorID->item(0)->nodeValue;

    echo "$valueID - $valueDate - $valueAuthorID\n";
}
?>

- - - - - - - - - - - - - -

Output:

1 - REVIEW - 1
2 - REVIEW - 2

- - - - - - - - - - - - - -


Retourne le nœud d'attribut

  • « DOMElement::getAttribute
  • DOMElement::getAttributeNodeNS »
  • PHP Manual
  • DOMElement
  • Retourne le nœud d'attribut

DOMElement::getAttributeNode

(PHP 5, PHP 7)

DOMElement::getAttributeNode — Retourne le nœud d'attribut

Description

public DOMElement::getAttributeNode ( string $qualifiedName ) : DOMAttr|DOMNamespaceNode|false

Retourne le nœud d'attribut avec le nom qualifiedName pour l'élément courant.

Liste de paramètres

qualifiedName

Le nom de l'attribut.

Valeurs de retour

Le nœud d'attribut. Notez que pour la déclaration de namespace XML (les attributs xmlns et xmlns:*) une instance de DOMNameSpaceNode est retourné au lieu de DOMAttr.

Voir aussi

  • DOMElement::hasAttribute() - Vérifie si un attribut existe
  • DOMElement::setAttributeNode() - Ajoute un nouvel attribut à l'élément
  • DOMElement::removeAttributeNode() - Efface un attribut

User Contributed Notes

lowezar at gmail dot com 28-Feb-2011 08:22
It may also return DOMNameSpaceNode if you`re requesting 'xmlns:_prefix_'. So you`re unable to remove it with removeAttributeNode() which requires DOMAttr as parameter.
Alex 18-Feb-2009 08:33
Just trying to add some clarification: this function will return boolean "false" when there is not a $name attribute :)

Cheers, Alex


Retourne le nœud d'attribut

  • « DOMElement::getAttributeNode
  • DOMElement::getAttributeNS »
  • PHP Manual
  • DOMElement
  • Retourne le nœud d'attribut

DOMElement::getAttributeNodeNS

(PHP 5, PHP 7)

DOMElement::getAttributeNodeNS — Retourne le nœud d'attribut

Description

public DOMElement::getAttributeNodeNS ( string|null $namespace , string $localName ) : DOMAttr|DOMNamespaceNode|null

Retourne le nœud d'attribut dans l'espace de noms namespace avec le nom local localName pour le nœud courant.

Liste de paramètres

namespace

L'URI de l'espace de noms.

localName

Le nom local.

Valeurs de retour

Le nœud d'attribut. Notez que pour la déclaration de namespace XML (les attributs xmlns et xmlns:*) une instance de DOMNameSpaceNode est retourné au lieu d'un objet DOMAttr.

Voir aussi

  • DOMElement::hasAttributeNS() - Vérifie si un attribut existe
  • DOMElement::setAttributeNodeNS() - Ajoute un nouvel attribut à l'élément
  • DOMElement::removeAttributeNode() - Efface un attribut

User Contributed Notes

There are no user contributed notes for this page.


Retourne la valeur de l'attribut

  • « DOMElement::getAttributeNodeNS
  • DOMElement::getElementsByTagName »
  • PHP Manual
  • DOMElement
  • Retourne la valeur de l'attribut

DOMElement::getAttributeNS

(PHP 5, PHP 7)

DOMElement::getAttributeNS — Retourne la valeur de l'attribut

Description

public DOMElement::getAttributeNS ( string|null $namespace , string $localName ) : string

Récupère la valeur de l'attribut dans l'espace de noms namespace avec le nom local localName pour le nœud courant.

Liste de paramètres

namespace

L'URI de l'espace de noms.

localName

Le nom local.

Valeurs de retour

La valeur de l'attribut, ou une chaîne vide si aucun attribut avec le nom local localName donné et dans l'espace de noms namespace n'est trouvé.

Voir aussi

  • DOMElement::hasAttributeNS() - Vérifie si un attribut existe
  • DOMElement::setAttributeNS() - Ajoute un nouvel attribut
  • DOMElement::removeAttributeNS() - Efface un attribut

User Contributed Notes

There are no user contributed notes for this page.


Retourne les éléments par leur nom de balise

  • « DOMElement::getAttributeNS
  • DOMElement::getElementsByTagNameNS »
  • PHP Manual
  • DOMElement
  • Retourne les éléments par leur nom de balise

DOMElement::getElementsByTagName

(PHP 5, PHP 7)

DOMElement::getElementsByTagName — Retourne les éléments par leur nom de balise

Description

public DOMElement::getElementsByTagName ( string $qualifiedName ) : DOMNodeList

Cette fonction retourne une nouvelle instance de la classe DOMNodeList contenant tous les éléments descendants avec un nom de balise qualifiedName donné, dans l'ordre dans lequel ils sont rencontrés lors du parcours de l'arbre de cet élément.

Liste de paramètres

qualifiedName

Le nom de la balise. Utilisez le caractère générique * pour récupérer tous les éléments contenus dans l'arbre de l'élément.

Valeurs de retour

Cette fonction retourne une nouvelle instance de la classe DOMNodeList contenant tous les éléments correspondants.

Voir aussi

  • DOMElement::getElementsByTagNameNS() - Récupère les éléments par leur espace de noms et leur localName

User Contributed Notes

rudiger at greatdealsenterprises dot com 12-Jun-2019 11:45
Note that even though getElementsByTagName returns a NodeList which is defined as a list of DOMNodes, you're actually getting a list of DOMElements. That allows to call getElementsByTagName on each of the results.

$tables = $doc->getElementsByTagName('table');
foreach ($tables as $table) {
  $trs = $table->getElementsByTagName('tr');
  // etc...
}
Brennon Brimhall 18-Jan-2017 11:51
Be aware that this function returns all descendants, not just immediate children.
ddkkdd twenty twenty at gmail dot com 08-Sep-2010 03:15
A simple function that uses this method to print the nodes it finds in an xml document. Improvements welcomed.

<?php
function printTags($tag){

  $node = $this->doc->getElementsByTagName($tag);
   for($c = 0; $c<$node->length; $c++){
     $text[$c] =$this->doc->saveXML($node->item($c));
     echo $text[$c];

   }

}
?>


Récupère les éléments par leur espace de noms et leur localName

  • « DOMElement::getElementsByTagName
  • DOMElement::hasAttribute »
  • PHP Manual
  • DOMElement
  • Récupère les éléments par leur espace de noms et leur localName

DOMElement::getElementsByTagNameNS

(PHP 5, PHP 7)

DOMElement::getElementsByTagNameNS — Récupère les éléments par leur espace de noms et leur localName

Description

public DOMElement::getElementsByTagNameNS ( string $namespace , string $localName ) : DOMNodeList

Cette fonction récupère tous les éléments descendants avec un nom local localName et un espace de noms namespace donnés.

Liste de paramètres

namespace

L'URI de l'espace de noms.

localName

Le nom local. Utilisez le caractère générique * pour récupérer tous les éléments de l'arbre de l'élément.

Valeurs de retour

Cette fonction retourne un nouvel objet de la classe DOMNodeList contenant tous les éléments correspondants dans l'ordre dans lesquels ils sont rencontrés lors du parcours de l'arbre de cet élément.

Voir aussi

  • DOMElement::getElementsByTagNameNS()

User Contributed Notes

spam at chovy dot com 03-Jun-2009 05:36
I had some difficulty stripping all default NS attributes for an ns-uri in one shot, the following will work though...first strip the documentElement namespace, then getElementsByTagNameNS() -- the documentation should reflect that the 2nd argument is actually the name of the tag, not the local namespace prefix as I first expected:

<?php

function strip_default_ns( $xml = null, $ns_uri = 'http://example.com/XML-Foo' ) {
    $ns_local = '';
    $ns_tag = '*';

    if ( empty($xml) ) return false;

    //remove document namespace
    $dom = new DOMDocument();
    $dom->loadXML($xml);
    $dom->documentElement->removeAttributeNS($ns_uri, $ns_local);

    //strip element namespaces
    foreach ( $dom->getElementsByTagNameNS($ns_uri, $ns_tag) as $elem ) {
        $elem->removeAttributeNS($ns_uri, $ns_local);
    }

    return $dom->saveXML();
}

$stripped_xml = strip_default_ns($the_xml);

?>

$stripped_xml can now take advantage of running XPath queries on it for the NULL namespace.


Vérifie si un attribut existe

  • « DOMElement::getElementsByTagNameNS
  • DOMElement::hasAttributeNS »
  • PHP Manual
  • DOMElement
  • Vérifie si un attribut existe

DOMElement::hasAttribute

(PHP 5, PHP 7)

DOMElement::hasAttribute — Vérifie si un attribut existe

Description

public DOMElement::hasAttribute ( string $qualifiedName ) : bool

Indique si un attribut nommé qualifiedName existe en tant que membre de l'élément.

Liste de paramètres

qualifiedName

Le nom de l'attribut.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • DOMElement::hasAttributeNS() - Vérifie si un attribut existe
  • DOMElement::getAttribute() - Retourne la valeur d'un attribut
  • DOMElement::setAttribute() - Ajoute un nouvel attribut
  • DOMElement::removeAttribute() - Efface un attribut

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si un attribut existe

  • « DOMElement::hasAttribute
  • DOMElement::removeAttribute »
  • PHP Manual
  • DOMElement
  • Vérifie si un attribut existe

DOMElement::hasAttributeNS

(PHP 5, PHP 7)

DOMElement::hasAttributeNS — Vérifie si un attribut existe

Description

public DOMElement::hasAttributeNS ( string|null $namespace , string $localName ) : bool

Vérifie si un attribut dans l'espace de noms namespace nommé localName existe en tant que membre de l'élément.

Liste de paramètres

namespace

L'URI de l'espace de noms.

localName

Le nom local.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • DOMElement::hasAttribute() - Vérifie si un attribut existe
  • DOMElement::getAttributeNS() - Retourne la valeur de l'attribut
  • DOMElement::setAttributeNS() - Ajoute un nouvel attribut
  • DOMElement::removeAttributeNS() - Efface un attribut

User Contributed Notes

There are no user contributed notes for this page.


Efface un attribut

  • « DOMElement::hasAttributeNS
  • DOMElement::removeAttributeNode »
  • PHP Manual
  • DOMElement
  • Efface un attribut

DOMElement::removeAttribute

(PHP 5, PHP 7)

DOMElement::removeAttribute — Efface un attribut

Description

public DOMElement::removeAttribute ( string $qualifiedName ) : bool

Efface l'attribut nommé qualifiedName de l'élément.

Liste de paramètres

qualifiedName

Le nom de l'attribut.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Lancé si le nœud est en lecture seule.

Voir aussi

  • DOMElement::hasAttribute() - Vérifie si un attribut existe
  • DOMElement::getAttribute() - Retourne la valeur d'un attribut
  • DOMElement::setAttribute() - Ajoute un nouvel attribut

User Contributed Notes

suwayan at mail dot ru 30-Mar-2012 12:19
<?php
/*When I try to get a some attribute from not validated HTML or XML document, PHP dies with no errors in logs or output:
*/
        function is_attribute_value($obj,$type,$value)
        {
            $_ret=false;
            if($obj)
            {
                if($val=$obj->getAttribute($type))
                {
                    if($val==$value)
                    {
                        $_ret=true;
                    }
                }
            }
            return $_ret;
        }
//And this check helped to me:
        function is_attribute_value($obj,$type,$value)
        {
            $_ret=false;
            if($obj->attributes)
            {
                if($val=$obj->getAttribute($type))
                {
                    if($val==$value)
                    {
                        $_ret=true;
                    }
                }
            }
            return $_ret;
        }
?>
Rakesh Verma - rakeshnsony at gmail dot com 10-Nov-2010 11:38
<?php

//Store your html into $html variable.

$html="<html>
<head>
<title>Rakesh Verma</title>
</head>

<body>
    <a href='http://example.com'>Example</a>
    <a href='http://google.com'>Google</a>
    <a href='http://www.yahoo.com'>Yahoo</a>
</body>

</html>";

$dom = new DOMDocument();
$dom->loadHTML($html);

//Evaluate Anchor tag in HTML
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");

for ($i = 0; $i < $hrefs->length; $i++) {
        $href = $hrefs->item($i);
        $url = $href->getAttribute('href');

        //remove and set target attribute
        $href->removeAttribute('target');
        $href->setAttribute("target", "_blank");

        $newURL=$url.".au";

        //remove and set href attribute
        $href->removeAttribute('href');
        $href->setAttribute("href", $newURL);
}

// save html
$html=$dom->saveHTML();

echo $html;

?>


Efface un attribut

  • « DOMElement::removeAttribute
  • DOMElement::removeAttributeNS »
  • PHP Manual
  • DOMElement
  • Efface un attribut

DOMElement::removeAttributeNode

(PHP 5, PHP 7)

DOMElement::removeAttributeNode — Efface un attribut

Description

public DOMElement::removeAttributeNode ( DOMAttr $attr ) : DOMAttr|false

Efface l'attribut attr de l'élément.

Liste de paramètres

attr

Le nœud de l'attribut.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Lancé si le nœud est en lecture seule.

DOM_NOT_FOUND_ERROR

Lancé si attr n'est pas un attribut de l'élément.

Voir aussi

  • DOMElement::hasAttribute() - Vérifie si un attribut existe
  • DOMElement::getAttributeNode() - Retourne le nœud d'attribut
  • DOMElement::setAttributeNode() - Ajoute un nouvel attribut à l'élément

User Contributed Notes

xr07354 at gmx dot de 18-Jun-2013 01:16
Basic: I use PHP5.4.9 from Ubuntu 13.04 repository. The aim of my code is to iterate HTML source (as a DomDocument) recursively and cleanup everything that is not valid to be used inside Epub files (i.e. and attribute align is not valid for paragraphs in Epubs).

FIRST: Today I tried removing attributes from a DOMElement using this simple code:
<?php
for ( $k=0; $k < $element->attributes->length; $k++) {
    if( /* some rule */ ){
        var_dump( $element->attributes->item($k)->nodeName);
        $element->removeAttributeNode( $element->attributes->item($k));
    }
}
?>
Unfortunately all attributes still existed when this loop was finished, even if these var_dumps told me that deleting them was tried.

I solved this problem iterating the attributes list backward:
<?php
for ( $k = $element->attributes->length - 1; $k >= 0; --$k) {
    if( /* same rule */ ){
        var_dump( $element->attributes->item($k)->nodeName);
        $element->removeAttributeNode( $element->attributes->item($k));
    }
}
?>
SECOND: DOMElement::removeAttributeNode does NOT return a bool but a DOMAttr object.


Efface un attribut

  • « DOMElement::removeAttributeNode
  • DOMElement::setAttribute »
  • PHP Manual
  • DOMElement
  • Efface un attribut

DOMElement::removeAttributeNS

(PHP 5, PHP 7)

DOMElement::removeAttributeNS — Efface un attribut

Description

public DOMElement::removeAttributeNS ( string|null $namespace , string $localName ) : void

Retire l'attribut localName dans l'espace de noms namespace de l'élément.

Liste de paramètres

namespace

L'URI de l'espace de noms.

localName

Le nom local.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Émise si le nœud est en lecture seule.

Voir aussi

  • DOMElement::hasAttributeNS() - Vérifie si un attribut existe
  • DOMElement::getAttributeNS() - Retourne la valeur de l'attribut
  • DOMElement::setAttributeNS() - Ajoute un nouvel attribut

User Contributed Notes

primaryspace at hotmail dot com 10-Aug-2005 12:56
This method can be used to remove a namespace declaration from an element, even though the declaration is not considered an attribute by the DOM.  The prefix will be removed from any element or attribute using it.

<?php

$dom = DOMDocument::loadXML('<foo:root xmlns:foo="http:bar"/>');
$element = $dom->childNodes->item(0);

// prints '0':
echo (int) $element->hasAttributeNS('http:bar', 'foo');

$element->removeAttributeNS('http:bar', 'foo');

/* prints '<?xml version="1.0"?> <root/>': */
print htmlentities($dom->saveXML());

?>


Ajoute un nouvel attribut

  • « DOMElement::removeAttributeNS
  • DOMElement::setAttributeNode »
  • PHP Manual
  • DOMElement
  • Ajoute un nouvel attribut

DOMElement::setAttribute

(PHP 5, PHP 7)

DOMElement::setAttribute — Ajoute un nouvel attribut

Description

public DOMElement::setAttribute ( string $qualifiedName , string $value ) : DOMAttr|bool

Ajoute un attribut avec comme nom qualifiedName et comme valeur value. Si l'attribut n'existe pas, il sera créé.

Liste de paramètres

qualifiedName

Le nom de l'attribut.

value

La valeur de l'attribut.

Valeurs de retour

Le nouveau DOMAttr ou false si une erreur survient.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Lancé si le nœud est en lecture seule.

Exemples

Exemple #1 Ajout d'un attribut

<?php
$doc = new DOMDocument("1.0");
$node = $doc->createElement("para");
$newnode = $doc->appendChild($node);
$newnode->setAttribute("align", "left");
?>

Voir aussi

  • DOMElement::hasAttribute() - Vérifie si un attribut existe
  • DOMElement::getAttribute() - Retourne la valeur d'un attribut
  • DOMElement::removeAttribute() - Efface un attribut

User Contributed Notes

lehal2@hotmail 06-Jun-2013 09:44
The use of Dom to first remove and then add the width and height to the first img tag from the text.I hope it help you to save your time
<?php
$html = '

            <img src="http://www.example.com/images/header.jpg" width="898" height="223" style="border-bottom:5px solid #cccccc;"/>
        <img src="http://www.example.com/images/header2.jpg" width="898" height="223" style="border-bottom:5px solid #cccccc;"/>
        ';

$doc = DOMDocument::loadHTML($html);
$c =0;
foreach($doc->getElementsByTagName('img') as $image){
    if ($c>0) continue;
    foreach(array('width', 'height') as $attribute_to_remove){
        echo $attribute_to_remove;
        if($image->hasAttribute($attribute_to_remove)){
            $image->removeAttribute($attribute_to_remove);

        }
        if($attribute_to_remove=='height'){
            if(!$image->hasAttribute($attribute_to_remove)){
                $image->setAttribute($attribute_to_remove,'220');

            }}
        if($attribute_to_remove=='width'){
      if(!$image->hasAttribute($attribute_to_remove)){
            $image->setAttribute($attribute_to_remove,'700');

        }}
        $c = $c+1;
    }
}
echo $doc->saveHTML();
Rakesh Verma - rakeshnsony at gmail dot com 10-Nov-2010 11:27
<?php
//Store your html into $html variable.
$html="
<html>
<head>
<title>Untitled Document</title>
</head>

<body>
    <a href='http://example.com'>Example</a><br>
    <a href='http://google.com'>Google</a><br>

    <a href='http://www.yahoo.com'>Yahoo</a><br>
</body>

</html>";

$dom = new DOMDocument();
$dom->loadHTML($html);

//Evaluate Anchor tag in HTML
$xpath = new DOMXPath($dom);
$hrefs = $xpath->evaluate("/html/body//a");

for ($i = 0; $i < $hrefs->length; $i++) {
        $href = $hrefs->item($i);
        $url = $href->getAttribute('href');

        //remove and set target attribute
        $href->removeAttribute('target');
        $href->setAttribute("target", "_blank");

        $newURL=$url."/newurl";

        //remove and set href attribute
        $href->removeAttribute('href');
        $href->setAttribute("href", $newURL);
}

// save html
$html=$dom->saveHTML();

echo $html;

?>
address at gmail dot com 03-Jul-2008 07:25
If wanting to set an attribute of an element with unique id of "1"

<?php
$dom = new DomDocument();
$dom->load('test.xml');
$xp = new DomXPath($dom);
$res = $xp->query("//*[@id = '1']");
$res->item(0)->setAttribute('title','2');
$dom->save('test.xml');
?>
Vasil Rangelov 31-Jul-2007 04:44
@karvjorm,
Using this method is not exactly a good practice. Infact, I think it may be a bug.
Names beginning with "xml" are reserved (for namespaces in this case).
setAttribute() should return false in this case I think, but I suppose it doesn't.

Still, the right way to do it is with createElementNS().
It lets you specify the namespace when creating the element node.

So the equivalent to yours ($html added to allow word wrapping) is:

$dom = new DomDocument('1.0','iso-8859-15');
$html = $dom->createElementNS('http://www.w3.org/1999/xhtml', 'html');
$ht_ml = $dom->appendChild($html);
$ht_ml->setAttribute('xml:lang','fi');
$ht_ml->setAttribute('lang','fi');
karvjorm at users.sourceforge.net 02-Mar-2007 03:05
$dom = new DomDocument('1.0','iso-8859-15');

$ht_ml = $dom->appendChild($dom->createElement('html'));
$ht_ml->setAttribute('xmlns','http://www.w3.org/1999/xhtml');
$ht_ml->setAttribute('xml:lang','fi');
$ht_ml->setAttribute('lang','fi');

Result:

<?xml version="1.0" encoding="iso-8859-15"?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi" lang="fi">


Ajoute un nouvel attribut à l'élément

  • « DOMElement::setAttribute
  • DOMElement::setAttributeNodeNS »
  • PHP Manual
  • DOMElement
  • Ajoute un nouvel attribut à l'élément

DOMElement::setAttributeNode

(PHP 5, PHP 7)

DOMElement::setAttributeNode — Ajoute un nouvel attribut à l'élément

Description

public DOMElement::setAttributeNode ( DOMAttr $attr ) : DOMAttr|null|false

Ajoute un nouvel attribut attr à l'élément.

Liste de paramètres

attr

L'attribut.

Valeurs de retour

Retourne l'ancien nœud si l'attribut a été placé ou null.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Lancé si le nœud est en lecture seule.

Voir aussi

  • DOMElement::hasAttribute() - Vérifie si un attribut existe
  • DOMElement::getAttributeNode() - Retourne le nœud d'attribut
  • DOMElement::removeAttributeNode() - Efface un attribut

User Contributed Notes

karvjorm at users.sourceforge.net 02-Mar-2007 04:01
$dom = new DomDocument('1.0','iso-8859-15');

$ht_ml = $dom->appendChild($dom->createElement('html'));

$he_ad = $ht_ml->appendChild($dom->createElement('head'));

$tit_le= $he_ad->appendChild($dom->createElement('title'));
$tit_le->appendChild($dom->createTextNode('DOMAttr test'));

$me_ta = $he_ad->appendChild(new DOMElement('meta'));
$me_ta->setAttributeNode(new DOMAttr('name', 'Description'));
$me_ta->setAttributeNode(new DOMAttr('content', 'example'));

$me_ta = $he_ad->appendChild(new DOMElement('meta'));
$me_ta->setAttributeNode(new DOMAttr('name', 'Author'));
$me_ta->setAttributeNode(new DOMAttr('content', 'karvjorm'));

Result:

<?xml version="1.0" encoding="iso-8859-15"?>
<html>
  <head>
    <title>DOMAttr test</title>
    <meta name="Description" content="example"/>
    <meta name="Author" content="karvjorm"/>
  </head>


Ajoute un nouvel attribut à l'élément

  • « DOMElement::setAttributeNode
  • DOMElement::setAttributeNS »
  • PHP Manual
  • DOMElement
  • Ajoute un nouvel attribut à l'élément

DOMElement::setAttributeNodeNS

(PHP 5, PHP 7)

DOMElement::setAttributeNodeNS — Ajoute un nouvel attribut à l'élément

Description

public DOMElement::setAttributeNodeNS ( DOMAttr $attr ) : DOMAttr|null|false

Ajoute un nouvel attribut attr à l'élément.

Liste de paramètres

attr

Le nom de l'attribut.

Valeurs de retour

Retourne l'ancien nœud si l'attribut a été placé.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Lancé si le nœud est en lecture seule.

Voir aussi

  • DOMElement::hasAttributeNS() - Vérifie si un attribut existe
  • DOMElement::getAttributeNodeNS() - Retourne le nœud d'attribut
  • DOMElement::removeAttributeNode() - Efface un attribut

User Contributed Notes

There are no user contributed notes for this page.


Ajoute un nouvel attribut

  • « DOMElement::setAttributeNodeNS
  • DOMElement::setIdAttribute »
  • PHP Manual
  • DOMElement
  • Ajoute un nouvel attribut

DOMElement::setAttributeNS

(PHP 5, PHP 7)

DOMElement::setAttributeNS — Ajoute un nouvel attribut

Description

public DOMElement::setAttributeNS ( string|null $namespace , string $qualifiedName , string $value ) : void

Ajoute un attribut avec comme espace de noms namespace et comme nom name avec comme valeur value. Si l'attribut n'existe pas, il sera créé.

Liste de paramètres

namespace

L'URI de l'espace de noms.

qualifiedName

Le nom qualifié de l'attribut, sous la forme prefixe:nomdebalise.

value

La valeur de l'attribut.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Lancé si le nœud est en lecture seule.

DOM_NAMESPACE_ERR

Lancé si qualifiedName est un nom qualifié malformé ou si qualifiedName a un préfixe et un namespace qui vaut null.

Voir aussi

  • DOMElement::hasAttributeNS() - Vérifie si un attribut existe
  • DOMElement::getAttributeNodeNS() - Retourne le nœud d'attribut
  • DOMElement::removeAttributeNode() - Efface un attribut

User Contributed Notes

catalinenache78 at gmail dot com 18-May-2011 07:39
To add new brand xml namespace use:

<?php
    $element->setAttributeNS(
        'http://www.w3.org/2000/xmlns/', // xmlns namespace URI
        'xmlns:mynamespace',
        'example.com/mynamespace'
    );
?>

'http://www.w3.org/2000/xmlns/' URI is important
to be able to add  new namespaces !!!

Later you can use your namespace like:

<?php
    $element->setAttributeNS(
        'example.com/mynamespace',
        'mynamespace:something',
        'value'
    );
?>


Déclare l'attribut spécifié par son nom à être de type ID

  • « DOMElement::setAttributeNS
  • DOMElement::setIdAttributeNode »
  • PHP Manual
  • DOMElement
  • Déclare l'attribut spécifié par son nom à être de type ID

DOMElement::setIdAttribute

(PHP 5, PHP 7)

DOMElement::setIdAttribute — Déclare l'attribut spécifié par son nom à être de type ID

Description

public DOMElement::setIdAttribute ( string $qualifiedName , bool $isId ) : void

Déclare l'attribut qualifiedName afin qu'il soit de type ID.

Liste de paramètres

qualifiedName

Le nom de l'attribut.

isId

Définissez à true si vous voulez que qualifiedName soit de type ID, false sinon.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Envoyé si le nœud est en lecture seule.

DOM_NOT_FOUND

Envoyé si qualifiedName n'est pas un attribut de cet élément.

Voir aussi

  • DOMDocument::getElementById() - Cherche un élément avec un certain identifiant
  • DOMElement::setIdAttributeNode() - Déclare l'attribut spécifié par le nœud à être de type ID
  • DOMElement::setIdAttributeNS() - Déclare l'attribut spécifié par son nom local et son espace de nom URI à être de type ID

User Contributed Notes

There are no user contributed notes for this page.


Déclare l'attribut spécifié par le nœud à être de type ID

  • « DOMElement::setIdAttribute
  • DOMElement::setIdAttributeNS »
  • PHP Manual
  • DOMElement
  • Déclare l'attribut spécifié par le nœud à être de type ID

DOMElement::setIdAttributeNode

(PHP 5, PHP 7)

DOMElement::setIdAttributeNode — Déclare l'attribut spécifié par le nœud à être de type ID

Description

public DOMElement::setIdAttributeNode ( DOMAttr $attr , bool $isId ) : void

Déclare l'attribut spécifié par attr afin qu'il soit de type ID.

Liste de paramètres

attr

L'attribut du nœud.

isId

Définissez à true si vous voulez que name soit de type ID, false sinon.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Envoyé si le nœud est en lecture seule.

DOM_NOT_FOUND

Envoyé si name n'est pas un attribut de cet élément.

Voir aussi

  • DOMDocument::getElementById() - Cherche un élément avec un certain identifiant
  • DOMElement::setIdAttribute() - Déclare l'attribut spécifié par son nom à être de type ID
  • DOMElement::setIdAttributeNS() - Déclare l'attribut spécifié par son nom local et son espace de nom URI à être de type ID

User Contributed Notes

There are no user contributed notes for this page.


Déclare l'attribut spécifié par son nom local et son espace de nom URI à être de type ID

  • « DOMElement::setIdAttributeNode
  • DOMEntity »
  • PHP Manual
  • DOMElement
  • Déclare l'attribut spécifié par son nom local et son espace de nom URI à être de type ID

DOMElement::setIdAttributeNS

(PHP 5, PHP 7)

DOMElement::setIdAttributeNS — Déclare l'attribut spécifié par son nom local et son espace de nom URI à être de type ID

Description

public DOMElement::setIdAttributeNS ( string $namespace , string $qualifiedName , bool $isId ) : void

Déclare l'attribut spécifié par qualifiedName et namespace afin qu'il soit de type ID.

Liste de paramètres

namespace

L'URI de l'espace de nom de l'attribut.

qualifiedName

Le nom local de l'attribut, sous la forme prefix:tagname.

isId

Définissez à true si vous voulez que name soit de type ID, false sinon.

Valeurs de retour

Aucune valeur n'est retournée.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Émise si le nœud est en lecture seule.

DOM_NOT_FOUND

Émise si name n'est pas un attribut de cet élément.

Voir aussi

  • DOMDocument::getElementById() - Cherche un élément avec un certain identifiant
  • DOMElement::setIdAttribute() - Déclare l'attribut spécifié par son nom à être de type ID
  • DOMElement::setIdAttributeNode() - Déclare l'attribut spécifié par le nœud à être de type ID

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMEntity

(PHP 5, PHP 7)

Introduction

Cette interface représente une entité inconnue, analysée ou non, dans un document XML.

Synopsis de la classe

DOMEntity extends DOMNode {
/* Propriétés */
public readonly string $publicId ;
public readonly string $systemId ;
public readonly string $notationName ;
public string $actualEncoding ;
public readonly string $encoding ;
public readonly string $version ;
/* Propriétés héritées */
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes héritées */
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Propriétés

publicId

L'identifiant public associé avec l'entité, si spécifiée, et null sinon.

systemId

L'identifiant système associé avec l'entité, si spécifiée, et null sinon. Peut être une URL absolue ou non.

notationName

Pour les entités non analysée, le nom de la notation de l'entité. Pour les entités analysées, vaut null.

actualEncoding

Un attribut spécifiant l'encodage utilisé pour cette entité au moment de l'analyse, lorsque c'est une entité analysée externe. Vaut null si c'est une entité depuis un subset interne ou si l'encodage est inconnu.

encoding

Un attribut spécifiant (faisant parti de la déclaration) l'encodage de l'entité, lorsque c'est une entité analysée externe. Vaut null sinon.

version

Un attribut spécifiant (faisant parti de la déclaration) le numéro de version de l'entité, lorsque c'est une entité analysée externe. Vaut null sinon.

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMEntityReference

(PHP 5, PHP 7)

Synopsis de la classe

DOMEntityReference étend DOMNode {
/* Propriétés */
/* Propriétés héritées */
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes */
public __construct ( string $name )
/* Méthodes héritées */
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Sommaire

  • DOMEntityReference::__construct — Crée un nouvel objet DOMEntityReference

User Contributed Notes

There are no user contributed notes for this page.


Crée un nouvel objet DOMEntityReference

  • « DOMEntityReference
  • DOMException »
  • PHP Manual
  • DOMEntityReference
  • Crée un nouvel objet DOMEntityReference

DOMEntityReference::__construct

(PHP 5, PHP 7)

DOMEntityReference::__construct — Crée un nouvel objet DOMEntityReference

Description

public DOMEntityReference::__construct ( string $name )

Crée un nouvel objet DOMEntityReference.

Liste de paramètres

name

Le nom de la référence à l'entité.

Exemples

Exemple #1 Création d'un nouveau DOMEntityReference

<?php

$dom = new DOMDocument('1.0', 'iso-8859-1');
$element = $dom->appendChild(new DOMElement('root'));
$entity = $element->appendChild(new DOMEntityReference('nbsp'));
echo $dom->saveXML(); /* <?xml version="1.0" encoding="iso-8859-1"?><root></root> */

?>

Voir aussi

  • DOMDocument::createEntityReference() - Crée un nouveau nœud de référence d'entité

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMException

(PHP 5, PHP 7)

Introduction

Les opérations DOM lancent des exceptions lors de circonstances particulières, i.e., lorsqu'il est impossible d'exécuter une opération pour des raisons logiques.

Voir aussi Les exceptions.

Synopsis de la classe

DOMException extends Exception {
/* Propriétés */
public readonly int $code ;
/* Propriétés héritées */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* Méthodes héritées */
final public Exception::getMessage ( ) : string
final public Exception::getPrevious ( ) : Throwable
final public Exception::getCode ( ) : mixed
final public Exception::getFile ( ) : string
final public Exception::getLine ( ) : int
final public Exception::getTrace ( ) : array
final public Exception::getTraceAsString ( ) : string
public Exception::__toString ( ) : string
final private Exception::__clone ( ) : void
}

Propriétés

code

Un entier indiquant le type d'erreur généré

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMImplementation

(PHP 5, PHP 7)

Introduction

La classe DOMImplementation fournit des méthodes pour effectuer des opérations qui sont indépendantes d'une instance particulière du modèle objet d'un document.

Synopsis de la classe

DOMImplementation {
/* Propriétés */
/* Méthodes */
__construct ( )
public createDocument ( string $namespace = "" , string $qualifiedName = "" , DOMDocumentType|null $doctype = null ) : DOMDocument|false
public createDocumentType ( string $qualifiedName , string $publicId = "" , string $systemId = "" ) : DOMDocumentType|false
public hasFeature ( string $feature , string $version ) : bool
}

Sommaire

  • DOMImplementation::__construct — Crée un nouvel objet DOMImplementation
  • DOMImplementation::createDocument — Crée un objet DOM Document du type spécifié avec ses éléments
  • DOMImplementation::createDocumentType — Crée un objet DOMDocumentType vide
  • DOMImplementation::hasFeature — Teste si l'implémentation DOM implémente une fonctionnalité spécifique

User Contributed Notes

LANGE.LUDO 07-Nov-2014 06:05
Ok got it working like a charm using "proxy pattern" with traits. The idea being declaring the common methods inside a "trait" in order for extended and registered Node Classes to have access even if not derived / child of the extended DOMNode…

Here a small snippet :
<?php
    namespace my;

    trait tNode
    {    // We need the magic method __get in order to add properties such as DOMNode->parentElement
        public function __get($name)
        {    if(property_exists($this, $name)){return $this->$name;}
            if(method_exists($this, $name)){return $this->$name();}
            throw new \ErrorException('my\\Node property \''.(string) $name.'\' not found…', 42, E_USER_WARNING);
        }

        // parentElement property definition
        private function parentElement()
        {    if($this->parentNode === null){return null;}
            if($this->parentNode->nodeType === XML_ELEMENT_NODE){return $this->parentNode;}
            return $this->parentNode->parentElement();
        }

        // JavaScript equivalent
        public function isEqualNode(\DOMNode $node){return $this->isSameNode($node);}
        public function compareDocumentPosition(\DOMNode $otherNode)
        {    if($this->ownerDocument !== $otherNode->ownerDocument){return DOCUMENT_POSITION_DISCONNECTED;}
            $c = strcmp($this->getNodePath(), $otherNode->getNodePath());
            if($c === 0){return 0;}
            else if($c < 0){return DOCUMENT_POSITION_FOLLOWING | ($c < -1 ? DOCUMENT_POSITION_CONTAINED_BY : 0);}
            return DOCUMENT_POSITION_PRECEDING | ($c > 1 ? DOCUMENT_POSITION_CONTAINS : 0);
        }
        public function contains(\DOMNode $otherNode){return ($this->compareDocumentPosition($otherNode) >= DOCUMENT_POSITION_CONTAINED_BY);}
    }

    class Document extends \DomDocument
    {    public function __construct($version=null, $encoding=null)
        {    parent::__construct($version, $encoding);
            $this->registerNodeClass('DOMNode', 'my\Node');
            $this->registerNodeClass('DOMElement', 'my\Element');
            $this->registerNodeClass('DOMDocument', 'my\Document');
            /* [...] */
        }
    }

    class Element extends \DOMElement
    {    use tNode;
        /* [...] */
    }

    class Node extends \DOMNode
    {    use tNode;
        /* [...] */
    }

?>
LANGE.LUDO 07-Nov-2014 08:14
From what I've seen you must "recode" the "createDocument" method in order to call your own object extension…

<?php
[...]
    public function createDocument($namespaceURI=null, $qualifiedName=null, DOMDocumentType $docType=null)
    {    $doc=new Document();
        $doc->appendChild(parent::createDocumentType('html'));
        $this->doc->appendChild($namespaceURI ? $this->doc->createElementNS($namespaceURI,$qualifiedName) : $this->doc->createElement($qualifiedName));
    return $doc;
    }
[...]
?>

Where I am struggling is extending the whole tree so that calling the customized Implementation method returns a whole extended tree…
Expected result : Implementation > Document > DOMDocument > Node > DOMNode
Actual result : Implementation > Document > DOMDocument > DOMNode :(
LANGE.LUDO 05-Nov-2014 10:59
Why not use the DOMImplementation to directly register your DOM Class extensions ?

<?php
namespace My;
class Implementation extends \DOMImplementation
{    private $doc;
    public function __construct(){return $this->createDocument();}
    public function __get($name){return $this->doc->{$name};}
    public function __set($name,$value){$this->doc->{$name}=$value;}
    public function __isset($name){return isset($this->doc->{$name});}
    public function __unset($name){return $this->doc->__unset($name);}
    public function __call($name,$args){return call_user_func_array(array($this->doc,$name),$args);}

    public function createDocument($namespaceURI=null,$qualifiedName=null,DOMDocumentType $docType=null)
    {    $this->doc=parent::createDocument($namespaceURI,$qualifiedName,$docType);
        $this->doc->xmlVersion='1.0';
        $this->doc->xmlEncoding='UTF-8';
        $this->doc->registerNodeClass('DOMDocument','My\Document');
        $this->doc->registerNodeClass('DOMDocumentFragment','My\DocumentFragment');
        $this->doc->registerNodeClass('DOMElement','My\Element');
        $this->doc->registerNodeClass('DOMComment','My\Comment');
        $this->doc->registerNodeClass('DOMNode','My\Node');
        /* …, …, … */
        return $this->doc;
    }
}
?>
giorgio dot liscio at email dot it 20-Jul-2010 06:26
officially, the w3 specifies that the way to access dom interfaces is through this class

so if you use

$doc = new DOMDocument("1.0", "UTF-8");

use instead:

$x = new DOMImplementation();
$doc = $x->createDocument(NULL,"rootElementName");
$doc->xmlVersion="1.0";
$doc->xmlEncoding="UTF-8";

it is not required by php's implementation, but, probably, it is a good practice

see:

http://w3.org/TR/DOM-Level-3-Core/core.html#DOMImplementation

http://w3.org/TR/DOM-Level-3-Core/core.html#DOMImplementationList

http://w3.org/TR/DOM-Level-3-Core/core.html#DOMImplementationSource


Crée un nouvel objet DOMImplementation

  • « DOMImplementation
  • DOMImplementation::createDocument »
  • PHP Manual
  • DOMImplementation
  • Crée un nouvel objet DOMImplementation

DOMImplementation::__construct

(PHP 5, PHP 7)

DOMImplementation::__construct — Crée un nouvel objet DOMImplementation

Description

DOMImplementation::__construct ( )

Crée un nouvel objet DOMImplementation.

User Contributed Notes

There are no user contributed notes for this page.


Crée un objet DOM Document du type spécifié avec ses éléments

  • « DOMImplementation::__construct
  • DOMImplementation::createDocumentType »
  • PHP Manual
  • DOMImplementation
  • Crée un objet DOM Document du type spécifié avec ses éléments

DOMImplementation::createDocument

(PHP 5, PHP 7)

DOMImplementation::createDocument — Crée un objet DOM Document du type spécifié avec ses éléments

Description

public DOMImplementation::createDocument
 ( string $namespace = ""
, string $qualifiedName = ""
, DOMDocumentType|null $doctype = null
) : DOMDocument|false

Crée un objet DOMDocument du type spécifié avec ces éléments du document.

Liste de paramètres

namespace

L'URI de l'espace de noms des éléments du document à créer.

qualifiedName

Le nom qualifié des éléments du document à créer.

doctype

Le type de document à créer ou null.

Valeurs de retour

Un nouvel objet DOMDocument. Si namespace, qualifiedName, et doctype sont nulles, le DOMDocument retourné est vide avec aucun élément de document.

Erreurs / Exceptions

DOM_WRONG_DOCUMENT_ERR

Lancé si doctype a déjà été utilisé avec un document différent ou a été créé depuis une implémentation différente.

DOM_NAMESPACE_ERR

Lancé s'il y a une erreur dans l'espace de noms, déterminé par namespace et qualifiedName.

Cette méthode peut être appelée statiquement, mais enverra une erreur E_STRICT.

Historique

Version | Description
8.0.0 | doctype is now nullable.

Voir aussi

  • DOMDocument::__construct() - Crée un nouvel objet DOMDocument
  • DOMImplementation::createDocumentType() - Crée un objet DOMDocumentType vide

User Contributed Notes

sleistico at gmail dot com 02-Jul-2018 03:48
I just recently got an error, having to do with deprecation, by using the type of calls in the other example listed here.  What I had to do instead looks like this...

$htmldoc = (new DOMImplementation)->createDocument(null, 'html', (new DOMImplementation)->createDocumentType("html"));

This creates a document with <!DOCTYPE html> at the top of it.
eboyjr 22-Jul-2010 12:48
To add on to the other example, here's how to create an XHTML 1.0 transitional document with head, title, and body elements.

<?php

$document = DOMImplementation::createDocument(null, 'html',
    DOMImplementation::createDocumentType("html",
        "-//W3C//DTD XHTML 1.0 Transitional//EN",
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"));
$document->formatOutput = true;

$html = $document->documentElement;
$head = $document->createElement('head');
$title = $document->createElement('title');
$text = $document->createTextNode('Title of Page');
$body = $document->createElement('body');

$title->appendChild($text);
$head->appendChild($title);
$html->appendChild($head);
$html->appendChild($body);

echo $document->saveXML();
?>

This outputs: (http links removed due to spam)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "doctype.dtd">
<html xmlns="w3org1999xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1252" />
    <title>Title of Page</title>
  </head>
  <body></body>
</html>

Note the saveXML function. If saveHTML was used instead, you get the output:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "doctype.dtd">
<html>
<head><title>Title of Page</title></head>
<body></body>
</html>
arturm at union dot com dot pl 06-May-2006 10:23
To create HTML document with doctype:

<?php
$doctype = DOMImplementation::createDocumentType("html",
                "-//W3C//DTD HTML 4.01//EN",
                "http://www.w3.org/TR/html4/strict.dtd");
$doc = DOMImplementation::createDocument(null, 'html', $doctype);
?>


Crée un objet DOMDocumentType vide

  • « DOMImplementation::createDocument
  • DOMImplementation::hasFeature »
  • PHP Manual
  • DOMImplementation
  • Crée un objet DOMDocumentType vide

DOMImplementation::createDocumentType

(PHP 5, PHP 7)

DOMImplementation::createDocumentType — Crée un objet DOMDocumentType vide

Description

public DOMImplementation::createDocumentType ( string $qualifiedName , string $publicId = "" , string $systemId = "" ) : DOMDocumentType|false

Crée un objet DOMDocumentType vide. Les déclarations et notations d'entités ne sont pas disponibles. Les expansions de références d'entités et les ajouts d'attributs par défaut ne sont pas non plus effectués.

Liste de paramètres

qualifiedName

Le nom qualifié du type de document à créer.

publicId

L'identifiant publique externe du sous-ensemble.

systemId

L'identifiant système externe du sous-ensemble.

Valeurs de retour

Un nouveau nœud DOMDocumentType avec son ownerDocument défini à null.

Erreurs / Exceptions

DOM_NAMESPACE_ERR

Levée si il y a une erreur avec l'espace de noms, déterminé par qualifiedName.

Cette méthode peut être appelée statiquement, mais enverra une erreur E_STRICT.

Exemples

Exemple #1 Création d'un document avec une DTD attachée

<?php

// Création d'une instance de la classe DOMImplementation
$imp = new DOMImplementation;

// Création d'une instance DOMDocumentType
$dtd = $imp->createDocumentType('graph', '', 'graph.dtd');

// Création d'une instance DOMDocument
$dom = $imp->createDocument("", "", $dtd);

// Définition des autres propriétés
$dom->encoding = 'UTF-8';
$dom->standalone = false;

// Création d'un élément vide
$element = $dom->createElement('graph');

// Ajout de l'élément
$dom->appendChild($element);

// Récupère et affiche le document
echo $dom->saveXML();

?>

L'exemple ci-dessus va afficher :

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE graph SYSTEM "graph.dtd">
<graph/>

Voir aussi

  • DOMImplementation::createDocument() - Crée un objet DOM Document du type spécifié avec ses éléments

User Contributed Notes

until-all-bytes-are-free at example dot org 09-Apr-2011 04:28
I had problems to use a DTD from a file. It needed to be resolved relatively and it contained characters that made DomDocument failed to resolve the file.

Encoding and an absolute filename did not help much. So I used the data:// streamwrapper ( http://php.net/manual/en/wrappers.data.php ) as a work-around:

<?php

// relative or absolute filename
$path = '...';

// convert file contents into a filename
$data = file_get_contents($path);
$systemId = 'data://text/plain;base64,'.base64_encode($data);

// ...

// Creates a DOMDocumentType instance
$dtd = $aImp->createDocumentType('qualified name', '', $systemId);

?>

Works like a charm.


Teste si l'implémentation DOM implémente une fonctionnalité spécifique

  • « DOMImplementation::createDocumentType
  • DOMNamedNodeMap »
  • PHP Manual
  • DOMImplementation
  • Teste si l'implémentation DOM implémente une fonctionnalité spécifique

DOMImplementation::hasFeature

(PHP 5, PHP 7)

DOMImplementation::hasFeature — Teste si l'implémentation DOM implémente une fonctionnalité spécifique

Description

public DOMImplementation::hasFeature ( string $feature , string $version ) : bool

Teste si l'implémentation DOM implémente une fonctionnalité feature spécifique.

Vous pouvez trouver une liste de toutes les fonctionnalités dans la section » Conformance de la spécification DOM.

Liste de paramètres

feature

La fonctionnalité à tester.

version

Le numéro de version de la fonctionnalité feature à tester. Dans le niveau 2, ceci peut être soit 2.0 ou 1.0.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

Cette méthode peut être appelée statiquement, mais enverra une erreur E_STRICT.

Exemples

Exemple #1 Test votre implémentation DOM

<?php

$features = array(
  'Core'           => 'Core module',
  'XML'            => 'XML module',
  'HTML'           => 'HTML module',
  'Views'          => 'Views module',
  'Stylesheets'    => 'Style Sheets module',
  'CSS'            => 'CSS module',
  'CSS2'           => 'CSS2 module',
  'Events'         => 'Events module',
  'UIEvents'       => 'User interface Events module',
  'MouseEvents'    => 'Mouse Events module',
  'MutationEvents' => 'Mutation Events module',
  'HTMLEvents'     => 'HTML Events module',
  'Range'          => 'Range module',
  'Traversal'      => 'Traversal module'
);

foreach ($features as $key => $name) {
  if (DOMImplementation::hasFeature($key, '2.0')) {
    echo "A la fonctionnalité $name\n";
  } else {
    echo "N'a pas la fonctionnalité $name\n";
  }
}

?>

Voir aussi

  • DOMNode::isSupported() - Vérifie si la fonctionnalité est disponible pour la version spécifiée

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMNamedNodeMap

(PHP 5, PHP 7)

Synopsis de la classe

DOMNamedNodeMap implements Traversable , Countable {
/* Propriétés */
public readonly int $length ;
/* Méthodes */
public count ( ) : int|false
public getNamedItem ( string $qualifiedName ) : DOMNode|null
public getNamedItemNS ( string|null $namespace , string $localName ) : DOMNode|null
public item ( int $index ) : DOMNode|null
}

Propriétés

length

Le nombre de nœuds dans la carte. L'intervalle des indices des nœuds fils valides est de 0 à length - 1, inclusif.

Sommaire

  • DOMNamedNodeMap::count — Récupère le nombre de nœuds dans la collection non triée (map)
  • DOMNamedNodeMap::getNamedItem — Retourne un nœud spécifié par son nom
  • DOMNamedNodeMap::getNamedItemNS — Retourne un nœud spécifié par son nom local et son espace de noms
  • DOMNamedNodeMap::item — Retourne un nœud selon son index

User Contributed Notes

sirajshaikh96 at yahoo dot com 01-Jan-2021 02:48
I have tried to solve the general problem occurs in DOMNamedNodeMap that during executing for/foreachloop after executing removeAttribute('$name') for item(0), item(1) is not executing and warning occurs. Following codes give the solution of this problem that in loop item(0) should be applied rather than item($i) because after removing first attribute node now present element has only one attribute node.

<?php
$html  = '<h1 id="h1test" class="h2test">Heading</h1>';
$html .= '<p align="left" class="right">Hello World</p>';

$doc = new DOMDocument();
$doc->loadHTML($html);

// remove attributes from  the h1 element
$h1 = $doc->getElementsByTagName('h1')->item(0);
$length = $h1->attributes->length;
for ($i = 0; $i < $length; $i++) {
    $name = $h1->attributes->item(0)->nodeName;
    $value = $h1->attributes->item(0)->nodeValue;
    $h1->removeAttribute($name);
    echo "h1: removed attribute name :- " .$name."</br>";
    echo "h1: removed attribute value :- " .$value."</br>";
    }
// remove attributes from the p element
$p = $doc->getElementsByTagName('p')->item(0);
for ($i = 0; $i < $length; $i++) {
    $name = $p->attributes->item(0)->nodeName;
    $value = $p->attributes->item(0)->nodeValue;
    $p->removeAttribute($name);
    echo "p: removed attribute name :- " .$name."</br>";
    echo "p: removed attribute value :- " .$value."</br>";
}
?>

OUTPUT:

h1: removed attribute name :- id
h1: removed attribute value :- h1test
h1: removed attribute name :- class
h1: removed attribute value :- h2test
p: removed attribute name :- align
p: removed attribute value :- left
p: removed attribute name :- class
p: removed attribute value :- right
kendsnyder at gmail dot com 29-Oct-2009 07:55
To add to xafford's comment. When iterating a named node map collection using ->item() or using foreach, removing a attribute with DOMNode->removeAttribute() or DOMNode->removeAttributeNode() alters the collection as if it were a stack. To illustrate, the code below tries to remove all attributes from each element but only removes the first. One work around is to copy the named node map into an array before removing attributes. Using PHP 5.2.9 on Windows XP.

<?php
error_reporting(E_ALL);
$html  = '<h1 id="h1test" class="h1test">Heading</h1>';
$html .= '<p align="left" class="ptest">Hello World</p>';

$doc = new DOMDocument();
$doc->loadHTML($html);

// remove attributes from  the h1 element
$h1 = $doc->getElementsByTagName('h1')->item(0);
$length = $h1->attributes->length;
for ($i = 0; $i < $length; ++$i) {
    $name = $h1->attributes->item($i)->name;
    $h1->removeAttribute($name);
    echo "h1: removed attribute `$name`<br>";
}
// remove attributes from the p element
$p = $doc->getElementsByTagName('p')->item(0);
foreach ($p->attributes as $name => $attrNode) {
    $p->removeAttribute($name);
    echo "p: removed attribute `$name`<br>";
}

?>

OUTPUT:
-------
h1: removed attribute `id`

Notice: Trying to get property of non-object in nodemap.php on line 13
h1: removed attribute ``
p: removed attribute `align`
xafford 15-Oct-2009 03:16
I stumbled upon a problem with DOMNamedNodeMap. If you iterate over a DOMNamedNodeMap, representing the attributes of a DOMElement with foreach and you use DOMElement::removeAttributeNode only the first attribute will be handled.

Example (not complete):

<?php

/*
 * Imagine you got a node like this:
 * <a onclick="alert('evil')" href="http://example.com">evil</a>
 * and onclick should be removed, href would not be tested.
 */

foreach ( $node->attributes as $attribute )
{

    echo 'checking attribute ', $attribute->name, '<br />';

    if ( ! in_array ( $attribute->name, $allowed_attributes ) )
    {
        $node->removeAttributeNode ( $attribute );
    }

}

?>

The output would be:

checking attribute onclick


Récupère le nombre de nœuds dans la collection non triée (map)

  • « DOMNamedNodeMap
  • DOMNamedNodeMap::getNamedItem »
  • PHP Manual
  • DOMNamedNodeMap
  • Récupère le nombre de nœuds dans la collection non triée (map)

DOMNamedNodeMap::count

(PHP 7 >= 7.2.0)

DOMNamedNodeMap::count — Récupère le nombre de nœuds dans la collection non triée (map)

Description

public DOMNamedNodeMap::count ( ) : int|false

Récupère le nombre de nœuds dans la collection non triée (map).

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le nombre de nœuds dans la collection non triée, ce qui est identique à la propriété length.

User Contributed Notes

There are no user contributed notes for this page.


Retourne un nœud spécifié par son nom

  • « DOMNamedNodeMap::count
  • DOMNamedNodeMap::getNamedItemNS »
  • PHP Manual
  • DOMNamedNodeMap
  • Retourne un nœud spécifié par son nom

DOMNamedNodeMap::getNamedItem

(PHP 5, PHP 7)

DOMNamedNodeMap::getNamedItem — Retourne un nœud spécifié par son nom

Description

public DOMNamedNodeMap::getNamedItem ( string $qualifiedName ) : DOMNode|null

Récupère un nœud spécifié par son nodeName.

Liste de paramètres

qualifiedName

Le nodeName du nœud à récupérer.

Valeurs de retour

Un nœud (de n'importe quel type) avec un nodeName spécifié, ou null si aucun nœud n'est trouvé.

Voir aussi

  • DOMNamedNodeMap::getNamedItemNS() - Retourne un nœud spécifié par son nom local et son espace de noms

User Contributed Notes

franp at free dot fr 03-Mar-2006 07:28
Basic example of use :

<?xml version="1.0" encoding="UTF-8"?>
<racine version="2.0a">
  <article/>
</racine>

<?php
(...)
 echo $doc->documentElement->attributes->getNamedItem("version")->nodeValue;

// returns "2.0a"
?>


Retourne un nœud spécifié par son nom local et son espace de noms

  • « DOMNamedNodeMap::getNamedItem
  • DOMNamedNodeMap::item »
  • PHP Manual
  • DOMNamedNodeMap
  • Retourne un nœud spécifié par son nom local et son espace de noms

DOMNamedNodeMap::getNamedItemNS

(PHP 5, PHP 7)

DOMNamedNodeMap::getNamedItemNS — Retourne un nœud spécifié par son nom local et son espace de noms

Description

public DOMNamedNodeMap::getNamedItemNS ( string|null $namespace , string $localName ) : DOMNode|null

Retourne un nœud spécifié par son nom local localName et son espace de noms namespace.

Liste de paramètres

namespace

L'URI de l'espace de noms du nœud à récupérer.

localName

Le nom local du nœud à récupérer.

Valeurs de retour

Un nœud, de n'importe quel type ou null si aucun nœud n'est trouvé.

Voir aussi

  • DOMNamedNodeMap::getNamedItemNS()

User Contributed Notes

There are no user contributed notes for this page.


Retourne un nœud selon son index

  • « DOMNamedNodeMap::getNamedItemNS
  • DOMNode »
  • PHP Manual
  • DOMNamedNodeMap
  • Retourne un nœud selon son index

DOMNamedNodeMap::item

(PHP 5, PHP 7)

DOMNamedNodeMap::item — Retourne un nœud selon son index

Description

public DOMNamedNodeMap::item ( int $index ) : DOMNode|null

Retourne un nœud spécifié par index dans l'objet DOMNamedNodeMap.

Liste de paramètres

index

Index dans cette carte.

Valeurs de retour

Le nœud à la position index dans la carte, ou null si ce n'est pas un index valide (plus grand que ou égal au nombre de nœuds dans cette carte).

User Contributed Notes

reyjacobs at yahoo dot com 07-Mar-2008 11:24
Nevermind: I got it, and here it is:

<?php
if($element->hasAttributes())
{
    $attributes = $element->attributes;
    if(!is_null($attributes))
    {
        foreach ($attributes as $index=>$attr)
        {
            echo $attr->name."=\"".$attr->value."\"";
        }
    }
}
?>


La classe DOMNode

(PHP 5, PHP 7)

Synopsis de la classe

DOMNode {
/* Propriétés */
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes */
public appendChild ( DOMNode $node ) : DOMNode|false
public C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public cloneNode ( bool $deep = false ) : DOMNode|false
public getLineNo ( ) : int
public getNodePath ( ) : string|null
public hasAttributes ( ) : bool
public hasChildNodes ( ) : bool
public insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public isDefaultNamespace ( string $namespace ) : bool
public isSameNode ( DOMNode $otherNode ) : bool
public isSupported ( string $feature , string $version ) : bool
public lookupNamespaceUri ( string $prefix ) : string
public lookupPrefix ( string $namespace ) : string|null
public normalize ( ) : void
public removeChild ( DOMNode $child ) : DOMNode|false
public replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Propriétés

nodeName

Retourne le nom, le plus précis, pour le type de nœud courant

nodeValue

La valeur de ce nœud, suivant son type. Contrairement aux spécifications W3C, la valeur du nœud des nœuds DOMElement est égale à DOMNode::textContent au lieu de null.

nodeType

Récupère le type du nœud. Une des constantes XML_xxx_NODE

parentNode

Le parent de ce nœud. Si ce type de nœud n'existe pas, ceci retournera null.

childNodes

Un DOMNodeList qui contient tous les fils de ce nœud. S'il n'y a aucun fils, ce sera un DOMNodeList vide.

firstChild

Le premier fils de ce nœud. S'il n'y a aucun nœud de ce type, retourne null.

lastChild

Le dernier fils de ce nœud. S'il n'y a aucun nœud de ce type, retourne null.

previousSibling

Le nœud précédant immédiatement ce nœud. S'il n'y a aucun nœud, retourne null.

nextSibling

Le nœud suivant immédiatement ce nœud. S'il n'y a aucun nœud, retourne null.

attributes

Un DOMNamedNodeMap contenant les attributs de ce nœud (si c'est un DOMElement) ou null sinon.

ownerDocument

L'objet DOMDocument associé avec ce nœud, ou null si ce nœud est un DOMDocument.

namespaceURI

L'espace de nom de l'URL pour ce nœud, ou null s'il n'est pas spécifié.

prefix

Le préfixe de l'espace de nom de ce nœud, ou null s'il n'est pas spécifié.

localName

Retourne la partie locale du nom qualifié du nœud.

baseURI

La base de l'URL absolue du nœud, ou null si l'implémentation n'a pas réussi à obtenir l'URL absolue.

textContent

Le contenu textuel de ce nœud et de ces descendants.

Notes

Note:

L'extension DOM utilise l'encodage UTF-8. Utilisez utf8_encode() et utf8_decode() pour travailler avec des textes dans l'encodage ISO-8859-1 ou iconv pour d'autre encodages.

Historique

Version | Description
5.6.1 | La propriété textContent a été rendue accessible en écriture (auparavant, elle n'était qu'en lecture seule).

Voir aussi

  • » spécification W3C

Sommaire

  • DOMNode::appendChild — Ajoute un nouveau fils à la fin des fils
  • DOMNode::C14N — Canonise des nœuds en une chaîne
  • DOMNode::C14NFile — Canonise des nœuds en fichier
  • DOMNode::cloneNode — Clone un nœud
  • DOMNode::getLineNo — Lit le numéro de ligne d'un noeud
  • DOMNode::getNodePath — Récupère un XPath pour un nœud
  • DOMNode::hasAttributes — Vérifie si le noeud possède un attribut
  • DOMNode::hasChildNodes — Vérifie si le noeud possède des enfants
  • DOMNode::insertBefore — Ajoute un nouveau fils avant le nœud référencé
  • DOMNode::isDefaultNamespace — Vérifie si l'espace de nom spécifié est l'espace de noms par défaut ou non
  • DOMNode::isSameNode — Indique si deux nœuds sont identiques
  • DOMNode::isSupported — Vérifie si la fonctionnalité est disponible pour la version spécifiée
  • DOMNode::lookupNamespaceUri — Retourne l'URI de l'espace de noms selon le préfixe
  • DOMNode::lookupPrefix — Retourne le préfixe de l'espace de noms selon l'URI de l'espace de noms
  • DOMNode::normalize — Normalise le noeud
  • DOMNode::removeChild — Supprime un fils de la liste des enfants
  • DOMNode::replaceChild — Remplace un fils

User Contributed Notes

Anonymous 06-May-2018 04:12
It would be helpful if docs for concrete properties mentioned readonly status of some properties:
"
ownerDocument

    The DOMDocument object associated with this node.

"
zlk1214 at gmail dot com 15-Jan-2016 01:07
A function that can set the inner HTML without encoding error. $html can be broken content such as "<a ID=id20>ssss"
function setInnerHTML($node, $html) {
    removeChildren($node);
    if (empty($html)) {
        return;
    }

    $doc = $node->ownerDocument;
    $htmlclip = new DOMDocument();
    $htmlclip->loadHTML('<meta http-equiv="Content-Type" content="text/html;CHARSET=Windows-1252"><div>' . $html . '</div>');
    $clipNode = $doc->importNode($htmlclip->documentElement->lastChild->firstChild, true);
    while ($item = $clipNode->firstChild) {
        $node->appendChild($item);
    }
}
metanull 24-Jul-2014 03:11
Yet another DOMNode to php array conversion function.
Other ones on this page are generating too "complex" arrays; this one should keep the array as tidy as possible.
Note: make sure to set LIBXML_NOBLANKS when calling DOMDocument::load, loadXML or loadHTML
See: http://be2.php.net/manual/en/libxml.constants.php
See: http://be2.php.net/manual/en/domdocument.loadxml.php

<?php
         /**
         * Returns an array representation of a DOMNode
         * Note, make sure to use the LIBXML_NOBLANKS flag when loading XML into the DOMDocument
         * @param DOMDocument $dom
         * @param DOMNode $node
         * @return array
         */
        function nodeToArray( $dom, $node) {
            if(!is_a( $dom, 'DOMDocument' ) || !is_a( $node, 'DOMNode' )) {
                return false;
            }
            $array = false;
            if( empty( trim( $node->localName ))) {// Discard empty nodes
                return false;
            }
            if( XML_TEXT_NODE == $node->nodeType ) {
                return $node->nodeValue;
            }
            foreach ($node->attributes as $attr) {
                $array['@'.$attr->localName] = $attr->nodeValue;
            }
            foreach ($node->childNodes as $childNode) {
                if ( 1 == $childNode->childNodes->length && XML_TEXT_NODE == $childNode->firstChild->nodeType ) {
                    $array[$childNode->localName] = $childNode->nodeValue;
                }  else {
                    if( false !== ($a = self::nodeToArray( $dom, $childNode))) {
                        $array[$childNode->localName] =     $a;
                    }
                }
            }
            return $array;
        }
?>
pizarropablo at gmail dot com 16-Apr-2014 02:36
In response to: alastair dot dallas at gmail dot com about "#text" nodes.
"#text" nodes appear when there are spaces or new lines between end tag and next initial tag.

Eg "<data><age>10</age>[SPACES]<other>20</other>[SPACES]</data>"

"data" childNodes has 4 childs:
- age = 10
- #text = spaces
- other = 20
- #text =  spaces
matej dot golian at gmail dot com 29-Aug-2013 01:15
Here is a little function that truncates a DomNode to a specified number of text characters. I use it to generate HTML excerpts for my blog entries.

<?php

function makehtmlexcerpt(DomNode $html, $excerptlength)
{
$remove = 0;
$htmllength = strlen(html_entity_decode($html->textContent, ENT_QUOTES, 'UTF-8'));
$truncate = $htmllength - $excerptlength;
if($htmllength > $excerptlength)
{
if($html->hasChildNodes())
{
$children = $html->childNodes;
for($counter = 0; $counter < $children->length; $counter ++)
{
$child = $children->item($children->length - ($counter + 1));
$childlength = strlen(html_entity_decode($child->textContent, ENT_QUOTES, 'UTF-8'));
if($childlength <= $truncate)
{
$remove ++;
$truncate = $truncate - $childlength;
}
else
{
$child = makehtmlexcerpt($child, $childlength - $truncate);
break;
}
}
if($remove != 0)
{
for($counter = 0; $counter < $remove; $counter ++)
{
$html->removeChild($html->lastChild);
}
}
}
else
{
if($html->nodeName == '#text')
{
$html->nodeValue = substr(html_entity_decode($html->nodeValue, ENT_QUOTES, 'UTF-8'), 0, $htmllength - $truncate);
}
}
}
return $html;
}

?>
alastair dot dallas at gmail dot com 25-Sep-2011 08:44
The issues around mixed content took me some experimentation to remember, so I thought I'd add this note to save others time.

When your markup is something like: <div><p>First text.</p><ul><li><p>First bullet</p></li></ul></div>, you'll get XML_ELEMENT_NODEs that are quite regular. The <div> has children <p> and <ul> and the nodeValue for both <p>s yields the text you expect.

But when your markup is more like <p>This is <b>bold</b> and this is <i>italic</i>.</p>, you realize that the nodeValue for XML_ELEMENT_NODEs is not reliable. In this case, you need to look at the <p>'s child nodes. For this example, the <p> has children: #text, <b>, #text, <i>, #text.

In this example, the nodeValue of <b> and <i> is the same as their #text children. But you could have markup like: <p>This <b>is bold and <i>bold italic</i></b>, you see?</p>. In this case, you need to look at the children of <b>, which will be #text, <i>, because the nodeValue of <b> will not be sufficient.

XML_TEXT_NODEs have no children and are always named '#text'. Depending on how whitespace is handled, your tree may have "empty" #text nodes as children of <body> and elsewhere.

Attributes are nodes, but I had forgotten that they are not in the tree expressed by childNodes. Walking the full tree using childNodes will not visit any attribute nodes.
imranomar at gmail dot com 20-Mar-2011 06:10
Just discovered that node->nodeValue strips out all the tags
I. Cook 19-Apr-2010 02:43
For a reference with more information about the XML DOM node types, see http://www.w3schools.com/dom/dom_nodetype.asp

(When using PHP DOMNode, these constants need to be prefaced with "XML_")
R. Studer 13-Jan-2010 09:03
For clarification:
The assumingly 'discoverd' by previous posters and seemingly undocumented methods (.getElementsByTagName and .getAttribute) on this class (DOMNode) are in fact methods of the class DOMElement, which inherits from DOMNode.

See: http://www.php.net/manual/en/class.domelement.php
David Rekowski 08-Jan-2010 01:54
You cannot simply overwrite $textContent, to replace the text content of a DOMNode, as the missing readonly flag suggests. Instead you have to do something like this:

<?php

$node->removeChild($node->firstChild);
$node->appendChild(new DOMText('new text content'));

?>

This example shows what happens:

<?php

$doc = DOMDocument::loadXML('<node>old content</node>');
$node = $doc->getElementsByTagName('node')->item(0);
echo "Content 1: ".$node->textContent."\n";

$node->textContent = 'new content';
echo "Content 2: ".$node->textContent."\n";

$newText = new DOMText('new content');

$node->appendChild($newText);
echo "Content 3: ".$node->textContent."\n";

$node->removeChild($node->firstChild);
$node->appendChild($newText);
echo "Content 4: ".$node->textContent."\n";

?>

The output is:

Content 1: old content // starting content
Content 2: old content // trying to replace overwriting $node->textContent
Content 3: old contentnew content // simply appending the new text node
Content 4: new content // removing firstchild before appending the new text node

If you want to have a CDATA section, use this:

<?php
$doc = DOMDocument::loadXML('<node>old content</node>');
$node = $doc->getElementsByTagName('node')->item(0);
$node->removeChild($node->firstChild);
$newText = $doc->createCDATASection('new cdata content');
$node->appendChild($newText);
echo "Content withCDATA: ".$doc->saveXML($node)."\n";
?>
Steve K 03-Nov-2009 11:47
This class apparently also has a getElementsByTagName method.

I was able to confirm this by evaluating the output from DOMNodeList->item() against various tests with the is_a() function.
marc at ermshaus dot org 05-May-2009 08:36
It took me forever to find a mapping for the XML_*_NODE constants. So I thought, it'd be handy to paste it here:

 1 XML_ELEMENT_NODE
 2 XML_ATTRIBUTE_NODE
 3 XML_TEXT_NODE
 4 XML_CDATA_SECTION_NODE
 5 XML_ENTITY_REFERENCE_NODE
 6 XML_ENTITY_NODE
 7 XML_PROCESSING_INSTRUCTION_NODE
 8 XML_COMMENT_NODE
 9 XML_DOCUMENT_NODE
10 XML_DOCUMENT_TYPE_NODE
11 XML_DOCUMENT_FRAGMENT_NODE
12 XML_NOTATION_NODE
matt at lamplightdb dot co dot uk 06-Apr-2009 05:39
And apparently also a setAttribute method too:

$node->setAttribute( 'attrName' , 'value' );
brian wildwoodassociates.info 07-Dec-2008 11:27
This class has a getAttribute method.

Assume that a DOMNode object $ref contained an anchor taken out of a DOMNode List.  Then

    $url = $ref->getAttribute('href');

would isolate the url associated with the href part of the anchor.


Ajoute un nouveau fils à la fin des fils

  • « DOMNode
  • DOMNode::C14N »
  • PHP Manual
  • DOMNode
  • Ajoute un nouveau fils à la fin des fils

DOMNode::appendChild

(PHP 5, PHP 7)

DOMNode::appendChild — Ajoute un nouveau fils à la fin des fils

Description

public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false

Cette fonction ajoute un fils à une liste de fils existante ou crée une nouvelle liste de fils. Le fils peut être créé avec, e.g. DOMDocument::createElement(), DOMDocument::createTextNode(), etc. ou simplement en utilisant tout autre nœud.

Lors de l'utilisation d'un nœud existant, il sera supprimé.

Liste de paramètres

node

Le nœud fils à ajouter.

Valeurs de retour

Le nœud fils ajouté.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Lancé si le nœud est en lecture seule ou si le parent précédent le nœud à insérer est en lecture seule.

DOM_HIERARCHY_REQUEST_ERR

Lancé si le nœud est d'un type qui n'autorise pas d'enfant du type du nœud node, ou si le nœud à ajouter est un des nœuds ancêtres ou ce nœud lui-même.

DOM_WRONG_DOCUMENT_ERR

Lancé si node a été créé depuis un document différent que celui qui a créé ce nœud.

Exemples

L'exemple suivant ajoutera un nouveau nœud à un document nouveau.

Exemple #1 Ajout d'un fils

<?php

$doc = new DOMDocument;

$node = $doc->createElement("para");
$newnode = $doc->appendChild($node);

echo $doc->saveXML();
?>

Exemple #2 Enfant imbriqué

<?php

$doc = new DOMDocument;

$headNode = $doc->createElement("head");
$doc->appendChild($headNode);

$titleNode = $doc->createElement("title");
$headNode->appendChild($titleNode);

echo $doc->saveXML();
?>

Voir aussi

  • DOMNode::insertBefore() - Ajoute un nouveau fils avant le nœud référencé
  • DOMNode::removeChild() - Supprime un fils de la liste des enfants
  • DOMNode::replaceChild() - Remplace un fils

User Contributed Notes

cweiske at php dot net 05-Nov-2017 01:56
If you want to move the children of one node to another, you cannot simply iterate on $element->childNodes - you have to make an array first:

<?php
$children = [];
foreach ($elemWithChildren->childNodes as $child) {
    $children[] = $child;
}
foreach ($children as $child) {
    $targetElement->appendChild($child);
}
?>
frame at dynamiccreated dot de 01-Dec-2010 04:14
Aware dealing with DOMNodeList and appendChild() on the same Node.

If you want to replace only the children not the DOMElement itself you probably foreach childNodes-property or get the DOMElements with a for-loop and item()-method of the DOMNodeList.

You will fail if you not clone the received single DOMElement. Actually the count of the DOMNodelist will be decreased on appendChild count but appendChild seems to refer to the old Nodelist and nothing visible will happen. Cloning will help.
krisdover at hotmail dot com 31-May-2008 08:49
What's not mentioned here is that DOMNode::appendChild() can also be used to move an existing node to another part of the DOMDocument, e.g.

<?php
$doc = new DOMDocument();
$doc->loadXML("<foobar><bar/><foo/></foobar>");
$bar = $doc->documentElement->firstChild;
$foo = $doc->documentElement->lastChild;
$foo->appendChild($bar);
print $doc->saveXML();
?>

This produces:

<?xml version="1.0"?>
<foobar><foo><bar/></foo></foobar>

Note that the nodes "<foo/>" and "<bar/>" were siblings, i.e. the first and last child of "<foobar>" but using appendChild() we were able to move "<bar/>" so that it is a child of "<foo/>".

This saves you the trouble of doing a DOMNode::removeChild($bar) to remove "<bar/>" before appending it as a child of "<foo/>".

Kris Dover
jrtayloriv at gmail dot com 30-Mar-2008 04:56
If you want to create nested DOM elements:

<?php
    $doc = new DOMDocument();

    $foo = $doc->createElement("foo");
    $doc->appendChild($foo);

    $bar = $doc->createElement("bar");
    $foo->appendChild($bar);

    $bazz = $doc->createElement("bazz");
    $foo->appendChild($bazz);

    echo $doc->saveXML();
?>

Is equivalent to:

<foo>
  <bar></bar>
  <bazz></bazz>
</foo>


Canonise des nœuds en une chaîne

  • « DOMNode::appendChild
  • DOMNode::C14NFile »
  • PHP Manual
  • DOMNode
  • Canonise des nœuds en une chaîne

DOMNode::C14N

(PHP 5 >= 5.2.0, PHP 7)

DOMNode::C14N — Canonise des nœuds en une chaîne

Description

public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false

Canonise des nœuds en une chaîne de caractères.

Liste de paramètres

exclusive

Active l'analyse des seuls nœuds correspondant à l'Xpath ou aux préfixes d'espace de noms fournis.

withComments

Conserve les commentaires dans la sortie.

xpath

Un tableau de xpath utilisés pour filtrer les nœuds.

nsPrefixes

Un tableau de préfixes d'espaces de noms utilisés pour filtrer les nœuds.

Valeurs de retour

Retourne les nœuds canonisés, sous la forme d'une chaîne de caractères ou false si une erreur survient

Voir aussi

  • DOMNode::C14NFile() - Canonise des nœuds en fichier

User Contributed Notes

lordbaco 28-Jan-2016 09:57
Good to know:

<< Due to a known issue in XML canonicalization in PHP, processing large metadata files in SimpleSAMLphp takes a big amount of resources, with that amount growing approximately by the square of the number of entities in the metadata set >>
https://simplesamlphp.org/metaprocessing

<< The C14N() function appears to have a runtime that is O(N^2) (or possibly worse?) depending on input size, which means that it becomes very slow as the input grows. For example, an input with around 196000 nodes takes about 290 seconds, while an input with 486000 nodes takes 2200 seconds. >>
https://bugs.php.net/bug.php?id=53655

We had the same issue with a 4.1 MB XML (105k lines). The sample code of ticket  #53655 takes 1h36 minute to canonicalize it!
jorda at edpsciences dot org 13-Mar-2015 09:11
C14N() returns an empty string if the node is not included in the document tree:
<?php
$d = new DOMDocument('1.0');
$d->loadXML('<foo></foo>');
$n = $d->createElement('bar');
var_dump($n->C14N());
$d->documentElement->appendChild($n);
var_dump($n->C14N());
?>
output:
string(0) ""
string(11) "<bar></bar>"
Rijk 27-Mar-2013 09:26
When working with (malformed) HTML, you're probably better off using DOMDocument's saveHTML() method instead. C14N() will attempt to make your HTML valid XML, for example by converting <br> to <br></br>.

So instead of:
$html = $Node->C14N();

Use:
$html = $Node->ownerDocument->saveHTML( $Node );


Canonise des nœuds en fichier

  • « DOMNode::C14N
  • DOMNode::cloneNode »
  • PHP Manual
  • DOMNode
  • Canonise des nœuds en fichier

DOMNode::C14NFile

(PHP 5 >= 5.2.0, PHP 7)

DOMNode::C14NFile — Canonise des nœuds en fichier

Description

public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false

Canonise des nœuds en fichier.

Liste de paramètres

uri

Chemin vers lequel le fichier sera créé.

exclusive

Active l'analyse des seuls nœuds correspondant à l'xpath ou préfixes d'espace de noms fournis.

withComments

Conserve les commentaires dans la sortie.

xpath

Un tableau d'xpath utilisés pour filtrer les nœuds.

nsPrefixes

Un tableau de préfixes d'espace de noms utilisés pour filtrer les nœuds.

Valeurs de retour

Nombre d'octets écrits ou false si une erreur survient

Voir aussi

  • DOMNode::C14N() - Canonise des nœuds en une chaîne

User Contributed Notes

There are no user contributed notes for this page.


Clone un nœud

  • « DOMNode::C14NFile
  • DOMNode::getLineNo »
  • PHP Manual
  • DOMNode
  • Clone un nœud

DOMNode::cloneNode

(PHP 5, PHP 7)

DOMNode::cloneNode — Clone un nœud

Description

public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false

Crée une copie d'un nœud.

Liste de paramètres

deep

Indique si l'on doit copier tous les nœuds fils. Ce paramètre vaut false par défaut.

Valeurs de retour

Le nœud cloné.

User Contributed Notes

cmd at 1xinternet dot de 16-Nov-2016 12:11
If you need to clone node including all child DOMNode elements:

private function cloneNode($node){

        $nd = new DOMNode();

        for ($i = 0; $i < $node->childNodes->length; $i++) {
            $child = $node->childNodes->item($i);
            if ($child->nodeType === XML_TEXT_NODE) {
                $nd->appendChild($node->cloneNode(true));
            }
            else{
                $nd->appendChild($this->cloneNode($child));
            }
        }

        return $nd;
    }
h-fate at gmx dot net 01-Oct-2014 07:48
If you have an object that holds a DOMNode, cloning the object won't clone the DOMNode with it. If you simply copy the object or add its DOMNode several times, you will in fact only move the DOMNode in the tree, not multiply it. That might seem obvious, but took me half a day to find out.

The object needs to use __clone and clone the node manually:

<?php
class containsNode {
    public $node; //set from somewhere

    public function __clone() {
        $this->node = $this->node->cloneNode(TRUE);
    }
}
?>
frame at dynamiccreated dot de 02-Dec-2012 02:19
Remeber that DOMNode always needs a reference to a parent node or DOMDocument.

For example, if you try to clone a node - copy all children - and overwrite or delete the variable which holds the cloned node - all children will loose any reference and getting invalid.

This will cause a nice message like "Couldn't... node no longer exists" if you have luck. In most cases PHP only gives you the poor information "Couldn't fetch DOM[...]" which makes hard to find out whats going on, depending on the current operation.
cemkalyoncu at gmail dot com 28-Apr-2009 03:04
If you need some function to clone a node without touching namespaces you can use the following.

<?php
private function cloneNode($node,$doc){
    $nd=$doc->createElement($node->nodeName);

    foreach($node->attributes as $value)
        $nd->setAttribute($value->nodeName,$value->value);

    if(!$node->childNodes)
        return $nd;

    foreach($node->childNodes as $child) {
        if($child->nodeName=="#text")
            $nd->appendChild($doc->createTextNode($child->nodeValue));
        else
            $nd->appendChild(cloneNode($child,$doc));
    }

    return $nd;
}
?>
[montana] at [percepticon] dot [com] 16-Feb-2009 02:23
<?php

//@oliver thanks for example source...

/*
 cloneNode(false) does not omit
 Attributes of cloned node,
 to achieve this an iteration is required.
 this is probably less efficient
 than merely creating a new
 node from the desired nodeName
 but in some cases could be useful.

use case:

omit subnodes and attributes of
secured portions of an xml document
without altering expected general structure;
*/
//xml to use

$file="<?xml version='1.0'?>
<book type='paperback'>
    <title name='MAP'>Red Nails</title>
    <price>$12.99</price>
    <author>
        <name first='Robert' middle='E' last='Howard'/>
        <birthdate disco='false' nirvana='definitely'>
            9/21/1977
            <month title='september' />
        </birthdate>
    </author>
    <author>
        <name first='Arthur' middle='Mc' last='Kayn'/>
    </author>
</book>";

$doc = new domDocument;

$doc->loadXML($file);

$xpath = new domXPath($doc);

$query = "//author/birthdate";
$xpathQuery = $xpath->query($query);

//would be a loop in production code...
$child = $xpathQuery->item(0);

$parent = $child->parentNode;

$doppel = $child->cloneNode(false);

$limit = $doppel->attributes->length;

for ($a=0;$a<$limit;$a++) {
    $doppel->removeAttributeNode($doppel->attributes->item(0));
}
//swap for now empty node
$parent->replaceChild( $doppel, $child);

print $doc->saveXML();

?>
oliver dot christen at camptocamp dot com 19-Nov-2004 08:48
simple exemple of node cloning

<?xml version="1.0"?>

<book type="paperback">
    <title name='MAP'>Red Nails</title>
    <price>$12.99</price>
    <author>
        <name first="Robert" middle="E" last="Howard"/>
        <birthdate>9/21/1977</birthdate>
    </author>
    <author>
        <name first="Arthur" middle="Mc" last="Kayn"/>
    </author>
</book>

<?php

//filename xml file to use
$file = 'book.xml';

$doc = new domDocument;

if (file_exists($file)) {
    $doc->load($file);
} else {
    exit('Erreur !.');
}

$xpath = new domXPath($doc);

$query = "//author/*";
$xpathQuery = $xpath->query($query);

$size = $xpathQuery->length;
for ($i=0; $i<$size; $i++){
    $node = $xpathQuery->item($i);
    if ($node->nodeName == 'birthdate' && $node->hasChildNodes() && $node->firstChild->textContent != ''){
        $clonenode = $node->cloneNode(true);
        $refnode = $node;
    }
}
for ($i=0; $i<$size; $i++){
    $node = $xpathQuery->item($i);
    if (!$node->isSameNode($refnode)){
        $newnode = $node->appendChild($clonenode);
    }
}

print $doc->saveXML();

?>


Lit le numéro de ligne d'un noeud

  • « DOMNode::cloneNode
  • DOMNode::getNodePath »
  • PHP Manual
  • DOMNode
  • Lit le numéro de ligne d'un noeud

DOMNode::getLineNo

(PHP 5 >= 5.3.0, PHP 7)

DOMNode::getLineNo — Lit le numéro de ligne d'un noeud

Description

public DOMNode::getLineNo ( ) : int

Lit le numéro de ligne d'un noeud.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le numéro de ligne de définition du noeud.

Exemples

Exemple #1 Exemple avec DOMNode::getLineNo()

<?php
// XML de l'exemple
$xml = <<<XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
    <node />
</root>
XML;

// Création d'un objet DOMDocument
$dom = new DOMDocument;

// Chargement du XML
$dom->loadXML($xml);

// Affichage du numéro de ligne du noeud.
printf('Le noeud <node> est défini à la ligne %d', $dom->getElementsByTagName('node')->item(0)->getLineNo());
?>

L'exemple ci-dessus va afficher :

Le noeud <node> est défini à la ligne 3

User Contributed Notes

ruud at vanmelick dot com 25-Oct-2013 09:15
The 65535 line number limit is no longer a problem when you use libxml 2.9 or higher, but you have to explicitly enable support for big line numbers:

<?php
define('XML_PARSE_BIG_LINES', 4194304);
$dom = new DOMDocument;
$dom->loadXML($xml, XML_PARSE_BIG_LINES);
?>
Anonymous 19-May-2012 02:21
The DOMNode::getLineNo() method doesn't work properly due to a libxml2 bug.

https://bugzilla.gnome.org/show_bug.cgi?id=676026
luke dot NOREPLY at webconnex dot com 04-Mar-2011 06:28
This function is buggy. It doesn't always return the correct line number, especially for text elements. As an alternative you can do something like this:

<?php
$text = $node->ownerDocument->saveXML($node);
$line += substr_count($text, "\n");
?>

You'll want to keep a reference to $line (starting at 0) and add to it as you parse over the document recursively.

In order for this to work you have to tell DOMDocument to preserve white space before loading the document.


Récupère un XPath pour un nœud

  • « DOMNode::getLineNo
  • DOMNode::hasAttributes »
  • PHP Manual
  • DOMNode
  • Récupère un XPath pour un nœud

DOMNode::getNodePath

(PHP 5 >= 5.2.0, PHP 7)

DOMNode::getNodePath — Récupère un XPath pour un nœud

Description

public DOMNode::getNodePath ( ) : string|null

Récupère un chemin XPath pour le nœud.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un chaîne de caractères contenant le XPath, ou null si une erreur survient.

Exemples

Exemple #1 Exemple avec DOMNode::getNodePath()

<?php
// Crée une nouvelle instance DOMDocument
$dom = new DOMDocument;

// Charge le XML
$dom->loadXML('
<fruits>
 <apples>
  <apple>braeburn</apple>
  <apple>granny smith</apple>
 </apples>
 <pears>
  <pear>conference</pear>
 </pears>
</fruits>
');

// Affiche le XPath pour chaque élément
foreach ($dom->getElementsByTagName('*') as $node) {
    echo $node->getNodePath() . "\n";
}
?>

L'exemple ci-dessus va afficher :

/fruits
/fruits/apples
/fruits/apples/apple[1]
/fruits/apples/apple[2]
/fruits/pears
/fruits/pears/pear

Voir aussi

  • DOMXPath

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si le noeud possède un attribut

  • « DOMNode::getNodePath
  • DOMNode::hasChildNodes »
  • PHP Manual
  • DOMNode
  • Vérifie si le noeud possède un attribut

DOMNode::hasAttributes

(PHP 5, PHP 7)

DOMNode::hasAttributes — Vérifie si le noeud possède un attribut

Description

public DOMNode::hasAttributes ( ) : bool

Cette méthode vérifie si un noeud possède des attributs. Le noeud testé doit être un XML_ELEMENT_NODE.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • DOMNode::hasChildNodes() - Vérifie si le noeud possède des enfants

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si le noeud possède des enfants

  • « DOMNode::hasAttributes
  • DOMNode::insertBefore »
  • PHP Manual
  • DOMNode
  • Vérifie si le noeud possède des enfants

DOMNode::hasChildNodes

(PHP 5, PHP 7)

DOMNode::hasChildNodes — Vérifie si le noeud possède des enfants

Description

public DOMNode::hasChildNodes ( ) : bool

Cette fonction vérifie si un noeud possède des enfants.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • DOMImplementation::hasFeature() - Teste si l'implémentation DOM implémente une fonctionnalité spécifique

User Contributed Notes

Anonymous 21-Mar-2015 04:33
Hi what if its a dynamic file and we cannot use get elements by tag name then how do we print the contents of all level tags?
richard dot gildx at gmail dot com 29-Jul-2012 01:20
This "hasChildNodes()" exercise is simple enough to make it clear and understandable. Or, you could take it as a tag empty check. By Richard Holm, Sweden.

<?php
$xmldoc=
'<?xml version="1.0" ?>
<root>
<text>Text</text>
<none/>
<empty></empty>
<space> </space>
</root>';

$domdoc=new DOMDocument();
$domdoc->loadXML($xmldoc);

$tag=$domdoc->getElementsByTagName('root')->item(0);
$v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
echo $tag->tagName.$v."<br/>";

$tag=$domdoc->getElementsByTagName('text')->item(0);
$v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
echo $tag->tagName.$v."<br/>";

$tag=$domdoc->getElementsByTagName('none')->item(0);
$v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
echo $tag->tagName.$v."<br/>";

$tag=$domdoc->getElementsByTagName('empty')->item(0);
$v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
echo $tag->tagName.$v."<br/>";

$tag=$domdoc->getElementsByTagName('space')->item(0);
$v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
echo $tag->tagName.$v."<br/>";
?>

Output:
root hasChildNodes
text hasChildNodes
none hasNoChildNodes
empty hasNoChildNodes
space hasChildNodes
sansana 14-Oct-2010 07:04
Personally I think using a simple:[code]if($DOMNode->childNodes <>0){}[/code] works better.
syngcw at syncgw.com 04-Jan-2010 05:53
This function is a bit tricky. If you want to find XML childnodes it is useless. You need to create a work-around:

<?php

$x = new DOMDocument();
$x->loadXML('
<A>
 <B>b-text</B>
 <C>
  <D>d-text</D>
 </C>
 <E/>
</A>');

shownode($x->getElementsByTagName('A')->item(0));
function shownode($x) {
 foreach ($x->childNodes as $p)
  if (hasChild($p)) {
      echo $p->nodeName.' -> CHILDNODES<br>';
      shownode($p);
  } elseif ($p->nodeType == XML_ELEMENT_NODE)
   echo $p->nodeName.' '.$p->nodeValue.'<br>';
}
function hasChild($p) {
 if ($p->hasChildNodes()) {
  foreach ($p->childNodes as $c) {
   if ($c->nodeType == XML_ELEMENT_NODE)
    return true;
  }
 }
 return false;
}

?>

shows:
B b-text
C -> CHILDNODES
D d-text
E
jintoppy at gmail dot com 28-Apr-2009 04:13
<?php

$doc = new DOMDocument;
$node = $doc->createElement("FirstMain", "First Main Node. This have child");
$doc->appendChild($node);
$childnode = $doc->createElement("childnode", "child node");
$node->appendChild($childnode);
$secondnode = $doc->createElement("SecondMain", "First Main Node. This don't have child");
$doc->appendChild($secondnode);
$doc->saveXML();
$nodeElmt = $doc->getElementsByTagName("FirstMain");
/*
if given as $nodeElmt = $doc->getElementsByTagName("childnode");
the output would be "This node has childnodes"

if given as $nodeElmt = $doc->getElementsByTagName("SecondMain");
the output would be "This node has no childnodes"

*/

foreach($nodeElmt as $nodeElmt)
{
if($nodeElmt->hasChildNodes())
{
echo "This node has childnodes";
}
else
{
echo "This node has no childnodes";
}
}

  ?>

- - - - - - - - - - - - - -

Output:

This node has childnodes

- - - - - - - - - - - - - -


Ajoute un nouveau fils avant le nœud référencé

  • « DOMNode::hasChildNodes
  • DOMNode::isDefaultNamespace »
  • PHP Manual
  • DOMNode
  • Ajoute un nouveau fils avant le nœud référencé

DOMNode::insertBefore

(PHP 5, PHP 7)

DOMNode::insertBefore — Ajoute un nouveau fils avant le nœud référencé

Description

public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false

Cette fonction insère un nouveau nœud juste avant le nœud de référence. Si vous comptez faire des modifications plus tard sur l'enfant ajouté, vous devez utiliser le nœud retourné.

Lors de l'utilisation d'un nœud existant, il sera supprimé.

Liste de paramètres

node

Le nouveau nœud.

child

Le nœud référencé. Si non spécifié, node sera ajouté aux fils.

Valeurs de retour

Le nœud inséré.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Lancé si le nœud est en lecture seule ou si le parent précédent le nœud à insérer est en lecture seule.

DOM_HIERARCHY_REQUEST_ERR

Lancé si ce nœud est d'un type qui n'autorise pas de fils du type du nœud node, ou si le nœud à ajouter est un des ancêtres de ce nœud ou ce nœud lui-même.

DOM_WRONG_DOCUMENT_ERR

Lancé si node a été créé depuis un document différent que celui qui a créé ce nœud.

DOM_NOT_FOUND

Lancé si child n'est pas un fils de ce nœud.

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils

User Contributed Notes

jarry1250 at gmail dot com 30-May-2015 01:59
Note that supplying the same node for $newnode and $refnode leads to an E_WARNING ("Couldn't add newnode as the previous sibling of refnode"). For example imagine one wanted to make $newnode the first child of its parent by doing:

<?php
$firstSibling = $newnode->parentNode->firstChild;
// Bad:
$newnode->parentNode->insertBefore( $newnode, $firstSibling );
?>

This would generate a warning if it already was the first child of its parent, since $newnode and $firstSibling are identical. Easy to work around though:

<?php
$firstSibling = $newnode->parentNode->firstChild;
// Better:
if( $newnode !== $firstSibling ) {
    $newnode->parentNode->insertBefore( $newnode, $firstSibling );
}
?>
DrTebi at Yahoo 03-Oct-2007 05:54
Sorry, my previous posting worked only for the top node. Here the corrected version, which will work for any node:

XML
----
<?xml version="1.0"?>
<contacts>
  <person>Adam</person>
  <person>Eva</person>
  <person>Thomas</person>
</contacts>

PHP
---
<?php
// load XML, create XPath object
$xml = new DomDocument();
$xml->preserveWhitespace = false;
$xml->load('contacts.xml');
$xpath = new DOMXPath($xml);

// get node eva, which we will append to
$eva = $xpath->query('/contacts/person[.="Eva"]')->item(0);

// create node john
$john = $xml->createElement('person', 'John');

// insert john after eva
//   "in eva's parent node (=contacts) insert
//   john before eva's next node"
// this also works if eva would be the last node
$eva->parentNode->insertBefore($john, $eva->nextSibling);

// show result
header('Content-Type: text/plain');
print $xml->saveXML();
?>

Result
------
<?xml version="1.0"?>
<contacts>
  <person>Adam</person>
  <person>Eva</person><person>John</person>
  <person>Thomas</person>
</contacts>
justin at redwiredesign dot com 07-Feb-2007 08:20
The previous example is incorrect, and causes a DOM_NOT_FOUND error, as the child nodes are not direct descendants of the root node.

Therefore, the line:

$parent_path = "/root";

needs to change to:

$parent_path = "/root/parent";

or

$parent_path = "//parent";

for this example to work
jg at handcode dot de 18-Aug-2005 12:18
example to insert <newnode/> between <chid1/> and <child2/>

<?xml version="1.0" encoding="ISO-8859-1" ?>
<root>
  <parent>
    <child nr="1"/>
    <child nr="2"/>
  </parent>
</root>

<?php

$xml_src = 'test.xml';

// XPath-Querys
$parent_path = "//parent";
$next_path = "//parent/child[@nr='2']";

// Create a new DOM document
$dom = new DomDocument();
$dom->load($xml_src);

// Find the parent node
$xpath = new DomXPath($dom);

// Find parent node
$parent = $xpath->query($parent_path);

// new node will be inserted before this node
$next = $xpath->query($next_path);

// Create the new element
$element = $dom->createElement('newnode');

// Insert the new element
$parent->item(0)->insertBefore($element, $next->item(0));

echo $dom->saveXML();

?>
Jerry Ellis 03-Jun-2005 12:45
1st argument) a node to insert
2nd argument) a reference node - this is the node that the new node will be inserted before

The trick to using this method is that the OBJECT on which you actually CALL the insertBefore() method is actually the PARENT node of the reference node!

INCORRECT:
$DOMNode_refNode->insertBefore($DOMNode_newNode, $DOMNode_refNode);

CORRECT:
$DOMNode_refNode->parentNode->insertBefore($DOMNode_newNode, $DOMNode_refNode);


Vérifie si l'espace de nom spécifié est l'espace de noms par défaut ou non

  • « DOMNode::insertBefore
  • DOMNode::isSameNode »
  • PHP Manual
  • DOMNode
  • Vérifie si l'espace de nom spécifié est l'espace de noms par défaut ou non

DOMNode::isDefaultNamespace

(PHP 5, PHP 7)

DOMNode::isDefaultNamespace — Vérifie si l'espace de nom spécifié est l'espace de noms par défaut ou non

Description

public DOMNode::isDefaultNamespace ( string $namespace ) : bool

Vérifie si namespace est l'espace de noms par défaut.

Liste de paramètres

namespace

L'URI de l'espace de noms à vérifier.

Valeurs de retour

Retourne true si namespace est l'espace de noms par défaut, false sinon.

User Contributed Notes

There are no user contributed notes for this page.


Indique si deux nœuds sont identiques

  • « DOMNode::isDefaultNamespace
  • DOMNode::isSupported »
  • PHP Manual
  • DOMNode
  • Indique si deux nœuds sont identiques

DOMNode::isSameNode

(PHP 5, PHP 7)

DOMNode::isSameNode — Indique si deux nœuds sont identiques

Description

public DOMNode::isSameNode ( DOMNode $otherNode ) : bool

Cette fonction indique si deux nœuds sont identiques. La comparaison n'est pas basée sur le contenu.

Liste de paramètres

otherNode

Le nœud à comparer.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si la fonctionnalité est disponible pour la version spécifiée

  • « DOMNode::isSameNode
  • DOMNode::lookupNamespaceUri »
  • PHP Manual
  • DOMNode
  • Vérifie si la fonctionnalité est disponible pour la version spécifiée

DOMNode::isSupported

(PHP 5, PHP 7)

DOMNode::isSupported — Vérifie si la fonctionnalité est disponible pour la version spécifiée

Description

public DOMNode::isSupported ( string $feature , string $version ) : bool

Vérifie si la fonctionnalité feature demandée est supportée par la version version spécifiée.

Liste de paramètres

feature

La fonctionnalité à tester. Voir l'exemple de DOMImplementation::hasFeature() pour une liste de fonctionnalités.

version

Le numéro de la version de la fonctionnalité feature à tester.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • DOMImplementation::hasFeature() - Teste si l'implémentation DOM implémente une fonctionnalité spécifique

User Contributed Notes

There are no user contributed notes for this page.


Retourne l'URI de l'espace de noms selon le préfixe

  • « DOMNode::isSupported
  • DOMNode::lookupPrefix »
  • PHP Manual
  • DOMNode
  • Retourne l'URI de l'espace de noms selon le préfixe

DOMNode::lookupNamespaceUri

(PHP 5, PHP 7)

DOMNode::lookupNamespaceUri — Retourne l'URI de l'espace de noms selon le préfixe

Description

public DOMNode::lookupNamespaceUri ( string $prefix ) : string

Retourne l'URI de l'espace de noms selon le préfixe prefix.

Liste de paramètres

prefix

Le préfixe de l'espace de noms.

Valeurs de retour

L'URI de l'espace de noms de ce noeud.

Voir aussi

  • DOMNode::lookupPrefix() - Retourne le préfixe de l'espace de noms selon l'URI de l'espace de noms

User Contributed Notes

_ michael 30-Apr-2010 02:22
You have to pass *null* to lookupNamespaceURI if you want to read the default namespace. Passing an empty string doesn't work - even though the documentation says that lookupNamespaceURI takes a string as argument (and null would just be converted to an empty string).
lewar 05-Jun-2007 05:20
Simple way to get the URI of the default namespace:

<?php
    $document = new DOMDocument();
    $document->load($xml_file);
    $uri = $document->documentElement->lookupnamespaceURI(NULL);
?>


Retourne le préfixe de l'espace de noms selon l'URI de l'espace de noms

  • « DOMNode::lookupNamespaceUri
  • DOMNode::normalize »
  • PHP Manual
  • DOMNode
  • Retourne le préfixe de l'espace de noms selon l'URI de l'espace de noms

DOMNode::lookupPrefix

(PHP 5, PHP 7)

DOMNode::lookupPrefix — Retourne le préfixe de l'espace de noms selon l'URI de l'espace de noms

Description

public DOMNode::lookupPrefix ( string $namespace ) : string|null

Retourne le préfixe de l'espace du nœud selon l'URI de l'espace de noms.

Liste de paramètres

namespace

L'URI de l'espace de noms.

Valeurs de retour

Le préfixe de l'espace de noms.

Voir aussi

  • DOMNode::lookupNamespaceUri() - Retourne l'URI de l'espace de noms selon le préfixe

User Contributed Notes

There are no user contributed notes for this page.


Normalise le noeud

  • « DOMNode::lookupPrefix
  • DOMNode::removeChild »
  • PHP Manual
  • DOMNode
  • Normalise le noeud

DOMNode::normalize

(PHP 5, PHP 7)

DOMNode::normalize — Normalise le noeud

Description

public DOMNode::normalize ( ) : void

Supprime les noeuds de texte vides et fusionne les noeuds de texte adjacants dans ce noeud ainsi que tous ces enfants.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • » La spécification DOM
  • DOMDocument::normalizeDocument() - Normalise le document

User Contributed Notes

Amir Laher 22-Aug-2005 04:45
This is a quote from the DOM level 2 spec, explaining the normalize() function.
----
normalize
Puts all Text nodes in the full depth of the sub-tree underneath this Node, including attribute nodes, into a "normal" form where only structure (e.g., elements, comments, processing instructions, CDATA sections, and entity references) separates Text nodes, i.e., there are neither adjacent Text nodes nor empty Text nodes. This can be used to ensure that the DOM view of a document is the same as if it were saved and re-loaded, and is useful when operations (such as XPointer [XPointer] lookups) that depend on a particular document tree structure are to be used.
----
(source: http://www.w3.org/TR/DOM-Level-2-Core/core.html)

i.e. the idea of normalize is to make text nodes the same as they would be if the xml document was re-loaded into DOM. It's handy if you want to compare DOM nodes.


Supprime un fils de la liste des enfants

  • « DOMNode::normalize
  • DOMNode::replaceChild »
  • PHP Manual
  • DOMNode
  • Supprime un fils de la liste des enfants

DOMNode::removeChild

(PHP 5, PHP 7)

DOMNode::removeChild — Supprime un fils de la liste des enfants

Description

public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false

Cette fonction supprime un fils de la liste des enfants.

Liste de paramètres

child

Le fils à effacer.

Valeurs de retour

Si le fils ne peut être effacé, la fonction retourne l'ancien fils.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Lancé si le nœud est en lecture seule.

DOM_NOT_FOUND

Lancé si child n'est pas un fils de ce nœud.

Exemples

L'exemple suivant va effacer l'élément chapter de notre document XML.

Exemple #1 Effacement d'un fils

<?php

$doc = new DOMDocument;
$doc->load('book.xml');

$book = $doc->documentElement;

// Nous récupérons le chapitre et l'effaçons du livre
$chapter = $book->getElementsByTagName('chapter')->item(0);
$oldchapter = $book->removeChild($chapter);

echo $doc->saveXML();
?>

L'exemple ci-dessus va afficher :

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
          "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
<book id="listing">
 <title>My lists</title>

</book>

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils
  • DOMNode::replaceChild() - Remplace un fils

User Contributed Notes

nggit@phpindonesia 01-Feb-2019 02:29
You can use foreach to remove multiple elements from a DOMNodeList, only if you use a temporary array or via XPath query.
If not, the simplest way will be:

<?php

while ($element = $nodeList->item(0)) {
    $element->parentNode->removeChild($element);
}

?>
Kenney 28-Mar-2013 10:19
This method will remove all child nodes but leave the attributes (and namespace declarations) intact.

<?php
function removeChildren( &$node )
{
  $node->parentNode->replaceChild(
    $n = $node->cloneNode( false ),
    $node );

  $node = $n;
}
?>
drimsun at gmail dot com 11-Feb-2010 03:37
If you try to remove children of a nested node (e.g. a <ul> list that contains another <ul>) and only remove the first level of child nodes, you'll get a messed-up node object.

Upon re-use of the messed-up node you'll get an error message that says: "Fatal error: Call to a member function blahblah() on a non-object".

To remove ALL child nodes, use this recursive function instead:
<?php
/**
 * Helper function that removes all child nodes of $node recursively
 * (i.e. including child nodes of the child nodes and so forth).
 */
function remove_children(&$node) {
  while ($node->firstChild) {
    while ($node->firstChild->firstChild) {
      remove_children($node->firstChild);
    }
    $node->removeChild($node->firstChild);
  }
}
?>
Justin Carlson 05-Nov-2009 11:46
Just a note, if you remove a node the whitespace it occupied will remain if you save the file.

To avoid this, use $document->preserveWhiteSpace = false;

For Example:

<?php
$document = new DomDocument();
$document->preserveWhiteSpace = false;
?>
crazy888s at hotmail dot com 15-Apr-2009 01:50
You can't remove DOMNodes from a DOMNodeList as you're iterating over them in a foreach loop. For example...

<?php
$domNodeList = $domDocument->getElementsByTagname('p');
foreach ( $domNodeList as $domElement ) {
  //  ...do stuff with $domElement...
  $domElement->parentNode->removeChild($domElement);
}
?>

... will seemingly leave the internal iterator on the foreach out of wack and results will be quite strange. Though, making a queue of items to remove seems to work. For example...

<?php
$domNodeList = $domDocument->getElementsByTagname('p');
$domElemsToRemove = array();
foreach ( $domNodeList as $domElement ) {
  // ...do stuff with $domElement...
  $domElemsToRemove[] = $domElement;
}
foreach( $domElemsToRemove as $domElement ){
  $domElement->parentNode->removeChild($domElement);
}
?>
Justin Sheckler 30-Jan-2009 08:44
These two functions might be helpful to anyone trying to delete a node and all of its children:

<?php
function deleteNode($node) {
    deleteChildren($node);
    $parent = $node->parentNode;
    $oldnode = $parent->removeChild($node);
}

function deleteChildren($node) {
    while (isset($node->firstChild)) {
        deleteChildren($node->firstChild);
        $node->removeChild($node->firstChild);
    }
}
?>
tim cameron ryan 19-Jul-2008 01:00
Or something like:

<?php

while ($node->childNodes->length)
     $node->removeChild($node->firstChild);

?>
Michael D (DigitalGemstones.com) 05-Jul-2008 04:15
Note that iterating through the childNodes array and removing those children will stop the iteration.

For example:
<?php
foreach($node->childNodes as $child)
{
  if(iWantToDeleteThisNode($child))
     $child->parentNode->removeChild($child);
}
?>

Will not work.  Note that in removing the node, the childNodes array gets rebuilt (it seems) and so only the first item will be removed.  In order to properly remove all the children you want to remove, you will need to do something like the following:

<?php
$nodesToDelete = array();
foreach($node->childNodes as $child)
{
  if(iWantToDeleteThisNode($child))
    $nodesToDelete[] = $child;
}
foreach($nodesToDelete as $node)
{
  $node->parentNode->removeChild($node);
}
?>

I believe this is actually more efficient than the first snippet would be (if it worked) but obviously I cannot benchmark it.
Wala 04-Apr-2008 10:57
I used the following to delete an entire node using the child element:

<?php
$childElement->parentNode->parentNode-> removeChild($childElement->parentNode);
?>

I could not have thought of it without the help of everyone who contributed to this thread.

Thanks!

(I had to introduce the extra space between parentNode->removeChild to get rid of the wordwrap() warning while posting this note)
Vasil Rangelov 06-Oct-2007 10:14
At the time of writing, I suppose rightfully, removeChild() removes only the selected node, but when you remove an element, it's child elements are not removed. If you want to achieve that, replaceChild() is the solution.

The following should remove all descendants of the $node DOMNode, regardless of it's name:
<?php
$node->replaceChild(new DOMElement($node->nodeName), $node);
?>
If you're replacing the root element, you must explicitly state that with $node->documentElement as the second argument.
mytto at openxtrem dot com 07-Sep-2005 02:20
Back again on removing childs and iterators robustness.

Things get a bit more complicated when you only want to remove 'some' nodes according to a certain condition. Then you can't just remove the first one repeatedly.

The trick is to copy the content of the node list into a more robust collection than DOMNodeList, I name array!

The following piece of code will, for instance, remove all empty child nodes:

<?php
// Copy childNodes array
$childNodes = array();
foreach($node->childNodes as $childNode) {
  $childNodes[] = $childNode;
}

// Browse with the copy
foreach ($childNodes as $childNode) {
  if (!$childNode->hasChildNodes()); {
    $childNode->parentNode->removeChild($childNode);
  }
}
?>
blaine (at) blainegarrett (dot com) 23-Aug-2005 10:10
This might be obvious, but might help someone as well...

If you simply have a node that you need to remove (perhaps from an xpath) and don't know the parent node offhand (the examples seem to assume you have the parent in a variable), then you can do something easy like this...

$node->parentNode->removeChild($node);

parentNode is a scalar property of the Element.

Hope that helps.

--
Blaine Garrett
pedro at leb dot usp dot br 30-May-2005 04:24
You may also use the hasChild function:
<?php

while($node->hasChildNodes()) {
  $node->removeChild($node->childNodes->item(0));
}

?>

When you remove a childNode, the next node becomes the first one!
vsematika at centrum dot cz 13-Feb-2005 03:35
For those who don't understand >sbeam at onsetcorps dot net on 02-Feb-2005 12:07< 'hack', here's a little discussion:

First but *wrong* try would be:
<?php
foreach ($parent->childNodes as $child) {
   $parent->removeChild($child);
?>
This doesn't work because DOM tree id modified on-the-fly and this confuses foreach loop.

The idea behind sbeam's trick is that after removing the first item in the first iteration, the second item in childNodes nodelist immediately becomes the first item. That's why we must _always_ remove the first child. Here's another implementation:

<?php
$count = $parent->childNodes->length;
for ($i = 0; $i < $count; $i++) {
   $oldNode = $parent->removeChild($parent->childNodes->item(0)); // !!! not item($i) !!!
}
?>


Remplace un fils

  • « DOMNode::removeChild
  • DOMNodeList »
  • PHP Manual
  • DOMNode
  • Remplace un fils

DOMNode::replaceChild

(PHP 5, PHP 7)

DOMNode::replaceChild — Remplace un fils

Description

public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false

Cette fonction remplace le fils child par le nouveau nœud spécifié. Si node est déjà un fils, il ne sera pas ajouté une seconde fois. Si le remplacement réussi, l'ancien nœud sera retourné.

Liste de paramètres

node

Le nouveau nœud. Il doit être membre du document cible, i.e. créé par une des méthodes de DOMDocument->createXXX() ou importé dans le document par DOMDocument::importNode.

child

L'ancien nœud.

Valeurs de retour

L'ancien nœud ou false si une erreur survient.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Lancé si le nœud est en lecture seule ou si le parent précédent du nœud à insérer est en lecture seule.

DOM_HIERARCHY_REQUEST_ERR

Lancé si le nœud est d'un type qui n'autorise pas les fils du type du nœud node, ou si le nœud à insérer est un des ancêtres de ce nœud ou ce nœud lui-même.

DOM_WRONG_DOCUMENT_ERR

Émise si node a été créé depuis un document différent que celui qui a créé ce nœud.

DOM_NOT_FOUND

Lancé si child n'est pas un fils de ce nœud.

Voir aussi

  • DOMNode::appendChild() - Ajoute un nouveau fils à la fin des fils
  • DOMNode::removeChild() - Supprime un fils de la liste des enfants

User Contributed Notes

chealer at gmail dot com 15-Aug-2018 03:07
As of version 5.6, PHP still behaves as reported by jb at jbpros dot com. To use replaceChild() in a loop, the more standard pattern used in the following example can be used:

for ($currentNode = 0; $currentNode < $link->childNodes->length; $currentNode++) {
    $child = $link->childNodes[$currentNode];

    // "Remove" links, since links can't contain links
    if ($child instanceof DOMElement && $child->tagName == 'a') {
        $replacement = $dom->createTextNode($child->textContent);
        $link->replaceChild($replacement, $child);
    }
}
jb at jbpros dot com 01-Mar-2005 08:08
If you are trying to replace more than one node at once, you have to be careful about iterating over the DOMNodeList.  If the old node has a different name from the new node, it will be removed from the list once it has been replaced.  Use a regressive loop:

<?php

$xml = new DOMDocument;
$xml->load('docfile.xml');

$elements = $xml->getElementsByTagNameNS('http://www.example.com/NS/', '*');
$i = $elements->length - 1;
while ($i > -1) {
    $element = $elements->item($i);
    $ignore = false;

    $newelement = $xml>createTextNode('Some new node!');
    $element->parentNode->replaceChild($newelement, $element);
    $i--;
}

?>

The loop counter ($i) will always be in the list's interval as removed elements indexes are above the counter.
aidan at php dot net 26-Dec-2004 02:17
Here is a simple example for replacing a node:

Let's define our XML like so:

<?php
$xml = <<<XML
<?xml version="1.0"?>
<root>
  <parent>
     <child>bar</child>
     <child>foo</child>
  </parent>
</root>
XML;
?>

If we wanted to replace the entire <parent> node, we could do something like this:

<?php
// Create a new document fragment to hold the new <parent> node
$parent = new DomDocument;
$parent_node = $parent ->createElement('parent');

// Add some children
$parent_node->appendChild($parent->createElement('child', 'somevalue'));
$parent_node->appendChild($parent->createElement('child', 'anothervalue'));

// Add the keywordset into the new document
// The $parent variable now holds the new node as a document fragment
$parent->appendChild($parent_node);
?>

Next, we need to locate the old node:

<?php
// Load the XML
$dom = new DomDocument;
$dom->loadXML($xml);

// Locate the old parent node
$xpath = new DOMXpath($dom);
$nodelist = $xpath->query('/root/parent');
$oldnode = $nodelist->item(0);
?>

We then import and replace the new node:

<?php
// Load the $parent document fragment into the current document
$newnode = $dom->importNode($parent->documentElement, true);

// Replace
$oldnode->parentNode->replaceChild($newnode, $oldnode);

// Display
echo $dom->saveXML();
?>

Our new node is successfully imported:

<?xml version="1.0"?>
<root>
<parent><child>somevalue</child><child>anothervalue</child></parent>
</root>
franp at free dot fr 23-Sep-2004 08:39
1) If your XPath query returns a NodeList including a unique item, or if you know for sure the order of the items returned, you can use the "item(n)" syntax instead of the "foreach" syntax.
This can greatly improve you code lisibility.
s the method name implies, replaceChild cannot replace a node itself but a child of a node.
The trick is to use replaceChild on the parent node of your Xpath query result.

<?xml version="1.0" ?>
<action>
 <actionGlobal>
  <actionGlobalFR>sometext</actionGlobalFR>
 <actionGlobal>
</action>

$frag = $doc->createElement("actionGlobalFR");
$fragA = $doc->createTextNode("anothertext");
$frag->appendChild($fragA);

$xpResult = $xp->query("/action/actionGlobal/actionGlobalFR");
$blipblip = $xpResult->item(0)->parentNode->replaceChild($ajout, $xpResult->item(0));

2) Also, as the method name implies, replaceChild cannot replace a node itself but a child of a node.
Still it is possible to replace a node pointed by XPath istead of its child.
The trick is to use replaceChild on the parent node of your Xpath query result.

<?xml version="1.0" ?>
<action>
  <FR>French Text</FR>
</action>

<?php
$frag = $doc->createElement("EN");
$fragA = $doc->createTextNode("English Text");
$frag->appendChild($fragA);

$xpResult = $xp->query("/action/FR");
$blipblip = $xpResult->item(0)->parentNode->replaceChild($fragA, $xpResult->item(0));
?>

Et voil? !

This produces :
<?xml version="1.0" ?>
<action>
  <EN>English Text</EN>
</action>

....................................................

3) Also, be carefull, you CANNOT replace a node that doesn't exist.
While this may seems obvious, it is easy to forget.

Consider this :
<?xml version="1.0" ?>
<action>
  <EN></EN>
</action>

You cannot use replaceChild() to turn this into :
<?xml version="1.0" ?>
<action>
  <EN>Some text</EN>
</action>

The reason is that since the <EN></EN> element is empty, it has no child (this is clearer to understand if you consider that <EN></EN> can be written <EN />).
The fact that you intend to put some text inbetween <EN> and </EN> does not change the fact that it has no text yet, thus no child yet.
When dealing with DOM, do not take your dream for the reality. The DOM parser doen't care about your dreams. If an element is currently empty, it has no child, whatever you intend to fill in.

Thus, the solution to teh problem is to use appendChild intead of replaceChild :

<?php
$fragA = $doc->createTextNode("Some Text");
$xpResult = $xp->query("/action/EN");
$blipblip = $xpResult->item(0)->appendChild($fragA);
?>

This produces the awaited :
<?xml version="1.0" ?>
<action>
  <EN>Some Text</EN>
</action>

....................................................

4) Note that the description of replaceChild in the doc is wrong. Arguments have been inverted.
The correct description is :
object DOMNode->replaceChild (object newnode, object oldnode)


La classe DOMNodeList

(PHP 5, PHP 7)

Synopsis de la classe

DOMNodeList implements Traversable , Countable {
/* Propriétés */
public readonly int $length ;
/* Méthodes */
public count ( ) : int|false
public item ( int $index ) : DOMNode|null
}

Propriétés

length

Le nombre de nœuds dans la liste. L'intervalle valide des indices des nœuds fils est 0 à length - 1, inclus.

Historique

Version | Description
7.2.0 | L'interface Countable est implémentée et la valeur de la propriété length est retournée.

Voir aussi

  • » Les spécifications W3C de NodeList

Sommaire

  • DOMNodeList::count — Récupère le nombre de nœuds dans la collection triée (list)
  • DOMNodeList::item — Retourne un nœud spécifié par son index

User Contributed Notes

ignitedfirestarter at gmail dot com 04-Jul-2012 10:39
If you want to recurse over a DOM then this might help:
<?php

/**
 * PHP's DOM classes are recursive but don't provide an implementation of
 * RecursiveIterator. This class provides a RecursiveIterator for looping over DOMNodeList
 */
class DOMNodeRecursiveIterator extends ArrayIterator implements RecursiveIterator {

  public function __construct (DOMNodeList $node_list) {

    $nodes = array();
    foreach($node_list as $node) {
      $nodes[] = $node;
    }

    parent::__construct($nodes);

  }

  public function getRecursiveIterator(){
    return new RecursiveIteratorIterator($this, RecursiveIteratorIterator::SELF_FIRST);
  }

  public function hasChildren () {
    return $this->current()->hasChildNodes();
  }

  public function getChildren () {
    return new self($this->current()->childNodes);
  }

}
?>
geompse at gmail dot com 19-May-2010 08:39
Note that $length is calculated (php5.3.2).
Iterating over a large NodeList may be time expensive.

Prefer :
$nb = $nodelist->length;
for($pos=0; $pos<$nb; $pos++)

Than:
for($pos=0; $pos<$nodelist->length; $pos++)

I had a hard time figuring that out...
bobvandell at hotmail dot com 26-Aug-2008 09:12
That's actually incorrect. You can use function results as objects. It makes building an API for your database very clean and neat. For example:

Our code:

$articles = Node::screate('tags', 123456)->assets('like:title:test')->articles;

We use the above code to get articles that are linked to assets that are linked to a specific tag in our database.
c dot 1 at smithies dot org 23-May-2008 05:43
You can modify, and even delete, nodes from a DOMNodeList if you iterate backwards:

$els = $document->getElementsByTagName('input');
for ($i = $els->length; --$i >= 0; ) {
  $el = $els->item($i);
  switch ($el->getAttribute('name')) {
    case 'MAX_FILE_SIZE' :
      $el->parentNode->removeChild($el);
    break;
    case 'inputfile' :
      $el->setAttribute('type', 'text');
    //break;
  }
}
drichter at muvicom dot de 14-May-2008 06:11
Addition to my first note:

An traditional for-loop does not allow you to change the DOM-tree while looping - the effects are the nearly the same as with foreach. So you have to collect the nodes in an array and do the tree-altering stuff within a second loop (looping the array this time ...)
drichter at muvicom dot de 14-May-2008 04:56
I have done some testing and have found 2 results:
(My System: Win XP with PHP 5.2.1)

1) Iteration with foreach does function correctly as "james dot j dot hackett at gmail dot com" writes, _if_ you only do readonly stuff with foreach or minor writings of some attributes.

2) foreach does not function, if you are doing some DOM-Operations while iterating. In my situation it was adding the iterated $node as an child to an new node:

$newNode = $dom->createElement('newNode') ;
foreach ($nodeList as $node) {
  echo $node->nodeValue ;
  $newNode->appendChild($node) ;
}

This only gives you the first element ...

I'm interpreting it as an confusing but correct behavior because of the changes within the $dom-object while appending the node at an additional place ...

So, if you want to do something like 2) use for, length and item() :)
james dot j dot hackett at gmail dot com 08-May-2008 09:47
In Response to 'kassah at gmail'

You don't need to convert a DOMNodeList to an array in order iterate through it using 'foreach'.  You can use foreach directly with the DOMNodeList.

$nodeList = $someDomDocument->getElementsbytagname('user');

foreach ($nodeList as $node) {
    echo $node->nodeValue;
}
brack at wjp dot de 21-Apr-2008 02:35
In PHP 5.2.5 (Windows) it is not possible to iterate correctly over the DOMNodeList object returned by DOMNode->childNodes using foreach. Instead I had to use the for loop in conjunction with the item() method of DOMNodeList for iterating over all child nodes correctly.

I don't know whether this is really a bug, but apparently it is.


Récupère le nombre de nœuds dans la collection triée (list)

  • « DOMNodeList
  • DOMNodeList::item »
  • PHP Manual
  • DOMNodeList
  • Récupère le nombre de nœuds dans la collection triée (list)

DOMNodeList::count

(PHP 7 >= 7.2.0)

DOMNodeList::count — Récupère le nombre de nœuds dans la collection triée (list)

Description

public DOMNodeList::count ( ) : int|false

Récupère le nombre de nœuds dans la collection triée (list).

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le nombre de nœuds dans la collection triée, ce qui est identique à la propriété length.

User Contributed Notes

plimpton47 at example dot com 04-May-2018 08:09
Be careful with using this function as it's not available for anything before PHP 7.2, use the length property instead


Retourne un nœud spécifié par son index

  • « DOMNodeList::count
  • DOMNotation »
  • PHP Manual
  • DOMNodeList
  • Retourne un nœud spécifié par son index

DOMNodeList::item

(PHP 5, PHP 7)

DOMNodeList::item — Retourne un nœud spécifié par son index

Description

public DOMNodeList::item ( int $index ) : DOMNode|null

Retourne un nœud spécifié par son index dans l'objet DOMNodeList.

Astuce

Si vous avez besoin de connaître le nombre de nœuds dans la collection, utilisez la propriété length de l'objet DOMNodeList.

Liste de paramètres

index

L'index du nœud dans la collection.

Valeurs de retour

Le nœud à la position index dans la DOMNodeList, ou null si ce n'est pas un index valide.

Exemples

Exemple #1 Parcours de toutes les entrées de la table

<?php

$doc = new DOMDocument;
$doc->load('book.xml');

$items = $doc->getElementsByTagName('entry');

for ($i = 0; $i < $items->length; $i++) {
    echo $items->item($i)->nodeValue . "\n";
}

?>

Alternativement, vous pouvez utiliser la structure foreach, qui est une manière plus convenable :

<?php

foreach ($items as $item) {
    echo $item->nodeValue . "\n";
}

?>

L'exemple ci-dessus va afficher :

Title
Author
Language
ISBN
The Grapes of Wrath
John Steinbeck
en
0140186409
The Pearl
John Steinbeck
en
014017737X
Samarcande
Amine Maalouf
fr
2253051209

User Contributed Notes

jeffpuckett2 at gmail dot com 15-Jun-2016 02:55
DOMNodelist::item can return a DOMElement object, which extends DOMNode class. But it can also return a DOMText object.

<?php
$xml = '
<root>
  <node/>
  <node>
    <sub>more</sub>
  </node>
  <node>
    <sub>another</sub>
  </node>
  <node>value</node>
</root>
';

$doc = new DOMDocument();
$doc->loadXML($xml);

$items = $doc->documentElement->childNodes;
for ($i = 0; $i < $items->length; $i++)
  echo get_class($items->item($i)).PHP_EOL;
?>

Results in this output:

DOMText
DOMElement
DOMText
DOMElement
DOMText
DOMElement
DOMText
DOMElement
DOMText
Anonymous 25-Jun-2012 11:36
calling domnodelist->item($i) with an index $i greater than domnodelist->length - 1 , will return the entire document, will not produce an error, and will not circle back to the start of the list.
Nagy Attila 06-Jan-2011 09:02
DOMNodeList::item does not return in constant time!

If you need to iterate over large nodelist then you'd better use standard navigation.

Instead of:

<?php
foreach ($nodelist as $node) {
    // do something
}
?>

you could do:

<?php
$node = $parentnode->firstChild;

do {
    // do something
} while ($node = $node->nextSibling);
?>
olivier dot berger at it-sudparis dot eu 21-Aug-2008 02:56
It seems that with zend.ze1_compatibility_mode on, the only way to iterate over the items list is with :
for ($i = 0; $i < $nodeList->length; ++$i) {
    $nodeName = $nodeList->item($i)->nodeName;
    $nodeValue = $nodeList->item($i)->nodeValue;
}

As other attemps failed :

for ($i = 0; $i < $nodeList->length; ++$i) {
    $node = &$nodeList->item($i);
    $nodeName = $node->nodeName;
    $nodeValue = $node->nodeValue;
}

or :
foreach ($nodeList as $node) {
    echo $node->nodeName;
    echo $node->nodeValue;
}
vinyanov at poczta dot onet dot pl 05-Jan-2008 10:12
SimpleXML has its own SPL iterator. See http://www.php.net/~helly/php/ext/spl/classSimpleXMLIterator.html . But I guess that there are none for DOM nodes. By the way, two out of three implementations I found over the Net were not recursive, so I wrote my own. Here is the snippet:

<?php

class DOMNodeListIterator implements RecursiveIterator
{
    private
        $nodes,
        $offset;

    function __construct(DOMNodeList $nodes)
    {
        return $this -> nodes = $nodes;
    }

    function rewind()
    {
        return $this -> offset = 0;
    }

    function current()
    {
        return $this -> nodes -> item($this -> offset);
    }

    function key()
    {
        return $this -> current() -> nodeName;
    }

    function next()
    {
        return $this -> offset++;
    }

    function valid()
    {
        return $this -> offset < $this -> nodes -> length;
    }

    function hasChildren()
    {
        return isset($this -> current() -> childNodes -> length) && $this -> current() -> childNodes -> length > 0;
    }

    function getChildren()
    {
        return new self($this -> current() -> childNodes);
    }
}

?>

Remember to use RecursiveIteratorIterator::SELF_FIRST flag when you create your iterator iterator.

<?php

$iterator = new DOMNodeListIterator($document -> childNodes);
$iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);

?>

Should work, has just few minutes though. :)
Hayley Watson 29-Oct-2007 02:14
Keep in mind that DOMNodelists are "live" - changes to the document or node that the DOMNodelist was derived from will be reflected in the DOMNodelist. In other words, a list of a parent node's children will change if you change the parent's children!
james dot dunmore at gmai dot com 27-Jul-2007 08:57
tfg_allardyce at gmail dot com

I have had exactly this problem.

To rectify I've had to do this:
<?php
$old_element = $doc->getElementsByTagName('Element1')->item(0);
$new_element = $doc->createElement('NewElement1');

$old_element_childNodes = $old_element->childNodes;
$length = $old_element_childNodes->length;

for($i = 0; $i < $length; $i++)
{
    $oldChildren_array[] = $old_element_childNodes->item($i);
}

foreach($oldChildren_array as $old_c)
{
    $new_element->appendChild($old_c);
}
?>

Rather than this:
(which I will bug report)
<?php
$old_element = $doc->getElementsByTagName('Element1')->item(0):
$new_element = $doc->createElement('NewElement1');

foreach($old_element->childNode as $node)
{
     $new_element->appendChild($node);
}

?>

Using the latter, randomally removes the children!
Geoffrey Thubron 26-May-2007 02:47
@ tfg_allardyce at gmail dot com

You could loop through the list backwards, that way, you are only ever taking off the last item from the list, and hence wont have disrupted the order.
oliver dot christen at camptocamp dot com 13-Feb-2007 07:27
NodeList are something annoying because you can't output the content with a simple print_r, so I did a little function that add all the node to a new empty DOMDocument and output it as a string.
Have fun.

<?php

public function domNodeList_to_string($DomNodeList) {
    $output = '';
    $doc = new DOMDocument;
    while ( $node = $DomNodeList->item($i) ) {
        // import node
        $domNode = $doc->importNode($node, true);
        // append node
        $doc->appendChild($domNode);
        $i++;
    }
    $output = $doc->saveXML();
    $output = print_r($output, 1);
    // I added this because xml output and ajax do not like each others
    $output = htmlspecialchars($output);
    return $output;
}

?>


La classe DOMNotation

(PHP 5, PHP 7)

Synopsis de la classe

DOMNotation extends DOMNode {
/* Propriétés */
public readonly string $publicId ;
public readonly string $systemId ;
/* Propriétés héritées */
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes héritées */
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Propriétés

publicId

systemId

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMProcessingInstruction

(PHP 5, PHP 7)

Synopsis de la classe

DOMProcessingInstruction extends DOMNode {
/* Propriétés */
public readonly string $target ;
public string $data ;
/* Propriétés héritées */
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes */
public __construct ( string $name , string $value = "" )
/* Méthodes héritées */
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Propriétés

target

data

Sommaire

  • DOMProcessingInstruction::__construct — Crée un nouvel objet DOMProcessingInstruction

User Contributed Notes

There are no user contributed notes for this page.


Crée un nouvel objet DOMProcessingInstruction

  • « DOMProcessingInstruction
  • DOMText »
  • PHP Manual
  • DOMProcessingInstruction
  • Crée un nouvel objet DOMProcessingInstruction

DOMProcessingInstruction::__construct

(PHP 5, PHP 7)

DOMProcessingInstruction::__construct — Crée un nouvel objet DOMProcessingInstruction

Description

public DOMProcessingInstruction::__construct ( string $name , string $value = "" )

Crée un nouvel objet DOMProcessingInstruction. Cet objet est en lecture seule. Il peut être ajouté à un document, mais les nœuds additionnels ne peuvent pas être ajoutés à ce nœud tant qu'il est associé à un document. Pour créer un nœud accessible en écriture, utilisez DOMDocument::createProcessingInstruction.

Liste de paramètres

name

Le nom du tag de l'instruction.

value

La valeur de l'instruction.

Exemples

Exemple #1 Création d'un nouveau DOMProcessingInstruction

<?php

$dom = new DOMDocument('1.0', 'UTF-8');
$html = $dom->appendChild(new DOMElement('html'));
$body = $html->appendChild(new DOMElement('body'));
$pinode = new DOMProcessingInstruction('php', 'echo "Bonjour le monde !"; ');
$body->appendChild($pinode);
echo $dom->saveXML();

?>

L'exemple ci-dessus va afficher :

<?xml version="1.0" encoding="UTF-8"?>
<html><body><?php echo "Bonjour le monde !"; ?></body></html>

Voir aussi

  • DOMDocument::createProcessingInstruction() - Crée un nouveau nœud PI

User Contributed Notes

There are no user contributed notes for this page.


La classe DOMText

(PHP 5, PHP 7)

Introduction

La classe DOMText hérite de DOMCharacterData et représente le contenu textuel de DOMElement ou DOMAttr.

Synopsis de la classe

DOMText extends DOMCharacterData {
/* Propriétés */
public readonly string $wholeText ;
/* Propriétés héritées */
public string $data ;
public readonly int $length ;
public readonly string $nodeName ;
public string $nodeValue ;
public readonly int $nodeType ;
public readonly DOMNode|null $parentNode ;
public readonly DOMNodeList $childNodes ;
public readonly DOMNode|null $firstChild ;
public readonly DOMNode|null $lastChild ;
public readonly DOMNode|null $previousSibling ;
public readonly DOMNode|null $nextSibling ;
public readonly DOMNamedNodeMap|null $attributes ;
public readonly DOMDocument|null $ownerDocument ;
public readonly string|null $namespaceURI ;
public string $prefix ;
public readonly string $localName ;
public readonly string|null $baseURI ;
public string $textContent ;
/* Méthodes */
public __construct ( string $data = "" )
public isElementContentWhitespace ( ) : bool
public isWhitespaceInElementContent ( ) : bool
public splitText ( int $offset ) : DOMText|false
/* Méthodes héritées */
public DOMCharacterData::appendData ( string $data ) : bool
public DOMCharacterData::deleteData ( int $offset , int $count ) : bool
public DOMCharacterData::insertData ( int $offset , string $data ) : bool
public DOMCharacterData::replaceData ( int $offset , int $count , string $data ) : bool
public DOMCharacterData::substringData ( int $offset , int $count ) : string|false
public DOMNode::appendChild ( DOMNode $node ) : DOMNode|false
public DOMNode::C14N ( bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : string|false
public DOMNode::C14NFile ( string $uri , bool $exclusive = false , bool $withComments = false , array|null $xpath = null , array|null $nsPrefixes = null ) : int|false
public DOMNode::cloneNode ( bool $deep = false ) : DOMNode|false
public DOMNode::getLineNo ( ) : int
public DOMNode::getNodePath ( ) : string|null
public DOMNode::hasAttributes ( ) : bool
public DOMNode::hasChildNodes ( ) : bool
public DOMNode::insertBefore ( DOMNode $node , DOMNode|null $child = null ) : DOMNode|false
public DOMNode::isDefaultNamespace ( string $namespace ) : bool
public DOMNode::isSameNode ( DOMNode $otherNode ) : bool
public DOMNode::isSupported ( string $feature , string $version ) : bool
public DOMNode::lookupNamespaceUri ( string $prefix ) : string
public DOMNode::lookupPrefix ( string $namespace ) : string|null
public DOMNode::normalize ( ) : void
public DOMNode::removeChild ( DOMNode $child ) : DOMNode|false
public DOMNode::replaceChild ( DOMNode $node , DOMNode $child ) : DOMNode|false
}

Propriétés

wholeText

Contient tout le texte des nœuds de texte adjacents (c'est à dire, des nœuds qui ne sont pas séparés par des balises Element, Comment ou Processing Instruction).

Sommaire

  • DOMText::__construct — Crée un nouvel objet DOMText
  • DOMText::isElementContentWhitespace — Rapporte si le nœud textuel contient des caractères d'espacement blanc
  • DOMText::isWhitespaceInElementContent — Indique si ce noeud de texte contient des espaces blancs
  • DOMText::splitText — Coupe le nœud en deux nœuds à l'endroit spécifié

User Contributed Notes

Trititaty 20-Oct-2016 11:47
Text replacement function for DOM.

<?php
function domTextReplace( $search, $replace, DOMNode &$domNode, $isRegEx = false ) {
  if ( $domNode->hasChildNodes() ) {
    $children = array();
    // since looping through a DOM being modified is a bad idea we prepare an array:
    foreach ( $domNode->childNodes as $child ) {
      $children[] = $child;
    }
    foreach ( $children as $child ) {
      if ( $child->nodeType === XML_TEXT_NODE ) {
        $oldText = $child->wholeText;
        if ( $isRegEx ) {
          $newText = preg_replace( $search, $replace, $oldText );
        } else {
          $newText = str_replace( $search, $replace, $oldText );
        }
        $newTextNode = $domNode->ownerDocument->createTextNode( $newText );
        $domNode->replaceChild( $newTextNode, $child );
      } else {
        domTextReplace( $search, $replace, $child, $isRegEx );
      }
    }
  }
}


Crée un nouvel objet DOMText

  • « DOMText
  • DOMText::isElementContentWhitespace »
  • PHP Manual
  • DOMText
  • Crée un nouvel objet DOMText

DOMText::__construct

(PHP 5, PHP 7)

DOMText::__construct — Crée un nouvel objet DOMText

Description

public DOMText::__construct ( string $data = "" )

Crée un nouvel objet DOMText.

Liste de paramètres

data

La valeur du nœud texte. Si aucune n'est fournie, un nœud texte vide est créé.

Exemples

Exemple #1 Création d'un nouveau DOMText

<?php

$dom = new DOMDocument('1.0', 'iso-8859-1');
$element = $dom->appendChild(new DOMElement('root'));
$text = $element->appendChild(new DOMText('root value'));
echo $dom->saveXML(); /* <?xml version="1.0" encoding="iso-8859-1"?><root>valeur racine</root> */

?>

Voir aussi

  • DOMDocument::createTextNode() - Crée un nouveau nœud de texte

User Contributed Notes

Thomas 27-Apr-2012 01:54
I experinced that DOMText, given a integer as only value to the constructor failed to return valid data. I had to typecast the input to a string first:

$intValue = 3252; // Post/Zip-code
$some_element->appendChild( new DOMText( (string) $intValue) );

When not typecasting using "(string)" the XML output from $root->saveXML() would not validate.


Rapporte si le nœud textuel contient des caractères d'espacement blanc

  • « DOMText::__construct
  • DOMText::isWhitespaceInElementContent »
  • PHP Manual
  • DOMText
  • Rapporte si le nœud textuel contient des caractères d'espacement blanc

DOMText::isElementContentWhitespace

(No version information available, might only be in Git)

DOMText::isElementContentWhitespace — Rapporte si le nœud textuel contient des caractères d'espacement blanc

Description

public DOMText::isElementContentWhitespace ( ) : bool

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

User Contributed Notes

riking 28-Jun-2018 12:17
This is the recommended (W3C) function name for the equivalent:
http://php.net/manual/en/domtext.iswhitespaceinelementcontent.php

See there for additional notes.


Indique si ce noeud de texte contient des espaces blancs

  • « DOMText::isElementContentWhitespace
  • DOMText::splitText »
  • PHP Manual
  • DOMText
  • Indique si ce noeud de texte contient des espaces blancs

DOMText::isWhitespaceInElementContent

(PHP 5, PHP 7)

DOMText::isWhitespaceInElementContent — Indique si ce noeud de texte contient des espaces blancs

Description

public DOMText::isWhitespaceInElementContent ( ) : bool

Indique si un noeud de texte ne contient que des espaces ou est vide. Cette détermination est faite durant le chargement du document.

Valeurs de retour

Retourne true si le noeud contient zéro ou plusieurs caractères blancs et rien d'autre. Retourne false sinon.

User Contributed Notes

JITR 07-Jul-2007 03:36
To add to `permidion at yahoo dot com''s comment:

Quite true. According to DOM Level 3 Core, the `isWhitespaceInElementContent()' method indicates, whether the node contains `whitespace in element content' (or `element content whitespace' according to the newer spec), see [1].

Btw, it seems the `isWhitespaceInElementContent()' method was replaced with the `isElementContentWhitespace' attribute in the current W3C recommendation, see [2].

I have the feeling, though, it would be more precise with the word `only' added, like: `... indicates, whether the node contains *only* element content whitespace.' This would better correspond with the fact the result is false, when there are any non-whitespace characters present (in addition to the whitespace ones), as already noted.

[1] (please concatenate the following two lines)
http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html
#core-Text3-isWhitespaceInElementContent
[2] (please concatenate the following two lines)
http://www.w3.org/TR/DOM-Level-3-Core/core.html
#Text3-isElementContentWhitespace
permidion at yahoo dot com 28-Oct-2004 08:30
if you have an xml element such as <name>Foo Bar</name> (note the space), isWhitespaceInElementContent will return false.
However it will return true for <name><name> or <name/>
so, that function can be used to determine if the element has a text content or not


Coupe le nœud en deux nœuds à l'endroit spécifié

  • « DOMText::isWhitespaceInElementContent
  • DOMXPath »
  • PHP Manual
  • DOMText
  • Coupe le nœud en deux nœuds à l'endroit spécifié

DOMText::splitText

(PHP 5, PHP 7)

DOMText::splitText — Coupe le nœud en deux nœuds à l'endroit spécifié

Description

public DOMText::splitText ( int $offset ) : DOMText|false

Coupe le nœud en deux nœuds à l'endroit spécifié offset, en gardant les deux dans l'arbre comme parents.

Après la césure, ce nœud contiendra tout le texte jusqu'à offset. Un nouveau nœud avec le reste du texte sera retourné. Si le nœud d'origine possède un parent, le nouveau nœud est inséré à la suite du nœud courant. Lorsque offset est égal à la taille du nœud, le nouveau nœud est vide.

Liste de paramètres

offset

La position de la césure, commençant à 0.

Valeurs de retour

Le nouveau nœud du même type, qui contient tout le contenu à partir de la position offset.

User Contributed Notes

Flix Cloutier 28-Oct-2013 05:31
It should be noted that $offset is a **character offset**, not a **byte offset**. This means that most other PHP string functions that deal with lengths and offsets (strlen, strpos, preg_match with PREG_OFFSET_CAPTURE, etc.) use and return values unsuitable for this method if used with multibyte strings (like UTF-8 strings).

Byte offsets can be converted to character offsets with mb_strlen:

<?php
function char_offset($string, $byte_offset, $encoding = null)
{
    $substr = substr($string, 0, $byte_offset);
    return mb_strlen($substr, $encoding ?: mb_internal_encoding());
}
?>


La classe DOMXPath

(PHP 5, PHP 7)

Introduction

Support de XPath 1.0.

Synopsis de la classe

DOMXPath {
/* Propriétés */
public DOMDocument $document ;
/* Méthodes */
public __construct ( DOMDocument $document , bool $registerNodeNS = true )
public evaluate ( string $expression , DOMNode|null $contextNode = null , bool $registerNodeNS = true ) : mixed
public query ( string $expression , DOMNode|null $contextNode = null , bool $registerNodeNS = true ) : mixed
public registerNamespace ( string $prefix , string $namespace ) : bool
public registerPhpFunctions ( string|array|null $restrict = null ) : void
}

Propriétés

document

Sommaire

  • DOMXPath::__construct — Crée un nouvel objet DOMXPath
  • DOMXPath::evaluate — Évalue une expression XPath donnée et retourne un résultat typé si possible
  • DOMXPath::query — Évalue l'expression XPath donnée
  • DOMXPath::registerNamespace — Enregistre l'espace de noms avec l'objet DOMXPath
  • DOMXPath::registerPhpFunctions — Enregistre une fonction PHP comme fonction XPath

User Contributed Notes

TechNyquist 08-Jan-2020 09:16
When working with XML (as a strict format) might be very important to give a namespace to XPath object in order to make it work properly.

I was experiencing "query" always returning empty node lists, it could not find anything. Only a broad "//*" was able to show off only the root element.

Then found out that registering the namespace reported in the "xmlns" attribute of the root element in the XPath object, and writing the namespace near the elements name, made it work properly.

So for an XML like this (from a sitemap):

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://example.com/index.php</loc>
        <lastmod>2005-01-01</lastmod>
        <changefreq>monthly</changefreq>
        <priority>0.5</priority>
    </url>
</urlset>

I needed the following XPath configuration:

<?php

    $doc = new DOMDocument;
    $doc->load("sitemap.xml");
    $xpath = new DOMXPath($doc);
    $xpath->registerNamespace('ns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
    $nodes = $xpath->query('//ns:urlset/ns:url');

?>

Then again, that "xmlns" could be provided dynamically from the root element attribute of course.
peter at softcoded dot com 03-May-2017 05:51
You may not always know at runtime whether your file has
a namespace or not. This can make it difficult to create
XPath queries. Use the seriously underdocumented
"namespaceURI" property of the documentElement of a
DOMDocument to determine if there is a namespace.
Use code such as the following:

$doc = new DOMDocument();
$doc->load($file);
$xpath = new DOMXPath($doc);
$ns = $doc->documentElement->namespaceURI;
if($ns) {
  $xpath->registerNamespace("ns", $ns);
  $nodes = $xpath->query("//ns:em[@class='glossterm']");
} else {
  $nodes = $xpath->query("//em[@class='glossterm']");
}
//look at nodes here
peter at softcoded dot com 03-May-2017 04:46
Using XPath expressions can save a lot of programming
and allow you to home in on only the nodes you want.
Suppose you want to delete all empty <p> tags.
If you create a query using the following XPath expression,
you can find <p> tags that do not have any text
(other than spaces), any attributes,
any children or comments:

$expression = "//p[not(@*)
   and not(*)
   and not(./comment())
   and normalize-space(text())='']";

This expression will only find para tags that look like:

<p>[any number of spaces]</p>
<p></p>

Imagine the code you would have to add if you used
DOMDocument::getElementsByTagName("p") instead.
archimedix32783262 at mailinator dot com 03-Sep-2014 12:03
Note that evaluate() will use the same encoding as the XML document.

So if you have a UTF-16 XML, you will have to query using UTF-16 strings.

You can use iconv() to convert from your code's encoding to the target encoding for better legibility.
dhz 05-Jan-2011 10:47
I just spent far too much time chasing this one....

When running an xpath query on a table be careful about table internal nodes (ie: <tr></tr>, and <td></td>).  If the master <table> tag is missing, then query() (and likely evaluate() also) will return unexpected results.

I had a DOMNode with a structure like this:

<td>
    <table></table>
    <table>
        <tr>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
        </tr>
    </table>
</td>

Upon which I was trying to do a relative query (ie: <?php $xpath_obj->query('my/x/path', $relative_node); ?>).

But because of the lone outer <td></td> tags, the inner tags were being invalidated, while the nodes were still recognized.  Meaning that the following query would work:

<?php $xpath_obj->query('*[2]/*[*[2]]', $relative_node); ?>

But when replacing any of the "*" tokens with the corresponding (and valid) "table", "tr", or "td" tokens the query would inexplicably break.
david at lionhead dot nl 11-Aug-2009 06:33
When using DOMXPath and having a default namespace. Consider using an intermediate function to add the default namespace to all queries:

<?php
// The default namespace: x:xmlns="http://..."
$path="/Book/Title";
$path=preg_replace("\/([a-zA-Z])","/x:$1",$path);

// Result: /x:Book/x:Title
?>
Mark Omohundro, ajamyajax dot com 14-Dec-2008 09:15
<?php
// to retrieve selected html data, try these DomXPath examples:

$file = $DOCUMENT_ROOT. "test.html";
$doc = new DOMDocument();
$doc->loadHTMLFile($file);

$xpath = new DOMXpath($doc);

// example 1: for everything with an id
//$elements = $xpath->query("//*[@id]");

// example 2: for node data in a selected id
//$elements = $xpath->query("/html/body/div[@id='yourTagIdHere']");

// example 3: same as above with wildcard
$elements = $xpath->query("*/div[@id='yourTagIdHere']");

if (!is_null($elements)) {
  foreach ($elements as $element) {
    echo "<br/>[". $element->nodeName. "]";

    $nodes = $element->childNodes;
    foreach ($nodes as $node) {
      echo $node->nodeValue. "\n";
    }
  }
}
?>


Crée un nouvel objet DOMXPath

  • « DOMXPath
  • DOMXPath::evaluate »
  • PHP Manual
  • DOMXPath
  • Crée un nouvel objet DOMXPath

DOMXPath::__construct

(PHP 5, PHP 7)

DOMXPath::__construct — Crée un nouvel objet DOMXPath

Description

public DOMXPath::__construct ( DOMDocument $document , bool $registerNodeNS = true )

Crée un nouvel objet DOMXPath.

Liste de paramètres

document

L'objet DOMDocument associé à l'objet DOMXPath.

User Contributed Notes

thsoft at vipmail dot hu 04-Jul-2007 04:57
As of PHP 5.2.0, DOMXPath object implements XPath 1.0.
Saulo Vallory 26-Jun-2007 03:23
The DOMXPath object doesn't create a reference to the document. If you load a new xml using either load, loadXML or loadHTML functions the DOMXPath object will still query and evaluate over the source in the DOMDocument when it was created.


Évalue une expression XPath donnée et retourne un résultat typé si possible

  • « DOMXPath::__construct
  • DOMXPath::query »
  • PHP Manual
  • DOMXPath
  • Évalue une expression XPath donnée et retourne un résultat typé si possible

DOMXPath::evaluate

(PHP 5 >= 5.1.0, PHP 7)

DOMXPath::evaluate — Évalue une expression XPath donnée et retourne un résultat typé si possible

Description

public DOMXPath::evaluate ( string $expression , DOMNode|null $contextNode = null , bool $registerNodeNS = true ) : mixed

Exécute l'expression XPath expression et retourne un résultat typé si possible.

Liste de paramètres

expression

L'expression XPath à exécuter.

contextNode

Le paramètre optionnel contextNode peut être spécifié pour effectuer des requêtes XPath relatives. Par défaut, les requêtes sont relatives à l'élément root.

registerNodeNS

Le paramètre optionnel registerNodeNS peut être renseigné pour désactiver l'enregistrement automatique du nœud de contexte.

Valeurs de retour

Retourne un résultat typé si possible ou un DOMNodeList contenant tous les nœuds correspondant à l'expression XPath expression.

Si le paramètre expression est mal formé ou bien si le paramètre contextNode est invalide, la méthode DOMXPath::evaluate() retournera false.

Exemples

Exemple #1 Récupération du nombre total de livres anglais

<?php

$doc = new DOMDocument;

$doc->load('book.xml');

$xpath = new DOMXPath($doc);

$tbody = $doc->getElementsByTagName('tbody')->item(0);

// notre requête est relative au nœud tbody
$query = 'count(row/entry[. = "en"])';

$entries = $xpath->evaluate($query, $tbody);
echo "Il y a $entries livres anglais\n";

?>

L'exemple ci-dessus va afficher :

Il y a 2 livres anglais

Voir aussi

  • DOMXPath::query() - Évalue l'expression XPath donnée

User Contributed Notes

danny at webdevelopers dot eu 28-Jan-2020 11:36
The only way how to distinguish FALSE returned value from syntax error FALSE is to re-run the XPath expression wrapped in string() function. If must return empty string. If it returns FALSE again then it is an error.

<?php

        $ret=$this->xp->evaluate($eval, $context);

        // Error detection: DOMXPath::evaluate() returns FALSE on error
        // so does DOMXPath::evaluate("boolean(/nothing)")
        // @workaround webdevelopers.eu
        if ($ret === false && $this->xp->evaluate("string($eval)", $context) === false) {
            throw new Exception("Invalid XPath expression ".json_encode($eval), 3491);
        }
?>
aazaharov81 at gmail dot com 14-Jan-2015 12:48
To query DOMNodes by their HTML classes, use such snippet
<?php

// CssClassXPathSelector
function ccxs($class) {
    return '[contains(concat(" ", normalize-space(@class), " "), " ' . $class . ' ")]';
}

 // then just
 $domitems = $this->xpath("//*[@id='searchResultsRows']//a" . ccxs('listing_row'));
?>
daniel at danielnorton dot com 25-Jun-2011 09:56
Note that this method does not provide any means to distinguish between a successful result that returns FALSE and an error.

For example, this will succeed and return FALSE:

<?php $xpath->evaluate("1 = 0"); ?>

One workaround when you know you are expecting a Boolean is to wrap the result with string(). e.g.

<?php $xpath->evaluate("string(1 = 0)"); ?>

This will return a string "false" on success, or the Boolean FALSE on error.
Damien Bezborodov 28-Mar-2011 06:13
If your expression returns a node set, you will get a DOMNodeList instead of a typed result. Instead, try modifying your expression from "//node[1]" to "string(//node[1])".
yuriucsal at NOSPAM dot yahoo dot com dot br 06-Mar-2005 12:55
this class can substitute the method evaluate while it is not validated. Made for Yuri Bastos and Jo?o Gilberto Magalh?es.

<?php

    class XPtahQuery
    {
        // function returns a DOMNodeList from a relative xPath
        public static function selectNodes($pNode, $xPath)
        {

            $pos = strpos(self::getFullXpath($pNode),"/",1);
            $xPathQuery = substr(self::getFullXpath($pNode),$pos);//to paste  /#document[1]/
            $xPathQueryFull = $xPathQuery. $xPath;
            $domXPath = new DOMXPath($pNode->ownerDocument);
            $rNodeList = $domXPath->query($xPathQueryFull);

                return $rNodeList;
        }
        // function returns a DOMNode from a xPath from other DOMNode
        public static function selectSingleNode($pNode, $xPath)
        {

            $pos = strpos(self::getFullXpath($pNode),"/",1);
            $xPathQuery = substr(self::getFullXpath($pNode),$pos);//to paste  /#document[1]/
            $xPathQueryFull = $xPathQuery. $xPath;
            $domXPath = new DOMXPath($pNode->ownerDocument);
            $rNode = $domXPath->query($xPathQueryFull)->item(0);

                return $rNode;
        }
        //utilitaries functions off selectSingleNode
        private function getNodePos($pNode, $nodeName)
        {
            if($pNode == null)
                {
                        return 0;
            }
            else
            {
                $var = 0;
                    if ($pNode->previousSibling != null)
                    {
                    if ($pNode->previousSibling->nodeName == $nodeName)
                    {
                        $var = 1;
                    }
                    }
                    return self::getNodePos($pNode->previousSibling, $nodeName) + $var;
            }
        }
        //utilitaries functions off selectSingleNode
        private function getFullXpath($pNode)
        {
            if($pNode == null)
                {
                        return "";
            }
            else
            {

                return self::getFullXpath($pNode->parentNode) . "/" . $pNode->nodeName . "[" .strval(self::getNodePos($pNode, $pNode->nodeName)+1) . "]";//+1 to get the real xPath index

            }
        }
    }
?>


Évalue l'expression XPath donnée

  • « DOMXPath::evaluate
  • DOMXPath::registerNamespace »
  • PHP Manual
  • DOMXPath
  • Évalue l'expression XPath donnée

DOMXPath::query

(PHP 5, PHP 7)

DOMXPath::query — Évalue l'expression XPath donnée

Description

public DOMXPath::query ( string $expression , DOMNode|null $contextNode = null , bool $registerNodeNS = true ) : mixed

Évalue l'expression expression XPath donnée.

Liste de paramètres

expression

L'expression XPath à exécuter.

contextNode

Le paramètre optionnel contextNode peut être spécifié pour effectuer des requêtes XPath relative. Par défaut, les requêtes sont relatives à l'élément racine.

registerNodeNS

Le paramètre optionnel registerNodeNS peut être renseigné pour désactiver l'enregistrement automatique du nœud de contexte.

Valeurs de retour

Retourne un DOMNodeList contenant tous les nœuds correspondant à l'expression expression XPath donnée. Toutes les expressions qui ne retournent pas de nœud retourneront un DOMNodeList vide.

Si le paramètre expression est malformé ou le paramètre contextNode est invalide, DOMXPath::query() retournera false.

Exemples

Exemple #1 Récupération de tous les livres anglais

<?php

$doc = new DOMDocument;

// Nous ne voulons pas nous soucier des espaces blancs
$doc->preserveWhiteSpace = false;

$doc->load('book.xml');

$xpath = new DOMXPath($doc);

// Nous commençons à l'élément racine
$query = '//book/chapter/para/informaltable/tgroup/tbody/row/entry[. = "en"]';

$entries = $xpath->query($query);

foreach ($entries as $entry) {
    echo "Livre trouvé {$entry->previousSibling->previousSibling->nodeValue}," .
         " par {$entry->previousSibling->nodeValue}\n";
}
?>

L'exemple ci-dessus va afficher :

Livre trouvé : The Grapes of Wrath, par John Steinbeck
Livre trouvé : The Pearl, par John Steinbeck

Nous pouvons également utiliser le paramètre contextNode pour raccourcir notre expression :

<?php

$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;

$doc->load('book.xml');

$xpath = new DOMXPath($doc);

$tbody = $doc->getElementsByTagName('tbody')->item(0);

// notre requête est relative au nœud tbody
$query = 'row/entry[. = "en"]';

$entries = $xpath->query($query, $tbody);

foreach ($entries as $entry) {
    echo "Livre trouvé : {$entry->previousSibling->previousSibling->nodeValue}," .
         " par {$entry->previousSibling->nodeValue}\n";
}
?>

Voir aussi

  • DOMXPath::query()

User Contributed Notes

chris dot russo99 at gmail dot com 17-Aug-2016 03:58
If you can't find a solution for PHP XPATH case sensitivity, you can always try this approach:

http://fsockopen.com/php-programming/your-final-stop-for-php-xpath-case-insensitive

Instead of inserting PHP functions into a XPATH object, convert the XPATH object into an Array(), and then use any PHP function, the regular way.
ikmahesh at cdac dot in 08-Jul-2015 09:29
The parameters for $xPath->query() method is case sensitive.
It matches IDs exact words.
RiKdnUa at mail dot ru 17-Sep-2013 04:26
?????? XPath ??????? ? XML ?????????. XML ???????? ????????? ???????? ? ??????? ?? ??????????? ???????? (?????????). ??? ????????????? ? XPath ??????? ?????????, ??????? DOMXPath::query() ?????? ?????????????? ? ?????? ?? ????????. ????? ?????? ???????, ???? ???? ????????? ???. ???? ????? ??????? ?????? ???? ? ????????? WINDOWS-1251. ?????????? ? PHP 5.2.9-2 ? PHP 5.2.17

Example XPath-query to the XML-document. XML-document contains an elements with the names of non-Latin characters (cyrillic). When used predicate in XPath-query, function DOMXPath::query() gives a warning and query does not work. In order to earned the query, it is necessary to explicitly specify the axis. The file of this example is to be in the encoding WINDOWS-1251. Tested in PHP 5.2.9-2 and PHP 5.2.17
<?php
ini_set("display_errors","on");
error_reporting(-1);
function utf8encode($str){return iconv('WINDOWS-1251', 'UTF-8', $str);}
$xml="<?xml version='1.0' encoding='WINDOWS-1251'?>
<?????>
<?????? href='yandex.com'>??????</??????>
<?????? href='rik.dn.ua/fotopan.php'>?.??????</??????>
</?????>
";
$document=new domDocument();
$document->preserveWhiteSpace=false;
$document->loadXML($xml);
$domxpath=new domXpath($document);
$list=$domxpath->query(utf8encode('/child::?????/child::??????'));//Ok
echo '$list->length='.$list->length."\n<br/>\n";
$list=$domxpath->query(utf8encode('/?????/??????'));//Ok
echo '$list->length='.$list->length."\n<br/>\n";
$list=$domxpath->query(utf8encode('/child::?????/child::??????[position()=1]'));//Ok
echo '$list->length='.$list->length."\n<br/>\n";
$list=$domxpath->query(utf8encode('/?????/??????[1]'));//Warning: DOMXPath::query() [domxpath.query]: Invalid expression in ...
echo '$list->length='.$list->length."\n<br/>\n";
$list=$domxpath->query(utf8encode('/?????/??????[position()=1]'));//Warning: DOMXPath::query() [domxpath.query]: Invalid expression in ...
echo '$list->length='.$list->length."\n<br/>\n";
?>
info at syncgw dot com 22-Sep-2011 09:05
A warning to all PHP programmer using this function PHP 5.0.0.0: We needed an equivalent to upper-case() function (is not available in XPath 1.0).

XML-Document:

<Rec>
<SourceRef>./c:calendar2</SourceRef>
<SourceRef>./c:calendar</SourceRef>
</Rec>

using

query('//DataStore[translate(SourceRef,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")="./C:CALENDAR"]/.')

returns ZERO matches.

If you change XML-Source to

<Rec>
<SourceRef>./c:calendar</SourceRef>
<SourceRef>./c:calendar2</SourceRef>
</Rec>

everything works fine
yuriscom at gmail dot com 07-Sep-2011 10:29
I hope it will be helpful for someone:

I spent some time to solve the problem when you query a string with quotes inside.

Suppose you have:
$parameter = "aaa \"bbb\"";
$domxpath->query("//path[text()=\"".$parameter."\""];

In versions > 5.3.0 there is registerPhpFunctions where you can put an addslashes. But in older version you cannot do it in simple way.

So the solution is to use a concat function. So when you have a substring with " inside, wrap it with '. And when you have a substring with ', then wrap with in ".

The code is:

<?php
$dom = new DOMDocument;
$dom->loadXML("<name>'bla' \"bla\" bla</name>");
$xpath = new DOMXPath($dom);
$nodeList = $xpath->query("//name[text()=concat(\"'bla' \" ,'\"bla\"' ,\" bla\")]");
?>

Below is the function that receives a string and returns a concat pattern for the xpath query.

<?php
    function getPattern_MQ($pattern) {
        // initiating an array of substrings
        $ar = array();
        // points to the current position in a string
        $offset = 0;
        $strlen = strlen($pattern);
        while (true) {
            // find a position of quotes
            $qPos = strpos($pattern, "\"", $offset);

            if (!$qPos) {
                // no more quotes
                $leftOver = $offset - $strlen;
                if ($leftOver < 0) {
                    $string = substr($pattern, $leftOver);
                    $ar[] = "\"" . $string . "\"";
                }
                break;
            }
            // add the whole substring before the quotes into the array
            $ar[] = "\"" . substr($pattern, $offset, ($qPos - $offset)) . "\"";
            // add the quotes wrapped with single quot
            $ar[] = "'" . substr($pattern, $qPos, 1) . "'";
            $offset = $qPos + 1;
        }
        // join the array to get: concat("aaa",'"',"bbb",'"');
        $pattern = "concat(''," . join(",", $dynamicPatternsAr) . ")";
        return $pattern;
    }
?>
chris AT cmbuckley DOT co DOT uk 14-Apr-2011 07:31
To help with the problem where the default namespace is not registered with the DOMXPath object, you can use the following replacement to update your paths accordingly:

<?php

$xml = <<<EOS
<root xmlns="urn:test">
    <foo>bar</foo>
</root>
EOS;

$expression = '//foo';
$prefix = 'fakeprefix';

$doc = new DOMDocument();
$doc->loadXML($xml);

$context = $doc->documentElement; // or whichever element you choose
$xpath = new DOMXPath($doc);

// register namespace as below, and apply a regex to the expression
if (null !== $context->namespaceURI) {
    $xpath->registerNamespace($prefix, $context->namespaceURI);
    $expression = preg_replace('#(::|/\s*|\A)(?![/@].+?|[a-z\-]+::)#', '$1' . $prefix . ':$2', $expression);
    var_dump($expression); // string(16) "//fakeprefix:foo"
}

$foo = $xpath->query($expression, $context)->item(0);
var_dump($doc->saveXML($foo)); // string(14) "<foo>bar</foo>"

?>
kkez at example dot com 03-Sep-2010 07:51
If the query() function seems to ignore your $contextnode, and instead returns all the tags in the document, try to use a relative path (use a . in front of the query):

<?php
    $xml = "<?xml version='1.0' encoding='UTF-8'?>
        <test>
            <tag1>
                <uselesstag>
                    <tag2>test</tag2>
                </uselesstag>
            </tag1>
            <tag2>test2</tag2>
        </test>";

    $dom = new DomDocument();
    $dom->loadXML($xml);
    $xpath = new DomXPath($dom);

    $tag1 = $dom->getElementsByTagName("tag1")->item(0);

    echo $xpath->query("//tag2")->length; //output 2 -> correct
    echo $xpath->query("//tag2", $tag1)->length; //output 2 -> wrong, the query is not relative
    echo $xpath->query(".//tag2", $tag1)->length; //output 1 -> correct (note the dot in front of //)
?>

See that i couldn't use $xpath->query("tag2", $tag1) as per the documentation, since "tag2" is not a direct child of "tag1".
I don't know why this note was deleted, i just tested it and it's correct.
It's not a bug, it's simply not written in the documentation.
Anonymous 27-Nov-2009 12:26
I found this useful for building page templates

<?php
$xsl = new DOMDocument;
$xsl->load('layout.xsl');

// Set the <xsl:include> href attribute, the inner stylesheet to include in this layout
$xpath = new DomXPath($xsl);
$res = $xpath->query('//xsl:include');
$res->item(0)->setAttribute('href','page.xsl');
$xsl->save('media/xsl/layout.xsl');
?>
Niklas 27-Aug-2008 02:36
For XPath escaping use the following method (of course it could be more efficient).
<?php
public function xpathescape($string)
{
$result = 'concat(';

for($i=0, $j=strlen($string); $i<$j; ++$i)
{
if($i > 0)
$result .= ",";

if($string[$i] == '\'')
$result .= "\"".$string[$i]."\"";
else
$result .= '\''.$string[$i].'\'';
}

$result .= ')';

return $result;
}
?>

Use it this way:
<php
$xpath->query('//example[sub='.xpathescape($acomplexstring).']');

?>
adam dot prall at thinkingman dot com 19-Jul-2008 09:01
If you're wondering, like I was, why your XPath queries are not returning any of the new DOMElements you create in your (X)HTML documents, and only the ones originally loaded in with (for example) loadXML(), this is why; if you're doing things right, you have registered the nameSpace 'html' after creating your DOMXPath object thus:

<?php

class XPathQueryLength {
     private $nameSpace = '';
     function __construct(DOMDocument $doc) {
          $this->xpath = new DOMXPath($this->doc);
          $this->xpath->registerNamespace(
                 'html','http://www.w3.org/1999/xhtml' );
     }
     function queryLength($query) {
          return $this->xpath->query($query)->length;
     }
}

?>

...but don't forget that when adding new elements to the above DOMDocument $doc, to use createElementNS() instead of createElement(), otherwise you'll have this problem:

<?php

//$doc is a previously loaded XHTML document containing a normal html, head and body structure
//$body is the first selected tag using $doc->getElementsByTagName('body');

$pTag = $doc->createElement('p','This is a new paragraph!');
$body->appendChild($pTag);

$xPath = new XPathQueryLength($doc);
print $xPath->queryLength('//html:p');

output: 0

print $xPath->queryLength('//p');

output: 1

?>

So do this instead:

<?php

//$doc is a previously loaded XHTML document containing a normal html, head and body structure
//$body is the first selected tag using $doc->getElementsByTagName('body');

$pTag = $doc->createElementNS('http://www.w3.org/1999/xhtml','p','This is a new paragraph!');
$body->appendChild($pTag);

$xPath = new XPathQueryLength($doc);
print $xPath->queryLength('//html:p');

output: 2

print $xPath->queryLength('//p');

output: 0

?>

The resulting XHTML file from both example scripts looks much like this:

<html>
  <head></head>
  <body>
     <p>This is a hardcoded paragraph.</p>
     <p>This is a new paragraph!</p>
  </body>
</html>

...so you would think that a paragraph is a paragraph is a paragraph, since you never see the prefix, as in "<html:p>This is a new paragraph!</html:p>".

This may seem glaringly obvious, but I was writing a class that converts CSS queries into XPath queries, and the fact that a namespace had been registered was rather buried in the code.

We love the DOM, the DOM is good to us.
Nibinaear 03-Mar-2008 06:15
I've searched the entire web looking for a way to update / modify/ change/ alter the elements of an xml file and found NOTHING!

So here it is, the defninitive way to "Change XML elements with PHP" rather than adding / appending new ones. This uses XPATH:

<?php

// Create a DOMDocument instance
$xml = new DOMDocument;

// Ignore whitespace between nodes (default: true)
$xml->preserveWhiteSpace = false;

$file='about.xml';

// Load the XML data source
$xml->Load($file);

$xpath = new DOMXPath($xml);

$query='/regions/branch';

$entries = $xpath->query($query);

foreach ($entries as $entry)
{
  $entry->firstChild->nodeValue="like this!";
  echo $entry->firstChild->nodeValue;
}

$xml->save($file);

?>
ondrej dot fischer at 4internet dot cz 25-Oct-2007 06:46
Unfortunately PHP's DOM extension doesn't support use of:
<?xml-stylesheet type="text/xsl" ... ?>
processing instruction.
Here is an example, how to implement it using XPath query and extending DOMDocument by a method output().

<?php

// This simple function adds missing direct usage of anonymous instances
// in PHP5's reference model
function a($var) {
   return $var;
}

// Extended DOMDocument class
class MyDOMDocument extends DOMDocument
{

   public function output()
   {
      $stylesheets = array();
      $PIs = a(new DOMXPath($this))
                  ->query('/processing-instruction("xml-stylesheet")');

      foreach($PIs as $PI)
      {
         // This might be implemented cleaner by regular parsing
         // of DOMProcessingInstruction::data property
         if(ereg('type *= *"text/xsl" +href *= *"([^"]+)"', $PI->data, $mem))
         {
            // Here should be verified, that XSL file exists.
            a($stylesheets[] = new DOMDocument())->load($mem[1]);
         }
      }

      if($stylesheets)
      {
         $processor = new XSLTProcessor();
         foreach($stylesheets as $stylesheet)
            $processor->importStylesheet($stylesheet);
         return $processor->transformToDoc($this);
      }
      // If no stylesheet instructions present, return self directly
      else return $this;

   }
}

?>

Usage:

<?php

$document = new MyDOMDocument();
$document->load('my.xml');
echo $document->output()->saveXML();

?>

With following file my.xml:

<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="my.xsl" ?>
<my-root />

and existing file my.xsl that code will transform the xml file using my.xsl and output the result.
jbarnett at flowershopnetwork dot com 11-Sep-2007 01:46
The order of nodes in the return value is not guaranteed.

When my code was on an old server, the returned DOMNodeList was in document order.  On the new server, the returned DOMNodeList is in a consistent order, but it is not in document order.

PHP passes this function call off to the xmlXPathEvalExpression() function in libxml.  That function in libxml only accepts two arguments - the same two this PHP function accepts.  There must have been a change in the libxml version from the old server to the new server, and that libxml behaves differently.

This would be okay if PHP had a way to compare nodes so I can resort the nodes manually, but there is not.

So, there is no guaranteed way to get an ordered list of nodes like DOM 3 XPath provides.
Hayley Watson 12-Aug-2007 05:43
Note that if your DOMDocument was loaded from HTML, where element and attribute names are case-insensitive, the DOM parser converts them all to lower-case, so your XPath queries will have to as well; '//A/@HREF' won't find anything even if the original HTML contained "<A HREF='example.com'>".
nicolas_rainardNOSPAM at yahoo dot fr 10-Jul-2007 02:04
Please note that what clochix says is valid for *any* document which has a default namespace (as it is the case for XHTML).

This document :

<?xml version="1.0" encoding="UTF-8" ?>

<root xmlns="http://www.exemple.org/namespace">

    <element id="1">
    ...
    </element>

    <element id="2">
    ...
    </element>

</element>

must be accessed this way :

$document = new DOMDocument();
$document->load('document.xml');

$xpath = new DOMXPath($document);
$xpath->registerNameSpace('fakeprefix', 'http://www.exemple.org/namespace');

$elements = $xpath->query('//fakeprefix:element');

Of course, there is no prefix in the original document, but the DOMXPath class *needs* one, whatever it is, if you use a default namespace. It *doesn't work* if you specify an empty prefix like this :

$xpath->registerNameSpace('', 'http://www.exemple.org/namespace');

Hope this help to spare some time...
clochix at clochix dot net 01-Mar-2007 04:05
If you want to perform queries on XHTML documents, you must fix a default namespace:

<?php
$doc = new DOMDocument;
$doc->preserveWhiteSpace = true;
$doc->resolveExternals = true; // for character entities
$doc->load("http://www.w3.org/");
$xpath = new DOMXPath($doc);
// won't work
$entries = $xpath->query("//div");
// you should use :
$xpath->registerNamespace("html", "http://www.w3.org/1999/xhtml");
$entries = $xpath->query("//html:div");
?>
jakob dot voss at nichtich dot de 14-Nov-2005 12:33
You can transform the result nodes into new DOMDocument objects this way:

<?php
$result = $xpath->query($query);
$resultNode = $result->item(0);
$newDom = new DOMDocument;
$newDom->appendChild($newDom->importNode($resultNode,1));

print "<pre>" . htmlspecialchars($newDom->saveXML()) . "</pre>";
?>
Eric Hanson 12-Jul-2005 05:40
Two great XPath references follow.

XPath in Five Paragraphs (finally!):
http://www.rpbourret.com/xml/XPathIn5.htm

The w3c spec actually has a bunch of helpful examples:
http://www.w3.org/TR/xpath#location-paths


Enregistre l'espace de noms avec l'objet DOMXPath

  • « DOMXPath::query
  • DOMXPath::registerPhpFunctions »
  • PHP Manual
  • DOMXPath
  • Enregistre l'espace de noms avec l'objet DOMXPath

DOMXPath::registerNamespace

(PHP 5, PHP 7)

DOMXPath::registerNamespace — Enregistre l'espace de noms avec l'objet DOMXPath

Description

public DOMXPath::registerNamespace ( string $prefix , string $namespace ) : bool

Enregistre l'espace de noms namespace et le prefix avec l'objet DOMXPath.

Liste de paramètres

prefix

Le préfixe.

namespace

L'URI de l'espace de noms.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

User Contributed Notes

igor dot pellegrini at diespam-berlinonline dot de 10-Mar-2015 07:32
The documentation is not really detailed.
Probably someone is also interested in the possibility of unregistering the namespace.

Worths to note that the original libxml function "xmlXPathRegisterNs()"

* Does NOT accept NULL or empty string for the argument "$prefix".

   and

* Unregisters the namespace if the "$namespaceURI" argument is NULL.

Here the documentation:
http://xmlsoft.org/html/libxml-xpathInternals.html#xmlXPathRegisterNs
xmedeko at gmail dot com 20-Sep-2011 04:58
A general way to register the root default namespace:

<?php
$xml = new DomDocument();
$xml->load('data.xml');
$xpath = new DOMXPath($xml);
$rootNamespace = $xml->lookupNamespaceUri($xml->namespaceURI);
$xpath->registerNamespace('x', $rootNamespace);
?>

And then just query:

<?php $elementList = $xpath->query('//x:items/x:name'); ?>
dulao5 at gmail dot com 16-Jun-2009 12:01
The following code can work for XML default namespace.
<?php
$xml = <<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:other="http://other.w3.org/other" >
        <id>uYG7-sPwjFg</id>
        <published>2009-05-17T18:29:31.000Z</published>
</entry>
EOT;

$doc = new DOMDocument;
$doc->loadXML($xml);
$xpath =  DOMXPath($doc);

$xpath->registerNamespace('atom', "http://www.w3.org/2005/Atom");

$xpath_str = '//atom:entry/atom:published/text()';

$entries = $xpath->evaluate($xpath_str);

print $entries->item(0)->nodeValue ."\n";

?>
agent009 31-Mar-2009 04:55
Ok, here's a function that extends XPath syntax with the following special characters:

~ inserts default namespace prefix if defined

# shorthand for text()

% shorthand for comment()

$ shorthand for node()

?* shorthand for processing-instruction()

?foo shorthand for processing-instruction("foo")

? shorthand for processing-instruction("")

^ escapes following character (with literal or SGML entity as needed)

All of the above except ^ are ignored within quoted strings

<?php
function extendXPath($str, $defns = NULL) {
   $quote = false;
   $map = array(
      '~' => isset($defns) ? "$defns:" : '',
      '#' => 'text()',
      '%' => 'comment()',
      '$' => 'node()'
   );
   $out = '';

   for ($i = 0, $len = strlen($str); $i < $len; $i++) {
      $c = $str[$i];
      if (!$quote && array_key_exists($c, $map)) {
         $out .= $map[$c];
      } else switch ($c) {
         case '^':
            $out .= htmlspecialchars($str[++$i], ENT_QUOTES);
            break;
         case '?':
            if ($quote) {
               $out .= $c;
            } elseif ($str[$i + 1] == '*') {
               $out .= 'processing-instruction()';
               $i++;
            } else {
               preg_match('/^\w+/', substr($str, $i + 1), $matches);
               $out .= 'processing-instruction("'.$matches[0].'")';
               $i += strlen($matches[0]);
            };
            break;
         case '"':
            $quote = !$quote;
         default:
            $out .= $c;
      };
   };

   return $out;
}
?>
cameron kellough 14-Apr-2007 10:33
This is called prefix mapping and it is necessary to use xpath to handle documents which have default namespaces. //root/item will search for items with no namespace, not items with the namespace described as the default in the xmlns declaration.  This problem is maddening as it just looks on the surface like xpath isn't working.
spam at spam dot spam 31-Mar-2005 12:46
It is mentioned in a few places on the web, but it wasn't mentioned here. You need to use this function to set up a prefix for the default namespace of a document.

For instance, if you are trying to parse a Microsoft Spreadsheet XML file, which has the default namespace of "urn:schemas-microsoft-com:office:spreadsheet":

$doc = DOMDocument::load("my_spreadsheet.xml);
$xpath = new DOMXPath($doc);
$xpath->registerNamespace("m",
        "urn:schemas-microsoft-com:office:spreadsheet");
$query = '/m:Workbook/m:Worksheet[1]/m:Table';
$result = $xpath->query($query, $doc);

You can use anything in place of the 'm', but you have to specify something! Just asking for "/Workbook/Worksheet/Table" doesn't work.


Enregistre une fonction PHP comme fonction XPath

  • « DOMXPath::registerNamespace
  • DOM Fonctions »
  • PHP Manual
  • DOMXPath
  • Enregistre une fonction PHP comme fonction XPath

DOMXPath::registerPhpFunctions

(PHP 5 >= 5.3.0, PHP 7)

DOMXPath::registerPhpFunctions — Enregistre une fonction PHP comme fonction XPath

Description

public DOMXPath::registerPhpFunctions ( string|array|null $restrict = null ) : void

Cette méthode active la possibilité d'utiliser des fonctions PHP dans des expressions XPath.

Liste de paramètres

restrict

Utilisez ce paramètre uniquement pour autoriser certaines fonctions à être appelées depuis XPath.

Ce paramètre peut être soit une chaîne de caractères (un nom de fonction) ou un tableau de noms de fonctions.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Les exemples suivants utilisent le fichier book.xml qui contient les données suivantes :

Exemple #1 book.xml

<?xml version="1.0" encoding="UTF-8"?>
<books>
 <book>
  <title>PHP Basics</title>
  <author>Jim Smith</author>
  <author>Jane Smith</author>
 </book>
 <book>
  <title>PHP Secrets</title>
  <author>Jenny Smythe</author>
 </book>
 <book>
  <title>XML basics</title>
  <author>Joe Black</author>
 </book>
</books>

Exemple #2 Exemple avec DOMXPath::registerPHPFunctions() et php:functionString

<?php
$doc = new DOMDocument;
$doc->load('book.xml');

$xpath = new DOMXPath($doc);

// Enregistre l'espace de noms php (nécessaire)
$xpath->registerNamespace("php", "http://php.net/xpath");

// Enregistre les fonctions PHP (Aucune restriction)
$xpath->registerPHPFunctions();

// Appèle la fonction substr sur le titre du livre
$nodes = $xpath->query('//book[php:functionString("substr", title, 0, 3) = "PHP"]');

echo "{$nodes->length} livres trouvés dont le titre commence par 'PHP':\n";
foreach ($nodes as $node) {
    $title  = $node->getElementsByTagName("title")->item(0)->nodeValue;
    $author = $node->getElementsByTagName("author")->item(0)->nodeValue;
    echo "$title par $author\n";
}

?>

Résultat de l'exemple ci-dessus est similaire à :

2 livres trouvés dont le titre commence par 'PHP':
PHP Basics par Jim Smith
PHP Secrets par Jenny Smythe

Exemple #3 Exemple avec DOMXPath::registerPHPFunctions() et php:function

<?php
$doc = new DOMDocument;
$doc->load('book.xml');

$xpath = new DOMXPath($doc);

// Enregistre l'espace de noms php (nécessaire)
$xpath->registerNamespace("php", "http://php.net/xpath");

// Enregistre des fonctions PHP (has_multiple uniquement)
$xpath->registerPHPFunctions("has_multiple");

function has_multiple($nodes) {
    // Retourne true s'il y a plus d'un auteur
    return count($nodes) > 1;
}
// Filtre les livres dont les auteurs sont multiples
$books = $xpath->query('//book[php:function("has_multiple", author)]');

echo "Livres avec plusieurs auteurs :\n";
foreach ($books as $book) {
    echo $book->getElementsByTagName("title")->item(0)->nodeValue . "\n";
}

?>

Résultat de l'exemple ci-dessus est similaire à :

Livres avec plusieurs auteurs :
PHP Basics

Voir aussi

  • DOMXPath::registerNamespace() - Enregistre l'espace de noms avec l'objet DOMXPath
  • DOMXPath::query() - Évalue l'expression XPath donnée
  • DOMXPath::evaluate() - Évalue une expression XPath donnée et retourne un résultat typé si possible

User Contributed Notes

There are no user contributed notes for this page.


DOM Fonctions

Sommaire

  • dom_import_simplexml — Transforme un objet SimpleXMLElement en un objet DOMElement

User Contributed Notes

There are no user contributed notes for this page.


Transforme un objet SimpleXMLElement en un objet DOMElement

  • « DOM Fonctions
  • libxml »
  • PHP Manual
  • DOM Fonctions
  • Transforme un objet SimpleXMLElement en un objet DOMElement

dom_import_simplexml

(PHP 5, PHP 7)

dom_import_simplexml — Transforme un objet SimpleXMLElement en un objet DOMElement

Description

dom_import_simplexml ( object $node ) : DOMElement|null

dom_import_simplexml() transforme l'objet SimpleXML node en un objet DOMElement. Le nouvel objet peut être utilisé en tant que nœud natif DOMElement.

Liste de paramètres

node

Le nœud SimpleXMLElement.

Valeurs de retour

Le nœud DOMElement à ajouter ou false si une erreur survient.

Exemples

Exemple #1 Importation d'un objet SimpleXML dans DOM avec dom_import_simplexml()

<?php

$sxe = simplexml_load_string('<books><book><title>blah</title></book></books>');

if ($sxe === false) {
    echo 'Erreur lors de l\'analyse du document';
    exit;
}

$dom_sxe = dom_import_simplexml($sxe);
if (!$dom_sxe) {
    echo 'Erreur lors de la conversion du XML';
    exit;
}

$dom = new DOMDocument('1.0');
$dom_sxe = $dom->importNode($dom_sxe, true);
$dom_sxe = $dom->appendChild($dom_sxe);

echo $dom->saveXML();

?>

Voir aussi

  • simplexml_import_dom() - Construit un objet SimpleXMLElement à partir d'un objet DOM

User Contributed Notes

h4ss4n3 at hyj4z1 dot me 08-Sep-2020 08:08
//No need to initiate, import and append on example#1

(...)
$dom_sxe = dom_import_simplexml($sxe);
if (!$dom_sxe) {
    echo 'Erreur lors de la conversion du XML';
    exit;
}

//$dom = new DOMDocument('1.0');
//$dom_sxe = $dom->importNode($dom_sxe, true);
//$dom_sxe = $dom->appendChild($dom_sxe);

//use ownerDocument propertie
echo $dom->ownerDocument->saveXML();

?>
biniou at yopmail dot com 20-May-2016 09:58
Very useful to add a CDATA node with SimpleXMLElement (use it like addChild) :

<?php
class My_SimpleXMLElement extends SimpleXMLElement {

    public function addChildWithCData($name, $value = NULL) {
        $new_child = $this->addChild($name);

        $node = dom_import_simplexml($new_child);
        $no = $node->ownerDocument;
        $node->appendChild($no->createCDATASection($value));

        return $new_child;
    }
}
Jeff M 06-Mar-2009 01:09
SimpleXML is an 'Object Mapping XML API'. It is not DOM, per se. SimpleXML converts the XML elements into PHP's native data types.

The dom_import_simplexml and simplexml_import_dom functions do *not* create separate copies of the original object. You are free to use the methods of either or both interchangeably, since the underlying instance is the same.

<?php
    // initialize a simplexml object
    $sxe = simplexml_load_string('<root/>');

    // get a dom interface on the simplexml object
    $dom = dom_import_simplexml($sxe);

    // dom adds a new element under the root
    $element = $dom->appendChild(new DOMElement('dom_element'));

    // dom adds an attribute on the new element
    $element->setAttribute('creator', 'dom');

    // simplexml adds an attribute on the dom element
    $sxe->dom_element['sxe_attribute'] = 'added by simplexml';

    // simplexml adds a new element under the root
    $element = $sxe->addChild('sxe_element');

    // simplexml adds an attribute on the new element
    $element['creator'] = 'simplexml';

    // dom finds the simplexml element (via DOMNodeList->index)
    $element = $dom->getElementsByTagName('sxe_element')->item(0);

    // dom adds an attribute on the simplexml element
    $element->setAttribute('dom_attribute', 'added by dom');

    echo ('<pre>');
    print_r($sxe);
    echo ('</pre>');
?>

Outputs:

SimpleXMLElement Object
(
    [dom_element] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [creator] => dom
                    [sxe_attribute] => added by simplexml
                )

        )

    [sxe_element] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [creator] => simplexml
                    [dom_attribute] => added by dom
                )

        )

)

What this illustrates is that both interfaces are operating on the same underlying object instance. Also, when you dom_import_simplexml, you can create and add new elements without reference to an ownerDocument (or documentElement).

So passing a SimpleXMLElement to another method does not mean the recipient is limited to using SimpleXML methods.

Hey Presto! Your telescope has become a pair of binoculars!
crescentfreshpot at yahoo dot com 12-Dec-2007 12:22
justinpatrin at php dot net:
> To get a proper DOM document (which you need to do most things) you need...

No you don't. Just do:
<?php
$dom = dom_import_simplexml($xml)->ownerDocument;
?>
justinpatrin at php dot net 01-Jun-2006 09:44
I've found that newer versions of PHP5 require some special syntax in order to properly convert between SimpleXML and DOM. It's not as easy as calling dom_import_simplexml() with a SimpleXML node. To get a proper DOM document (which you need to do most things) you need:
<?php
//$xml is a SimpleXML instance
$domnode = dom_import_simplexml($xml);
$dom = new DOMDocument();
$domnode = $dom->importNode($domnode, true);
$dom->appendChild($domnode);
?>

Switching back, though, is, well...simple.

<?php
//$dom is a DOMDocument instance
$xml = simplexml_import_dom($dom);
?>


libxml

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • libXMLError — La classe libXMLError
  • Fonctions libxml
    • libxml_clear_errors — Vide le buffer d'erreur libxml
    • libxml_disable_entity_loader — Désactive le chargement des entités externes
    • libxml_get_errors — Lit le tableau d'erreurs
    • libxml_get_last_error — Lit la dernière erreur libxml
    • libxml_set_external_entity_loader — Change le chargeur d'entités externes par défaut
    • libxml_set_streams_context — Configure le contexte de flux pour la prochaine opération libxml
    • libxml_use_internal_errors — Désactive le rapport d'erreur libxml et les stocke pour lecture ultérieure

User Contributed Notes

There are no user contributed notes for this page.


Introduction

Ces fonctions et constantes sont disponibles depuis PHP 5.1.0 et si vous avez compilé PHP avec les extensions basées sur libxml, c'est à dire DOM, libxml, SimpleXML, SOAP, WDDX, XSL, XML, XMLReader, XMLRPC et XMLWriter.

User Contributed Notes

There are no user contributed notes for this page.


Pré-requis

Cette extension requiert » libxml >= 2.6.0.

User Contributed Notes

There are no user contributed notes for this page.


Installation

L'extension libxml est activé par défaut, et il peut être désactivé avec l'option --disable-libxml.

La directive optionnelle --with-libxml-dir est utilisée pour spécifier le dossier où libxml se trouve sur le système sur lequel PHP est compilé. À défaut de l'utilisation de cette option, les dossiers par défaut seront analysés. Le processus configure vérifie les dossiers où se trouve libxml (spécifiquement, xml2-config), dans cet ordre :

  1. Le dossier ([DIR]) spécifié avec l'option --with-libxml-dir ([DIR]=/bin/xml2-config)

  2. /usr/local/bin/xml2-config

  3. /usr/bin/xml2-config

Si le processus configure ne peut trouver le fichier xml2-config dans le dossier spécifié par l'option --with-libxml-dir, alors, il continuera et analysera les dossiers par défaut.

User Contributed Notes

fred5 at no dot spam dot co dot za 31-Jul-2014 10:29
(I tried to enter a bug but the PHP version selection drop down isn't working so I have entered here)

This documentation is very confusing as it refers to xml2-config as a directory and file interchangeably (it is a file) ...so I'm not clear whether to use the containing directory or the actual file in the switch


Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

LIBXML_BIGLINES (entier)
Permet de signaler correctement les numéros de ligne supérieurs à 65535.

Note:

Uniquement disponible dans PHP 7.0.0 avec Libxml >= 2.9.0

LIBXML_COMPACT (entier)
Active l'optimisation de l'allocation de petits noeuds. Ceci pourrait augmenter la rapidité de votre application sans avoir besoin de changer votre code.

Note:

Seulement disponible dans Libxml >= 2.6.21

LIBXML_DTDATTR (entier)
Attribut de DTD par défaut
LIBXML_DTDLOAD (entier)
Charge le sous-ensemble externe
LIBXML_DTDVALID (entier)
Valide avec la DTD
LIBXML_HTML_NOIMPLIED (int)
Définit le drapeau HTML_PARSE_NOIMPLIED, qui désactive l'ajout automatique des éléments html/body...

Note:

Uniquement disponible en Libxml >= 2.7.7 (depuis PHP >= 5.4.0)

LIBXML_HTML_NODEFDTD (int)
Définit le drapeau HTML_PARSE_NODEFDTD, qui empèche l'ajout automatique d'un doctype si aucun n'est trouvé.

Note:

Only available in Libxml >= 2.7.8 (as of PHP >= 5.4.0)

LIBXML_NOBLANKS (entier)
Suppression des noeuds vides
LIBXML_NOCDATA (entier)
Fusion des CDATA en noeuds de texte
LIBXML_NOEMPTYTAG (entier)
Agrandit les balises vides (par exemple, <br/> en <br></br>)

Note:

Cette option est actuellement disponible uniquement avec les fonctions DOMDocument::save et DOMDocument::saveXML.

LIBXML_NOENT (entier)
Substitution des entités
Attention

Activer la substitution d'entiter peut faciliter les attaques XML External Entity (XXE).

LIBXML_NOERROR (entier)
Suppression du rapport d'erreur
LIBXML_NONET (entier)
Désactivation du réseau lors du chargement de document
LIBXML_NOWARNING (entier)
Suppression des rapports d'alerte
LIBXML_NOXMLDECL (entier)
Annule la déclaration XML lors de la sauvegarde du document

Note:

Seulement disponible dans Libxml >= 2.6.21

LIBXML_NSCLEAN (entier)
Suppression des espaces de noms redondants
LIBXML_PARSEHUGE (entier)
Affecte le drapeau XML_PARSE_HUGE. Désactive toute limite du parseur codée en dur. Ceci affecte les limites comme la profondeur maximale d'un document ou l'entité récursion, mais aussi les limites de la taille du texte des noeuds.

Note:

Seulement disponible depuis Libxml >= 2.7.0 (depuis PHP >= 5.3.2 et PHP >= 5.2.12)

LIBXML_PEDANTIC (int)
Définit le drapeau XML_PARSE_PEDANTIC, qui active le rapport d'erreur pedantic.

Note:

Available as of PHP >= 5.4.0

LIBXML_XINCLUDE (entier)
Implémentation de la substitution XInclude
LIBXML_ERR_ERROR (entier)
Erreur non-fatale
LIBXML_ERR_FATAL (entier)
Erreur fatale
LIBXML_ERR_NONE (entier)
Aucune erreur
LIBXML_ERR_WARNING (entier)
Une alerte simple
LIBXML_VERSION (entier)
libxml version sous la forme 20605 ou 20617
LIBXML_DOTTED_VERSION (chaîne de caractères)
libxml version sous la forme 2.6.5 ou 2.6.17
LIBXML_SCHEMA_CREATE (int)
Crée la valeur par défaut/fixée du noeud durant la validation du schéma XSD

Note:

Uniquement disponible en Libxml >= 2.6.14 (à partir de PHP >= 5.5.2)

User Contributed Notes

vetalstar at mail dot ru 16-Nov-2017 12:26
LIBXML_DOTTED_VERSION option doesn't work.
libxml version: 2.9.4

<?php

echo LIBXML_DOTTED_VERSION;
$xml = new SimpleXMLElement('<fasa_request id="1234567"/>', LIBXML_NOXMLDECL);

?>
@oneseventeen 05-Feb-2011 11:51
When inserting XML DOM Elements inside existing XML DOM Elements that I loaded from an XML file using the following code, none of my new elements were formatted correctly, they just showed up on one line:

<?php
$dom = DOMDocument::load('file.xml');
$dom->formatOutput = true;
//$dom->add some new elements with child nodes somewhere inside the loaded XML using insertBefore();
$dom->saveXML();
//output: everything looks normal but the new nodes are all on one line.
?>

I found I could pass LIBXML_NOBLANKS to the load method and it would reformat the whole document, including my added stuff:
<?php
$dom = DOMDocument::load('file.xml', LIBXML_NOBLANKS);
$dom->formatOutput = true;
//$dom->add some new elements with child nodes somewhere inside the loaded XML using insertBefore();
$dom->saveXML();
//output: everything looks newly formatted, including new nodes
?>

Hope this helps, took me hours of trial and error to figure this out!
zachatwork at gmail dot com 09-Feb-2010 11:30
Note: The LIBXML_NOXMLDECL constant is defined in this library but is not supported by DOMDocument (yet).

See also: http://bugs.php.net/bug.php?id=47137

<?php

print "PHP_VERSION:      ".PHP_VERSION."\n";
print "LIBXML_VERSION:   ".LIBXML_VERSION."\n";
print "LIBXML_NOXMLDECL: ".LIBXML_NOXMLDECL."\n";

$dom = new DomDocument();
$dom->loadXML("<foo />");

# This should work but doesn't.

print "DOMDocument doesn't honor LIBXML_NOXMLDECL:\n";
print $dom->saveXML(null,LIBXML_NOXMLDECL);

# This works, and will still work after the above is fixed.

print "Forwards compatible workaround:\n";
$lines = explode("\n", $dom->saveXML(null, LIBXML_NOXMLDECL), 2);
if(!preg_match('/^\<\?xml/', $lines[0]))
    print $lines[0];
print $lines[1];

?>

PHP_VERSION:      5.3.1-0.dotdeb.1
LIBXML_VERSION:   20632
LIBXML_NOXMLDECL: 2
DOMDocument doesn't honor LIBXML_NOXMLDECL:
<?xml version="1.0"?>
<foo/>
Forwards compatible workaround:
<foo/>


La classe libXMLError

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Introduction

Contient diverses informations sur les erreurs émises par la bibliothèque libxml. Les codes erreurs sont décrits dans la » documentation officielle de l'API xmlError.

Synopsis de la classe

libXMLError {
/* Propriétés */
public int $level ;
public int $code ;
public int $column ;
public string $message ;
public string $file ;
public int $line ;
}

Propriétés

level

la sévérité de l'erreur (une des constantes suivantes : LIBXML_ERR_WARNING, LIBXML_ERR_ERROR ou LIBXML_ERR_FATAL)

code

Le code de l'erreur.

column

La colonne dans laquelle l'erreur est survenue.

Note:

Cette propriété n'est pas totalement implémentée par la bibliothèque libxml ; aussi, 0 est souvent retourné.

message

Le message d'erreur, s'il y en a.

file

Le nom du fichier, ou vide si le XML a été chargé depuis une chaîne.

line

La ligne depuis laquelle l'erreur est survenue.

User Contributed Notes

There are no user contributed notes for this page.


Fonctions libxml

Sommaire

  • libxml_clear_errors — Vide le buffer d'erreur libxml
  • libxml_disable_entity_loader — Désactive le chargement des entités externes
  • libxml_get_errors — Lit le tableau d'erreurs
  • libxml_get_last_error — Lit la dernière erreur libxml
  • libxml_set_external_entity_loader — Change le chargeur d'entités externes par défaut
  • libxml_set_streams_context — Configure le contexte de flux pour la prochaine opération libxml
  • libxml_use_internal_errors — Désactive le rapport d'erreur libxml et les stocke pour lecture ultérieure

User Contributed Notes

There are no user contributed notes for this page.


Vide le buffer d'erreur libxml

  • « Fonctions libxml
  • libxml_disable_entity_loader »
  • PHP Manual
  • Fonctions libxml
  • Vide le buffer d'erreur libxml

libxml_clear_errors

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

libxml_clear_errors — Vide le buffer d'erreur libxml

Description

libxml_clear_errors ( ) : void

libxml_clear_errors() vide le buffer d'erreur libxml.

Valeurs de retour

Aucune valeur n'est retournée.

Voir aussi

  • libxml_get_errors() - Lit le tableau d'erreurs
  • libxml_get_last_error() - Lit la dernière erreur libxml

User Contributed Notes

There are no user contributed notes for this page.


Désactive le chargement des entités externes

  • « libxml_clear_errors
  • libxml_get_errors »
  • PHP Manual
  • Fonctions libxml
  • Désactive le chargement des entités externes

libxml_disable_entity_loader

(PHP 5 >= 5.2.11, PHP 7, PHP 8)

libxml_disable_entity_loader — Désactive le chargement des entités externes

Avertissement

Cette fonction est OBSOLÈTE à partir de PHP 8.0.0. Dépendre de cette fonction est fortement déconseillé.

Description

libxml_disable_entity_loader ( bool $disable = true ) : bool

Active ou désactive le chargement des entités externes. Il est à noter que désactiver le chargement d'entités externes peut causer des problèmes lors du chargement de documents XML. Cependant à partir de libxml 2.9.0 la substitution d'entités est désactivé par défaut, ainsi il n'est pas nécessaire de désactiver le chargement des entités externes, sauf s'il y a le besoin de résoudre les références d'entités internes avec LIBXML_NOENT. Généralement, il est préférable d'utiliser libxml_set_external_entity_loader() pour réprimer le chargement d'entités externes.

Liste de paramètres

disable

Désactive (true) ou active (false) le chargement des entités externes par les extensions libxml (telles que DOM, XMLWriter et XMLReader).

Valeurs de retour

Retourne la configuration précédente.

Voir aussi

  • libxml_use_internal_errors() - Désactive le rapport d'erreur libxml et les stocke pour lecture ultérieure
  • libxml_set_external_entity_loader() - Change le chargeur d'entités externes par défaut
  • La constante LIBXML_NONET

User Contributed Notes

suconghou at gmail dot com 07-Jan-2021 10:27
In PHP 8.0 and later, PHP uses libxml versions from 2.9.0, libxml_disable_entity_loader is deprecated.
so it is now safe to remove all `libxml_disable_entity_loader` calls on php8

if you want Backwards Compatibility

use this snippet

if (\PHP_VERSION_ID < 80000) {
    libxml_disable_entity_loader(true);
}
vavra at 602 dot cz 04-Jan-2018 09:48
If is called
libxml_disable_entity_loader(true);

, it causes that new SoapClient(.) fails with

SOAP-ERROR: Parsing WSDL: Couldn't load from 'D:\path/dm_operations.wsdl' : failed to load external entity "D:\path/dm_operations.wsdl

because this wsdl imports a xsd as an another external file.
Tested on php 7.1.12, win x64.
brendan at bloodbone dot ws 25-Mar-2014 10:23
This also seems to have an impact on <xsl:import /> statements if this is applied when loading XSLT for the XSLTProcessor class.
phofstetter at sensational dot ch 27-Jan-2014 04:36
Be mindful that this also disables url loading in simplexml_load_file() and likely other libxml based functions that deal with URLs
daschtour at me dot com 25-Dec-2013 11:56
This function was reported to be not thread safe. So this might affect php-scripts on the same server.
simonsimcity 29-Feb-2012 06:23
Using this function you can prevent a vulnerable to Local and Remote File Inclusion attacks.

You'll see it in an example where I load and validate the following string:

<!DOCTYPE scan [<!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">]>
<scan>&test;</scan>

One way to prevent that the file in given back is to set this value to 0.
Please take a closer look at the release of symfony 2.0.11


Lit le tableau d'erreurs

  • « libxml_disable_entity_loader
  • libxml_get_last_error »
  • PHP Manual
  • Fonctions libxml
  • Lit le tableau d'erreurs

libxml_get_errors

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

libxml_get_errors — Lit le tableau d'erreurs

Description

libxml_get_errors ( ) : array

Retourne un tableau d'erreurs.

Valeurs de retour

libxml_get_errors() retourne un tableau avec les objets LibXMLError qui représentent les erreurs, ou bien un tableau vide s'il n'y a pas d'erreurs.

Exemples

Exemple #1 Exemple avec libxml_get_errors()

Cet exemple montre comment créer un gestionnaire d'erreurs libxml simple.

<?php

libxml_use_internal_errors(true);

$xmlstr = <<< XML
<?xml version='1.0' standalone='yes'?>
<movies>
 <movie>
  <titles>PHP: Behind the Parser</title>
 </movie>
</movies>
XML;

$doc = simplexml_load_string($xmlstr);
$xml = explode("\n", $xmlstr);

if ($doc === false) {
    $errors = libxml_get_errors();

    foreach ($errors as $error) {
        echo display_xml_error($error, $xml);
    }

    libxml_clear_errors();
}

function display_xml_error($error, $xml)
{
    $return  = $xml[$error->line - 1] . "\n";
    $return .= str_repeat('-', $error->column) . "^\n";

    switch ($error->level) {
        case LIBXML_ERR_WARNING:
            $return .= "Warning $error->code: ";
            break;
         case LIBXML_ERR_ERROR:
            $return .= "Error $error->code: ";
            break;
        case LIBXML_ERR_FATAL:
            $return .= "Fatal Error $error->code: ";
            break;
    }

    $return .= trim($error->message) .
               "\n  Line: $error->line" .
               "\n  Column: $error->column";

    if ($error->file) {
        $return .= "\n  File: $error->file";
    }

    return "$return\n\n--------------------------------------------\n\n";
}

?>

L'exemple ci-dessus va afficher :

  <titles>PHP: Behind the Parser</title>
----------------------------------------------^
Fatal Error 76: Opening and ending tag mismatch: titles line 4 and title
  Line: 4
  Column: 46

--------------------------------------------

Voir aussi

  • libxml_get_last_error() - Lit la dernière erreur libxml
  • libxml_clear_errors() - Vide le buffer d'erreur libxml

User Contributed Notes

lech 29-Jul-2017 12:12
Please beware that the column property seems almost always to be invalid. I thought it only occurred when the line in question was long (and I was just about to submit a bug report with an example), however, at the time of posting, you can even see the problem in the example provided on this page: line 4 does not even have 46 characters. Where the XML line is long, the difference can be very large.

This property comes from the libxml extension, so in any case I don't think this is a PHP bug, however it is worth knowing that the value might be totally unreliable to save some confusion.

The PHP documentation page for the libXMLError class gives some indication, stating:

"This property isn't entirely implemented in libxml and therefore 0 is often returned."

(My libxml version: 2.9.1)


Lit la dernière erreur libxml

  • « libxml_get_errors
  • libxml_set_external_entity_loader »
  • PHP Manual
  • Fonctions libxml
  • Lit la dernière erreur libxml

libxml_get_last_error

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

libxml_get_last_error — Lit la dernière erreur libxml

Description

libxml_get_last_error ( ) : LibXMLError|false

libxml_get_last_error() lit la dernière erreur libxml.

Valeurs de retour

libxml_get_last_error() retourne un objet LibXMLError s'il y a une erreur, et false sinon.

Voir aussi

  • libxml_get_errors() - Lit le tableau d'erreurs
  • libxml_clear_errors() - Vide le buffer d'erreur libxml

User Contributed Notes

There are no user contributed notes for this page.


Change le chargeur d'entités externes par défaut

  • « libxml_get_last_error
  • libxml_set_streams_context »
  • PHP Manual
  • Fonctions libxml
  • Change le chargeur d'entités externes par défaut

libxml_set_external_entity_loader

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

libxml_set_external_entity_loader — Change le chargeur d'entités externes par défaut

Description

libxml_set_external_entity_loader ( callable|null $resolver_function ) : bool

Change le chargeur d'entités externes par défaut. Ceci peut être utilisé pour réprimer l'expansion d'entités externes arbitraire pour prévenir les attaques XXE, même si LIBXML_NOENT a été définie pour l'opération respective, et ceci est généralement préférable à appeler libxml_disable_entity_loader().

Liste de paramètres

resolver_function

Un callable avec la signature suivante :

resolver ( string $public_id , string $system_id , array $context ) : resource|string|null
public_id
L'ID public.
system_id
L'ID système.
context
Un tableau contenant quatre éléments "directory", "intSubName", "extSubURI" et "extSubSystem".
Cette callable devrait retourner une ressource, une chaîne de caractères par laquelle une ressource peut être ouverte. Si null est retourné, la résolution de référence d'entité échouera.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec libxml_set_external_entity_loader()

<?php
$xml = <<<XML
<!DOCTYPE foo PUBLIC "-//FOO/BAR" "http://example.com/foobar">
<foo>bar</foo>
XML;

$dtd = <<<DTD
<!ELEMENT foo (#PCDATA)>
DTD;

libxml_set_external_entity_loader(
    function ($public, $system, $context) use($dtd) {
        var_dump($public);
        var_dump($system);
        var_dump($context);
        $f = fopen("php://temp", "r+");
        fwrite($f, $dtd);
        rewind($f);
        return $f;
    }
);

$dd = new DOMDocument;
$r  = $dd->loadXML($xml);

var_dump($dd->validate());
?>

L'exemple ci-dessus va afficher :

string(10) "-//FOO/BAR"
string(25) "http://example.com/foobar"
array(4) {
    ["directory"]    => NULL
    ["intSubName"]   => NULL
    ["extSubURI"]    => NULL
    ["extSubSystem"] => NULL
}
bool(true)

Voir aussi

  • libxml_disable_entity_loader() - Désactive le chargement des entités externes

User Contributed Notes

There are no user contributed notes for this page.


Configure le contexte de flux pour la prochaine opération libxml

  • « libxml_set_external_entity_loader
  • libxml_use_internal_errors »
  • PHP Manual
  • Fonctions libxml
  • Configure le contexte de flux pour la prochaine opération libxml

libxml_set_streams_context

(PHP 5, PHP 7, PHP 8)

libxml_set_streams_context — Configure le contexte de flux pour la prochaine opération libxml

Description

libxml_set_streams_context ( resource $context ) : void

libxml_set_streams_context() configure le contexte de flux pour la prochaine opération libxml.

Liste de paramètres

context

La ressource de contexte de flux, créé avec la fonction stream_context_create().

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec libxml_set_streams_context()

<?php

$opts = array(
    'http' => array(
        'user_agent' => 'PHP libxml agent',
    )
);

$context = stream_context_create($opts);
libxml_set_streams_context($context);

// lit un fichier via HTTP
$doc = DOMDocument::load('http://www.example.com/file.xml');

?>

Voir aussi

  • stream_context_create() - Crée un contexte de flux

User Contributed Notes

There are no user contributed notes for this page.


Désactive le rapport d'erreur libxml et les stocke pour lecture ultérieure

  • « libxml_set_streams_context
  • SimpleXML »
  • PHP Manual
  • Fonctions libxml
  • Désactive le rapport d'erreur libxml et les stocke pour lecture ultérieure

libxml_use_internal_errors

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

libxml_use_internal_errors — Désactive le rapport d'erreur libxml et les stocke pour lecture ultérieure

Description

libxml_use_internal_errors ( bool|null $use_errors = null ) : bool

libxml_use_internal_errors() vous permet de désactiver le gestionnaire d'erreurs libxml standard, et d'activer votre propre gestionnaire d'erreur.

Liste de paramètres

use_errors

Active (true) le gestionnaire d'erreurs utilisateur ou le désactive (false). La désactivation effacera aussi toutes les erreurs libxml existantes.

Valeurs de retour

libxml_use_internal_errors() retourne la valeur précédemment configurée pour use_errors.

Historique

Version | Description
8.0.0 | use_errors est désormais nullable. Auparavant, sa valeur par défaut était false.

Exemples

Exemple #1 Exemple avec libxml_use_internal_errors()

Cet exemple montre l'utilisation de base des erreurs libxml, et la valeur retournée par cette fonction.

<?php

// active la gestion d'erreur personnalisée
var_dump(libxml_use_internal_errors(true));

// Chargement du document
$doc = new DOMDocument;

if (!$doc->load('file.xml')) {
    foreach (libxml_get_errors() as $error) {
        // gérer les erreurs ici
    }

    libxml_clear_errors();
}

?>

L'exemple ci-dessus va afficher :

bool(false)

Voir aussi

  • libxml_clear_errors() - Vide le buffer d'erreur libxml
  • libxml_get_errors() - Lit le tableau d'erreurs

User Contributed Notes

marcovtwout 07-May-2013 01:05
When using libxml_use_internal_errors(true), and perform a possibly memory intensive operation like simplexml_load_string() next, you might end up with a blank screen and no php error logged because the error message been suppressed.
james at dunmore dot me dot uk 21-Aug-2008 03:03
We use a custom error handler using  set_error_handler()  I found that after I call

libxml_use_internal_errors(false);

It resets my error_handler - not sure if this is a bug or not, I will report it as a bug - however, I needed to repeat my call to set_error_handler

(did confuse me for a while)
B Crawford 03-Oct-2007 06:22
When using this funtion, be sure to clear your internal error buffer. If you dn't and you are using this in a long running process, you may find that all your memory is used up.


SimpleXML

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Exemples
    • Utilisation de base SimpleXML
    • Traitement des erreurs XML
  • SimpleXMLElement — La classe SimpleXMLElement
    • SimpleXMLElement::addAttribute — Ajoute un attribut à l'élément SimpleXML
    • SimpleXMLElement::addChild — Ajoute un élément enfant au noeud XML
    • SimpleXMLElement::asXML — Retourne une chaîne XML basée sur un élément SimpleXML
    • SimpleXMLElement::attributes — Identifie les attributs d'un élément
    • SimpleXMLElement::children — Cherche les fils d'un noeud donné
    • SimpleXMLElement::__construct — Crée un nouvel objet SimpleXMLElement
    • SimpleXMLElement::count — Compte le nombre de fils pour un élément
    • SimpleXMLElement::getDocNamespaces — Retourne les espaces de noms déclarés dans un document
    • SimpleXMLElement::getName — Récupère le nom d'un élément XML
    • SimpleXMLElement::getNamespaces — Retourne les espaces de noms utilisés dans un document
    • SimpleXMLElement::registerXPathNamespace — Crée un contexte préfixe/ns pour la prochaine requête XPath
    • SimpleXMLElement::saveXML — Alias de SimpleXMLElement::asXML
    • SimpleXMLElement::__toString — Retourne le contenu sous forme de chaine
    • SimpleXMLElement::xpath — Exécute une requête Xpath sur des données XML
  • SimpleXMLIterator — La classe SimpleXMLIterator
    • SimpleXMLIterator::current — Retourne l'entrée courante
    • SimpleXMLIterator::getChildren — Retourne un itérateur pour l'entrée courante, si c'est un objet SimpleXML
    • SimpleXMLIterator::hasChildren — Indique si l'entrée courante de SimpleXML est un objet
    • SimpleXMLIterator::key — Retourne la clé courante
    • SimpleXMLIterator::next — Se déplace sur l'entrée SimpleXML suivante
    • SimpleXMLIterator::rewind — Replace le pointeur SimpleXML au début
    • SimpleXMLIterator::valid — Vérifie si une ressource SimpleXML contient d'autres entrées
  • Fonctions SimpleXML
    • simplexml_import_dom — Construit un objet SimpleXMLElement à partir d'un objet DOM
    • simplexml_load_file — Convertit un fichier XML en objet
    • simplexml_load_string — Convertit une chaîne XML en objet

User Contributed Notes

Anonymous 25-Dec-2019 09:10
<?php
function array_to_xml( $array, $xml = null ) {
  if ( is_array( $array ) ) {
    foreach( $array as $key => $value ) {
      if ( is_int( $key ) ) {
        if ( $key == 0 ) {
          $node = $xml;
        } else {
          $parent = $xml->xpath( ".." )[0];
          $node = $parent->addChild( $xml->getName() );
        }
      } else {
        $node = $xml->addChild( $key );
      }
      array_to_xml( $value, $node );
    }
  } else {
    $xml[0] = $array;
  }
}

$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\"?><root></root>" );

array_to_xml( $array, $xml );
echo $xml->asXML();
?>
charles dot a dot dacosta at gmail dot com 15-Nov-2016 09:49
I had to do the following to catch the fact that my simplexml_load_string call was not working right (it was returning empty objects).

$statistik = simplexml_load_string($record,"SimpleXMLElement",LIBXML_NSCLEAN,$ns,TRUE);

    if (($statistik === FALSE) or ($statistik === NULL) or empty($statistik))
    {
        echo "$ctr) STATISTIK ERROR---\n";
        var_dump($statistik);
        echo "\n\n";
        echo "Failed loading XML\n";
        foreach(libxml_get_errors() as $error)
        {
            echo "\n", $error->message;
        }
        die();
    }

before I put the check for "empty()" I was not catching the error.
oleg at mastak dot fi 30-Mar-2016 09:57
Two lines xml2array:

<?php

$xml = simplexml_load_string($xmlstring);
$array = (array) $xml;

?>
Serge 26-Feb-2015 10:58
XML data values should not contain "&" and that need to be replaced by html-entity "&amp;"

You can use this code to replace lonely "&" to "&amp;":

<?php
$sText = preg_replace('#&(?![a-z]{1,6};)#i', '&amp;', $sText);
?>

This will replace just "&" into "&amp;" but dont touches other html-entities like "&nbsp;", "&lt;" etc and, of course, "&amp;".

P.S. In regexp max length is 6 becouse I found that is the maximum length of possible html entity using this code:
<?php
max(array_map('strlen', array_values(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES | ENT_HTML5)))) - 2
?>
minus two is for first "&" and last ";" in an any html entity.
Tim Adam Perez 23-Jan-2014 08:22
XML to Array in a single line:
$array = (array) simplexml_load_string($xml);

Enjoy!
maikel at yuluma dot com 17-Oct-2013 09:02
In reply to  soloman at textgrid dot com,

2 line XML2Array:

$xml = simplexml_load_string($file);
$array = (array)$xml;
dkrnl at yandex dot ru 30-Sep-2013 02:57
Wrapper XMLReader class, for simple SAX-reading huge xml:
https://github.com/dkrnl/SimpleXMLReader

Usage example: http://github.com/dkrnl/SimpleXMLReader/blob/master/examples/example1.php

<?php

/**
 * Simple XML Reader
 *
 * @license Public Domain
 * @author Dmitry Pyatkov(aka dkrnl) <dkrnl@yandex.ru>
 * @url http://github.com/dkrnl/SimpleXMLReader
 */
class SimpleXMLReader extends XMLReader
{

    /**
     * Callbacks
     *
     * @var array
     */
    protected $callback = array();

    /**
     * Add node callback
     *
     * @param  string   $name
     * @param  callback $callback
     * @param  integer  $nodeType
     * @return SimpleXMLReader
     */
    public function registerCallback($name, $callback, $nodeType = XMLREADER::ELEMENT)
    {
        if (isset($this->callback[$nodeType][$name])) {
            throw new Exception("Already exists callback $name($nodeType).");
        }
        if (!is_callable($callback)) {
            throw new Exception("Already exists parser callback $name($nodeType).");
        }
        $this->callback[$nodeType][$name] = $callback;
        return $this;
    }

    /**
     * Remove node callback
     *
     * @param  string  $name
     * @param  integer $nodeType
     * @return SimpleXMLReader
     */
    public function unRegisterCallback($name, $nodeType = XMLREADER::ELEMENT)
    {
        if (!isset($this->callback[$nodeType][$name])) {
            throw new Exception("Unknow parser callback $name($nodeType).");
        }
        unset($this->callback[$nodeType][$name]);
        return $this;
    }

    /**
     * Run parser
     *
     * @return void
     */
    public function parse()
    {
        if (empty($this->callback)) {
            throw new Exception("Empty parser callback.");
        }
        $continue = true;
        while ($continue && $this->read()) {
            if (isset($this->callback[$this->nodeType][$this->name])) {
                $continue = call_user_func($this->callback[$this->nodeType][$this->name], $this);
            }
        }
    }

    /**
     * Run XPath query on current node
     *
     * @param  string $path
     * @param  string $version
     * @param  string $encoding
     * @return array(SimpleXMLElement)
     */
    public function expandXpath($path, $version = "1.0", $encoding = "UTF-8")
    {
        return $this->expandSimpleXml($version, $encoding)->xpath($path);
    }

    /**
     * Expand current node to string
     *
     * @param  string $version
     * @param  string $encoding
     * @return SimpleXMLElement
     */
    public function expandString($version = "1.0", $encoding = "UTF-8")
    {
        return $this->expandSimpleXml($version, $encoding)->asXML();
    }

    /**
     * Expand current node to SimpleXMLElement
     *
     * @param  string $version
     * @param  string $encoding
     * @param  string $className
     * @return SimpleXMLElement
     */
    public function expandSimpleXml($version = "1.0", $encoding = "UTF-8", $className = null)
    {
        $element = $this->expand();
        $document = new DomDocument($version, $encoding);
        $node = $document->importNode($element, true);
        $document->appendChild($node);
        return simplexml_import_dom($node, $className);
    }

    /**
     * Expand current node to DomDocument
     *
     * @param  string $version
     * @param  string $encoding
     * @return DomDocument
     */
    public function expandDomDocument($version = "1.0", $encoding = "UTF-8")
    {
        $element = $this->expand();
        $document = new DomDocument($version, $encoding);
        $node = $document->importNode($element, true);
        $document->appendChild($node);
        return $document;
    }

}
?>
whyme 28-Dec-2012 09:55
Simple means simple.  If you know the structure and just want the value of a tag:

<?php
$xml = simplexml_load_file($xmlfile);
print $xml->City->Street->Address->HouseColor;
?>

Warning, numbers can come out as strings, empty elements like <HouseColor></HouseColor> come out as array(0)
Laurent Vervisch 24-Jun-2012 10:57
Here is an example of an easy mapping between xml and classes defined by user.

<?php
class XmlClass extends SimpleXMLElement
{
    /**
     * Returns this object as an instance of the given class.
     */
    public function asInstanceOf($class_name)
    {
        // should check that class_name is valid

        return simplexml_import_dom(dom_import_simplexml($this), $class_name);
    }

    public function __call($name, array $arguments)
    {
        echo "magic __call called for method $name on instance of ".get_class()."\n";

        // class could be mapped according $this->getName()
        $class_name = 'Test';

        $instance = $this->asInstanceOf($class_name);
        return call_user_func_array(array($instance, $name), $arguments);
    }
}

class Test extends XmlClass
{
    public function setValue($string)
    {
        $this->{0} = $string;
    }
}

$xml = new XmlClass('<example><test/></example>');
$test = $xml->test->asInstanceOf('Test');
echo get_class($xml->test), "\n";
echo get_class($test), "\n";

$test->setValue('value set directly by instance of Test');
echo (string)$xml->test, "\n";
echo (string)$test, "\n";

$xml->test->setValue('value set by instance of XmlClass and magic __call');
echo (string)$xml->test, "\n";
echo (string)$test, "\n";
?>

XmlClass
Test
value set directly by instance of Test
value set directly by instance of Test
magic __call called for method setValue on instance of XmlClass
value set by instance of XmlClass and magic __call
value set by instance of XmlClass and magic __call
xaviered at gmail dot com 17-May-2012 07:00
Here is a recursive function that will convert a given SimpleXMLElement object into an array, preserving namespaces and attributes.

<?php
function xmlObjToArr($obj) {
        $namespace = $obj->getDocNamespaces(true);
        $namespace[NULL] = NULL;

        $children = array();
        $attributes = array();
        $name = strtolower((string)$obj->getName());

        $text = trim((string)$obj);
        if( strlen($text) <= 0 ) {
            $text = NULL;
        }

        // get info for all namespaces
        if(is_object($obj)) {
            foreach( $namespace as $ns=>$nsUrl ) {
                // atributes
                $objAttributes = $obj->attributes($ns, true);
                foreach( $objAttributes as $attributeName => $attributeValue ) {
                    $attribName = strtolower(trim((string)$attributeName));
                    $attribVal = trim((string)$attributeValue);
                    if (!empty($ns)) {
                        $attribName = $ns . ':' . $attribName;
                    }
                    $attributes[$attribName] = $attribVal;
                }

                // children
                $objChildren = $obj->children($ns, true);
                foreach( $objChildren as $childName=>$child ) {
                    $childName = strtolower((string)$childName);
                    if( !empty($ns) ) {
                        $childName = $ns.':'.$childName;
                    }
                    $children[$childName][] = xmlObjToArr($child);
                }
            }
        }

        return array(
            'name'=>$name,
            'text'=>$text,
            'attributes'=>$attributes,
            'children'=>$children
        );
    }
?>
thedoc8786 at gmail dot com 23-Mar-2012 07:42
FAIL! This function works better than the one I posted below:

<?php
    function toArray($xml) {
        $array = json_decode(json_encode($xml), TRUE);

        foreach ( array_slice($array, 0) as $key => $value ) {
            if ( empty($value) ) $array[$key] = NULL;
            elseif ( is_array($value) ) $array[$key] = toArray($value);
        }

        return $array;
    }
thedoc8786 at gmail dot com 23-Mar-2012 04:19
I know it is over-done, but the following is a super-short example of a XML to Array conversion function (recursive):

<?php
    function toArray(SimpleXMLElement $xml) {
        $array = (array)$xml;

        foreach ( array_slice($array, 0) as $key => $value ) {
            if ( $value instanceof SimpleXMLElement ) {
                $array[$key] = empty($value) ? NULL : toArray($value);
            }
        }
        return $array;
    }
xananax at yelostudio dot com 07-Sep-2011 06:25
None of the XML2Array functions that I found satisfied me completely; Their results did not always fit the project I was working on, and I found none that would account for repeating XML elements (such as
<fields><field/><field/><field/></fields>)
So I rolled out my own; hope it helps someone.
<?php
/**
 * Converts a simpleXML element into an array. Preserves attributes.<br/>
 * You can choose to get your elements either flattened, or stored in a custom
 * index that you define.<br/>
 * For example, for a given element
 * <code>
 * <field name="someName" type="someType"/>
 * </code>
 * <br>
 * if you choose to flatten attributes, you would get:
 * <code>
 * $array['field']['name'] = 'someName';
 * $array['field']['type'] = 'someType';
 * </code>
 * If you choose not to flatten, you get:
 * <code>
 * $array['field']['@attributes']['name'] = 'someName';
 * </code>
 * <br>__________________________________________________________<br>
 * Repeating fields are stored in indexed arrays. so for a markup such as:
 * <code>
 * <parent>
 *     <child>a</child>
 *     <child>b</child>
 *     <child>c</child>
 * ...
 * </code>
 * you array would be:
 * <code>
 * $array['parent']['child'][0] = 'a';
 * $array['parent']['child'][1] = 'b';
 * ...And so on.
 * </code>
 * @param simpleXMLElement    $xml            the XML to convert
 * @param boolean|string    $attributesKey    if you pass TRUE, all values will be
 *                                            stored under an '@attributes' index.
 *                                            Note that you can also pass a string
 *                                            to change the default index.<br/>
 *                                            defaults to null.
 * @param boolean|string    $childrenKey    if you pass TRUE, all values will be
 *                                            stored under an '@children' index.
 *                                            Note that you can also pass a string
 *                                            to change the default index.<br/>
 *                                            defaults to null.
 * @param boolean|string    $valueKey        if you pass TRUE, all values will be
 *                                            stored under an '@values' index. Note
 *                                            that you can also pass a string to
 *                                            change the default index.<br/>
 *                                            defaults to null.
 * @return array the resulting array.
 */
function simpleXMLToArray(SimpleXMLElement $xml,$attributesKey=null,$childrenKey=null,$valueKey=null){

    if($childrenKey && !is_string($childrenKey)){$childrenKey = '@children';}
    if($attributesKey && !is_string($attributesKey)){$attributesKey = '@attributes';}
    if($valueKey && !is_string($valueKey)){$valueKey = '@values';}

    $return = array();
    $name = $xml->getName();
    $_value = trim((string)$xml);
    if(!strlen($_value)){$_value = null;};

    if($_value!==null){
        if($valueKey){$return[$valueKey] = $_value;}
        else{$return = $_value;}
    }

    $children = array();
    $first = true;
    foreach($xml->children() as $elementName => $child){
        $value = simpleXMLToArray($child,$attributesKey, $childrenKey,$valueKey);
        if(isset($children[$elementName])){
            if(is_array($children[$elementName])){
                if($first){
                    $temp = $children[$elementName];
                    unset($children[$elementName]);
                    $children[$elementName][] = $temp;
                    $first=false;
                }
                $children[$elementName][] = $value;
            }else{
                $children[$elementName] = array($children[$elementName],$value);
            }
        }
        else{
            $children[$elementName] = $value;
        }
    }
    if($children){
        if($childrenKey){$return[$childrenKey] = $children;}
        else{$return = array_merge($return,$children);}
    }

    $attributes = array();
    foreach($xml->attributes() as $name=>$value){
        $attributes[$name] = trim($value);
    }
    if($attributes){
        if($attributesKey){$return[$attributesKey] = $attributes;}
        else{$return = array_merge($return, $attributes);}
    }

    return $return;
}
?>
soloman at textgrid dot com 09-Aug-2011 05:06
Three line xml2array:

<?php

$xml = simplexml_load_string($xmlstring);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

?>

Ta da!
streaver91 at gmail dot com 04-May-2011 08:49
The BIGGEST differece between an XML and a PHP array is that in an XML file, the name of elements can be the same even if they are siblings, eg. "<pa><ch /><ch /><ch /></pa>", while in an PHP array, the key of which must be different.

I think the array structure developed by svdmeer can fit for XML, and fits well.

here is an example array converted from an xml file:
array(
"@tag"=>"name",
"@attr"=>array(
    "id"=>"1","class"=>"2")
"@text"=>"some text",
)

or if it has childrens, that can be:

array(
"@tag"=>"name",
"@attr"=>array(
    "id"=>"1","class"=>"2")
"@items"=>array(
    0=>array(
        "@tag"=>"name","@text"=>"some text"
    )
)

Also, I wrote a function that can change that array back to XML.

<?php
function array2XML($arr,$root) {
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><{$root}></{$root}>");
$f = create_function('$f,$c,$a','
        foreach($a as $v) {
            if(isset($v["@text"])) {
                $ch = $c->addChild($v["@tag"],$v["@text"]);
            } else {
                $ch = $c->addChild($v["@tag"]);
                if(isset($v["@items"])) {
                    $f($f,$ch,$v["@items"]);
                }
            }
            if(isset($v["@attr"])) {
                foreach($v["@attr"] as $attr => $val) {
                    $ch->addAttribute($attr,$val);
                }
            }
        }');
$f($f,$xml,$arr);
return $xml->asXML();
}
?>
phil at dier dot us 19-Jan-2011 11:37
Here's a function I came up with to convert an associative array to XML.  Works for multidimensional arrays as well.

<?php
function assocArrayToXML($root_element_name,$ar)
{
    $xml = new SimpleXMLElement("<?xml version=\"1.0\"?><{$root_element_name}></{$root_element_name}>");
    $f = create_function('$f,$c,$a','
            foreach($a as $k=>$v) {
                if(is_array($v)) {
                    $ch=$c->addChild($k);
                    $f($f,$ch,$v);
                } else {
                    $c->addChild($k,$v);
                }
            }');
    $f($f,$xml,$ar);
    return $xml->asXML();
}
?>
philipp at strazny dot com 23-Nov-2010 05:33
Here's a quick way to dump the nodeValues from SimpleXML into an array using the path to each nodeValue as key. The paths are compatible with e.g. DOMXPath. I use this when I need to update values externally (i.e. in code that doesn't know about the underlying xml). Then I use DOMXPath to find the node containing the original value and update it.

<?php
function XMLToArrayFlat($xml, &$return, $path='', $root=false)
{
    $children = array();
    if ($xml instanceof SimpleXMLElement) {
        $children = $xml->children();
        if ($root){ // we're at root
            $path .= '/'.$xml->getName();
        }
    }
    if ( count($children) == 0 ){
        $return[$path] = (string)$xml;
        return;
    }
    $seen=array();
    foreach ($children as $child => $value) {
        $childname = ($child instanceof SimpleXMLElement)?$child->getName():$child;
        if ( !isset($seen[$childname])){
            $seen[$childname]=0;
        }
        $seen[$childname]++;
        XMLToArrayFlat($value, $return, $path.'/'.$child.'['.$seen[$childname].']');
    }
}
?>

Use like this:

<?php
$xml = simplexml_load_string(...some xml string...);
$xmlarray = array(); // this will hold the flattened data
XMLToArrayFlat($xml, $xmlarray, '', true);
?>

You can also pull multiple files in one array:

<?php
foreach($files as $file){
    $xml = simplexml_load_file($file);
    XMLToArrayFlat($xml, $xmlarray, $file.':', true);
}
?>
The respective filename/path is thus prefixed to each key.
kristof at viewranger dot com 18-Nov-2010 05:14
If you tried to load an XML file with this, but the CDATA parts were not loaded for some reason, is because you should do it this way:

$xml = simplexml_load_file($this->filename, 'SimpleXMLElement', LIBXML_NOCDATA);

This converts CDATA to String in the returning object.
sherwinterunez at yahoo dot com 01-Sep-2010 11:15
<?php

// Sherwin R. Terunez
//
// This is my own version of XML Object to Array
//

function amstore_xmlobj2array($obj, $level=0) {

    $items = array();

    if(!is_object($obj)) return $items;

    $child = (array)$obj;

    if(sizeof($child)>1) {
        foreach($child as $aa=>$bb) {
            if(is_array($bb)) {
                foreach($bb as $ee=>$ff) {
                    if(!is_object($ff)) {
                        $items[$aa][$ee] = $ff;
                    } else
                    if(get_class($ff)=='SimpleXMLElement') {
                        $items[$aa][$ee] = amstore_xmlobj2array($ff,$level+1);
                    }
                }
            } else
            if(!is_object($bb)) {
                $items[$aa] = $bb;
            } else
            if(get_class($bb)=='SimpleXMLElement') {
                $items[$aa] = amstore_xmlobj2array($bb,$level+1);
            }
        }
    } else
    if(sizeof($child)>0) {
        foreach($child as $aa=>$bb) {
            if(!is_array($bb)&&!is_object($bb)) {
                $items[$aa] = $bb;
            } else
            if(is_object($bb)) {
                $items[$aa] = amstore_xmlobj2array($bb,$level+1);
            } else {
                foreach($bb as $cc=>$dd) {
                    if(!is_object($dd)) {
                        $items[$obj->getName()][$cc] = $dd;
                    } else
                    if(get_class($dd)=='SimpleXMLElement') {
                        $items[$obj->getName()][$cc] = amstore_xmlobj2array($dd,$level+1);
                    }
                }
            }
        }
    }

    return $items;
}

?>
michael dot allen at emp dot shentel dot com 15-Apr-2010 11:06
Here is a very robust SimpleXML parser.  Can be used to load files, strings, or DOM into SimpleXML, or can be used to perform the reverse when handed SimpleXML.

<?php
/**
 * XMLParser Class File
 *
 * This class loads an XML document into a SimpleXMLElement that can
 * be processed by the calling application.  This accepts xml strings,
 * files, and DOM objects.  It can also perform the reverse, converting
 * an SimpleXMLElement back into a string, file, or DOM object.
 */
class XMLParser {
    /**
     * While parsing, parse the supplied XML document.
     *
     * Sets up a SimpleXMLElement object based on success of parsing
     * the XML document file.
     *
     * @param string $doc the xml document location path
     * @return object
     */
    public static function loadFile($doc) {
        if (file_exists($doc)) {
            return simplexml_load_file($doc);
        } else {
            throw new Exception ("Unable to load the xml file " .
                                 "using: \"$doc\"", E_USER_ERROR);
        }
    }
    /**
     * While parsing, parse the supplied XML string.
     *
     * Sets up a SimpleXMLElement object based on success of parsing
     * the XML string.
     *
     * @param string $string the xml document string
     * @return object
     */
    public static function loadString($string) {
        if (isset($string)) {
            return simplexml_load_string($string);
        } else {
            throw new Exception ("Unable to load the xml string " .
                                 "using: \"$string\"", E_USER_ERROR);
        }
    }
    /**
     * While parsing, parse the supplied XML DOM node.
     *
     * Sets up a SimpleXMLElement object based on success of parsing
     * the XML DOM node.
     *
     * @param object $dom the xml DOM node
     * @return object
     */
    public static function loadDOM($dom) {
        if (isset($dom)) {
            return simplexml_import_dom($dom);
        } else {
            throw new Exception ("Unable to load the xml DOM node " .
                                 "using: \"$dom\"", E_USER_ERROR);
        }
    }
    /**
     * While parsing, parse the SimpleXMLElement.
     *
     * Sets up a XML file, string, or DOM object based on success of
     * parsing the XML DOM node.
     *
     * @param object $path the xml document location path
     * @param string $type the return type (string, file, dom)
     * @param object $simplexml the simple xml element
     * @return mixed
     */
    public static function loadSXML($simplexml, $type, $path) {
        if (isset($simplexml) && isset($type)) {
        switch ($type) {
            case 'string':
                return $simplexml->asXML();
            break;
            case 'file':
                if (isset($path)) {
                    return $simplexml->asXML($path);
                } else {
                    throw new Exception ("Unable to create the XML file. Path is missing or" .
                                         "is invalid: \"$path\"", E_USER_ERROR);
                }
            break;
            case 'dom':
                return dom_import_simplexml($simplexml);
            break;
        }
        } else {
            throw new Exception ("Unable to load the simple XML element " .
                                 "using: \"$simplexml\"", E_USER_ERROR);
        }
    }
}
?>
emmanuel 17-Feb-2010 10:21
dynamic sql in php using xml:

test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<sql>
    <statement>
        SELECT * FROM USERS
        <call criteria="byId">WHERE id = %d</call>
        <call criteria="byUsername">WHERE username = "%s"</call>;
    </statement>
</sql>

index.php:
<?php
function callMe($param) {
    $search = array('byUsername' => 'dynsql');

    if (isset($search[$param[1]])) {
        return sprintf($param[2], $search[$param[1]]);
    }

    return "";
}

$xml = simplexml_load_file("test.xml");
$string = $xml->statement->asXML();
$string = preg_replace_callback('/<call criteria="(\w+)">(.*?)<\/call>/', 'callMe', $string);
$node = simplexml_load_string($string);
echo $node;
?>

obviously, this example can be improved [in your own code.]
mahmutta at gmail dot com 20-Jan-2010 12:58
while using simple xml and get double or float int value from xml object for using math operations (+ * - / ) some errors happens on the operation, this is because of simple xml returns everythings to objects.
exmple;

<?php

$name = "somestring";
$size = 11.45;
$xml = '
<xml>
 <name>somestring</name>
 <size>11.45</size>
</xml>';

$xmlget = simplexml_load_string($xml)

echo $xml->size*2;    // 20  its false
// ($xml->size is an object (int)11 and  (45) )

// this is true
echo $size*2;            // 22.90
echo (float)$size*2;   // 22.90
?>
antoine dot rabanes at gmail dot com 16-Oct-2009 07:22
if for some reasons you need the string value instead of the simpleXML Object you can cast the return value as a string.

exemple:

<?php
$all_api_call = simplexml_load_file($url);
$all_api = array();
$all_api = $all_api_call->result;
$list_all_api_name = array();
$i = 0;
foreach ($all_api->children() as $funcky_function)
{
    $string_tmp = (string )$funcky_function->function;
    $list_all_api_name[$i++] = $putain;
}
?>

...
walter 12-Jun-2009 07:58
Working fix for the infamous SimpleXML + memcache bug.

Improves code at http://tinyurl.com/bmoon-simplexml to actually work for arbitrary-depth structures.  (Because neither the function nor the json_decode(json_encode($obj)) hack listed there worked for me.)

There's probably some superfluous code in here that could be improved on -- but it works!

<?php
 # convert a structure that may include objects to a pure
 # array-based structure (that can be stored in memcache)
 #  ... includes support for simplexml!
 # (nb: may have problems with infinite recursive structs)
 function enforce_array($obj) {
  $array = (array)$obj;
  if(empty($array)) {
   $array = '';
  }
  else {
   foreach($array as $key=>$value) {
    if(!is_scalar($value)) {
     if(is_a($value,'SimpleXMLElement')) {
      $tmp = memcache_objects_to_array($value);
      if(!is_array($tmp)) {
       $tmp = ''.$value;
      }
      $array[$key] = $tmp;
     }
     else {
      $array[$key] = enforce_array($value);
     }
    }
    else {
     $array[$key] = $value;
    }
   }
  }
  return $array;
 }
?>
mail at kleineedv dot de 28-Apr-2009 12:37
I had a problem with simplexml reading nodes from an xml file. It always return an SimpleXML-Object but not the text inside the node.

Example:
<?xml version="1.0" encoding="UTF-8"?>
<Test>
    <Id>123</Id>
</Test>

Reading this xml into a variable called $xml and then doing the following
<?php
$myId = $xml->Id;
?>
Did not return 123 in $myId, but instead I got a SimpleXMLElement Object.

The solution is simple, when you know it. Use explicit string conversion.
<?php
$myId = (string)$xml->Id;
?>
oscargodson at gmail dot com 25-Jan-2009 03:05
To add to what others have said, you can't directly put a $_GET or $_POST value into a variable then into an attribute using SimpleXML. You must first convert it to an integer.

This will NOT work

<?php
      $page_id = $_GET['id'];
      echo $xml->page[$page_id]
?>

You will get something like:
Notice: Trying to get property of non-object in /Applications/MAMP/htdocs/mysite/index.php on line 10

However, this WILL work and is much simpler then using (string) or other methods.
<?php
   $page_id = intval($_GET['id']);
   echo $xml->page[$page_id]
?>
bxt at die-optimisten dot net 26-Nov-2008 07:47
Addition to QLeap's post:
SimpleXML will return a reference to an object containing the node value and you can't use references in session variables as there is no feasible way to restore a reference to another variable.

This won't work too:
$val=$this->xml->node->attributes()->name;
echo $array[$val]; // will cause a warning because of the wrong index type.

You have to convert/cast to a String first:
echo $array[(string)$val];

This will work as expected, because converting will call the __toString() method. Therefor echo works too:
echo $val; // will display the name
QLeap 18-Nov-2008 02:27
Storing SimpleXMLElement values in $_SESSION does not work. Saving the results as an object or individual elements of the object will result in the dreaded "Warning: session_start() [function.session-start]: Node no longer exists" error.

For example, this does not work:

    $xml  = new SimpleXMLElement($page);
    $country  = $xml->Response->Placemark->AddressDetails->Country->CountryNameCode;
    $_SESSION['country'] = $country;

This will work:

    $_SESSION['country'] = (string) $country;
gwhitescarver at yahoo dot com 11-Sep-2008 01:02
Moving some code from a PHP 5.2.6 / Windows environment to a 5.2.0 / Linux environment, I somehow lost access to a plain text node within a SimpleXML Object.  On a var_dump of $xml_node, a [0] element was shown as the string '12'.  However, $xml_node[0] was evaluating NULL in 5.2.0.  You can see below the code change I made, pulling my data out of the raw XML with a regular expression.  Hope this is useful to someone.

//In some versions of PHP it seems we cannot access the [0] element of a SimpleXML Object.  Doesn't work in 5.2.0:
//$count = $xml_node[0];
//grab the raw XML:
$count = ($xml_node->asXML());
//pull out the number between the closing and opening brace of the xml:
$count = preg_replace('/.*>(\d*)<.*/', '$1', $count);
charlie at blankcanvasstudios dot com 14-Aug-2008 11:21
Optimizing aalaap at gmail dot com's php

<?php
function is_rss($feedxml) {
    @$feed = simplexml_load_string($feedxml);

    return ($feed->channel->item)?true:false;
}

function is_atom($feedxml) {
    @$feed = new SimpleXMLElement($feedxml);
    ($feed->entry):true:false;
}
?>
aalaap at gmail dot com 30-Jun-2008 06:58
Here are two quick and dirty functions that use SimpleXML to detect if a feed xml is RSS or ATOM:

<?php
function is_rss($feedxml) {
    @$feed = new SimpleXMLElement($feedxml);

    if ($feed->channel->item) {
        return true;
    } else {
        return false;
    }
}

function is_atom($feedxml) {
    @$feed = new SimpleXMLElement($feedxml);

    if ($feed->entry) {
        return true;
    } else {
        return false;
    }
}
?>

The functions take in the full text feed (retrieved via cURL, for example) and return a true or a false based on the result.


Introduction

L'extension SimpleXML fournit des outils très simples et faciles à utiliser pour convertir du XML en un objet qui peut être manipulé avec ses propriétés et les itérateurs de tableaux.

User Contributed Notes

There are no user contributed notes for this page.


Pré-requis

Cette extension requière l'extension PHP libxml. Ceci signifie passer l'option de configuration --with-libxml, ou antérieur à PHP 7.4 l'option de configuration --enable-libxml, bien que ceci est accomplie implicitement car libxml est activé par défaut.

L'extension SimpleXML requiert PHP 5.

User Contributed Notes

There are no user contributed notes for this page.


Installation

Cette extension est activée par défaut. Elle peut être désactivée en utilisant l'option de configuration : --disable-simplexml

Note : Avant PHP 5.1.2, --enable-simplexml est nécessaire pour activer cette extension.

User Contributed Notes

Rapitharian at hotmail dot com 24-Apr-2019 08:39
To install on CentOS and Redhat, run: sudo yum -y install php-xml
ottakar at freezed dot me 19-Dec-2017 09:31
This XML module is not provided on a default php (v7) install on Debian GNU/Linux stretch (9.3)
Add it with: sudo apt-get install php-xml
shashank at shankee dot com 31-May-2017 09:44
Installing simpleXml using composer:

"composer require ext-simplexml"

The extension is enabled by default in most distros. You can check the list of php modules using:

"php -m"
morel dot josh at hotmail dot com 17-Dec-2016 12:09
For Linux Ubuntu using PHP 7:
sudo apt-get install php7.0-xml


Exemples

Sommaire

  • Utilisation de base SimpleXML
  • Traitement des erreurs XML

User Contributed Notes

Juan Herrera 19-Dec-2009 12:49
When using simplexml to access a element the returned object may be a SimpleXMLElement instead of a string.

Example:

<?php
$string = <<<XML
<?xml version='1.0'?>
<document>
    <cmd>login</cmd>
    <login>Richard</login>
</document>
XML;

$xml = simplexml_load_string($string);
print_r($xml);
$login = $xml->login;
print_r($login);
$login = (string) $xml->login;
print_r($login);
?>

Expected result:
----------------
SimpleXMLElement Object
(
    [cmd] => login
    [login] => Richard
)
Richard
Richard

Actual result:
--------------
SimpleXMLElement Object
(
    [cmd] => login
    [login] => Richard
)
SimpleXMLElement Object
(
    [0] => Richard
)
Richard

But this is an intended behavior. See http://bugs.php.net/bug.php?id=29500
info at accountr dot eu 05-May-2009 08:35
Instead of using  <?php eval($code) ?>

you can use this method,

<?php

$node = "node";

$XML = simplexml_load_file($file);

$text = (string)$XML->nodes->{$node}; // works
// or
$text2 = (string)$XML->{$node}->child; // also works fine

?>

I think it is much more easier instead of eval().
Kari P. 15-Aug-2008 02:17
To take care of proper error checking, one must use try-catch blocks:

<?php
try {
  $sxe = new SimpleXMLElement($xmlstring);
} catch (Exception $e) {
  echo "bad xml";
}
?>

To get rid of warnings, use @ in front of new:

<?php
try {
  $sxe = @new SimpleXMLElement($xmlstring);
} catch (Exception $e) {
  echo "bad xml";
}
?>
mike at mike-griffiths dot co dot uk 18-Apr-2008 09:11
It is important that you select the correct method of loading the XML in depending on the format of your XML file.

If you use the wrong function to load it in you will get some strange errors.


Utilisation de base SimpleXML

Plusieurs exemples de ce chapitre requièrent une chaîne XML. Plutôt que de la répéter à chaque exemple, nous allons la placer dans un fichier que nous inclurons dans chacun d'entre eux. Le contenu de ce fichier est illustré par l'exemple qui suit. Autrement, vous pouvez créer un document XML et le lire avec simplexml_load_file().

Exemple #1 Fichier avec une chaîne XML qui sera inclus partout

<?php
$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<movies>
 <movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#211;r</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <great-lines>
   <line>PHP solves all my web problems</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
</movies>
XML;
?>

La simplicité de SimpleXML apparaît plus clairement lorsqu'on essaye d'extraire une chaîne ou un nombre d'un document XML basique.

Exemple #2 Lecture de <plot>

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

echo $movies->movie[0]->plot;
?>

L'exemple ci-dessus va afficher :

   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.

L'accès aux éléments d'un document XML qui contient des caractères non permis par rapport à la convention de nommage de PHP (e.g. les mots clés) est possible en encapsulant le nom de l'élément entre crochets et apostrophes.

Exemple #3 Récupération de <line>

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

echo $movies->movie->{'great-lines'}->line;
?>

L'exemple ci-dessus va afficher :

PHP solves all my web problems

Exemple #4 Accéder à un élément non-unique avec SimpleXML

Lorsque plusieurs instances d'un élément existent en tant que fils d'un élément père unique, les techniques normales d'itération peuvent être appliquées.

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

/* Pour chaque <character>, nous affichons un <name>. */
foreach ($movies->movie->characters->character as $character) {
   echo $character->name, ' played by ', $character->actor, PHP_EOL;
}

?>

L'exemple ci-dessus va afficher :

Ms. Coder played by Onlivia Actora
Mr. Coder played by El ActÓr

Note:

Les propriétés ($movies->movie dans notre précédent exemple) ne sont pas des tableaux. Ceux sont des objets itérables et accessibles.

Exemple #5 Utilisation des attributs

Jusque là, nous n'avons couvert que la lecture des noms d'éléments et leurs valeurs. SimpleXML peut aussi atteindre leurs attributs. L'accès aux attributs d'un élément se fait de la même façon que l'accès aux éléments d'un tableau.

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

/* Accès au node <rating> du premier <movie>.
 * Affichage des attributs de <rating> également. */
foreach ($movies->movie[0]->rating as $rating) {
    switch((string) $rating['type']) { // Récupération des attributs comme indices d'éléments
    case 'thumbs':
        echo $rating, ' thumbs up';
        break;
    case 'stars':
        echo $rating, ' stars';
        break;
    }
}
?>

L'exemple ci-dessus va afficher :

7 thumbs up5 stars

Exemple #6 Comparaison des éléments et des attributs avec du texte

Pour comparer un élément ou un attribut avec une chaîne de caractères ou pour le passer à une fonction qui nécessite une chaîne de caractères, vous devez le transtyper en une chaîne en utilisant (string). Sinon, PHP traitera l'élément comme un objet.

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

if ((string) $movies->movie->title == 'PHP: Behind the Parser') {
    print 'My favorite movie.';
}

echo htmlentities((string) $movies->movie->title);
?>

L'exemple ci-dessus va afficher :

My favorite movie.PHP: Behind the Parser

Exemple #7 Comparaison de 2 éléments

Deux objets SimpleXMLElement sont considérés comme différents même s'ils pointent vers le même élément, depuis PHP 5.2.0.

<?php
include 'example.php';

$movies1 = new SimpleXMLElement($xmlstr);
$movies2 = new SimpleXMLElement($xmlstr);
var_dump($movies1 == $movies2); // retourne false depuis PHP 5.2.0
?>

L'exemple ci-dessus va afficher :

bool(false)

Exemple #8 Utilisation de XPath

SimpleXML inclut le support embarqué de XPath. Pour trouver tous les éléments <character> :

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

foreach ($movies->xpath('//character') as $character) {
    echo $character->name, ' played by ', $character->actor, PHP_EOL;
}
?>

'//' sert de joker. Pour spécifier un chemin absolu, enlevez un slash.

L'exemple ci-dessus va afficher :

Ms. Coder played by Onlivia Actora
Mr. Coder played by El ActÓr

Exemple #9 Attribuer des valeurs

Les données dans SimpleXML n'ont pas à être constantes. L'objet permet la manipulation de tous ces éléments.

<?php
include 'example.php';
$movies = new SimpleXMLElement($xmlstr);

$movies->movie[0]->characters->character[0]->name = 'Miss Coder';

echo $movies->asXML();
?>

L'exemple ci-dessus va afficher :

<?xml version="1.0" standalone="yes"?>
<movies>
 <movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Miss Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#xD3;r</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <great-lines>
   <line>PHP solves all my web problems</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
</movies>

Exemple #10 Ajout d'éléments et d'attributs

Depuis PHP 5.1.3, SimpleXML est capable d'ajouter facilement des enfants et des attributs.

<?php
include 'example.php';
$movies = new SimpleXMLElement($xmlstr);

$character = $movies->movie[0]->characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');

$rating = $movies->movie[0]->addChild('rating', 'PG');
$rating->addAttribute('type', 'mpaa');

echo $movies->asXML();
?>

L'exemple ci-dessus va afficher :

<?xml version="1.0" standalone="yes"?>
<movies>
 <movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#xD3;r</actor>
   </character>
  <character><name>Mr. Parser</name><actor>John Doe</actor></character></characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <great-lines>
   <line>PHP solves all my web problems</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 <rating type="mpaa">PG</rating></movie>
</movies>

Exemple #11 Interopérabilité DOM

PHP possède un mécanisme pour convertir les noeuds XML entre les formats SimpleXML et DOM. Cet exemple montre comment changer un élément DOM en SimpleXML.

<?php
$dom = new DOMDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!$dom) {
    echo 'Erreur lors de l\'analyse du document';
    exit;
}

$books = simplexml_import_dom($dom);

echo $books->book[0]->title;
?>

L'exemple ci-dessus va afficher :

blah

User Contributed Notes

dianarusu21 at gmail dot com 20-Oct-2017 09:16
Quick start with xml.

//PHP file:
<?php
$xml = simplexml_load_file("simpleXml.xml");

foreach ($xml as $key => $value) {
  foreach ($value as $key => $value) {
    echo $key.": ".$value."</br>";
  }
}
?>

//XML file:
<?xml version="1.0" encoding="UTF-8"?>
<locations>
  <country>
    <name>Romania</name>
    <capital>Bucharest</capital>
    <language>Romanian</language>
  </country>
  <country>
    <name>Frace</name>
    <capital>Paris</capital>
    <language>France</language>
  </country>
  <country>
    <name>Spain</name>
    <capital>Madrid</capital>
    <language>Spanish</language>
  </country>
</locations>

//Output:
// name: Romania
// capital: Bucharest
// language: Romanian
// name: Frace
// capital: Paris
// language: France
// name: Spain
// capital: Madrid
// language: Spanish

NOTE: You don't need to include the xml file in the php file..
Anonymous 22-Aug-2017 12:35
If your xml string contains booleans encoded with "0" and "1", you will run into problems when you cast the element directly to bool:

$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<values>
    <truevalue>1</truevalue>
    <falsevalue>0</falsevalue>
</values>
XML;
$values = new SimpleXMLElement($xmlstr);
$truevalue = (bool)$values->truevalue; // true
$falsevalue = (bool)$values->falsevalue; // also true!!!

Instead you need to cast to string or int first:

$truevalue = (bool)(int)$values->truevalue; // true
$falsevalue = (bool)(int)$values->falsevalue; // false
rowan dot collins at gmail dot com 04-Jun-2015 06:58
There is a common "trick" often proposed to convert a SimpleXML object to an array, by running it through json_encode() and then json_decode(). I'd like to explain why this is a bad idea.

Most simply, because the whole point of SimpleXML is to be easier to use and more powerful than a plain array. For instance, you can write <?php $foo->bar->baz['bing'] ?> and it means the same thing as <?php $foo->bar[0]->baz[0]['bing'] ?>, regardless of how many bar or baz elements there are in the XML; and if you write <?php (string)$foo->bar[0]->baz[0] ?> you get all the string content of that node - including CDATA sections - regardless of whether it also has child elements or attributes. You also have access to namespace information, the ability to make simple edits to the XML, and even the ability to "import" into a DOM object, for much more powerful manipulation. All of this is lost by turning the object into an array rather than reading understanding the examples on this page.

Additionally, because it is not designed for this purpose, the conversion to JSON and back will actually lose information in some situations. For instance, any elements or attributes in a namespace will simply be discarded, and any text content will be discarded if an element also has children or attributes. Sometimes, this won't matter, but if you get in the habit of converting everything to arrays, it's going to sting you eventually.

Of course, you could write a smarter conversion, which didn't have these limitations, but at that point, you are getting no value out of SimpleXML at all, and should just use the lower level XML Parser functions, or the XMLReader class, to create your structure. You still won't have the extra convenience functionality of SimpleXML, but that's your loss.
mymymymy at mymymymy dot com 02-Jan-2015 09:41
$children = $xml->children();
var_dump($children[0]["@attributes"]);//"NULL"
var_dump($children[0]);//(2) ["@attributes"]=>array(1) {['x']=> string(1) '2'}

no faithfully (not true)
------
example:

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [name] => USA
        )
)

print_r($xml->country->attributes()->name);
show:
 SimpleXMLElement Object
(
    [0] => USA
)

print_r((string)$xml->country->attributes()->name);
show:
USA
RiKdnUA at mail dot ru 02-Dec-2013 09:40
???? ????????? XML-????????? ?????????? ?? UTF-8, ?????????? ????????? ?????? ????????? ????? ????? version='...' ? ????? standalone='...'. ??? ?????????? ????????? XML.

If encoding XML-document differs from UTF-8. Encoding declaration should follow immediately after the version = '...' and before standalone = '...'. This requirement is standard XML.

<?xml version='1.0' encoding='windows-1251' standalone='yes'?>
Ok
<?xml version='1.0' standalone='yes' encoding='windows-1251'?>
<body>??????? ????. Russian language</body>
Fatal error: Uncaught exception 'Exception' with message 'String could not be parsed as XML' in...
eng dot emad_2010 at yahoo dot com 08-Oct-2013 11:46
Example #  DOM Interoperability ??????? ??????
PHP has a mechanism to convert XML nodes between SimpleXML and DOM formats. This example shows how one might change a DOM element to SimpleXML  .
The simplexml_import_dom() function returns a SimpleXMLElement object from a DOM node.
DOM         object

<?php
//create DOM  document $dom that contain XML
$dom = new DOMDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!$dom) {
    echo 'Error while parsing the document';
    exit;
}
//convert DOM document $dom to object $books
$books = simplexml_import_dom($dom);

//access object $books
echo $books->book[0]->title;
?>
jishcem at gmail dot com 12-Mar-2013 07:31
For me it was easier to use arrays than objects,

So, I used this code,

$xml = simplexml_load_file('xml_file.xml');

$json_string = json_encode($xml);

$result_array = json_decode($json_string, TRUE);

Hope it would help someone
gkokmdam at zonnet dot nl 23-Feb-2011 01:54
A quick tip on xpath queries and default namespaces. It looks like the XML-system behind SimpleXML has the same workings as I believe the XML-system .NET uses: when one needs to address something in the default namespace, one will have to declare the namespace using registerXPathNamespace and then use its prefix to address the otherwise in the default namespace living element.

<?php
$string = <<<XML
<?xml version='1.0'?>
<document xmlns="http://www.w3.org/2005/Atom">
 <title>Forty What?</title>
 <from>Joe</from>
 <to>Jane</to>
 <body>
  I know that's the answer -- but what's the question?
 </body>
</document>
XML;

$xml = simplexml_load_string($string);
$xml->registerXPathNamespace("def", "http://www.w3.org/2005/Atom");

$nodes = $xml->xpath("//def:document/def:title");

?>
kdos 31-Jan-2011 05:32
Using stuff like: is_object($xml->module->admin) to check if there actually is a node called "admin", doesn't seem to work as expected, since simplexml always returns an object- in that case an empty one  - even if a particular node does not exist.
For me good old empty() function seems to work just fine in such cases.

Cheers
Max K. 20-Jun-2010 02:38
From the README file:

SimpleXML is meant to be an easy way to access XML data.

SimpleXML objects follow four basic rules:

1) properties denote element iterators
2) numeric indices denote elements
3) non numeric indices denote attributes
4) string conversion allows to access TEXT data

When iterating properties then the extension always iterates over
all nodes with that element name. Thus method children() must be
called to iterate over subnodes. But also doing the following:
foreach ($obj->node_name as $elem) {
  // do something with $elem
}
always results in iteration of 'node_name' elements. So no further
check is needed to distinguish the number of nodes of that type.

When an elements TEXT data is being accessed through a property
then the result does not include the TEXT data of subelements.

Known issues
============

Due to engine problems it is currently not possible to access
a subelement by index 0: $object->property[0].
ie dot raymond at gmail dot com 01-Apr-2010 03:07
If you need to output valid xml in your response, don't forget to set your header content type to xml in addition to echoing out the result of asXML():

<?php

$xml=simplexml_load_file('...');
...
...xml stuff
...

//output xml in your response:
header('Content-Type: text/xml');
echo $xml->asXML();
?>
php at keith tyler dot com 23-Dec-2009 12:57
[Editor's Note: The SimpleXMLIterator class, however, does implement these methods.]

While SimpleXMLElement claims to be iterable, it does not seem to implement the standard Iterator interface functions like ::next and ::reset properly. Therefore while foreach() works, functions like next(), current(), or each() don't seem to work as you would expect -- the pointer never seems to move or keeps getting reset.
bjorn at xQmail dot eu 31-Aug-2009 07:48
If you're not sure the XML will be valid you'd better use:

<?php
$xmlObject = simplexml_load_string($xml);
// or
$xmlObject = simplexml_load_file(xml);
?>

Both of these return a SimpleXMLElement Object or a libXMLError Object.
radams at circlepix com 24-Apr-2009 10:52
To test whether an element exists:

<?php

    $xml = <<<EOT
<?xml version='1.0' standalone='yes'?>
<root>
    <test1></test1>
    <test2 />
    <test4> </test4>
</root>
EOT;

    $xmlDoc = new SimpleXMLElement($xml);

echo "Test1: \n";
var_dump($xmlDoc->test1);
echo "\n(" . (bool)$xmlDoc->test1 . ")";
echo "\n\n";

echo "Test2: \n";
var_dump($xmlDoc->test2);
echo "\n(" . (bool)$xmlDoc->test2 . ")";
echo "\n\n";

echo "Test3: \n";
var_dump($xmlDoc->test3);
echo "\n(" . (bool)$xmlDoc->test3 . ")";
echo "\n\n";

echo "Test4: \n";
var_dump($xmlDoc->test4);
echo "\n(" . (bool)$xmlDoc->test4 . ")";
echo "\n\n";

?>

The var_dumps for test1, test2, and test3 are identical, but the (bool) test gives a '1' for test1 and test2, and a '' for test3.


Traitement des erreurs XML

Le traitement des erreurs XML lors du chargement d'un document est une tâche simple. En utilisant les fonctionnalités libxml, il est possible de supprimer toutes les erreurs XML lors du chargement d'un document, puis, de les parcourir.

L'objet libXMLError, retourné par la fonction libxml_get_errors(), contient plusieurs propriétés dont le message, la ligne et la colonne (position) de l'erreur.

Exemple #1 Chargement de chaînes XML cassées

<?php
libxml_use_internal_errors(true);
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>");
if ($sxe === false) {
    echo "Erreur lors du chargement du XML\n";
    foreach(libxml_get_errors() as $error) {
        echo "\t", $error->message;
    }
}
?>

L'exemple ci-dessus va afficher :

Erreur lors du chargement du XML
    Blank needed here
    parsing XML declaration: '?>' expected
    Opening and ending tag mismatch: xml line 1 and broken
    Premature end of data in tag broken line 1

Voir aussi

  • libxml_use_internal_errors()
  • libxml_get_errors()
  • libXMLError

User Contributed Notes

1337 at netapp dot com 04-Sep-2015 02:21
If you need to process the content of your broken XML-doc you might find this interesting. It has blown past a few simple corruptions for me.
http://php.net/manual/en/class.domdocument.php#domdocument.props.recover
tuxedobob 11-Sep-2014 09:29
Now that the /e modifier is considered deprecated in preg_replace, you can use a negative lookahead to replace unescaped ampersands with &amp; without throwing warnings:

$str = preg_replace('/&(?!;{6})/', '&amp;', $str);

You probably should have been doing this before /e was deprecated, actually.
openbip at gmail dot com 25-Feb-2010 08:20
Note that "if (! $sxe) {" may give you a false-negative if the XML document was empty (e.g. "<root />").  In that case, $sxe will be:

object(SimpleXMLElement)#1 (0) {
}

which will evaluate to false, even though nothing technically went wrong.

Consider instead: "if ($sxe === false) {"
Jacob Tabak 15-Feb-2010 01:17
If you are trying to load an XML string with some escaped and some unescaped ampersands, you can pre-parse the string to ecsape the unescaped ampersands without modifying the already escaped ones:
<?php
$s = preg_replace('/&[^; ]{0,6}.?/e', "((substr('\\0',-1) == ';') ? '\\0' : '&amp;'.substr('\\0',1))", $s);
?>


La classe SimpleXMLElement

(PHP 5, PHP 7, PHP 8)

Introduction

Représente un élément du document XML.

Synopsis de la classe

SimpleXMLElement implements Traversable {
/* Méthodes */
final public __construct ( string $data , int $options = 0 , bool $data_is_url = false , string $ns = "" , bool $is_prefix = false )
public addAttribute ( string $name , string $value = ? , string $namespace = ? ) : void
public addChild ( string $name , string $value = ? , string $namespace = ? ) : SimpleXMLElement
public asXML ( string $filename = ? ) : mixed
public attributes ( string $ns = null , bool $is_prefix = false ) : SimpleXMLElement
public children ( string $ns = ? , bool $is_prefix = false ) : SimpleXMLElement
public count ( ) : int
public getDocNamespaces ( bool $recursive = false , bool $from_root = true ) : array
public getName ( ) : string
public getNamespaces ( bool $recursive = false ) : array
public registerXPathNamespace ( string $prefix , string $ns ) : bool
public __toString ( ) : string
public xpath ( string $path ) : array
}

Sommaire

  • SimpleXMLElement::addAttribute — Ajoute un attribut à l'élément SimpleXML
  • SimpleXMLElement::addChild — Ajoute un élément enfant au noeud XML
  • SimpleXMLElement::asXML — Retourne une chaîne XML basée sur un élément SimpleXML
  • SimpleXMLElement::attributes — Identifie les attributs d'un élément
  • SimpleXMLElement::children — Cherche les fils d'un noeud donné
  • SimpleXMLElement::__construct — Crée un nouvel objet SimpleXMLElement
  • SimpleXMLElement::count — Compte le nombre de fils pour un élément
  • SimpleXMLElement::getDocNamespaces — Retourne les espaces de noms déclarés dans un document
  • SimpleXMLElement::getName — Récupère le nom d'un élément XML
  • SimpleXMLElement::getNamespaces — Retourne les espaces de noms utilisés dans un document
  • SimpleXMLElement::registerXPathNamespace — Crée un contexte préfixe/ns pour la prochaine requête XPath
  • SimpleXMLElement::saveXML — Alias de SimpleXMLElement::asXML
  • SimpleXMLElement::__toString — Retourne le contenu sous forme de chaine
  • SimpleXMLElement::xpath — Exécute une requête Xpath sur des données XML

User Contributed Notes

Patanjali 15-Oct-2020 02:20
Further to rmirabelle's comment, to compare two SimpleXML elements, do the comparison between the objects returned by the dom_import_simplexml function, as per:

<?php
if(dom_import_simplexml($simplexml_element_1)===dom_import_simplexml($simplexml_element_2)){
  ...
 }
?>

You must ensure that both are SimpleXML elements before conversion to DOM objects.
guilhermeasn at yahoo dot com dot br 15-Jan-2020 08:09
Class with a method to transform array or object to XML:

class MakeXML {

    public static function array_obj_to_xml($data, \SimpleXMLElement &$xmlObj) {
        foreach((array) $data as $key => $value) {
            if(is_numeric($key)) {
                $key = "n" . $key;
            }
            if(is_array($value) or is_object($value)) {
                $subnode = $xmlObj->addChild($key);
                self::array_obj_to_xml($value, $subnode);
            } else {
                $xmlObj->addChild($key, htmlspecialchars($value));
            }
        }
    }

}

Example:

$object = new \stdClass();
$object->example = "Try this class";

$objxml = new \SimpleXMLElement('<API/>');
MakeXML::array_obj_to_xml($objxml, $objxml);
echo $objxml->asXML();
Budu 13-May-2018 07:17
public function crearXml(){
        $pruebaXml = <<<XML
<?xml version="1.0" encoding="UTF-8" ?>
<Root></Root>
XML;
$example = new SimpleXMLElement($pruebaXml); //Crea un nuevo objeto SimpleXMLElement
        $example->addAttribute('id', '1');//Añade un elemento hijo al nodo XML

        while( $nodo = $this->iteraciones->iterate()){
            $nodos = $example->addChild('Nodo');
            $nodos->addAttribute('id',$nodo->getId());
            $acierto = $nodos->addChild('nuevoHijo', $nodo->getX());
        }
        $miFichero = $example->asXML();//Retorna un string XML correcto basado en un elemento SimpleXML
        $miArchivo = fopen("xml/example.xml", "w+");//Abre un fichero o un URL
        fwrite($miArchivo, $miFichero);//Escritura archivo
    }
CameronXie 11-Dec-2017 10:48
Map xml to array (with attributes)

<?php declare(strict_types=1);

/**
 * @param SimpleXMLElement $xml
 * @return array
 */
function xmlToArray(SimpleXMLElement $xml): array
{
    $parser = function (SimpleXMLElement $xml, array $collection = []) use (&$parser) {
        $nodes = $xml->children();
        $attributes = $xml->attributes();

        if (0 !== count($attributes)) {
            foreach ($attributes as $attrName => $attrValue) {
                $collection['attributes'][$attrName] = strval($attrValue);
            }
        }

        if (0 === $nodes->count()) {
            $collection['value'] = strval($xml);
            return $collection;
        }

        foreach ($nodes as $nodeName => $nodeValue) {
            if (count($nodeValue->xpath('../' . $nodeName)) < 2) {
                $collection[$nodeName] = $parser($nodeValue);
                continue;
            }

            $collection[$nodeName][] = $parser($nodeValue);
        }

        return $collection;
    };

    return [
        $xml->getName() => $parser($xml)
    ];
}
kurtbr at gmail dot com 31-May-2017 02:58
Here is a helper class to convert a PHP array to XML
You would call it doing the following:

<?php
$xml = new Xml();
$xml-> generateXmlFromArray($array, 'entities', 'entity');
?>

<?php
class Xml
{
    public function getXmlFromArray($value, \SimpleXMLElement &$xmlElement, $entity, $starting = null)
    {

        $handleValue = function($value){
            if(is_string($value)){
                $value = htmlspecialchars($value);
            }
            return $value;
        };
        $addChild = function($name, $value, &$subNode = null)use(&$xmlElement, $handleValue, $entity){
            if(is_array($value)){
                if(!$subNode instanceof \SimpleXMLElement){
                    $currentKey = key($value);
                    $initialValue = null;
                    if(is_numeric($currentKey)){
                        if(!is_array($value[$currentKey])){
                            $initialValue = $value[$currentKey];
                            unset($value[$currentKey]);
                        }
                    }
                    $subNode = $xmlElement->addChild($name, $initialValue);
                }
                $this->getXmlFromArray($handleValue($value), $subNode, $name);
            } else {
                $xmlElement->addChild($name, $handleValue($value));
            }
        };

        if(is_array($value))
        {
            if(is_numeric(key($value))){
                $setSubNodePrimitiveValue = function($value)use(&$xmlElement, $entity, $handleValue){
                    $value = $handleValue($value);
                    $children = $xmlElement->children();
                    $children[] = $value;
                };
                foreach ($value as $item)
                {
                    if(!is_array($item)){
                        $setSubNodePrimitiveValue($item);
                    } else {
                        if($starting === true){
                            $addChild($entity, $item);
                        } else {
                            $addChild($entity, $item, $xmlElement);
                        }
                    }
                }
            } else {
                foreach ($value as $subEntity => $subEntityItem)
                {
                    $addChild($subEntity, $subEntityItem);
                }
            }
        } else {
            $xmlElement->addChild($entity, $handleValue($value));
        }
    }

    /**
     * @param array $array
     * @param string $openingTag
     * @param string $entity
     * @param string $nameSpace
     * @param bool $isPrefixed
     * @return \SimpleXMLElement
     */
    public function generateXmlFromArray(array $array, string $openingTag, string $entity, $nameSpace = '', $isPrefixed = false)
    {
        $xmlString = '<'.$openingTag.'></'.$openingTag.'>';
        $xml = new \SimpleXMLElement($xmlString, LIBXML_NOERROR, false, $nameSpace, $isPrefixed);
        $this->getXmlFromArray($array, $xml, $entity, true);
        return $xml;
    }

    /**
     * @param string $xml
     * @return bool
     */
    public function validateXml(string $xml)
    {
        $dom = new \DOMDocument();
        $dom->loadXML($xml);
        return $dom->validate();
    }

    public function loadXmlPathAsArray(string $xmlPath)
    {
        $xml   = simplexml_load_file($xmlPath);
        $array = json_decode(json_encode($xml), TRUE);
        return (array)$array;
    }

    /**
     * @param string $xmlString
     * @return array
     */
    public function loadXmlStringAsArray(string $xmlString)
    {
        $array = (array) @simplexml_load_string($xmlString);
        if(!$array){
            $array = (array) @json_decode($xmlString, true);
        } else{
            $array = (array)@json_decode(json_encode($array), true);
        }
        return $array;
    }

    /**
     * @param string $xmlString
     * @return \SimpleXMLElement
     */
    public function loadXmlString(string $xmlString)
    {
        return @simplexml_load_string($xmlString);
    }
}
?>
xxxargonxxx at gmail dot com 12-Jan-2017 06:54
See previous two parts to get better understanding of how these tricks works. Example shown here refers to part two. (Sorry, length limitation)

3. Tricks
<?php
        // The real profit is in combination of property and array accesses and unset($someNode->{0}) trick -
        // it allows you to remove whatever node you want:
        unset($rootNode->{'div'}[2]);   // remove node with * mark (text*)

        // Another trick is removing child node using child node object
        $newChildNode = $rootNode->addChild('div','text**');    // Create
        unset($newChildNode->{0});      // Remove, node removed from parent object too!

        echo "--2--\n".$rootNode->asXML();
        /*
        <xml_root>complex node
                <type_one>renewed node 1</type_one>
                <type_two>node 3</type_two>
                <type_one>node 2</type_one>
                <div>text</div>
                <div>text</div>
                <div>text</div>
        </xml_root>
        */
?>
xxxargonxxx at gmail dot com 12-Jan-2017 06:48
How to view, edit and remove elements.
Speaking in terms of CRUD style, there is no methods to read, edit and remove nodes. But it is possible.

2. How child nodes works (understanding)
<?php
        echo "Exercise 2 \n";

        $rootNode = new SimpleXMLElement('<xml_root>complex node</xml_root>');  // Create root node
        $childNode1 = $rootNode->addChild('type_one','node 1');                 // Create child node 1 with name 'type_one'
        $childNode2 = new SimpleXMLElement('<type_one>node 2</type_one>');      // Create child node 2 with name 'type_one'
        $childNode3 = new SimpleXMLElement('<type_two>node 3</type_two>');      // Create child node 3 with name 'type_two' (different!)
        // Now $rootNode has only one children because other child nodes was created separately
        // Lets paste child node to root node
        echo $childNode1;

        $rootNode->{'type_one'} = $childNode2;      // Note that the property name is 'type_one'
        $rootNode->{'type_two'} = $childNode3;      // Note that the property name is 'type_two'
        var_dump($rootNode);
        /*
        object(SimpleXMLElement)#68 (2) {
            ["type_one"]=>
            string(6) "node 2"
            ["type_two"]=>
            string(6) "node 3"
        }
        */
        // We see that "node 1" disappeared, that's because assigning one node to some property of another in not a magic.
        // To be clear, the real calls looks like:
        $rootNode->{'type_one'}[0] = (string) $childNode2;
        $rootNode->{'type_two'}[0] = (string) $childNode3;
        // Explanation:
        // A: (string)
        // It means that you can't assign node itself, only its string representation because assigned node will be casted to string anyway.
        // It also means that tag name of assigned node doesn't matter - its name will be whatever name you specified in {} braces.
        // B: [0]
        // The array access operator ([0]) means that each tag name (type_one and type_two) has its own collection with integer indexes.
        // If you want to add another tag with same name, you should increment index:
        $rootNode->{'type_one'}[1] = $childNode2;
        var_dump($rootNode);
        /*
        object(SimpleXMLElement)#68 (2) {
            ["type_one"]=>
            array(2) {
                [0]=>
                string(6) "node 2"
                [1]=>
                string(6) "node 2"
            }
            ["type_two"]=>
            string(6) "node 3"
        }
        */

        // Note 1. The value of $childNode1 has been changed to "node 1" - that's because the child node, returned from addChild() method
        // is referenced with parent node. If you change its content in one side - it changes in other side too:
        $childNode1->{0} = 'renewed node 1';
        // But it won't happen with $childNode2 - it is single and has no reference with parent node:
        $childNode2->{0} = 'renewed node 2';
        var_dump($rootNode);
        /*
        object(SimpleXMLElement)#68 (2) {
            ["type_one"]=>
            array(2) {
                [0]=>
                string(14) "renewed node 1"
                [1]=>
                string(6) "node 2"
            }
            ["type_two"]=>
            string(6) "node 3"
        }
        */

        // Note 2. When you added child nodes, the parent node's string content is still alive, var_dump doesn't show it,
        // but you can see through echoing XML:
        echo "--1--\n".$rootNode->asXML();
        /*
        <xml_root>complex node <--------- here!
                <type_one>renewed node 1</type_one>
                <type_two>node 3</type_two>
                <type_one>node 2</type_one>
        </xml_root>
        */
        // See 'complex node'? Bad news that you can't change string content anymore, if we try to call `$rootNode->{0} = 'something'` -
        // it overrides all content - both string and child nodes! I don't know how to write to string content only in that case.
        // But still you can read string content and remove entire node as described above.

        // So the following statements gives same result, except $result variable value:
        $someNode = new SimpleXMLElement('<div>text</div>');
        $result = $rootNode->addChild('div','text');                    // $result is SimpleXMLElement
        $result = $rootNode->addChild($someNode->getName(),$someNode);  // $result is SimpleXMLElement
        $result = $rootNode->{'div'}[] = 'text*';                       // $result is string 'text*'
        $result = $rootNode->{$someNode->getName()}[] = $someNode;      // $result is string 'text'
?>
xxxargonxxx at gmail dot com 12-Jan-2017 06:45
How to view, edit and remove elements.
Speaking in terms of CRUD style, there is no methods to read, edit and remove nodes. But it is possible.

1. How to work with single node and its value (basics)
<?php
        echo "Exercise 1 \n";
        // Create
        $someNode = new SimpleXMLElement('<xml_root>simple node</xml_root>');
        // Read
        echo $someNode->{0} ."\n";      // Echoes "simple node"
        echo $someNode ."\n";           // Echoes "simple node", might be used for read case too
        // Edit
        $someNode->{0} = 'new value';
        echo $someNode->{0} ."\n";      // Echoes "new value", value is changed!
        // Remove
        unset($someNode->{0});

        // Don't touch this node anymore otherwise it will throw a warning:
        // "Warning:  SimpleXMLElement::asXML(): Node no longer exists in <...> on line <...>"
        // echo $someNode ."\n";      // Throws the warning

        // Recap: property access to zero property ($someNode->{0}) is the way to read and edit string content of the node AND
        // to remove the node itself
?>
frame at dynamiccreated dot de 14-Jun-2013 01:36
Important note I miss here in the documentation:

SimpleXML supports Array/Iteration-Methods. Therefore it is possible to

add attributes
edit attributes
remove attributes

add nodes
edit nodes
remove nodes

This is the reason why SimpleXML provides only add-methods not deleting- or editing-methods. We also need this methods because SimpleXML acts as a normal class and
new member will not converted to a new node.

Deleting a node seems not to be possible within a foreach-loop. The reason is simple. To do that we need a valid key, but the Iterator only gives us a "understandable feedback" on which node we are working on: the tag name.

So this will not work:

<?php
foreach($doc->seg as $key => $seg)
{
    if((string)$seg['id'] === 'whatever')
    {
        unset($seg); // only clears local copy
        unset($seg[$key]); // wrong index "seg"
    }
}
?>

But this, eg. will work:
<?php
unset($doc->seg[2]);
?>

In case of doubt always do a print_r/var_dump(). It nicely shows the real linked indexes.
Yukull 15-Feb-2013 01:59
xml to object conversion function :
<?php
/**
    @param:
        $xml: SimpleXMLElement
        $force: set to true to always create 'text', 'attribute', and 'children' even if empty
    @return
        object with attributs:
            (string) name: XML tag name
            (string) text: text content of the attribut name
            (array) attributes: array witch keys are attribute key and values are attribute value
            (array) children: array of objects made with xml2obj() on each child
**/
function xml2obj($xml,$force = false){

    $obj = new StdClass();

    $obj->name = $xml->getName();

    $text = trim((string)$xml);
    $attributes = array();
    $children = array();

    foreach($xml->attributes() as $k => $v){
        $attributes[$k]  = (string)$v;
    }

    foreach($xml->children() as $k => $v){
        $children[] = xml2obj($v,$force);
    }

    if($force or $text !== '')
        $obj->text = $text;

    if($force or count($attributes) > 0)
        $obj->attributes = $attributes;

    if($force or count($children) > 0)
        $obj->children = $children;

    return $obj;
}
?>
heaver 31-May-2012 07:33
XML to JSON conversion without '@attributes'
<?php
function XML2JSON($xml) {

        function normalizeSimpleXML($obj, &$result) {
            $data = $obj;
            if (is_object($data)) {
                $data = get_object_vars($data);
            }
            if (is_array($data)) {
                foreach ($data as $key => $value) {
                    $res = null;
                    normalizeSimpleXML($value, $res);
                    if (($key == '@attributes') && ($key)) {
                        $result = $res;
                    } else {
                        $result[$key] = $res;
                    }
                }
            } else {
                $result = $data;
            }
        }
        normalizeSimpleXML(simplexml_load_string($xml), $result);
        return json_encode($result);
    }
?>
demian dot katz at villanova dot edu 29-Mar-2012 05:50
Here is a more namespace-aware version of the earlier function for attaching one SimpleXMLElement to another.  I'm sure it could still be further improved (right now it generates some redundant xmlns definitions), but it seems to be working well enough for my purposes so far.

function SimpleXMLElement_append($parent, $child)
{
    // get all namespaces for document
    $namespaces = $child->getNamespaces(true);

    // check if there is a default namespace for the current node
    $currentNs = $child->getNamespaces();
    $defaultNs = count($currentNs) > 0 ? current($currentNs) : null;
    $prefix = (count($currentNs) > 0) ? current(array_keys($currentNs)) : '';
    $childName = strlen($prefix) > 1
        ? $prefix . ':' . $child->getName() : $child->getName();

    // check if the value is string value / data
    if (trim((string) $child) == '') {
        $element = $parent->addChild($childName, null, $defaultNs);
    } else {
        $element = $parent->addChild(
            $childName, htmlspecialchars((string)$child), $defaultNs
        );
    }

    foreach ($child->attributes() as $attKey => $attValue) {
        $element->addAttribute($attKey, $attValue);
    }
    foreach ($namespaces as $nskey => $nsurl) {
        foreach ($child->attributes($nsurl) as $attKey => $attValue) {
            $element->addAttribute($nskey . ':' . $attKey, $attValue, $nsurl);
        }
    }

    // add children -- try with namespaces first, but default to all children
    // if no namespaced children are found.
    $children = 0;
    foreach ($namespaces as $nskey => $nsurl) {
        foreach ($child->children($nsurl) as $currChild) {
            SimpleXMLElement_append($element, $currChild);
            $children++;
        }
    }
    if ($children == 0) {
        foreach ($child->children() as $currChild) {
            SimpleXMLElement_append($element, $currChild);
        }
    }
}
saganmarketing.com 12-Mar-2012 12:27
Parsing an invalid XML string through SimpleXML causes the script to crash completely (usually) therefore it is best to make sure the XML is valid before parsing with something like this:

// Must be tested with ===, as in if(isXML($xml) === true){}
// Returns the error message on improper XML
function isXML($xml){
    libxml_use_internal_errors(true);

    $doc = new DOMDocument('1.0', 'utf-8');
    $doc->loadXML($xml);

    $errors = libxml_get_errors();

    if(empty($errors)){
        return true;
    }

    $error = $errors[0];
    if($error->level < 3){
        return true;
    }

    $explodedxml = explode("r", $xml);
    $badxml = $explodedxml[($error->line)-1];

    $message = $error->message . ' at line ' . $error->line . '. Bad XML: ' . htmlentities($badxml);
    return $message;
}
Anonymous 14-Nov-2011 12:34
Warning to anyone trying to parse XML with a key name that includes a hyphen ie.)
<subscribe>
    <callback-url>example url</callback-url>
</subscribe>

In order to access the callback-url you will need to do something like the following:
<?php
$xml = simplexml_load_string($input);
$callback = $xml->{"callback-url"};
?>
If you attempt to do it without the curly braces and quotes you will find out that you are returned a 0 instead of what you want.
juanfhj at gmail dot spam dot me dot not dot com 13-Aug-2011 11:01
To access the underlying element as a string, it's necessary to make the cast $x = (string)$my_xml_element.
dans at dansheps dot com 22-Apr-2011 12:06
I created a little function to parse the simple XML into a structure which is easier to iterate(I believe anyways) than the simpleXML node structure.

<?php
function parseSimpleXML($xmldata)
    {
        $childNames = array();
        $children = array();

        if( $xmldata->count() !== 0 )
        {
            foreach( $xmldata->children() AS $child )
            {
                $name = $child->getName();

                if( !isset($childNames[$name]) )
                {
                    $childNames[$name] = 0;
                }

                $childNames[$name]++;
                $children[$name][] = $this->parseSimpleXML($child);
            }
        }

        $returndata = new XMLNode();
        if( $xmldata->attributes()->count() > 0 )
        {
            $returndata->{'@attributes'} = new XMLAttribute();
            foreach( $xmldata->attributes() AS $name => $attrib )
            {
                $returndata->{'@attributes'}->{$name} = (string)$attrib;
            }
        }

        if( count($childNames) > 0 )
        {
            foreach( $childNames AS $name => $count )
            {
                if( $count === 1 )
                {
                    $returndata->{$name} = $children[$name][0];
                }
                else
                {
                    $returndata->{$name} = new XMLMultiNode();
                    $counter = 0;
                    foreach( $children[$name] AS $data )
                    {
                        $returndata->{$name}->{$counter} = $data;
                        $counter++;
                    }
                }
            }
        }
        else
        {
            if( (string)$xmldata !== '' )
            {
                $returndata->{'@innerXML'} = (string)$xmldata;
            }
        }
        return $returndata;
    }
?>
ms dot n at 163 dot com 11-Feb-2011 10:50
Adds a new function for SimpleXMLElement class, in order to output HTML code.

<?php
class CeiXML extends SimpleXMLElement{
public function asHTML(){
$ele=dom_import_simplexml($this);
$dom = new DOMDocument('1.0', 'utf-8');
$element=$dom->importNode($ele,true);
$dom->appendChild($element);
return $dom->saveHTML();
}
}
?>
Pavel Musil pavel dot musil at gmail dot com 10-Feb-2011 03:18
Simple recursive function to append XML object into SimpleXMLElement node:

<?php
// root: parent element - SimpleXMLElement instance
// append: XML object from simplexml_load_string

function xml_join($root, $append) {
    if ($append) {
        if (strlen(trim((string) $append))==0) {
            $xml = $root->addChild($append->getName());
            foreach($append->children() as $child) {
                xml_join($xml, $child);
            }
        } else {
            $xml = $root->addChild($append->getName(), (string) $append);
        }
        foreach($append->attributes() as $n => $v) {
            $xml->addAttribute($n, $v);
        }
    }
}

$xml_append = simplexml_load_string('<data><items><item id="1">value</item></items></data>');
$xml_root = new SimpleXMLElement('<result></result>');

$cxml = $xml_root->addChild('clone');
xml_join($cxml, $xml_append->items->item[0]);

print $xml_root->asXML();
?>

Result:
<?xml version="1.0"?>
<result>
    <clone>
        <item id="1">
            value
        </item>
    </clone>
</result>
rmirabelle 08-Nov-2010 09:42
To further previous comments and drive the point home:

What makes SimpleXMLElement tricky to work with is that it feels and behaves like an object, but is actually a system RESOURCE,  (specifically a libxml resource).

That's why you can't store a SimpleXMLElement to $_SESSION or perform straight comparison operations on node values without first casting them to some type of object.  $_SESSION expects to store 'an object' and comparison operators expect to compare 2 'objects' and SimpleXMLElements are not objects.

When you echo or print a node's value, PHP converts the value (a resource) into a string object for you.  It's a time saver for sure, but can fool you into thinking that your SimpleXMLElement is an object.

Hope this helps clarify
joshduck at gmail dot com 28-Sep-2010 05:00
You should cast elements to a float (or even string) if you plan on using them in addition, multiplication, etc. If you don't then PHP will incorrectly treat the node values as an integer.

<?php
$obj = new SimpleXMLElement('<root>
    <a>1.9</a>
    <b>1.9</b>
</root>');

var_dump($obj->a + $obj->b);
var_dump((float)$obj->a + (float)$obj->b);
var_dump((string)$obj->a + (string)$obj->b);
?>

The first line gives: int(2)
The second and third give the expected result: float(3.8)
francs at seznam dot cz 23-Sep-2010 05:28
Be aware when you trying to cast some attribute to boolean.

(boolean)$xml->attributes()->someAtt;

returns TRUE if attribute is array([0] => 0);

use (boolean)(int) instead.
kweij at lsg dot nl 26-Jul-2010 04:47
I'm using SimpleXML for, ofcourse, it's simplicity, however I did wanted to manipulate the xml and combining one SimpleXMLElement with any other, so I wrote this function to add a SimpleXMLElement-child.

<?php
function SimpleXMLElement_append($key, $value) {
    // check class
    if ((get_class($key) == 'SimpleXMLElement') && (get_class($value) == 'SimpleXMLElement')) {
        // check if the value is string value / data
        if (trim((string) $value) == '') {
            // add element and attributes
            $element = $key->addChild($value->getName());
            foreach ($value->attributes() as $attKey => $attValue) {
                $element->addAttribute($attKey, $attValue);
            }
            // add children
            foreach ($value->children() as $child) {
                SimpleXMLElement_append($element, $child);
            }
        } else {
            // set the value of this item
            $element = $key->addChild($value->getName(), trim((string) $value));
        }
    } else {
        // throw an error
        throw new Exception('Wrong type of input parameters, expected SimpleXMLElement');
    }
}
?>

I'd recommend SimpleXMLElement to extend it's addChild() function with the functionalitity above.
cherubangel at gmail dot com 02-Jul-2010 04:28
Note that changing attributes from within a foreach loop, especially namespaced attributes, can be very tricky.

For example, when trying to change the value of an existing xlink:href attribute:
<?php
foreach($xmlelement -> attributes('xlink', true) as $attribute => $attribvalue){
    $attribvalue[0] = 'value'; // Throws an error
    $attribvalue = 'value'; // Does not change your XML
    $xmlelement -> addAttribute($attribute, 'value', 'http://www.w3.org/1999/xlink'); // Adds an attribute, does not change existing one.
    $xmlelement[$attribute] = 'value'; // Adds an attribute, does not change existing one.
}
?>

Instead, you should access the array returned by the attributes() function directly, like this:
<?php
    $xmlelement -> attributes('xlink', true) -> href = 'value'; // Works!
?>
php at keith tyler dot com 19-Feb-2010 06:23
The root node element of your input XML string is not retrievable as a property.

<?php
$xml="<foo>bar</foo>";
$sxe=new SimpleXMLElement($xml);
print $sxe->foo;
?>

prints nothing. You can only get to the root element via the array index method ($sxe[0]).

Also, you may not have two (or more) root elements -- that is apparently not well-formed XML.

<?php
$xml="<foo/><bar/>";
$sxe=new SimpleXMLElement($xml);
?>

throws an exception. A Q&D is to append an arbitraty root node structure to both ends of the input:

<?php
$xml="<foo/><bar/>";
$sxe=new SimpleXMLElement("<z>".$xml."</z>");
?>

Doing this also solves the above problem of root node property accessibility. (It may not work if your XML string includes a declaration.)
triplepoint at gmail dot com 19-Dec-2009 04:19
It's occasionally useful to add an XML processing instruction to a SimpleXMLElement (treating it as if it were a full document).
<?php
class SimpleXMLElement_Plus extends SimpleXMLElement {

    public function addProcessingInstruction( $name, $value )
    {
        // Create a DomElement from this simpleXML object
        $dom_sxe = dom_import_simplexml($this);

        // Create a handle to the owner doc of this xml
        $dom_parent = $dom_sxe->ownerDocument;

        // Find the topmost element of the domDocument
        $xpath = new DOMXPath($dom_parent);
        $first_element = $xpath->evaluate('/*[1]')->item(0);

        // Add the processing instruction before the topmost element
        $pi = $dom_parent->createProcessingInstruction($name, $value);
        $dom_parent->insertBefore($pi, $first_element);
    }
}
?>

For example, if you had a simpleXMLElement_Plus object made out of the xml fragment:
<xml><content /></xml>

And you needed the output to be:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="xsl/xsl.xsl"?>
<xml><content/></xml>

you could do (using the class above):
<?php
$xml = new SimpleXMLElement_Plus('<xml><content /></xml>');
$xml->addProcessingInstruction('xml-stylesheet', 'type="text/xsl" href="xsl/xsl.xsl"');
echo $xml->asXML();
?>
ivandosreisandrade at gmail dot com 19-Nov-2009 06:55
Hello,

here goes my contribution for those whom are struggling to understand how SimpleXMLElement works.

After some time trying to figure out how this works, I've came up to this small example:

<?php
    $xmlstr = "<?xml version='1.0' ?>\n".
              // optionally you can specify a xml-stylesheet for presenting the results. just uncoment the following line and change the stylesheet name.
              /* "<?xml-stylesheet type='text/xsl' href='xml_style.xsl' ?>\n". */
              "<book></book>";

    // create the SimpleXMLElement object with an empty <book> element
    $xml = new SimpleXMLElement($xmlstr);

    // add some child nodes
    $xml->addChild("title", "Title of my book");
    $xml->addChild("abstract", "My book is about learning to work with SimpleXMLElement");

    // add some more child nodes
    $chapter1 = $xml->addChild("chapter_1");
    // add an attribute to child chapter_1
    $chapter1->addAttribute("chapter_title", "Introduction to my book");

    $chapter2 = $xml->addChild("chapter_2");
    $chapter2->addAttribute("chapter_title", "Development of my book");

    $chapter3 = $xml->addChild("chapter_3");
    $chapter3->addAttribute("chapter_title", "Another chapter of my book");

    $conclusion = $xml->addChild("conclusion", "The ending of my book");

    // insert the header to tell the browser how to read the document
    header("Content-type: text/xml");
    // print the SimpleXMLElement as a XML well-formed string
    echo $xml->asXML();
?>

With this script you can just copy-paste and try to understand how it works.
I hope it can help somebody :)
brett at brettbrewer dot com 27-Oct-2009 04:53
Figuring out how to access the properties of a SimpleXmlElement object was a little tricky for me. In particular, it took a while to discover that I needed to cast my SimpleXmlElement properties to be of type "string" to print them or do comparisons on them. For instance, assuming you already have a string of xml in $xmlstr...

<?php
$sxml= new SimpleXmlElement($xmlstr);

if ((string) $sxml->property== "somevalue") {
    echo (string) $sxml->property;
}
?>
The properties of a SimpleXmlElement object are objects themselves, so you need to put "(string)" before them, which casts their values to a string instead of an object. I assume if you were doing a numeric comparison you'd want to cast to an (int) or something numeric instead.


Ajoute un attribut à l'élément SimpleXML

  • « SimpleXMLElement
  • SimpleXMLElement::addChild »
  • PHP Manual
  • SimpleXMLElement
  • Ajoute un attribut à l'élément SimpleXML

SimpleXMLElement::addAttribute

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

SimpleXMLElement::addAttribute — Ajoute un attribut à l'élément SimpleXML

Description

public SimpleXMLElement::addAttribute ( string $name , string $value = ? , string $namespace = ? ) : void

Ajoute un attribut à l'élément SimpleXML.

Liste de paramètres

name

Le nom de l'attribut à ajouter.

value

La valeur de l'attribut.

namespace

Si spécifié, l'espace de nom auquel l'attribut appartient.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Note:

Les exemples listés incluent parfois example.php, ceci fait référence à la chaine XML du premier exemple de l'utilisation de base.

Exemple #1 Ajoute des attributs et enfants à un élément SimpleXML

<?php

include 'example.php';

$sxe = new SimpleXMLElement($xmlstr);
$sxe->addAttribute('type', 'documentary');

$movie = $sxe->addChild('movie');
$movie->addChild('title', 'PHP2: More Parser Stories');
$movie->addChild('plot', 'This is all about the people who make it work.');

$characters = $movie->addChild('characters');
$character  = $characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');

$rating = $movie->addChild('rating', '5');
$rating->addAttribute('type', 'stars');

echo $sxe->asXML();

?>

Résultat de l'exemple ci-dessus est similaire à :

<?xml version="1.0" standalone="yes"?>
<movies type="documentary">
 <movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#xD3;r</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <great-lines>
   <line>PHP solves all my web problems</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
 <movie>
  <title>PHP2: More Parser Stories</title>
  <plot>This is all about the people who make it work.</plot>
  <characters>
   <character>
    <name>Mr. Parser</name>
    <actor>John Doe</actor>
   </character>
  </characters>
  <rating type="stars">5</rating>
 </movie>
</movies>

Voir aussi

  • SimpleXMLElement::addChild() - Ajoute un élément enfant au noeud XML
  • Utilisation de base SimpleXML

User Contributed Notes

Patanjali 10-Apr-2016 10:37
You cannot use this to update an existing attribute's value.

Instead, get a DOM version of the SimpleXMLElement and use setAttribute, as per:

$XML = '<element a="aa">Text</element>';
$snode = new simple_xml_element($XML);

$dnode = dom_import_simplexml($snode);
$dnode->setAttribute('a', 'bb');

Resulting XML for the node is:
<element a="bb">Text</element>
p.servus 18-Nov-2011 05:42
If you need an Namespace, you must write a Prefix of the Namespace + the Name of the Attribute ("prefix:name") as the first parameter AND the uri as the third one. (I don't know why?!)

Example code:
<?php
$xml = new SimpleXMLElement("<packagedElement></packagedElement>");
$xml->addAttribute("xmi:type", "uml:Class", "http://schema.omg.org/spec/XMI/2.1");
echo $xml->asXml();
?>

Output:
<packagedElement xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmi:type="uml:Class"></packagedElement>
sarlak 07-May-2011 07:49
You can access a node child with his name this way :

<?php
$root = new SimpleXMLElement($filePath);
echo $root->nodeName->attributes;

// It works recursivly so this will work too
echo $root->nodeName->subNodeName->attributes();
?>

But if you want to ADD an attribute to a children you MUST use the children() method to access and modfiy it or it will modify the parent's attributes.

<?php
// Add a subnode
$element->nodeName->addChild('subNodeName', "whatever you want");

// Get the pos in the childrens of the parent node
$lastNodePos = $element->nodeName->count()-1;

// Get the parents node childrens
$nodeChildrens = $element->nodeName->children();

// Add an attribute to the last created
$nodeChildrens[$lastNodePos]->addAttribute('attributeName', "The attribute value);
?>
booleer at yahoo dot it 16-Dec-2010 09:44
If the attribute already exists, addAttribute does nothing.

example:
<?php
$xml_string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <item id="foo">
<root>
XML;

$xml = simplexml_load_string($xml_string);
$xml->item->addAttribute('id', 'bar');
echo $xml->asXML();
?>

The above examples will output:
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <item id="foo">
<root>


Ajoute un élément enfant au noeud XML

  • « SimpleXMLElement::addAttribute
  • SimpleXMLElement::asXML »
  • PHP Manual
  • SimpleXMLElement
  • Ajoute un élément enfant au noeud XML

SimpleXMLElement::addChild

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

SimpleXMLElement::addChild — Ajoute un élément enfant au noeud XML

Description

public SimpleXMLElement::addChild ( string $name , string $value = ? , string $namespace = ? ) : SimpleXMLElement

Ajoute un élément enfant au noeud et retourne un SimpleXMLElement de l'enfant.

Liste de paramètres

name

Le nom de l'élément enfant à ajouter.

value

Si spécifié, la valeur de l'élément enfant.

namespace

Si spécifié, l'espace de nom auquel l'élément enfant appartient.

Valeurs de retour

La méthode addChild retourne un objet SimpleXMLElement représentant l'enfant à ajouter au noeud XML.

Exemples

Note:

Les exemples listés incluent parfois example.php, ceci fait référence à la chaine XML du premier exemple de l'utilisation de base.

Exemple #1 Ajoute des attributs et des enfants à un élément SimpleXML

<?php

include 'example.php';

$sxe = new SimpleXMLElement($xmlstr);
$sxe->addAttribute('type', 'documentary');

$movie = $sxe->addChild('movie');
$movie->addChild('title', 'PHP2: More Parser Stories');
$movie->addChild('plot', 'This is all about the people who make it work.');

$characters = $movie->addChild('characters');
$character  = $characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');

$rating = $movie->addChild('rating', '5');
$rating->addAttribute('type', 'stars');

echo $sxe->asXML();

?>

Résultat de l'exemple ci-dessus est similaire à :

<?xml version="1.0" standalone="yes"?>
<movies type="documentary">
 <movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#xD3;r</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <great-lines>
   <line>PHP solves all my web problems</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
 <movie>
  <title>PHP2: More Parser Stories</title>
  <plot>This is all about the people who make it work.</plot>
  <characters>
   <character>
    <name>Mr. Parser</name>
    <actor>John Doe</actor>
   </character>
  </characters>
  <rating type="stars">5</rating>
 </movie>
</movies>

Voir aussi

  • SimpleXMLElement::addAttribute() - Ajoute un attribut à l'élément SimpleXML
  • Utilisation de base SimpleXML

User Contributed Notes

nwarap 07-Nov-2017 02:46
Want to continue the ampersand (&) chain problem.

Sometimes, you would want to assign  (=) addChild.
This trick will helps you to do this.

<?php
$webOrders = new SimpleXMLElement('<?xml version="1.0"?><WebOrders></WebOrders>');
$webOrder = $webOrders->addChild('WebOrder');
$product = $webOrder->addChild('Product');
$product[0] = 'T&M';
$product->addAttribute('price', 19.99);
$product->addAttribute('qty', 2);
var_dump($webOrders->asXML());
?>

OUTPUT would be:

<?xml version="1.0" encoding="UTF-8"?>
<WebOrders>
    <WebOrder>
        <Product price="19.99" qty="2">T&amp;M</Product>
    </WebOrder>
</WebOrders>
johninen at gmail dot com 14-Sep-2015 01:27
In the docs for google sitemaps it is required an element for mobile sitemaps that looks like this: <mobile:mobile/>

I used some time to figure out how to make it, but it is quite simple when understood.

$mobile_schema = 'http://www.google.com/schemas/sitemap-mobile/1.0';

//Create root element
$xml_mobile = new SimpleXMLElement('
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:mobile="'.$mobile_schema.'"></urlset>
');

//Add required children
$url_mobile = $xml_b_list_mobile->addChild('url');
$url_mobile->addChild('loc', 'your-mobile-site-url');
$url_mobile->addChild('mobile:mobile', null, $mobile_schema);

For this to work properly the attribute xmlns:mobile must be set in the root node, and then used as namespace(third argument) when creating the mobile:mobile child with null as value.
thallisphp at gmail dot com 07-May-2014 07:35
<?php
class MySimpleXMLElement extends SimpleXMLElement
{
    /**
     * Add SimpleXMLElement code into a SimpleXMLElement
     *
     * @param SimpleXMLElement $append
     */
    public function appendXML($append)
    {
        if ($append) {
            if (strlen(trim((string)$append)) == 0) {
                $xml = $this->addChild($append->getName());
            } else {
                $xml = $this->addChild($append->getName(), (string)$append);
            }

            foreach ($append->children() as $child) {
                $xml->appendXML($child);
            }

            foreach ($append->attributes() as $n => $v) {
                $xml->addAttribute($n, $v);
            }
        }
    }
}
?>
frosty dot z at freesbee dot fr 16-May-2013 02:31
To complete Volker Grabsch's comment, stating :
"Note that although addChild() escapes "<" and ">", it does not escape the ampersand "&"."

To work around that problem, you can use direct property assignment such as :

<?php
$xmlelement->value = 'my value < > &';
// results in <value>my value &lt; &gt; &amp;</value>
?>

instead of doing :

<?php
$xmlelement->addChild('value', 'my value < > &');
// results in <value>my value &lt; &gt; &</value> (invalid XML)
?>

See also: http://stackoverflow.com/questions/552957 (Rationale behind SimpleXMLElement's handling of text values in addChild and addAttribute)

HTH
passerbyxp at gmail dot com 27-Mar-2013 03:59
Be aware that simply because you can <?php $dom->addChild();?> doesn't mean your XML is valid under simple XML itself:

<?php
$dom=simplexml_load_string("<test></test>");
$dom->addChild("3D","1,2,3");
$xml=$dom->asXML();
echo $xml;
/* echos:
<?xml version="1.0"?>
<test><3D>1,2,3</3D></test>
*/

$dom=simplexml_load_string($xml);
/*
generates a whole lots of warnings,
and refuses to create an object.
*/
?>

Same in PHP 5.3 and 5.4
ivan dot kakurov at gmail dot com 13-Jan-2013 04:09
Here's my solution for creating XML from Multidimensional Array.
<?php
//DATA
        $xmlDAta = array(
            array(
                "name"  => "nameVal",
                "value" => "valVal",
                "css"   => "cssVal"
            ),
            array(
                "name"  => "name1Val",
                "value" => "val1Val",
                "css"   => "css1Val"
            ),
            "tname" => array(
                array(
                    "iTname"   => "iTname",
                    "iTname2"  => "iTname1",
                    "iTname2"  => "iTname2",
                    "iTbname3" => array(
                        "iiTbname"  => "tbName",
                        "iiTbname1" => "tbName1",
                    ),
                ),
            ),
            "tdata" => "otheerDAta"
        );

   /**
     * Create XML using string or array
     *
     * @param mixed $data input data
     * @param SimpleXMLElement $xml
     * @param string $child name of first level child
     *
     * @return adding Xml formated data into SimpleXmlElement
     */

function data2XML(array $data, SimpleXMLElement $xml, $child = "items")
    {

        foreach($data as $key => $val) {
            if(is_array($val)) {

                if(is_numeric($key)) {
                    $node  = $xml->addChild($child);
                    $nodes = $node->getName($child);
                } else {

                    $node  = $xml->addChild($key);
                    $nodes = $node->getName($key);
                }

                $node->addChild($nodes, self::data2Xml($val, $node));
            } else {
                $xml->addChild($key, $val);
            }
        }

    }

//Use

        $xml    = new SimpleXMLElement("<root/>");
        Util::data2XML($xmlDAta, $xml, "Items");

?>
jerikojerk 31-Jul-2011 07:32
If you're looking for a way to append children you may be interested in this:

<?php
$x = new SimpleXMLElement('<root name="toplevel"></root>');
$f1 = new SimpleXMLElement('<child pos="1">alpha</child>');
$f2 = new SimpleXMLElement('<child pos="2">beta</child>');
$f3 = new SimpleXMLElement('<child pos="3">gamma</child>');

$x->{$f1->getName()} = $f1;
$x->{$f2->getName()}[] = $f2;
$x->{$f3->getName()}[] = $f3;

echo 'count child=',$x->count(),"\n";
echo $x->asXML();

foreach ( $x->children() as $foo )
{
    var_dump($foo);
}

?>
alex dot feraud at gmail dot com 16-Jun-2011 02:52
Here is a class with more functions for SimpleXMLElement :

<?php
/**
 *
 * Extension for SimpleXMLElement
 * @author Alexandre FERAUD
 *
 */
class ExSimpleXMLElement extends SimpleXMLElement
{
    /**
     * Add CDATA text in a node
     * @param string $cdata_text The CDATA value  to add
     */
  private function addCData($cdata_text)
  {
   $node= dom_import_simplexml($this);
   $no = $node->ownerDocument;
   $node->appendChild($no->createCDATASection($cdata_text));
  }

  /**
   * Create a child with CDATA value
   * @param string $name The name of the child element to add.
   * @param string $cdata_text The CDATA value of the child element.
   */
    public function addChildCData($name,$cdata_text)
    {
        $child = $this->addChild($name);
        $child->addCData($cdata_text);
    }

    /**
     * Add SimpleXMLElement code into a SimpleXMLElement
     * @param SimpleXMLElement $append
     */
    public function appendXML($append)
    {
        if ($append) {
            if (strlen(trim((string) $append))==0) {
                $xml = $this->addChild($append->getName());
                foreach($append->children() as $child) {
                    $xml->appendXML($child);
                }
            } else {
                $xml = $this->addChild($append->getName(), (string) $append);
            }
            foreach($append->attributes() as $n => $v) {
                $xml->addAttribute($n, $v);
            }
        }
    }
}
?>
Volker Grabsch 21-Apr-2011 06:17
Note that although addChild() escapes "<" and ">", it does not escape the ampersand "&".

So addChild() is unsuited to handle user-defined input!

Instead, you will have to replace all "&" with "&amp;" before calling addChild().

Or, use htmlspecialchars() which also replaces other characters, but won't do any harm as addChild() won't replace those again.
felipenmoura at gmail dot com 11-Apr-2011 06:06
This method returns a reference to the specific SimpleXMLElement.
If you use:
<?php
    $xml= new SimpleXMLElement('<root></root>');
    $xml->father['name']= 'Fathers name'; // creates automatically a father tag with attribute name
    $son= $xml->father->addChild('son'); // uses the first father tag
    $son['name']= 'first son';
    $otherSon= $xml->father->addChild('son'); // uses the first father tag but now, in a second son tag
    $otherSon['name']= 'second son';

    echo htmlentities($xml->asXML());
?>

The result will be
<root>
    <father>
        <son name='first son' />
        <son name='second son' />
    </father>
</root>

So, once you change something to the just added child, you are actually accessing the element inside the SimpleXMLElement as a reference.


Retourne une chaîne XML basée sur un élément SimpleXML

  • « SimpleXMLElement::addChild
  • SimpleXMLElement::attributes »
  • PHP Manual
  • SimpleXMLElement
  • Retourne une chaîne XML basée sur un élément SimpleXML

SimpleXMLElement::asXML

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::asXML — Retourne une chaîne XML basée sur un élément SimpleXML

Description

public SimpleXMLElement::asXML ( string $filename = ? ) : mixed

Formate les données de l'objet parent en XML 1.0.

Liste de paramètres

filename

Si spécifié, la fonction écrit les données au fichier au lieu de les retourner.

Valeurs de retour

Si le paramètre filename n'est pas spécifié, la fonction retourne une chaîne de caractères en cas de succès et false en cas d'erreur. Si le paramètre est spécifié, elle retourne true si le fichier a été écrit correctement et false autrement.

Exemples

Exemple #1 Obtenir du XML avec SimpleXML

<?php
$string = <<<XML
<a>
 <b>
  <c>text</c>
  <c>stuff</c>
 </b>
 <d>
  <c>code</c>
 </d>
</a>
XML;

$xml = new SimpleXMLElement($string);

echo $xml->asXML();

?>

L'exemple ci-dessus va afficher :

<?xml version="1.0"?>
<a>
 <b>
  <c>text</c>
  <c>stuff</c>
 </b>
 <d>
  <c>code</c>
 </d>
</a>

SimpleXMLElement::asXML() fonctionne aussi avec les résultats Xpath :

Exemple #2 Utilisation de SimpleXMLElement::asXML() avec les résultats de SimpleXMLElement::xpath()

<?php
// Suite de l'exemple plus haut.

/* On cherche <a><b><c> */
$result = $xml->xpath('/a/b/c');

foreach ($result as $node) {
    echo $node->asXML();
}
?>

L'exemple ci-dessus va afficher :

<c>text</c><c>stuff</c>

Voir aussi

  • SimpleXMLElement::__toString() - Retourne le contenu sous forme de chaine
  • Utilisation de base SimpleXML

User Contributed Notes

andreas dot theissen at t-online dot de 27-Oct-2012 12:37
To prevent asXML from encoding vowels unwantedly, simply use an approriate XML header with encoding in advance.

If you do so, asXML will happily leave your vowels (and the header) entirely untouched.

<?php

$xmlstr =
'<?xml version="1.0" encoding="UTF-8"?>
<keys>
  <key lang="en">&lt;Insert&gt;</key>
  <key lang="de">&lt;Einfügen&gt;</key>
</keys>';

$sxe = new SimpleXMLElement($xmlstr);

$output = $sxe->asXML();

?>

$xmlstr and $output are identical now.

The subsequent use of html_entity_decode() (as proposed in the very beginning in another post) has several drawbacks:

1. It is slow
2. It is expensive
3. If there are already encoded arrow brackets or double quotes in your source for instance (as shown in the above example), markup will be broken.
oleg dot pavlin at gmail dot com 10-Jan-2012 04:17
Function asXML decodes special chars like ø, æ and others to &#xE6;, &#xF8;

To get normal output use without quoting:

$xml = html_entity_decode($xml, ENT_NOQUOTES, 'UTF-8');
jcr at di dot uminho dot pt 25-Jan-2011 02:32
Code snippet to load a XML document, increment an attribute and store it again.
My XML looks like:
<?xml version="1.0" encoding="ISO-8859-1"?>
<doctypes counter="16">
    <doctype id="d1">
        <name>Carta</name>
        <acro>CA</acro>
    </doctype>
...
</doctypes>

I want to retrieve the counter attribute, increment it, and store the new document at the end:

<?php
  $document = simplexml_load_file("mydoc.xml");
  $cont = (integer) $document['counter'];
  $document['counter'] = $cont+1;
  $document->asXML("mydoc.xml");
?>


Identifie les attributs d'un élément

  • « SimpleXMLElement::asXML
  • SimpleXMLElement::children »
  • PHP Manual
  • SimpleXMLElement
  • Identifie les attributs d'un élément

SimpleXMLElement::attributes

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::attributes — Identifie les attributs d'un élément

Description

public SimpleXMLElement::attributes ( string $ns = null , bool $is_prefix = false ) : SimpleXMLElement

Fournit les attributs et les valeurs définies dans une balise XML.

Note: SimpleXML ajoute des propriétés itératives pour presque toutes ses méthodes. Celles-ci ne peuvent être vues en utilisant var_dump() ou tout autre fonction qui examine les objets.

Liste de paramètres

ns

Un espace de noms optionnel pour les attributs récupérés

is_prefix

Par défaut, vaut false

Valeurs de retour

Retourne un objet SimpleXMLElement permettant de retrouver tous les attributs d'une balise.

Retourne null si appelé sur un objet SimpleXMLElement qui représente déjà un attribut et non une balise.

Historique

Version | Description
5.2.0 | Le paramètre optionel is_prefix a été ajouté.

Exemples

Exemple #1 Interprétation d'une chaîne XML

<?php
$string = <<<XML
<a>
 <foo name="one" game="lonely">1</foo>
</a>
XML;

$xml = simplexml_load_string($string);
foreach($xml->foo[0]->attributes() as $a => $b) {
    echo $a,'="',$b,"\"\n";
}
?>

L'exemple ci-dessus va afficher :

name="one"
game="lonely"

Voir aussi

  • Utilisation de base SimpleXML

User Contributed Notes

jurchiks101 at gmail dot com 23-May-2018 12:38
An undocumented way - and, IMO, a hack - of getting an element's value OR attributes
(but not both) without type-casting is to use the function `current()`:

<?php
$xml = new SimpleXMLElement(<<<'XML'
<foo>
    <bar>1</bar>
    <baz name="baz" />
    <qux name="qux">3</qux>
</foo>
XML
);

var_dump([
    'bar' => [
        $xml->bar,
        current($xml->bar),
    ],
    'baz' => [
        $xml->baz->attributes(),
        current($xml->baz->attributes()),
    ],
    'qux' => [
        // won't work here correctly
        $xml->qux,
        current($xml->qux),
        $xml->qux->attributes(),
        current($xml->qux->attributes()),
    ],
]);
?>

Results in the following output (re-formatted to shorten it):
```
array(3) {
  'bar' => array(2) {
    [0] => class SimpleXMLElement#2 (1) {
      public ${0} => string(1) "1"
    }
    [1] => string(1) "1"
  }
  'baz' => array(2) {
    [0] => class SimpleXMLElement#5 (1) {
      public $@attributes => array(1) {
        ...
      }
    }
    [1] => array(1) {
      'name' => string(3) "baz"
    }
  }
  'qux' => array(4) {
    [0] => class SimpleXMLElement#6 (2) {
      public $@attributes => array(1) {
        ...
      }
      public ${0} => string(1) "3"
    }
    [1] => array(1) {
      'name' => string(3) "qux"
    }
    [2] => class SimpleXMLElement#7 (1) {
      public $@attributes => array(1) {
        ...
      }
    }
    [3] => array(1) {
      'name' => string(3) "qux"
    }
  }
}
```

This apparently reads the element as an array and just returns the value of the first property, whether it be the attributes or the value. As seen in the third example, this is unreliable, especially if you're parsing XML from an outside source that may or may not have attributes on an element that you want the value of.

I certainly do NOT advise anyone to use this since it is undocumented and it is just a coincidence that it works, so it might break in the future without prior notice.
andy dot locologic+101 at gmail dot com 14-Aug-2015 10:00
Easiest and safest way to get attributes as an array is to use the iterator_to_array function (see http://php.net/manual/en/function.iterator-to-array.php):

<?php
      $x = new SimpleXMLElement('<div class="myclass" id="myid"/>');
      $attributes = iterator_to_array($x->attributes());
?>
zevnikrok 18-Dec-2014 11:01
If you wish to get attributes as an associative array of key value pairs, you don't need to iterate through them, you can get it with this one liner:

  reset($element->attributes())
webfelipemaia at gmail dot com 07-Sep-2013 05:11
Use attributes to display when it meets certain condition defined attribute / value in xml tags.

Use atributos para exibir quando atende determinada condição definida atributo / valor em tags XML.

Consider the following example:
Considere o seguinte exemplo:

(file.xml)

<?xml version="1.0" encoding="UTF-8"?>

<list>
    <item type="Language">
        <name>PHP</name>
        <link>www.php.net</link>
    </item>
    <item type="Database">
        <name>Java</name>
        <link>www.oracle.com/br/technologies/java/?</link>
    </item>
</list>

Checks if the attribute value equals "Language", if equal prints everything that is related to "Language".

Verifica se o valor do atributo é igual a "Language", se for, imprime tudo o que for relativo ao mesmo.

<?php

$xml = simplexml_load_file("file.xml");

foreach($xml->children() as $child) {

        $role = $child->attributes();

        foreach($child as $key => $value) {

            if($role == "Language")
            echo("[".$key ."] ".$value . "<br />");

        }
}
?>

output:
saída:

[name] PHP
[link] www.php.net
adrian at foeder dot de 14-Jun-2013 10:15
in order to get a possibly present xml:space attribute, use the following construct:

<?php
$simpleXmlElement->element->attributes('http://www.w3.org/XML/1998/namespace')->space;
?>

This will, for example, return 'preserve' if set.

Just passing by 'xml' as namespace argument of the attribute() method didn't work out for me. Passing by the complete namespace URI works also if it is not explicitly defined in the underlying XML document.

Also, $simpleXmlElement->getNamespaces() does not return anything of use.
totalwipeout at gmail dot com 08-Nov-2012 05:21
Tip to get a real array of all attributes of a node (not SimpleXML's object acting like an array)

<?php
//- $node is a SimpleXMLElement object

$atts_object = $node->attributes(); //- get all attributes, this is not a real array
$atts_array = (array) $atts_object; //- typecast to an array

//- grab the value of '@attributes' key, which contains the array your after
$atts_array = $atts_array['@attributes'];

var_dump($atts_object); //- outputs object(SimpleXMLElement)[19]
                        //-             public '@attributes' => ...

var_dump($atts_array); //- outputs array (size=11) ...

?>
Hope this helps!
chris at chlab dot ch 23-Mar-2012 10:16
Note that you must provide the namespace if you want to access an attribute of a non-default namespace:

Consider the following example:

<?php
$xml = <<<XML
<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
 <Table Foo="Bar" ss:ExpandedColumnCount="7">
 </Table>
</Workbook>
XML;

$sxml = new SimpleXMLElement($xml);

/**
 * Access attribute of default namespace
 */
var_dump((string) $sxml->Table[0]['Foo']);
// outputs: 'Bar'

/**
 * Access attribute of non-default namespace
 */
var_dump((int) $sxml->Table[0]['ExpandedColumnCount']);
// outputs: 0

var_dump((int) $sxml->Table[0]->attributes('ss', TRUE)->ExpandedColumnCount);
// outputs: '7'
?>
Andrei 16-May-2011 04:46
Reading the attributes of the root element with name space prefixes as in an Atom feed

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;Ck4EQXYzeCp7ImA9WhZWFE4.&quot;">

<?php
$xml =  @simplexml_load_file($feed);
$att_gd = $xml->attributes("gd",1);
$Etag = $att_gd["etag"];
?>
sarlak 27-Apr-2011 01:12
<?php
$att = 'attribueName';

// You can access an element's attribute just like this :
$attribute = $element->attributes()->$att;

// This will save the value of the attribute, and not the objet
$attribute = (string)$element->attributes()->$att;

// You also can edit it this way :
$element->attributes()->$att = 'New value of the attribute';
?>
leap 02-Apr-2011 09:07
If you want to save the value of an attribute into an array, typecast it to a string.

<?php
// stores an xml-element-object
$dataStore['value'] = $attributes->myValue

// stores the value of the attribute
$dataStore['value'] = (string)$attributes->myValue
?>
alan at performantsystems dot com 23-May-2010 10:26
So lets say you have database type data in an XML string called $xmlstring with the key or item ID as an XML Attribute and all content data as regular XML Elements, as above. SimpleXML processes the Attributes as an array, so we can play along and push the Attributes into an array. Then we can get the value of any specific Attribute we want by addressing it by name, such as "ID".

Considering this data:

<?xml version="1.0" encoding="utf-8"?>
<data>
   <item ID="30001">
      <Company>Navarro Corp.</Company>
   </item>
   <item ID="30002">
      <Company>Performant Systems</Company>
   </item>
   <item ID="30003">
      <Company>Digital Showcase</Company>
   </item>
</data>

Example of listing both the ID Attribute and Company Element values:

<?php
$xmlObject = new SimpleXMLElement($xmlstring);
foreach ($xmlObject->children() as $node) {
        $arr = $node->attributes();   // returns an array
        print ("ID=".$arr["ID"]);     // get the value of this attribute
        print ("  Company=".$node->Company);
        print ("<p><hr>");
}
?>
Xeoncross 10-Apr-2010 07:46
It is really simple to access attributes using array form. However, you must convert them to strings or ints if you plan on passing the values to functions.

<?php
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [id] => 55555
        )

    [text] => "hello world"
)
?>

Then using a function

<?php
function xml_attribute($object, $attribute)
{
    if(isset($object[$attribute]))
        return (string) $object[$attribute];
}
?>

I can get the "id" like this

<?php
print xml_attribute($xml, 'id'); //prints "55555"
?>
gillllberg at gmail dot com 04-Nov-2009 02:21
To get an attribute in the node, use node->attributes()->attributeName
skerr at mojavi dot org 09-Dec-2004 10:55
You can also access the node as an array to get attributes:

<?php

$xml = simplexml_load_file('file.xml');

echo 'Attribute: ' . $xml['attribute'];

?>
inge at elektronaut dot no 26-May-2004 10:53
here's a simple function to get an attribute by name, based on the example

<?php
function findAttribute($object, $attribute) {
  foreach($object->attributes() as $a => $b) {
    if ($a == $attribute) {
      $return = $b;
    }
  }
  if($return) {
    return $return;
  }
}
?>


Cherche les fils d'un noeud donné

  • « SimpleXMLElement::attributes
  • SimpleXMLElement::__construct »
  • PHP Manual
  • SimpleXMLElement
  • Cherche les fils d'un noeud donné

SimpleXMLElement::children

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::children — Cherche les fils d'un noeud donné

Description

public SimpleXMLElement::children ( string $ns = ? , bool $is_prefix = false ) : SimpleXMLElement

Cette méthode cherche les fils d'un élément. Le résultat suit les règles de l'itération normale.

Note: SimpleXML ajoute des propriétés itératives pour presque toutes ses méthodes. Celles-ci ne peuvent être vues en utilisant var_dump() ou tout autre fonction qui examine les objets.

Liste de paramètres

ns

Un espace de noms XML.

is_prefix

Si is_prefix vaut true, ns sera considéré comme un préfixe. S'il vaut false, ns sera considéré comme une URL vers un espace de noms.

Valeurs de retour

Retourne un élément SimpleXMLElement que le noeud possède un fils ou pas.

Exemples

Exemple #1 Parcours d'un pseudo-tableau children()

<?php
$xml = new SimpleXMLElement(
'<person>
 <child role="son">
  <child role="daughter"/>
 </child>
 <child role="daughter">
  <child role="son">
   <child role="son"/>
  </child>
 </child>
</person>');

foreach ($xml->children() as $second_gen) {
    echo ' The person begot a ' . $second_gen['role'];

    foreach ($second_gen->children() as $third_gen) {
        echo ' who begot a ' . $third_gen['role'] . ';';

        foreach ($third_gen->children() as $fourth_gen) {
            echo ' and that ' . $third_gen['role'] .
                ' begot a ' . $fourth_gen['role'];
        }
    }
}
?>

L'exemple ci-dessus va afficher :

The person begot a son who begot a daughter; The person
begot a daughter who begot a son; and that son begot a son

Exemple #2 Utilisation des espaces de noms

<?php
$xml = '<example xmlns:foo="my.foo.urn">
  <foo:a>Apple</foo:a>
  <foo:b>Banana</foo:b>
  <c>Cherry</c>
</example>';

$sxe = new SimpleXMLElement($xml);

$kids = $sxe->children('foo');
var_dump(count($kids));

$kids = $sxe->children('foo', TRUE);
var_dump(count($kids));

$kids = $sxe->children('my.foo.urn');
var_dump(count($kids));

$kids = $sxe->children('my.foo.urn', TRUE);
var_dump(count($kids));

$kids = $sxe->children();
var_dump(count($kids));
?>
int(0)
int(2)
int(2)
int(0)
int(1)

Notes

SimpleXMLElement::children() retourne un noeud, peu importe si le noeud courant a un fils ou non. Utilisez la fonction count() sur le résultat pour vérifier si des fils existent. SimpleXMLElement::count() peut aussi être utilisée à cet effet à partir de PHP 5.3.0.

Voir aussi

  • SimpleXMLElement::count() - Compte le nombre de fils pour un élément
  • count() - Compte tous les éléments d'un tableau ou quelque chose d'un objet

User Contributed Notes

boan dot web at outlook dot com 15-Mar-2019 07:09
SimpleXMLElement::children can return null in this case:

<?php
$xml = '
<root attr="Hello"/>
';

$sxe = new SimpleXMLElement($xml);

$sxe_xpath = $sxe->xpath('/root/@attr')[0];

$children = $sxe_xpath->children();

var_export($children); // Is null
?>
thetazzbot at gmail dot com 08-Sep-2011 06:56
Ok so say you have this xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE nitf
PUBLIC "-//IPTC-NAA//DTD NITF 3.1//EN"
       "http://www.nitf.org/site/nitf-documentation/nitf-3-1.dtd">
<nitf>
  <head>
    <docdata management-status="embargoed">
      <!--data/2011/08/23/parties/doc4e53aa5783cca930694817.txt-->
      <doc-id id-string="doc4e53aa5783cca930694817"/>
      <date.release norm="20110823T000000"/>
      <key-list/>
    </docdata>
    <pubdata type="web" position.section="parties" position.sequence="0"/>
  </head>

-- snip --

If you need to access the nodes named "like.this" such as the date.release above, here is how I did it:

$xml = new SimpleXMLElement($xhtml);
 echo (string)$xml->head->docdata->{"date.release"}["norm"];

Took me a while to figure that one out ;)
coldshine1 at rambler dot ru 10-Dec-2010 02:37
This is my recursive simple function to parse XML with attributes.

<?php
function ParseXML($node, &$parent=array(), $only_child=true) {

        //Current node name
        $node_name = $node->getName();

        //Let's count children
        $only_child = true;
        if($node->count() > 1 ) $only_child = false;

        //If there is no child, then there may be text data
        if($only_child){
            $content="$node";
            if (strlen($content)>0) $parent['content']=$content;
        }

        //Get attributes of current node
        foreach ($node->attributes() as $k=>$v) {
            $parent['@attributes'][$k]="$v";
        }

        //Get children
        $count = 0;
        foreach ($node->children() as $child_name=>$child_node) {
            if(!$only_child) //If there are siblings then we'll add node to the end of the array
                LGServerPVR::ParseXML($child_node, $parent[$node_name][$child_name][$count], $only_child);
            else
                LGServerPVR::ParseXML($child_node, $parent[$node_name][$child_name], $only_child);
            $count++;
        }

        return $parent;
        //(c) c01d[s]h!nE 10.12.2010
    }

?>
Anonymous 26-Oct-2010 05:19
Here's my xml-to-array routine. Unlike many of the other comments here, this one takes namespaces into account.

<?php

class XmlArray {

  public function load_dom ($xml) {
    $node=simplexml_import_dom($xml);
    return $this->add_node($node);
  }

  public function load_string ($s) {
    $node=simplexml_load_string($s);
    return $this->add_node($node);
  }

  private function add_node ($node, &$parent=null, $namespace='', $recursive=false) {

    $namespaces = $node->getNameSpaces(true);
    $content="$node";

    $r['name']=$node->getName();
    if (!$recursive) {
      $tmp=array_keys($node->getNameSpaces(false));
      $r['namespace']=$tmp[0];
      $r['namespaces']=$namespaces;
    }
    if ($namespace) $r['namespace']=$namespace;
    if ($content) $r['content']=$content;

    foreach ($namespaces as $pre=>$ns) {
      foreach ($node->children($ns) as $k=>$v) {
        $this->add_node($v, $r['children'], $pre, true);
      }
      foreach ($node->attributes($ns) as $k=>$v) {
        $r['attributes'][$k]="$pre:$v";
      }
    }
    foreach ($node->children() as $k=>$v) {
      $this->add_node($v, $r['children'], '', true);
    }
    foreach ($node->attributes() as $k=>$v) {
      $r['attributes'][$k]="$v";
    }

    $parent[]=&$r;
    return $parent[0];

  }

}

?>
mrdaniellee at live dot com 10-Jan-2010 09:11
use this If you want to view the HTML as well as data.

normal dumps display the parsed versions of HTML.
This code displays the HTML as Text in a Text Area, and also display all other a data along side as an array

perfect for debugging (xml with html).

Try This Code:

<?php
$xml  = simplexml_load_file($url);

function xml2array_parse($xml){
     foreach ($xml->children() as $parent => $child){
         $return["$parent"] = xml2array_parse($child)?xml2array_parse($child):"$child";
     }
     return $return;
 }

 print "<pre><textarea style=\"width:200%;height:100%;\">";
 print_r(xml2array_parse($xml));
 print "</textarea></pre>";
?>
rodmen at gmail dot com 21-May-2009 08:32
Transform xml to array php

<?php
function xml2phpArray($xml,$arr){
    $iter = 0;
        foreach($xml->children() as $b){
                $a = $b->getName();
                if(!$b->children()){
                        $arr[$a] = trim($b[0]);
                }
                else{
                        $arr[$a][$iter] = array();
                        $arr[$a][$iter] = xml2phpArray($b,$arr[$a][$iter]);
                }
        $iter++;
        }
        return $arr;
}

$Array = simplexml_load_string(file_get_contents('myfile.xml'));
print_r(xml2phpArray($Array,array()));
?>
Anonymous 06-Sep-2008 05:39
for XML namespaces such as <dc:creator> in RSS feeds use

<?php
    $xml = new SimpleXMLElement($string);
    $item = $xml->channel[0]->item[0];
    $dc = $item->children("http://purl.org/dc/elements/1.1/");
    echo $dc->creator;
?>
transglobe at gmx dot de 19-Mar-2008 02:37
I made a slightly differnt approch towards the RecurseXML function. Beeing hungry I had problems with the code, as it did just overwrite two <maincourse>s. So here is what I did:

<?php

$xml = new SimpleXMLElement(
'<meal>
   <type>Lunch</type>
   <time>12:30</time>
   <menu>
     <entree>salad</entree>
     <maincourse>
        <part>ships</part>
        <part>steak</part>
     </maincourse>
     <maincourse>
        <part>fisch</part>
        <part>rice</part>
     </maincourse>
     <maincourse>
        <part>wine</part>
        <part>cheese</part>
     </maincourse>
   </menu>
</meal>');

$vals = array();
RecurseXML($xml,$vals);

foreach($vals as $key=>$value)
  print("{$key} = {$value}<BR>\n");

function RecurseXML($xml,&$vals,$parent="") {

  $childs=0;
  $child_count=-1; # Not realy needed.
  $arr=array();
        foreach ($xml->children() as $key=>$value) {
                if (in_array($key,$arr)) {
                        $child_count++;
                } else {
                        $child_count=0;
                }
                $arr[]=$key;
                $k=($parent == "") ? "$key.$child_count" : "$parent.$key.$child_count";
                $childs=RecurseXML($value,$vals,$k);
                if ($childs==0) {
                        $vals[$k]= (string)$value;
                }
        }

  return $childs;
}

?>
Output is like this:
type.0 = Lunch
time.0 = 12:30
menu.0.entree.0 = salad
menu.0.maincourse.0.part.0 = ships
menu.0.maincourse.0.part.1 = steak
menu.0.maincourse.0 =
menu.0.maincourse.1.part.0 = fisch
menu.0.maincourse.1.part.1 = rice
menu.0.maincourse.1 =
menu.0.maincourse.2.part.0 = wine
menu.0.maincourse.2.part.1 = cheese
menu.0.maincourse.2 =
menu.0 =

(Not beautiful, but it solved my case...)
crescentfreshpot at yahoo dot com 10-Dec-2007 08:16
Just a warning that the iterable returned from children() contains the '@attributes' key, which is "invisible" during a foreach but can be seen if using a different construct, such as list()=each() or casting to an array before iterating w/ foreach.
aero 23-May-2007 08:07
Here's a simple, recursive, function to transform XML data into pseudo E4X syntax ie. root.child.value = foobar

<?php
error_reporting(E_ALL);

$xml = new SimpleXMLElement(
'<Patriarch>
   <name>Bill</name>
   <wife>
     <name>Vi</name>
   </wife>
   <son>
     <name>Bill</name>
   </son>
   <daughter>
     <name>Jeri</name>
     <husband>
       <name>Mark</name>
     </husband>
     <son>
       <name>Greg</name>
     </son>
     <son>
       <name>Tim</name>
     </son>
     <son>
       <name>Mark</name>
     </son>
     <son>
       <name>Josh</name>
         <wife>
           <name>Kristine</name>
         </wife>
         <son>
           <name>Blake</name>
         </son>
         <daughter>
           <name>Liah</name>
         </daughter>
     </son>
   </daughter>
</Patriarch>');

RecurseXML($xml);

function RecurseXML($xml,$parent="")
{
   $child_count = 0;
   foreach($xml as $key=>$value)
   {
      $child_count++;
      if(RecurseXML($value,$parent.".".$key) == 0)  // no childern, aka "leaf node"
      {
         print($parent . "." . (string)$key . " = " . (string)$value . "<BR>\n");
      }
   }
   return $child_count;
}

?>

The output....

.name = Bill
.wife.name = Vi
.son.name = Bill
.daughter.name = Jeri
.daughter.husband.name = Mark
.daughter.son.name = Greg
.daughter.son.name = Tim
.daughter.son.name = Mark
.daughter.son.name = Josh
.daughter.son.wife.name = Kristine
.daughter.son.son.name = Blake
.daughter.son.daughter.name = Liah
taylorbarstow at that google mail thingy 21-Apr-2006 07:38
Sometimes you actually want an array, not a pseudo array.   This is especially true when you aren't dealing with attributes (i.e., you just want the array of child nodes).

Do like this:

<?php
$children = $sxml->xpath('child::node()');
?>

The reason you might want this is to be able to use array functions like array_shift, array_pop, etc.  This is especially true when you are writing recursive functions.  Simplexml works really well in iterative programming, but if you try to implement recursion it gets ugly.
Sebastian 27-Oct-2005 03:45
Just a quick addition:

If you need to access a child node which contains a dash, you need to encapsulate it with {""}.

For example:
<?php
foreach ($domain->domain-listing as $product) {
}
?>

The example above doesn't work because of the dash. But instead you need to use:
<?php
foreach ($domain->{"domain-listing"} as $product) {
}
?>

At least for me the second example works perfectly fine.
no-one 31-May-2005 06:05
For anyone who hasn't read Sterling Hughe's article (http://www.zend.com/php5/articles/php5-simplexml.php):

<?php
$xml_document =<<<EOT
<?xml version="1.0"?>
<root xmlns:foo="http://example.com">
  <foo:bar>baz</foo:bar>
</root>
EOT;

$xml_document = simplexml_load_xml($xml_document);

$foo_ns_bar = $xml_document->children('http://example.com');

echo $foo_ns_bar->bar[0]; // prints 'baz'
?>
Andrew Rose (rose dot andrew at gmail dot com) 16-Mar-2005 04:48
The example below shows the basic use of depth-first recursion to span the xml tree.

This is coded for the command line, and it prints out the original sentance above and then the copy cat sentence it creates itself for comparison, which as you will see; this example is slightly off from, I'll leave it upto you to resolve this issue.

All in all I personaly think xml and recursion go hand in hand, so if you don't understand recursion but know xml and want to use php to manipulate xml you will need to learn about recursion at some point.

<?php
$xml = simplexml_load_string(
'<person>
 <child role="son">
  <child role="daughter"/>
 </child>
 <child role="daughter">
  <child role="son">
   <child role="son"/>
  </child>
 </child>
</person>');

function recurse($child)
 {
   foreach($child->children() as $children) {
     echo ' who begot a '.$children['role'];
     recurse($children);
   }
    return;
 }

foreach($xml->children() as $children) {
 echo 'The person begot a '.$children['role'];
  recurse($children, 0);
 echo '; ';
}

echo "\n";
echo 'The person begot a son who begot a daughter; The person begot a daughter who begot a son; and that son begot a son'."\n";

?>
zyxwvu at users dot sourceforge dot net 15-Feb-2004 10:32
File:

<category>
  <item>text</item>
  <bold>text</bold>
  <item>text</item>
  <item>text</item>
  <mark>text</mark>
  <bold>text</bold>
</category>

If you want to get also names of the tags, you can use this loop layout:

<?php
foreach($category -> children() as $name => $node){
  echo $name.'<br/>';
}
?>


Crée un nouvel objet SimpleXMLElement

  • « SimpleXMLElement::children
  • SimpleXMLElement::count »
  • PHP Manual
  • SimpleXMLElement
  • Crée un nouvel objet SimpleXMLElement

SimpleXMLElement::__construct

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::__construct — Crée un nouvel objet SimpleXMLElement

Description

final public SimpleXMLElement::__construct ( string $data , int $options = 0 , bool $data_is_url = false , string $ns = "" , bool $is_prefix = false )

Crée un nouvel objet SimpleXMLElement.

Liste de paramètres

data

Une chaîne de caractères XML bien formée ou le chemin d'accès ou un URL pointant à un document XML si data_is_url vaut true.

options

Optionnellement utilisé pour spécifier des paramètres Libxml additionnels, qui affecte la lecture de documents XML. Les options affectant la sortie des documents XML (par exemple LIBXML_NOEMPTYTAG) sont ignorée silencieusement.

Note:

Il peut être nécessaire de passer LIBXML_PARSEHUGE pour pouvoir traiter des nœuds de texte profondément imbriqués ou très volumineux.

data_is_url

Par défaut, data_is_url vaut false. Utilisez true pour spécifier que le paramètre data est un chemin d'accès ou un URL pointant à un document XML au lieu d'une chaîne de caractères de données.

ns

Préfixe d'espace de noms ou URI.

is_prefix

true si ns est un préfix, false sinon. Valeur par défaut : false.

Valeurs de retour

Retourne un objet SimpleXMLElement représentant les données data.

Erreurs / Exceptions

Produit un message d'erreur de type E_WARNING pour chaque erreur trouvée dans les données XML et lance également une exception si les données XML ne peuvent être analysées.

Astuce

Utilisez la fonction libxml_use_internal_errors() pour supprimer toutes les erreurs XML et la fonction libxml_get_errors() pour les parcourir.

Historique

Version | Description
5.2.0 | Ajout des paramètres ns et is_prefix.
5.1.2 | Ajout des paramètres options et data_is_url.

Exemples

Note:

Les exemples listés incluent parfois example.php, ceci fait référence à la chaine XML du premier exemple de l'utilisation de base.

Exemple #1 Crée un objet SimpleXMLElement

<?php

include 'example.php';

$sxe = new SimpleXMLElement($xmlstr);
echo $sxe->movie[0]->title;

?>

L'exemple ci-dessus va afficher :

PHP: Behind the Parser

Exemple #2 Crée un objet SimpleXMLElement à partir d'un URL

<?php

$sxe = new SimpleXMLElement('http://example.org/document.xml', NULL, TRUE);
echo $sxe->asXML();

?>

Voir aussi

  • Utilisation de base SimpleXML
  • simplexml_load_string() - Convertit une chaîne XML en objet
  • simplexml_load_file() - Convertit un fichier XML en objet
  • Traitement des erreurs XML
  • libxml_use_internal_errors() - Désactive le rapport d'erreur libxml et les stocke pour lecture ultérieure

User Contributed Notes

rowan dot collins at gmail dot com 22-Apr-2017 03:23
The manual doesn't really explain what the $ns argument (and the accompanying $is_prefix) are for.

What they do is similar to the ->children() method: they set the context of the returned object to that namespace, so that access via ->elementName and ['attributeName'] refer to elements and attributes in that namespace.

In particular, they do *not* change the namespaces which exist on the document.

See this example:

<?php
// This XML contains two elements called <child>
// One is in the namespace http://example.com, with local prefix 'ws'
// The other has no namespace (no prefix, and no default namespace declared)
$xml = '<ws:example xmlns:ws="http://example.com"><child>Not in namespace</child><ws:child>In example namespace</ws:child></ws:example>';

$sx0 = new SimpleXMLElement($xml, 0, false);
$sx1 = new SimpleXMLElement($xml, 0, false, 'http://example.com');
$sx2 = new SimpleXMLElement($xml, 0, false, 'ws', true);

echo "
    Without: {$sx0->child}
    By namespace: {$sx1->child}
    By prefix: {$sx2->child}
";
?>

Output:

 Without: Not in namespace
 By namespace: In example namespace
 By prefix: In example namespace
ahmad dot mayahi at gmail dot com 07-Jun-2016 09:36
You won't be able to load an XML file without root element:

//This will throw an exception
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?>', null, false);

//Here is the solution
$xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><root></root>', null, false);
Phil Cross 01-Sep-2014 11:39
It's worth noting, that you need to typecast dynamic property names to string in order to retrieve there value, for example:

<?php
    $xml = new SimpleXMLElement('records.xml', 0, true);

    // This will work as expected because its a hard coded property value
    foreach($xml as $record){
        echo $record->id;    // Will output the ID fine
    }

    // Dynamic properties require typecasting to string
    $xml_field = 'id';
    foreach($xml as $record){

        // This will dump a SimpleXMLElement object
        var_dump($record->$xml_field);

        // This will output the value as expected
        echo (string)$record->$xml_field;
    }
?>
bertolini dot cedric at me dot com 16-Jun-2014 11:07
It's worth noting that the behavior of SimpleXmlElement::__construct is not exactly the same as simplexml_load_string, regarding libxml_use_internal_errors().

In my case,

<?php
libxml_use_internal_errors(true);
new \SimpleXmlElement($data);
?>

was still throwing error. But as soon as I switched to

<?php
libxml_use_internal_errors(true);
simplexml_load_string($data);
?>

everything worked fine and I stopped getting an error.
kumarldh at gmail dot com 22-Mar-2011 10:50
Using libxml_use_internal_errors() may suppress errors but Exception still requires decent handling. I used following code snippet.

<?php
libxml_use_internal_errors(true);
try{
    $xmlToObject = new SimpleXMLElement($notSoWellFormedXML);
} catch (Exception $e){
    echo 'Please try again later...';
    exit();
}
?>
uramihsayibok, gmail, com 16-Aug-2009 06:52
As I was filling out a bug report, I realized why (speculation here) the constructor is final: so that functions like simplexml_load_file and simplexml_load_string can work. I imagine the PHP-ized code looks something like

<?php

function simplexml_load_file($filename, $class_name = "SimpleXMLElement", $options = 0, $ns = "", $is_prefix = false) {
    return new $class_name($filename, $options, true, $ns, $is_prefix);
}

?>

If we were to use a different $class_name and change the constructor's definition these functions wouldn't work.

There's no easy, sensible solution that keeps simplexml_load_file and simplexml_load_string.
tudor at culise dot net 20-Nov-2007 03:35
This class is extendable, but it's too bad that its constructor cannot be overriden (PHP says it's a final method). Thus the class should be wrapped using the delegation principle rather that extended.


Compte le nombre de fils pour un élément

  • « SimpleXMLElement::__construct
  • SimpleXMLElement::getDocNamespaces »
  • PHP Manual
  • SimpleXMLElement
  • Compte le nombre de fils pour un élément

SimpleXMLElement::count

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SimpleXMLElement::count — Compte le nombre de fils pour un élément

Description

public SimpleXMLElement::count ( ) : int

Cette méthode compte le nombre de fils d'un élément.

Valeurs de retour

Retourne le nombre de fils d'un élément.

Exemples

Exemple #1 Comptage du nombre de fils

<?php
$xml = <<<EOF
<people>
 <person name="Person 1">
  <child/>
  <child/>
  <child/>
 </person>
 <person name="Person 2">
  <child/>
  <child/>
  <child/>
  <child/>
  <child/>
 </person>
</people>
EOF;

$elem = new SimpleXMLElement($xml);

foreach ($elem as $person) {
    printf("%s has got %d children.\n", $person['name'], $person->count());
}
?>

L'exemple ci-dessus va afficher :

Person 1 has got 3 children.
Person 2 has got 5 children.

Voir aussi

  • SimpleXMLElement::children() - Cherche les fils d'un noeud donné

User Contributed Notes

daniel dot erni at focusedpublishing dot com 22-Mar-2011 08:37
Alternative code for PHP < 5.3:
<?php
$count = $node->count(); // PHP > 5.3
$count = count($node->children()); // PHP < 5.3
?>


Retourne les espaces de noms déclarés dans un document

  • « SimpleXMLElement::count
  • SimpleXMLElement::getName »
  • PHP Manual
  • SimpleXMLElement
  • Retourne les espaces de noms déclarés dans un document

SimpleXMLElement::getDocNamespaces

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SimpleXMLElement::getDocNamespaces — Retourne les espaces de noms déclarés dans un document

Description

public SimpleXMLElement::getDocNamespaces ( bool $recursive = false , bool $from_root = true ) : array

Retourne les espaces de noms déclarés dans un document.

Liste de paramètres

recursive

Si spécifié, retourne tous les espaces de noms déclarés dans les noeuds parents et enfants. Sinon, retourne uniquement les espaces de noms déclarés dans le noeud racine.

from_root

Vous permet de vérifier récursivement les espaces de noms sous un noeud fils au lieu d'effectuer cette vérification depuis la racine du document XML.

Valeurs de retour

La méthode getDocNamespaces retourne un tableau d'espaces de noms avec leurs URL associées.

Exemples

Exemple #1 Récupère les espaces de noms du document

<?php

$xml = <<<XML
<?xml version="1.0" standalone="yes"?>
<people xmlns:p="http://example.org/ns">
    <p:person id="1">John Doe</p:person>
    <p:person id="2">Susie Q. Public</p:person>
</people>
XML;

$sxe = new SimpleXMLElement($xml);

$namespaces = $sxe->getDocNamespaces();
var_dump($namespaces);

?>

L'exemple ci-dessus va afficher :

array(1) {
   ["p"]=>
   string(21) "http://example.org/ns"
}

Exemple #2 Travail avec plusieurs espaces de noms

<?php

$xml = <<<XML
<?xml version="1.0" standalone="yes"?>
<people xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test">
    <p:person t:id="1">John Doe</p:person>
    <p:person t:id="2" a:addr="123 Street" xmlns:a="http://example.org/addr">
        Susie Q. Public
    </p:person>
</people>
XML;

$sxe = new SimpleXMLElement($xml);

$namespaces = $sxe->getDocNamespaces(TRUE);
var_dump($namespaces);

?>

L'exemple ci-dessus va afficher :

array(3) {
  ["p"]=>
  string(21) "http://example.org/ns"
  ["t"]=>
  string(23) "http://example.org/test"
  ["a"]=>
  string(23) "http://example.org/addr"
}

Voir aussi

  • SimpleXMLElement::getNamespaces() - Retourne les espaces de noms utilisés dans un document
  • SimpleXMLElement::registerXPathNamespace() - Crée un contexte préfixe/ns pour la prochaine requête XPath

User Contributed Notes

There are no user contributed notes for this page.


Récupère le nom d'un élément XML

  • « SimpleXMLElement::getDocNamespaces
  • SimpleXMLElement::getNamespaces »
  • PHP Manual
  • SimpleXMLElement
  • Récupère le nom d'un élément XML

SimpleXMLElement::getName

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

SimpleXMLElement::getName — Récupère le nom d'un élément XML

Description

public SimpleXMLElement::getName ( ) : string

Récupère le nom d'un élément XML.

Valeurs de retour

La méthode getName retourne un nom sous la forme de chaîne de caractères d'une balise XML référencé par l'objet SimpleXMLElement.

Exemples

Note:

Les exemples listés incluent parfois example.php, ceci fait référence à la chaine XML du premier exemple de l'utilisation de base.

Exemple #1 Récupère les noms des éléments XML

<?php
include 'example.php';
$sxe = new SimpleXMLElement($xmlstr);

echo $sxe->getName() . "\n";

foreach ($sxe->children() as $child)
{
    echo $child->getName() . "\n";
}

?>

L'exemple ci-dessus va afficher :

movies
movie

User Contributed Notes

There are no user contributed notes for this page.


Retourne les espaces de noms utilisés dans un document

  • « SimpleXMLElement::getName
  • SimpleXMLElement::registerXPathNamespace »
  • PHP Manual
  • SimpleXMLElement
  • Retourne les espaces de noms utilisés dans un document

SimpleXMLElement::getNamespaces

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

SimpleXMLElement::getNamespaces — Retourne les espaces de noms utilisés dans un document

Description

public SimpleXMLElement::getNamespaces ( bool $recursive = false ) : array

Retourne les espaces de noms utilisés dans un document.

Liste de paramètres

recursive

Si spécifié, retourne tous les espaces de noms utilisés dans les noeuds parents et enfants. Sinon, retourne uniquement les espaces de noms utilisés dans le noeud racine.

Valeurs de retour

La méthode getNamespaces retourne un tableau d'espaces de noms avec leurs URL associés.

Exemples

Exemple #1 Récupère les espaces de noms utilisés dans un document

<?php

$xml = <<<XML
<?xml version="1.0" standalone="yes"?>
<people xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test">
    <p:person id="1">John Doe</p:person>
    <p:person id="2">Susie Q. Public</p:person>
</people>
XML;

$sxe = new SimpleXMLElement($xml);

$namespaces = $sxe->getNamespaces(true);
var_dump($namespaces);

?>

L'exemple ci-dessus va afficher :

array(1) {
  ["p"]=>
  string(21) "http://example.org/ns"
}

Voir aussi

  • SimpleXMLElement::getDocNamespaces() - Retourne les espaces de noms déclarés dans un document
  • SimpleXMLElement::registerXPathNamespace() - Crée un contexte préfixe/ns pour la prochaine requête XPath

User Contributed Notes

thiago at osfeio dot com 29-Oct-2013 04:23
this article has more info : http://www.sitepoint.com/parsing-xml-with-simplexml/
harry at nospam dot thestorm dot plus dot com 17-Feb-2012 02:21
If the namespace is nested in the xml, then you will have to loop over the nodes.

<?php

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
  <people xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test">
      <items>
            <title>This is a test of namespaces and my patience</title>
            <p:person id="1">John Doe</p:person>
            <p:person id="2">Susie Q. Public</p:person>
            <p:person id="1">Fish Man</p:person>
      </items>
  </people>
XML;

$sxe = new SimpleXMLElement($xml);

foreach ($sxe as $out_ns)
{
    $ns = $out_ns->getNamespaces(true);

    $child = $out_ns->children($ns['p']);

    foreach ($child as $out)
    {
        echo $out . "<br />";
    }
}
?>
harry at nospam dot thestorm dot plus dot com 16-Feb-2012 12:50
To read a namespace node you have to use the children method.

<?php

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<people xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test">
    <p:person id="1">John Doe</p:person>
    <p:person id="2">Susie Q. Public</p:person>
</people>
XML;

$sxe = new SimpleXMLElement($xml);

$ns = $sxe->getNamespaces(true);

$child = $sxe->children($ns['p']);

foreach ($child->person as $out_ns)
{
    echo $out_ns;
}

?>


Crée un contexte préfixe/ns pour la prochaine requête XPath

  • « SimpleXMLElement::getNamespaces
  • SimpleXMLElement::saveXML »
  • PHP Manual
  • SimpleXMLElement
  • Crée un contexte préfixe/ns pour la prochaine requête XPath

SimpleXMLElement::registerXPathNamespace

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SimpleXMLElement::registerXPathNamespace — Crée un contexte préfixe/ns pour la prochaine requête XPath

Description

public SimpleXMLElement::registerXPathNamespace ( string $prefix , string $ns ) : bool

Crée un contexte préfixe/ns pour la prochaine requête XPath. En particulier, ceci est utile si le fournisseur du document XML donné modifie les préfixes d'espace de nom. registerXPathNamespace créera un préfixe pour l'espace de nom associé, autorisant l'accès aux noeuds dans cet espace de nom sans avoir besoin de changer le code pour autoriser les nouveaux préfixes dictés par le fournisseur.

Liste de paramètres

prefix

Le préfixe d'espace de nom à utiliser dans la requête XPath pour l'espace de nom donnée dans ns.

ns

L'espace de nom à utiliser pour la requête XPath. Ceci doit concorder avec un espace de nom qui est utilisé par le document XML, sinon la requête XPath qui utilise prefix ne retournera aucun résultat.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Fixe un préfixe d'espace de nom pour utiliser dans une requête XPath

<?php

$xml = <<<EOD
<book xmlns:chap="http://example.org/chapter-title">
    <title>My Book</title>
    <chapter id="1">
        <chap:title>Chapter 1</chap:title>
        <para>Donec velit. Nullam eget tellus vitae tortor gravida scelerisque.
            In orci lorem, cursus imperdiet, ultricies non, hendrerit et, orci.
            Nulla facilisi. Nullam velit nisl, laoreet id, condimentum ut,
            ultricies id, mauris.</para>
    </chapter>
    <chapter id="2">
        <chap:title>Chapter 2</chap:title>
        <para>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin
            gravida. Phasellus tincidunt massa vel urna. Proin adipiscing quam
            vitae odio. Sed dictum. Ut tincidunt lorem ac lorem. Duis eros
            tellus, pharetra id, faucibus eu, dapibus dictum, odio.</para>
    </chapter>
</book>
EOD;

$sxe = new SimpleXMLElement($xml);

$sxe->registerXPathNamespace('c', 'http://example.org/chapter-title');
$result = $sxe->xpath('//c:title');

foreach ($result as $title) {
  echo $title . "\n";
}

?>

L'exemple ci-dessus va afficher :

Chapter 1
Chapter 2

Notez comment le document XML montré dans cet exemple fixe un espace de nom avec le préfixe chap. Imaginez que ce document (ou un autre similaire) puisse avoir utilisé un préfixe c dans le passé pour le même espace de nom. Puisqu'il a changé, la requête XPath ne retournerait plus les résultats appropriés et la requête devrait être modifiée. L'utilisation de registerXPathNamespace évite les modifications futures de la requête même si le fournisseur change le préfixe d'espace de nom.

Voir aussi

  • SimpleXMLElement::xpath() - Exécute une requête Xpath sur des données XML
  • SimpleXMLElement::getDocNamespaces() - Retourne les espaces de noms déclarés dans un document
  • SimpleXMLElement::getNamespaces() - Retourne les espaces de noms utilisés dans un document

User Contributed Notes

Lea Hayes 12-Jan-2011 09:56
Looks like you have to use registerXPathNamespace for each node when using XPath:

<?php
$xml = simplexml_load_file($filename);

$xml->registerXPathNamespace('test', 'http://example.com');

$shopping_element = $xml->xpath('test:shopping-list');

// Breaks with out the following line:

$shopping_element->registerXPathNamespace('test', 'http://example.com');

$fruit = $shopping_element->xpath('test:fruit');
?>


Alias de SimpleXMLElement::asXML

  • « SimpleXMLElement::registerXPathNamespace
  • SimpleXMLElement::__toString »
  • PHP Manual
  • SimpleXMLElement
  • Alias de SimpleXMLElement::asXML

SimpleXMLElement::saveXML

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

SimpleXMLElement::saveXML — Alias de SimpleXMLElement::asXML()

Description

Cette méthode est un alias de: SimpleXMLElement::asXML()

User Contributed Notes

There are no user contributed notes for this page.


Retourne le contenu sous forme de chaine

  • « SimpleXMLElement::saveXML
  • SimpleXMLElement::xpath »
  • PHP Manual
  • SimpleXMLElement
  • Retourne le contenu sous forme de chaine

SimpleXMLElement::__toString

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

SimpleXMLElement::__toString — Retourne le contenu sous forme de chaine

Description

public SimpleXMLElement::__toString ( ) : string

Retourne le contenu texte stocké directement dans l'élément. Ne retourne pas le contenu texte stocké dans les éléments enfants.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le contenu sous forme de chaine de caractères, ou retourne une chaine vide en cas d'erreur.

Exemples

Exemple #1 Récupérer le contenu chaine

<?php
$xml = new SimpleXMLElement('<a>1 <b>2 </b>3</a>');
echo $xml;
?>

L'exemple ci-dessus va afficher :

1 3

Voir aussi

  • SimpleXMLElement::asXML() - Retourne une chaîne XML basée sur un élément SimpleXML

User Contributed Notes

mmj at example dot net 02-Oct-2017 03:22
__toString() is not intended to be called directly.

Instead, it defines what is returned when the object is cast to string, either explicitly with:

(string)$element

Or implicitly, when used in certain contexts which would cause a conversion to string.
Patanjali 27-Mar-2016 10:55
[Someone remove that other Patanjali's note, because it has errors! :-(]

For those for whom it may not be immediately obvious from the example, the echo is what is forcing __toString() to be used.

However, to assign the text of a node (but not its children) to a variable:

$XML = new SimpleXMLElement('<p>Hello<span> world</span>.<span> Good day!</span></p>');

$Text = $XML->__toString();

is effectively:
$Text = 'Hello.'; // The <span>s are ignored.

Either of:
$Text = $XML->span->__toString();
$Text = $XML->span[0]->__toString();

is effectively:
$Text = ' world'; // Only the first <span> is used.

$Text = $XML->span[1]->__toString();

is effectively:
$Text = ' Good day!'; // Only the second <span> is used.
Patanjali 27-Mar-2016 10:36
For those for whom it may not be immediately obvious from the example, to assign the text of a node (but not its children) to a variable:

$XML = new SimpleXMLElement('<p>Hello<span> world</span>.<span> Good day!</span></p>');

Either:
$Text = $XML;
$Text = $XML->__String();

is effectively:
$Text = 'Hello.'; // The <span>s are ignored.

Either of:
$Text = $XML->span;
$Text = $XML->span[0];

is effectively:
$Text = ' world'; // Only the first <span> is used.

$Text = $XML->span[1];

is effectively:
$Text = ' Good day!'; // Only the second <span> is used.


Exécute une requête Xpath sur des données XML

  • « SimpleXMLElement::__toString
  • SimpleXMLIterator »
  • PHP Manual
  • SimpleXMLElement
  • Exécute une requête Xpath sur des données XML

SimpleXMLElement::xpath

(PHP 5, PHP 7, PHP 8)

SimpleXMLElement::xpath — Exécute une requête Xpath sur des données XML

Description

public SimpleXMLElement::xpath ( string $path ) : array

La méthode xpath cherche dans le noeud SimpleXML des enfants qui correspondent au path Xpath.

Liste de paramètres

path

Un chemin XPath

Valeurs de retour

Retourne un tableau d'objets SimpleXMLElement ou false si une erreur survient.

Exemples

Exemple #1 Xpath

<?php
$string = <<<XML
<a>
 <b>
  <c>text</c>
  <c>stuff</c>
 </b>
 <d>
  <c>code</c>
 </d>
</a>
XML;

$xml = new SimpleXMLElement($string);

/* On cherche <a><b><c> */
$result = $xml->xpath('/a/b/c');

while(list( , $node) = each($result)) {
    echo '/a/b/c: ',$node,"\n";
}

/* Les chemins relatifs fonctionnent aussi... */
$result = $xml->xpath('b/c');

while(list( , $node) = each($result)) {
    echo 'b/c: ',$node,"\n";
}
?>

L'exemple ci-dessus va afficher :

/a/b/c: text
/a/b/c: stuff
b/c: text
b/c: stuff

Notez que les deux résultats sont égaux.

Voir aussi

  • SimpleXMLElement::registerXPathNamespace() - Crée un contexte préfixe/ns pour la prochaine requête XPath
  • SimpleXMLElement::getDocNamespaces() - Retourne les espaces de noms déclarés dans un document
  • SimpleXMLElement::getNamespaces() - Retourne les espaces de noms utilisés dans un document
  • Utilisation de base SimpleXML

User Contributed Notes

awoerl at contentserv dot com 31-Jan-2017 12:43
I tried to use string functions in the xpath statements I'm passing, like

$oXml->xpath('substring(/foo/bar/text(), 0, 4)');

But no matter which syntax I'm trying I never the string functions to work.

Is it possible, that the xpath method does not support function calls?
Alexis Peters 11-Oct-2016 09:11
If you want this behavior for an multidimensional array you can use this:

<?php
function apath(&$a, $path, $value = NULL) {
    $pathes = explode('/',$path);

    if(count($pathes) > 1) {
        $firstPart = array_shift($pathes);
        if(!isset($a[$firstPart])) {
            $a[$firstPart] = array();
        }
        return apath($a[$firstPart], implode('/', $pathes), $value);
    } else {
        if($value){
            $a[$path] = $value;
        } else {
            return $a[$path];
        }
    }
}

apath($a, 'user/name', array('prename' => 'foo', 'lastname' => 'bar'));

$a = array();
var_dump($a);
var_dump(apath($a, 'user/name/lastname'));

?>
Gives you this:

array(1) {
  ["user"]=>
  array(1) {
    ["name"]=>
    array(2) {
      ["prename"]=>
      string(5) "foo"
      ["lastname"]=>
      string(8) "bar"
    }
  }
}
string(8) "bar"
Anonymous 30-Jan-2015 05:30
As mentioned already xpath will fail is the default namespace 'xmlns' is used like in:

<?php

$xmlstring = $string = <<<XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <fileVersion appName="xl" />
</workbook>
XML;
?>

xpath cannot search through the xml without explicitly specifying a namespace.
There are 2 options :
1. rename the 'xmlns' into something else to trick xpath into believing that no default namespace is defined.
2. register a string as the default namespace and use that string in all your queries. Unfortunatly, an empty space will not work.
No other option currently exist until XPath2.0 becomes the default library.
leonjanzen at gmail dot com 19-Oct-2014 07:48
To run an xpath query on an XML document that has a namespace, the namespace must be registered with SimpleXMLElement::registerXPathNamespace() before running the query. If the XML document namespace does not include a prefix, you must make up an arbitrary one, and then use it in your query.

<?php
$strXml= <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<mydoc xmlns="http://www.url.com/myns">
    <message>Test message</message>
</mydoc>
XML;

$xmlDoc=new \SimpleXMLElement($strXml);

foreach($xmlDoc->getDocNamespaces() as $strPrefix => $strNamespace) {
    if(strlen($strPrefix)==0) {
        $strPrefix="a"; //Assign an arbitrary namespace prefix.
    }
    $xmlDoc->registerXPathNamespace($strPrefix,$strNamespace);
}

print($xmlDoc->xpath("//a:message")[0]); //Use the arbitrary namespace prefix in the query.
?>

This will output:

Test message
BenjaminBeck at gmx dot de 13-Sep-2014 01:36
If you want to search multiple values from xml on the behalf or one value then this code can be helpfull to you.

if there is:
<Record>
  <country>Pakistan</country>
  <code>+92</code>
  <Value>100<Value>
</Record>

then try this one:
<?php
$sxe =  simplexml_load_file("countries.XML");
foreach($sxe->xpath('//RECORD') as $item) {

    $v = $row->xpath('./country[. ="Pakistan"]');
    if($v[0]){
        print $item->country;
        print $item->code;
        print $item->value;
    }

}
?>
yetihehe at yetihehe dot com 12-Jan-2011 02:21
Xpath actually knows which element is root regardless of element on which you execute it. Example:

<?php

$string = <<<XML
<a>
 <b>
  <c>text</c>
  <c>stuff</c>
 </b>
 <b>
  <c>code</c>
 </b>
</a>
XML;

header('content-type: text/plain');

$xml = new SimpleXMLElement($string);

//relative to root
$b0=$xml->b[0]->xpath('//c');
while(list( , $node) = each($b0)) {
    echo 'b[0]: //c: ',$node,"\n";
}

$b1=$xml->b[1]->xpath('//c');
while(list( , $node) = each($b1)) {
    echo 'b[1]: //c: ',$node,"\n";
}

echo "\n";

//relative to current element
$b0=$xml->b[0]->xpath('.//c');
while(list( , $node) = each($b0)) {
    echo 'b[0]: .//c: ',$node,"\n";
}

$b1=$xml->b[1]->xpath('.//c');
while(list( , $node) = each($b1)) {
    echo 'b[1]: .//c: ',$node,"\n";
}

?>

Will return:
b[0]: //c: text
b[0]: //c: stuff
b[0]: //c: code
b[1]: //c: text
b[1]: //c: stuff
b[1]: //c: code

b[0]: .//c: text
b[0]: .//c: stuff
b[1]: .//c: code
stefan at efectos dot nl 09-Nov-2010 02:33
Having problems selecting information through xpath when there are namespaces in the XML?

Try this quick and dirty solution, but it works:

<?php
$objImageXml = new SimpleXMLElement($objImageXml->asXML());
?>
grummfy at gmail dot com 11-Feb-2010 04:08
On a xml that have namespace you need to do this before your xpath request (or empty array will be return) :

<?php
$string = str_replace('xmlns=', 'ns=', $string); //$string is a string that contains xml...
?>
DrupalFocus at earthlink dot net 02-Dec-2009 12:27
Looks like the relative path is relative to the SimpleXMLElement object that you call the Xpath() method on.  Basically chopping off the root element.

<?php
$string = <<<XML
<foo>
  <bar>
    <a>
     <b>
      <c>text</c>
      <c>stuff</c>
     </b>
     <d>
      <c>code</c>
     </d>
    </a>
  </bar>
</foo>
XML;

$xml = new SimpleXMLElement($string);
/* Search for children using 2nds level relative <bar><a><b><c> */
$result = $xml->xpath('a/b/c');
if ($result)
foreach($result as $node) {
    drupal_set_message(t('a/b/c: @node.', array('@node' => $node)));
}
else
  drupal_set_message(t('a/b/c: failed.'));

/* it relative to the SimpleXMLElement Search for 2nds level relative <bar><a><b><c> but where is foo */
$bar = $xml->bar;
$result = $bar->xpath('a/b/c');
foreach($result as $node) {
    drupal_set_message(t('bar->a/b/c: @node.', array('@node' => $node)));
}
?>

results in :
#
# a/b/c: failed.
# bar->a/b/c: text.
# bar->a/b/c: stuff.
behnam@zwnj 24-Sep-2009 01:34
Seems like this function cannot return the result of XPath string() [1] function.  For example if you query xpath("string(a/@b)") you will get bool(false) although the node "a" may have the attribute "b" set to a non-empty string.

[1] http://www.w3.org/TR/xpath#section-String-Functions
Anti Veeranna 17-Jun-2009 03:50
Whether it returns a false or empty array for a non-existing path seems to depend on libxml version.

I tried the following code:

<?php
$data = '<foo><bar></bar></foo>';
$xml = simplexml_load_string($data);
print gettype($xml->xpath('/first/second'));
?>

On a machine with libxml 2.6.16 and PHP 5.2.8 I got back boolean. On a different machine with libxml 2.7.3 and PHP 5.2.8/5.2.9 I got back empty array.

You can check the libxml version from command line by executing: php --ri libxml

or simply look at phpinfo() output
arealzone-czernobyl at yahoo dot de 11-Jun-2009 03:23
The simplest way to count nodes in a XML doc:

<?php
$xml = new SimpleXMLElement($xmlstr);

$xmlNode = $xml->xpath('root/yourNodeName');
$nodeCount = count($xmlNode);

echo $nodeCount;
?>
anemik 02-Jul-2008 03:46
If you want to find easly all records satisfying some condition in XML data like

....
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
   </book>
...

try example below

<?php

$xmlStr = file_get_contents('data/books.xml');
$xml = new SimpleXMLElement($xmlStr);
// seach records by tag value:
// find all book records with price higher than 40$
$res = $xml->xpath("book/price[.>'40']/parent::*");
print_r($res);

?>

You will see response like:
Array (
[0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [id] => bk101
                )

            [author] => Gambardella, Matthew
            [title] => XML Developer's Guide
            [genre] => Computer
            [price] => 44.95
            [publish_date] => 2000-10-01
            [description] => An in-depth look at creating applications
      with XML.
        )
...
paul at pmtlogic dot com 18-Jun-2008 12:17
xpath doesn't seem to be able to handle single quotes embedded in the query itself. For instance, I want to find geo coordinates in an xml file based on country name.

xml snippet:

<zones>
<zone country="Cote d'Ivoire" fullName="Yamoussoukro" geo="6.82,-5.28" id="1050"><url prefix="1001" value="fiji.html" /><url prefix="1002" value="C" /></zone>
</zones>

The following code does not work:

<?php
$xml = simplexml_load_file("my.xml");
$result = $xml->xpath("//zone[@country='Cote d\'Ivoire']");

foreach ( $result[0]->attributes() as $key => $val ) {
    print "<div class='coords'>$key: $val</div>\n";
}
?>

I have tried many variations on the embedded single quote (i.e. escape codes) but with no result. W3C offers no explanation either.

In addition, there doesn't seem to be any way of embedding wildcards in the attribute value (you can embed wildcards in the attribute name). Otherwise the following might be a reasonable substitute in this context:

<?php $result = $xml->xpath("//zone[@country='Cote d*Ivoire']"); ?>
canuemail at gmail dot com 05-May-2008 05:05
If you want to search multiple values from xml on the behalf or one value then this code can be helpfull to you.

if there is:
<Record>
  <country>Pakistan</country>
  <code>+92</code>
  <Value>100<Value>
</Record>

then try this one:
<?php
$sxe =  simplexml_load_file("countries.XML");
foreach($sxe->xpath('//RECORD') as $item) {

    $row = simplexml_load_string($item->asXML());
    $v = $row->xpath('//country[. ="Pakistan"]');
    if($v[0]){
        print $item->country;
        print $item->code;
        print $item->value;
    }

}
?>
Hugh 18-Dec-2005 03:23
Note that this function does not ALWAYS return an array. It seems that if the specified path is not found in the document, it will return false. You need to check for the false value before using foreach, if you wish to avoid a warning (and often to handle errors or control program flow in this situation).
drewish at katherinehouse dot com 10-Jul-2005 06:16
xpath() can also be used to select elements by their attributes. For a good XPath reference check out: http://www.w3schools.com/xpath/xpath_syntax.asp

<?php
$string = <<<XML
<sizes>
    <size label="Square" width="75" height="75" />
    <size label="Thumbnail" width="100" height="62" />
    <size label="Small" width="112" height="69" />
    <size label="Large" width="112" height="69" />
</sizes>
XML;

$xml = simplexml_load_string($string);
$result = $xml->xpath("//size[@label='Large']");

// print the first (and only) member of the array
echo $result[0]->asXml();
?>

The script would print:
<size label="Large" width="112" height="69"/>


La classe SimpleXMLIterator

(PHP 5 >= 5.1.3, PHP 7, PHP 8)

Introduction

La classe SimpleXMLIterator fournit des itérations récursives sur tous les éléments d'un objet SimpleXMLElement.

Synopsis de la classe

SimpleXMLIterator extends SimpleXMLElement implements RecursiveIterator , Countable {
/* Méthodes */
public current ( ) : mixed
public getChildren ( ) : SimpleXMLIterator
public hasChildren ( ) : bool
public key ( ) : mixed
public next ( ) : void
public rewind ( ) : void
public valid ( ) : bool
/* Méthodes héritées */
final public SimpleXMLElement::__construct ( string $data , int $options = 0 , bool $data_is_url = false , string $ns = "" , bool $is_prefix = false )
public SimpleXMLElement::addAttribute ( string $name , string $value = ? , string $namespace = ? ) : void
public SimpleXMLElement::addChild ( string $name , string $value = ? , string $namespace = ? ) : SimpleXMLElement
public SimpleXMLElement::asXML ( string $filename = ? ) : mixed
public SimpleXMLElement::attributes ( string $ns = null , bool $is_prefix = false ) : SimpleXMLElement
public SimpleXMLElement::children ( string $ns = ? , bool $is_prefix = false ) : SimpleXMLElement
public SimpleXMLElement::count ( ) : int
public SimpleXMLElement::getDocNamespaces ( bool $recursive = false , bool $from_root = true ) : array
public SimpleXMLElement::getName ( ) : string
public SimpleXMLElement::getNamespaces ( bool $recursive = false ) : array
public SimpleXMLElement::registerXPathNamespace ( string $prefix , string $ns ) : bool
public SimpleXMLElement::__toString ( ) : string
public SimpleXMLElement::xpath ( string $path ) : array
}

Sommaire

  • SimpleXMLIterator::current — Retourne l'entrée courante
  • SimpleXMLIterator::getChildren — Retourne un itérateur pour l'entrée courante, si c'est un objet SimpleXML
  • SimpleXMLIterator::hasChildren — Indique si l'entrée courante de SimpleXML est un objet
  • SimpleXMLIterator::key — Retourne la clé courante
  • SimpleXMLIterator::next — Se déplace sur l'entrée SimpleXML suivante
  • SimpleXMLIterator::rewind — Replace le pointeur SimpleXML au début
  • SimpleXMLIterator::valid — Vérifie si une ressource SimpleXML contient d'autres entrées

User Contributed Notes

prouchetvincent at free dot fr 10-Oct-2020 12:47
<?php
=======================================================
$index =
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <article id="8" visibility="true" filename="2020-10-08" fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
    <article id="7" visibility="true" filename="2020-10-07" fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
    <article id="6" visibility="true" filename="2020-10-02" fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
    <article id="5" visibility="true" filename="2020-09-30" fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
    <article id="4" visibility="true" filename="2020-09-26" fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
    <article id="3" visibility="true" filename="2020-09-22"     fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
    <article id="2" visibility="true" filename="2020-09-20"     fileExtension="xml">
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
        <article id="1" visibility="true" filename="hello world" fileExtension="xml">
            Hello World
            <tag>xml</tag>
            <tag>php</tag>
            <tag>experiment</tag>
    </article>
</root>
====================================================================
?>
If you have to use an iterator to parse your XML
and need tu get an attribute of tags of this iterator then
use the fonction
->current()
of simpleXMLIterator on your object before
->attributes()->{attibute name}
<?php
$file="";
try{
     $index = new SimpleXMLIterator ( file_get_contents ( FILEDIRECTORY. 'index.xml' ) );}
catch(Exception $e) {whatever you want to do on error}}

for( $index->rewind(); $index->valid(); $index->next() ) {
    try {
          $file = file_get_contents(FILESDIRECTORY.$index->current()->attributes()->{'fileName'}. '.xml' );
    } catch (Exception $e) {whatever you want to do on error}
    $article = new Article ();
    $article->setXMLArticle ($file);
    array_push( $this->articles, $article );
    $file ="";
    }
}
?>
This exemple use a custom made Article object that itself parse the file given to him to initialise its properties .
Here we open a file (Yes I use constant for my directories)
make it a simpleXMLIterator and parse article elements to get the filename attribute to use it to open another XML file for data collection.
don't forget !!! In PHP Object created by new ClassName() are ALWAYS given by reference that is why new Article() in inside the loop and not outside
(yhea, I did that mistake)
XMLIterator are powerfull yet harder to understand in themselves but once passed that one point.
They are very more easier to use than plain arrays.
rukkykf at gmail dot com 16-Dec-2018 06:54
I think it's worth mentioning that you need to call the rewind() method on the SimpleXMLIterator object immediately after initialization before you can start doing any other operations on the object. An example:

<?php
$xml = new SimpleXMLIterator('file.xml', null, true);

// $x here will be set to null because the rewind() method has not been called
$x = $xml->current();

$xml->rewind();

// $x here will be set to the first element
$x = $xml->current();

?>
php-lover at live dot com 05-Oct-2015 09:50
Function to extract SimpleXMLElement data to array.

function extract($sxe = null) {
    if (!$sxe instanceOf SimpleXMLElement)
        return array();

    $extract = array();

    foreach ($sxe->children() as $key => $value) {
        if (array_key_exists($key, $extract)) {
            if (!isset($extract[$key][0])) {
                $tmp_extract = $extract[$key];
                $extract[$key] = array();
                $extract[$key][0] = $tmp_extract;
            } else
                $extract[$key] = (array) $extract[$key];
        }

        if ($value->count()) {
            if (isset($extract[$key]) && is_array($extract[$key]))
                $extract[$key][] = $this->extract($value);
            else
                $extract[$key] = $this->extract($value);
        } else {
            if (isset($extract[$key]) && is_array($extract[$key]))
                $extract[$key][] = empty(strval($value)) ? null : strval($value);
            else
                $extract[$key] = empty(strval($value)) ? null : strval($value);
        }
    }

    return $extract;
}
centy2010 at hotmail dot com 16-Jul-2014 03:22
I filled my database from an XML file about 1260 Kb.
I made my process less than a second. Simply by using SimpleXML.

I give you a little example of the usage to fill a database.
Given the table universe.
With 4 columns Coords, Planet_Name, Player_id, Moon_Size.

Now You have a XML file named universe.xml with this kind of data.
I enclose the data within php tags but it's a file :p
<?php
$xml = <<<EOT
<?xml version="1.0" encoding="UTF-8"?>
<universe xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -
xsi:noNamespaceSchemaLocation="http://s127-fr.ogame.gameforge.com/api/xsd/universe.xsd" -
timestamp="1405413350" serverId="fr127">
    <planet id="1" player="1" name="Arakis" coords="1:1:2">
        <moon id="2" name="Mond" size="4998"/>
    </planet>
    <planet id="33620176" player="100000" name="GameAdmin" coords="1:1:3"/>
    <planet id="33620179" player="100003" name="Heimatplanet" coords="1:1:1"/>
    <planet id="33620186" player="100004" name="OGame Team" coords="6:250:1"/>
    <planet id="33620242" player="100058" name="KnS" coords="9:1:6">
        <moon id="33668391" name="Lune" size="8831"/>
    </planet>
</universe>
EOT;
?>

Now how to bring these data in my 4 columns table :

<?php
$newfname = $path."Universe.XML";
$mydata = new SimpleXmlIterator($newfname, 0, true);
$myquery = "INSERT INTO `".$tablename."` (`coords`,`planet_name`, `player_id`, `moon_size`) VALUES ";
for ($mydata->rewind();$mydata->valid();$mydata->next()) {
    $myquery.= " ('".$mydata->current()->attributes()['coords']
_."','".utf8_decode($mydata->current()->attributes()['name'])
_."','".utf8_decode($mydata->current()->attributes()['player'])
_."','";
    if ($mydata->haschildren()) {
        $myquery.= $mydate->current()->children()->attributes()['size']."'),";
    } else {
        $myquery.= "'),";
    }
}
$myquery = rtrim($myquery, ",");
$datatosql = mysql_query($myquery);
?>
hezll at msn dot com 11-Apr-2013 04:34
Most of the time we need to convert the XML to array or JSON , but now I have to completed the requirement of converting XML to XPath which make our template easily geting the data from XML data source due to the Xpath mapping .Here is the function:

<?php

function sxiToXpath($sxi, $key = null, &$tmp = null)
{
    $keys_arr = array();
    //get the keys count array
    for ($sxi->rewind(); $sxi->valid(); $sxi->next())
    {
        $sk = $sxi->key();
        if (array_key_exists($sk, $keys_arr))
        {
            $keys_arr[$sk]+=1;
            $keys_arr[$sk] = $keys_arr[$sk];
        }
        else
        {
            $keys_arr[$sk] = 1;
        }
    }
    //create the xpath
    for ($sxi->rewind(); $sxi->valid(); $sxi->next())
    {
        $sk = $sxi->key();
        if (!isset($$sk))
        {
            $$sk = 1;
        }
        if ($keys_arr[$sk] >= 1)
        {
            $spk = $sk . '[' . $$sk . ']';
            $keys_arr[$sk] = $keys_arr[$sk] - 1;
            $$sk++;
        }
        else
        {
            $spk = $sk;
        }
        $kp = $key ? $key . '/' . $spk : '/' . $sxi->getName() . '/' . $spk;
        if ($sxi->hasChildren())
        {
            sxiToXpath($sxi->getChildren(), $kp, $tmp);
        }
        else
        {
            $tmp[$kp] = strval($sxi->current());
        }
        $at = $sxi->current()->attributes();
        if ($at)
        {
            $tmp_kp = $kp;
            foreach ($at as $k => $v)
            {
                $kp .= '/@' . $k;
                $tmp[$kp] = $v;
                $kp = $tmp_kp;
            }
        }
    }
    return $tmp;
}

function xmlToXpath($xml)
{
    $sxi = new SimpleXmlIterator($xml);
    return sxiToXpath($sxi);
}

/**
 *  How to use the function
 */
$xml = <<<EOT
<?xml version="1.0" encoding="utf8" ?>
<data>
   <item ID="30001">
      <Company>Navarro Corp.</Company>
   </item>
   <item ID="30002" IDd="30002">
      <Company>Performant Systems</Company>
   </item>
   <item ID="30003">
      <Company id='id_test'><g id='id_g'>glove</g></Company>
   </item>
    <item>
    </item>
</data>
EOT;

$rs = xmlToXpath($xml);
print_r($rs);

/**
 * the results may lkie this:
Array
(
    [/data/item[1]/Company[1]] => Navarro Corp.
    [/data/item[1]/@ID] => SimpleXMLIterator Object
        (
            [0] => 30001
        )
    [/data/item[2]/Company[1]] => Performant Systems
    [/data/item[2]/@ID] => SimpleXMLIterator Object
        (
            [0] => 30002
        )

    [/data/item[2]/@IDd] => SimpleXMLIterator Object
        (
            [0] => 30002
        )

    [/data/item[3]/Company[1]/g[1]] => glove
    [/data/item[3]/Company[1]/g[1]/@id] => SimpleXMLIterator Object
        (
            [0] => id_g
        )

    [/data/item[3]/Company[1]/@id] => SimpleXMLIterator Object
        (
            [0] => id_test
        )

    [/data/item[3]/@ID] => SimpleXMLIterator Object
        (
            [0] => 30003
        )

    [/data/item[4]] =>

)
 */

echo "Total:" . count($rs);

echo "<hr>";
/* You can check the xpath result like this */
$xml = new SimpleXMLElement($xml);
foreach ($rs as $k => $v)
{
    echo "Xpath:" . $k . " |Value:" . $v . " ";
    var_dump($xml->xpath($k));
    echo "<br>";
}
ajnsit dot NOSPAM at gmail dot com 17-Mar-2011 10:14
Here's a simple function to convert an XML string to an array -

<?php
// PHP5.3 and above only
function parse($str) {
    $f = function($iter) {
      foreach($iter as $key=>$val)
        $arr[$key][] = ($iter->hasChildren())?
          call_user_func (__FUNCTION__, $val)
          : strval($val);
      return $arr;
    };
    return $f(new SimpleXmlIterator($str, null));
}
?>

PHP 5.2 and below do not have anonymous functions.
But you can create a helper function to achieve the same thing -

<?php
  function parse($str) {
    return parseHelper(new SimpleXmlIterator($str, null));
  }
  function parseHelper($iter) {
    foreach($iter as $key=>$val)
      $arr[$key][] = ($iter->hasChildren())?
        call_user_func (__FUNCTION__, $val)
        : strval($val);
    return $arr;
  }
?>

Using it is straightforward enough -

<?php

$xml = '
<movies>
  <movie>abcd</movie>
  <movie>efgh</movie>
  <movie>hijk</movie>
</movies>';
var_dump(parse($xml));

?>

This will output -

array
  'movie' =>
    array
      0 => string 'abcd' (length=4)
      1 => string 'efgh' (length=4)
      2 => string 'hijk' (length=4)
ratfactor at gmail dot com 19-Jul-2009 05:08
The documentation is a bit sparse for SimpleXmlIterator.  Here is an example showing the use of its methods. xml2Array and sxiToArray work together to convert an XML document to an associative array structure.

The contents of cats.xml:
======================================
<cats>
  <cat>
      <name>Jack</name>
      <age>2</age>
      <color>grey</color>
      <color>white</color>
  </cat>
  <cat>
      <name>Maxwell</name>
      <age>12</age>
      <color>orange</color>
      <color>black</color>
  </cat>
</cats>
======================================

<?php
function xml2array($fname){
  $sxi = new SimpleXmlIterator($fname, null, true);
  return sxiToArray($sxi);
}

function sxiToArray($sxi){
  $a = array();
  for( $sxi->rewind(); $sxi->valid(); $sxi->next() ) {
    if(!array_key_exists($sxi->key(), $a)){
      $a[$sxi->key()] = array();
    }
    if($sxi->hasChildren()){
      $a[$sxi->key()][] = sxiToArray($sxi->current());
    }
    else{
      $a[$sxi->key()][] = strval($sxi->current());
    }
  }
  return $a;
}

// Read cats.xml and print the results:
$catArray = xml2array('cats.xml');
print_r($catArray);
?>

Results (reformatted a bit for compactness and clarity):
======================================
Array(
  [cat] => Array(
    [0] => Array(
      [name] => Array(  [0] => Jack    )
      [age] => Array(   [0] => 2       )
      [color] => Array( [0] => grey,
                        [1] => white   )
    )
    [1] => Array(
      [name] => Array(  [0] => Maxwell )
      [age] => Array(   [0] => 12      )
      [color] => Array( [0] => orange
                        [1] => black   )
    )
  )
)


Retourne l'entrée courante

  • « SimpleXMLIterator
  • SimpleXMLIterator::getChildren »
  • PHP Manual
  • SimpleXMLIterator
  • Retourne l'entrée courante

SimpleXMLIterator::current

(PHP 5, PHP 7, PHP 8)

SimpleXMLIterator::current — Retourne l'entrée courante

Description

public SimpleXMLIterator::current ( ) : mixed

Cette méthode retourne l'élément courant comme un objet SimpleXMLIterator ou bien null.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne l'élément courant comme un objet SimpleXMLIterator ou null, en cas d'échec.

Exemples

Exemple #1 Retourne l'élément courant

<?php
$xmlIterator = new SimpleXMLIterator('<books><book>PHP basics</book><book>XML basics</book></books>');
var_dump($xmlIterator->current());

$xmlIterator->rewind(); // Retour au premier élément
var_dump($xmlIterator->current());
?>

L'exemple ci-dessus va afficher :

NULL
object(SimpleXMLIterator)#2 (1) {
  [0]=>
  string(10) "PHP basics"
}

Voir aussi

  • SimpleXMLIterator::key() - Retourne la clé courante
  • SimpleXMLIterator::next() - Se déplace sur l'entrée SimpleXML suivante
  • SimpleXMLIterator::rewind() - Replace le pointeur SimpleXML au début
  • SimpleXMLIterator::valid() - Vérifie si une ressource SimpleXML contient d'autres entrées
  • SimpleXMLElement

User Contributed Notes

bmafzallmahmud at gmail dot com 02-Dec-2017 05:51
<?php
$note=<<<XML
<note>
<to>Afzall</to>
<from>Hasan</from>
<heading>Reminder</heading>
<body>Don't forget your parents</body>
</note>
XML;

$xmlIterator = new SimpleXMLIterator($note);
var_dump($xmlIterator->current()); //out put : NULL
var_dump($xmlIterator->rewind()); //out put null
$xmlIterator->rewind(); //beacse of rewind to first element then show "$xmlIterator->current()""
var_dump($xmlIterator->current());
 //out put : object(SimpleXMLIterator)#2 (1) { [0]=> string(6) "Afzall" }
?>


Retourne un itérateur pour l'entrée courante, si c'est un objet SimpleXML

  • « SimpleXMLIterator::current
  • SimpleXMLIterator::hasChildren »
  • PHP Manual
  • SimpleXMLIterator
  • Retourne un itérateur pour l'entrée courante, si c'est un objet SimpleXML

SimpleXMLIterator::getChildren

(PHP 5, PHP 7, PHP 8)

SimpleXMLIterator::getChildren — Retourne un itérateur pour l'entrée courante, si c'est un objet SimpleXML

Description

public SimpleXMLIterator::getChildren ( ) : SimpleXMLIterator

Cette méthode retourne un objet SimpleXMLIterator contenant les sous-éléments de l'élémenmt courant SimpleXMLIterator.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne un objet SimpleXMLIterator contenant les sous-éléments de l'objet courant.

Exemples

Exemple #1 Lecture des sous-éléments de l'objet courant

<?php
$xml = <<<XML
<books>
    <book>
        <title>PHP Basics</title>
        <author>Jim Smith</author>
    </book>
    <book>XML basics</book>
</books>
XML;

$xmlIterator = new SimpleXMLIterator($xml);
for( $xmlIterator->rewind(); $xmlIterator->valid(); $xmlIterator->next() ) {
    foreach($xmlIterator->getChildren() as $name => $data) {
    echo "The $name is '$data' from the class " . get_class($data) . "\n";
    }
}
?>

L'exemple ci-dessus va afficher :

The title is 'PHP Basics' from the class SimpleXMLIterator
The author is 'Jim Smith' from the class SimpleXMLIterator

User Contributed Notes

There are no user contributed notes for this page.


Indique si l'entrée courante de SimpleXML est un objet

  • « SimpleXMLIterator::getChildren
  • SimpleXMLIterator::key »
  • PHP Manual
  • SimpleXMLIterator
  • Indique si l'entrée courante de SimpleXML est un objet

SimpleXMLIterator::hasChildren

(PHP 5, PHP 7, PHP 8)

SimpleXMLIterator::hasChildren — Indique si l'entrée courante de SimpleXML est un objet

Description

public SimpleXMLIterator::hasChildren ( ) : bool

Cette méthode vérifie si l'objet courant SimpleXMLIterator a des sous-éléments.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

true si l'entrée courante a des sous-éléments, false sinon.

Exemples

Exemple #1 Vérifie si un élément a des sous-éléments

<?php
$xml = <<<XML
<books>
    <book>
        <title>PHP Basics</title>
        <author>Jim Smith</author>
    </book>
    <book>XML basics</book>
</books>
XML;

$xmlIterator = new SimpleXMLIterator( $xml );
for( $xmlIterator->rewind(); $xmlIterator->valid(); $xmlIterator->next() ) {
    if($xmlIterator->hasChildren()) {
        var_dump($xmlIterator->current());
    }
}
?>

L'exemple ci-dessus va afficher :

object(SimpleXMLIterator)#2 (2) {
  ["title"]=>
  string(10) "PHP Basics"
  ["author"]=>
  string(9) "Jim Smith"
}

User Contributed Notes

grummfy at gmail dot com 12-Feb-2010 01:01
Hello,

just a note for people like me who encounter the problems :

<?php
foreach($xmlIterator as $x)
{
    if($x->hasChildren())
    {
        //never reach
        echo 'x : ';
        var_dump($x->current());
    }
    if($xmlIterator->hasChildren())
    {
        echo 'iterator : ';
        var_dump($x->current()); //all time null
        var_dump($xmlIterator->current());
    }
}
?>


Retourne la clé courante

  • « SimpleXMLIterator::hasChildren
  • SimpleXMLIterator::next »
  • PHP Manual
  • SimpleXMLIterator
  • Retourne la clé courante

SimpleXMLIterator::key

(PHP 5, PHP 7, PHP 8)

SimpleXMLIterator::key — Retourne la clé courante

Description

public SimpleXMLIterator::key ( ) : mixed

Cette méthode lit le nom de la balise XML courante.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le nom de la balise XML dans l'objet courant de l'itéraeur SimpleXMLIterator, ou false.

Exemples

Exemple #1 Le nom de la balise XML courante

<?php
$xmlIterator = new SimpleXMLIterator('<books><book>PHP basics</book><book>XML basics</book></books>');

echo var_dump($xmlIterator->key());
$xmlIterator->rewind(); // retour au premier élément
echo var_dump($xmlIterator->key());

?>

L'exemple ci-dessus va afficher :

bool(false)
string(4) "book"

User Contributed Notes

bmafzallmahmud at gmail dot com 01-Dec-2017 09:04
<?php
$note=<<<XML
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
XML;

$xmlIterator = new SimpleXMLIterator($note);
for( $xmlIterator->rewind(); $xmlIterator->valid(); $xmlIterator->next() ) {
      echo "<pre>";
     echo var_dump($xmlIterator->key());

}
?>
out put :
string(2) "to"
string(4) "from"
string(7) "heading"
string(4) "body"


Se déplace sur l'entrée SimpleXML suivante

  • « SimpleXMLIterator::key
  • SimpleXMLIterator::rewind »
  • PHP Manual
  • SimpleXMLIterator
  • Se déplace sur l'entrée SimpleXML suivante

SimpleXMLIterator::next

(PHP 5, PHP 7, PHP 8)

SimpleXMLIterator::next — Se déplace sur l'entrée SimpleXML suivante

Description

public SimpleXMLIterator::next ( ) : void

Cette méthode déplace l'itérateur SimpleXMLIterator à l'élément suivant.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Passe au prochain élément

<?php
$xmlIterator = new SimpleXMLIterator('<books><book>PHP Basics</book><book>XML basics</book></books>');
$xmlIterator->rewind(); // Retour au premier élément
$xmlIterator->next();

var_dump($xmlIterator->current());
?>

L'exemple ci-dessus va afficher :

object(SimpleXMLIterator)#2 (1) {
  [0]=>
  string(10) "XML basics"
}

User Contributed Notes

bmafzallmahmud at gmail dot com 01-Dec-2017 09:39
<?php
$note=<<<XML
<note>
<to>Afzall</to>
<from>Sumon</from>
<heading>Reminder</heading>
<body>Don't forget go to kishorgong</body>
</note>
XML;

$xmlIterator = new SimpleXMLIterator($note);
$xmlIterator->rewind();
var_dump($xmlIterator->current());
$xmlIterator->next();
var_dump($xmlIterator->current());
$xmlIterator->next();
var_dump($xmlIterator->current());
?>
out put :
object(SimpleXMLIterator)#2 (1) {
  [0]=>
  string(6) "Afzall"
}
object(SimpleXMLIterator)#2 (1) {
  [0]=>
  string(5) "Sumon"
}
object(SimpleXMLIterator)#2 (1) {
  [0]=>
  string(8) "Reminder"
}


Replace le pointeur SimpleXML au début

  • « SimpleXMLIterator::next
  • SimpleXMLIterator::valid »
  • PHP Manual
  • SimpleXMLIterator
  • Replace le pointeur SimpleXML au début

SimpleXMLIterator::rewind

(PHP 5, PHP 7, PHP 8)

SimpleXMLIterator::rewind — Replace le pointeur SimpleXML au début

Description

public SimpleXMLIterator::rewind ( ) : void

Cette méthode remet l'itérateur SimpleXMLIterator au premier élément.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Retour au premier élément

<?php
$xmlIterator = new SimpleXMLIterator('<books><book>PHP Basics</book><book>XML Basics</book></books>');
$xmlIterator->rewind();

var_dump($xmlIterator->current());
?>

L'exemple ci-dessus va afficher :

object(SimpleXMLIterator)#2 (1) {
  [0]=>
  string(10) "PHP Basics"
}

User Contributed Notes

There are no user contributed notes for this page.


Vérifie si une ressource SimpleXML contient d'autres entrées

  • « SimpleXMLIterator::rewind
  • Fonctions SimpleXML »
  • PHP Manual
  • SimpleXMLIterator
  • Vérifie si une ressource SimpleXML contient d'autres entrées

SimpleXMLIterator::valid

(PHP 5, PHP 7, PHP 8)

SimpleXMLIterator::valid — Vérifie si une ressource SimpleXML contient d'autres entrées

Description

public SimpleXMLIterator::valid ( ) : bool

Cette méthode vérifie si l'élément courant est valide, après un appel à SimpleXMLIterator::rewind() ou SimpleXMLIterator::next().

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne true si l'élément courant est valide, false sinon.

Exemples

Exemple #1 Vérifie si un élément est valide

<?php
$xmlIterator = new SimpleXMLIterator('<books><book>SQL Basics</book></books>');

$xmlIterator->rewind(); // Retour au premier élément
echo var_dump($xmlIterator->valid()); // bool(true)

$xmlIterator->next(); // advance to the next element
echo var_dump($xmlIterator->valid()); // bool(false) car il y a un seul élément
?>

User Contributed Notes

There are no user contributed notes for this page.


Fonctions SimpleXML

Sommaire

  • simplexml_import_dom — Construit un objet SimpleXMLElement à partir d'un objet DOM
  • simplexml_load_file — Convertit un fichier XML en objet
  • simplexml_load_string — Convertit une chaîne XML en objet

User Contributed Notes

Pyetro Costa [pyetrosafe at gmail dot com] 07-Dec-2018 08:48
After viewing the xml2array function of "http://www.php.net/manual/en/ref.simplexml.php#103617" and the "http://php.net/manual/en/ref.simplexml.php # 112038 "and still have made a change to convert empty tags to null ... I felt the need to work with the result as an object, keeping arrays like arrays. Arriving at this function:
<?php

    private function xml2Object($xmlObject, $out = null) {
        $out = (is_object($xmlObject) ? new \stdClass : array());
        foreach ((array) $xmlObject as $index => $node )
            if (is_array($out)) {
                $out[$index] = (is_object($node) || is_array($node)) ? (($node instanceof \SimpleXMLElement) && count((array) $node)==0 ? null : $this->xml2Object($node)) : $node;
            } else
                $out->{$index} = (is_object($node) || is_array($node)) ? (($node instanceof \SimpleXMLElement) && count((array) $node)==0 ? null : $this->xml2Object($node)) : $node;
        return $out;
    }
?>

And the results of function can be seen below:
<?php
    $xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" standalone="no"?><results><l1_elm1><l2_elm1>Some Text</l2_elm1><l2_elm2/></l1_elm1><l1_elm2><l2_elm1><l3_elm1>Array Index[0] - First property</l3_elm1><l3_elm2>Array Index[0] - Second property</l3_elm2><l3_elm3>Array Index[0] - Third property</l3_elm3></l2_elm1><l2_elm1><l3_elm1>Array Index[1] - First property</l3_elm1><l3_elm2>Array Index[1] - Second property</l3_elm2><l3_elm3>Array Index[1] - Third property</l3_elm3></l2_elm1></l1_elm2><l1_elm3/></results>');

    var_dump( $this->xml2Object($xml) );

    // var_dump xml2Object results
    object(stdClass)#339 (3) {
      ["l1_elm1"]=>object(stdClass)#344 (2) {
        ["l2_elm1"]=>string(9) "Some Text"
        ["l2_elm2"]=>NULL
      }
      ["l1_elm2"]=>object(stdClass)#347 (1) {
        ["l2_elm1"]=>array(2) {
          [0]=>object(stdClass)#348 (3) {
            ["l3_elm1"]=>string(31) "Array Index[0] - First property"
            ["l3_elm2"]=>string(32) "Array Index[0] - Second property"
            ["l3_elm3"]=>string(31) "Array Index[0] - Third property"
          }
          [1]=>object(stdClass)#349 (3) {
            ["l3_elm1"]=>string(31) "Array Index[1] - First property"
            ["l3_elm2"]=>string(32) "Array Index[1] - Second property"
            ["l3_elm3"]=>string(31) "Array Index[1] - Third property"
          }
        }
      }
      ["l1_elm3"]=>NULL
    }

    // VarDump Symphony xml2Object results something like
    object (#345) {
      +"l1_elm1": object (#339) {
        +"l2_elm1": "Some Text"
        +"l2_elm2": null
      }
      +"l1_elm2": object (#347) {
        +"l2_elm1": array(2) {
          [0] => object (#348) {
            +"l3_elm1": "Array Index[0] - First property"
            +"l3_elm2": "Array Index[0] - Second property"
            +"l3_elm3": "Array Index[0] - Third property"
          }
          [1] => object (#349) {
            +"l3_elm1": "Array Index[1] - First property"
            +"l3_elm2": "Array Index[1] - Second property"
            +"l3_elm3": "Array Index[1] - Third property"
          }
        ]
      }
      +"l1_elm3": null
    }
?>
Pyetro Costa [pyetrosafe at gmail dot com] 07-Dec-2018 02:55
This is just a new adjustment to the http://php.net/manual/en/ref.simplexml.php#112038 's function.

Adding the check by is_array has increased the conversion to lower levels by at least 3 levels, however empty Tags are converted to SimpleXMLElement class objects, adding a type and size check, convert these empty Tags to null.

See example:
<?php
    // The http://php.net/manual/en/ref.simplexml.php#112038 's function
    function xml2array($xmlObject, $out = array ()) {
        foreach ((array) $xmlObject as $index => $node )
            $out[$index] = (is_object($node) || is_array($node)) ? xml2array($node) : $node;
        return $out;
    }

    $xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" standalone="no"?><results><level1><l1_elm1><level2><l2_elm1>Some Text</l2_elm1><l2_elm2/></level2></l1_elm1><l1_elm2>Other String</l1_elm2><l1_elm3/></level1></results>');
    $XML2Array = xml2array($xml);
    var_dump($xml);
    var_dump($XML2Array);

    // The result is like bellow
    // simplexml_load_string results
    object(SimpleXMLElement)#227 (1) {
      ["level1"]=>object(SimpleXMLElement)#226 (3) {
        ["l1_elm1"]=>object(SimpleXMLElement)#236 (1) {
          ["level2"]=>object(SimpleXMLElement)#238 (2) {
            ["l2_elm1"]=>string(9) "Some Text"
            ["l2_elm2"]=>object(SimpleXMLElement)#239 (0) {}
          }
        }
        ["l1_elm2"]=>string(12) "Other String"
        ["l1_elm3"]=>object(SimpleXMLElement)#237 (0) {}
      }
    }

    // xml2array function results
    array(1) {
      ["level1"]=>array(3) {
        ["l1_elm1"]=>array(1) {
          ["level2"]=>array(2) {
            ["l2_elm1"]=>string(9) "Some Text"
            ["l2_elm2"]=>array(0) {}
          }
        }
        ["l1_elm2"]=>string(12) "Other String"
        ["l1_elm3"]=>array(0) {}
      }
    }
?>

Now, check node type and size, if node instanceof SimpleXMLElement and count == 0, set null to value (or empty string "" as you prefer);
<?php
    function xml2array($xmlObject, $out = array ()) {
        foreach ((array) $xmlObject as $index => $node )
            $out[$index] = (is_object($node) || is_array($node)) ? (($node instanceof \SimpleXMLElement) && count((array) $node)==0 ? null : xml2array($node)) : $node;
        return $out;
    }

    $xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" standalone="no"?><results><level1><l1_elm1><level2><l2_elm1>Some Text</l2_elm1><l2_elm2/></level2></l1_elm1><l1_elm2>Other String</l1_elm2><l1_elm3/></level1></results>');
    var_dump(xml2array($xml));

    // And now the result is like bellow
    array(1) {
      ["level1"]=>array(3) {
        ["l1_elm1"]=>array(1) {
          ["level2"]=>array(2) {
            ["l2_elm1"]=>string(9) "Some Text"
            ["l2_elm2"]=>NULL
          }
        }
        ["l1_elm2"]=>string(12) "Other String"
        ["l1_elm3"]=>NULL
      }
    }
?>
brandonkirsch at gmail dot com 09-Sep-2013 07:41
Contrary to other notes posted here, SimpleXML *DOES NOT* properly handle non-UTF8 encoded XML documents.

A proper "iso-8859-1" declared and encoded XML document will not parse with SimpleXML for PHP 5.2.17 or 5.5.1 when using extended characters (that is, byte values greater than 127)

DOMDocument, on the other hand, will correctly parse incoming iso-8859-1 XML documents and can also be used to perform character translation to UTF8:

$dom = new DOMDocument();

if($dom->loadXML($fileContents)){ // $fileContents is an XML document with iso-8859-1 encoding specified in the declaration
            $dom->encoding = 'utf-8'; // convert document encoding to UTF8
            return $dom->saveXML(); // return valid, utf8-encoded XML
William Fahria 15-Jul-2013 07:34
A simple implementation:
You can inform a direct XML in text format to the function.

function eoXML2Array($xmlContent, $out = array()){
    $xmlObject = is_object($xmlContent) ? $xmlContent : simplexml_load_string($xmlContent);
    foreach((array) $xmlObject as $index => $node)
        $out[$index] = ( is_object($node) || is_array($node) ) ? eoXML2Array( $node ) : $node;
    return $out;
}

Usage: $your_array = eoXML2Array(your xml text);
r dot m dot 0100101 at gmail dot com 25-Apr-2013 03:00
This is a slight adjustment to http://www.php.net/manual/en/ref.simplexml.php#103617 's function.
The function given by them would convert a simpleXML to an array but only at the highest level. Once you add the is_array check with the is_object it should convert each level to an array (well it did for me through 3 levels).

function simpleXmlObjectToArray ( $xmlObject, $out = array () )
{
    foreach ( (array) $xmlObject as $index => $node )
        $out[$index] = ( is_object ( $node ) || is_array($node) )
        ? simpleXmlObjectToArray ( $node )
        : $node;

    return $out;
}
Happy Coding!
Eric 29-Jan-2013 03:00
If the SimpleXMLObject contains an array, adding is_array() allows the function to keep digging for Objects.

<?php
function xml2array ( $xmlObject, $out = array () )
{
        foreach ( (array) $xmlObject as $index => $node )
            $out[$index] = ( is_object ( $node ) ||  is_array ( $node ) ) ? xml2array ( $node ) : $node;

        return $out;
}
?>
thomas at guenneguez dot com 14-Dec-2011 02:36
Merge two xml only with SimpleXML :
Function corrected if note containe only value.

<?php
function mergeXML(&$base, $add)
{
    if ( $add->count() != 0 )
        $new = $base->addChild($add->getName());
    else
        $new = $base->addChild($add->getName(), $add);
    foreach ($add->attributes() as $a => $b)
    {
        $new->addAttribute($a, $b);
    }
    if ( $add->count() != 0 )
    {
        foreach ($add->children() as $child)
        {
            mergeXML($new, $child);
        }
    }
}
?>

Use : <?php mergeXML($xmlElement, simplexml_load_string($toMerge)) ?>
julien dot breiner at laposte dot net 09-Dec-2011 10:31
Merge two xml only with SimpleXML :

<?php
private function mergeXML(&$base, $add)
{
    $new = $base->addChild($add->getName());
    foreach ($add->attributes() as $a => $b) {
        $new[$a] = $b;
    }
    foreach ($add->children() as $child) {
        $this->mergeXML($new, $child);
    }
}?>

Use : <?php mergeXML($xmlElement, simplexml_load_string($toMerge)) ?>
k dot antczak at livedata dot pl 22-Apr-2011 01:08
A quick snippet which converts XML Object into array:

<?php
function xml2array ( $xmlObject, $out = array () )
{
        foreach ( (array) $xmlObject as $index => $node )
            $out[$index] = ( is_object ( $node ) ) ? xml2array ( $node ) : $node;

        return $out;
}
?>

Have fun! ;-)
help :-) @ theapotek :-) com 08-Apr-2011 12:54
If you are having trouble accessing CDATA in your simplexml document, you don't need to str_replace/preg_replace the CDATA out before loading it with simplexml.

You can do this instead, and all your CDATA contents will be merged into the element contents as strings.

$xml = simplexml_load_file($xmlfile,
'SimpleXMLElement', LIBXML_NOCDATA);
Andrez zenarter at hotmail dot com 16-Jul-2009 10:56
I just wanna add an additional to
"Append/combine/merge one simplexml to another"
The parent should has attributes too.

<?php

function append_simplexml(&$simplexml_to, &$simplexml_from)
{

static $firstLoop=true;

//Here adding attributes to parent
if( $firstLoop )
            {
                foreach( $simplexml_from->attributes() as $attr_key => $attr_value )
                {
                    $simplexml_to->addAttribute($attr_key, $attr_value);
                }
            }

foreach ($simplexml_from->children() as $simplexml_child)
    {
        $simplexml_temp = $simplexml_to->addChild($simplexml_child->getName(), (string) $simplexml_child);
        foreach ($simplexml_child->attributes() as $attr_key => $attr_value)
        {
            $simplexml_temp->addAttribute($attr_key, $attr_value);
        }

       $firstLoop=false;

        append_simplexml($simplexml_temp, $simplexml_child);
    }

unset( $firstLoop=false );
}

?>

I have aproblem to assign an object into a variable used as an object later, Then i found the code above, it solve half of my problem. I have it should have the parent name assign too but it didnt. Any better code?
Douglas Marsh 06-Jul-2009 08:53
SimpleXML is really nice for loading/converting XML data into native PHP data structures. I was considering crude searching of SVG for the width/height and since it really is an XML file... I found a SUPER easy method for parsing out the information I wanted:

<?php
// putting incomplete SVG data inline for readability
$RawXML = <<< XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://www.example.com/dc"
   xmlns:cc="http://www.example.com/cc"
   xmlns:rdf="http://www.example.com/rdf"
   xmlns:svg="http://www.example.com/svg"
   xmlns="http://www.example.com/"
   xmlns:sodipodi="http://www.example.com/sodipodi"
   xmlns:inkscape="http://www.example.com/inkscape"
   id="svg2"
   sodipodi:version="0.32"
   inkscape:version="0.46"
   width="586.25"
   height="743.75"
   xml:space="preserve"
   sodipodi:docname="some_svg_file.svg"
   inkscape:output_extension="org.inkscape.output.svg.inkscape">
 <!-- portions removed to keep this short -->
</svg>
XML;

$svg = new SimpleXMLElement($RawXML);

$height = $svg['height'];
$width = $svg['width'];

echo "The width x height is: ${width} x ${height} \n";

?>
info at ajaxforum dot ru 17-Jun-2009 12:32
Append/combine/merge one simplexml to another:

<?php
include 'example.php';
$el1 = new SimpleXMLElement($xmlstr);
$el2 = new SimpleXMLElement($xmlstr);

// wrong way!
// php convert $el2->movie[0] to string silently
$el1->addChild('movie', $el2->movie[0]);

// wrong way!
// php 5.1 convert $el2->movie[0] to string and generate Warning: It is not yet possible to assign complex types to properties. It is not possible to assign complex types to nodes
// php 5.2 convert $el2->movie[0] to string silently
$el1->addChild('movie');
$el1->movie[2] = $el2->movie[0];

// right way!
$el1_movie = $el1->addChild('movie');
append_simplexml($el1_movie, $el2->movie[0]);

echo "<pre>"; print_r($el1); echo "</pre>";

/**
 * Add one simplexml to another
 *
 * @param object $simplexml_to
 * @param object $simplexml_from
 * @author Boris Korobkov
 * @link http://www.ajaxforum.ru/
 */
function append_simplexml(&$simplexml_to, &$simplexml_from)
{
    foreach ($simplexml_from->children() as $simplexml_child)
    {
        $simplexml_temp = $simplexml_to->addChild($simplexml_child->getName(), (string) $simplexml_child);
        foreach ($simplexml_child->attributes() as $attr_key => $attr_value)
        {
            $simplexml_temp->addAttribute($attr_key, $attr_value);
        }

        append_simplexml($simplexml_temp, $simplexml_child);
    }
}
?>
codejunky32 at NOSPAM dot com 22-May-2009 08:45
Just wanted to add a post as to how you can extract the value from a SimpleXMLElement. Its not as straightforward as you think. Because its a complex object you can't just access the element directly. Here is a sample of data that represents a var_dump of a SimpleXmlElement

array(1) {
  [0]=>
  object(SimpleXMLElement)#13 (2) {
    ["@attributes"]=>
    array(1) {
      ["name"]=>
      string(5) "title"
    }
    [0]=>
    string(19) "PHP Tech Book"
  }
}

If you want to extract the title of the book you have to cast the specified element to a string like so.
$newTitle = (string) $title[0];

The $title variable is the SimpleXMLElement that you have extracted from the xml document using simplexml_load_string for instance.  To initially access the title element from the xml document you can do like so, using xpath.
$title = $doc->xpath('str[@name="title"]');

Hope this helps someone out there.
james dot ellis at gmail dot com 28-Aug-2008 06:55
While SimpleXML is a powerful tool, developers using it to process and handle large XML documents & strings should take into careful consideration its memory usage requirements.
SimpleXML requires the entire XML tree to be available prior to any processing actions on that tree -- this requires the entire tree to be in memory. Ok for a 40kb XML file but when dealing with > 100MB files you will see performance degradation, especially if you have a busy server.

An alternative to processing large XML files is the XMLReader class, which operates in streaming mode, of which an excellent tutorial is presented here:
http://www.ibm.com/developerworks/library/x-pullparsingphp.html

XML is an incredibly verbose format. If you are dealing with large data structures, especially in web services, do you you actually need to represent the data as an XML tree? - other serialisation formats such as JSON, Serialised PHP, Google Protocol Buffers (http://code.google.com/p/protobuf/) and even CSV can remarkably reduce processing time, bandwidth and load  when dealing with large files. A 110MB XML file can become a 65MB CSV file, with the same data in it, simply because the data identifiers (tags) are only represented once in the entire document.
m0sh3 at hotmail dot com 22-May-2008 03:24
Be aware of quirks like this one:

<?php

$a = new SimpleXMLElement('<a><b/></a>');

$a->b = 'test &amp; test';
$a->c = 'test &amp; test';

print_r($a);
/*
OUTPUT:

SimpleXMLElement Object
(
    [b] => test & test
    [c] => test &amp; test
)
*/
nathan at gimpstraw dot com 05-Apr-2008 09:43
I'm using SimpleXML to process data sent back from an API request, and I ran into the CDATA problem and the error you get from html entities, and here is a solution i came up with, don't know if it's the most practical, but it's working.

<?php
$str = <<< XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<menu>
    <item>
        <title><![CDATA[Caf&eacute;]]></title>
        <description><![CDATA[Some description.]]></description>
    </item>
</menu>
XML;

$str = preg_replace("/\<\!\[CDATA\[(.*?)\]\]\>/ies", "'[CDATA]'.base64_encode('$1').'[/CDATA]'", $str);
$xml = new SimpleXMLElement($str);

// Return item title's
foreach ($xml->item as $item) {
    $tmp = (string) $item->title;
    $tmp = preg_replace("/\[CDATA\](.*?)\[\/CDATA\]/ies", "base64_decode('$1')", $tmp);
    echo $tmp;
}
?>
ngkongs at gmail dot com 19-Mar-2008 10:44
fix the function i posted before, have a wrong quote placement

function implode2($glue="", $var){
    if ($var){
        foreach ($var as $value){
            $array[]=strval($value);
        }
        return implode($glue, $array);
    }
    else return false;
}
philippe_marc_--a---t--_novartis_com 12-Feb-2008 09:46
TIP: if you run into memory issue using simpleXML.
You may want to use PHP>5.2.5 in order to avoid that: http://bugs.php.net/bug.php?id=38604
If not possible, avoid "foreach ( $xmldata->node as $node )" like calls.
andrvm 02-Jan-2008 03:01
<?php
/**
    * Remove node/nodes xml with xpath
    *
    * @param SimpleXMLElement                 $xml
    * @param string XPath                     $path
    * @param string ('one'|'child'|'all')     $multi
    *
    * Use:
    *
    * Example xml file - http://ru2.php.net/manual/ru/ref.simplexml.php
    *
    * $xml = simplexml_load_file($xmlfile);
    *
    * //1. remove only 1 node (without child nodes)
    * //   $path must return only 1 (unique) node without child nodes
    * removeNode($xml, '//movie/rating[@type="thumbs"]');
    *
    * //2. remove 1 node (with 1 child nodes)
    * //    $path can return any nodes - will be removed only first node
    * //   with all child nodes
    * removeNode($xml, '//characters', 'child')
    *
    * //3. remove all nodes (with child nodes)
    * //   $path can return any nodes - will be removed all
    * //   with child nodes
    * removeNode($xml, '//rating', 'all')
    *
    * $xml->asXML($xmlfile);
    *
    */
   function removeNode($xml, $path, $multi='one')
   {
       $result = $xml->xpath($path);

          # for wrong $path
          if (!isset($result[0])) return false;

          switch ($multi) {
              case 'all':
                    $errlevel = error_reporting(E_ALL & ~E_WARNING);
                    foreach ($result as $r) unset ($r[0]);
                    error_reporting($errlevel);
                    return true;

                case 'child':
                   unset($result[0][0]);
                   return true;

                case 'one':
                   if (count($result[0]->children())==0 && count($result)==1) {
                       unset($result[0][0]);
                       return true;
                   }

                default:
                      return false;
          }
 }
?>

p.s. after use (if deleted all nodes):
<?php

   function trimXml($xmlfile)
   {
       $dom = new DOMDocument();

          $dom->preserveWhiteSpace = false;

         if (!$dom->load($xmlfile)) return false;

         $dom->formatOutput = true;

         if (!$dom->save($xmlfile)) return false;

         return true;
   }
?>
onPHP5.com 17-Nov-2007 04:37
It does not say in the docs, but SimpleXML will convert all text into UTF-8, if the source XML declaration has another encoding. Eg, if the source has the following XML decl:

<?xml version="1.0" encoding="windows-1251" ?>

all the text in the resulting SimpleXMLElement will be in UTF-8 automatically.
lordi at msdi dot ca 23-Oct-2007 05:35
If you need to do math calculations on values extracted from simplexml document, you might need to cast the value as float to prevent precision loss. Here is an example:

<?php
    $objXML = new SimpleXMLElement('<test x="-123.45"></test>');

    //Shows correctly
    echo $objXML['x']."\n";

    //We loose the decimals
    echo $objXML['x'] + $objXML['x']."\n";

    $x = $objXML['x'];

    //This works if we cast the amounts
    echo (float)$objXML['x'] + (float)$objXML['x']."\n";

    //Calculated on a string, no problem
    echo "-123.45" + "-123.45";

?>

This is due to the fact that $objXML['x'] is not a string (php would cast it automatically) neither a float, but a SimpleXMLElement object.

"echo var_dump($x);" will output this
~~
object(SimpleXMLElement)#3 (1) {
  [0]=>
  string(7) "-123.45"
}
~~

I opened a bug request on php but here is the answer they gave me:

~~
Status: Won't fix

The behavior is defined by the engine not the extension. When performing mathematical operations on objects, they are treated as integers. It is up to the user to cast the object to the appropriate type to maintain proper precision.
~~
cmsa at gmx dot de 27-Aug-2007 05:07
I had a problem with entities.

My first solution:
I saved Data that way:
$ENTRY_->
addchild('Nachricht',htmlentities($_POST["blog"]));

Had Entities in the XML-File like:
<!ENTITY auml "&amp;auml">

And I loaded the Data that way:
html_entity_decode($ENTRY->Nachname);

But after saving and
loading the xml-file the entity-entry
<!ENTITY auml "&amp;auml">
disappeared. strange...

My second solution:
With saving the Data this way:
$ENTRY_->
addchild('Nachricht',htmlentities(htmlentities($_POST["blog"])));

I can now load it with html_entity_decode without the
 entity-entry in the XML-file!
I tested it with äöü.

Hope it helpes.
karsten dot bruch at bms-verlage dot de 16-Aug-2007 08:28
When creating a new XML document and adding text with umlauts and such

<?php $SimpleXMLElement->asXML(); ?>

will silently NOT output any content with umlauts.

Use htmlentities () while adding Umlauts & co to solve the "problem"
anthony dot parsons at manx dot net 03-Aug-2007 07:40
If you're handling lots of HTML or mixed-content XML you'll probably want to use the DOM functions instead of SimpleXML. Take this for example:
<?php
$html = new SimpleXMLElement('<div><p>Some text, <a href="#">a link,</a> more text</p></div>');

echo $html->p->a,"<br>\n"; // "a link,"
echo $html->p;             // "Some text, more text" (!)
?>
In the above example reconstructing the original markup is impossible because of the way SimpleXML represents the data.
php at werner dash ott dot de 28-Mar-2007 06:03
Concerning SimpleXML and sessions:

When creating a SimpleXML object (to be precise: a SimpleXMLElement object) in the context of a session and storing it in $_SESSION['XMLobject'], this object does not "survive" the session!

By the time re-entering the session, print_r($_SESSION['XMLobject']) says:

['XMLobject'] => SimpleXMLElement Object
Warning:  Node no longer exists in /your_php_file.php on line xyz
   (
   )

(Message simplified for the sake of better readability.)
codje2 at lboro dot ac dot uk 11-Mar-2007 01:46
Sometimes it's nice to mix up data storage types. This is a very simple SQL to XML converter. Feed it a SQL query and it outputs the result in XML.

The first paramater should be a mysql_query result
(optional)The second is the xml name for each row (i.e the second depth of XML)
(optional)The third is the name of the XML document, the root name

<?php
$result=mysql_query("SELECT * FROM users");
sql_to_xml($result,"users","members");

function sql_to_xml($mysql_result,$row_name="row",$doc_name="root")
{

    $xml= new SimpleXMLElement("<$doc_name></$doc_name>");
    while($line=mysql_fetch_assoc($mysql_result))
    {
        $row=$xml->addChild($row_name);
        foreach($line as $column => $value)
        {
            $row->$column="$value";
        }
    }
    return $xml->asXML();
}

?>
php at NOSPAM dot coutch dot com 21-Feb-2007 02:04
Memory leak when setting attributes as in example (#Example 2134. Setting values)

This probably goes unnoticed in web scripts (unless you do a LOT of xml manipulations), but I ran into this in my standalone script that processes a large number of XML files.

The following code will eat up memory quite fast:

<?php
include 'example.php';

while (true) {
  $xml = new SimpleXMLElement($xmlstr);
  $xml->movie[0]->characters->character[0]->name = 'Miss Coder';
}
?>

while this seems to behave correctly:

<?php
include 'example.php';

while (true) {
  $xml = new SimpleXMLElement($xmlstr);
  $c = $xml->xpath("//character");
  $c[0]->name = 'Miss Coder';
}
?>

This looks like bug #38604, and I just confirmed that in 6.0.0-dev (on Windows at least) it is fixed.  It is NOT fixed in 5.2.1 or  5.2.2-dev (2/21 build), so for 5.2 users, use the second form to avoid leaks.
joel [from the website] purerave.com 19-Feb-2007 05:57
It doesn't mention this anywhere, but creationg a new SimpleXMLElement object from a non-valid string throws an exception. It looks ugly in the php log as it dumps the stack in multiple lines.

The correct way to create a new SimpleXMLElement object is like so:
<?php
$xmlstr = ''; // empty to throw an exception
try {
   $xml = new SimpleXMLElement($xmlstr);
} catch (Exception $e) {
   // handle the error
   echo '$xmlstr is not a valid xml string';
}
?>
matt at mattbostock dot com 05-Nov-2006 11:40
Be careful when using var_export to debug element attributes - it won't work! Always use print() or similar for checking the contents of element attributes.
Arnaud Bienvenu 19-Oct-2006 07:35
As of PHP 5.1.4, trying to iterate on a non-existent node will actually create that node.

<?
$xml = simplexml_load_string('<root></root>');
foreach($xml->b as $dummy);
echo $xml->asXML();
?>

Gives :

<?xml version="1.0"?>
<root><b/></root>

You might think it is a bug, but PHP developers seam to consider it as a feature : http://bugs.php.net/bug.php?id=39164
Jason Sheets <jsheets at shadonet dot com> 31-May-2006 10:31
Here is my Simple XML to array function, it is recursive and has the benefit of maintaining key value relationships and has worked well for me.

<?php
function XMLToArray($xml)
{
  if ($xml instanceof SimpleXMLElement) {
    $children = $xml->children();
    $return = null;
  }

  foreach ($children as $element => $value) {
    if ($value instanceof SimpleXMLElement) {
      $values = (array)$value->children();

      if (count($values) > 0) {
        $return[$element] = XMLToArray($value);
      } else {
        if (!isset($return[$element])) {
          $return[$element] = (string)$value;
        } else {
          if (!is_array($return[$element])) {
            $return[$element] = array($return[$element], (string)$value);
          } else {
            $return[$element][] = (string)$value;
          }
        }
      }
    }
  }

  if (is_array($return)) {
    return $return;
  } else {
    return $false;
  }
}
?>
daniel dot oconnor at gmail dot com 17-May-2006 06:21
SimpleXML handles namespaces, but it's not documented very well here at all.

If you wanted to parse, say, an open office manifest file or a piece of RDF/XML, you have to get elements and attributes by the namespace url.

Example:
<?php
function display($in) {
    if (file_exists($in)) {
        $xml = simplexml_load_file($in);
    } else {
        throw new Exception($in . " does not exist");
    }

    $manifest = $xml->children('http://openoffice.org/2001/manifest');

    foreach ($manifest->xpath('//manifest:file-entry') as $file) {
        foreach ($file->attributes('http://openoffice.org/2001/manifest') as $key => $value) {
            print "Key:" . $key . "\n";
            print "Value:" . $value . "\n";
        }
    }

}
?>

File: manifest.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
 <manifest:file-entry manifest:media-type="application/vnd.sun.xml.writer" manifest:full-path="/"/>
 <manifest:file-entry manifest:media-type="application/vnd.sun.xml.ui.configuration" manifest:full-path="Configurations2/"/>
 <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="layout-cache"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="content.xml"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="styles.xml"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="meta.xml"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Thumbnails/thumbnail.png"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Thumbnails/"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="settings.xml"/>
</manifest:manifest>
paul at preinheimer dot com 06-May-2005 05:11
Hi,

If you want to access an element that has a dash in its name, (as is common with the XML documents provided by the Library of Congress, as well as the NWS) you will need to handle it a little bit differently.

You can either use XPATH, which works fine, but will return an array of results every time, even if there is a single result.
eg.

<?php
$xml->xpath('/data/time-layout/start-valid-time');
?>

You can also choose just to encapsulate the element names containing a dash:
<?php $xml->data->{'time-layout'}->{'start-valid-time'} ?>

--

On a only partially related note, dealing with SimpleXML is one of the only times I have employed casting with PHP. While iterating (foreach) through the valid times, echo'ing the element worked great (it merely echo'ed the apropriate time), assigning it to another variable resulted in a SimpleXML object containing the time to be assigned, rather than just the time itself. This was resolved by casting the time to a string:

<?php
foreach($xml->data->{'time-layout'}->{'start-valid-time'} AS $time)
{
 $weatherDates[] = (string) $time;
}
?>
T CHASSAGNETTE t_chassagnette at yahoo dot fr 04-May-2005 01:57
Another method to parse an XML Document into a PHP array with SIMPLEXML inspired from Daniel FAIVRE !

<?php
function xml2php($xml)
{
    $fils = 0;
    $tab = false;
    $array = array();
    foreach($xml->children() as $key => $value)
    {
        $child = xml2php($value);

        //To deal with the attributes
        foreach($node->attributes() as $ak=>$av)
        {
            $child[$ak] = (string)$av;

        }

        //Let see if the new child is not in the array
        if($tab==false && in_array($key,array_keys($array)))
        {
            //If this element is already in the array we will create an indexed array
            $tmp = $array[$key];
            $array[$key] = NULL;
            $array[$key][] = $tmp;
            $array[$key][] = $child;
            $tab = true;
        }
        elseif($tab == true)
        {
            //Add an element in an existing array
            $array[$key][] = $child;
        }
        else
        {
            //Add a simple element
            $array[$key] = $child;
        }

        $fils++;
      }

    if($fils==0)
    {
        return (string)$xml;
    }

    return $array;

}
?>
nelson_menezes at yahoo dot co dot uk 01-Mar-2005 05:05
Note that SimpleXML expects to both read and output XML in UTF-8 encoding. You'll need to add a line such as this at the top of your input XML file if it isn't saved in UTF-8 (adjust to whatever encoding used):

<?xml version="1.0" encoding="ISO-8859-1" ?>

On the output side of things, if you're not serving/handling UTF-8, you'll need to use utf8_decode() [red. but that will only work for ISO-8859-1, not other encodings]. Common mistake: http://bugs.php.net/bug.php?id=28154
brcavanagh AT NO SPAM hotmail.com 02-Jan-2005 09:18
If you are looking to use SimpleXML for anything but reading XML documents, you should really reconsider, and use the XML DOM library.  By the time you get enough utilities implemented in DOM to handle all the set backs in SimpleXML, you will have defeated the purpose of using SimpleXML.  There are a few reasons for this, and there are already many workrounds, but the primairy issues are this

1) No complex node assignment.  You cannot switch nodes or replace them.

2) No appending new child nodes

3) Whenever you do something like $new_node = $xml_doc->node you will always get a reference even if you use a clone method, which will crash the script.

Other than that, its a great tool for reading docs.


Construit un objet SimpleXMLElement à partir d'un objet DOM

  • « Fonctions SimpleXML
  • simplexml_load_file »
  • PHP Manual
  • Fonctions SimpleXML
  • Construit un objet SimpleXMLElement à partir d'un objet DOM

simplexml_import_dom

(PHP 5, PHP 7, PHP 8)

simplexml_import_dom — Construit un objet SimpleXMLElement à partir d'un objet DOM

Description

simplexml_import_dom ( DOMNode $node , string $class_name = "SimpleXMLElement" ) : SimpleXMLElement|null

simplexml_import_dom() prend un nœud d'un document DOM et la transforme en nœud SimpleXML. Ce nouvel objet peut alors être utilisé comme un objet natif SimpleXML.

Liste de paramètres

node

Un élément DOM

class_name

Vous pouvez utiliser ce paramètre optionnel afin que simplexml_load_string() retourne un objet de la classe spécifiée. Cette classe doit étendre la classe SimpleXMLElement.

Valeurs de retour

Retourne un objet SimpleXMLElement ou null en cas d'échec.

Exemples

Exemple #1 Import DOM

<?php
$dom = new DOMDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!$dom) {
    echo 'Erreur durant l\'analyse du document';
    exit;
}

$s = simplexml_import_dom($dom);

echo $s->book[0]->title;
?>

L'exemple ci-dessus va afficher :

blah

Voir aussi

  • dom_import_simplexml() - Transforme un objet SimpleXMLElement en un objet DOMElement
  • Utilisation de base SimpleXML

User Contributed Notes

shirkaen at gmail dot com 10-Nov-2016 06:58
/*If tags in DOM have text and some part of this text is surrounded by other tag, simple_import_dom object doesn't contain position of child tag, so rendering it back to html/xml can be a problem. Printing such a node is also peculiar. Eg.*/

//////////////////////
$text = "<body><p>Some text before <em>italic </em>and after text.</p></body>";
$dom = new DOMDocument;
$dom->loadHTML($text);
$result = simplexml_import_dom($dom);
echo $result->p;

//////////////////////
//Prints :
//Some text before and after text.

print_r($result->p);
//Prints:
//SimpleXMLElement Object ( [em] => italic )

print_r($result->p->em)
//does more or less the same:
//SimpleXMLElement Object ( [0] => italic )

var_dump($result->p);
//Prints:
//object(SimpleXMLElement)#8 (1) { ["em"]=> string(7) "italic " }

var_dump($result->p->em)
//object(SimpleXMLElement)#9 (1) { [0]=> string(7) "italic " }

//but
echo $result->p->em;
//prints:
//italic
brandonkirsch at perceptionilluminates dot com 14-Aug-2013 03:38
simplexml_import_dom() will accept DOMNodes or other SimpleXMLElements.  This has a useful purpose if you are extending the SimpleXMLElement class and would prefer the xpath() method to return your class extension instead of basic SimpleXMLElements.  For example:

class MySimpleXML extends SimpleXMLElement{
    public function xpath($xpath){
        $return = array();
        $simpleXmls = parent::xpath($xpath); // run SimpleXMLElement xpath, returning an array of SimpleXMLElements
        foreach($simpleXmls as $xml){
            $return[] = simplexml_import_dom($xml,'MySimpleXML'); // copy SimpleXMLElement, returning as MySimpleXML instance
        }
        return $return;
    }
}

Now I can create an instance of MySimpleXML, run an xpath, and get my results back as an array of MySimpleXML elements instead of the native SimpleXMLElement:

$mySimpleXml = new mySimpleXml('<root><node/></root>');

$array = $mySimpleXml->xpath('/root/node'); // returns array with a single MySimpleXml object


Convertit un fichier XML en objet

  • « simplexml_import_dom
  • simplexml_load_string »
  • PHP Manual
  • Fonctions SimpleXML
  • Convertit un fichier XML en objet

simplexml_load_file

(PHP 5, PHP 7, PHP 8)

simplexml_load_file — Convertit un fichier XML en objet

Description

simplexml_load_file ( string $filename , string $class_name = "SimpleXMLElement" , int $options = 0 , string $ns = "" , bool $is_prefix = false ) : SimpleXMLElement|false

Convertit le document XML filename en un objet de type SimpleXMLElement.

Liste de paramètres

filename

Chemin vers le fichier XML

Note:

Libxml 2 supprime la protection des caractères des URI, alors si vous voulez passer par exemple b&c comme paramètre URI à a, vous devez appeler simplexml_load_file(rawurlencode('http://example.com/?a=' . urlencode('b&c'))). Depuis PHP 5.1.0, vous n'avez plus besoin de faire cela puisque PHP le fait pour vous.

class_name

Vous pouvez utiliser ce paramètre optionnel et ainsi, la fonction simplexml_load_file() retournera un objet de la classe spécifiée. Cette classe doit étendre la classe SimpleXMLElement.

options

Depuis PHP 5.1.0 et Libxml 2.6.0, vous pouvez aussi utiliser le paramètre options pour spécifier des paramètres additionnels Libxml.

ns

Préfixe ou l'URI de l'espace de noms.

is_prefix

true si ns est un préfixe, false si c'est l'URI ; par défaut, false.

Valeurs de retour

Retourne un objet de la classe SimpleXMLElement dont les propriétés contiennent les données du document XML, ou false si une erreur survient.

Avertissement

Cette fonction peut retourner false, mais elle peut aussi retourner une valeur équivalent à false. Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour exacte de cette fonction.

Erreurs / Exceptions

Produit un message d'erreur de niveau E_WARNING pour chaque erreur trouvée dans les données XML.

Astuce

Utilisez la fonction libxml_use_internal_errors() pour supprimer toutes les erreurs XML, et la fonction libxml_get_errors() pour les parcourir.

Historique

Version | Description
5.2.0 | Le paramètre optionel is_prefix a été ajouté.

Exemples

Exemple #1 Interprétation d'un document XML

<?php
// Le fichier test.xml contient un document XML avec un élément racine
// et au moins un élément /[racine]/title.

if (file_exists('test.xml')) {
    $xml = simplexml_load_file('test.xml');

    print_r($xml);
} else {
    exit('Echec lors de l\'ouverture du fichier test.xml.');
}
?>

Ce script affichera, en cas de succès :

SimpleXMLElement Object
(
  [title] => Example Title
  ...
)

À partir de là, vous pouvez utiliser $xml->title et tout autre élément.

Voir aussi

  • simplexml_load_string() - Convertit une chaîne XML en objet
  • SimpleXMLElement::__construct() - Crée un nouvel objet SimpleXMLElement
  • Traitement des erreurs XML
  • libxml_use_internal_errors() - Désactive le rapport d'erreur libxml et les stocke pour lecture ultérieure
  • Utilisation de base SimpleXML

User Contributed Notes

sirgrayjn at gmail dot com 22-Sep-2016 09:51
// Be carefull if you migrate or use local machine
// for test/development.

// Windows directory separators: "\" and "/"
// You may mix separators "C:\somedir\www/img/bg.jpg".

// Mixed separators path work fine in other functions
// But simplexml_load_file() failed with mixed separators.

// Examples:
include("C:\dir\my.php");    // work (windows)
include("C:\dir/my.php");    // work (windows) with mixed
include("C:/dir/my.php");    // work (windows, linux)
simplexml_load_file("C:\dir\my.php");    // work
simplexml_load_file("C:\dir/my.php");    // failed with mixed
simplexml_load_file("C:/dir/my.php");    // work
rex111 at bigmir dot net 08-Sep-2016 03:02
Get all tags and their values. (recursive)

<?php
$xml = simplexml_load_file('settings.xml');

function all_tag($xml){
    $i=0; $name = "";
    foreach ($xml as $k){
        $tag = $k->getName();
        $tag_value = $xml->$tag;
        if ($name == $tag){ $i++;    }
                $name = $tag;
            echo $tag .' '.$tag_value[$i].'<br />';
        // recursive
           all_tag($xml->$tag->children());
    }
}

all_tag($xml);
?>
Rich 24-Nov-2015 02:51
I stumbled on this: a single element with a simple string in it becomes a string, but a single element with a *space* in it becomes an Array, with one element, the string space.

I'm sure to XML mystics this is wise and wonderful but it really confused me,  and I thought it might confuse others.

<?php
$parsed = simplexml_load_string('<container><space> </space><blank></blank><string>hello</string></container>');
$content = json_decode(json_encode($parsed),TRUE);
var_dump($content);
/* Output is:
array(3) {
  'space' => array(1) {           ? did NOT expect this!
    [0] => string(1) " "
  }
  'blank' => array(0) { }
  'string' => string(5) "hello"
}
 */
tuxedobob 30-Jun-2015 01:25
Occasionally you may try to load a file and have it complain about an entity and throw a parser error.

If this is the case, check to make sure that the file in question does not contain an ampersand (&) without a corresponding entity reference.

If it does, or if you want to err on the side of caution, then instead of using simplexml_load_file, try this:

$file = file_get_contents('stuff.xml');
$temp = preg_replace('/&(?!(quot|amp|pos|lt|gt);)/', '&amp;', $file);
$xml = simplexml_load_string($temp) or die("xml not loading");

Read the file into a string, add 'amp;' after any '&' that is not part of a character entity, then parse the string as xml.
kannan at 99deals dot in 04-Sep-2012 06:27
If you have some nodes which are having special characters, it would not load properly

for an instance see the nodes below
<node:number>1538-7445</node:number>
<node:coverDisplayDate>Sep  1 2012 12:00:00:000AM</node:coverDisplayDate>

either you have to change the : to other special characters like '-' in order to convert it properly

Correct Node
<node-number>1538-7445</node-number>
<node-coverDisplayDate>Sep  1 2012 12:00:00:000AM</node-coverDisplayDate>

I have wasted my precious time while debugging this. Please aware about this. ?
ricardo at ricardomartins dot info 21-Aug-2012 05:49
Sometimes we have xml's with hyphens nodes, like

<my_xml>
 <some-node>value</some-node>
</my_xml>

You'll need to use
<?php
$simpleXmlObj->{'some-node'}
?>

instead of
<?php
$simpleXmlObj->some-node;
?>
fusionstream at gmail dot com 05-Apr-2012 04:15
If you are loading many files, this may slow down your page load time.

To set a timeout, use file_get_context and then simplexml_load_string

<?php

$fp = fopen('http://www.example.com/rss', false, stream_create_context(array('http' => array('timeout', '1.5'))));

if ($fp) {
    print_r( simplexml_load_string($fp) );
} else {
    echo "The request timed out";
}
?>
sean at aliencreations dot com 17-Mar-2011 10:59
If you find that you are receiving 500 errors with simplexml_load_file() but you can access the xml/rss feed manually through a browser, your script is probably being blocked by a user agent sniffer.

Add this code before your xml call to remedy this issue

<?php

ini_set("user_agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
ini_set("max_execution_time", 0);
ini_set("memory_limit", "10000M");

$rss = simplexml_load_file($feed_url);

?>
Nanuit at ossi dot at 08-Feb-2011 01:51
A little function very helpfull in using simplexml_load_file behind a proxy

<?php
function getXMLfromURL($url) {
      $Proxy = getenv("HTTP_PROXY");

      if (strlen($Proxy) > 1) {
        $r_default_context = stream_context_get_default ( array
                    ('http' => array(
                        'proxy' => $Proxy,
                        'request_fulluri' => True,
                    ),
                )
            );
        libxml_set_streams_context($r_default_context);
      }
      $daten = simplexml_load_file($url);
      return ($daten);
    }
?>

where HTTP_PROXY is set to e.g.: tcp://proxy:8080
guego dot ol at ig dot com dot br 12-Nov-2010 03:26
Analyze fully XML.

<?php
$xml = simplexml_load_file('file.xml');

foreach($xml as $key0 => $value){
echo "..1..[$key0] => $value";
foreach($value->attributes() as $attributeskey0 => $attributesvalue1){
echo "________[$attributeskey0] = $attributesvalue1";
}
echo '<br />';
////////////////////////////////////////////////
foreach($value as $key => $value2){
echo "....2.....[$key] => $value2";
foreach($value2->attributes() as $attributeskey => $attributesvalue2){
echo "________[$attributeskey] = $attributesvalue2";
}
echo '<br />';
////////////////////////////////////////////////
foreach($value2 as $key2 => $value3){
echo ".........3..........[$key2] => $value3";
foreach($value3->attributes() as $attributeskey2 => $attributesvalue3){
echo "________[$attributeskey2] = $attributesvalue3";
}
echo '<br />';
////////////////////////////////////////////////
foreach($value3 as $key3 => $value4){
echo "...................4....................[$key3] => $value4";
foreach($value4->attributes() as $attributeskey3 => $attributesvalue4){
echo "________[$attributeskey3] = $attributesvalue4";
}
echo '<br />';
////////////////////////////////////////////////
foreach($value4 as $key4 => $value5){
echo ".....................5......................[$key4] => $value5";
foreach($value5->attributes() as $attributeskey4 => $attributesvalue5){
echo "________[$attributeskey4] = $attributesvalue5";
}
echo '<br />';
////////////////////////////////////////////////
foreach($value5 as $key5 => $value6){
echo "......................6.......................[$key5] => $value6";
foreach($value6->attributes() as $attributeskey5 => $attributesvalue6){
echo "________[$attributeskey5] = $attributesvalue6";
}
echo '<br />';
}}}}}
echo '<br />';
}
?>
raduispas at gmail dot com 21-Oct-2010 06:12
if you want to check when this function fails,make sure to compare the return value with ===  instead of == :

<?php
$url = 'http://www.example.com';
$xml = simpleXML_load_file($url,"SimpleXMLElement",LIBXML_NOCDATA);
if($xml ===  FALSE)
{
   //deal with error
}
else { //do stuff }
?>

Otherwise you may end up with FALSE all the time even if the document is ok. Hope this helps someone ;)
jamie at splooshmedia dot co dot uk 31-Mar-2010 06:17
A wrapper around simplexml_load_file to circumvent nasty error messages when the xml server times out or gives a 500 error etc.

<?php
function loadXML2($domain, $path, $timeout = 30) {

    /*
        Usage:

        $xml = loadXML2("127.0.0.1", "/path/to/xml/server.php?code=do_something");
        if($xml) {
            // xml doc loaded
        } else {
            // failed. show friendly error message.
        }
    */

    $fp = fsockopen($domain, 80, $errno, $errstr, $timeout);
    if($fp) {
        // make request
        $out = "GET $path HTTP/1.1\r\n";
        $out .= "Host: $domain\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);

        // get response
        $resp = "";
        while (!feof($fp)) {
            $resp .= fgets($fp, 128);
        }
        fclose($fp);
        // check status is 200
        $status_regex = "/HTTP\/1\.\d\s(\d+)/";
        if(preg_match($status_regex, $resp, $matches) && $matches[1] == 200) {
            // load xml as object
            $parts = explode("\r\n\r\n", $resp);
            return simplexml_load_string($parts[1]);
        }
    }
    return false;

}
?>
Smokey 14-Mar-2010 10:16
for nested and same name values i'v made up this little bit for getting and displaying multiable values from google's geocode when a exact match is not found it returns all close matches in the following format(this is an abriged version of there output)

<Response>
  <Placemark id="1">
    <address> New York 24, NY, USA</address>
    <AddressDetails>
      ..................
    </AddressDetails>
    <Point>
      <coordinates>-73.5850086,40.7207442,0</coordinates>
    </Point>
  </Placemark>
  <Placemark id="2">
    <address>New York 27, NY, USA</address>
    <AddressDetails>
      ...................
    </AddressDetails>
    <Point>
      <coordinates>-72.8987835,40.8003588,0</coordinates>
    </Point>
  </Placemark>
  <Placemark id="3">
    <address>Cedar Place School, 20 Cedar Pl, Yonkers, NY 10705, USA</address>
    <AddressDetails>
      ..................
    </AddressDetails>
    <Point>
      <coordinates>-73.8966320,40.9256520,0</coordinates>
    </Point>
  </Placemark>
</Response>

<?php
// get and breakdown the results then store them in $var's
$Address = "99999 parkplace, new york, NY";
$urladdress = urlencode($Address);
$Base_url = "http://maps.google.com/maps/geo?q=";
$urlParts = "&output=xml";
$urlrequest = $Base_url . $urladdress . $urlParts;
$xml = simplexml_load_file($urlrequest);
$num = "0";
foreach ($xml->Response->Placemark as $value){
    $num++;
    $GeoFindAdd{$num} = $value->address;
    $GeoFindCords{$num} = $value->Point->coordinates;
}

// a simple display for the results
echo "Found ",$num," Possable Geo Data Sets <br>";
$CountNumResults = "0";
for ( ; $num > 0; $num--){
    $CountNumResults++;
    echo $countnum,"<br> Address = ",$GeoFindAdd{$num},"<br> Coordinates = ",$GeoFindCords{$num},"<br>";
}
echo "END";
?>
knl at bitflop dot com 11-Sep-2009 12:02
If you need to parse the data from SimpleXML into a session variable remember to define the data as a string first.

If you don't you will get warnings of "Node no longer exists" pointing to your session_start() function.

This will work:

<?php

    $new_version = simplexml_load_file('http://example.com/version.xml');
    $_SESSION['current_version'] = (string)$new_version->version;

?>
neil art neilanddeb dort com 17-Aug-2009 06:00
Because the encoding of my XML file is UTF-8 and the
encoding of my web page is iso-8859-1 I was getting strange characters such as â€™ instead of a right single quote.

The solution to this turned out to be hard to find, but really easy to implement.

http://uk3.php.net/manual/en/function.iconv.php

Using the iconv() function you can convert from one encodign to another, the TRANSLIT option seems to work best for what I needed.  Here's my example:

<?php
// convert string from utf-8 to iso8859-1
$horoscope = iconv( "UTF-8", "ISO-8859-1//TRANSLIT", $horoscope );
?>

I found the solution on this page...
http://tinyurl.com/lm39xc
Hope this helps
cryonyx at cerebrate dot ru 21-Oct-2008 03:34
In case you have a XML file with a series of equally named elements on one level simplexml incorrectly processes them and doesn't allow to walk through the array using foreach(). As far as I'm concerned, it is the problem caused by PHP xml_parser (see: http://ru2.php.net/manual/ru/function.xml-parser-create.php#53188).

To avoid this, just use count() and walk through the array using for().

Example:

<params>
  <param>
    <name>version.shell</name>
    <value>1.0</value>
  </param>
  <param>
      <name>version.core</name>
      <value>1.0</value>
  </param>
  <param>
      <name>file.lang</name>
      <value>vc.lang</value>
  </param>
  ...
</params>

<?php
$filename = '...';
$xml = simplexml_load_file($filename);
$p_cnt = count($xml->param);
for($i = 0; $i < $p_cnt; $i++) {
  $param = $xml->param[$i];
  ...;
}
?>
mario 02-Sep-2008 02:08
If you want CDATA in your object you should use LIBXML_NOCDATA

<?php
$xml = simplexml_load_file($file_xml, 'SimpleXMLElement',LIBXML_NOCDATA);

    print_r($xml);
?>
l [DOT] anzinger [AT] gmail [DOT] com 26-Mar-2008 09:03
If you don't want that the CDATA values get escaped, just load the XML with LIBXML_NOCDATA as an 3rd argument.

Note: A PHP version >= 5.1.0 is required for this to work.

Example:

<?php simplexml_load_file('xmldatei.xml', null, LIBXML_NOCDATA); ?>
php at werner dash ott dot de 29-Mar-2007 01:13
Making SimpleXMLElement objects session save.

Besides the effect of not surviving sessions, the SimpleXMLElement object may even crash the session_start() function when trying to re-enter the session!

To come up with a solution for this, I used a pattern as follows. The core idea is to transform the SimpleXMLElement between session calls to and from a string representation which of course is session save.

<?php
  //
  // session save handling of SimpleXMLElement objects
  // (applies to/ tested with PHP 5.1.5 and PHP 5.2.1)
  // The myClass pattern allows for conveniently accessing
  // XML structures while being session save
  //
  class myClass
  {
    private $o_XMLconfig = null;
    private $s_XMLconfig = '';

    public function __construct($args_configfile)
    {
      $this->o_XMLconfig = simplexml_load_file($args_configfile);
      $this->s_XMLconfig = $this->o_XMLconfig->asXML();
    } // __construct()

    public function __destruct()
    {
      $this->s_XMLconfig = $this->o_XMLconfig->asXML();
      unset($this->o_XMLconfig); // this object would otherwise crash
                                 // the subsequent call of
                                 // session_start()!
    } // __destruct()

    public function __wakeup()
    {
      $this->o_XMLconfig = simplexml_load_string($this->s_XMLconfig);
    } // __wakeup()

  } // class myClass
?>
wouter at code-b dot nl 20-Feb-2007 02:08
To correctly extract a value from a CDATA just make sure you cast the SimpleXML Element to a string value by using the cast operator:

<?php
$xml = '<?xml version="1.0" encoding="UTF-8" ?>
<rss>
    <channel>
        <item>
            <title><![CDATA[Tom & Jerry]]></title>
        </item>
    </channel>
</rss>';

$xml = simplexml_load_string($xml);

// echo does the casting for you
echo $xml->channel->item->title;

// but vardump (or print_r) not!
var_dump($xml->channel->item->title);

// so cast the SimpleXML Element to 'string' solve this issue
var_dump((string) $xml->channel->item->title);
?>

Above will output:

Tom & Jerry

object(SimpleXMLElement)#4 (0) {}

string(11) "Tom & Jerry"
Kyle 10-Dec-2006 02:35
In regards to Anonymous on 7th April 2006

There is a way to get back HTML tags. For example:

<?xml version="1.0"?>
<intro>
    Welcome to <b>Example.com</b>!
</intro>

<?php
// I use @ so that it doesn't spit out content of my XML in an error message if the load fails. The content could be passwords so this is just to be safe.
$xml = @simplexml_load_file('content_intro.xml');
if ($xml) {
    // asXML() will keep the HTML tags but it will also keep the parent tag <intro> so I strip them out with a str_replace. You could obviously also use a preg_replace if you have lots of tags.
    $intro = str_replace(array('<intro>', '</intro>'), '', $xml->asXML());
} else {
    $error = "Could not load intro XML file.";
}
?>

With this method someone can change the intro in content_intro.xml and ensure that the HTML is well formed and not ruin the whole site design.
Anonymous 06-Apr-2006 09:21
What has been found when using the script is that simplexml_load_file() will remove any HTML formating inside the XML file, and will also only load so many layers deep. If your XML file is to deap, it will return a boolean false.
fdouteaud at gmail dot com 09-Mar-2006 05:21
Be careful if you are using simplexml data directly to feed your MySQL database using MYSQLi and bind parameters.

The data coming from simplexml are Objects and the bind parameters functions of MySQLi do NOT like that! (it causes some memory leak and can crash Apache/PHP)

In order to do this properly you MUST cast your values to the right type (string, integer...) before passing them to the binding methods of MySQLi.
I did not find that in the documentation and it caused me a lot of headache.
info at evasion dot cc 06-Feb-2006 08:26
Sorry there's a mistake in the previous function :
<?php
   function &getXMLnode($object, $param) {
       foreach($object as $key => $value) {
           if(isset($object->$key->$param)) {
               return $object->$key->$param;
           }
           if(is_object($object->$key)&&!empty($object->$key)) {
               $new_obj = $object->$key;
               // Must use getXMLnode function there (recursive)
               $ret = getXMLnode($new_obj, $param);

           }
       }
       if($ret) return (string) $ret;
       return false;
   }
?>
skutter at imprecision dot net 03-Feb-2006 09:11
So it seems SimpleXML doesn't support CDATA... I bashed together this little regex function to sort out the CDATA before trying to parse XML with the likes of simplexml_load_file / simplexml_load_string. Hope it might help somebody and would be very interested to hear of better solutions. (Other than *not* using SimpleXML of course! ;)

It looks for any <![CDATA [Text and HTML etc in here]]> elements, htmlspecialchar()'s the encapsulated data and then strips the "<![CDATA [" and "]]>" tags out.

<?php
function simplexml_unCDATAise($xml) {
    $new_xml = NULL;
    preg_match_all("/\<\!\[CDATA \[(.*)\]\]\>/U", $xml, $args);

    if (is_array($args)) {
        if (isset($args[0]) && isset($args[1])) {
            $new_xml = $xml;
            for ($i=0; $i<count($args[0]); $i++) {
                $old_text = $args[0][$i];
                $new_text = htmlspecialchars($args[1][$i]);
                $new_xml = str_replace($old_text, $new_text, $new_xml);
            }
        }
    }

    return $new_xml;
}

//Usage:
$xml = 'Your XML with CDATA...';
$xml = simplexml_unCDATAise($xml);
$xml_object = simplexml_load_string($xml);
?>
info at evasion dot cc 03-Feb-2006 03:37
Suppose you have loaded a XML file into $simpleXML_obj.
The structure is like below :

SimpleXMLElement Object
(

    [node1] => SimpleXMLElement Object
        (
            [subnode1] => value1
            [subnode2] => value2
            [subnode3] => value3
        )

    [node2] => SimpleXMLElement Object
        (
            [subnode4] => value4
            [subnode5] => value5
            [subnode6] => value6
        )

)

When searching a specific node in the object, you may use this function :

<?php

    function &getXMLnode($object, $param) {
        foreach($object as $key => $value) {
            if(isset($object->$key->$param)) {
                return $object->$key->$param;
            }
            if(is_object($object->$key)&&!empty($object->$key)) {
                $new_obj = $object->$key;
                $ret = getCfgParam($new_obj, $param);
            }
        }
        if($ret) return (string) $ret;
        return false;
    }
?>

So if you want to get subnode4 value you may use this function like this :

<?php
$result = getXMLnode($simpleXML_obj, 'subnode4');
echo $result;
?>

It display "value4"
genialbrainmachine at NOSPAM dot tiscali dot it 30-Sep-2005 08:52
Micro$oft Word uses non-standard characters and they create problems in using simplexml_load_file.
Many systems include non-standard Word character in their implementation of ISO-8859-1. So an XML document containing that characters can appear well-formed (i.e.) to many browsers. But if you try to load this kind of documents with simplexml_load_file you'll have a little bunch of troubles..
I believe that this is exactly the same question discussed in htmlentites. Following notes to htmlentitles are interesting here too (given in the reverse order, to grant the history):
http://it.php.net/manual/en/function.htmlentities.php#26379
http://it.php.net/manual/en/function.htmlentities.php#41152
http://it.php.net/manual/en/function.htmlentities.php#42126
http://it.php.net/manual/en/function.htmlentities.php#42511
mark 12-Sep-2005 11:06
If the property of an object is empty the array is not created. Here is a version object2array that transfers properly.

<?php
function object2array($object)
{
    $return = NULL;

    if(is_array($object))
    {
        foreach($object as $key => $value)
            $return[$key] = object2array($value);
    }
    else
    {
        $var = get_object_vars($object);

        if($var)
        {
            foreach($var as $key => $value)
                $return[$key] = ($key && !$value) ? NULL : object2array($value);
        }
        else return $object;
    }

    return $return;
}
?>


Convertit une chaîne XML en objet

  • « simplexml_load_file
  • WDDX »
  • PHP Manual
  • Fonctions SimpleXML
  • Convertit une chaîne XML en objet

simplexml_load_string

(PHP 5, PHP 7, PHP 8)

simplexml_load_string — Convertit une chaîne XML en objet

Description

simplexml_load_string ( string $data , string $class_name = "SimpleXMLElement" , int $options = 0 , string $ns = "" , bool $is_prefix = false ) : SimpleXMLElement|false

Convertit la chaîne XML data et retourne un objet de la classe SimpleXMLElement.

Liste de paramètres

data

Une chaîne XML valide

class_name

Vous pouvez utiliser le paramètre optionnel et, ainsi, la fonction simplexml_load_string() retournera un objet de la classe spécifiée. Cette classe doit étendre la classe SimpleXMLElement.

options

Depuis PHP 5.1.0 et Libxml 2.6.0, vous pouvez aussi utiliser le paramètre options pour spécifier des paramètres additionnels Libxml.

ns

Préfixe ou URI de l'espace de noms.

is_prefix

true si ns est un préfixe, false si c'est l'URI.

Valeurs de retour

Retourne un objet de la classe SimpleXMLElement dont les propriétés contiennent les données du document XML, ou false si une erreur survient.

Avertissement

Cette fonction peut retourner false, mais elle peut aussi retourner une valeur équivalent à false. Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour exacte de cette fonction.

Erreurs / Exceptions

Produit un message d'erreur de niveau E_WARNING pour chaque erreur trouvée dans les données XML.

Astuce

Utilisez la fonction libxml_use_internal_errors() pour supprimer toutes les erreurs XML, et la fonction libxml_get_errors() pour les parcourir.

Historique

Version | Description
5.2.0 | Le paramètre optionel is_prefix a été ajouté.

Exemples

Exemple #1 Convertir une chaîne XML

<?php
$string = <<<XML
<?xml version='1.0'?>
<document>
 <title>Forty What?</title>
 <from>Joe</from>
 <to>Jane</to>
 <body>
  I know that's the answer -- but what's the question?
 </body>
</document>
XML;

$xml = simplexml_load_string($string);

print_r($xml);
?>

L'exemple ci-dessus va afficher :

SimpleXMLElement Object
(
  [title] => Forty What?
  [from] => Joe
  [to] => Jane
  [body] =>
   I know that's the answer -- but what's the question?
)

À partir de là, vous pouvez utiliser $xml->body et tout autre élément.

Voir aussi

  • simplexml_load_file() - Convertit un fichier XML en objet
  • SimpleXMLElement::__construct() - Crée un nouvel objet SimpleXMLElement
  • Traitement des erreurs XML
  • libxml_use_internal_errors() - Désactive le rapport d'erreur libxml et les stocke pour lecture ultérieure
  • Utilisation de base SimpleXML

User Contributed Notes

erguven dot m at gmail dot com 11-May-2017 03:14
if you want to use a class which exists in a name space, use it full name. simple_load_string did not recognize short one.

class.new.php
<?php
namespace foo\bar;

class new extends SimpleXMLElement
{
    public function do()
    {
        echo "done";
    }
}
?>

false.php
<?php
use \foo\bar\new;

$result = simplexml_load_string($xml, 'new'); // it gives warning
$result->do(); // fatal error
?>

true.php
<?php
use \foo\bar\new;
$result = simplexml_load_string($xml, '\foo\bar\new');

$result->do(); // prints done
?>
artistan at gmail dot com 11-Jun-2015 12:32
Here is my update to Bob's simple SimpleXML wrapper function.
I noticed his version would turn an empty SimpleXMLElement into an empty array.

<?php
    /**
     * http://php.net/manual/en/function.simplexml-load-string.php#91564
     *
     * bool/array unserialize_xml ( string $input [ , callback $callback ] )
     * Unserializes an XML string, returning a multi-dimensional associative array, optionally runs a callback on all non-array data
     * Returns false on all failure
     * Notes:
     * Root XML tags are stripped
     * Due to its recursive nature, unserialize_xml() will also support SimpleXMLElement objects and arrays as input
     * Uses simplexml_load_string() for XML parsing, see SimpleXML documentation for more info
     *
     * @param $input
     * @param null $callback
     * @param bool $recurse
     * @return array|mixed
     *
     */
    function unserialize_xml($input, $callback = null, $recurse = false)
    {
        // Get input, loading an xml string with simplexml if its the top level of recursion
        $data = ((!$recurse) && is_string($input))? simplexml_load_string($input): $input;
        // Convert SimpleXMLElements to array
        if ($data instanceof SimpleXMLElement){
            if(!empty($data)){
                $data = (array) $data;
            } else {
                $data = '';
            }
        }
        // Recurse into arrays
        if (is_array($data)) foreach ($data as &$item) $item = unserialize_xml($item, $callback, true);
        // Run callback and return
        return (!is_array($data) && is_callable($callback))? call_user_func($callback, $data): $data;
    }
?>
meustrus 07-May-2015 03:38
Be careful checking for parse errors. An empty SimpleXMLElement may resolve to FALSE, and if your XML contains no text or only contains namespaced elements your error check may be wrong. Always use `=== FALSE` when checking for parse errors.

<?php

$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<ns1:Root xmlns:ns1="http://example.com/custom">
<ns1:Node>There's stuff here</ns1:Node>
</ns1:Root>
XML;

$simplexml = simplexml_load_string($xml);

// This prints "Parse Error".
echo ($simplexml ? 'Valid XML' : 'Parse Error'), PHP_EOL;

// But this prints "There's stuff here", proving that
// the SimpleXML object was created successfully.
echo $simplexml->children('http://example.com/custom')->Node, PHP_EOL;

// Use this instead:
echo ($simplexml !== FALSE ? 'Valid XML' : 'Parse Error'), PHP_EOL;

?>

See:

https://bugs.php.net/bug.php?id=31045
https://bugs.php.net/bug.php?id=30972
https://bugs.php.net/bug.php?id=69596
dkrnl at yandex dot ru 30-Sep-2013 02:58
Wrapper XMLReader class, for simple SAX-reading huge xml:
https://github.com/dkrnl/SimpleXMLReader

Usage example: http://github.com/dkrnl/SimpleXMLReader/blob/master/examples/example1.php
AllenJB 12-Oct-2012 08:09
<?php
$xml = json_decode(json_encode((array) simplexml_load_string($string)), 1);
?>

A reminder that json_encode attempts to convert data to UTF-8 without specific knowledge of the source encoding. This method can cause encoding issues if you're not working in UTF-8.
Anonymous 29-Feb-2012 08:54
Use libxml_disable_entity_loader() to restrict loading of external files.  See http://www.idontplaydarts.com/2011/02/scanning-the-internal-network-using-simplexml/
Diego Araos, diego at klapmedia dot com 05-Feb-2011 12:57
A simpler way to transform the result into an array (requires json module).

<?php
function object2array($object) { return @json_decode(@json_encode($object),1); }
?>

Example:
<?php
$xml_object=simplexml_load_string('<SOME XML DATA');
$xml_array=object2array($xml_object);
?>
ascammon at hotmail dot com 28-Dec-2010 01:04
I had a hard time finding this documented, so posting it here in case it helps someone:

If you want to use multiple libxml options, separate them with a pipe, like so:

<?php
$xml = simplexml_load_string($string, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
?>
jeff at creabilis dot com 17-Nov-2009 02:28
If you want to set the charset of the outputed xml, simply set the encoding attribute like this :

<?php simplexml_load_string('<?xml version="1.0" encoding="utf-8"?><xml/>'); ?>

The generated xml outputed by $xml->asXML will containt accentuated characters like 'é' instead of &#xE9;.

Hope this help
Bob 17-Jun-2009 02:16
Here is my simple SimpleXML wrapper function.
As far as I can tell, it does the same as Julio Cesar Oliveira's (above).
It parses an XML string into a multi-dimensional associative array.
The second argument is a callback that is run on all data (so for example, if you want all data trimmed, like Julio does in his function, just pass 'trim' as the second arg).
<?php
function unserialize_xml($input, $callback = null, $recurse = false)
/* bool/array unserialize_xml ( string $input [ , callback $callback ] )
 * Unserializes an XML string, returning a multi-dimensional associative array, optionally runs a callback on all non-array data
 * Returns false on all failure
 * Notes:
    * Root XML tags are stripped
    * Due to its recursive nature, unserialize_xml() will also support SimpleXMLElement objects and arrays as input
    * Uses simplexml_load_string() for XML parsing, see SimpleXML documentation for more info
 */
{
    // Get input, loading an xml string with simplexml if its the top level of recursion
    $data = ((!$recurse) && is_string($input))? simplexml_load_string($input): $input;
    // Convert SimpleXMLElements to array
    if ($data instanceof SimpleXMLElement) $data = (array) $data;
    // Recurse into arrays
    if (is_array($data)) foreach ($data as &$item) $item = unserialize_xml($item, $callback, true);
    // Run callback and return
    return (!is_array($data) && is_callable($callback))? call_user_func($callback, $data): $data;
}
?>
Julio Cesar Oliveira 30-Mar-2009 07:14
The XML2Array func now Recursive!

<?php
function XML2Array ( $xml , $recursive = false )
{
    if ( ! $recursive )
    {
        $array = simplexml_load_string ( $xml ) ;
    }
    else
    {
        $array = $xml ;
    }

    $newArray = array () ;
    $array = ( array ) $array ;
    foreach ( $array as $key => $value )
    {
        $value = ( array ) $value ;
        if ( isset ( $value [ 0 ] ) )
        {
            $newArray [ $key ] = trim ( $value [ 0 ] ) ;
        }
        else
        {
            $newArray [ $key ] = XML2Array ( $value , true ) ;
        }
    }
    return $newArray ;
}
?>
javalc6 at gmail dot com 18-Oct-2008 06:25
I wanted to convert an array containing strings and other arrays of the same type into a simplexml object.

Here is the code of the function array2xml that I've developed to perform this conversion. Please note that this code is simple without any checks.

<?php
function array2xml($array, $tag) {

    function ia2xml($array) {
        $xml="";
        foreach ($array as $key=>$value) {
            if (is_array($value)) {
                $xml.="<$key>".ia2xml($value)."</$key>";
            } else {
                $xml.="<$key>".$value."</$key>";
            }
        }
        return $xml;
    }

    return simplexml_load_string("<$tag>".ia2xml($array)."</$tag>");
}

$test['type']='lunch';
$test['time']='12:30';
$test['menu']=array('entree'=>'salad', 'maincourse'=>'steak');

echo array2xml($test,"meal")->asXML();
?>
rowan dot collins at gmail dot com 10-Jul-2008 07:07
There seems to be a lot of talk about SimpleXML having a "problem" with CDATA, and writing functions to rip it out, etc. I thought so too, at first, but it's actually behaving just fine under PHP 5.2.6

The key is noted above example #6 here:
http://uk2.php.net/manual/en/simplexml.examples.php

"To compare an element or attribute with a string or pass it into a function that requires a string, you must cast it to a string using (string). Otherwise, PHP treats the element as an object."

If a tag contains CDATA, SimpleXML remembers that fact, by representing it separately from the string content of the element. So some functions, including print_r(), might not show what you expect. But if you explicitly cast to a string, you get the whole content.

<?php
$xml = simplexml_load_string('<foo>Text1 &amp; XML entities</foo>');
print_r($xml);
/*
SimpleXMLElement Object
(
    [0] => Text1 & XML entities
)
*/

$xml2 = simplexml_load_string('<foo><![CDATA[Text2 & raw data]]></foo>');
print_r($xml2);
/*
SimpleXMLElement Object
(
)
*/
// Where's my CDATA?

// Let's try explicit casts
print_r( (string)$xml );
print_r( (string)$xml2 );
/*
Text1 & XML entities
Text2 & raw data
*/
// Much better
?>
amir_abiri at ipcmedia dot com 08-Feb-2008 08:47
It doesn't seem to be documented anywhere, but you can refer to an element "value" for the purpose of changing it like so:

<?php
$xml = simplexml_load_string('<root><number>1</number></root>');
echo $xml->asXml(). "\n\n";

$xml->number->{0} = $xml->number->{0} + 1;

echo $xml->asXml();
?>

echos:
<?xml version="1.0"?>
<root><number>1</number></root>

<?xml version="1.0"?>
<root><number>2</number></root>

However, this only works with a direct assignment, not with any of the other operators:

<?php
$xml = simplexml_load_string('<root><number>1</number></root>');
echo $xml->asXml(). "\n\n";

$xml->number->{0} += 1;
// Or:
$xml->number->{0}++;

echo $xml->asXml();
?>

Both of the above cases would result in:

<?xml version="1.0"?>
<root><number>1</number></root>

<?xml version="1.0"?>
<root><number>1<0/></number></root>
bojan 04-Feb-2008 04:38
As was said before don't use var_dump() or print_r() to see SimpleXML object structure as they do not returns always what you expect.
Consider the following:

<?php

// data in xml
$xml_txt = '
<root>
  <folder ID="65" active="1" permission="1"><![CDATA[aaaa]]></folder>
  <folder ID="65" active="1" permission="1"><![CDATA[bbbb]]></folder>
</root>';

// load xml into SimpleXML object
$xml = simplexml_load_string($xml_txt, 'SimpleXMLElement', LIBXML_NOCDATA);//LIBXML_NOCDATA LIBXML_NOWARNING

// see object structure
print_r($xml);

/* this prints
SimpleXMLElement Object
(
    [folder] => Array
        (
            [0] => aaaa
            [1] => bbbb
        )

)
*/

// but...
foreach ($xml->folder as $value){
    print_r($value);
}
/* prints complete structure of each folder element:
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [ID] => 65
            [active] => 1
            [permission] => 1
        )

    [0] => aaaa
)

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [ID] => 65
            [active] => 1
            [permission] => 1
        )

    [0] => bbbb
)

*/
?>
hattori at hanso dot com 15-Oct-2007 03:19
Theres a problem with the below workaround when serializing fields containing html CDATA. For any other content type then HTML try to modfiy function parseCDATA.
Just add these lines before serializing.
This is also a workaround for this bug http://bugs.php.net/bug.php?id=42001

<?PHP
if(strpos($content, '<![CDATA[')) {
   function parseCDATA($data) {
      return htmlentities($data[1]);
   }
   $content = preg_replace_callback(
      '#<!\[CDATA\[(.*)\]\]>#',
      'parseCDATA',
      str_replace("\n", " ", $content)
   );
}
?>
nbijnens at servs dot eu 10-Sep-2007 05:17
Please note that not all LIBXML options are supported with the options argument.

For instance LIBXML_XINCLUDE does not work. But there is however a work around:

<?php
$xml = new DOMDocument();
$xml->loadXML ($XMLString);

$xml->xinclude();
$xml = simplexml_import_dom($xml);

?>
Pedro 06-Jul-2007 01:28
Attention:

simplexml_load_string has a problem with entities other than (&lt;, &gt;, &amp;, &quot; and &apos;).

Use numeric character references instead!
m dot ament at mailcity dot com 06-Mar-2007 06:51
Warning:

The parsing of XML-data will stop when reaching character 0.
Please avoid this character in your XML-data.
mindpower 30-Jan-2007 03:03
A simple extension that adds a method for retrieving a specific attribute:

<?php
class simple_xml_extended extends SimpleXMLElement
{
    public    function    Attribute($name)
    {
        foreach($this->Attributes() as $key=>$val)
        {
            if($key == $name)
                return (string)$val;
        }
    }

}

$xml = simplexml_load_string('
<xml>
  <dog type="poodle" owner="Mrs Smith">Rover</dog>
</xml>', 'simple_xml_extended');

echo $xml->dog->Attribute('type');

?>

outputs 'poodle'

I prefer to use this technique rather than typecasting attributes.
Maciek Ruckgaber <maciekrb at gmai dot com> 07-Jun-2005 05:07
after wondering around some time, i just realized something (maybe obvious, not very much for me). Hope helps someone to not waste time as i did :-P

when you have something like:

<?php
$xmlstr = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<double xmlns="http://foosite.foo/">2328</double>
XML;
?>

you will have the simpleXML object "transformed" to the text() content:

<?php
$xml = simplexml_load_string($xmlstr);
echo $xml; // this will echo 2328  (string)
?>
cellog at php dot net 31-Aug-2004 04:11
simplexml does not simply handle CDATA sections in a foreach loop.

<?php
$sx = simplexml_load_string('
<test>
 <one>hi</one>
 <two><![CDATA[stuff]]></two>
 <t>
  <for>two</for>
 </t>
 <multi>one</multi>
 <multi>two</multi>
</test>');
foreach((array) $sx as $tagname => $val) {
    if (is_string($val)) {
       // <one> will go here
    } elseif (is_array($val)) {
       // <multi> will go here because it happens multiple times
    } elseif (is_object($val)) {
      // <t> will go here because it contains tags
      // <two> will go here because it contains CDATA!
    }
}
?>

To test in the loop, do this

<?php
if (count((array) $val) == 0) {
    // this is not a tag that contains other tags
    $val = '' . $val;
    // now the CDATA is revealed magically.
}
?>


WDDX

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Exemples
    • Exemples wddx
  • WDDX Fonctions
    • wddx_add_vars — Ajoute des variables à un paquet WDDX
    • wddx_deserialize — Délinéarise un paquet WDDX
    • wddx_packet_end — Clôt un paquet WDDX
    • wddx_packet_start — Commence un nouveau paquet WDDX avec une structure
    • wddx_serialize_value — Enregistre une valeur dans un paquet WDDX
    • wddx_serialize_vars — Enregistre plusieurs valeurs dans un paquet WDDX

User Contributed Notes

There are no user contributed notes for this page.


Introduction

Avertissement

Cette extension est OBSOLÈTE et DÉGROUPÉ à partir de PHP 7.4.0.

Ces fonctions sont prévues pour fonctionner avec » WDDX.

Avertissement

Ne passez pas de données utilisateurs qui ne sont pas de confiance à la fonction wddx_deserialize(). La délinéarisation peut conduire au chargement et à l'exécution des données lors de l'instansiation de l'objet et de son auto-chargement, aussi, un utilisateur malicieux peut être capable d'exploiter ce comportement. Utiliser donc des données sécurisées avec un format de données comme JSON (via la fonction json_decode() et la fonction json_encode()) si vous devez passer les données linéarisées à l'utilisateur.

User Contributed Notes

alvaro at demogracia dot com 29-Sep-2008 08:49
From OpenWDDX.Org:

"The Web Distributed Data Exchange, or WDDX, is a free, open XML-based technology that allows Web applications created with any platform to easily exchange data with one another over the Web."

"WDDX is an XML-based technology that enables the exchange of complex data between Web programming languages, creating what some refer to as 'Web syndicate networks'. WDDX consists of a language-independent representation of data based on an XML 1.0 DTD, and a set of modules for a wide variety of languages that use WDDX. WDDX can be used with HTTP, SMTP, POP, FTP and other Internet protocols that support transferring textual data."


Pré-requis

Cette extension requière l'extension PHP libxml. Ceci signifie passer l'option de configuration --with-libxml, ou antérieur à PHP 7.4 l'option de configuration --enable-libxml, bien que ceci est accomplie implicitement car libxml est activé par défaut.

Afin d'utiliser WDDX, vous devez installer la bibliothèque expat (qui est fournie avec Apache 1.3.7 ou supérieur).

User Contributed Notes

There are no user contributed notes for this page.


Installation

PHP 7.4

Cette extension a été déplacée dans le module » PECL et ne sera plus intégrée dans PHP à partir de PHP 7.4.0

Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » https://pecl.php.net/package/wddx.

PHP < 7.4

Après avoir installé Expat, compilez PHP avec --enable-wddx et utilisez --with-libexpat-dir pour Expat.

La version Windows de PHP dispose du support automatique de cette extension. Vous n'avez pas à ajouter de bibliothèque supplémentaire pour disposer de ces fonctions.

User Contributed Notes

There are no user contributed notes for this page.


Types de ressources

Cette extension définit un identifiant de paquet WDDX, retourné par la fonction wddx_packet_start().

User Contributed Notes

There are no user contributed notes for this page.


Exemples

Sommaire

  • Exemples wddx

User Contributed Notes

dormilich at netscape dot net 27-Nov-2008 06:37
If you want to use the WDDX 1.0 DTD for validation (http://www.openwddx.org/downloads/dtd/wddx_dtd_10.txt) check that you define the comment as element, not as attribute.

<?xml version="1.0" encoding="iso-8859-1" ?>
<wddxPacket version='1.0'>
    <header>
        <comment>PHP</comment>
    </header>
    <data><!-- WDDX serialized data --></data>
</wddxPacket>


Exemples wddx

Toutes les fonctions qui linéarisent les variables utilisent le premier élément d'un tableau pour déterminer si le tableau doit être linéarisé dans un tableau ou dans une structure. Si le premier élément a une chaîne de caractères en tant que clé, alors, il sera linéarisé dans une structure, sinon, dans un tableau.

Exemple #1 Linéarisation d'une valeur simple avec WDDX

<?php
echo wddx_serialize_value("PHP to WDDX packet example", "PHP packet");
?>

Cet exemple affichera :

<wddxPacket version='1.0'><header comment='PHP packet'/><data>
<string>PHP to WDDX packet example</string></data></wddxPacket>

Exemple #2 Utilisation de paquets incrémentaux avec WDDX

<?php
$pi = 3.1415926;
$packet_id = wddx_packet_start("PHP");
wddx_add_vars($packet_id, "pi");

/* Suppose que $cities provient d'une base de données */
$cities = array("Austin", "Novato", "Seattle");
wddx_add_vars($packet_id, "cities");

$packet = wddx_packet_end($packet_id);
echo $packet;
?>

Cet exemple affichera :

<wddxPacket version='1.0'><header comment='PHP'/><data><struct>
<var name='pi'><number>3.1415926</number></var><var name='cities'>
<array length='3'><string>Austin</string><string>Novato</string>
<string>Seattle</string></array></var></struct></data></wddxPacket>

Note:

Si vous voulez linéariser des caractères non-ASCII, vous devez d'abord les convertir en UTF-8 (voir les fonctions utf8_encode() et iconv()).

User Contributed Notes

There are no user contributed notes for this page.


WDDX Fonctions

Sommaire

  • wddx_add_vars — Ajoute des variables à un paquet WDDX
  • wddx_deserialize — Délinéarise un paquet WDDX
  • wddx_packet_end — Clôt un paquet WDDX
  • wddx_packet_start — Commence un nouveau paquet WDDX avec une structure
  • wddx_serialize_value — Enregistre une valeur dans un paquet WDDX
  • wddx_serialize_vars — Enregistre plusieurs valeurs dans un paquet WDDX

User Contributed Notes

iGEL 14-Mar-2008 02:03
As of version 5.2.5, this is wrong:

> Note: If you want to serialize non-ASCII characters you
> have to convert your data to UTF-8 first (see utf8_encode()
> and iconv()).

Serializing a string with WDDX will always convert it from ISO-8859-1 to UTF-8, no matter what the original encoding is. So if your data already are UTF-8, you get just gibberish.

You can restore the original encoding by using utf8_decode on the serialized wddx data, even though your original data may use chars not included in ISO-8859-1:

<?php
header("Content-Type: text/xml;encoding=utf-8");
echo utf8_decode(wddx_serialize_value("?? ???"));
?>

(This is why I dislike PHP, sorry)
egbert teeselink 23-Feb-2008 10:49
If your PHP doesn't have wddx support installed, and you need it, and you don't want to install PEAR just for wddx, try this short piece of code, based on SimpleXML:

//can read any wddx file generated from php arrays. assumes var elements are only inside struct elements and that only one packet exists.
function wddx_read_node($node, $type)
{
    switch($type)
    {
    case "boolean":
        return (string)$node;
    case "number":
    case "binary":
    case "string":
        return (string)$node;
    case "null":
        return null;
    case "array":
        $a = array();
        foreach($node as $subtype => $subnode)
        {
            $a[] = wddx_read_node($subnode, $subtype);
        }
        return $a;
    case "struct":
        $a = array();
        foreach($node as $subtype => $subnode)
        {
            list($key, $value) = wddx_read_node($subnode, $subtype); //must be a var element
            $a[$key] = $value;
        }
        return $a;
    case "var":
        list($subnode, $subtype) = getchild($node);
        return array((string)$node["name"], wddx_read_node($subnode, $subtype));
    case "data":
        list($subnode, $subtype) = getchild($node);
        return wddx_read_node($subnode, $subtype);
    }
}

function wddx_read($string)
{
    $xml = simplexml_load_string($string);
    $d = wddx_read_node($xml->data, "data");
    return $d;
}

important notice: this one may not work with all wddx input. multiple packets or variables outside a "struct" are not supported. basically, you always get a PHP (associative) array, never something else. feel free to make additions.
no at spam dot thx 12-Aug-2007 02:09
To bradburn at kiwi dot de:

PHP is only capable of serializing properly variables which match one of its native (scalar) types (See http://php.net/types). Which means that only variables of type booleans, integers, floating point numbers, string and NULL will be serialized properly.

I think there are two exceptions though:
- arrays are serialized by processing them recursively, so if its only composed of the above mentioned types, you should be fine.
- floating point numbers and integers may use the same representation while serialized in WDDX (I don't know much about WDDX, so I'm not 100% sure about this statement).

An interesting case would be whether objects can be serialized or not...
Jimmy Wimenta 15-Jul-2004 05:53
PHP's WDDX is useful only for exchanging data between PHP applications, but definetly not for exchanging data between different languages (which actually defeats the purpose of WDDX).

For example:

$hash1 = array ("2" => "Two", "4" => "Four", "5" => "Five");
$hash2 = array ("0" => "Zero", "1" => "One", "2" => "Two");

$hash1 will be serialized as hash, but
$hash2 will be serialized as array/list, because the key happen to be a sequence starting from 0.

Unless the library provide a way for users to specify the type, it can never be used for cross-platform data exchange.
Q1tum at hotmail dot com 21-Nov-2003 05:08
To insert arrays into a wddx variable here is a fine way to do it:

<?php

$sql = 'SELECT * FROM example';
$query = mysql_query($sql, $db) or die(mysql_error());

while($result = mysql_fetch_array($query)) {
    $id[] = $result[ 'id'];
    $name[] = $result['name'];
    $description[] = $result[$prefix . 'description'];
}

mysql_free_result($query);

wddx_add_vars($packet_id, "id");
wddx_add_vars($packet_id, "name");
wddx_add_vars($packet_id, "description");

$wddxSerializeValue = wddx_packet_end($packet_id);

?>
bradburn at kiwi dot de 30-Jul-2002 07:02
With ref to the above comment about typing, I have found that -- oddly enough -- PHP's WDDX supports the following WDDX types: null, boolean (true/false), number and string, *but* not date-time.

as an example, use the following values in an array that you then serialize:

$number = 5,
$null = NULL,
$bool = true,
$string = 'this is a string'.

they will all serialize correctly, e.g. the third entry comes out as:

<var name='bool'><boolean value='true'/></var>

i have tried with the 'official' format for WDDX 'datetime', e.g. '1998-9-15T09:05:32+4:0' (from the DTD @ http://www.openwddx.org/downloads/dtd/wddx_dtd_10.txt)  but have only succeeded in getting this encoded as a 'string' type.

if anyone else has any more information on this, it would be welcome. i would like to store the variables in 'appropriate' fields in a database, and the fact that only datetime is not supported is slightly irritating -- otherwise it would be a very useful function.
djm at web dot us dot uu dot net 18-Oct-1999 08:45
Since there aren't any examples of reversing the process, here's one. If you had the packet produced by the above example (without the htmlentities() call), you could retrieve the values like this:

<?php
$value = wddx_deserialize($packet);
print "pi is:<br>" . $value["pi"] . "<p>\n";
print "cities is:<br>\n";
while (list($key, $val) = each($value["cities"])) {
    print "$key => $val<br>\n";
}
?>

which outputs:

<pre>
pi is:
3.1415926

cities is:
0 => Austin
1 => Novato
2 => Seattle
</pre>


Ajoute des variables à un paquet WDDX

  • « WDDX Fonctions
  • wddx_deserialize »
  • PHP Manual
  • WDDX Fonctions
  • Ajoute des variables à un paquet WDDX

wddx_add_vars

(PHP 4, PHP 5, PHP 7)

wddx_add_vars — Ajoute des variables à un paquet WDDX

Avertissement

Cette fonction est a été SUPPRIMÉE à partir de PHP 7.4.0.

Description

wddx_add_vars ( resource $packet_id , mixed $var_name , mixed ...$var_names ) : bool

Sert à enregistrer et à ajouter les variables passées en argument au paquet repéré par son identifiant packet_id.

Liste de paramètres

Cette fonction prend un nombre variable de paramètres.

packet_id

Un paquet WDDX, retourné par la fonction wddx_packet_start().

var_name

Peut être une chaîne de caractères nommant une variable ou un tableau contenant des noms de variables ou d'autres tableaux, etc..

var_names

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

User Contributed Notes

maciek at webenlinea dot com 05-Sep-2004 11:20
Here is a simple way of serializing dynamic values from an array:

<?PHP
//a unix timestamp
$date    = "1094095513";

//some data to be included
$books   = array('programming'   => array('php','perl','java'),
                'markup'        => array('UML','XML','HTML')
                );

//stick data to an array to iterate over
$data_to_serialize = array($date,$books);

//create the packet
$packet = wddx_packet_start("SOME DATA ARRAY");

//loop through the data
foreach($data_to_serialize as $key => $data)
{
  //create a var whith the name of the content of $key
  $$key = $data;
  wddx_add_vars($packet,$key);
}

echo wddx_packet_end($packet);

?>

Have fun !


Délinéarise un paquet WDDX

  • « wddx_add_vars
  • wddx_packet_end »
  • PHP Manual
  • WDDX Fonctions
  • Délinéarise un paquet WDDX

wddx_deserialize

(PHP 4, PHP 5, PHP 7)

wddx_deserialize — Délinéarise un paquet WDDX

Avertissement

Cette fonction est a été SUPPRIMÉE à partir de PHP 7.4.0.

Description

wddx_deserialize ( string $packet ) : mixed

Délinéarise un paquet packet WDDX.

Avertissement

Ne passez pas d'entrée utilisateur non vérifiée à wddx_deserialize(). La délinéarisation peut faire que le code soit chargé, et exécuté lors de l'instanciation et l'autochargement de l'objet, et un utilisateur mal intentionné peut être capable d'y loger un exploit. Utilisez une format, sûr, d'échange de données standardisé comme JSON (à l'aide de json_decode() et json_encode()) si vous devez passer des données linéarisé à l'utilisateur.

Liste de paramètres

packet

Un paquet WDDX, sous la forme d'une chaîne de caractères ou d'un flux.

Valeurs de retour

Retourne la valeur délinéarisée, pouvant être une chaîne de caractères, un nombre ou un tableau. Notez que les structures sont délinéarisées dans des tableaux associatifs.

User Contributed Notes

valer underscore crisan at yahoo 01-Apr-2009 02:03
In PHP 5.2.9, we noticed that wddx serialize and deserialize seems to use UTF-8 encoding for XML input and the output data. There are some posts below that talk about fixing the input XML data so deserialize would work fine on special chars in ISO-8859-1 encoding, but none of the posts talks about the output encoding.

Consider this test:
$text = "Jür";
$packet = wddx_serialize_value($text);
$header = '<?xml version="1.0" encoding="iso-8859-1"?>';
$newText = wddx_deserialize($header . $packet);
echo "WDDX Packet: $packet\n";
echo "Deserialized Object: $newText\n";

The output is:

WDDX Packet: <wddxPacket version='1.0'><header/><data><string>Jür</string></data></wddxPacket>
Deserialized Object: JÃ¼r

The deserialized string is not in ISO-8859-1 encoding. It is in UTF-8 encoding. So we need to run utf8_decode() on the deserialized data to convert it back to ISO-8859-1 encoding which is what our application expects.

Hope this helps.
Magnus Deininger, dma05 at web dot de 12-Feb-2009 05:57
When writing your wddx file manually with an UTF-8 aware editor and saving it in utf-8, if your data gets its special characters mysteriously scrambled, try to add an xml header that marks the output as iso-8859-1, like this one:

<?xml version="1.1" encoding="iso-8859-1" ?>

This makes the wddx decode function treat the input as iso-8859-1, so it will not try to treat it as utf-8 and do an implicit decode to iso-8859-1. You will then have read all string data in the wddx packet in their original utf-8 encoding, so that 'echo' and other output functions will produce the intended result if you have set the output encoding to utf-8.

(Bugs reports on this behaviour seem to be treated as bogus, so it would seem in order to point out this incorrect and highly confusing side-effect.)
dormilich at netscape dot net 28-Nov-2008 05:13
When deserializing objects make sure you have the class definition loaded. wddx_deserialize() doesn't call the class itself, so you will receive a fatal error.
Nevertheless you can look for the class manually and delegate it to __autoload().

<?php
// $wddx_string needs to be valid XML to be loaded by SimpleXML.
// class_exists() will call the __autoload() function. if you don't
// want to use __autoloload(), use require_once()

function loadClassesFromWDDX($wddx_string)
{
    $xml = new SimpleXMLElement($wddx_string);

    foreach ($xml->xpath('//var') as $var)
    {
        if ($var['name'] == 'php_class_name')
        {
            if (!class_exists($var->string))
            {
                throw new Exception('Class '" . $var->string . "'not available.');
                // trigger_error('Class '" . $var->string . "'not available.', E_USER_ERROR);
            }
        }
    }
}
?>
dave at codexweb dot co dot za 21-Jan-2006 04:40
Here's a handy wddx_deserialize clone I wrote a while back. It uses PHP5 SimpleXML and recursion to do pretty much the same task as wddx_deserialize. Hope it comes in handy for someone.

<?php

if (!function_exists('wddx_deserialize'))
{
    /**
     * Clone implementation of wddx_deserialize
     */
    function wddx_deserialize($xmlpacket)
    {
        if ($xmlpacket instanceof SimpleXMLElement)
        {
            if (!empty($xmlpacket->struct))
            {
                $struct = array();
                foreach ($xmlpacket->xpath("struct/var") as $var)
                {
                    if (!empty($var["name"]))
                    {
                        $key = (string) $var["name"];
                        $struct[$key] = wddx_deserialize($var);
                    }
                }
                return $struct;
            }
            else if (!empty($xmlpacket->array))
            {
                $array = array();
                foreach ($xmlpacket->xpath("array/*") as $var)
                {
                    array_push($array, wddx_deserialize($var));
                }
                return $array;
            }
            else if (!empty($xmlpacket->string))
            {
                return (string) $xmlpacket->string;
            }
            else if (!empty($xmlpacket->number))
            {
                return (int) $xmlpacket->number;
            }
            else
            {
                if (is_numeric((string) $xmlpacket))
                {
                    return (int) $xmlpacket;
                }
                else
                {
                    return (string) $xmlpacket;
                }
            }
        }
        else
        {
            $sxe = simplexml_load_string($xmlpacket);
            $datanode = $sxe->xpath("/wddxPacket[@version='1.0']/data");
            return wddx_deserialize($datanode[0]);
        }
    }
}

?>
php dot net at werner-ott dot de 24-Nov-2005 12:20
On migrating wddx_deserialize() from PHP 4.x to PHP 5.1 (5.1.0RC6):

While

  $buffer = wddx_serialize_vars($some_array);
  $some_array = wddx_deserialize($buffer);

worked fine with PHP 4.x, the deserialization failed with PHP 5.1. In the above example $some_array will just be an empty string under 5.1

While wddx_serialize_vars() seems to behave identical in 4.x and 5.1, wddx_deserialize() does NOT.

Prepending XML encoding information to the buffer turned out to be at least a workaround. So, the following works with PHP 5.1:

  $buffer = wddx_serialize_vars($some_array);
  $buffer = '<?xml version="1.0"
          encoding="ISO-8859-1"?>'.
          $buffer;
  $some_array = wddx_deserialize($buffer);

NB: It may well be, that the behavioural difference between 4.x and 5.1 described above can only be observed if the array contains certain characters, i.e. german Umlaute (??????). So this workaround may not be necessary in each and every case.
mail_fidel at yahoo dot com 19-Nov-2004 12:11
To properly deserialize a wddx file it was to be utf8_encoded.

The following code will NOT work (PHP5.0.2 FreeBSD):

<?php
   $data = wddx_serialize_value(array("xyz???","abcd"));
   print $data;
   print_r(wddx_deserialize($data));

?>

Even thought the serialization is done right, the deserialization will not work unless you encode the text using utf8.

This code WILL work:

<?php
   $data = wddx_serialize_value(array(utf8_encode("xyz???"),"abcd"));
   print $data;
   print_r(wddx_deserialize($data));

?>
xavier at c-est-simple dot com 19-May-2004 04:09
JavaScript/PHP interroperability:

If you want to exchange wddx packets between a JavaScript application using the JS wddx library from openwddx (http://www.openwddx.org/downloads/), and a PHP script using wddx functions, be aware that the encoding of the classes of objects serialized in the wddx packet is not made the same way in both implementations.

The JS lib uses a 'type' attribute in the 'struct' tab and gives it the name of the class of the object serialized in the 'struct' element, while PHP uses a 'php_class_name' tag within the 'struct'.
NB : to get the type attribute with JS serialisation, you need to set the 'wddxSerializationType' member in your classes

Example with an object of class 'exemple' containing 2 members _attr1 and _attr2.
(NB : in french, 'example' is spelled 'exemple', okay ? :-)

JS serialization :
<wddxPacket version='1.0'>
 <header/>
 <data>
  <struct type="exemple">
   <var name='_attr1'>
    <string>foo</string>
   </var>
   <var name='_attr2'>
    <string>bar</string>
   </var>
  </struct>
 </data>
</wddxPacket>

php serialization:
<wddxPacket version='1.0'>
 <header/>
 <data>
  <struct>
   <var name='php_class_name'>
    <string>exemple</string>
   </var>
   <var name='_attr1'>
    <string>foo</string>
   </var>
   <var name='_attr2'>
    <string>bar</string>
   </var>
  </struct>
 </data>
</wddxPacket>

I like the JS approach better.
So if you need the compatibility, the workaround is quite simple:
- add a 'php_class_name' member in your JS objects, giving it the name of the class for value, and the JS generated packet will be correctly deserialized with PHP in classed objects.

- use a regexp on a PHP generated packet to add the 'type' attribute so that the JS deserialization instanciates objects of the right class:
      $pat = "/<struct><var name='php_class_name'><string>(\w+)<\/string>/" ;
      $rep = "<struct type='\$1'><var name='php_class_name'><string>\$1</string>" ;
      $serialised = preg_replace($pat, $rep, $serialised );
NB : this only works because the 'php_class_name' tag is just next to the 'struct' tag.
Who knows if this is going to be true in future releases... ?

This way, you can exchange JS and PHP objects (provided you define your JS and PHP classes the same way) smoothly...

It's worth saying that both implementations, as well as my interroperability workaround, handle correctly objects with members that are also objects.

NB : NB means Nota Bene.
xavier at c-est-simple.com 18-May-2004 10:19
Beware, although the deserialized objects are instanciated class objects (if the php_class_name tag is amongst the children of the struct tag and its text content is the name of a loaded class), the constructor of the class has not been called at all.
You can use the members and call the methods of the object all right, but any initialisation action that the constructor might be in charge of is missing.
php at mike2k dot com 10-Sep-2001 06:06
if you have WDDX data coming from a third party source and it isnt being parsed correctly in your php, try translating their WDDX. we have a third party sending us WDDX from cold fusion, and it uses a <recordset> element, which PHP seems to ignore (looking around the web we found some other people having trouble) so the (hopefully temporary) solution we found was to translate the WDDX midstream and then we were able to parse it:

$url = "http://somedomain.com/blah.wddx";
$fp = fopen($url,"r");
$page = fread($fp,10000);
fclose($fp);
$page = str_replace("<recordset","<struct",$page);
$page = str_replace("</recordset","</struct",$page);
$page = str_replace("<field","<var",$page);
$page = str_replace("</field","</var",$page);
$values = wddx_deserialize($page);
while(list($key,$val) = each($values)) {
        print "$key => $val<BR>";
}

this works for us. it's a hack, and hopefully php will support this in the future or something.
medvitz at medvitz dot net 14-Oct-2000 05:29
You can also serialize instantiated class objects with the wddx functions.
ie.

<?php
$packet_id = wddx_packet_start("PHP");
wddx_add_vars($packet_id, "objvar");
$packet = wddx_packet_end($packet_id);

$a =  wddx_deserialize($packet);
$obj = $a[objvar];
?>

now $obj is a useable object, that looks like the original.

Note that with this method, you need to know what the variable name of the original object was.  You can use one of the array functions to get the object in the event that the original object's variable name was unknown.

*** only verified on linux with 4.0.2
djm at web dot us dot uu dot net 18-Oct-1999 09:58
The packet string you pass to this function doesn't have to be sanitized first; it searches for a WDDX packet within the string.  So the string can contain HTML markup and random text outside of the packet, and that is all ignored.
This means you can get a packet from another web page like this:
<?php
$fhandle = fopen("http://myserver.com/packet.php", "r");
if ($fhandle) {
        $page = fread($fhandle,10000);
        fclose($fhandle);
        $value = wddx_deserialize($page);
        print "pi is:<br>" . $value["pi"] . "<p>\n";
} else {
        print "could not get packet.php<p>";
}
?>


Clôt un paquet WDDX

  • « wddx_deserialize
  • wddx_packet_start »
  • PHP Manual
  • WDDX Fonctions
  • Clôt un paquet WDDX

wddx_packet_end

(PHP 4, PHP 5, PHP 7)

wddx_packet_end — Clôt un paquet WDDX

Avertissement

Cette fonction est a été SUPPRIMÉE à partir de PHP 7.4.0.

Description

wddx_packet_end ( resource $packet_id ) : string

Clôt un paquet WDDX.

Liste de paramètres

packet_id

Un paquet WDDX, retourné par la fonction wddx_packet_start().

Valeurs de retour

Retourne une chaîne de caractères contenant le paquet WDDX.

User Contributed Notes

There are no user contributed notes for this page.


Commence un nouveau paquet WDDX avec une structure

  • « wddx_packet_end
  • wddx_serialize_value »
  • PHP Manual
  • WDDX Fonctions
  • Commence un nouveau paquet WDDX avec une structure

wddx_packet_start

(PHP 4, PHP 5, PHP 7)

wddx_packet_start — Commence un nouveau paquet WDDX avec une structure

Avertissement

Cette fonction est a été SUPPRIMÉE à partir de PHP 7.4.0.

Description

wddx_packet_start ( string $comment = ? ) : resource

wddx_packet_start() sert à créer un nouveau paquet WDDX, pour pouvoir y faire des ajouts incrémentaux de variables. Elle va automatiquement créer une définition de structure dans le paquet, pour accueillir des variables.

Liste de paramètres

comment

Une chaîne de caractères optionnelle contenant le commentaire.

Valeurs de retour

Retourne un identifiant de paquet pour utilisation ultérieure avec les fonctions WDDX, ou false si une erreur survient.

User Contributed Notes

There are no user contributed notes for this page.


Enregistre une valeur dans un paquet WDDX

  • « wddx_packet_start
  • wddx_serialize_vars »
  • PHP Manual
  • WDDX Fonctions
  • Enregistre une valeur dans un paquet WDDX

wddx_serialize_value

(PHP 4, PHP 5, PHP 7)

wddx_serialize_value — Enregistre une valeur dans un paquet WDDX

Avertissement

Cette fonction est a été SUPPRIMÉE à partir de PHP 7.4.0.

Description

wddx_serialize_value ( mixed $var , string $comment = ? ) : string

Enregistre une valeur donnée dans un paquet WDDX.

Liste de paramètres

var

La valeur à linéariser.

comment

Une chaîne de caractères optionnelle contenant un commentaire qui apparaît dans l'en-tête du paquet.

Valeurs de retour

Retourne le paquet WDDX, ou false si une erreur survient.

User Contributed Notes

chris at digitalbase dot com 04-Jan-2002 04:36
When serializing JavaScript objects to interact with PHP objects, you should make the JavaScript object's first entry a php_class_name.

PHP:
class myclass {
    var $name;
    var $age;
    var $ssn;
    ...

    function myclass() {
        $this->name = "";
        $this->age = "";
        $this->ssn = "";
        ...
    }
}

JavaScript:
// serialization example code is from the
// WDDX SDK http://www.openwddx.org
function SerializeMsg(name, age, ssn, ...) {
    var MyObj = new Object;

    // the following line is necessary in order
    // to deserialize back to a PHP object
    MyObj.php_class_name = "myclass";

    MyObj.name = name;
    MyObj.age = age;
    MyObj.ssn = ssn;
    ...

    // Create a new serializer "object" to do our work for us
    MySer = new WddxSerializer;

    // Serialize the Message variable into a WDDX Packet
    MyWDDXPacket = MySer.serialize(MyObj);

    // Output WDDX Packet so we can see what it looks like
    return MyWDDXPacket;
}

Now you can use this in a page which is its own form action:
<?php
// don't forget to include the class definition from above!
if (!isSet($wddx_packet))
    $MyObj = new myclass();
else
    $MyObj = wddx_deserialize($wddx_packet);
?>

<html>
<head>
<script language="JavaScript">
<!--
function Init() {
    // sets the form's text-elements
    tmp = document.MyForm;

    tmp.name.value = "<? echo $MyObj->name ?>";
    tmp.age.value = "<? echo $MyObj->age ?>";
    tmp.ssn.value = "<? echo $MyObj->ssn ?>";
    ...
}

function SerializeMsg(name, age, ssn, ...) {
// see above!
}

function SubmitForm() {
    // sumbits the form
    tmp = document.MyForm;

    tmp.wddx_packet.value =
    SerializeMsg(tmp.name.value, tmp.age.value, tmp.ssn.value,...);
    document.submit();
}
// -->
</script>
</head>
<body>
...
<form name="MyForm"
action="<? echo $PHP_SELF ?>" method="post">
<input name="wddx_packet" type="hidden">
<input name="name" type="text">
<input name="age" type="text">
<input name="ssn" type="text">
...
<input name="SubmitBtn" type="button" onclick="SumbitForm()">
</form>
</body>
</html>

---------------------------------
If you don't provide that first 'php_class_name' in the JavaScript function, then when PHP deserializes it will deserialize into an associative array and not an object instance.

Note that this provides a way to maintain state without
using sessions or cookies - just good old HTML!

Hope this helps!
--
Chris Hansen


Enregistre plusieurs valeurs dans un paquet WDDX

  • « wddx_serialize_value
  • XMLDiff »
  • PHP Manual
  • WDDX Fonctions
  • Enregistre plusieurs valeurs dans un paquet WDDX

wddx_serialize_vars

(PHP 4, PHP 5, PHP 7)

wddx_serialize_vars — Enregistre plusieurs valeurs dans un paquet WDDX

Avertissement

Cette fonction est a été SUPPRIMÉE à partir de PHP 7.4.0.

Description

wddx_serialize_vars ( mixed $var_name , mixed ...$var_names ) : string

Sert à créer un paquet WDDX avec une structure qui contient la représentation des variables passées en arguments.

Liste de paramètres

Cette fonction prend un nombre variable de paramètres.

var_name

Peut être soit une chaîne de caractères nommant une variable ou un tableau contenant des noms de variables ou d'autres tableaux, etc..

var_names

Valeurs de retour

Retourne le paquet WDDX, ou false si une erreur survient.

Exemples

Exemple #1 Exemple avec wddx_serialize_vars()

<?php
$a = 1;
$b = 5.5;
$c = array("blue", "orange", "violet");
$d = "colors";

$clvars = array("c", "d");
echo wddx_serialize_vars("a", "b", $clvars);
?>

L'exemple ci-dessus va afficher :

<wddxPacket version='1.0'><header/><data><struct><var name='a'><number>1</number></var>
<var name='b'><number>5.5</number></var><var name='c'><array length='3'>
<string>blue</string><string>orange</string><string>violet</string></array></var>
<var name='d'><string>colors</string></var></struct></data></wddxPacket>

User Contributed Notes

kangus at jaga dot us 13-Oct-2003 03:57
A function to use for dates with PHP & WDDX
getdate()

$ta="<FORM><TEXTAREA rows=15 cols=80>" ;
$te="</TEXTAREA></FORM>";
$packet_id=wddx_packet_start("Date Example--");
$myDate=getdate();
wddx_add_vars($packet_id,'myDate');
$package=wddx_packet_end($packet_id);
print($ta.$package.$te);

Produces:

<wddxPacket version='1.0'><header><comment>Date Example--</comment></header>
<data><struct><var name='myDate'>
<struct><var name='seconds'><number>12</number></var>
<var name='minutes'><number>55</number></var>
<var name='hours'><number>1</number></var>
<var name='mday'><number>13</number></var>
<var name='wday'><number>1</number></var>
<var name='mon'><number>10</number></var>
<var name='year'><number>2003</number></var>
<var name='yday'><number>285</number></var>
<var name='weekday'><string>Monday</string></var>
<var name='month'><string>October</string></var>
<var name='0'><number>1066031712</number>
</var></struct></var></struct></data></wddxPacket>
tychay at alumni dot caltech dot edu 31-Mar-2002 12:15
The above feature will cause a slight trouble since the name of the variable will always be "wddxtemp" but you can use preg_replace to fix that.

Also, a better approach is to serialize the entire class. WDDX will that write a reserved "php_class_name" variable which can be used to reconstruct the class during a deserialize.
tychay at alumni dot caltech dot edu 30-Mar-2002 10:49
You can use globals to get around the above in classes:

<?php
class Test
{
  var $str;
  var $wddx;

  function Test()
  {
    $this->str = "test";
    $this->wddx_serialize($this->str);
    header('Content-Type: text/xml');
    echo ($this->wddx);
  }

  function wddx_serialize($var) {
    global $wddxtemp;
    unset($wddxtemp);
    $wddxtemp = $var;
    $this->wddx = wddx_serialize_vars("wddxtemp");
  }
}

new Test();
?>
-terry
tychay at alumni dot caltech dot edu 30-Mar-2002 10:45
You can use globals to get around the above in classes:

<?php
class Test
{
  var $str;
  var $wddx;

  function Test()
  {
    $this->str = "test";
    $this->wddx_serialize($this->str);
    header('Content-Type: text/xml');
    echo ($this->wddx);
  }

  function wddx_serialize($var) {
    global $wddxtemp;
    unset($wddxtemp);
    $wddxtemp = $var;
    $this->wddx = wddx_serialize_vars("wddxtemp");
  }
}

new Test();
?>
-terry
christian dot knoflach at gmx dot at 21-May-2001 03:56
Be careful using WDDX - functions on object variables. As I just had to find out the following won't work:

<?php
class Test
{
  var $str;
  var $wddx;

  function Test()
  {
    $this->str = "test";
    $this->wddx = wddx_serialize_vars("this->str");
    print(htmlentities($this->wddx));
  }
}

new Test();
?>

That's what you'll get:
<wddxPacket version='1.0'><header/><data><struct></struct></data></wddxPacket>


XML : Différence et fusion

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
  • XMLDiff\Base — La classe XMLDiff\Base
    • XMLDiff\Base::__construct — Constructeur
    • XMLDiff\Base::diff — Produit la différence de deux documents XML
    • XMLDiff\Base::merge — Produit un nouveau document XML basé sur une différence
  • XMLDiff\DOM — La classe XMLDiff\DOM
    • XMLDiff\DOM::diff — Trouve la différence de deux objets DOMDocument
    • XMLDiff\DOM::merge — Produit un DOMDocument fusionné
  • XMLDiff\Memory — La classe XMLDiff\Memory
    • XMLDiff\Memory::diff — Différence entre deux documents XML
    • XMLDiff\Memory::merge — Fusionne un document XML
  • XMLDiff\File — La classe XMLDiff\File
    • XMLDiff\File::diff — Effectue la différence entre deux documents XML
    • XMLDiff\File::merge — Fusionne un document XML

User Contributed Notes

There are no user contributed notes for this page.


Introduction

L'extension est capable de produire la différence de deux documents XML, puis d'appliquer la différence au document source. La différence est un document XML contenant les copies/insertions/suppressions dans un format humainement lisible. Les objets DOMDocument, les fichiers locaux, et les chaînes de caractères en mémoire peuvent être utilisés.

User Contributed Notes

There are no user contributed notes for this page.


Pré-requis

libdiffmark - version 0.10 est comprise dans l'extension. Si diffmark est disponible pour votre système de paquets, son utilisation est fortement encouragée.

extension libxml

extension DOM

User Contributed Notes

There are no user contributed notes for this page.


Installation

Cette extension » PECL n'est pas intégrée à PHP.

Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » https://pecl.php.net/package/xmldiff.

Une bibliothèque DLL pour cette extension PECL est disponible sur » http://windows.php.net/downloads/pecl/releases/xmldiff/.

User Contributed Notes

There are no user contributed notes for this page.


La classe XMLDiff\Base

(PECL xmldiff >= 0.8.0)

Introduction

Classe abstraite de base pour toutes les classes de comparaison de cette extension.

Synopsis de la classe

XMLDiff\Base {
/* Méthodes */
public __construct ( string $nsname )
abstract public diff ( mixed $from , mixed $to ) : mixed
abstract public merge ( mixed $src , mixed $diff ) : mixed
}

Sommaire

  • XMLDiff\Base::__construct — Constructeur
  • XMLDiff\Base::diff — Produit la différence de deux documents XML
  • XMLDiff\Base::merge — Produit un nouveau document XML basé sur une différence

User Contributed Notes

There are no user contributed notes for this page.


Constructeur

  • « XMLDiff\Base
  • XMLDiff\Base::diff »
  • PHP Manual
  • XMLDiff\Base
  • Constructeur

XMLDiff\Base::__construct

(PECL xmldiff >= 0.8.0)

XMLDiff\Base::__construct — Constructeur

Description

public XMLDiff\Base::__construct ( string $nsname )

Constructeur de base pour toutes les classes de l'extension xmldiff.

Liste de paramètres

nsname

Espace de noms personnalisé pour le document de différence. L'espace de noms par défaut est http://www.locus.cz/diffmark et est suffisant pour éviter les conflits d'espaces de noms. Utilisez ce paramètre si vous voulez changer d'espace de noms.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Produit la différence de deux documents XML

  • « XMLDiff\Base::__construct
  • XMLDiff\Base::merge »
  • PHP Manual
  • XMLDiff\Base
  • Produit la différence de deux documents XML

XMLDiff\Base::diff

(PECL xmldiff >= 0.8.0)

XMLDiff\Base::diff — Produit la différence de deux documents XML

Description

abstract public XMLDiff\Base::diff ( mixed $from , mixed $to ) : mixed

Méthode abstraire de création de différence à implémenter par héritage de la classe.

Le but premier de cette méthode est de produire la différence de deux documents. L'ordre des paramètres est important, et va produire une sortie différente.

Liste de paramètres

from

Document XML source.

to

Document XML cible.

Valeurs de retour

Dépend de l'implémentation.

User Contributed Notes

There are no user contributed notes for this page.


Produit un nouveau document XML basé sur une différence

  • « XMLDiff\Base::diff
  • XMLDiff\DOM »
  • PHP Manual
  • XMLDiff\Base
  • Produit un nouveau document XML basé sur une différence

XMLDiff\Base::merge

(PECL xmldiff >= 0.8.0)

XMLDiff\Base::merge — Produit un nouveau document XML basé sur une différence

Description

abstract public XMLDiff\Base::merge ( mixed $src , mixed $diff ) : mixed

Méthode abstraite de fusion à implémenter par héritage de la classe.

Basiquement, le but de cette méthode est de produire un nouveau document XML basé sur les informations de différence.

Liste de paramètres

src

Document XML source.

diff

Document produit par la méthode de création de différence.

Valeurs de retour

Dépend de l'implémentation.

User Contributed Notes

There are no user contributed notes for this page.


La classe XMLDiff\DOM

(PECL xmldiff >= 0.8.0)

Introduction

Synopsis de la classe

XMLDiff\DOM extends XMLDiff\Base {
/* Méthodes */
public diff ( DOMDocument $from , DOMDocument $to ) : DOMDocument
public merge ( DOMDocument $src , DOMDocument $diff ) : DOMDocument
/* Méthodes héritées */
public XMLDiff\Base::__construct ( string $nsname )
abstract public XMLDiff\Base::diff ( mixed $from , mixed $to ) : mixed
abstract public XMLDiff\Base::merge ( mixed $src , mixed $diff ) : mixed
}

Sommaire

  • XMLDiff\DOM::diff — Trouve la différence de deux objets DOMDocument
  • XMLDiff\DOM::merge — Produit un DOMDocument fusionné

User Contributed Notes

There are no user contributed notes for this page.


Trouve la différence de deux objets DOMDocument

  • « XMLDiff\DOM
  • XMLDiff\DOM::merge »
  • PHP Manual
  • XMLDiff\DOM
  • Trouve la différence de deux objets DOMDocument

XMLDiff\DOM::diff

(PECL xmldiff >= 0.8.0)

XMLDiff\DOM::diff — Trouve la différence de deux objets DOMDocument

Description

public XMLDiff\DOM::diff ( DOMDocument $from , DOMDocument $to ) : DOMDocument

Trouve la différence de deux instances DOMDocument et produit un nouvel objet DOMDocument contenant les informations de différence.

Liste de paramètres

from

Objet source DOMDocument.

to

Objet cible DOMDocument.

Valeurs de retour

Un nouvel objet DOMDocument contenant les informations de différence ou NULL.

User Contributed Notes

jeewiya at gmail dot com 28-Mar-2018 10:43
XMLDiff\DOM can be use like this, for compare xml files changes.

<?php

function getChangeElements($currentContent, $oldContent) {
        try {
            $currentDoc = new DOMDocument();
            $currentDoc->loadXML($currentContent);

            $oldDoc = new DOMDocument();
            $oldDoc->loadXML($oldContent);
            $xmldiff = new XMLDiff\DOM();
            return $xmldiff->diff($oldDoc, $currentDoc);
        } catch (Exception $ex) {
            throw $ex;
        }
    }

getChangeElements('updated.xml', 'old.xml');

?>


Produit un DOMDocument fusionné

  • « XMLDiff\DOM::diff
  • XMLDiff\Memory »
  • PHP Manual
  • XMLDiff\DOM
  • Produit un DOMDocument fusionné

XMLDiff\DOM::merge

(PECL xmldiff >= 0.8.0)

XMLDiff\DOM::merge — Produit un DOMDocument fusionné

Description

public XMLDiff\DOM::merge ( DOMDocument $src , DOMDocument $diff ) : DOMDocument

Crée un nouveau DOMDocument basé sur une différence.

Liste de paramètres

src

Objet DOMDocument source.

diff

L'objet DOMDocument contenant les informations de différence.

Valeurs de retour

DOMDocument fusionné ou NULL.

User Contributed Notes

There are no user contributed notes for this page.


La classe XMLDiff\Memory

(PECL xmldiff >= 0.8.0)

Introduction

Synopsis de la classe

XMLDiff\Memory extends XMLDiff\Base {
/* Méthodes */
public diff ( string $from , string $to ) : string
public merge ( string $src , string $diff ) : string
/* Méthodes héritées */
public XMLDiff\Base::__construct ( string $nsname )
abstract public XMLDiff\Base::diff ( mixed $from , mixed $to ) : mixed
abstract public XMLDiff\Base::merge ( mixed $src , mixed $diff ) : mixed
}

Sommaire

  • XMLDiff\Memory::diff — Différence entre deux documents XML
  • XMLDiff\Memory::merge — Fusionne un document XML

User Contributed Notes

There are no user contributed notes for this page.


Différence entre deux documents XML

  • « XMLDiff\Memory
  • XMLDiff\Memory::merge »
  • PHP Manual
  • XMLDiff\Memory
  • Différence entre deux documents XML

XMLDiff\Memory::diff

(PECL xmldiff >= 0.8.0)

XMLDiff\Memory::diff — Différence entre deux documents XML

Description

public XMLDiff\Memory::diff ( string $from , string $to ) : string

Effectue la différence de deux chaînes contenant des documents XML et produit les informations de différence.

Liste de paramètres

from

Document XML source.

to

Document XML cible.

Valeurs de retour

Une chaîne contenant la différence entre les deux documents XML ou NULL.

User Contributed Notes

There are no user contributed notes for this page.


Fusionne un document XML

  • « XMLDiff\Memory::diff
  • XMLDiff\File »
  • PHP Manual
  • XMLDiff\Memory
  • Fusionne un document XML

XMLDiff\Memory::merge

(PECL xmldiff >= 0.8.0)

XMLDiff\Memory::merge — Fusionne un document XML

Description

public XMLDiff\Memory::merge ( string $src , string $diff ) : string

Crée un nouveau document XML basé sur les différences et le document source.

Liste de paramètres

src

Document XML source.

diff

Document XML contenant les informations de différence.

Valeurs de retour

Une chaîne contenant le nouveau document XML ou NULL.

User Contributed Notes

There are no user contributed notes for this page.


La classe XMLDiff\File

(PECL xmldiff >= 0.8.0)

Introduction

Synopsis de la classe

XMLDiff\File extends XMLDiff\Base {
/* Méthodes */
public diff ( string $from , string $to ) : string
public merge ( string $src , string $diff ) : string
/* Méthodes héritées */
public XMLDiff\Base::__construct ( string $nsname )
abstract public XMLDiff\Base::diff ( mixed $from , mixed $to ) : mixed
abstract public XMLDiff\Base::merge ( mixed $src , mixed $diff ) : mixed
}

Sommaire

  • XMLDiff\File::diff — Effectue la différence entre deux documents XML
  • XMLDiff\File::merge — Fusionne un document XML

User Contributed Notes

ngbabu at gmail dot com 21-Nov-2015 08:45
The following snippet will show the use case of XMLDiff\File.

<?php
$dxml=new XMLDiff\File;
$diff = $dxml->diff("file1.xml", "file2.xml");
$difffile = 'difference.xml';
file_put_contents($difffile, $diff);
?>


Effectue la différence entre deux documents XML

  • « XMLDiff\File
  • XMLDiff\File::merge »
  • PHP Manual
  • XMLDiff\File
  • Effectue la différence entre deux documents XML

XMLDiff\File::diff

(PECL xmldiff >= 0.8.0)

XMLDiff\File::diff — Effectue la différence entre deux documents XML

Description

public XMLDiff\File::diff ( string $from , string $to ) : string

Effectue la différence entre deux documents XML locaux, et produit une chaîne contenant les informations de différence.

Liste de paramètres

from

Chemin vers le document source.

to

Chemin vers le document cible.

Valeurs de retour

Une chaîne contenant la différence des deux documents XML ou NULL.

User Contributed Notes

There are no user contributed notes for this page.


Fusionne un document XML

  • « XMLDiff\File::diff
  • Analyseur syntaxique XML »
  • PHP Manual
  • XMLDiff\File
  • Fusionne un document XML

XMLDiff\File::merge

(PECL xmldiff >= 0.8.0)

XMLDiff\File::merge — Fusionne un document XML

Description

public XMLDiff\File::merge ( string $src , string $diff ) : string

Crée un document XML basé sur des différences et sur le document source.

Liste de paramètres

src

Chemin vers le document XML source.

diff

Chemin vers le document XML contenant les informations de différence.

Valeurs de retour

Une chaîne de caractères représentant le nouveau document XML ou NULL.

User Contributed Notes

There are no user contributed notes for this page.


Analyseur syntaxique XML

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • gestionnaires d'événements
  • Problèmes de casse
  • Codes d'erreurs
  • Codage des caractères
  • Exemples
    • Exemple de structure XML
    • Transtypage XML -> HTML
    • Entité externe
  • Fonctions d'analyse de fichier XML
    • utf8_decode — Convertit une chaîne UTF-8 en ISO-8859-1
    • utf8_encode — Convertit une chaîne ISO-8859-1 en UTF-8
    • xml_error_string — Lit le message d'erreur de l'analyseur XML
    • xml_get_current_byte_index — Retourne l'index de l'octet courant d'un analyseur XML
    • xml_get_current_column_number — Retourne le numéro de colonne courant d'un analyseur XML
    • xml_get_current_line_number — Retourne le numéro de ligne courant d'un analyseur XML
    • xml_get_error_code — Récupère le code erreur de l'analyseur XML
    • xml_parse_into_struct — Analyse une structure XML
    • xml_parse — Commence l'analyse d'un document XML
    • xml_parser_create_ns — Crée un analyseur XML
    • xml_parser_create — Création d'un analyseur XML
    • xml_parser_free — Détruit un analyseur XML
    • xml_parser_get_option — Lit les options d'un analyseur XML
    • xml_parser_set_option — Affecte les options d'un analyseur XML
    • xml_set_character_data_handler — Affecte les gestionnaires de texte littéral
    • xml_set_default_handler — Affecte le gestionnaire XML par défaut
    • xml_set_element_handler — Affecte les gestionnaires de début et de fin de balise XML
    • xml_set_end_namespace_decl_handler — Configure le gestionnaire XML de données
    • xml_set_external_entity_ref_handler — Configure le gestionnaire XML de références externes
    • xml_set_notation_decl_handler — Configure le gestionnaire XML de notations
    • xml_set_object — Configure un objet comme analyseur XML
    • xml_set_processing_instruction_handler — Affecte les gestionnaires d'instructions exécutables
    • xml_set_start_namespace_decl_handler — Configure le gestionnaire de caractères
    • xml_set_unparsed_entity_decl_handler — Affecte les gestionnaires d'entités non déclarées
  • XmlParser — The XmlParser class

User Contributed Notes

marcgear at gmail dot com 04-Aug-2010 10:12
While this SAX event based parser is better for memory management than the tree based parsers of SimpleXML and DOM, the pull-based parser XMLReader is much easier to use than the xml_parser_* functions, and still doesn't require loading the file into memory.


Introduction

Le langage XML (eXtensible Markup Language (Langage à Balises Extensible)) est un format structuré de données pour les échanges sur le web. C'est un standard défini par le consortium World Wide Web (W3C). Plus d'informations à propos du XML et des technologies afférentes sont accessibles (en anglais) » http://www.w3.org/XML/.

Cette extension PHP implémente la bibliothèque expat de James Clark sous PHP. Cela vous permettra d'analyser mais pas de valider les documents XML. Ce langage supporte trois types de jeux de caractères différents, disponibles aussi sous PHP : US-ASCII, ISO-8859-1 et UTF-8. UTF-16 n'est pas supporté.

Cette extension vous permet de créer des analyseurs XML puis de définir des gestionnaires pour chaque événement XML. Les analyseurs XML disposent de quelques paramètres que vous pouvez régler.

User Contributed Notes

There are no user contributed notes for this page.


Pré-requis

Cette extension requière l'extension PHP libxml. Ceci signifie passer l'option de configuration --with-libxml, ou antérieur à PHP 7.4 l'option de configuration --enable-libxml, bien que ceci est accomplie implicitement car libxml est activé par défaut.

Cette extension PHP utilise expat compat layer par défaut. Elle peut aussi utiliser expat, qui est disponible sur » http://www.jclark.com/xml/expat.html. Le fichier Makefile livré avec expat ne construit pas par défaut de bibliothèque : il faut utiliser la ligne suivante :

libexpat.a: $(OBJS)
    ar -rc $@ $(OBJS)
    ranlib $@
Un paquet RPM source de expat est disponible sur » http://sourceforge.net/projects/expat/.

User Contributed Notes

There are no user contributed notes for this page.


Installation

Cette extension est activée par défaut. Elle peut être désactivée en utilisant l'option de configuration : --disable-xml

Ces fonctions sont activées par défaut, et utilisent la bibliothèque expat fournie avec la distribution. Vous pouvez désactiver le support de XML en utilisant l'option de compilation --disable-xml. Si vous compilez PHP comme module pour Apache 1.3.9 ou supérieur, PHP va automatiquement utiliser la bibliothèque expat fournie par Apache. Si vous ne souhaitez pas utiliser la bibliothèque expat intégrée, il faut que vous compiliez PHP avec l'option --with-expat-dir=DIR, où DIR est le dossier d'installation de votre bibliothèque expat.

La version Windows de PHP dispose du support automatique de cette extension. Vous n'avez pas à ajouter de bibliothèque supplémentaire pour disposer de ces fonctions.

User Contributed Notes

Alex Ivaylov 15-Feb-2018 09:03
Ubuntu users, please note that this extension might not enabled for you by default. You may need to install by doing "sudo apt-get install php-xml" followed by web server restart.


Types de ressources

Antérieur à PHP 8.0.0, la ressource xml est retournée par xml_parser_create() et xml_parser_create_ns(), et représente un analyseur XML à utiliser avec les autres fonctions de cette extension.

User Contributed Notes

There are no user contributed notes for this page.


Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

XML_ERROR_NONE (entier)
XML_ERROR_NO_MEMORY (entier)
XML_ERROR_SYNTAX (entier)
XML_ERROR_NO_ELEMENTS (entier)
XML_ERROR_INVALID_TOKEN (entier)
XML_ERROR_UNCLOSED_TOKEN (entier)
XML_ERROR_PARTIAL_CHAR (entier)
XML_ERROR_TAG_MISMATCH (entier)
XML_ERROR_DUPLICATE_ATTRIBUTE (entier)
XML_ERROR_JUNK_AFTER_DOC_ELEMENT (entier)
XML_ERROR_PARAM_ENTITY_REF (entier)
XML_ERROR_UNDEFINED_ENTITY (entier)
XML_ERROR_RECURSIVE_ENTITY_REF (entier)
XML_ERROR_ASYNC_ENTITY (entier)
XML_ERROR_BAD_CHAR_REF (entier)
XML_ERROR_BINARY_ENTITY_REF (entier)
XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF (entier)
XML_ERROR_MISPLACED_XML_PI (entier)
XML_ERROR_UNKNOWN_ENCODING (entier)
XML_ERROR_INCORRECT_ENCODING (entier)
XML_ERROR_UNCLOSED_CDATA_SECTION (entier)
XML_ERROR_EXTERNAL_ENTITY_HANDLING (entier)
XML_OPTION_CASE_FOLDING (entier)
XML_OPTION_TARGET_ENCODING (entier)
XML_OPTION_SKIP_TAGSTART (entier)
XML_OPTION_SKIP_WHITE (entier)
XML_SAX_IMPL (chaîne de caractères)
Précise la méthode d'implémentation de SAX. Peut être libxml ou expat.

User Contributed Notes

There are no user contributed notes for this page.


gestionnaires d'événements

Les gestionnaires d'événements XML sont :

Les gestionnaires d'événements XML supportés
Fonction PHP de configuration du gestionnaire | Description de l'événement
xml_set_element_handler() | Un événement est généré à chaque fois que l'analyseur XML rencontre une balise de début ou de fin. Deux gestionnaires sont disponibles : un pour le début, et un pour la fin.
xml_set_character_data_handler() | "Character data" correspond grosso modo à tout ce qui n'est pas une balise XML, y compris les espaces entre les balises. Notez bien que l'analyseur XML n'ajoute ou n'efface aucun espace, et que c'est à l'application (c'est-à-dire vous) de décider de la signification de ces espaces.
xml_set_processing_instruction_handler() | Les programmeurs PHP sont habitués aux instructions exécutables (processing instructions ou PIs). <?php ?> est une instruction exécutable où php est appelé programme cible. Ces instructions sont gérées de manière spécifique, (sauf le programme cible "XML" qui est réservé).
xml_set_default_handler() | Tout ce qui n'a pas trouvé de gestionnaire est transmis au gestionnaire par défaut. Vous retrouverez par exemple, les déclarations de type de document dans ce gestionnaire.
xml_set_unparsed_entity_decl_handler() | Ce gestionnaire est appelé pour gérer les déclaration des entités non analysées (NDATA).
xml_set_notation_decl_handler() | Ce gestionnaire est appelé pour déclarer les notations.
xml_set_external_entity_ref_handler() | Ce gestionnaire est appelé lorsque l'analyseur XML trouve une référence à une entité générale externe. Cela peut être une référence à un fichier ou à une URL. Reportez-vous à entité externe pour un exemple.
xml_set_start_namespace_decl_handler() | Ce gestionnaire est appelé pour le début de la déclaration d'un espace de noms.
xml_set_end_namespace_decl_handler() | Ce gestionnaire est appelé pour la déclaration de fin d'espace de noms. Notez que cet évennement n'est pas déclenché de LibXML.

User Contributed Notes

There are no user contributed notes for this page.


Problèmes de casse

Les fonctions de gestion des balises peuvent rencontrer des balises en minuscule, majuscule ou encore dans un mélange des deux. En XML, la procédure standard est d'"identifier les séquences de caractères qui ne sont pas reconnues comme majuscule, et de les remplacer par leur équivalent majuscule". C'est le case-folding, en anglais. En bref, XML met toutes les lettres en majuscules.

Par défaut, tous les noms des éléments qui sont transmis aux fonctions de gestion sont mis en majuscules. Ce comportement est contrôlé par l'analyseur XML, et peut être lu et modifié avec les fonctions respectives xml_parser_get_option() et xml_parser_set_option().

User Contributed Notes

There are no user contributed notes for this page.


Codes d'erreurs

Les constantes suivantes sont définies comme des codes d'erreurs XML : (retournées par xml_parse())

  • XML_ERROR_NONE
  • XML_ERROR_NO_MEMORY
  • XML_ERROR_SYNTAX
  • XML_ERROR_NO_ELEMENTS
  • XML_ERROR_INVALID_TOKEN
  • XML_ERROR_UNCLOSED_TOKEN
  • XML_ERROR_PARTIAL_CHAR
  • XML_ERROR_TAG_MISMATCH
  • XML_ERROR_DUPLICATE_ATTRIBUTE
  • XML_ERROR_JUNK_AFTER_DOC_ELEMENT
  • XML_ERROR_PARAM_ENTITY_REF
  • XML_ERROR_UNDEFINED_ENTITY
  • XML_ERROR_RECURSIVE_ENTITY_REF
  • XML_ERROR_ASYNC_ENTITY
  • XML_ERROR_BAD_CHAR_REF
  • XML_ERROR_BINARY_ENTITY_REF
  • XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF
  • XML_ERROR_MISPLACED_XML_PI
  • XML_ERROR_UNKNOWN_ENCODING
  • XML_ERROR_INCORRECT_ENCODING
  • XML_ERROR_UNCLOSED_CDATA_SECTION
  • XML_ERROR_EXTERNAL_ENTITY_HANDLING

User Contributed Notes

Teet 24-May-2019 02:04
If you wonder, what values those constant have, here you go:

<?php
XML_ERROR_NONE = 0
XML_ERROR_NO_MEMORY = 1
XML_ERROR_SYNTAX = 2
XML_ERROR_NO_ELEMENTS = 3
XML_ERROR_INVALID_TOKEN = 4
XML_ERROR_UNCLOSED_TOKEN = 5
XML_ERROR_PARTIAL_CHAR = 6
XML_ERROR_TAG_MISMATCH = 7
XML_ERROR_DUPLICATE_ATTRIBUTE = 8
XML_ERROR_JUNK_AFTER_DOC_ELEMENT = 9
XML_ERROR_PARAM_ENTITY_REF = 10
XML_ERROR_UNDEFINED_ENTITY = 11
XML_ERROR_RECURSIVE_ENTITY_REF = 12
XML_ERROR_ASYNC_ENTITY = 13
XML_ERROR_BAD_CHAR_REF = 14
XML_ERROR_BINARY_ENTITY_REF = 15
XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF = 16
XML_ERROR_MISPLACED_XML_PI = 17
XML_ERROR_UNKNOWN_ENCODING = 18
XML_ERROR_INCORRECT_ENCODING = 19
XML_ERROR_UNCLOSED_CDATA_SECTION = 20
XML_ERROR_EXTERNAL_ENTITY_HANDLING = 21
?>


Codage des caractères

L'extension XML de PHP supporte les caractères » Unicode grâce à différents codages. Il y a deux types de codages de caractères : le codage à la source et le codage à la cible. PHP utilise le UTF-8 comme représentation interne.

L'encodage à la source est effectué lors de l'analyse du fichier par XML. Lors de la création d'un analyseur XML), un type de codage à la source peut être spécifié (et il ne pourra plus être modifié jusqu'à la destruction de l'analyseur). Les codages supportés sont : ISO-8859-1, US-ASCII et UTF-8. Les deux derniers sont des codages à un seul octet, c'est-à-dire que les caractères sont représentés sur un seul octet. UTF-8 peut représenter des caractères composés par un nombre variable de bits (jusqu'à 21), allant de 1 à quatre octets. Le codage par défaut utilisé par PHP ISO-8859-1.

Le codage à la cible est effectué lorsque PHP transfert les données aux gestionnaires XML. Lorsqu'un analyseur est créé, le codage à la cible est spécifié de la même façon que le codage à la source, mais il peut être modifié à tout moment. Le codage à la cible affectera les balises, tout comme les données brutes, et les noms des instructions exécutables.

Si l'analyseur XML rencontre un caractère qu'il ne connaît pas (hors limite, par exemple), il retournera une erreur.

Si PHP rencontre un caractère dans le document XML analysé, qu'il ne peut pas représenter dans le codage à la cible choisi, le caractère sera remplacé par un point d'interrogation (cette attitude est susceptible de changer ultérieurement).

User Contributed Notes

There are no user contributed notes for this page.


Exemples

Sommaire

  • Exemple de structure XML
  • Transtypage XML -> HTML
  • Entité externe

User Contributed Notes

There are no user contributed notes for this page.


Exemple de structure XML

Ce premier exemple affiche la structure de l'élément de début dans un document avec indentation.

Exemple #1 Afficher une structure XML

<?php
$file = "data.xml";
$depth = array();

function startElement($parser, $name, $attrs)
{
    global $depth;

    if (!isset($depth[$parser])) {
        $depth[$parser] = 0;
    }

    for ($i = 0; $i < $depth[$parser]; $i++) {
        echo "  ";
    }
    echo "$name\n";
    $depth[$parser]++;
}

function endElement($parser, $name)
{
    global $depth;
    $depth[$parser]--;
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);
?>

User Contributed Notes

Sample at hotmail dot com 04-Jul-2013 10:32
<?php

public static function xml2array($element, $arr = array())
    {
        if(is_string($element))
        {
            $element = (strlen($element) > 5 && substr($element, -4) === '.xml')
                            ? simplexml_load_file(DATAPATH.$element)
                            : simplexml_load_string($element);
        }
         $iter = 0;
        foreach($element->children() as $b)
        {
            $a = $b->getName();
            if(!$b->children()){
                    $arr[$a] = trim($b[0]);
            }
            else{
                    $arr[$a][$iter] = array();
                    $arr[$a][$iter] = self::xml2array($b,$arr[$a][$iter]);
            }
                $iter++;
        }
        return $arr;
    }
}

?>
roan at horning dot us 30-Oct-2009 09:07
The following example will echo back an xml file using the basic event based parser.  Currently, (at least in the version of PHP5 I'm using) it will skip The XML declaration and the Doctype declaration--they don't seem to be captured by the default handler.

<?php
echo "<pre>";

$file = "test.xml";
echo $file."\n";
global $inTag;

$inTag = "";
$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, 1);
xml_set_processing_instruction_handler($xml_parser, "pi_handler");
xml_set_default_handler($xml_parser, "parseDEFAULT");
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "contents");

if (!($fp = fopen($file, "r"))) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
       die( sprintf("XML error: %s at line %d",
                            xml_error_string(xml_get_error_code($xml_parser)),
                            xml_get_current_line_number($xml_parser)));
    }
}
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
       die( sprintf("XML error: %s at line %d",
                            xml_error_string(xml_get_error_code($xml_parser)),
                            xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);

function startElement($parser, $name, $attrs) {

    global $inTag;
    global $depth;

    $padTag = str_repeat(str_pad(" ", 3), $depth);

    if (!($inTag == "")) {
        echo "&gt;";
    }
    echo "\n$padTag&lt;$name";
    foreach ($attrs as $key => $value) {
        echo "\n$padTag".str_pad(" ", 3);
        echo " $key=\"$value\"";
    }
    $inTag = $name;
    $depth++;
}

function endElement($parser, $name) {

    global $depth;
   global $inTag;
    global $closeTag;

    $depth--;

   if ($closeTag == TRUE) {
       echo "&lt/$name&gt;";
       $inTag = "";
   } elseif ($inTag == $name) {
       echo " /&gt;";
       $inTag = "";
   } else {
         $padTag = str_repeat(str_pad(" ", 3), $depth);
       echo "\n$padTag&lt/$name&gt;";
    }
}

function contents($parser, $data) {

    global $closeTag;

    $data = preg_replace("/^\s+/", "", $data);
    $data = preg_replace("/\s+$/", "", $data);

    if (!($data == ""))  {
        echo "&gt;$data";
        $closeTag = TRUE;
    } else {
        $closeTag = FALSE;
     }
}

function parseDEFAULT($parser, $data) {

    $data = preg_replace("/</", "&lt;", $data);
    $data = preg_replace("/>/", "&gt;", $data);
    echo $data;
}

function pi_handler($parser, $target, $data) {

    echo "&lt;?$target $data?&gt;\n";
}
echo "</pre>";
?>


Transtypage XML -> HTML

Exemple #1 Transtypage XML -> HTML

Cet exemple remplace les balises XML d'un document par des balises HTML. Les éléments inconnus seront ignorés. Bien entendu, cet exemple sera appliqué à un type précis de fichiers XML.

<?php
$file = "data.xml";
$map_array = array(
    "BOLD"     => "B",
    "EMPHASIS" => "I",
    "LITERAL"  => "TT"
);

function startElement($parser, $name, $attrs)
{
    global $map_array;
    if (isset($map_array[$name])) {
        echo "<$map_array[$name]>";
    }
}

function endElement($parser, $name)
{
    global $map_array;
    if (isset($map_array[$name])) {
        echo "</$map_array[$name]>";
    }
}

function characterData($parser, $data)
{
    echo $data;
}

$xml_parser = xml_parser_create();
// Utilisons la gestion de casse, de manière à être sûrs de trouver la balise dans $map_array
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("Erreur XML: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);
?>

User Contributed Notes

There are no user contributed notes for this page.


Entité externe

Cet exemple exploite les références externes de XML : il est possible d'utiliser un gestionnaire d'entité externe pour inclure et analyser les documents, tous comme les instructions exécutables peuvent servir à inclure et analyser d'autres documents, et aussi fournir une indication de confiance (voir plus bas).

Le document XML qui est utilisé dans cet exemple est fourni plus loin dans l'exemple (xmltest.xml et xmltest2.xml).

Exemple #1 Entité externe

<?php
$file = "xmltest.xml";

function trustedFile($file)
{
    // faites seulement confiance aux fichiers locaux dont vous êtes le propriétaire
    if (!preg_match("@^([a-z][a-z0-9+.-]*)\:\/\/@i", $file)
        && fileowner($file) == getmyuid()) {
            return true;
    }
    return false;
}

function startElement($parser, $name, $attribs)
{
    echo "&lt;<font color=\"#0000cc\">$name</font>";
    if (count($attribs)) {
        foreach ($attribs as $k => $v) {
            echo " <font color=\"#009900\">$k</font>=\"<font
                   color=\"#990000\">$v</font>\"";
        }
    }
    echo "&gt;";
}

function endElement($parser, $name)
{
    echo "&lt;/<font color=\"#0000cc\">$name</font>&gt;";
}

function characterData($parser, $data)
{
    echo "<b>$data</b>";
}

function PIHandler($parser, $target, $data)
{
    switch (strtolower($target)) {
        case "php":
            global $parser_file;
            // si le document analysé est de confiance, nous déclarons qu'il est sûr
            // d'exécuter le code PHP qu'il contient. Si ce n'est pas le cas, le code est affiché
            // à la place.
            if (trustedFile($parser_file[$parser])) {
                eval($data);
            } else {
                printf("Untrusted PHP code: <i>%s</i>",
                        htmlspecialchars($data));
            }
            break;
    }
}

function defaultHandler($parser, $data)
{
    if (substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {
        printf('<font color="#aa00aa">%s</font>',
                htmlspecialchars($data));
    } else {
        printf('<font size="-1">%s</font>',
                htmlspecialchars($data));
    }
}

function externalEntityRefHandler($parser, $openEntityNames, $base, $systemId,
                                  $publicId) {
    if ($systemId) {
        if (!list($parser, $fp) = new_xml_parser($systemId)) {
            printf("Could not open entity %s at %s\n", $openEntityNames,
                   $systemId);
            return false;
        }
        while ($data = fread($fp, 4096)) {
            if (!xml_parse($parser, $data, feof($fp))) {
                printf("XML error: %s at line %d while parsing entity %s\n",
                       xml_error_string(xml_get_error_code($parser)),
                       xml_get_current_line_number($parser), $openEntityNames);
                xml_parser_free($parser);
                return false;
            }
        }
        xml_parser_free($parser);
        return true;
    }
    return false;
}

function new_xml_parser($file)
{
    global $parser_file;

    $xml_parser = xml_parser_create();
    xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 1);
    xml_set_element_handler($xml_parser, "startElement", "endElement");
    xml_set_character_data_handler($xml_parser, "characterData");
    xml_set_processing_instruction_handler($xml_parser, "PIHandler");
    xml_set_default_handler($xml_parser, "defaultHandler");
    xml_set_external_entity_ref_handler($xml_parser, "externalEntityRefHandler");

    if (!($fp = @fopen($file, "r"))) {
        return false;
    }
    if (!is_array($parser_file)) {
        settype($parser_file, "array");
    }
    $parser_file[$xml_parser] = $file;
    return array($xml_parser, $fp);
}

if (!(list($xml_parser, $fp) = new_xml_parser($file))) {
    die("could not open XML input");
}

echo "<pre>";
while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d\n",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
echo "</pre>";
echo "parse complete\n";
xml_parser_free($xml_parser);

?>

Exemple #2 xmltest.xml

<?xml version='1.0'?>
<!DOCTYPE chapter SYSTEM "/just/a/test.dtd" [
<!ENTITY plainEntity "FOO entity">
<!ENTITY systemEntity SYSTEM "xmltest2.xml">
]>
<chapter>
 <TITLE>Title &plainEntity;</TITLE>
 <para>
  <informaltable>
   <tgroup cols="3">
    <tbody>
     <row><entry>a1</entry><entry morerows="1">b1</entry><entry>c1</entry></row>
     <row><entry>a2</entry><entry>c2</entry></row>
     <row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row>
    </tbody>
   </tgroup>
  </informaltable>
 </para>
 &systemEntity;
 <section id="about">
  <title>About this Document</title>
  <para>
   <!-- this is a comment -->
   <?php echo 'Hi!  This is PHP version ' . phpversion(); ?>
  </para>
 </section>
</chapter>

Ce fichier est inclus depuis xmltest.xml :

Exemple #3 xmltest2.xml

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY testEnt "test entity">
]>
<foo>
   <element attrib="value"/>
   &testEnt;
   <?php echo "Ceci est du code PHP qui est exécuté."; ?>
</foo>

User Contributed Notes

There are no user contributed notes for this page.


Fonctions d'analyse de fichier XML

Sommaire

  • utf8_decode — Convertit une chaîne UTF-8 en ISO-8859-1
  • utf8_encode — Convertit une chaîne ISO-8859-1 en UTF-8
  • xml_error_string — Lit le message d'erreur de l'analyseur XML
  • xml_get_current_byte_index — Retourne l'index de l'octet courant d'un analyseur XML
  • xml_get_current_column_number — Retourne le numéro de colonne courant d'un analyseur XML
  • xml_get_current_line_number — Retourne le numéro de ligne courant d'un analyseur XML
  • xml_get_error_code — Récupère le code erreur de l'analyseur XML
  • xml_parse_into_struct — Analyse une structure XML
  • xml_parse — Commence l'analyse d'un document XML
  • xml_parser_create_ns — Crée un analyseur XML
  • xml_parser_create — Création d'un analyseur XML
  • xml_parser_free — Détruit un analyseur XML
  • xml_parser_get_option — Lit les options d'un analyseur XML
  • xml_parser_set_option — Affecte les options d'un analyseur XML
  • xml_set_character_data_handler — Affecte les gestionnaires de texte littéral
  • xml_set_default_handler — Affecte le gestionnaire XML par défaut
  • xml_set_element_handler — Affecte les gestionnaires de début et de fin de balise XML
  • xml_set_end_namespace_decl_handler — Configure le gestionnaire XML de données
  • xml_set_external_entity_ref_handler — Configure le gestionnaire XML de références externes
  • xml_set_notation_decl_handler — Configure le gestionnaire XML de notations
  • xml_set_object — Configure un objet comme analyseur XML
  • xml_set_processing_instruction_handler — Affecte les gestionnaires d'instructions exécutables
  • xml_set_start_namespace_decl_handler — Configure le gestionnaire de caractères
  • xml_set_unparsed_entity_decl_handler — Affecte les gestionnaires d'entités non déclarées

User Contributed Notes

filip dot rydlo at gmail dot com 18-Apr-2017 09:28
// Fix for xmlToArrayParser  .......... hope this helps somebody. :-)

// FIXED the "MULTIPLE-CALLS to callback for one string" issue of 'cdata' in  xmlToArrayParser written by:
// Glen at ITIStudios dot ca  (2012)

  private function cdata($parser, $cdata) {
    if(isset($this->pointer['cdata'])) {      // This FIXes the issue with "INCOMPLETE STRINGS" containing html-entities
      $this->pointer['cdata'] .= $cdata;
    } else {
      $this->pointer['cdata'] = $cdata;
    }
  }
anrdaemon at freemail dot ru 10-Feb-2016 06:06
You must not, never ever use utf8_encode() and utf8_decode().
If you need multibyte conversion utility, use iconv() instead. At the very least, you will get a notification, if your string can not be converted.
utf8_* crap, like other crap of this nature, is ONLY SUPPORTING ONE CONVERSION. ISO-8859-1 <=> UTF-8.
Glen at ITIStudios dot ca 15-Aug-2013 06:42
Update: concatenate element contents in function cdata()
<?php
/**
 *  XML to Associative Array Class
 *
 *  Usage:
 *     $domObj = new xmlToArrayParser($xml);
 *     $domArr = $domObj->array;
 *
 *     if($domObj->parse_error) echo $domObj->get_xml_error();
 *     else print_r($domArr);
 *
 *     On Success:
 *     eg. $domArr['top']['element2']['attrib']['var2'] => val2
 *
 *     On Error:
 *     eg. Error Code [76] "Mismatched tag", at char 58 on line 3
 */

/**
 * Convert an xml file or string to an associative array (including the tag attributes):
 * $domObj = new xmlToArrayParser($xml);
 * $elemVal = $domObj->array['element']
 * Or:  $domArr=$domObj->array;  $elemVal = $domArr['element'].
 *
 * @version  3.0
 * @param Str $xml file/string.
 */
class xmlToArrayParser {
  /** The array created by the parser can be assigned to any variable: $anyVarArr = $domObj->array.*/
  public  $array = array();
  public  $parse_error = false;
  private $parser;
  private $pointer;

  /** Constructor: $domObj = new xmlToArrayParser($xml); */
  public function __construct($xml) {
    $this->pointer =& $this->array;
    $this->parser = xml_parser_create("UTF-8");
    xml_set_object($this->parser, $this);
    xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
    xml_set_element_handler($this->parser, "tag_open", "tag_close");
    xml_set_character_data_handler($this->parser, "cdata");
    $this->parse_error = xml_parse($this->parser, ltrim($xml))? false : true;
  }

  /** Free the parser. */
  public function __destruct() { xml_parser_free($this->parser);}

  /** Get the xml error if an an error in the xml file occured during parsing. */
  public function get_xml_error() {
    if($this->parse_error) {
      $errCode = xml_get_error_code ($this->parser);
      $thisError =  "Error Code [". $errCode ."] \"<strong style='color:red;'>" . xml_error_string($errCode)."</strong>\",
                            at char ".xml_get_current_column_number($this->parser) . "
                            on line ".xml_get_current_line_number($this->parser)."";
    }else $thisError = $this->parse_error;
    return $thisError;
  }

  private function tag_open($parser, $tag, $attributes) {
    $this->convert_to_array($tag, 'attrib');
    $idx=$this->convert_to_array($tag, 'cdata');
    if(isset($idx)) {
      $this->pointer[$tag][$idx] = Array('@idx' => $idx,'@parent' => &$this->pointer);
      $this->pointer =& $this->pointer[$tag][$idx];
    }else {
      $this->pointer[$tag] = Array('@parent' => &$this->pointer);
      $this->pointer =& $this->pointer[$tag];
    }
    if (!empty($attributes)) { $this->pointer['attrib'] = $attributes; }
  }

  /** Adds the current elements content to the current pointer[cdata] array. */
  private function cdata($parser, $cdata){
    if (isset($this->pointer['cdata'])) { $this->pointer['cdata'] .= $cdata;}
    else { $this->pointer['cdata'] = $cdata; }
  }

  private function tag_close($parser, $tag) {
    $current = & $this->pointer;
    if(isset($this->pointer['@idx'])) {unset($current['@idx']);}
    $this->pointer = & $this->pointer['@parent'];
    unset($current['@parent']);
    if(isset($current['cdata']) && count($current) == 1) { $current = $current['cdata'];}
    else if(empty($current['cdata'])) {unset($current['cdata']);}
  }

  /** Converts a single element item into array(element[0]) if a second element of the same name is encountered. */
  private function convert_to_array($tag, $item) {
    if(isset($this->pointer[$tag]) && !is_array($this->pointer[$tag])){
      $content = $this->pointer[$tag];
      $this->pointer[$tag] = array((0) => $content);
      $idx = 1;
    }else if (isset($this->pointer[$tag])) {
      $idx = count($this->pointer[$tag]);
      if(!isset($this->pointer[$tag][0])) {
        foreach ($this->pointer[$tag] as $key => $value) {
            unset($this->pointer[$tag][$key]);
            $this->pointer[$tag][0][$key] = $value;
    }}}else $idx = null;
    return $idx;
  }
}
?>
Glen at ITIStudios dot ca 05-Apr-2013 07:38
Update: corrected isset() in convert_to_array() function
<?php
/**
 *  XML to Associative Array Class
 *
 *  Usage:
 *     $domObj = new xmlToArrayParser($xml);
 *     $domArr = $domObj->array;
 *
 *     if($domObj->parse_error) echo $domObj->get_xml_error();
 *     else print_r($domArr);
 *
 *     On Success:
 *     eg. $domArr['top']['element2']['attrib']['var2'] => val2
 *
 *     On Error:
 *     eg. Error Code [76] "Mismatched tag", at char 58 on line 3
 */

/**
 * Convert an xml file or string to an associative array (including the tag attributes):
 * $domObj = new xmlToArrayParser($xml);
 * $elemVal = $domObj->array['element']
 * Or:  $domArr=$domObj->array;  $elemVal = $domArr['element'].
 *
 * @version  2.0
 * @param Str $xml file/string.
 */
class xmlToArrayParser {
  /** The array created by the parser can be assigned to any variable: $anyVarArr = $domObj->array.*/
  public  $array = array();
  public  $parse_error = false;
  private $parser;
  private $pointer;

  /** Constructor: $domObj = new xmlToArrayParser($xml); */
  public function __construct($xml) {
    $this->pointer =& $this->array;
    $this->parser = xml_parser_create("UTF-8");
    xml_set_object($this->parser, $this);
    xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
    xml_set_element_handler($this->parser, "tag_open", "tag_close");
    xml_set_character_data_handler($this->parser, "cdata");
    $this->parse_error = xml_parse($this->parser, ltrim($xml))? false : true;
  }

  /** Free the parser. */
  public function __destruct() { xml_parser_free($this->parser);}

  /** Get the xml error if an an error in the xml file occured during parsing. */
  public function get_xml_error() {
    if($this->parse_error) {
      $errCode = xml_get_error_code ($this->parser);
      $thisError =  "Error Code [". $errCode ."] \"<strong style='color:red;'>" . xml_error_string($errCode)."</strong>\",
                            at char ".xml_get_current_column_number($this->parser) . "
                            on line ".xml_get_current_line_number($this->parser)."";
    }else $thisError = $this->parse_error;
    return $thisError;
  }

  private function tag_open($parser, $tag, $attributes) {
    $this->convert_to_array($tag, 'attrib');
    $idx=$this->convert_to_array($tag, 'cdata');
    if(isset($idx)) {
      $this->pointer[$tag][$idx] = Array('@idx' => $idx,'@parent' => &$this->pointer);
      $this->pointer =& $this->pointer[$tag][$idx];
    }else {
      $this->pointer[$tag] = Array('@parent' => &$this->pointer);
      $this->pointer =& $this->pointer[$tag];
    }
    if (!empty($attributes)) { $this->pointer['attrib'] = $attributes; }
  }

  /** Adds the current elements content to the current pointer[cdata] array. */
  private function cdata($parser, $cdata) { $this->pointer['cdata'] = trim($cdata); }

  private function tag_close($parser, $tag) {
    $current = & $this->pointer;
    if(isset($this->pointer['@idx'])) {unset($current['@idx']);}

    $this->pointer = & $this->pointer['@parent'];
    unset($current['@parent']);

    if(isset($current['cdata']) && count($current) == 1) { $current = $current['cdata'];}
    else if(empty($current['cdata'])) {unset($current['cdata']);}
  }

  /** Converts a single element item into array(element[0]) if a second element of the same name is encountered. */
  private function convert_to_array($tag, $item) {
    if(isset($this->pointer[$tag]) && !is_array($this->pointer[$tag])){
      $content = $this->pointer[$tag];
      $this->pointer[$tag] = array((0) => $content);
      $idx = 1;
    }else if (isset($this->pointer[$tag])) {
      $idx = count($this->pointer[$tag]);
      if(!isset($this->pointer[$tag][0])) {
        foreach ($this->pointer[$tag] as $key => $value) {
            unset($this->pointer[$tag][$key]);
            $this->pointer[$tag][0][$key] = $value;
    }}}else $idx = null;
    return $idx;
  }
}
?>
Glen at ITIStudios dot ca 02-Dec-2011 03:37
<?php
/**
 *  XML to Associative Array Class
 *
 *  Usage:
 *     $domObj = new xmlToArrayParser($xml);
 *     $domArr = $domObj->array;
 *
 *     if($domObj->parse_error) echo $domObj->get_xml_error();
 *     else print_r($domArr);
 *
 *     On Success:
 *     eg. $domArr['top']['element2']['attrib']['var2'] => val2
 *
 *     On Error:
 *     eg. Error Code [76] "Mismatched tag", at char 58 on line 3
 */

/**
 * Convert an xml file or string to an associative array (including the tag attributes):
 * $domObj = new xmlToArrayParser($xml);
 * $elemVal = $domObj->array['element']
 * Or:  $domArr=$domObj->array;  $elemVal = $domArr['element'].
 *
 * @version  2.0
 * @param Str $xml file/string.
 */
class xmlToArrayParser {
  /** The array created by the parser can be assigned to any variable: $anyVarArr = $domObj->array.*/
  public  $array = array();
  public  $parse_error = false;
  private $parser;
  private $pointer;

  /** Constructor: $domObj = new xmlToArrayParser($xml); */
  public function __construct($xml) {
    $this->pointer =& $this->array;
    $this->parser = xml_parser_create("UTF-8");
    xml_set_object($this->parser, $this);
    xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
    xml_set_element_handler($this->parser, "tag_open", "tag_close");
    xml_set_character_data_handler($this->parser, "cdata");
    $this->parse_error = xml_parse($this->parser, ltrim($xml))? false : true;
  }

  /** Free the parser. */
  public function __destruct() { xml_parser_free($this->parser);}

  /** Get the xml error if an an error in the xml file occured during parsing. */
  public function get_xml_error() {
    if($this->parse_error) {
      $errCode = xml_get_error_code ($this->parser);
      $thisError =  "Error Code [". $errCode ."] \"<strong style='color:red;'>" . xml_error_string($errCode)."</strong>\",
                            at char ".xml_get_current_column_number($this->parser) . "
                            on line ".xml_get_current_line_number($this->parser)."";
    }else $thisError = $this->parse_error;
    return $thisError;
  }

  private function tag_open($parser, $tag, $attributes) {
    $this->convert_to_array($tag, 'attrib');
    $idx=$this->convert_to_array($tag, 'cdata');
    if(isset($idx)) {
      $this->pointer[$tag][$idx] = Array('@idx' => $idx,'@parent' => &$this->pointer);
      $this->pointer =& $this->pointer[$tag][$idx];
    }else {
      $this->pointer[$tag] = Array('@parent' => &$this->pointer);
      $this->pointer =& $this->pointer[$tag];
    }
    if (!empty($attributes)) { $this->pointer['attrib'] = $attributes; }
  }

  /** Adds the current elements content to the current pointer[cdata] array. */
  private function cdata($parser, $cdata) { $this->pointer['cdata'] = trim($cdata); }

  private function tag_close($parser, $tag) {
    $current = & $this->pointer;
    if(isset($this->pointer['@idx'])) {unset($current['@idx']);}

    $this->pointer = & $this->pointer['@parent'];
    unset($current['@parent']);

    if(isset($current['cdata']) && count($current) == 1) { $current = $current['cdata'];}
    else if(empty($current['cdata'])) {unset($current['cdata']);}
  }

  /** Converts a single element item into array(element[0]) if a second element of the same name is encountered. */
  private function convert_to_array($tag, $item) {
    if(isset($this->pointer[$tag][$item])) {
      $content = $this->pointer[$tag];
      $this->pointer[$tag] = array((0) => $content);
      $idx = 1;
    }else if (isset($this->pointer[$tag])) {
      $idx = count($this->pointer[$tag]);
      if(!isset($this->pointer[$tag][0])) {
        foreach ($this->pointer[$tag] as $key => $value) {
            unset($this->pointer[$tag][$key]);
            $this->pointer[$tag][0][$key] = $value;
    }}}else $idx = null;
    return $idx;
  }
}
?>

This is supplimental information for the "class xmlToArrayParser".
This is a fully functional error free, extensively tested php class unlike the posts that follow it.

Key phrase: Fully functional, fully tested, error free XML To Array parser.

<?php
/**
 * class xmlToArrayParser
 *
  Notes:
  1. 'attrib' and 'cdata' are keys added to the array when the element contains both attributes and content.
  2. Ignores content that is not in between it's own set of tags.
  3. Don't know if it recognizes processing instructions nor do I know about processing instructions.
     <\?some_pi some_attr="some_value"?>  This is the same as a document declaration.
  4. Empty elements are not included unless they have attributes.
  5. Version 2.0, Dec. 2, 2011, added xml error reporting.

  Usage:
    $domObj = new xmlToArrayParser($xml);
    $elemVal = $domObj->array['element']
    Or assign the entire array to its own variable:
    $domArr = $domObj->array;
    $elemVal = $domArr['element']

  Example:
    $xml = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <top>
      <element1>element content 1</element1>
      <element2 var2="val2" />
      <element3 var3="val3" var4="val4">element content 3</element3>
      <element3 var5="val5">element content 4</element3>
      <element3 var6="val6" />
      <element3>element content 7</element3>
    </top>';

    $domObj = new xmlToArrayParser($xml);
    $domArr = $domObj->array;

    if($domObj->parse_error) echo $domObj->get_xml_error();
    else print_r($domArr);

    On Success:
    $domArr['top']['element1'] => element content 1
    $domArr['top']['element2']['attrib']['var2'] => val2
    $domArr['top']['element3']['0']['attrib']['var3'] => val3
    $domArr['top']['element3']['0']['attrib']['var4'] => val4
    $domArr['top']['element3']['0']['cdata'] => element content 3
    $domArr['top']['element3']['1']['attrib']['var5'] => val5
    $domArr['top']['element3']['1']['cdata'] => element content 4
    $domArr['top']['element3']['2']['attrib']['var6'] => val6
    $domArr['top']['element3']['3'] => element content 7

    On Error:
    Error Code [76] "Mismatched tag", at char 58 on line 3
 *
 */
?>
wolfon.AT-DoG.inbox.ru 28-Jul-2008 03:09
Finally a simple xml => array class.
Functioning like SimpleXML library.

<?php
class xml  {
    private $parser;
    private $pointer;
    public $dom;

    public function __construct($data) {
        $this->pointer =& $this->dom;
        $this->parser = xml_parser_create();
        xml_set_object($this->parser, $this);
        xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
        xml_set_element_handler($this->parser, "tag_open", "tag_close");
        xml_set_character_data_handler($this->parser, "cdata");
        xml_parse($this->parser, $data);
    }

    private function tag_open($parser, $tag, $attributes) {
        if (isset($this->pointer[$tag]['@attributes'])) {
            $content = $this->pointer[$tag];
            $this->pointer[$tag] = array(0 => $content);
            $idx = 1;
        } else if (isset($this->pointer[$tag]))
            $idx = count($this->pointer[$tag]);

        if (isset($idx)) {
            $this->pointer[$tag][$idx] = Array(
                '@idx' => $idx,
                '@parent' => &$this->pointer);
               $this->pointer =& $this->pointer[$tag][$idx];
        } else {
            $this->pointer[$tag] = Array(
                '@parent' => &$this->pointer);
            $this->pointer =& $this->pointer[$tag];
        }
        if (!empty($attributes))
            $this->pointer['@attributes'] = $attributes;
    }

    private function cdata($parser, $cdata) {
           $this->pointer['@data'] = $cdata;
    }

    private function tag_close($parser, $tag) {
        $current = & $this->pointer;
        if (isset($this->pointer['@idx']))
            unset($current['@idx']);

        $this->pointer = & $this->pointer['@parent'];

          unset($current['@parent']);
           if (isset($current['@data']) && count($current) == 1)
               $current = $current['@data'];
           else if (empty($current['@data'])||$current['@data']==0)
               unset($current['@data']);
    }
}
?>

maybe I'll do some explanations on habr
geoff at spacevs dot com 07-Nov-2007 09:13
Reading xml into a class:

<?PHP
        class XmlData {}
        $elements = array();
        $elements[] =& new XmlData();
        function startElement($parser, $name, $attrs) {
                global $elements;
                $element =& new XMLData();
                $elements[count($elements)-1]->$name =& $element;
                $elements[] =& $element;
        }
        function endElement($parser, $name) {
                global $elements;
                array_pop($elements);
        }
        function characterData($parser, $data) {
                global $elements;
                $elements[count($elements)-1]->data = $data;
        }
        $xml_parser     = xml_parser_create();
        xml_set_element_handler($xml_parser, "startElement", "endElement");
        xml_set_character_data_handler($xml_parser, "characterData");
        xml_parse($xml_parser, $xml, true);
        xml_parser_free($xml_parser);
        $request =& array_pop($elements);

        echo $request->LOGIN->USER->data;
?>
demonpants at gmail dot com 22-Oct-2007 08:59
I wanted to access the ISBN database, and was previously parsing the HTML string generated from their main page, that is until I discovered they have an API that returns XML.

So, if anyone wants to get some information from the ISBN database, all you need to do is the following.

<?php
//Search the ISBN database for the book.
            $url = "http://www.isbndb.com/api/books.xml? access_key=KEY&index1=isbn&value1=$_GET[ISBN]";
            $p = xml_parser_create();
            xml_parse_into_struct($p,file_get_contents($url),$results,$index);
            xml_parser_free($p);

            $title = $results[$index[TITLELONG][0]][value];
            $author = $results[$index[AUTHORSTEXT][0]][value];
            $publisher = $results[$index[PUBLISHERTEXT][0]][value];
?>

You will need to get an access key from isbndb.com, but it takes two seconds and is free. When you get it, replace KEY in the URL with your own key. Also, my code above will search for the book that fits the ISBN number stored in the GET variable ISBN - you can search by other parameters and return more than one result, but my example is  for a simple ISBN search.
Zvjezdan Patz 09-Sep-2007 08:22
The problem I had was I needed to generate xml on the screen for users to actually see and copy to a file.

I'm generating the xml manually from a php file and the browser kept interpreting the xml...not very helpful.

This is how you get around it:

<?php

$file  = file_get_contents("http://example.com/xml.php?whatever=$whatever");
print nl2br(htmlentities($file));

?>

Prints all my xml quite nicely.
v9 at fakehalo dot us 13-Jul-2007 08:04
I needed this for work/personal use.  Sometimes you'll have a XML string generated as one long string and no line breaks...nusoap in the case of today/work, but there are any other number of possible things that will generate these.  Anyways, this simply takes a long XML string and returns an indented/line-breaked version of the string for display/readability.

<?php
function xmlIndent($str){
    $ret = "";
    $indent = 0;
    $indentInc = 3;
    $noIndent = false;
    while(($l = strpos($str,"<",$i))!==false){
        if($l!=$r && $indent>0){ $ret .= "\n" . str_repeat(" ",$indent) . substr($str,$r,($l-$r)); }
        $i = $l+1;
        $r = strpos($str,">",$i)+1;
        $t = substr($str,$l,($r-$l));
        if(strpos($t,"/")==1){
            $indent -= $indentInc;
            $noIndent = true;
        }
        else if(($r-$l-strpos($t,"/"))==2 || substr($t,0,2)=="<?"){ $noIndent = true; }
        if($indent<0){ $indent = 0; }
        if($ret){ $ret .= "\n"; }
        $ret .= str_repeat(" ",$indent);
        $ret .= $t;
        if(!$noIndent){ $indent += $indentInc; }
        $noIndent = false;
    }
    $ret .= "\n";
    return($ret);
}
?>

(...this was only tested for what i needed at work, could POSSIBLY need additions)
geoffers [at] gmail [dot] com 30-Dec-2006 03:27
Time to add my attempt at a very simple script that parses XML into a structure:

<?php

class Simple_Parser
{
    var $parser;
    var $error_code;
    var $error_string;
    var $current_line;
    var $current_column;
    var $data = array();
    var $datas = array();

    function parse($data)
    {
        $this->parser = xml_parser_create('UTF-8');
        xml_set_object($this->parser, $this);
        xml_parser_set_option($this->parser, XML_OPTION_SKIP_WHITE, 1);
        xml_set_element_handler($this->parser, 'tag_open', 'tag_close');
        xml_set_character_data_handler($this->parser, 'cdata');
        if (!xml_parse($this->parser, $data))
        {
            $this->data = array();
            $this->error_code = xml_get_error_code($this->parser);
            $this->error_string = xml_error_string($this->error_code);
            $this->current_line = xml_get_current_line_number($this->parser);
            $this->current_column = xml_get_current_column_number($this->parser);
        }
        else
        {
            $this->data = $this->data['child'];
        }
        xml_parser_free($this->parser);
    }

    function tag_open($parser, $tag, $attribs)
    {
        $this->data['child'][$tag][] = array('data' => '', 'attribs' => $attribs, 'child' => array());
        $this->datas[] =& $this->data;
        $this->data =& $this->data['child'][$tag][count($this->data['child'][$tag])-1];
    }

    function cdata($parser, $cdata)
    {
        $this->data['data'] .= $cdata;
    }

    function tag_close($parser, $tag)
    {
        $this->data =& $this->datas[count($this->datas)-1];
        array_pop($this->datas);
    }
}

$xml_parser = new Simple_Parser;
$xml_parser->parse('<foo><bar>test</bar></foo>');

?>
Didier: dlvb ** free * fr 24-Dec-2006 09:53
Hi !

After parsing the XML and modifying it, I just add a method to rebuild the XML form the internal structure (xmlp->document).
The method xmlp->toXML writes into xmlp->XML attributes. Then, you just have to output it.
I hope it helps.

<?php
class XMLParser {

var $parser;
var $filePath;
var $document;
var $currTag;
var $tagStack;
var $XML;
var $_tag_to_close = false;
var $TAG_ATTRIBUT = 'attr';
var $TAG_DATA = 'data';

function XMLParser($path) {
    $this->parser = xml_parser_create();
    $this->filePath = $path;
    $this->document = array();
    $this->currTag =& $this->document;
    $this->tagStack = array();
    $this->XML = "";
}

function parse() {
    xml_set_object($this->parser, $this);
    xml_set_character_data_handler($this->parser, 'dataHandler');
    xml_set_element_handler($this->parser, 'startHandler', 'endHandler');

   if(!($fp = fopen($this->filePath, "r"))) {
       die("Cannot open XML data file: $this->filePath");
       return false;
     }

    while($data = fread($fp, 4096)) {
        if(!xml_parse($this->parser, $data, feof($fp))) {
            die(sprintf("XML error: %s at line %d",
                xml_error_string(xml_get_error_code($this->parser)),
             xml_get_current_line_number($this->parser)));
      }
    }

    fclose($fp);
    xml_parser_free($this->parser);

    return true;
}

function startHandler($parser, $name, $attribs) {
     if(!isset($this->currTag[$name]))
          $this->currTag[$name] = array();

     $newTag = array();
     if(!empty($attribs))
          $newTag[$this->TAG_ATTRIBUT] = $attribs;
     array_push($this->currTag[$name], $newTag);

     $t =& $this->currTag[$name];
     $this->currTag =& $t[count($t)-1];
     array_push($this->tagStack, $name);
}

function dataHandler($parser, $data) {
    $data = trim($data);

    if(!empty($data)) {
      if(isset($this->currTag[$this->TAG_DATA]))
            $this->currTag[$this->TAG_DATA] .= $data;
      else
            $this->currTag[$this->TAG_DATA] = $data;
    }
}

function endHandler($parser, $name) {
     $this->currTag =& $this->document;
     array_pop($this->tagStack);

     for($i = 0; $i < count($this->tagStack); $i++) {
          $t =& $this->currTag[$this->tagStack[$i]];
          $this->currTag =& $t[count($t)-1];
     }
}

function clearOutput () {
    $this->XML = "";
}

function openTag ($tag) {
    $this->XML.="<".strtolower ($tag);
    $this->_tag_to_close = true;
}

function closeTag () {
    if ($this->_tag_to_close) {
        $this->XML.=">";
        $this->_tag_to_close = false;
    }
}

function closingTag ($tag) {
    $this->XML.="</".strtolower ($tag).">";
}

function output_attributes ($contenu_fils) {
    foreach ($contenu_fils[$this->TAG_ATTRIBUT] as $nomAttribut => $valeur) {
        $this->XML.= " ".strtolower($nomAttribut)."=\"".$valeur."\"";
    }
}

function addData ($texte) {
// to be completed
    $ca  = array ("é", "è", "ê", "à");
    $par = array ("&eacute;", "&egrave;", "&ecirc;", "agrave;");
    return htmlspecialchars(str_replace ($ca, $par, $texte), ENT_NOQUOTES);
}

function toXML ($tags="") {
    if ($tags=="") {
        $tags = $this->document;
      $this->clearOutput ();
    }

    foreach ($tags as $tag => $contenu) {
        $this->process ($tag, $contenu);
    }
}

function process ($tag, $contenu) {
     // Pour tous les TAGs
    foreach ($contenu as $indice => $contenu_fils) {
         $this->openTag ($tag);

         // Pour tous les fils (non attribut et non data)
         foreach ($contenu_fils as $tagFils => $fils) {
             switch ($tagFils) {
                 case $this->TAG_ATTRIBUT:
                         $this->output_attributes ($contenu_fils);
                        $this->closeTag ();
                         break;
                 case $this->TAG_DATA:
                        $this->closeTag ();
                         $this->XML.= $this->addData ($contenu_fils [$this->TAG_DATA]);
                         break;
                 default:
                         $this->closeTag ();
                         $this->process ($tagFils, $fils);
                         break;
             }
         }

        $this->closingTag ($tag);
    }
}

}
?>
forquan 28-Jan-2006 03:45
Here's code that will create an associative array from an xml file.  Keys are the tag data and subarrays are formed from attributes and child tags

<?php
$p =& new xmlParser();
$p->parse('/*xml file*/');
print_r($p->output);
?>

<?php
class xmlParser{
   var $xml_obj = null;
   var $output = array();
   var $attrs;

   function xmlParser(){
       $this->xml_obj = xml_parser_create();
       xml_set_object($this->xml_obj,$this);
       xml_set_character_data_handler($this->xml_obj, 'dataHandler');
       xml_set_element_handler($this->xml_obj, "startHandler", "endHandler");
   }

   function parse($path){
       if (!($fp = fopen($path, "r"))) {
           die("Cannot open XML data file: $path");
           return false;
       }

       while ($data = fread($fp, 4096)) {
           if (!xml_parse($this->xml_obj, $data, feof($fp))) {
               die(sprintf("XML error: %s at line %d",
               xml_error_string(xml_get_error_code($this->xml_obj)),
               xml_get_current_line_number($this->xml_obj)));
               xml_parser_free($this->xml_obj);
           }
       }

       return true;
   }

   function startHandler($parser, $name, $attribs){
       $_content = array();
       if(!empty($attribs))
         $_content['attrs'] = $attribs;
       array_push($this->output, $_content);
   }

   function dataHandler($parser, $data){
       if(!empty($data) && $data!="\n") {
           $_output_idx = count($this->output) - 1;
           $this->output[$_output_idx]['content'] .= $data;
       }
   }

   function endHandler($parser, $name){
       if(count($this->output) > 1) {
           $_data = array_pop($this->output);
           $_output_idx = count($this->output) - 1;
           $add = array();
           if ($_data['attrs'])
                $add['attrs'] = $_data['attrs'];
           if ($_data['child'])
                $add['child'] = $_data['child'];
           $this->output[$_output_idx]['child'][$_data['content']] = $add;
       }
   }
}
?>
Greg S 17-Nov-2005 08:56
If you need utf8_encode support and configure PHP with --disable-all you will have some trouble. Unfortunately the configure options aren't completely documented. If you need utf8 functions and have everything disabled just recompile PHP with --enable-xml and you should be good to go.
compu_global_hyper_mega_net_2 at yahoo dot com 19-Sep-2004 01:35
The documentation regarding white space was never complete I think.

The XML_OPTION_SKIP_WHITE doesn't appear to do anything.  I want to preserve the newlines in a cdata section.  Setting XML_OPTION_SKIP_WHITE to 0 or false doesn't appear to help.  My character_data_handler is getting called once for each line.  This obviously should be reflected in the documentation as well.  When/how often does the handler get called exactly?  Having to build separate test cases is very time consuming.

Inserting newlines myself in my cdata handler is no good either.  For non actual CDATA sections that cause my handler to get called, long lines are split up in multiple calls.  My handler would not be able to tell the difference whether or not the subsequent calls would be due to the fact that the data is coming from the next line or the fact that some internal buffer is long enough for it to 'flush' out and call the handler.
This behaviour also needs to be properly documented.
odders 18-Mar-2004 10:36
I wrote a simple xml parser mainly to deal with rss version 2. I found lots of examples on the net, but they were all masive and bloated and hard to manipulate.

Output is sent to an array, which holds arrays containg data for each item.

Obviously, you will have to make modifications to the code to suit your needs, but there isnt a lot of code there, so that shouldnt be a problem.

<?php

   $currentElements = array();
   $newsArray = array();

   readXml("./news.xml");

   echo("<pre>");
   print_r($newsArray);
   echo("</pre>");

   // Reads XML file into formatted html
   function readXML($xmlFile)
   {

      $xmlParser = xml_parser_create();

      xml_parser_set_option($xmlParser, XML_OPTION_CASE_FOLDING, false);
      xml_set_element_handler($xmlParser, startElement, endElement);
      xml_set_character_data_handler($xmlParser, characterData);

      $fp = fopen($xmlFile, "r");

      while($data = fread($fp, filesize($xmlFile))){
         xml_parse($xmlParser, $data, feof($fp));}

      xml_parser_free($xmlParser);

   }

   // Sets the current XML element, and pushes itself onto the element hierarchy
   function startElement($parser, $name, $attrs)
   {

      global $currentElements, $itemCount;

      array_push($currentElements, $name);

      if($name == "item"){$itemCount += 1;}

   }

   // Prints XML data; finds highlights and links
   function characterData($parser, $data)
   {

      global $currentElements, $newsArray, $itemCount;

      $currentCount = count($currentElements);
      $parentElement = $currentElements[$currentCount-2];
      $thisElement = $currentElements[$currentCount-1];

      if($parentElement == "item"){
         $newsArray[$itemCount-1][$thisElement] = $data;}
      else{
         switch($name){
            case "title":
               break;
            case "link":
               break;
            case "description":
               break;
            case "language":
               break;
            case "item":
               break;}}

   }

   // If the XML element has ended, it is poped off the hierarchy
   function endElement($parser, $name)
   {

      global $currentElements;

      $currentCount = count($currentElements);
      if($currentElements[$currentCount-1] == $name){
         array_pop($currentElements);}

   }

?>
software at serv-a-com dot com 22-Jan-2003 02:08
use:

<?php
while ($data = str_replace("\n","",fread($fp, 4096))){
 // ...
}
?>

instead of:

<?php
while ($data = fread($fp, 4096)) {
  // ...
}
?>

[UPDATE 17-FEB-2003: This post] resulted in some of the visitors e-mailg me on the carriage return stripping issue with questions. I'll try to make the following mumble as brief and easy to understand as possible.

1. Overview of the 4096 fragmentation issue
As you know the following freads the file 4096 bytes at a time (that is 4KB) this is perhaps ok for testing expat and figuring out how things work, but it it rather dangerous in the production environment. Data may not be fully understandable due to fread fragmentation and improperly formatted due to numerous sources(formats) of data contained within (i.e. end of line delimited CDATA).

<?php
while ($data = fread($fp, 4096)) {
  if (!xml_parse($xml_parser, $data, feof($fp))) {
    // ...
  }
}
?>

Sometimes to save time one may want to load it all up into a one big variable and leave all the worries to expat. I think anything under 500 KB is ok (as long as nobody knows about it). Some may argue that larger variables are acceptable or even necessary because of the magic that take place while parsing using xml_parse. Our XML parser(expat) works and can be successfully implemented only when we know what type of XML data we are dealing with, it's average size and structure of general layout and data contained within tags. For example if the tags are followed by a line delimiter like a new line we can read it with fgets in and with minimal effort make sure that no data will be sent to the function that does not end with a end tag. But this require a fair knowledge of the file's preference for storing XML data and tags (and a bit of code between reading data and xml_parse'ing it).
It will save you a headache.

2. Pre Parser Strings and New Line Delimited Data
One important thing to note at this point is that the xml_parse function requires a string variable. You can manipulate the content of any string variable easily as we all know.

A better approach to removing newlines than:

<?php
while ($data = fread($fp, 4096)) {
$data = preg_replace("/\n|\r/","",$data); //flarp
if (!xml_parse($xml_parser, $data, feof($fp))) {...
?>

Above works across all 3 line-delimited text files  (\n, \r, \r\n). But this could potentially (or will most likely) damage or scramble data contained in for example CDATA areas. As far as I am concerned end of line characters should not be used _within_ XML tags. What seems to be the ultimate solution is to pre-parse the loaded data this would require checking the position within the XML document and adding or subtracting (using a in-between fread temporary variable) data based on conditions like: "Is within tag", "Is within CDATA" etc. before fedding it to the parser. This of course opens up a new can of worms (as in parse data for the parser...). (above procedure would take place between fread and xml_parser calls this method would be compatible with the general usage examples on top of the page)

3. The Answer to parsing arbitrary XML and Preprocessor Revisited
You can't just feed any XML document to the parser you constructed and assuming that it will work! You have to know what kind of methods for storing data are used, for example is there a end of line delimited data in the  file ?, Are there any carriage returns in the tags etc... XML files come formatted in different ways some are just a one long string of characters with out any end of line markers others have newlines, carriage returns or both (Microsloth Windows). May or may not contain space and other whitespace between tags. For this reason it is important to what I call Normalize the data before feeding it to the parser. You can perform this with regular expressions or plain old str_replace and concatenation. In many cases this can be done to the file it self sometimes to string data on the fly( as shown in the example above). But I feel it is important to normalize the data before even calling the function to call xml_parse. If you have the ability to access all data before that call you can convert it to what you fell the data should have been in the first place and omit many surprises and expensive regular expression substitution (in a tight spot) while fread'ing the data.
guy at bhaktiandvedanta dot com 27-Sep-2002 12:01
For a simple XML parser you can use this function. It doesn't require any extensions to run.

<?php
// Extracts content from XML tag

function GetElementByName ($xml, $start, $end) {

    global $pos;
    $startpos = strpos($xml, $start);
    if ($startpos === false) {
        return false;
    }
    $endpos = strpos($xml, $end);
    $endpos = $endpos+strlen($end);
    $pos = $endpos;
    $endpos = $endpos-$startpos;
    $endpos = $endpos - strlen($end);
    $tag = substr ($xml, $startpos, $endpos);
    $tag = substr ($tag, strlen($start));

    return $tag;

}

// Open and read xml file. You can replace this with your xml data.

$file = "data.xml";
$pos = 0;
$Nodes = array();

if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}
while ($getline = fread($fp, 4096)) {
    $data = $data . $getline;
}

$count = 0;
$pos = 0;

// Goes throw XML file and creates an array of all <XML_TAG> tags.
while ($node = GetElementByName($data, "<XML_TAG>", "</XML_TAG>")) {
    $Nodes[$count] = $node;
    $count++;
    $data = substr($data, $pos);
}

// Gets infomation from tag siblings.
for ($i=0; $i<$count; $i++) {
$code = GetElementByName($Nodes[$i], "<Code>", "</Code>");
$desc = GetElementByName($Nodes[$i], "<Description>", "</Description>");
$price = GetElementByName($Nodes[$i], "<BasePrice>", "</BasePrice>");
}
?>

Hope this helps! :)
Guy Laor
dmarsh dot NO dot SPAM dot PLEASE at spscc dot ctc dot edu 18-Sep-2002 12:27
Some reference code I am working on as "XML Library" of which I am folding it info an object. Notice the use of the DEFINE:

Mainly Example 1 and parts of 2 & 3 re-written as an object:
--- MyXMLWalk.lib.php ---
<?php

if (!defined("PHPXMLWalk")) {
define("PHPXMLWalk",TRUE);

class XMLWalk {
 var $p; //short for xml parser;
 var $e; //short for element stack/array

  function prl($x,$i=0) {
    ob_start();
    print_r($x);
    $buf=ob_get_contents();
    ob_end_clean();
    return join("\n".str_repeat(" ",$i),split("\n",$buf));
  }

 function XMLWalk() {
  $this->p = xml_parser_create();
  $this->e = array();
  xml_parser_set_option($this->p, XML_OPTION_CASE_FOLDING, true);
  xml_set_element_handler($this->p, array(&$this, "startElement"), array(&$this, "endElement"));
  xml_set_character_data_handler($this->p, array(&$this, "dataElement"));
  register_shutdown_function(array(&$this, "free")); // make a destructor
  }

  function startElement($parser, $name, $attrs) {
    if (count($attrs)>=1) {
      $x = $this->prl($attrs, $this->e[$parser]+6);
    } else {
      $x = "";
    }

    print str_repeat(" ",$this->e[$parser]+0). "$name $x\n";
    $this->e[$parser]++;
    $this->e[$parser]++;
  }

  function dataElement($parser, $data) {
    print str_repeat(" ",$this->e[$parser]+0). htmlspecialchars($data, ENT_QUOTES) ."\n";
  }

  function endElement($parser, $name) {
    $this->e[$parser]--;
    $this->e[$parser]--;
  }
  function parse($data, $fp) {
    if (!xml_parse($this->p, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($this->p)),
                    xml_get_current_line_number($this->p)));
    }
  }

  function free() {
    xml_parser_free($this->p);
  }

} // end of class

} // end of define

?>

--- end of file ---

Calling code:
<?php

...

require("MyXMLWalk.lib.php");

$file = "x.xml";

$xme = new XMLWalk;

if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
  $xme->parse($data, $fp);
}

...
?>
jon at gettys dot org 14-Aug-2002 01:59
[Editor's note: see also xml_parse_into_struct().]

Very simple routine to convert an XML file into a PHP structure. $obj->xml contains the resulting PHP structure. I would be interested if someone could suggest a cleaner method than the evals I am using.

<?php
$filename = 'sample.xml';
$obj->tree = '$obj->xml';
$obj->xml = '';

function startElement($parser, $name, $attrs) {
    global $obj;

    // If var already defined, make array
    eval('$test=isset('.$obj->tree.'->'.$name.');');
    if ($test) {
      eval('$tmp='.$obj->tree.'->'.$name.';');
      eval('$arr=is_array('.$obj->tree.'->'.$name.');');
      if (!$arr) {
        eval('unset('.$obj->tree.'->'.$name.');');
        eval($obj->tree.'->'.$name.'[0]=$tmp;');
        $cnt = 1;
      }
      else {
        eval('$cnt=count('.$obj->tree.'->'.$name.');');
      }

      $obj->tree .= '->'.$name."[$cnt]";
    }
    else {
      $obj->tree .= '->'.$name;
    }
    if (count($attrs)) {
        eval($obj->tree.'->attr=$attrs;');
    }
}

function endElement($parser, $name) {
    global $obj;
    // Strip off last ->
    for($a=strlen($obj->tree);$a>0;$a--) {
        if (substr($obj->tree, $a, 2) == '->') {
            $obj->tree = substr($obj->tree, 0, $a);
            break;
        }
    }
}

function characterData($parser, $data) {
    global $obj;

    eval($obj->tree.'->data=\''.$data.'\';');
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($filename, "r"))) {
    die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $data, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
xml_parser_free($xml_parser);
print_r($obj->xml);
return 0;

?>
hans dot schneider at bbdo-interone dot de 24-Jan-2002 08:43
I had to TRIM the data when I passed one large String containig a wellformed XML-File to xml_parse. The String was read by CURL, which aparently put a BLANK at the end of the String. This BLANK produced a "XML not wellformed"-Error in xml_parse!
sam at cwa dot co dot nz 28-Sep-2000 07:39
I've discovered some unusual behaviour in this API when ampersand entities are parsed in cdata; for some reason the parser breaks up the section around the entities, and calls the handler repeated times for each of the sections. If you don't allow for this oddity and you are trying to put the cdata into a variable, only the last part will be stored.

You can get around this with a line like:

$foo .= $cdata;

If the handler is called several times from the same tag, it will append them, rather than rewriting the variable each time. If the entire cdata section is returned, it doesn't matter.

May happen for other entities, but I haven't investigated.

Took me a while to figure out what was happening; hope this saves someone else the trouble.
Daniel dot Rendall at btinternet dot com 07-Jul-1999 10:21
When using the XML parser, make sure you're not using the magic quotes option (e.g. use set_magic_quotes_runtime(0) if it's not the compiled default), otherwise you'll get 'not well-formed' errors when dealing with tags with attributes set in them.


Convertit une chaîne UTF-8 en ISO-8859-1

  • « Fonctions d'analyse de fichier XML
  • utf8_encode »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Convertit une chaîne UTF-8 en ISO-8859-1

utf8_decode

(PHP 4, PHP 5, PHP 7, PHP 8)

utf8_decode — Convertit une chaîne UTF-8 en ISO-8859-1

Description

utf8_decode ( string $string ) : string

utf8_decode() décode la chaîne string, en supposant qu'elle est au format UTF-8, et la convertit au format ISO-8859-1. Les octets dans la chaîne qui ne sont pas valides en UTF-8 et les caractères UTF-8 qui n'existent pas en ISO-8859-1 (qui sont, les caractères au-dessus de U+00FF) sont remplacés par ?.

Note:

De nombreuses pages Web marquées comme utilisant l'encodage de caratères ISO-8859-1 utilisent effectivement un encodage similaire à Windows-1252, et les navigateurs Web interpréterons les pages Web ISO-8859-1 comme Windows-1252. Les caractéristiques supplémentaires de Windows-1252 sont des caractères imprimables, tels que le signe euro (€) et les guillemets bouclés (“ ”), à la place de certains caractères de contrôle de l'ISO-8859-1. Cette fonction ne convertira pas ces caractères Windows-1252 correctement. Utilisez une fonction différente si une conversion Windows-1252 est nécessaire.

Liste de paramètres

string

La chaîne encodée UTF-8.

Valeurs de retour

Retourne la chaîne string convertie en ISO-8859-1.

Historique

Version | Description
7.2.0 | Cette fonction a été déplacée dans le cœur de PHP ; auparavant, il était nécessaire d'installer l'extension XML pour l'utiliser.

Voir aussi

  • utf8_encode() - Convertit une chaîne ISO-8859-1 en UTF-8 - Réalise la conversion inverse
  • mb_convert_encoding() - Conversion d'encodage - Convertit entre différents codages de caractères, y compris UTF-8, ISO-8859-1 et Windows-1252
  • iconv() - Convertit une chaîne dans un jeu de caractères - Convertit entre différents codages de caractères
  • recode_string() - Recode une chaîne en fonction de la requête - Convertit entre différents codages de caractères

User Contributed Notes

Aleksandr 30-Jun-2017 02:46
In addition to note by yannikh at gmeil dot com, another way to decode strings with non-latin chars from unix console like

C=RU, L=\xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0,

<?php preg_replace_callback('/\\\\x([0-9A-F]{2})/', function($a){ return pack('H*', $a[1]); }, $str); ?>

The code above will output:
C=RU, L=??????,
kode68 02-May-2016 06:09
Update Answer from okx dot oliver dot koenig at gmail dot com for PHP 5.6 since e/ modifier is depreciated

// This finally helped me to do the job, thanks to Blackbit, had to modify deprecated ereg:
// original comment: "Squirrelmail contains a nice function in the sources to convert unicode to entities:"

function charset_decode_utf_8($string)
    {
        /* Only do the slow convert if there are 8-bit characters */
        if ( !preg_match("/[\200-\237]/", $string) && !preg_match("/[\241-\377]/", $string) )
               return $string;

        // decode three byte unicode characters
          $string = preg_replace_callback("/([\340-\357])([\200-\277])([\200-\277])/",
                    create_function ('$matches', 'return \'&#\'.((ord($matches[1])-224)*4096+(ord($matches[2])-128)*64+(ord($matches[3])-128)).\';\';'),
                    $string);

        // decode two byte unicode characters
          $string = preg_replace_callback("/([\300-\337])([\200-\277])/",
                    create_function ('$matches', 'return \'&#\'.((ord($matches[1])-192)*64+(ord($matches[2])-128)).\';\';'),
                    $string);

        return $string;
    }

Enjoy
okx dot oliver dot koenig at gmail dot com 08-Feb-2015 11:48
// This finally helped me to do the job, thanks to Blackbit, had to modify deprecated ereg:
// original comment: "Squirrelmail contains a nice function in the sources to convert unicode to entities:"

function charset_decode_utf_8 ($string) {
    /* Only do the slow convert if there are 8-bit characters */
    /* avoid using 0xA0 (\240) in ereg ranges. RH73 does not like that */
    if (!preg_match("/[\200-\237]/", $string)
     && !preg_match("/[\241-\377]/", $string)
    ) {
        return $string;
    }

    // decode three byte unicode characters
    $string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e",
        "'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",
        $string
    );

    // decode two byte unicode characters
    $string = preg_replace("/([\300-\337])([\200-\277])/e",
        "'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'",
        $string
    );

    return $string;
}
sashott at gmail dot com 04-Dec-2014 11:57
Use of utf8_decode was not enough for me by get page content from another site. Problem appear by different alphabet from standard latin. As example some chars (corresponding to HTML codes &bdquo; , &nbsp; and others) are converted to "?" or "xA0" (hex value). You need to make some conversion before execute utf8_decode. And you can not replace simple, that they can be part of 2 bytes code for a char (UTF-8 use 2 bytes). Next is for cyrillic alphabet, but for other must be very close.

function convertMethod($text){
    //Problem is that utf8_decode convert HTML chars for &bdquo; and other to ? or &nbsp; to \xA0. And you can not replace, that they are in some char bytes and you broke cyrillic (or other alphabet) chars.
    $problem_enc=array(
        'euro',
        'sbquo',
        'bdquo',
        'hellip',
        'dagger',
        'Dagger',
        'permil',
        'lsaquo',
        'lsquo',
        'rsquo',
        'ldquo',
        'rdquo',
        'bull',
        'ndash',
        'mdash',
        'trade',
        'rsquo',
        'brvbar',
        'copy',
        'laquo',
        'reg',
        'plusmn',
        'micro',
        'para',
        'middot',
        'raquo',
        'nbsp'
    );
    $text=mb_convert_encoding($text,'HTML-ENTITIES','UTF-8');
    $text=preg_replace('#(?<!\&ETH;)\&('.implode('|',$problem_enc).');#s','--amp{$1}',$text);
    $text=mb_convert_encoding($text,'UTF-8','HTML-ENTITIES');
    $text=utf8_decode($text);
    $text=mb_convert_encoding($text,'HTML-ENTITIES','UTF-8');
    $text=preg_replace('#\-\-amp\{([^\}]+)\}#su','&$1;',$text);
    $text=mb_convert_encoding($text,'UTF-8','HTML-ENTITIES');
    return $text;
}

If this don't work, try to set "die($text);" on some places to look, what is happen to this row. Is better to test with long text. It is very possible to broke other alphabet character. In this case, it is very possible, that for you alphabet set "&ETH;" is not the right one. You need to set "die($text);" after this preg_replace and look HTML code for character before set "--amp".
christoffer 29-Oct-2012 10:35
The preferred way to use this on an array would be with the built in PHP function "array_map()", as for example:
$array = array_map("utf8_decode", $array);
deceze at gmail dot com 14-Jul-2011 07:01
Please note that utf8_decode simply converts a string encoded in UTF-8 to ISO-8859-1. A more appropriate name for it would be utf8_to_iso88591. If your text is already encoded in ISO-8859-1, you do not need this function. If you don't want to use ISO-8859-1, you do not need this function.

Note that UTF-8 can represent many more characters than ISO-8859-1. Trying to convert a UTF-8 string that contains characters that can't be represented in ISO-8859-1 to ISO-8859-1 will garble your text and/or cause characters to go missing. Trying to convert text that is not encoded in UTF-8 using this function will most likely garble the text.

If you need to convert any text from any encoding to any other encoding, look at iconv() instead.
gabriel arobase gabsoftware dot com 12-Jun-2011 08:41
If you want to retrieve some UTF-8 data from your database, you don't need utf8_decode().

Simply do the following query before any SELECT :

$result = mysql_query("SET NAMES utf8");
info at vanylla dot it 26-Jan-2009 12:21
IMPORTANT: when converting UTF8 data that contains the EURO sign DON'T USE utf_decode function.

utf_decode converts the data into ISO-8859-1 charset. But ISO-8859-1 charset does not contain the EURO sign, therefor the EURO sign will be converted into a question mark character '?'

In order to convert properly UTF8 data with EURO sign you must use:

iconv("UTF-8", "CP1252", $data)
Blackbit 12-Aug-2008 04:40
Squirrelmail contains a nice function in the sources to convert unicode to entities:

<?php
function charset_decode_utf_8 ($string) {
      /* Only do the slow convert if there are 8-bit characters */
    /* avoid using 0xA0 (\240) in ereg ranges. RH73 does not like that */
    if (! ereg("[\200-\237]", $string) and ! ereg("[\241-\377]", $string))
        return $string;

    // decode three byte unicode characters
    $string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e",        \
    "'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'",    \
    $string);

    // decode two byte unicode characters
    $string = preg_replace("/([\300-\337])([\200-\277])/e", \
    "'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'", \
    $string);

    return $string;
}
?>
punchivan at gmail dot com 24-Jun-2008 02:13
EY! the bug is not in the function 'utf8_decode'. The bug is in the function 'mb_detect_encoding'. If you put a word with a special char at the end like this 'accentué', that will lead to a wrong result (UTF-8) but if you put another char at the end like this 'accentuée' you will get it right. So you should always add a ISO-8859-1 character to your string for this check. My advise is to use a blank space.
I´ve tried it and it works!

function ISO_convert($array)
{
    $array_temp = array();

    foreach($array as $name => $value)
    {
        if(is_array($value))
          $array_temp[(mb_detect_encoding($name." ",'UTF-8,ISO-8859-1') == 'UTF-8' ? utf8_decode($name) : $name )] = ISO_convert($value);
        else
          $array_temp[(mb_detect_encoding($name." ",'UTF-8,ISO-8859-1') == 'UTF-8' ? utf8_decode($name) : $name )] = (mb_detect_encoding($value." ",'UTF-8,ISO-8859-1') == 'UTF-8' ? utf8_decode($value) : $value );
    }

    return $array_temp;
}
haugas at gmail dot com 08-May-2008 02:11
If you don't know exactly, how many times your string is encoded, you can use this function:

<?php

function _utf8_decode($string)
{
  $tmp = $string;
  $count = 0;
  while (mb_detect_encoding($tmp)=="UTF-8")
  {
    $tmp = utf8_decode($tmp);
    $count++;
  }

  for ($i = 0; $i < $count-1 ; $i++)
  {
    $string = utf8_decode($string);

  }
  return $string;

}

?>
lukasz dot mlodzik at gmail dot com 05-Mar-2008 04:46
Update to MARC13 function utf2iso()
I'm using it to handle AJAX POST calls.
Despite using
http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'; charset='utf-8');
it still code Polish letters using UTF-16

This is only for Polish letters:

<?php
function utf16_2_utf8 ($nowytekst) {
        $nowytekst = str_replace('%u0104','A',$nowytekst);    //A
        $nowytekst = str_replace('%u0106','C',$nowytekst);    //C
        $nowytekst = str_replace('%u0118','E',$nowytekst);    //E
        $nowytekst = str_replace('%u0141','L',$nowytekst);    //L
        $nowytekst = str_replace('%u0143','N',$nowytekst);    //N
        $nowytekst = str_replace('%u00D3','Ó',$nowytekst);    //Ó
        $nowytekst = str_replace('%u015A','S',$nowytekst);    //S
        $nowytekst = str_replace('%u0179','Z',$nowytekst);    //Z
        $nowytekst = str_replace('%u017B','Z',$nowytekst);    //Z

        $nowytekst = str_replace('%u0105','a',$nowytekst);    //a
        $nowytekst = str_replace('%u0107','c',$nowytekst);    //c
        $nowytekst = str_replace('%u0119','e',$nowytekst);    //e
        $nowytekst = str_replace('%u0142','l',$nowytekst);    //l
        $nowytekst = str_replace('%u0144','n',$nowytekst);    //n
        $nowytekst = str_replace('%u00F3','ó',$nowytekst);    //ó
        $nowytekst = str_replace('%u015B','s',$nowytekst);    //s
        $nowytekst = str_replace('%u017A','z',$nowytekst);    //z
        $nowytekst = str_replace('%u017C','z',$nowytekst);    //z
   return ($nowytekst);
   }
?>

Everything goes smooth, but it doesn't change '%u00D3','Ó' and '%u00F3','ó'. I dont have idea what to do with that.

Remember! File must be saved in UTF-8 coding.
ludvig dot ericson at gmail dot com 15-Jul-2007 10:52
A better way to convert would be to use iconv, see http://www.php.net/iconv -- example:

<?php
$myUnicodeString = "Åäö";
echo iconv("UTF-8", "ISO-8859-1", $myUnicodeString);
?>

Above would echo out the given variable in ISO-8859-1 encoding, you may replace it with whatever you prefer.

Another solution to the issue of misdisplayed glyphs is to simply send the document as UTF-8, and of course send UTF-8 data:

<?php
# Replace text/html with whatever MIME-type you prefer.
header("Content-Type: text/html; CHARSET=Windows-1252");
?>
MARC13 07-Jul-2007 07:50
I did this function to convert data from AJAX call to insert to my database.
It converts UTF-8 from XMLHttpRequest() to ISO-8859-2 that I use in LATIN2 MySQL database.

<?php
function utf2iso($tekst)
{
        $nowytekst = str_replace("%u0104","\xA1",$tekst);    //A
        $nowytekst = str_replace("%u0106","\xC6",$nowytekst);    //C
        $nowytekst = str_replace("%u0118","\xCA",$nowytekst);    //E
        $nowytekst = str_replace("%u0141","\xA3",$nowytekst);    //L
        $nowytekst = str_replace("%u0143","\xD1",$nowytekst);    //N
        $nowytekst = str_replace("%u00D3","\xD3",$nowytekst);    //Ó
        $nowytekst = str_replace("%u015A","\xA6",$nowytekst);    //S
        $nowytekst = str_replace("%u0179","\xAC",$nowytekst);    //Z
        $nowytekst = str_replace("%u017B","\xAF",$nowytekst);    //Z

        $nowytekst = str_replace("%u0105","\xB1",$nowytekst);    //a
        $nowytekst = str_replace("%u0107","\xE6",$nowytekst);    //c
        $nowytekst = str_replace("%u0119","\xEA",$nowytekst);    //e
        $nowytekst = str_replace("%u0142","\xB3",$nowytekst);    //l
        $nowytekst = str_replace("%u0144","\xF1",$nowytekst);    //n
        $nowytekst = str_replace("%u00D4","\xF3",$nowytekst);    //ó
        $nowytekst = str_replace("%u015B","\xB6",$nowytekst);    //s
        $nowytekst = str_replace("%u017A","\xBC",$nowytekst);    //z
        $nowytekst = str_replace("%u017C","\xBF",$nowytekst);    //z

    return ($nowytekst);
}
?>

In my case also the code file that deals with AJAX calls must be in UTF-8 coding.
visus at portsonline dot net 23-Jun-2007 09:08
Following code helped me with mixed (UTF8+ISO-8859-1(x)) encodings. In this case, I have template files made and maintained by designers who do not care about encoding and MySQL data in utf8_binary_ci encoded tables.

<?php

class Helper
{
    function strSplit($text, $split = 1)
    {
        if (!is_string($text)) return false;
        if (!is_numeric($split) && $split < 1) return false;

        $len = strlen($text);

        $array = array();

        $i = 0;

        while ($i < $len)
        {
            $key = NULL;

            for ($j = 0; $j < $split; $j += 1)
            {
                $key .= $text{$i};

                $i += 1;
            }

            $array[] = $key;
        }

        return $array;
    }

    function UTF8ToHTML($str)
    {
        $search = array();
        $search[] = "/([\\xC0-\\xF7]{1,1}[\\x80-\\xBF]+)/e";
        $search[] = "/&#228;/";
        $search[] = "/&#246;/";
        $search[] = "/&#252;/";
        $search[] = "/&#196;/";
        $search[] = "/&#214;/";
        $search[] = "/&#220;/";
        $search[] = "/&#223;/";

        $replace = array();
        $replace[] = 'Helper::_UTF8ToHTML("\\1")';
        $replace[] = "ä";
        $replace[] = "ö";
        $replace[] = "ü";
        $replace[] = "Ä";
        $replace[] = "Ö";
        $replace[] = "ü";
        $replace[] = "ß";

        $str = preg_replace($search, $replace, $str);

        return $str;
    }

    function _UTF8ToHTML($str)
    {
        $ret = 0;

        foreach((Helper::strSplit(strrev(chr((ord($str{0}) % 252 % 248 % 240 % 224 % 192) + 128).substr($str, 1)))) as $k => $v)
            $ret += (ord($v) % 128) * pow(64, $k);
        return "&#".$ret.";";
    }
}

// Usage example:

$tpl = file_get_contents("template.tpl");
/* ... */
$row = mysql_fetch_assoc($result);

print(Helper::UTF8ToHTML(str_replace("{VAR}", $row['var'], $tpl)));

?>
luka8088 at gmail dot com 22-Jun-2007 07:03
simple UTF-8 to HTML conversion:

function utf8_to_html ($data)
    {
    return preg_replace("/([\\xC0-\\xF7]{1,1}[\\x80-\\xBF]+)/e", '_utf8_to_html("\\1")', $data);
    }

function _utf8_to_html ($data)
    {
    $ret = 0;
    foreach((str_split(strrev(chr((ord($data{0}) % 252 % 248 % 240 % 224 % 192) + 128) . substr($data, 1)))) as $k => $v)
        $ret += (ord($v) % 128) * pow(64, $k);
    return "&#$ret;";
    }

Example:
echo utf8_to_html("a b c c ž ? ? ? ? ()[]{}!#$?*");

Output:
a b &#269; &#263; &#382; &#12371; &#12395; &#12385; &#12431; ()[]{}!#$?*
Sadi 13-Jun-2007 03:38
Once again about polish letters. If you use fananf's solution, make sure that PHP file is coded with cp1250 or else it won't work. It's quite obvious, however I spent some time before I finally figured that out, so I thought I post it here.
alexlevin at kvadro dot net 20-May-2007 08:20
If you running Gentoo Linux and encounter problems with some PHP4 applications saying:
Call to undefined function: utf8_decode()
Try reemerge PHP4 with 'expat' flag enabled.
sam 06-Feb-2007 08:20
In addition to yannikh's note, to convert a hex utf8 string

<?php

echo utf8_decode("\x61\xc3\xb6\x61");
// works as expected

$abc="61c3b661";
$newstr = "";
$l = strlen($abc);
for ($i=0;$i<$l;$i+=2){
    $newstr .= "\x".$abc[$i].$abc[$i+1];
}
echo utf8_decode($newstr);
// or varieties  of "\x": "\\x" etc does NOT output what you want

echo utf8_decode(pack('H*',$abc));
// this outputs the correct string, like the first line.

?>
Ajgor 28-Dec-2006 05:38
small upgrade for polish decoding:

function utf82iso88592($text) {
 $text = str_replace("\xC4\x85", 'a', $text);
 $text = str_replace("\xC4\x84", 'A', $text);
 $text = str_replace("\xC4\x87", 'c', $text);
 $text = str_replace("\xC4\x86", 'C', $text);
 $text = str_replace("\xC4\x99", 'e', $text);
 $text = str_replace("\xC4\x98", 'E', $text);
 $text = str_replace("\xC5\x82", 'l', $text);
 $text = str_replace("\xC5\x81", 'L', $text);
 $text = str_replace("\xC3\xB3", 'ó', $text);
 $text = str_replace("\xC3\x93", 'Ó', $text);
 $text = str_replace("\xC5\x9B", 's', $text);
 $text = str_replace("\xC5\x9A", 'S', $text);
 $text = str_replace("\xC5\xBC", 'z', $text);
 $text = str_replace("\xC5\xBB", 'Z', $text);
 $text = str_replace("\xC5\xBA", 'z', $text);
 $text = str_replace("\xC5\xB9", 'Z', $text);
 $text = str_replace("\xc5\x84", 'n', $text);
 $text = str_replace("\xc5\x83", 'N', $text);

return $text;
} // utf82iso88592
paul.hayes at entropedia.co.uk 27-Oct-2006 07:10
I noticed that the utf-8 to html functions below are only for 2 byte long codes. Well I wanted 3 byte support (sorry haven't done 4, 5 or 6). Also I noticed the concatination of the character codes did have the hex prefix 0x and so failed with the large 2 byte codes)

<?
  public function utf2html (&$str) {

    $ret = "";
    $max = strlen($str);
    $last = 0;  // keeps the index of the last regular character
    for ($i=0; $i<$max; $i++) {
        $c = $str{$i};
        $c1 = ord($c);
        if ($c1>>5 == 6) {  // 110x xxxx, 110 prefix for 2 bytes unicode
            $ret .= substr($str, $last, $i-$last); // append all the regular characters we've passed
            $c1 &= 31; // remove the 3 bit two bytes prefix
            $c2 = ord($str{++$i}); // the next byte
            $c2 &= 63;  // remove the 2 bit trailing byte prefix
            $c2 |= (($c1 & 3) << 6); // last 2 bits of c1 become first 2 of c2
            $c1 >>= 2; // c1 shifts 2 to the right
            $ret .= "&#" . ($c1 * 0x100 + $c2) . ";"; // this is the fastest string concatenation
            $last = $i+1;
        }
        elseif ($c1>>4 == 14) {  // 1110 xxxx, 110 prefix for 3 bytes unicode
            $ret .= substr($str, $last, $i-$last); // append all the regular characters we've passed
            $c2 = ord($str{++$i}); // the next byte
            $c3 = ord($str{++$i}); // the third byte
            $c1 &= 15; // remove the 4 bit three bytes prefix
            $c2 &= 63;  // remove the 2 bit trailing byte prefix
            $c3 &= 63;  // remove the 2 bit trailing byte prefix
            $c3 |= (($c2 & 3) << 6); // last 2 bits of c2 become first 2 of c3
            $c2 >>=2; //c2 shifts 2 to the right
            $c2 |= (($c1 & 15) << 4); // last 4 bits of c1 become first 4 of c2
            $c1 >>= 4; // c1 shifts 4 to the right
            $ret .= '&#' . (($c1 * 0x10000) + ($c2 * 0x100) + $c3) . ';'; // this is the fastest string concatenation
            $last = $i+1;
        }
    }
    $str=$ret . substr($str, $last, $i); // append the last batch of regular characters
}
?>
tobias at code-x dot de 20-Oct-2006 05:13
converting uft8-html sign &#301; to uft8

<?
function uft8html2utf8( $s ) {
        if ( !function_exists('uft8html2utf8_callback') ) {
             function uft8html2utf8_callback($t) {
                     $dec = $t[1];
            if ($dec < 128) {
              $utf = chr($dec);
            } else if ($dec < 2048) {
              $utf = chr(192 + (($dec - ($dec % 64)) / 64));
              $utf .= chr(128 + ($dec % 64));
            } else {
              $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
              $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
              $utf .= chr(128 + ($dec % 64));
            }
            return $utf;
             }
        }
        return preg_replace_callback('|&#([0-9]{1,});|', 'uft8html2utf8_callback', $s );
}
echo uft8html2utf8('test: &#301;');
?>
2ge at NO2geSPAM dot us 26-Jan-2006 01:00
Hello all,

I like to use COOL (nice) URIs, example: http://example.com/try-something
I'm using UTF8 as input, so I have to write a function UTF8toASCII to have nice URI. Here is what I come with:

<?php
function urlize($url) {
 $search = array('/[^a-z0-9]/', '/--+/', '/^-+/', '/-+$/' );
 $replace = array( '-', '-', '', '');
 return preg_replace($search, $replace, utf2ascii($url));
}

function utf2ascii($string) {
 $iso88591  = "\\xE0\\xE1\\xE2\\xE3\\xE4\\xE5\\xE6\\xE7";
 $iso88591 .= "\\xE8\\xE9\\xEA\\xEB\\xEC\\xED\\xEE\\xEF";
 $iso88591 .= "\\xF0\\xF1\\xF2\\xF3\\xF4\\xF5\\xF6\\xF7";
 $iso88591 .= "\\xF8\\xF9\\xFA\\xFB\\xFC\\xFD\\xFE\\xFF";
 $ascii = "aaaaaaaceeeeiiiidnooooooouuuuyyy";
 return strtr(mb_strtolower(utf8_decode($string), 'ISO-8859-1'),$iso88591,$ascii);
}

echo urlize("Fucking ?m?l");

?>

I hope this helps someone.
php-net at ---NOSPAM---lc dot yi dot org 08-Dec-2005 12:04
I've just created this code snippet to improve the user-customizable emails sent by one of my websites.

The goal was to use UTF-8 (Unicode) so that non-english users have all the Unicode benefits, BUT also make life seamless for English (or specifically, English MS-Outlook users).  The niggle: Outlook prior to 2003 (?)  does not properly detect unicode emails.  When "smart quotes" from MS Word were pasted into a rich text area and saved in Unicode, then sent by email to an Outlook user, more often than not, these characters were wrongly rendered as "greek".

So, the following code snippet replaces a few strategic characters into html entities which Outlook XP (and possibly earlier) will render as expected.  [Code based on bits of code from previous posts on this and the htmlenties page]
<?php
    $badwordchars=array(
        "\xe2\x80\x98", // left single quote
        "\xe2\x80\x99", // right single quote
        "\xe2\x80\x9c", // left double quote
        "\xe2\x80\x9d", // right double quote
        "\xe2\x80\x94", // em dash
        "\xe2\x80\xa6" // elipses
    );
    $fixedwordchars=array(
        "&#8216;",
        "&#8217;",
        '&#8220;',
        '&#8221;',
        '&mdash;',
        '&#8230;'
    );
    $html=str_replace($badwordchars,$fixedwordchars,$html);
?>
yannikh at gmeil dot com 07-Dec-2005 11:34
I had to tackle a very interesting problem:

I wanted to replace all \xXX in a text by it's letters. Unfortunatelly XX were ASCII and not utf8. I solved my problem that way:
<?php preg_replace ('/\\\\x([0-9a-fA-F]{2})/e', "pack('H*',utf8_decode('\\1'))",$v); ?>
thierry.bo # netcourrier point com 30-Sep-2005 12:38
In response to fhoech (22-Sep-2005 11:55), I just tried a simultaneous test with the file UTF-8-test.txt using your regexp, 'j dot dittmer' (20-Sep-2005 06:30) regexp (message #56962), `php-note-2005` (17-Feb-2005 08:57) regexp in his message on `mb-detect-encoding` page (http://us3.php.net/manual/en/function.mb-detect-encoding.php#50087) who is using a regexp from the W3C (http://w3.org/International/questions/qa-forms-utf-8.html), and PHP mb_detect_encoding function.

Here are a summarize of the results :

201 lines are valid UTF8 strings using phpnote regexp
203 lines are valid UTF8 strings using j.dittmer regexp
200 lines are valid UTF8 strings using fhoech regexp
239 lines are valid  UTF8 strings using using mb_detect_encoding

Here are the lines with differences (left to right, phpnote, j.dittmer and fhoech) :

Line #70 : NOT UTF8|IS UTF8!|IS UTF8! :2.1.1 1 byte (U-00000000): ""
Line #79 : NOT UTF8|IS UTF8!|IS UTF8! :2.2.1 1 byte (U-0000007F): ""
Line #81 : IS UTF8!|IS UTF8!|NOT UTF8 :2.2.3 3 bytes (U-0000FFFF): "&#65535;" |
Line #267 : IS UTF8!|IS UTF8!|NOT UTF8 :5.3.1 U+FFFE = ef bf be = "&#65534;" |
Line #268 : IS UTF8!|IS UTF8!|NOT UTF8 :5.3.2 U+FFFF = ef bf bf = "&#65535;" |

Interesting is that you said that your regexp corrected j.dittmer regexp that failed on 5.3 section, but it my test I have the opposite result ?!

I ran this test on windows XP with PHP 4.3.11dev. Maybe these differences come from operating system, or PHP version.

For mb_detect_encoding I used the command :

mb_detect_encoding($line, 'UTF-8, ISO-8859-1, ASCII');
fhoech 22-Sep-2005 10:55
Sorry, I had a typo in my last comment. Corrected regexp:

^([\\x00-\\x7f]|
[\\xc2-\\xdf][\\x80-\\xbf]|
\\xe0[\\xa0-\\xbf][\\x80-\\xbf]|
[\\xe1-\\xec][\\x80-\\xbf]{2}|
\\xed[\\x80-\\x9f][\\x80-\\xbf]|
\\xef[\\x80-\\xbf][\\x80-\\xbd]|
\\xee[\\x80-\\xbf]{2}|
\xf0[\\x90-\\xbf][\\x80-\\xbf]{2}|
[\\xf1-\\xf3][\\x80-\\xbf]{3}|
\\xf4[\\x80-\\x8f][\\x80-\\xbf]{2})*$
fhoech 22-Sep-2005 10:12
JF Sebastian's regex is almost perfect as far as I'm concerned. I found one error (it failed section 5.3 "Other illegal code positions" from http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt) which I corrected as follows:

^([\\x00-\\x7f]|
[\\xc2-\\xdf][\\x80-\\xbf]|
\\xe0[\\xa0-\\xbf][\\x80-\\xbf]|
[\\xe1-\\xec][\\x80-\\xbf]{2}|
\\xed[\\x80-\\x9f][\\x80-\\xbf]|
\\xef[\\x80-\\xbf][\\x80-\\xbc]|
\\xee[\\x80-\\xbf]{2}|
\\xf0[\\x90-\\xbf][\\x80-\\xbf]{2}|
[\\xf1-\\xf3][\\x80-\\xbf]{3}|
\\xf4[\\x80-\\x8f][\\x80-\\xbf]{2})*$

(Again, concatenate to one single line to make it work)
j dot dittmer at portrix dot net 20-Sep-2005 05:30
The regex in the last comment has some typos. This is a
syntactically valid one, don't know if it's correct though.
You've to concat the expression in one long line.

^(
[\x00-\x7f]|
[\xc2-\xdf][\x80-\xbf]|
[\xe0][\xa0-\xbf][\x80-\xbf]|
[\xe1-\xec][\x80-\xbf]{2}|
[\xed][\x80-\x9f][\x80-\xbf]|
[\xee-\xef][\x80-\xbf]{2}|
[\xf0][\x90-\xbf][\x80-\xbf]{2}|
[\xf1-\xf3][\x80-\xbf]{3}|
[\xf4][\x80-\x8f][\x80-\xbf]{2}
)*$
rasmus at flajm dot se 19-Jan-2005 02:57
If you don't have the multibyte extension installed, here's a function to decode UTF-16 encoded strings. It support both BOM-less and BOM'ed strings, (big- and little-endian byte order.)

<?php
/**
 * Decode UTF-16 encoded strings.
 *
 * Can handle both BOM'ed data and un-BOM'ed data.
 * Assumes Big-Endian byte order if no BOM is available.
 *
 * @param   string  $str  UTF-16 encoded data to decode.
 * @return  string  UTF-8 / ISO encoded data.
 * @access  public
 * @version 0.1 / 2005-01-19
 * @author  Rasmus Andersson {@link http://rasmusandersson.se/}
 * @package Groupies
 */
function utf16_decode( $str ) {
    if( strlen($str) < 2 ) return $str;
    $bom_be = true;
    $c0 = ord($str{0});
    $c1 = ord($str{1});
    if( $c0 == 0xfe && $c1 == 0xff ) { $str = substr($str,2); }
    elseif( $c0 == 0xff && $c1 == 0xfe ) { $str = substr($str,2); $bom_be = false; }
    $len = strlen($str);
    $newstr = '';
    for($i=0;$i<$len;$i+=2) {
        if( $bom_be ) { $val = ord($str{$i})   << 4; $val += ord($str{$i+1}); }
        else {        $val = ord($str{$i+1}) << 4; $val += ord($str{$i}); }
        $newstr .= ($val == 0x228) ? "\n" : chr($val);
    }
    return $newstr;
}
?>
Aidan Kehoe <php-manual at parhasard dot net> 31-Jan-2004 05:35
The fastest way I've found to check if something is valid UTF-8 is
<?php
if (iconv('UTF-8', 'UTF-8', $input) != $input) {
        /* It's not UTF-8--for me, it's probably CP1252, the Windows
           version of Latin 1, with directed quotation marks and
           the Euro sign.  */
}
 ?>.
The iconv() C library fails if it's told a string is UTF-8 and it isn't; the PHP one doesn't, it just returns the conversion up to the point of failure, so you have to compare the result to the input to find out if the conversion succeeded.
gto at interia dot pl 25-Nov-2003 07:12
Correction to function converting utf82iso88592 and iso88592tutf8.
Janusz forgot about "&#324;", and "&#380;" exchanged from "&#378;" here and there.

GTo

function utf82iso88592($tekscik) {
     $tekscik = str_replace("\xC4\x85", "&#261;", $tekscik);
     $tekscik = str_replace("\xC4\x84", '&#260;', $tekscik);
     $tekscik = str_replace("\xC4\x87", '&#263;', $tekscik);
     $tekscik = str_replace("\xC4\x86", '&#262;', $tekscik);
     $tekscik = str_replace("\xC4\x99", '&#281;', $tekscik);
     $tekscik = str_replace("\xC4\x98", '&#280;', $tekscik);
     $tekscik = str_replace("\xC5\x82", '&#322;', $tekscik);
     $tekscik = str_replace("\xC5\x81", '&#321;', $tekscik);
     $tekscik = str_replace("\xC5\x84", '&#324;', $tekscik);
     $tekscik = str_replace("\xC5\x83", '&#323;', $tekscik);
     $tekscik = str_replace("\xC3\xB3", '?', $tekscik);
     $tekscik = str_replace("\xC3\x93", '?', $tekscik);
     $tekscik = str_replace("\xC5\x9B", '&#347;', $tekscik);
     $tekscik = str_replace("\xC5\x9A", '&#346;', $tekscik);
     $tekscik = str_replace("\xC5\xBC", '&#380;', $tekscik);
     $tekscik = str_replace("\xC5\xBB", '&#379;', $tekscik);
     $tekscik = str_replace("\xC5\xBA", '&#378;', $tekscik);
     $tekscik = str_replace("\xC5\xB9", '&#377;', $tekscik);
     return $tekscik;
} // utf82iso88592

function iso885922utf8($tekscik) {
     $tekscik = str_replace("&#261;", "\xC4\x85", $tekscik);
     $tekscik = str_replace('&#260;', "\xC4\x84", $tekscik);
     $tekscik = str_replace('&#263;', "\xC4\x87", $tekscik);
     $tekscik = str_replace('&#262;', "\xC4\x86", $tekscik);
     $tekscik = str_replace('&#281;', "\xC4\x99", $tekscik);
     $tekscik = str_replace('&#280;', "\xC4\x98", $tekscik);
     $tekscik = str_replace('&#322;', "\xC5\x82", $tekscik);
     $tekscik = str_replace('&#321;', "\xC5\x81", $tekscik);
     $tekscik = str_replace('&#324;', "\xC5\x84", $tekscik);
     $tekscik = str_replace('&#323;',"\xC5\x83", $tekscik);
     $tekscik = str_replace('?', "\xC3\xB3", $tekscik);
     $tekscik = str_replace('?', "\xC3\x93", $tekscik);
     $tekscik = str_replace('&#347;', "\xC5\x9B", $tekscik);
     $tekscik = str_replace('&#346;', "\xC5\x9A", $tekscik);
     $tekscik = str_replace('&#380;', "\xC5\xBC", $tekscik);
     $tekscik = str_replace('&#379;', "\xC5\xBB", $tekscik);
     $tekscik = str_replace('&#378;', "\xC5\xBA", $tekscik);
     $tekscik = str_replace('&#377;', "\xC5\xB9", $tekscik);
     return $tekscik;
} // iso885922utf8


Convertit une chaîne ISO-8859-1 en UTF-8

  • « utf8_decode
  • xml_error_string »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Convertit une chaîne ISO-8859-1 en UTF-8

utf8_encode

(PHP 4, PHP 5, PHP 7, PHP 8)

utf8_encode — Convertit une chaîne ISO-8859-1 en UTF-8

Description

utf8_encode ( string $string ) : string

Cette fonction convertie la chaîne string depuis l'encodage ISO-8859-1 vers UTF-8.

Note:

De nombreuses pages Web marquées comme utilisant l'encodage de caratère ISO-8859-1 utilisent effectivement un encodage similaire à Windows-1252, et les navigateurs Web interpréterons les pages Web ISO-8859-1 comme Windows-1252. Les caractéristiques supplémentaires de Windows-1252 sont des caractères imprimables, tels que le signe euro (€) et les guillemets bouclés (“ ”), à la place de certains caractères de contrôle de l'ISO-8859-1. Cette fonction ne convertira pas ces caractères Windows-1252 correctement. Utilisez une fonction différente si une conversion Windows-1252 est nécessaire.

Liste de paramètres

string

Une chaîne ISO-8859-1.

Valeurs de retour

Retour la version UTF-8 de string.

Historique

Version | Description
7.2.0 | Cette fonction a été déplacée dans le coeur de PHP, auparavant, il était nécessaire d'installer l'extension XML pour l'utiliser.

Voir aussi

  • utf8_decode() - Convertit une chaîne UTF-8 en ISO-8859-1 - Réalise la conversion inverse
  • mb_convert_encoding() - Conversion d'encodage - Convertit entre différents codages de caractères, y compris UTF-8, ISO-8859-1 et Windows-1252
  • iconv() - Convertit une chaîne dans un jeu de caractères - Convertit entre différents codages de caractères
  • recode_string() - Recode une chaîne en fonction de la requête - Convertit entre différents codages de caractères

User Contributed Notes

rattones at gmail dot com 18-Feb-2021 03:08
/**
 * Convert all values of an array to utf8_encode
 * @author Marcelo Ratton
 * @version 1.0
 *
 * @param  array  $arr   array to encode values
 * @param  bool   $keys  true to convert keys to UTF8
 * @return array  same   array but with all values encoded to UTF8
 */
function arrayEncodeToUTF8(array $arr, bool $keys= false) : array {
  $ret= [];
  foreach ($arr as $k=>$v) {
    if (is_array($v)) {
      $ret[$k]= arrayEncodeToUTF8($v);
    } else {
      if ($keys) {
        $k= utf8_encode((string)$k);
      }
      $ret[$k]= utf8_encode((string)$v);
    }
  }

  return $ret;
}
Pini 16-Nov-2015 03:14
My version of utf8_encode_deep,
In case you need one that returns a value without changing the original.

        /**
        * Convert Anything To UTF-8
        * @param mixed $var The variable you want to convert.
        * @param boolean $deep Deep convertion? (*Default: TRUE).
        * @return mixed
        */
        function anything_to_utf8($var,$deep=TRUE){
            if(is_array($var)){
                foreach($var as $key => $value){
                    if($deep){
                        $var[$key] = anything_to_utf8($value,$deep);
                    }elseif(!is_array($value) && !is_object($value) && !mb_detect_encoding($value,'utf-8',true)){
                         $var[$key] = utf8_encode($var);
                    }
                }
                return $var;
            }elseif(is_object($var)){
                foreach($var as $key => $value){
                    if($deep){
                        $var->$key = anything_to_utf8($value,$deep);
                    }elseif(!is_array($value) && !is_object($value) && !mb_detect_encoding($value,'utf-8',true)){
                         $var->$key = utf8_encode($var);
                    }
                }
                return $var;
            }else{
                return (!mb_detect_encoding($var,'utf-8',true))?utf8_encode($var):$var;
            }
        }
a dot rueedlinger at gmail dot com 22-Jun-2013 01:06
If you need a function which converts a string array into a utf8 encoded string array then this function might be useful for you:

<?php
function utf8_string_array_encode(&$array){
    $func = function(&$value,&$key){
        if(is_string($value)){
            $value = utf8_encode($value);
        }
        if(is_string($key)){
            $key = utf8_encode($key);
        }
        if(is_array($value)){
            utf8_string_array_encode($value);
        }
    };
    array_walk($array,$func);
    return $array;
}
?>
Oscar Broman 06-Sep-2012 11:15
Walk through nested arrays/objects and utf8 encode all strings.

<?php
// Usage
class Foo {
    public $somevar = 'whoop whoop';
}

$structure = array(
    'object' => (object) array(
        'entry' => 'hello wörld',
        'another_array' => array(
            'string',
            1234,
            'another string'
        )
    ),
    'string' => 'foo',
    'foo_object' => new Foo
);

utf8_encode_deep($structure);

// $structure is now utf8 encoded
print_r($structure);

// The function
function utf8_encode_deep(&$input) {
    if (is_string($input)) {
        $input = utf8_encode($input);
    } else if (is_array($input)) {
        foreach ($input as &$value) {
            utf8_encode_deep($value);
        }

        unset($value);
    } else if (is_object($input)) {
        $vars = array_keys(get_object_vars($input));

        foreach ($vars as $var) {
            utf8_encode_deep($input->$var);
        }
    }
}
?>
deceze at gmail dot com 14-Jul-2011 06:51
Please note that utf8_encode only converts a string encoded in ISO-8859-1 to UTF-8. A more appropriate name for it would be "iso88591_to_utf8". If your text is not encoded in  ISO-8859-1, you do not need this function. If your text is already in UTF-8, you do not need this function. In fact, applying this function to text that is not encoded in ISO-8859-1 will most likely simply garble that text.

If you need to convert text from any encoding to any other encoding, look at iconv() instead.
powtac 4t gmx d0t de 11-Feb-2011 01:11
I tried a lot of things, but this seems to be the final fail save method to convert any string to proper UTF-8.

<?php
function _convert($content) {
    if(!mb_check_encoding($content, 'UTF-8')
        OR !($content === mb_convert_encoding(mb_convert_encoding($content, 'UTF-32', 'UTF-8' ), 'UTF-8', 'UTF-32'))) {

        $content = mb_convert_encoding($content, 'UTF-8');

        if (mb_check_encoding($content, 'UTF-8')) {
            // log('Converted to UTF-8');
        } else {
            // log('Could not converted to UTF-8');
        }
    }
    return $content;
}
?>
Yumok 15-Sep-2010 04:26
Avoiding use of preg_match to detect if utf8_encode is needed:

<?php
                $string = $string_input; // avoid being destructive

                $string = preg_replace("#[\x09\x0A\x0D\x20-\x7E]#"        ,"",$string);         // ASCII
                $string = preg_replace("#[\xC2-\xDF][\x80-\xBF]#"            ,"",$string);             // non-overlong 2-byte
                $string = preg_replace("#\xE0[\xA0-\xBF][\x80-\xBF]#"    ,"",$string);     // excluding overlongs
                $string = preg_replace("#[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}#","",$string);     // straight 3-byte
                $string = preg_replace("#\xED[\x80-\x9F][\x80-\xBF]#"    ,"",$string);     // excluding surrogates
                $string = preg_replace("#\xF0[\x90-\xBF][\x80-\xBF]{2}#","",$string);     // planes 1-3
                $string = preg_replace("#[\xF1-\xF3][\x80-\xBF]{3}#"    ,"",$string);     //  planes 4-15
                $string = preg_replace("#\xF4[\x80-\x8F][\x80-\xBF]{2}#","",$string);     // plane 16

                $rc = ($string == ""?true:false);
?>
rogeriogirodo at gmail dot com 19-Mar-2009 04:24
This function may be useful do encode array keys and values [and checks first to see if it's already in UTF format]:

<?php
public static function to_utf8($in)
{
        if (is_array($in)) {
            foreach ($in as $key => $value) {
                $out[to_utf8($key)] = to_utf8($value);
            }
        } elseif(is_string($in)) {
            if(mb_detect_encoding($in) != "UTF-8")
                return utf8_encode($in);
            else
                return $in;
        } else {
            return $in;
        }
        return $out;
}
?>

Hope this may help.

[NOTE BY danbrown AT php DOT net: Original function written by (cmyk777 AT gmail DOT com) on 28-JAN-09.]
www.tricinty.com 11-Jun-2008 03:43
<?php
    /**
    * Encodes an ISO-8859-1 mixed variable to UTF-8 (PHP 4, PHP 5 compat)
    * @param    mixed    $input An array, associative or simple
    * @param    boolean  $encode_keys optional
    * @return    mixed     ( utf-8 encoded $input)
    */

    function utf8_encode_mix($input, $encode_keys=false)
    {
        if(is_array($input))
        {
            $result = array();
            foreach($input as $k => $v)
            {
                $key = ($encode_keys)? utf8_encode($k) : $k;
                $result[$key] = utf8_encode_mix( $v, $encode_keys);
            }
        }
        else
        {
            $result = utf8_encode($input);
        }

        return $result;
    }
?>
emze at donazga dot net 17-Dec-2006 09:42
/*
Every function seen so far is incomplete or resource consumpting. Here are two -- integer 2 utf sequence (i3u) and utf sequence to integer (u3i). Below is a code snippet that checks well behavior at the range boundaries.

Someday they might be hardcoded into PHP...
*/

function i3u($i) { // returns UCS-16 or UCS-32 to UTF-8 from an integer
  $i=(int)$i; // integer?
  if ($i<0) return false; // positive?
  if ($i<=0x7f) return chr($i); // range 0
  if (($i & 0x7fffffff) <> $i) return '?'; // 31 bit?
  if ($i<=0x7ff) return chr(0xc0 | ($i >> 6)) . chr(0x80 | ($i & 0x3f));
  if ($i<=0xffff) return chr(0xe0 | ($i >> 12)) . chr(0x80 | ($i >> 6) & 0x3f)
      . chr(0x80  | $i & 0x3f);
  if ($i<=0x1fffff) return chr(0xf0 | ($i >> 18)) . chr(0x80 | ($i >> 12) & 0x3f)
      . chr(0x80 | ($i >> 6) & 0x3f) . chr(0x80  | $i & 0x3f);
  if ($i<=0x3ffffff) return chr(0xf8 | ($i >> 24)) . chr(0x80 | ($i >> 18) & 0x3f)
      . chr(0x80 | ($i >> 12) & 0x3f) . chr(0x80 | ($i >> 6) & 0x3f) . chr(0x80  | $i & 0x3f);
  return chr(0xfc | ($i >> 30)) . chr(0x80 | ($i >> 24) & 0x3f) . chr(0x80 | ($i >> 18) & 0x3f)
      . chr(0x80 | ($i >> 12) & 0x3f) . chr(0x80 | ($i >> 6) & 0x3f) . chr(0x80  | $i & 0x3f);
}

function u3i($s,$strict=1) { // returns integer on valid UTF-8 seq, NULL on empty, else FALSE
  // NOT strict: takes only DATA bits, present or not; strict: length and bits checking
  if ($s=='') return NULL;
  $l=strlen($s); $o=ord($s{0});
  if ($o <= 0x7f && $l==1) return $o;
  if ($l>6 && $strict) return false;
  if ($strict) for ($i=1;$i<$l;$i++) if (ord($s{$i}) > 0xbf || ord($s{$i})< 0x80) return false;
  if ($o < 0xc2) return false; // no-go even if strict=0
  if ($o <= 0xdf && ($l=2 && $strict)) return (($o & 0x1f) << 6 | (ord($s{1}) & 0x3f));
  if ($o <= 0xef && ($l=3 && $strict)) return (($o & 0x0f) << 12 | (ord($s{1}) & 0x3f) << 6
     |  (ord($s{2}) & 0x3f));
  if ($o <= 0xf7 && ($l=4 && $strict)) return (($o & 0x07) << 18 | (ord($s{1}) & 0x3f) << 12
     | (ord($s{2}) & 0x3f) << 6 |  (ord($s{3}) & 0x3f));
  if ($o <= 0xfb && ($l=5 && $strict)) return (($o & 0x03) << 24 | (ord($s{1}) & 0x3f) << 18
     | (ord($s{2}) & 0x3f) << 12 | (ord($s{3}) & 0x3f) << 6 |  (ord($s{4}) & 0x3f));
  if ($o <= 0xfd && ($l=6 && $strict)) return (($o & 0x01) << 30 | (ord($s{1}) & 0x3f) << 24
     | (ord($s{2}) & 0x3f) << 18 | (ord($s{3}) & 0x3f) << 12
     | (ord($s{4}) & 0x3f) << 6 |  (ord($s{5}) & 0x3f));
  return false;
}

// boundary behavior checking
$do=array(0x7f,0x7ff,0xffff,0x1fffff,0x3ffffff,0x7fffffff);
foreach ($do as $ii) for ($i=$ii;$i<=$ii+1; $i++) {
  $o=i3u($i);
  for ($j=0;$j<strlen($o);$j++) print "O[$j]=" . sprintf('%08b',ord($o{$j})) . ", ";
  print "c=$i, o=[$o].\n";
  print "Back: [$o] => [" . u3i($o) . "]\n";
}
rocketman 16-Mar-2006 04:46
If you are looking for a function to replace special characters with the hex-utf-8 value (e.g. für Webservice-Security/WSS4J compliancy) you might use this:

$textstart = "Größe";
$utf8 ='';
$max = strlen($txt);

for ($i = 0; $i < $max; $i++) {

if ($txt{i} == "&"){
$neu = "&x26;";
}
elseif ((ord($txt{$i}) < 32) or (ord($txt{$i}) > 127)){
$neu = urlencode(utf8_encode($txt{$i}));
$neu = preg_replace('#\%(..)\%(..)\%(..)#','&#x\1;&#x\2;&#x\3;',$neu);
$neu = preg_replace('#\%(..)\%(..)#','&#x\1;&#x\2;',$neu);
$neu = preg_replace('#\%(..)#','&#x\1;',$neu);
}
else {
$neu = $txt{$i};
}

$utf8 .= $neu;
} // for $i

$textnew = $utf8;

In this example $textnew will be "Gr&#xC3;&#xB6;&#xC3;&#x9F;e"
mailing at jcn50 dot com 20-Jan-2006 10:40
I recommend using this alternative for every language:

$new=mb_convert_encoding($s,"UTF-8","auto");

Don't forget to set all your pages to "utf-8" encoding, otherwise just use HTML entities.

jcn50.
04-Nov-2005 02:34
// Reads a file story.txt ascii (as typed on keyboard)
// converts it to Georgian character using utf8 encoding
// if I am correct(?) just as it should be when typed on Georgian computer
// it outputs it as an html file
//
// http://www.comweb.nl/keys_to_georgian.html
// http://www.comweb.nl/keys_to_georgian.php
// http://www.comweb.nl/story.txt

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<HTML>
<HEAD>
<TITLE>keys to unicode code</TITLE>

// this meta tag is needed
<meta http-equiv="Content-Type" content="text/html;CHARSET=Windows-1252" >

// note the sylfean font seems to be standard installed on Windows XP
// It supports Georgian

<style TYPE="text/css">
<!--
body {font-family:sylfaen; }
-->
</style>
</HEAD>

<BODY>

<?
$eng=array(97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
112,113,114,115,116,117,118,119,120,121,122,87,82,84,83,
67,74,90);
$geo=array(4304,4305,4330,4307,4308,4324,4306,4336,4312,4335,4313,
4314,4315,4316,4317,4318,4325,4320,4321,4322,4323,4309,
4332,4334,4327,4310,4333,4326,4311,4328,4329,4319,4331,
91,93,59,39,44,46,96);

$fc=file("story.txt");
foreach($fc as $line)
{
   $spacestart=1;
   for ($i=0; $i<strlen($line); $i+=1)
   {
      $character=ord(substr($line,$i,1));
      $found=0;
      for ($k=0; $k<count($eng); $k+=1)
      {
         if ($eng[$k]==$character)
         {
             print code2utf( $geo[$k] );
             $found=1;
         }
      }
      if ($found==0)
      {
         if ($character==126 || $character==32 || $character==10 || $character==9)
         {
            if ($character==9)  { print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'; }
            if ($character==10) { print "<BR>\n"; }
            if ($character==32)
            {
               if ($spacestart==1) {print '&nbsp;'; } else { print " "; }
            }
            if ($character==126){ print "~";      }
         } else
         {
            print substr($line,$i,1);
         }
      }
      if ($character!=32) { $spacestart=0; }
   }
}

/**
 * Function coverts number of utf char into that character.
 * Function taken from: http://sk2.php.net/manual/en/function.utf8-encode.php#49336
 *
 * @param int $num
 * @return utf8char
*/
function code2utf($num)
{
   if($num<128)return chr($num);
   if($num<2048)return chr(($num>>6)+192).chr(($num&63)+128);
   if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
   if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128);
   return '';
}
?>

</BODY>
</HTML>
Janci 04-Nov-2005 04:00
I was searching for a function similar to Javascript's unescape(). In most cases it is OK to use url_decode() function but not if you've got UTF characters in the strings. They are converted into %uXXXX entities that url_decode() cannot handle.
I googled the net and found a function which actualy converts these entities into HTML entities (&#xxx;) that your browser can show correctly. If you're OK with that, the function can be found here: http://pure-essence.net/stuff/code/utf8RawUrlDecode.phps

But it was not OK with me because I needed a string in my charset to make some comparations and other stuff. So I have modified the above function and in conjuction with code2utf() function mentioned in some other note here, I have managed to achieve my goal:

<?php
/**
 * Function converts an Javascript escaped string back into a string with specified charset (default is UTF-8).
 * Modified function from http://pure-essence.net/stuff/code/utf8RawUrlDecode.phps
 *
 * @param string $source escaped with Javascript's escape() function
 * @param string $iconv_to destination character set will be used as second paramether in the iconv function. Default is UTF-8.
 * @return string
 */
function unescape($source, $iconv_to = 'UTF-8') {
    $decodedStr = '';
    $pos = 0;
    $len = strlen ($source);
    while ($pos < $len) {
        $charAt = substr ($source, $pos, 1);
        if ($charAt == '%') {
            $pos++;
            $charAt = substr ($source, $pos, 1);
            if ($charAt == 'u') {
                // we got a unicode character
                $pos++;
                $unicodeHexVal = substr ($source, $pos, 4);
                $unicode = hexdec ($unicodeHexVal);
                $decodedStr .= code2utf($unicode);
                $pos += 4;
            }
            else {
                // we have an escaped ascii character
                $hexVal = substr ($source, $pos, 2);
                $decodedStr .= chr (hexdec ($hexVal));
                $pos += 2;
            }
        }
        else {
            $decodedStr .= $charAt;
            $pos++;
        }
    }

    if ($iconv_to != "UTF-8") {
        $decodedStr = iconv("UTF-8", $iconv_to, $decodedStr);
    }

    return $decodedStr;
}

/**
 * Function coverts number of utf char into that character.
 * Function taken from: http://sk2.php.net/manual/en/function.utf8-encode.php#49336
 *
 * @param int $num
 * @return utf8char
 */
function code2utf($num){
    if($num<128)return chr($num);
    if($num<2048)return chr(($num>>6)+192).chr(($num&63)+128);
    if($num<65536)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
    if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128);
    return '';
}
?>
suttichai at ceforce dot com 28-May-2005 12:26
This function I use convert Thai font (iso-8859-11) to UTF-8. For my case, It work properly. Please try to use this function if you have a problem to convert charset iso-8859-11 to UTF-8.

function iso8859_11toUTF8($string) {

     if ( ! ereg("[\241-\377]", $string) )
         return $string;

     $iso8859_11 = array(
"\xa1" => "\xe0\xb8\x81",
"\xa2" => "\xe0\xb8\x82",
"\xa3" => "\xe0\xb8\x83",
"\xa4" => "\xe0\xb8\x84",
"\xa5" => "\xe0\xb8\x85",
"\xa6" => "\xe0\xb8\x86",
"\xa7" => "\xe0\xb8\x87",
"\xa8" => "\xe0\xb8\x88",
"\xa9" => "\xe0\xb8\x89",
"\xaa" => "\xe0\xb8\x8a",
"\xab" => "\xe0\xb8\x8b",
"\xac" => "\xe0\xb8\x8c",
"\xad" => "\xe0\xb8\x8d",
"\xae" => "\xe0\xb8\x8e",
"\xaf" => "\xe0\xb8\x8f",
"\xb0" => "\xe0\xb8\x90",
"\xb1" => "\xe0\xb8\x91",
"\xb2" => "\xe0\xb8\x92",
"\xb3" => "\xe0\xb8\x93",
"\xb4" => "\xe0\xb8\x94",
"\xb5" => "\xe0\xb8\x95",
"\xb6" => "\xe0\xb8\x96",
"\xb7" => "\xe0\xb8\x97",
"\xb8" => "\xe0\xb8\x98",
"\xb9" => "\xe0\xb8\x99",
"\xba" => "\xe0\xb8\x9a",
"\xbb" => "\xe0\xb8\x9b",
"\xbc" => "\xe0\xb8\x9c",
"\xbd" => "\xe0\xb8\x9d",
"\xbe" => "\xe0\xb8\x9e",
"\xbf" => "\xe0\xb8\x9f",
"\xc0" => "\xe0\xb8\xa0",
"\xc1" => "\xe0\xb8\xa1",
"\xc2" => "\xe0\xb8\xa2",
"\xc3" => "\xe0\xb8\xa3",
"\xc4" => "\xe0\xb8\xa4",
"\xc5" => "\xe0\xb8\xa5",
"\xc6" => "\xe0\xb8\xa6",
"\xc7" => "\xe0\xb8\xa7",
"\xc8" => "\xe0\xb8\xa8",
"\xc9" => "\xe0\xb8\xa9",
"\xca" => "\xe0\xb8\xaa",
"\xcb" => "\xe0\xb8\xab",
"\xcc" => "\xe0\xb8\xac",
"\xcd" => "\xe0\xb8\xad",
"\xce" => "\xe0\xb8\xae",
"\xcf" => "\xe0\xb8\xaf",
"\xd0" => "\xe0\xb8\xb0",
"\xd1" => "\xe0\xb8\xb1",
"\xd2" => "\xe0\xb8\xb2",
"\xd3" => "\xe0\xb8\xb3",
"\xd4" => "\xe0\xb8\xb4",
"\xd5" => "\xe0\xb8\xb5",
"\xd6" => "\xe0\xb8\xb6",
"\xd7" => "\xe0\xb8\xb7",
"\xd8" => "\xe0\xb8\xb8",
"\xd9" => "\xe0\xb8\xb9",
"\xda" => "\xe0\xb8\xba",
"\xdf" => "\xe0\xb8\xbf",
"\xe0" => "\xe0\xb9\x80",
"\xe1" => "\xe0\xb9\x81",
"\xe2" => "\xe0\xb9\x82",
"\xe3" => "\xe0\xb9\x83",
"\xe4" => "\xe0\xb9\x84",
"\xe5" => "\xe0\xb9\x85",
"\xe6" => "\xe0\xb9\x86",
"\xe7" => "\xe0\xb9\x87",
"\xe8" => "\xe0\xb9\x88",
"\xe9" => "\xe0\xb9\x89",
"\xea" => "\xe0\xb9\x8a",
"\xeb" => "\xe0\xb9\x8b",
"\xec" => "\xe0\xb9\x8c",
"\xed" => "\xe0\xb9\x8d",
"\xee" => "\xe0\xb9\x8e",
"\xef" => "\xe0\xb9\x8f",
"\xf0" => "\xe0\xb9\x90",
"\xf1" => "\xe0\xb9\x91",
"\xf2" => "\xe0\xb9\x92",
"\xf3" => "\xe0\xb9\x93",
"\xf4" => "\xe0\xb9\x94",
"\xf5" => "\xe0\xb9\x95",
"\xf6" => "\xe0\xb9\x96",
"\xf7" => "\xe0\xb9\x97",
"\xf8" => "\xe0\xb9\x98",
"\xf9" => "\xe0\xb9\x99",
"\xfa" => "\xe0\xb9\x9a",
"\xfb" => "\xe0\xb9\x9b"
 );

     $string=strtr($string,$iso8859_11);
     return $string;
 }

Suttichai Mesaard-www.ceforce.com
bisqwit at iki dot fi 20-May-2005 01:15
For reference, it may be insightful to point out that:
  utf8_encode($s)
is actually identical to:
  recode_string('latin1..utf8', $s)
and:
  iconv('iso-8859-1', 'utf-8', $s)
That is, utf8_encode is a specialized case of character set conversions.

If your string to be converted to utf-8 is something other than iso-8859-1 (such as iso-8859-2 (Polish/Croatian)), you should use recode_string() or iconv() instead rather than trying to devise complex str_replace statements.
JF Sebastian 09-Apr-2005 03:54
The following Perl regular expression tests if a string is well-formed Unicode UTF-8 (Broken up after each | since long lines are not permitted here. Please join as a single line, no spaces, before use.):

^([\x00-\x7f]|
[\xc2-\xdf][\x80-\xbf]|
\xe0[\xa0-\xbf][\x80-\xbf]|
[\xe1-\xec][\x80-\xbf]{2}|
\xed[\x80-\x9f][\x80-\xbf]|
[\xee-\xef][\x80-\xbf]{2}|
f0[\x90-\xbf][\x80-\xbf]{2}|
[\xf1-\xf3][\x80-\xbf]{3}|
\xf4[\x80-\x8f][\x80-\xbf]{2})*$

NOTE: This strictly follows the Unicode standard 4.0, as described in chapter 3.9, table 3-6, "Well-formed UTF-8 byte sequences" ( http://www.unicode.org/versions/Unicode4.0.0/ch03.pdf#G31703 ).

ISO-10646, a super-set of Unicode, uses UTF-8 (there called "UCS", see http://www.unicode.org/faq/utf_bom.html#1 ) in a relaxed variant that supports a 31-bit space encoded into up to six bytes instead of Unicode's 21 bits in up to four bytes. To check for ISO-10646 UTF-8, use the following Perl regular expression (again, broken up, see above):

^([\x00-\x7f]|
[\xc0-\xdf][\x80-\xbf]|
[\xe0-\xef][\x80-\xbf]{2}|
[\xf0-\xf7][\x80-\xbf]{3}|
[\xf8-\xfb][\x80-\xbf]{4}|
[\xfc-\xfd][\x80-\xbf]{5})*$

The following function may be used with above expressions for a quick UTF-8 test, e.g. to distinguish ISO-8859-1-data from UTF-8-data if submitted from a <form accept-charset="utf-8,iso-8859-1" method=..>.

function is_utf8($string) {
   return (preg_match('/[insert regular expression here]/', $string) === 1);
}
hrpeters (at) gmx (dot) net 13-Dec-2004 10:46
// Validate Unicode UTF-8 Version 4
// This function takes as reference the table 3.6 found at http://www.unicode.org/versions/Unicode4.0.0/ch03.pdf
// It also flags overlong bytes as error

function is_validUTF8($str)
{
    // values of -1 represent disalloweded values for the first bytes in current UTF-8
    static $trailing_bytes = array (
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
        -1,-1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
        2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
    );

    $ups = unpack('C*', $str);
    if (!($aCnt = count($ups))) return true; // Empty string *is* valid UTF-8
    for ($i = 1; $i <= $aCnt;)
    {
        if (!($tbytes = $trailing_bytes[($b1 = $ups[$i++])])) continue;
        if ($tbytes == -1) return false;

        $first = true;
        while ($tbytes > 0 && $i <= $aCnt)
        {
            $cbyte = $ups[$i++];
            if (($cbyte & 0xC0) != 0x80) return false;

            if ($first)
            {
                switch ($b1)
                {
                    case 0xE0:
                        if ($cbyte < 0xA0) return false;
                        break;
                    case 0xED:
                        if ($cbyte > 0x9F) return false;
                        break;
                    case 0xF0:
                        if ($cbyte < 0x90) return false;
                        break;
                    case 0xF4:
                        if ($cbyte > 0x8F) return false;
                        break;
                    default:
                        break;
                }
                $first = false;
            }
            $tbytes--;
        }
        if ($tbytes) return false; // incomplete sequence at EOS
    }
    return true;
}
Mark AT modernbill DOT com 09-Nov-2004 11:56
If you haven't guessed already: If the UTF-8 character has no representation in the ISO-8859-1 codepage, a ? will be returned. You might want to wrap a function around this to make sure you aren't saving a bunch of ???? into your database.
Aidan Kehoe <php-manual at parhasard dot net> 30-Aug-2004 07:05
Here's some code that addresses the issue that Steven describes in the previous comment;

<?php

/* This structure encodes the difference between ISO-8859-1 and Windows-1252,
   as a map from the UTF-8 encoding of some ISO-8859-1 control characters to
   the UTF-8 encoding of the non-control characters that Windows-1252 places
   at the equivalent code points. */

$cp1252_map = array(
    "\xc2\x80" => "\xe2\x82\xac", /* EURO SIGN */
    "\xc2\x82" => "\xe2\x80\x9a", /* SINGLE LOW-9 QUOTATION MARK */
    "\xc2\x83" => "\xc6\x92",     /* LATIN SMALL LETTER F WITH HOOK */
    "\xc2\x84" => "\xe2\x80\x9e", /* DOUBLE LOW-9 QUOTATION MARK */
    "\xc2\x85" => "\xe2\x80\xa6", /* HORIZONTAL ELLIPSIS */
    "\xc2\x86" => "\xe2\x80\xa0", /* DAGGER */
    "\xc2\x87" => "\xe2\x80\xa1", /* DOUBLE DAGGER */
    "\xc2\x88" => "\xcb\x86",     /* MODIFIER LETTER CIRCUMFLEX ACCENT */
    "\xc2\x89" => "\xe2\x80\xb0", /* PER MILLE SIGN */
    "\xc2\x8a" => "\xc5\xa0",     /* LATIN CAPITAL LETTER S WITH CARON */
    "\xc2\x8b" => "\xe2\x80\xb9", /* SINGLE LEFT-POINTING ANGLE QUOTATION */
    "\xc2\x8c" => "\xc5\x92",     /* LATIN CAPITAL LIGATURE OE */
    "\xc2\x8e" => "\xc5\xbd",     /* LATIN CAPITAL LETTER Z WITH CARON */
    "\xc2\x91" => "\xe2\x80\x98", /* LEFT SINGLE QUOTATION MARK */
    "\xc2\x92" => "\xe2\x80\x99", /* RIGHT SINGLE QUOTATION MARK */
    "\xc2\x93" => "\xe2\x80\x9c", /* LEFT DOUBLE QUOTATION MARK */
    "\xc2\x94" => "\xe2\x80\x9d", /* RIGHT DOUBLE QUOTATION MARK */
    "\xc2\x95" => "\xe2\x80\xa2", /* BULLET */
    "\xc2\x96" => "\xe2\x80\x93", /* EN DASH */
    "\xc2\x97" => "\xe2\x80\x94", /* EM DASH */

    "\xc2\x98" => "\xcb\x9c",     /* SMALL TILDE */
    "\xc2\x99" => "\xe2\x84\xa2", /* TRADE MARK SIGN */
    "\xc2\x9a" => "\xc5\xa1",     /* LATIN SMALL LETTER S WITH CARON */
    "\xc2\x9b" => "\xe2\x80\xba", /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
    "\xc2\x9c" => "\xc5\x93",     /* LATIN SMALL LIGATURE OE */
    "\xc2\x9e" => "\xc5\xbe",     /* LATIN SMALL LETTER Z WITH CARON */
    "\xc2\x9f" => "\xc5\xb8"      /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
);

function cp1252_to_utf8($str) {
        global $cp1252_map;
        return  strtr(utf8_encode($str), $cp1252_map);
}

?>
Net Raven 24-Jun-2004 12:58
I often need to convert multi language text sent to me for use in websites and other apps into UTF8 encoded so I can insert it into source code and databases.

I knocked up a small web page with its charset set to UTF8 then set it up so I can paste from the original doc (eg word or excel) and have the page return the UTF8 encoded version.

Of course the browser will convert the unicode to UTF8 for you as part of the submit (I use IE5 or better for this) then all you have to do in the PHP is encode the UTF8 so the browser will show it in its raw form.

Its a bit bulky but I just convert ALL character to html numbered entities (brute force and ignorance does it again.)

I've used this to encode everything from Hebrew to Japanese without problems

<?
header("Content-Type: text/plain; CHARSET=Windows-1252");
$code = (get_magic_quotes_gpc())?stripslashes($GLOBALS[code]):$GLOBALS[code];
?>
<html>
<head>
    <title>UTF8 ENCODER PAGE</title>
    <meta http-equiv="content-type" content="text/html; CHARSET=Windows-1252">
</head>
<body>
<form method=post action="?seed=<?=time()?>">
    Original Unicode<br />
    <textarea name="code" cols="80" rows="10"><?=$code?></textarea><br />
    Encoded UTF8<br />
    <textarea name="encd" cols="80" rows="10"><?
        for ($i = 0; $i < strlen($code); $i++) {
            echo '&#'.ord(substr($code,$i,1));
        }
    ?></textarea><br />
    <input type="submit" value="encode">
</form>
</body>
</html>
Karen 01-Oct-2003 12:33
Re the previous post about converting GB2312 code to Unicode code which displayed the following function:

<?
// Program by sadly (www.phpx.com)

function gb2unicode($gb)
{
   if(!trim($gb))
    return $gb;
   $filename="gb2312.txt";
   $tmp=file($filename);
   $codetable=array();
   while(list($key,$value)=each($tmp))
    $codetable[hexdec(substr($value,0,6))]=substr($value,9,4);
   $utf="";
   while($gb)
    {
      if (ord(substr($gb,0,1))>127)
     {
        $this=substr($gb,0,2);
        $gb=substr($gb,2,strlen($gb));
        $utf.="&#x".$codetable[hexdec(bin2hex($this))-0x8080].";";
      }
     else
     {
      $gb=substr($gb,1,strlen($gb));
      $utf.=substr($gb,0,1);
     }
     }
  return $utf;
}
?>

I found that a small change was needed in the code to properly handle latin characters embedded in the middle of gb2312 text, as when the text includes a URL or email address. Just reverse the two lines in the part of the statement above that handles ord vals !>127.

Change:

$gb=substr($gb,1,strlen($gb));
$utf.=substr($gb,0,1);

to:

$utf.=substr($gb,0,1);
$gb=substr($gb,1,strlen($gb));

In the original function, the first latin chacter was dropped and it was not converting the first non-latin character after the latin text (everything was shifted one character too far to the right). Reversing those two lines makes it work correctly in every example I have tried.

Also, the source of the gb2312.txt file needed for this to work has changed. You can find it a couple places:

http://tcl.apache.org/sources/tcl/tools/encoding/gb2312.txt
ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/GB/GB2312.TXT
ronen at greyzone dot com 07-Mar-2002 12:01
The following function will utf-8 encode unicode entities &#nnn(nn); with n={0..9}

/**
* takes a string of unicode entities and converts it to a utf-8 encoded string
* each unicode entitiy has the form &#nnn(nn); n={0..9} and can be displayed by utf-8 supporting
* browsers.  Ascii will not be modified.
* @param $source string of unicode entities [STRING]
* @return a utf-8 encoded string [STRING]
* @access public
*/
function utf8Encode ($source) {
    $utf8Str = '';
    $entityArray = explode ("&#", $source);
    $size = count ($entityArray);
    for ($i = 0; $i < $size; $i++) {
        $subStr = $entityArray[$i];
        $nonEntity = strstr ($subStr, ';');
        if ($nonEntity !== false) {
            $unicode = intval (substr ($subStr, 0, (strpos ($subStr, ';') + 1)));
            // determine how many chars are needed to reprsent this unicode char
            if ($unicode < 128) {
                $utf8Substring = chr ($unicode);
            }
            else if ($unicode >= 128 && $unicode < 2048) {
                $binVal = str_pad (decbin ($unicode), 11, "0", STR_PAD_LEFT);
                $binPart1 = substr ($binVal, 0, 5);
                $binPart2 = substr ($binVal, 5);

                $char1 = chr (192 + bindec ($binPart1));
                $char2 = chr (128 + bindec ($binPart2));
                $utf8Substring = $char1 . $char2;
            }
            else if ($unicode >= 2048 && $unicode < 65536) {
                $binVal = str_pad (decbin ($unicode), 16, "0", STR_PAD_LEFT);
                $binPart1 = substr ($binVal, 0, 4);
                $binPart2 = substr ($binVal, 4, 6);
                $binPart3 = substr ($binVal, 10);

                $char1 = chr (224 + bindec ($binPart1));
                $char2 = chr (128 + bindec ($binPart2));
                $char3 = chr (128 + bindec ($binPart3));
                $utf8Substring = $char1 . $char2 . $char3;
            }
            else {
                $binVal = str_pad (decbin ($unicode), 21, "0", STR_PAD_LEFT);
                $binPart1 = substr ($binVal, 0, 3);
                $binPart2 = substr ($binVal, 3, 6);
                $binPart3 = substr ($binVal, 9, 6);
                $binPart4 = substr ($binVal, 15);

                $char1 = chr (240 + bindec ($binPart1));
                $char2 = chr (128 + bindec ($binPart2));
                $char3 = chr (128 + bindec ($binPart3));
                $char4 = chr (128 + bindec ($binPart4));
                $utf8Substring = $char1 . $char2 . $char3 . $char4;
            }

            if (strlen ($nonEntity) > 1)
                $nonEntity = substr ($nonEntity, 1); // chop the first char (';')
            else
                $nonEntity = '';

            $utf8Str .= $utf8Substring . $nonEntity;
        }
        else {
            $utf8Str .= $subStr;
        }
    }

    return $utf8Str;
}

Ronen.


Lit le message d'erreur de l'analyseur XML

  • « utf8_encode
  • xml_get_current_byte_index »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Lit le message d'erreur de l'analyseur XML

xml_error_string

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_error_string — Lit le message d'erreur de l'analyseur XML

Description

xml_error_string ( int $error_code ) : string|null

Lit le message d'erreur de l'analyseur XML associé avec le code error_code donné.

Liste de paramètres

error_code

Un code erreur provenant de xml_get_error_code().

Valeurs de retour

Retourne une chaîne représentant la description de l'erreur error_code, ou false si aucune description n'est trouvée.

Voir aussi

  • xml_get_error_code() - Récupère le code erreur de l'analyseur XML

User Contributed Notes

greg at getnetez dot com 23-Aug-2012 07:27
Two notes in one.

Here is the combination of xml_get_error_code() and xml_error_string() to get the error printout as an echo response

Also, I tested before and after xml_parser_free() -- as expected, the error is indeed cleared with the free() so check your error before calling xml_parser_free()

Pushing a deadline or I would add in sample faulted xml for full p.o.c.

somebody else want to step up for that??

G

<?php
$p = xml_parser_create();
xml_parse_into_struct($p, $data, $vals, $index);
//This call prints error
echo 'ERROR if any '.xml_error_string(xml_get_error_code($p));
xml_parser_free($p);
echo "Index array\\n";
print_r($index);
echo "\\nVals array\\n";
print_r($vals);
//No Error left here to be printed
echo 'ERROR if any '.xml_error_string(xml_get_error_code($p));
exit;
?>


Retourne l'index de l'octet courant d'un analyseur XML

  • « xml_error_string
  • xml_get_current_column_number »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Retourne l'index de l'octet courant d'un analyseur XML

xml_get_current_byte_index

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_get_current_byte_index — Retourne l'index de l'octet courant d'un analyseur XML

Description

xml_get_current_byte_index ( XMLParser $parser ) : int

Retourne l'index de l'octet courant de l'analyseur XML donné.

Liste de paramètres

parser

Une référence sur un analyseur XML valide.

Valeurs de retour

xml_get_current_byte_index() retourne false si parser n'est pas valide ou, sinon, retourne l'index de l'octet d'analyse courante de l'analyseur XML (débute à 0).

Notes

Avertissement

Cette fonction retourne l'index de l'octet en accord avec le texte encodé UTF-8 même si l'entrée est dans un autre encodage.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

Voir aussi

  • xml_get_current_column_number() - Retourne le numéro de colonne courant d'un analyseur XML
  • xml_get_current_line_number() - Retourne le numéro de ligne courant d'un analyseur XML

User Contributed Notes

turan dot yuksel at tcmb dot gov dot tr 20-Sep-2005 03:38
The outcome of this function is heavily dependent on the parser implementation used. For example, at the point where the start_element_ callback is called, libxml2 parser consumes the entire element name and attributes, however expat does not.


Retourne le numéro de colonne courant d'un analyseur XML

  • « xml_get_current_byte_index
  • xml_get_current_line_number »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Retourne le numéro de colonne courant d'un analyseur XML

xml_get_current_column_number

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_get_current_column_number — Retourne le numéro de colonne courant d'un analyseur XML

Description

xml_get_current_column_number ( XMLParser $parser ) : int

Retourne le numéro de colonne courant de l'analyseur XML donné.

Liste de paramètres

parser

Une référence sur un analyseur XML valide.

Valeurs de retour

xml_get_current_column_number() retourne false si parser n'est pas valide, ou sinon, retourne le numéro de colonne courant de la ligne courante de l'analyseur, qui correspond à la position d'analyse courante de l'analyseur XML (comme retourné par xml_get_current_line_number()).

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

Voir aussi

  • xml_get_current_byte_index() - Retourne l'index de l'octet courant d'un analyseur XML
  • xml_get_current_line_number() - Retourne le numéro de ligne courant d'un analyseur XML

User Contributed Notes

shaun at 5810 dot com 05-Jul-2003 09:04
Column numbers apparently start at 0. So you may want to add 1.
javajohn at gulfbridge.net 22-Mar-2003 10:03
"Column number" refers to the current character position within the current line of the XML document.


Retourne le numéro de ligne courant d'un analyseur XML

  • « xml_get_current_column_number
  • xml_get_error_code »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Retourne le numéro de ligne courant d'un analyseur XML

xml_get_current_line_number

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_get_current_line_number — Retourne le numéro de ligne courant d'un analyseur XML

Description

xml_get_current_line_number ( XMLParser $parser ) : int

Retourne le numéro de ligne courant de l'analyseur XML donné.

Liste de paramètres

parser

Une référence sur un analyseur XML valide.

Valeurs de retour

xml_get_current_line_number() retourne false si parser n'est pas valide ou, sinon, retourne le numéro de la ligne en cours d'analyse.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

Voir aussi

  • xml_get_current_column_number() - Retourne le numéro de colonne courant d'un analyseur XML
  • xml_get_current_byte_index() - Retourne l'index de l'octet courant d'un analyseur XML

User Contributed Notes

There are no user contributed notes for this page.


Récupère le code erreur de l'analyseur XML

  • « xml_get_current_line_number
  • xml_parse_into_struct »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Récupère le code erreur de l'analyseur XML

xml_get_error_code

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_get_error_code — Récupère le code erreur de l'analyseur XML

Description

xml_get_error_code ( XMLParser $parser ) : int

Récupère le code erreur de l'analyseur XML.

Liste de paramètres

parser

Une référence sur un analyseur XML valide.

Valeurs de retour

xml_get_error_code() retourne false si parser n'est pas une référence à une analyseur XML valide ou, sinon, retourne un des codes erreur listés dans la section sur les codes erreur.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

Voir aussi

  • xml_error_string() - Lit le message d'erreur de l'analyseur XML

User Contributed Notes

There are no user contributed notes for this page.


Analyse une structure XML

  • « xml_get_error_code
  • xml_parse »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Analyse une structure XML

xml_parse_into_struct

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parse_into_struct — Analyse une structure XML

Description

xml_parse_into_struct ( XMLParser $parser , string $data , array &$values , array &$index = null ) : int

Cette fonction analyse la chaîne XML data et le place dans deux tableaux : le premier index contient des pointeurs sur la position des valeurs correspondantes dans le tableau values. Ces deux paramètres sont passés par références.

Liste de paramètres

parser

Une référence à une analyseur XML.

data

Une chaîne de caractères contenant les données XML.

values

Un tableau contenant les valeurs des données XML.

index

Un tableau contenant les pointeurs vers les valeurs appropriées dans le paramètre $values.

Valeurs de retour

xml_parse_into_struct() retourne 0 si une erreur survient et 1 en cas de succès. Ce n'est pas la même chose que false et true, soyez prudent avec les opérateurs comme ===.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

Exemples

Ci-dessous, vous trouverez un exemple qui illustre la structure des deux tableaux générés par la fonction. On utilise une balise simple note, placée dans une autre balise para. On analyse le tout, et on affiche la structure générée :

Exemple #1 Exemple avec xml_parse_into_struct()

<?php
$simple = "<para><note>simple note</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
echo "Index array\n";
print_r($index);
echo "\nVals array\n";
print_r($vals);
?>

Affichera :

Index array
Array
(
    [PARA] => Array
        (
            [0] => 0
            [1] => 2
        )

    [NOTE] => Array
        (
            [0] => 1
        )

)

Vals array
Array
(
    [0] => Array
        (
            [tag] => PARA
            [type] => open
            [level] => 1
        )

    [1] => Array
        (
            [tag] => NOTE
            [type] => complete
            [level] => 2
            [value] => simple note
        )

    [2] => Array
        (
            [tag] => PARA
            [type] => close
            [level] => 1
        )

)

L'analyse événementielle (comme celle de expat), peut se révéler complexe lorsque le document XML est complexe. xml_parse_into_struct() ne génère pas d'objet de type DOM, mais il génère plutôt des structures qui peuvent être parcourues à la façon d'un arbre. Considérons le fichier suivant, qui représente une petite base de données XML :

Exemple #2 moldb.xml - Petite base de données moléculaires

<?xml version="1.0"?>
<moldb>

  <molecule>
      <name>Alanine</name>
      <symbol>ala</symbol>
      <code>A</code>
      <type>hydrophobic</type>
  </molecule>

  <molecule>
      <name>Lysine</name>
      <symbol>lys</symbol>
      <code>K</code>
      <type>charged</type>
  </molecule>

</moldb>
Et maintenant, un code qui analyse le document, et génère les objets ad hoc :

Exemple #3 parsemoldb.php : Analyse moldb.xml et crée un tableau d'objets moléculaires

<?php

class AminoAcid {
    var $name;  // nom aa
    var $symbol;    // symbole à trois lettres
    var $code;  // code à une lettre
    var $type;  // hydrophobique, chargé ou neutre

    function __construct ($aa) {
        foreach ($aa as $k=>$v)
            $this->$k = $aa[$k];
    }
}

function readDatabase($filename) {
    // lit la base de données xml des acides aminés
    $data = implode("",file($filename));
    $parser = xml_parser_create();
    xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
    xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
    xml_parse_into_struct($parser,$data,$values,$tags);
    xml_parser_free($parser);

    // boucle à travers les structures
    foreach ($tags as $key=>$val) {
        if ($key == "molecule") {
            $molranges = $val;
            // each contiguous pair of array entries are the
            // lower and upper range for each molecule definition
            for ($i=0; $i < count($molranges); $i+=2) {
                $offset = $molranges[$i] + 1;
                $len = $molranges[$i + 1] - $offset;
                $tdb[] = parseMol(array_slice($values, $offset, $len));
            }
        } else {
            continue;
        }
    }
    return $tdb;
}

function parseMol($mvalues) {
    for ($i=0; $i < count($mvalues); $i++)
        $mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
    return new AminoAcid($mol);
}

$db = readDatabase("moldb.xml");
echo "** Base d'objets AminoAcid :\n";
print_r($db);

?>
Après exécution de parsemoldb.php, la variable $db contient un tableau d'objets AminoAcid, et l'affichage le confirme :
** Base d'objets AminoAcid :
Array
(
    [0] => aminoacid Object
        (
            [name] => Alanine
            [symbol] => ala
            [code] => A
            [type] => hydrophobic
        )

    [1] => aminoacid Object
        (
            [name] => Lysine
            [symbol] => lys
            [code] => K
            [type] => charged
        )

)

User Contributed Notes

Adam Tylmad 30-Apr-2009 12:58
Thanx to jukea i've upgraded the characterData-function to allow the value 0. Here is the new complete code:

<?php

class XMLParser {
    var $path;
    var $result;

    function cleanString($string) {
        return trim(str_replace("'", "&#39;", $string));
    }

    function XMLParser($encoding, $data) {
        $this->path = "\$this->result";
        $this->index = 0;

        $xml_parser = xml_parser_create($encoding);
        xml_set_object($xml_parser, &$this);
        xml_set_element_handler($xml_parser, 'startElement', 'endElement');
        xml_set_character_data_handler($xml_parser, 'characterData');

        xml_parse($xml_parser, $data, true);
        xml_parser_free($xml_parser);
    }

    function startElement($parser, $tag, $attributeList) {
        $this->path .= "->".$tag;
        eval("\$data = ".$this->path.";");
        if (is_array($data)) {
            $index = sizeof($data);
            $this->path .= "[".$index."]";
        } else if (is_object($data)) {
            eval($this->path." = array(".$this->path.");");
            $this->path .= "[1]";
        }

        foreach($attributeList as $name => $value)
            eval($this->path."->".$name. " = '".XMLParser::cleanString($value)."';");
    }

    function endElement($parser, $tag) {
        $this->path = substr($this->path, 0, strrpos($this->path, "->"));
    }

    function characterData($parser, $data) {
        if (strlen($data = XMLParser::cleanString($data)))
            eval($this->path." = '$data';");
    }
}

?>
aerik at thesylvans dot com 28-Nov-2008 03:55
Here's another attempt at dealing with rebuilding the xml from the array.  I'm basically preventing certain tags from being self closing by just checking for them explicitly (sure wish expat didn't interpret <textarea /> and <textarea></textarea> the same way (as "complete" tags).

<?php
function array2xml($xmlary){
  $o='';
  foreach($xmlary as $tag ){
    if($tag['tag'] == 'textarea' && !isset($tag['value'])){
      //fake a value so it won't self close
      $tag['value']='';
    }
    //tab space:
    $t = '';
    for($i=1; $i < $tag['level'];$i++){
      $t.="\t";
    }
    switch($tag['type']){
      case 'complete':
      case 'open':
        $o.=$t.'<'.$tag['tag'];
        if(isset($tag['attributes'])){
          foreach($tag['attributes'] as $attr=>$aval){
            $o.=' '.$attr.'="'.$aval.'"';
          }//foreach
        }//attributes
        if($tag['type'] == 'complete'){
          if(!isset($tag['value'])){
            $o .= ' />'."\n";
          } else {
            $o .= '>'."\n".$t.$tag['value']."\n".$t.'</'.$tag['tag'].'>'."\n";
          }
        }else{
          $o .= '>'."\n";
        }
        break;
      case 'close':
        $o .= $t.'</'.$tag['tag'].'>'."\n";
        break;
      case 'cdata':
        $o .= $t.$tag['value']."\n";
        break;
    }//switch
  }//foreach
}
?>
dale at ucsc dot edu 25-Sep-2008 04:16
here you can [re]assemble xml from a xml_parse_into_struct generated array: ie array2xml

<?php
$xml_parser = xml_parser_create( 'UTF-8' ); // UTF-8 or ISO-8859-1
xml_parser_set_option( $xml_parser, XML_OPTION_CASE_FOLDING, 0 );
xml_parser_set_option( $xml_parser, XML_OPTION_SKIP_WHITE, 1 );
xml_parse_into_struct( $xml_parser, $my_text_xml, $aryXML );
xml_parser_free($xml_parser);

//now use aryXML array to xml string:
        $o='';
        foreach( $aryXML as $tag ){
            //tab space:
            for($i=1; $i < $tag['level'];$i++)
                $o.="\t";
            if($tag['type']!='close'){
                if($tag['type']!='cdata')
                    $o.='<'.$tag['tag'];
                if(isset($tag['attributes'])){
                    foreach($tag['attributes'] as $attr=>$aval){
                        $o.=' '.$attr.'="'.$aval.'"';
                    }
                }
                if($tag['type']!='cdata'){
                    $o.=($tag['type']=='complete')?'/>'."\n":'>'."\n";
                }
                $o.=(isset($tag['value']))?$tag['value']:'';
            }else{
                $o.='</'.$tag['tag'].'>';
            }
        }
?>
Llorenc 09-Sep-2008 03:20
Sorry, forgot my last post below, I confused CDATA sections (<![CDATA[]]>) with the value type "cdata", which despite its name it's very different! The first allows adding markup (&,<,>) as regular text and the second is to indicate a not complete node between the open and close nodes. What is true is that the CDATA delimiters are lost after xml_parse_into_struct so it's not possible to revert the process.

Please, feel free to remove my comments or leave them if you think they can help anyone.
wickedfather at hotmail dot com 06-Jul-2008 12:33
Had a comment up that was removed saying I'd found drawbacks, but here's a class what I wrote which works fine for me.  Comments removed due to post restrictions.  Pass the xml into the parse method or in the constructor.  Php4 and 5 safe.

class XMLThing
{
    var $rawXML;
    var $valueArray = array();
    var $keyArray = array();
    var $parsed = array();
    var $index = 0;
    var $attribKey = 'attributes';
    var $valueKey = 'value';
    var $cdataKey = 'cdata';
    var $isError = false;
    var $error = '';

    function XMLThing($xml = NULL)
    {
        $this->rawXML = $xml;
    }

    function parse($xml = NULL)
    {
        if (!is_null($xml))
        {
            $this->rawXML = $xml;
        }

        $this->isError = false;

        if (!$this->parse_init())
        {
            return false;
        }

        $this->index = 0;
        $this->parsed = $this->parse_recurse();
        $this->status = 'parsing complete';

        return $this->parsed;
    }

    function parse_recurse()
    {
        $found = array();
        $tagCount = array();

        while (isset($this->valueArray[$this->index]))
        {
            $tag = $this->valueArray[$this->index];
            $this->index++;

            if ($tag['type'] == 'close')
            {
                return $found;
            }

            if ($tag['type'] == 'cdata')
            {
                $tag['tag'] = $this->cdataKey;
                $tag['type'] = 'complete';
            }

            $tagName = $tag['tag'];

            if (isset($tagCount[$tagName]))
            {
                if ($tagCount[$tagName] == 1)
                {
                    $found[$tagName] = array($found[$tagName]);
                }

                $tagRef =& $found[$tagName][$tagCount[$tagName]];
                $tagCount[$tagName]++;
            }
            else
            {
                $tagCount[$tagName] = 1;
                $tagRef =& $found[$tagName];
            }

            switch ($tag['type'])
            {
                case 'open':
                    $tagRef = $this->parse_recurse();

                    if (isset($tag['attributes']))
                    {
                        $tagRef[$this->attribKey] = $tag['attributes'];
                    }

                    if (isset($tag['value']))
                    {
                        if (isset($tagRef[$this->cdataKey]))
                        {
                            $tagRef[$this->cdataKey] = (array)$tagRef[$this->cdataKey];
                            array_unshift($tagRef[$this->cdataKey], $tag['value']);
                        }
                        else
                        {
                            $tagRef[$this->cdataKey] = $tag['value'];
                        }
                    }
                    break;

                case 'complete':
                    if (isset($tag['attributes']))
                    {
                        $tagRef[$this->attribKey] = $tag['attributes'];
                        $tagRef =& $tagRef[$this->valueKey];
                    }

                    if (isset($tag['value']))
                    {
                        $tagRef = $tag['value'];
                    }
                    break;
            }
        }

        return $found;
    }

    function parse_init()
    {
        $this->parser = xml_parser_create();

        $parser = $this->parser;
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
        if (!$res = (bool)xml_parse_into_struct($parser, $this->rawXML, $this->valueArray, $this->keyArray))
        {
            $this->isError = true;
            $this->error = 'error: '.xml_error_string(xml_get_error_code($parser)).' at line '.xml_get_current_line_number($parser);
        }
        xml_parser_free($parser);

        return $res;
    }
}
jemptymethod at gmail dot com 16-Jun-2008 01:39
@wickedfather, re: beaudurrant....I just cannot concur that the latter's class is "great"....First of all, it doesn't handle attributes.  Second of all, as my code below demonstrates, there is no need waste processing by determining duplicates within their own loop.  Thirdly, when there are duplicates, it collapses the layer in the array above the duplicates.

Here is some much more consise code, though not (yet) object oriented, and also not yet handling attributes; it maintains a stack for each level:

<?php
function xml_parse_into_assoc($file) {
  $data = implode("", file($file));
  $p = xml_parser_create();

  xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
  xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);

  xml_parse_into_struct($p, $data, $vals, $index);
  xml_parser_free($p);

  $levels = array(null);

  foreach ($vals as $val) {
    if ($val['type'] == 'open' || $val['type'] == 'complete') {
      if (!array_key_exists($val['level'], $levels)) {
        $levels[$val['level']] = array();
      }
    }

    $prevLevel =& $levels[$val['level'] - 1];
    $parent = $prevLevel[sizeof($prevLevel)-1];

    if ($val['type'] == 'open') {
      $val['children'] = array();
      array_push(&$levels[$val['level']], $val);
      continue;
    }

    else if ($val['type'] == 'complete') {
      $parent['children'][$val['tag']] = $val['value'];
    }

    else if ($val['type'] == 'close') {
      $pop = array_pop($levels[$val['level']]);
      $tag = $pop['tag'];

      if ($parent) {
        if (!array_key_exists($tag, $parent['children'])) {
          $parent['children'][$tag] = $pop['children'];
        }
        else if (is_array($parent['children'][$tag])) {
          $parent['children'][$tag][] = $pop['children'];
        }
      }
      else {
        return(array($pop['tag'] => $pop['children']));
      }
    }

    $prevLevel[sizeof($prevLevel)-1] = $parent;
  }
}
?>
wickedfather at hotmail dot com 12-Apr-2008 08:36
To beaudurrant - that class is great and structures things in a very sensible way.  Only problem is that it raises an error if a tag is empty, so would suggest a simple mod to the parse method just to add an isset test.

if (isset($val['value']))
{
    $this->setArrayValue($this->output, $stack, $val['value']);
}
mathiasrav at gmail dot com 10-Mar-2008 08:42
In response to Anonymous' post at 26-Feb-2008 11:50:

Saying that you "don't understand everything" isn't going to get you very popular - you should understand the code you use.
foreach isn't *slow* in PHP, it is actually faster than the equivalent for-construct (which, in many cases, isn't available).

The reason your script is slow is simply your use of xml_parse_into_struct - it reads the whole XML-string and doesn't return until it has parsed and validated it all. If you're looking for efficiency, you'll have to use the more low-level xml_parser_create, xml_set_*_handler functions. Then make sure you don't keep everything in a huge array before outputting it (at least don't if you're going for efficiency).
beaudurrant at gmail dot com 19-Dec-2007 11:23
This is extending what Alf Marius Foss Olsen had posted above.

It takes into account array keys with the same name and uses an increment for them instead of overwriting the keys.

I am using it for SOAP requests (20K - 150K) and it parses very fast compared to PEAR.

<?

class XMLParser  {

    // raw xml
    private $rawXML;
    // xml parser
    private $parser = null;
    // array returned by the xml parser
    private $valueArray = array();
    private $keyArray = array();

    // arrays for dealing with duplicate keys
    private $duplicateKeys = array();

    // return data
    private $output = array();
    private $status;

    public function XMLParser($xml){
        $this->rawXML = $xml;
        $this->parser = xml_parser_create();
        return $this->parse();
    }

    private function parse(){

        $parser = $this->parser;

        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); // Dont mess with my cAsE sEtTings
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);     // Dont bother with empty info
        if(!xml_parse_into_struct($parser, $this->rawXML, $this->valueArray, $this->keyArray)){
            $this->status = 'error: '.xml_error_string(xml_get_error_code($parser)).' at line '.xml_get_current_line_number($parser);
            return false;
        }
        xml_parser_free($parser);

        $this->findDuplicateKeys();

        // tmp array used for stacking
        $stack = array();
        $increment = 0;

        foreach($this->valueArray as $val) {
            if($val['type'] == "open") {
                //if array key is duplicate then send in increment
                if(array_key_exists($val['tag'], $this->duplicateKeys)){
                    array_push($stack, $this->duplicateKeys[$val['tag']]);
                    $this->duplicateKeys[$val['tag']]++;
                }
                else{
                    // else send in tag
                    array_push($stack, $val['tag']);
                }
            } elseif($val['type'] == "close") {
                array_pop($stack);
                // reset the increment if they tag does not exists in the stack
                if(array_key_exists($val['tag'], $stack)){
                    $this->duplicateKeys[$val['tag']] = 0;
                }
            } elseif($val['type'] == "complete") {
                //if array key is duplicate then send in increment
                if(array_key_exists($val['tag'], $this->duplicateKeys)){
                    array_push($stack, $this->duplicateKeys[$val['tag']]);
                    $this->duplicateKeys[$val['tag']]++;
                }
                else{
                    // else send in tag
                    array_push($stack,  $val['tag']);
                }
                $this->setArrayValue($this->output, $stack, $val['value']);
                array_pop($stack);
            }
            $increment++;
        }

        $this->status = 'success: xml was parsed';
        return true;

    }

    private function findDuplicateKeys(){

        for($i=0;$i < count($this->valueArray); $i++) {
            // duplicate keys are when two complete tags are side by side
            if($this->valueArray[$i]['type'] == "complete"){
                if( $i+1 < count($this->valueArray) ){
                    if($this->valueArray[$i+1]['tag'] == $this->valueArray[$i]['tag'] && $this->valueArray[$i+1]['type'] == "complete"){
                        $this->duplicateKeys[$this->valueArray[$i]['tag']] = 0;
                    }
                }
            }
            // also when a close tag is before an open tag and the tags are the same
            if($this->valueArray[$i]['type'] == "close"){
                if( $i+1 < count($this->valueArray) ){
                    if(    $this->valueArray[$i+1]['type'] == "open" && $this->valueArray[$i+1]['tag'] == $this->valueArray[$i]['tag'])
                        $this->duplicateKeys[$this->valueArray[$i]['tag']] = 0;
                }
            }

        }

    }

    private function setArrayValue(&$array, $stack, $value){
        if ($stack) {
            $key = array_shift($stack);
            $this->setArrayValue($array[$key], $stack, $value);
            return $array;
        } else {
            $array = $value;
        }
    }

    public function getOutput(){
        return $this->output;
    }

    public function getStatus(){
        return $this->status;
    }

}

?>

Usage:

$p = new XMLParser($xml);
$p->getOutput();
Alf Marius Foss Olsen 12-Sep-2007 06:46
<?php
/*
  An easy lightweight (Array ->) XML -> Array algorithm..

  Typical case: You have an array you want to export to an external server,
                so you make XML out of it, exports it, and "on the other side"
                make it into an array again. These two functions will take care
                of that last part, ie XML -> Array

  NOTE! The function XMLToArray assumes that the XML _dont_ have nodes on the
        same level with the same name, then it just wont work. This is not a
        problem, as this case deals with Array -> XML -> Array, and an array
        cant have to identical indexes/keys.
*/

function XMLToArray($xml) {
  $parser = xml_parser_create('ISO-8859-1'); // For Latin-1 charset
  xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); // Dont mess with my cAsE sEtTings
  xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); // Dont bother with empty info
  xml_parse_into_struct($parser, $xml, $values);
  xml_parser_free($parser);

  $return = array(); // The returned array
  $stack = array(); // tmp array used for stacking
  foreach($values as $val) {
    if($val['type'] == "open") {
      array_push($stack, $val['tag']);
    } elseif($val['type'] == "close") {
      array_pop($stack);
    } elseif($val['type'] == "complete") {
      array_push($stack, $val['tag']);
      setArrayValue($return, $stack, $val['value']);
      array_pop($stack);
    }//if-elseif
  }//foreach
  return $return;
}//function XMLToArray

function setArrayValue(&$array, $stack, $value) {
  if ($stack) {
    $key = array_shift($stack);
    setArrayValue($array[$key], $stack, $value);
    return $array;
  } else {
    $array = $value;
  }//if-else
}//function setArrayValue

// USAGE:
$xml = <<<QQQ
<?xml version="1.0"?>
<root>
  <node1>Some text</node1>
  <node2a>
    <node2b>
      <node2c>Some text</node2c>
    </node2b>
  </node2a>
</root>\n
QQQ;
$array = XMLToArray($xml);
print "<pre>";
print_r($array);
print "</pre>";
//  Output:
//
//  Array
//  (
//      [root] => Array
//          (
//              [node1] => Some text
//              [node2a] => Array
//                  (
//                      [node2b] => Array
//                          (
//                              [node2c] => Some text
//                          )
//                  )
//          )
//  )
?>
vinod at citadel-soft dot com 01-Sep-2007 03:43
My previous code was having some bugs in, that is fixed now

<?php
class CSLXmlReader {
    private $tagstack;
    private $xmlvals;
    private  $xmlvarArrPos;
    private $xmlfile;
    function __construct($filename)  // constructor to intialize the stack and val array
    {

        $this->tagstack = array();   // contain the open tags till now
        $this->xmlvals = array();
        $this->xmlvarArrPos = $this->xmlvals;  // temporary variable to hold the current tag position
        $this->xmlfile = $filename;
    }
    function readDatabase()
    {
        // read the XML database
        $data = implode("", file($this->xmlfile));
        $parser = xml_parser_create();
        xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
        xml_parse_into_struct($parser, $data, $values, $tags);
        xml_parser_free($parser);

        foreach($values as $key => $val)  //
        {
            if($val['type'] == "open")
            {
                array_push($this->tagstack, $val['tag']);
                $this->getArrayPath();
                if(count($this->xmlvarArrPos) > 0 && (!array_key_exists(0,$this->xmlvarArrPos)))
                {
                    $temp1 = $this->xmlvarArrPos;
                    $this->xmlvarArrPos =  array();
                    $this->xmlvarArrPos[0] = $temp1;
                    array_push($this->tagstack, 1);
                }
                else if( array_key_exists(0,$this->xmlvarArrPos)){
                    $opncount = count($this->xmlvarArrPos);
                    array_push($this->tagstack, $opncount);
                }
                $tagStackPointer += 1;
            }else if($val['type'] == "close")
            {
                while( $val['tag'] != ($lastOpened = array_pop($this->tagstack))){}
            }else if($val['type'] ==  "complete")
            {
                $this->getArrayPath();
                if( array_key_exists($val['tag'],$this->xmlvarArrPos))
                {
                    if(array_key_exists(0,$this->xmlvarArrPos[$val['tag']]))
                    {
                        $elementCount = count($this->xmlvarArrPos[$val['tag']]);
                        $this->xmlvarArrPos[$val['tag']][$elementCount] = $val['value'];
                    }else
                    {
                        $temp1 = $this->xmlvarArrPos[$val['tag']];
                        $this->xmlvarArrPos[$val['tag']] =  array();
                        $this->xmlvarArrPos[$val['tag']][0] = $temp1;
                        $this->xmlvarArrPos[$val['tag']][1] = $val['value'];
                    }
                } else
                {
                    $this->xmlvarArrPos[$val['tag']] = $val['value'];
                }
            }
        }
        reset($this->xmlvals);
        return $this->xmlvals;
    }
    function getArrayPath()
    {

        reset($this->xmlvals);
        $this->xmlvarArrPos = &$this->xmlvals;
        foreach($this->tagstack as $key)
        {
            $this->xmlvarArrPos = &$this->xmlvarArrPos[$key];

        }
    }

}

$readerObj  = new CSLXmlReader("test.xml");
$xmlvals = $readerObj->readDatabase();

echo "########## XML Values In array as the multidimentional array  #############\n";
echo "<pre>";
print_r($xmlvals);
echo "</pre>";

?>
siteres at gmail dot com 07-Feb-2007 01:38
PHP: XML to Array and backwards:

Here the XML with PHP solution: XML->Array and Array->XML.
Work with it as with usual array.

Sources are here:
http://mysrc.blogspot.com/2007/02/php-xml-to-array-and-backwards.html
(leave me comments:)

Example #1 (1.xml):

<ddd>
 <onemore dd="55">
  <tt>333</tt>
  <tt ss="s1">555</tt>
  <tt>777</tt>
 </onemore>
 <two>sdf rr</two>
</ddd>

The code:

$xml=xml2ary(file_get_contents('1.xml'));
print_r($xml);

Here is the Array result:

Array
(
   [ddd] => Array (
           [_c] => Array (
                   [_p] => Array *RECURSION*
                   [onemore] => Array (
                           [_a] => Array (
                                   [dd] => 55
                               )
                           [_c] => Array (
                                   [_p] => Array  *RECURSION*
                                   [tt] => Array (
                                           [0] => Array (
                                                   [_v] => 333
                                               )
                                           [1] => Array (
                                                   [_a] => Array (
                                                           [ss] => s1
                                                       )
                                                   [_v] => 555
                                               )
                                           [2] => Array (
                                                   [_v] => 777
                                               )
                                       )
                               )
                       )
                   [two] => Array (
                           [_v] => sdf rr
                       )
               )
       )
)
webmaster at after5webdesign dot com 30-Nov-2006 04:48
That parser also has a problem in which it will not parse more items than the current level it is on. That is, parsing this:  <1><2>A</2><2>B</2><2>C</2></1>
Will only result in this: A B
C is never processed.

It might be better with something like this:
          $file = get_url('http://news.search.yahoo.com/news/rss?p=current+events', URL_CONTENT);
          $data = $file['content'];
          $xml_parser = xml_parser_create();
          xml_parse_into_struct($xml_parser, $data, $vals, $index);
          xml_parser_free($xml_parser);
          //Uncomment the lines below to see the entire structure of your XML document
          //echo "<pre>INDEX: \n";
          //print_r ($index);
          //echo "\n \n \n VALUES:";
          //print_r ($vals);
          //echo "</pre>";
          $params = array();
          $level = array();
          $start_level = 1;
          foreach ($vals as $xml_elem) {
            if ($xml_elem['type'] == 'open') {
              if (array_key_exists('attributes',$xml_elem)) {
                list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
              } else {
                $level[$xml_elem['level']] = $xml_elem['tag'];
              }
            }
            if ($xml_elem['type'] == 'complete') {
              $php_stmt = '$params';
              while($start_level < $xml_elem['level']) {
                $php_stmt .= '[$level['.$start_level.']]';
                $start_level++;
              }
              $php_stmt .= '[$xml_elem[\'tag\']][] = $xml_elem[\'value\'];';
              eval($php_stmt);
              $start_level--;
            }
          }
          echo "<pre>";
          print_r ($params);
          echo "</pre>";

~Tim_Myth
A3 03-Nov-2006 05:28
XML -> Array
<?
    $data = '<root><a><b x="s" a="2">asdf</b><c></c></a></root>';

    $p = xml_parser_create();
    xml_parse_into_struct($p, $data, $vals);
    xml_parser_free($p);

    $key = $output = array();
   foreach ($vals as $id=>$item) {
      if ($item["type"]=="open" || $item["level"]>count($key)) {// && count($key)<=$item["level"])
          array_push($key, $id);
          $temp = array("tag"=>$item["tag"], "value"=>"", "attributes"=>array());
          eval("\$output[".implode("][", $key)."] = \$temp;");
      }
      if ($item["type"]=="close" || $item["level"]<count($key))// && $item["level"]>=count($key))
          array_pop($key);
      if (isset($item["attributes"]))
          eval("\$output[".implode("][", $key)."]['attributes'] = array_merge(\$output[".implode("][", $key)."]['attributes'], \$item['attributes']);");
      if (isset($item["value"]))
          eval("\$output[".implode("][", $key)."]['value'] .= \$item['value'];");
   }
?>
Elad Elrom 12-Sep-2006 02:14
This is a quick fix for parsing XML from remote URL, some of the example above will work when trying to parse on your local server without "http://" but not when trying to parse from remote server using "http://www.URL"...

<?
$file="http://www.URL.com/file.XML";

$xml_parser = xml_parser_create();

$handle = fopen($file, "rb");
$contents = '';
while (!feof($handle)) {
  $data .= fread($handle, 8192);
}
fclose($handle);

xml_parse_into_struct($xml_parser, $data, $vals, $index);
xml_parser_free($xml_parser);

$params = array();
$level = array();
foreach ($vals as $xml_elem) {
  if ($xml_elem['type'] == 'open') {
   if (array_key_exists('attributes',$xml_elem)) {
     list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
   } else {
     $level[$xml_elem['level']] = $xml_elem['tag'];
   }
  }
  if ($xml_elem['type'] == 'complete') {
   $start_level = 1;
   $php_stmt = '$params';
   while($start_level < $xml_elem['level']) {
     $php_stmt .= '[$level['.$start_level.']]';
     $start_level++;
   }
   $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
   eval($php_stmt);
  }
}

echo "<pre>";
print_r ($params);
echo "</pre>";
?>
efredricksen at gmail dot com 24-May-2006 12:55
Perhaps the one true parser:? I modified xademax's fine code to tidy it up, codewise and style wise, rationalize some minor crazyness, and make names fit nomenclature from the XML spec. (There are no uses of eval, and shame on you people who do.)

<?php
class XmlElement {
  var $name;
  var $attributes;
  var $content;
  var $children;
};

function xml_to_object($xml) {
  $parser = xml_parser_create();
  xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
  xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
  xml_parse_into_struct($parser, $xml, $tags);
  xml_parser_free($parser);

  $elements = array();  // the currently filling [child] XmlElement array
  $stack = array();
  foreach ($tags as $tag) {
    $index = count($elements);
    if ($tag['type'] == "complete" || $tag['type'] == "open") {
      $elements[$index] = new XmlElement;
      $elements[$index]->name = $tag['tag'];
      $elements[$index]->attributes = $tag['attributes'];
      $elements[$index]->content = $tag['value'];
      if ($tag['type'] == "open") {  // push
        $elements[$index]->children = array();
        $stack[count($stack)] = &$elements;
        $elements = &$elements[$index]->children;
      }
    }
    if ($tag['type'] == "close") {  // pop
      $elements = &$stack[count($stack) - 1];
      unset($stack[count($stack) - 1]);
    }
  }
  return $elements[0];  // the single top-level element
}

// For example:
$xml = '
<parser>
   <name language="en-us">Fred Parser</name>
   <category>
       <name>Nomenclature</name>
       <note>Noteworthy</note>
   </category>
</parser>
';
print_r(xml_to_object($xml));
?>

will give:

xmlelement Object
(
    [name] => parser
    [attributes] =>
    [content] =>
    [children] => Array
        (
            [0] => xmlelement Object
                (
                    [name] => name
                    [attributes] => Array
                        (
                            [language] => en-us
                        )

                    [content] => Fred Parser
                    [children] =>
                )

            [1] => xmlelement Object
                (
                    [name] => category
                    [attributes] =>
                    [content] =>
                    [children] => Array
                        (
                            [0] => xmlelement Object
                                (
                                    [name] => name
                                    [attributes] =>
                                    [content] => Nomenclature
                                    [children] =>
                                )

                            [1] => xmlelement Object
                                (
                                    [name] => note
                                    [attributes] =>
                                    [content] => Noteworthy
                                    [children] =>
                                )

                        )

                )

        )

)
Stuart 23-May-2006 03:26
This is a great little function for a lot of XML work, but note that this function does not handle XML entities properly.

The basic XML entities &lt; &gt; &amp; &quot; are fine, just anything else will not work:

If the entity is defined in the XML header, the parser will drop it completely from the struct it creates.

If the entity is not defined in the XML then the parser will crash out with an undefined entity error.

You should be able to work around this limitation by using a preg_replace on your XML string before passing it to the parser.

(Further details in Bug #35271; this is just a warning to those thinking of using this function for parsing real XML documents not just trivial XML examples)
xademax at gmail dot com 08-Jan-2006 12:15
This is just another simple xml parser :)

<?php

class Xml
{
    var $tag;
    var $value;
    var $attributes;
    var $next;
}

function xml2array($xml_string)
{
    $Parser = xml_parser_create();
    xml_parser_set_option($Parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($Parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($Parser, $xml_string, $Xml_Values);
    xml_parser_free($Parser);
    $XmlClass = array();
    $LastObj = array();
    $NowObj = &$XmlClass;

    foreach($Xml_Values as $Xml_Key => $Xml_Value)
    {
        $Index = count($NowObj);
        if($Xml_Value["type"] == "complete")
        {
            $NowObj[$Index] = new Xml;
            $NowObj[$Index]->tag = $Xml_Value["tag"];
            $NowObj[$Index]->value = $Xml_Value["value"];
            $NowObj[$Index]->attributes = $Xml_Value["attributes"];
        }
        elseif($Xml_Value["type"] == "open")
        {
            $NowObj[$Index] = new Xml;
            $NowObj[$Index]->tag = $Xml_Value["tag"];
            $NowObj[$Index]->value = $Xml_Value["value"];
            $NowObj[$Index]->attributes = $Xml_Value["attributes"];
            $NowObj[$Index]->next = array();
            $LastObj[count($LastObj)] = &$NowObj;
            $NowObj = &$NowObj[$Index]->next;
        }
        elseif($Xml_Value["type"] == "close")
        {
            $NowObj = &$LastObj[count($LastObj) - 1];
            unset($LastObj[count($LastObj) - 1]);
        }

    }

    return $XmlClass;
}

$String = "
<parser>
    <parseur_name>MyParser</parseur_name>
    <category>
        <name>Name 1</name>
        <note>A note 1</note>
    </category>
</parser>
";
$Xml = xml2array($String);

print_r($Xml);
?>

This exemple will show :
Array
(
    [0] => Xml Object
        (
            [tag] => parser
            [value] =>
            [attributes] =>
            [next] => Array
                (
                    [0] => Xml Object
                        (
                            [tag] => parseur_name
                            [value] => MyParser
                            [attributes] =>
                            [next] =>
                        )

                    [1] => Xml Object
                        (
                            [tag] => category
                            [value] =>
                            [attributes] =>
                            [next] => Array
                                (
                                    [0] => Xml Object
                                        (
                                            [tag] => name
                                            [value] => Name 1
                                            [attributes] =>
                                            [next] =>
                                        )

                                    [1] => Xml Object
                                        (
                                            [tag] => note
                                            [value] => A note 1
                                            [attributes] =>
                                            [next] =>
                                        )

                                )

                        )

                )

        )

)
mbirth at webwriters dot de 08-Nov-2005 03:48
Searching for a nice and working way to get a RSS feed into an array-structure, I found the solution posted by kieran but disliked those several eval()s. So I wrote my own using references/pointers.

<?php

class RSSParser {

  var $struct = array();  // holds final structure
  var $curptr;  // current branch on $struct
  var $parents = array();  // parent branches of current branch

  function RSSParser($url) {
    $this->curptr =& $this->struct;  // set ref to base
    $xmlparser = xml_parser_create();
    xml_set_object($xmlparser, $this);
    xml_set_element_handler($xmlparser, 'tag_open', 'tag_close');
    xml_set_character_data_handler($xmlparser, 'cdata');
    $fp = fopen($url, 'r');

    while ($data = fread($fp, 4096))
      xml_parse($xmlparser, $data, feof($fp))
      || die(sprintf("XML error: %s at line %d",
         xml_error_string(xml_get_error_code($xmlparser)),
         xml_get_current_line_number($xmlparser)));

    fclose($fp);
    xml_parser_free($xmlparser);
  }

  function tag_open($parser, $tag, $attr) {
    $i = count($this->curptr['children']);
    $j = count($this->parents);
    $this->curptr['children'][$i]=array();  // add new child element
    $this->parents[$j] =& $this->curptr;  // store current position as parent
    $this->curptr =& $this->curptr['children'][$i];  // submerge to newly created child element
    $this->curptr['name'] = $tag;
    if (count($attr)>0) $this->curptr['attr'] = $attr;
  }

  function tag_close($parser, $tag) {
    $i = count($this->parents);
    if ($i>0) $this->curptr =& $this->parents[$i-1];  // return to parent element
    unset($this->parents[$i-1]);  // clear from list of parents
  }

  function cdata($parser, $data) {
    $data = trim($data);
    if (!empty($data)) {
      $this->curptr['value'] .= $data;
    }
  }

}

$myparser = new RSSParser('getitems.xml');
$anotherparser = new RSSParser('http://johndoe:secret@myfeeds.com/getfeed.xml');

print_r($myparser->struct);
print_r($anotherparser->struct);

?>
kieran at kieran dot ca 20-Oct-2005 09:20
<?
/*
|
| _xml2array - another abstraction layer on xml_parse_into_struct
|              that returns a nice nested array.
|
|      @param: $xml is a string containing a full xml document
|
|     returns: a nested php array that looks like this:
|
|              array
|              (
|                  [_name] => the name of the tag
|                  [_attributes] => an array of 'attribute'=>'value' combos
|                  [_value] => the text contents of the node
|                  [_children] => an array of these arrays, one for each node.
|              )
|
|       notes: thanks to 'jeffg at activestate dot com' who inspired
|              me to essentially re-write his example code from php.net
|
|           me: Kieran Huggins < kieran[at]kieran[dot]ca >
|
*/
function _xml2array($xml){
    global $keys;
    global $level;
    if(!is_array($xml)){ // init on first run
        $raw_xml = $xml;
        $p = xml_parser_create();
        xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
        xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
        xml_parse_into_struct($p, $raw_xml, $xml, $idx);
        xml_parser_free($p);
    }
    for($i=0;$i<count($xml,1);$i++){
        // set the current level
        $level = $xml[$i]['level'];

        if($level<1)break;

        // mark this level's tag in the array
        $keys[$level] = '['.$i.']';

        // if we've come down a level, sort output and destroy the upper level
        if(count($keys)>$level) unset($keys[count($keys)]);

        // ignore close tags, they're useless
        if($xml[$i]['type']=="open" || $xml[$i]['type']=="complete"){

            // build the evalstring
            $e = '$output'.implode('[\'_children\']',$keys);

            // set the tag name
            eval($e.'[\'_name\'] = $xml[$i][\'tag\'];');

            // set the attributes
            if($xml[$i]['attributes']){
                eval($e.'[\'_attributes\'] = $xml[$i][\'attributes\'];');
            }

            // set the value
            if($xml[$i]['value']){
                eval($e.'[\'_value\'] = trim($xml[$i][\'value\']);');
            }

        }

    }

    return $output;
}
?>
Chris Hester 28-Jul-2005 05:06
The array generated from XML stores not only the elements but also any spaces and linebreaks between the tags. This results in a much longer array. (I had 24 array fields instead of 10!) To cure this use the following code when creating the parser:

<?php
$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1);
?>
grusin at gmail dot com 19-Jul-2005 11:54
Here is a simple patch to peter's xml2array function.

Replace:

<?
case 'open':
$tag_or_id = (array_key_exists ('attributes', xml_elem)) ? $xml_elem['attributes']['ID'] : $xml_elem['tag'];
$ptrs[$level][$tag_or_id] = array ();
$ptrs[$level+1] = & $ptrs[$level][$tag_or_id];
break;
?>

with:

<?
case 'open':
$tag_or_id = (array_key_exists ('attributes', $xml_elem)) ? $xml_elem['attributes']['ID'] : $xml_elem['tag'];
$ptrs[$level][$tag_or_id][] = array ();
$ptrs[$level+1] = & $ptrs[$level][$tag_or_id][count($ptrs[$level][$tag_or_id])-1];
break;
?>

and now code should handle multiple element case :)
Dustin 13-Jul-2005 08:39
If you happen to have problems with weird charaters, I added this code to the first line of dUDA's function:

$XML = utf8_decode($XML);
PhF at madmac dot fr 23-Jun-2005 01:11
The code previously posted by noob at noobsrule dot com doesn't work when the same tag name is used at different levels.
(but perhaps "$php_used_prefix" was intended for that ?)
For example:
<RatedShipment>
  <TransportationCharges>
    ...
  </TransportationCharges>
  <RatedPackage>
    <TransportationCharges>
      ...
    </TransportationCharges>
  </RatedPackage>
</RatedShipment>
<?php
    $p = xml_parser_create();
    xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($p, $UPSxml, $values, $idx);
    xml_parser_free($p);

    // tracking used keys
    $usedKeys = array();
    $deepLevel = -1;

    // start a php array string (evaluated later)
    $forEvalPrefix = '$xml_array';

    // loop throught the value array
    foreach ($values as $key => $val) {
        $tagName = $val['tag']; // pass the key tag into a more friendly looking variable
        $level = $val['level']; // idem
        if($val['type'] == 'open') {
            $deepLevel++; // increase deep level
            $forEvalPrefix .= '[\''. $tagName .'\']';

            // begin used keys checks to allow multidimensionatity under the same tag
            (isset($usedKeys[$level][$tagName])) ? $usedKeys[$level][$tagName]++ : $usedKeys[$level][$tagName] = 0;
            $forEvalPrefix .= '['. $usedKeys[$level][$tagName] .']';
        }
        if($val['type'] == 'complete') {
            ($level > $deepLevel) ? $deepLevel++ : ''; // increase $deepLevel only if current level is bigger
            $tagValue = addslashes($val['value'] ); // format the value for evaluation as a string
            $forEvalSuffix = '[\''. $tagName .'\'] = \''. $tagValue .'\';'; // create a string to append to the current prefix
            $forEval = $forEvalPrefix . $forEvalSuffix; // (without "$php_used_prefix"...)
            eval($forEval); // write the string to the array structure
        }
        if($val['type'] == 'close') {
            unset($usedKeys[$deepLevel]); // Suppress tagname's keys useless
            $deepLevel--;
            $forEvalPrefix = substr($forEvalPrefix, 0, strrpos($forEvalPrefix, '[')); // cut off the used keys node
            $forEvalPrefix = substr($forEvalPrefix, 0, strrpos($forEvalPrefix, '[')); // cut off the end level of the array string prefix
        }
    }
echo '<pre>';
print_r ($xml_array);
echo '</pre>';
?>

MADmac ;-)
peter at elemental dot org 15-Jun-2005 08:46
Quick addendum to my post below... The code does *not* handle cases where multiple elements are used without attribute IDs, as is the case with the moldb example.  (It is probably worth noting that some of the other code below doesn't do this either, and is still more complex.)

It is not difficult to add that functionality, but I have yet to find an elegant way to integrate that feature, and since I don't need that functionality at the moment, I'm going leave that as an exercise to the reader.  ;-)

-p.
peter at elemental dot org 14-Jun-2005 04:09
Some of the code posted previously seemed absurdly complex, so I thought I'd see if I could simplify things a bit. Here's what I came up with.  (I'm still a PHP newbie, so perhaps I simplified too much.  ;-)  Untested for speed, but it *should* be pretty quick since it uses references instead of lookups or (gack) evals.

Enjoy!

/*
 *  Convert a string containing XML into a nested array
 *
 *  Takes a raw XML string as input
 *  Returns a nested array
 */

function xml2array ($xml_data)
{
    // parse the XML datastring
    $xml_parser = xml_parser_create ();
    xml_parse_into_struct ($xml_parser, $xml_data, $vals, $index);
    xml_parser_free ($xml_parser);

    // convert the parsed data into a PHP datatype
    $params = array();
    $ptrs[0] = & $params;
    foreach ($vals as $xml_elem) {
        $level = $xml_elem['level'] - 1;
        switch ($xml_elem['type']) {
        case 'open':
            $tag_or_id = (array_key_exists ('attributes', $xml_elem)) ? $xml_elem['attributes']['ID'] : $xml_elem['tag'];
            $ptrs[$level][$tag_or_id] = array ();
            $ptrs[$level+1] = & $ptrs[$level][$tag_or_id];
            break;
        case 'complete':
            $ptrs[$level][$xml_elem['tag']] = (isset ($xml_elem['value'])) ? $xml_elem['value'] : '';
            break;
        }
    }

    return ($params);

}
gleber at mapnet dot pl 26-Mar-2005 03:03
XMLtoArray created by dudus at onet dot pl was not good enough for me, that's why i decided to create my own version, and here's the result:

<?php

function &last(&$array) {
if (!count($array)) return null;
end($array);
return $array[key($array)];
}

function myParseXML(&$vals, &$dom, &$lev) {
    do {
        $curr = current($vals);
        $lev = $curr['level'];
        switch ($curr['type']) {
            case 'open':
                if (isset($dom[$curr['tag']])) {
                    $tmp = $dom[$curr['tag']];
                    if (!$tmp['__multi'])
                        $dom[$curr['tag']] = array('__multi' => true, $tmp);
                    array_push($dom[$curr['tag']], array());
                    $new =& last($dom[$curr['tag']]);
                } else {
                    $dom[$curr['tag']] = array();
                    $new =& $dom[$curr['tag']];
                }
                next($vals);
                myParseXML(&$vals, $new, $lev);
                break;
            case 'cdata':
                break;
            case 'complete':
                if (!isset($dom[$curr['tag']]))
                    $dom[$curr['tag']] = $curr['value'];
                else {
                    if (is_array($dom[$curr['tag']]))
                        array_push($dom[$curr['tag']] , $curr['value']);
                    else
                        array_push($dom[$curr['tag']] = array($dom[$curr['tag']]) , $curr['value']);
                }
                break;
            case 'close':
                return;
        }
    }
    while (next($vals)!==FALSE);
}

function MyXMLtoArray($XML) {
       $xml_parser = xml_parser_create();
       xml_parse_into_struct($xml_parser, $XML, $vals);
       xml_parser_free($xml_parser);
       reset($vals);
       $dom = array(); $lev = 0;
       myParseXML($vals, $dom, $lev);
       return $dom;
}

?>

MyXMLtoArray() is that function you should call, other are for "internal" use.

P.S. It's 4-5 time faster then dudus at onet dot pl 's code
noob at noobsrule dot com 24-Jan-2005 10:59
This is my first time contributing but I found all the examples either didn't work or were beyond my comprehension.  I also wanted to maintain the XML multi-dimensionality so I could do loops based on keys I was expecting rather than numbers or some other whatnot.  This script is probably way inefficient, but should give you a multidimensional array with a depth that will match the XML source.  Great for situations when you aren't sure what you'll be getting back.  Its also only based on the values array of xml_parse_into_str() using the 3 tag types (open, complete, and close) -- hopefully it will make more sense to other noobs.

Basically it just constructs a string ($php_prefix) that is tweaked if it hits an "open" or "close" tag and evaluated if it hits a "complete" tag.

Thanks.

<?php

# initiate curl session...
$ch = curl_init( "http://yourtargethost" ) or die ( "could not initialize curl" );

# set curl options...
curl_setopt( $ch, CURLOPT_HEADER, 0 );
curl_setopt( $ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $request_str );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 0 );
curl_setopt( $ch, CURLOPT_REFERER, https://foobar.com" );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );

# execute curl commands...
$curl_result = curl_exec( $ch ) or die ( "could not execute the post" );
curl_close( $ch ); // close curl session

# pass the XML result into 2 arrays ( index and values )...
$p = xml_parser_create();
xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($p, $curl_result, $vals, $index);
xml_parser_free($p);

# create an empty used key tracker...
$used_keys = array();

# start a php array string (evaluated later)...
$php_prefix = "$"."my_array";

# loop through the values array...
foreach ($vals as $key => $val) {
    if( $val['type'] == "open" ) {
        $my_tag = $val['tag']; // pass the key tag into a more friendly looking variable...
        $php_prefix .= "['".$my_tag."']"; # add a new level to the array string...

        # begin used key checks to allow multidimensionality under the same tag, adds a number to the prefix if necessary...
        if( ! array_key_exists( $my_tag, $used_keys ) ) {
            $used_keys[$my_tag] = 0;
            $php_prefix .= "[".$used_keys[$my_tag]."]";
        }else {
            $used_keys[$my_tag]++; // increment the key tracker to avoid overwriting existing key...
            $php_prefix .= "[".$used_keys[$my_tag]."]";
        }
    } elseif( $val['type'] == "complete" ) {
        $my_value = addslashes( $val['value'] ); # format the value for evaluation as a string...
        $php_suffix = "['".$val['tag']."'] = \"".$my_value."\";"; # create a string with the tag and value to append to the current prefix (just used here)...
        $php_str = $php_prefix.$php_used_prefix.$php_suffix;
        eval( $php_str ); # write the string to the array structure...
    }
    if( $val['type'] == "close" ) {
        $php_prefix = substr( $php_prefix, 0, strrpos( $php_prefix, "[" ) ); # cut off the used keys node...
        $php_prefix = substr( $php_prefix, 0, strrpos( $php_prefix, "[" ) ); # cut off the end level of the array string prefix...
    }
}

echo "<pre>";
//print_r ($index);
//echo "<br><br><br>";
//print_r ($vals);
//echo "<br><br><br>";
print_r ($my_array);
echo "</pre>";

?>
dudus at onet dot pl 18-Jan-2005 06:33
This function return array from XML. Included attributes and tags in same level.
I wrote this function based on mmustafa code.

enjoy!
dUDA

-------------------------------

<?
function XMLtoArray($XML)
{
    $xml_parser = xml_parser_create();
    xml_parse_into_struct($xml_parser, $XML, $vals);
    xml_parser_free($xml_parser);
    // wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie
    $_tmp='';
    foreach ($vals as $xml_elem)
    {
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_level!=1 && $x_type == 'close')
        {
            if (isset($multi_key[$x_tag][$x_level]))
                $multi_key[$x_tag][$x_level]=1;
            else
                $multi_key[$x_tag][$x_level]=0;
        }
        if ($x_level!=1 && $x_type == 'complete')
        {
            if ($_tmp==$x_tag)
                $multi_key[$x_tag][$x_level]=1;
            $_tmp=$x_tag;
        }
    }
    // jedziemy po tablicy
    foreach ($vals as $xml_elem)
    {
        $x_tag=$xml_elem['tag'];
        $x_level=$xml_elem['level'];
        $x_type=$xml_elem['type'];
        if ($x_type == 'open')
            $level[$x_level] = $x_tag;
        $start_level = 1;
        $php_stmt = '$xml_array';
        if ($x_type=='close' && $x_level!=1)
            $multi_key[$x_tag][$x_level]++;
        while($start_level < $x_level)
        {
              $php_stmt .= '[$level['.$start_level.']]';
              if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level])
                  $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']';
              $start_level++;
        }
        $add='';
        if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete'))
        {
            if (!isset($multi_key2[$x_tag][$x_level]))
                $multi_key2[$x_tag][$x_level]=0;
            else
                $multi_key2[$x_tag][$x_level]++;
             $add='['.$multi_key2[$x_tag][$x_level].']';
        }
        if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes',$xml_elem))
        {
            if ($x_type == 'open')
                $php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
            else
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];';
            eval($php_stmt_main);
        }
        if (array_key_exists('attributes',$xml_elem))
        {
            if (isset($xml_elem['value']))
            {
                $php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];';
                eval($php_stmt_main);
            }
            foreach ($xml_elem['attributes'] as $key=>$value)
            {
                $php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;';
                eval($php_stmt_att);
            }
        }
    }
     return $xml_array;
}    // END XMLtoArray
?>
memandeemail at gmail dot com 03-Dec-2004 04:32
If you have de XML:
<?xml version="1.0" encoding="iso-8859-1"?>
<teste>
    <teste>
        <teste>
        </teste>
    </teste>
</teste>

this function will return this tags:
Array
(
    [teste] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 2
            [3] => 3
            [4] => 4
        )

)

With this function (right below) will convert the struc to OPEN and CLOSE concept.

The New Struct:
Array
(
    [teste] => Array
        (
            [0] => 0
            [1] => 4
            [2] => 1
            [3] => 3
            [4] => 2
        )

)
The Function:

<?php
/**
 * @return bool
 * @param xml_array $values
 * @param xml_array[reference] $tags
 * @desc Reconstruct xml_parse_into_struct
*/
function reconstruct_tag($values, &$tags) {
    unset($return);
    foreach ($tags as $tkey => $tvalue) {
        foreach ($tvalue as $vvalue) {
            if ($values[$vvalue]['type'] == 'open' or $values[$vvalue]['type'] == 'complete') {
                $return[$tkey][] = $vvalue;
            }
            if ($values[$vvalue]['type'] == 'open') {
                foreach ($tvalue as $tv_value) {
                    if ($values[$tv_value]['type'] == 'close'
                    and $values[$tv_value]['level'] == $values[$vvalue]['level']
                    and $tv_value > $vvalue) {
                        $return[$tkey][] = $tv_value;
                        break;
                    }
                }
            }
        }
    }
    $tags = $return;
    return (bool) $tags;
}
?>

Ahh, DO NOT forget this comment:

jukkaho at mail dot student dot oulu dot fi
29-Jun-2004 12:17
Everyone seems to forget the return value of this function (including people making examples!), but it is there for a reason:
0 if failed (invalid XML), 1 if succeeded.

Return value really is an integer, be careful with those === operators.
happyseb at free dot fr 24-Aug-2004 08:51
I would just add something about the solution proposed by "gordon at kanazawa dot ac dot jp".

Something went wrong about the fact that "cdata" are treated the same way as "complete" in the xml_get_children first and in the xml_get_child then.

When ?
with this method, something like this :
<tagA>
  <tagB>valueB</tagB>
  valueA
  <tagC>valueC</tagC>
</tagA>
is considered as the same thing as
<tagA>
  <tagB>valueB</tagB>
  <tagA>valueA</tagA>
  <tagC>valueC</tagC>
</tagA>

The algorithm is nomore bijective.

Even if it might not be perfect :-) i propose a little modification of the xml_get_child function :

function xml_get_child(&$v, $children=NULL) {
      $c = array(); // the "child"
      if (isset($v['tag']) && $v['type'] != 'cdata') $c['tag'] = $v['tag'];
      if (isset($v['value'])) $c['value'] = $v['value'];
      if (isset($v['attributes'])) $c['attributes'] = $v['attributes'];
      if (is_array($children)) $c['children'] = $children;
      return $c;
}

moreover, the following function will take the tree (made from the xml_get_tree function) as a parameter and build the xml content back

    /*
    // setTree
    // set xml Tree from a well-formed array
    // manage indentation
    // Parameters are :
    // $1 (needed) : Tree to transform
    // $2 (optional) : Indentation type (default is one tabulation)
    // $3 (optional) : First indent (default is empty string)
    */

    function setTree($Atree, $indentType = '    ', $Sindent = '')
    {
      if (! isset ($Atree['tag']) && isset ($Atree['value'])) return ($Sindent.trim($Atree['value'])."\r\n") ;
      else {
        $Stemp = $Sindent.'<'.$Atree['tag'].' ' ;
        if (isset ($Atree['attributes']) && is_array ($Atree['attributes'])) {
          foreach ($Atree['attributes'] as $Aattribute => $Svalue) $Stemp .= $Aattribute.'="'.$Svalue.'" ' ;
        }
        if (! isset ($Atree['children']) && ! isset ($Atree['value'])) $Stemp .= '/>'."\r\n" ;
        else {
          $Stemp .= '>'."\r\n" ;
          if (isset ($Atree['value'])) $Stemp .= $Sindent.$indentType.trim($Atree['value'])."\r\n" ;
          if (isset ($Atree['children']) && is_array ($Atree['children']))
            foreach ($Atree['children'] as $Achild) $Stemp .= $this->setTree($Achild, $indentType, $Sindent.$indentType) ;
          $Stemp .= $Sindent.'</'.$Atree['tag'].'>'."\r\n" ;
        }
        return ($Stemp) ;
      }
    }
sdh33 at cornell dot edu 13-Jun-2004 10:12
(The previous post I wrote was incorrect.  I fix that herein)
I used the algorithm from stephane for writing back to a file, but ran into the following problem.  My original XML looks like

<ENTRY id="1"> ... </ENTRY><ENTRY id="2"> ... </ENTRY>

This got saved back as

<1> ... </1><2> ... </2>,

which expat doesn't like.  So I propose the following modification:

function writeXmlToFile($data, $f, $niv = 0) {
  foreach($data as $name => $elem) {
    if (preg_match("/\A[0-9]/",$name)) {
      $open = "ENTRY id=\"$name\""; $name = "ENTRY";
    } else {
      $open = $name;
    }
    if(is_array($elem)) {
      fwrite($f, str_repeat("  ", $niv)."<".$open.">"."\n");
      writeXmlToFile($elem, $f, $niv + 1);
      fwrite($f, str_repeat("  ", $niv)."</".$name.">"."\n");
    } else {
      fwrite($f, str_repeat("  ", $niv)."<".$open.">".$elem."</".$name.">"."\n");
    }
  }
}
stephane dot dekeyzer at noemail dot com 08-Apr-2004 11:54
for writing the array of mmustafa back to a xml file, use this code:

function writeXmlFile($fileName, $struct){
  $f = fopen($fileName, "w");
  writeXmlToFile($struct, $f);
  fclose($f);
}

function writeXmlToFile($data, $f, $niv = 0){
  foreach($data as $name => $elem){
    if(is_array($elem)){
      fwrite($f, str_repeat("  ", $niv)."<".$name.">"."\n");
      writeXmlToFile($elem, $f, $niv + 1);
      fwrite($f, str_repeat("  ", $niv)."</".$name.">"."\n");
    }
    else{
      fwrite($f, str_repeat("  ", $niv)."<".$name.">".$elem."</".$name.">"."\n");
    }
  }
}
mmustafa at vsnl dot com 06-Jan-2004 12:19
A small and simple php code to convert the raw array returned by xml_parse_into_struct into a proper data structure ..

<?php
$file = "data.xml";
$xml_parser = xml_parser_create();

if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

$data = fread($fp, filesize($file));
fclose($fp);
xml_parse_into_struct($xml_parser, $data, $vals, $index);
xml_parser_free($xml_parser);

$params = array();
$level = array();
foreach ($vals as $xml_elem) {
  if ($xml_elem['type'] == 'open') {
    if (array_key_exists('attributes',$xml_elem)) {
      list($level[$xml_elem['level']],$extra) = array_values($xml_elem['attributes']);
    } else {
      $level[$xml_elem['level']] = $xml_elem['tag'];
    }
  }
  if ($xml_elem['type'] == 'complete') {
    $start_level = 1;
    $php_stmt = '$params';
    while($start_level < $xml_elem['level']) {
      $php_stmt .= '[$level['.$start_level.']]';
      $start_level++;
    }
    $php_stmt .= '[$xml_elem[\'tag\']] = $xml_elem[\'value\'];';
    eval($php_stmt);
  }
}

echo "<pre>";
print_r ($params);
echo "</pre>";
?>

Converts an XML document like ..

<country id="ZZ">
<name>My Land</name>
<location>15E</location>
<area>40000</area>
<state1>
<name>Hi State</name>
<area>1000</area>
<population>2000</population>
<city1>
<location>13E</location>
<population>500</population>
<area>500</area>
</city1>
<city2>
<location>13E</location>
<population>500</population>
<area>5000</area>
</city2>
</state1>
<state2>
<name>Low State</name>
<area>3000</area>
<population>20000</population>
<city1>
<location>15E</location>
<population>5000</population>
<area>1500</area>
</city1>
</state2>
</country>

To a php datastructure like ..

Array
(
    [ZZ] => Array
        (
            [NAME] => My Land
            [LOCATION] => 15E
            [AREA] => 40000
            [STATE1] => Array
                (
                    [NAME] => Hi State
                    [AREA] => 1000
                    [POPULATION] => 2000
                    [CITY1] => Array
                        (
                            [LOCATION] => 13E
                            [POPULATION] => 500
                            [AREA] => 500
                        )

                    [CITY2] => Array
                        (
                            [LOCATION] => 13E
                            [POPULATION] => 500
                            [AREA] => 5000
                        )

                )

            [STATE2] => Array
                (
                    [NAME] => Low State
                    [AREA] => 3000
                    [POPULATION] => 20000
                    [CITY1] => Array
                        (
                            [LOCATION] => 15E
                            [POPULATION] => 5000
                            [AREA] => 1500
                        )

                )

        )

)
bisqwit at iki dot fi dot not dot for dot ads dot invalid 20-Nov-2002 08:33
I made my own xml2tree()-function.
The difference to the previously suggested ones on this manual page is that this creates a tree where the tags are keys.

Example input:

<tree>
 <leaf name="gruu"> pl?? </leaf>
 <animal type="cat" />
</tree>

Example output:

Array
( 'tree' => Array
     ( 0 => Array
          ( 'children' => Array
               ( 'leaf' => Array
                    ( 0 => Array
                         ( 'attrs' => Array('name' => 'gruu'),
                           'values' => Array(0 => ' pl?? ')
                    )    ),
                 'animal' => Array
                    ( 0 => Array
                         ( 'attrs' => Array('type' => 'cat')
)    )   )    )    )   )

function xml2tree2($string)
{
  $parser = xml_parser_create();
  xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
  xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
  xml_parse_into_struct($parser, $string, $vals, $index);
  xml_parser_free($parser);

  $stack = array( array() );
  $stacktop = 0;
  $parent = array();
  foreach($vals as $val)
  {
    $type = $val['type'];
    if($type=='open' || $type=='complete')
    {
      // open tag
      $stack[$stacktop++] = $tagi;
      $tagi = array('tag' => $val['tag']);

      if(isset($val['attributes']))  $tagi['attrs'] = $val['attributes'];
      if(isset($val['value']))
        $tagi['values'][] = $val['value'];
    }
    if($type=='complete' || $type=='close')
    {
      // finish tag
      $tags[] = $oldtagi = $tagi;
      $tagi = $stack[--$stacktop];
      $oldtag = $oldtagi['tag'];
      unset($oldtagi['tag']);
      $tagi['children'][$oldtag][] = $oldtagi;
      $parent = $tagi;
    }
    if($type=='cdata')
    {
      $tagi['values'][] = $val['value'];
    }
  }
  return $parent['children'];
}

Ps: Note that the xml parsing for some reason chokes if the values contain <> (even inside ""). You need to escape them as &lt; and &gt;.
Same for & (for obvious reasons). Escape it as &amp;.
For example "&nbsp;" should be written as "&amp;nbsp;".
09-Aug-2002 01:20
This is based on a comment above by mh@mainlab.de.  This version makes more sense to me and I included a few comments that might make it more usefull for specific purposes.

// Look through $vals and $index,
// generated by parse_xml_data(),
// for $location.  $location resembles a unix path.
// E.g. "my/xml/path/to/my/data".
// Note: This is NOT a full-feature xml utility.
// Your path must be unique in the xml data
// and the tags must not contain slashes.
//
// returns: cdata from last element of $location
//          or NULL.
function get_xml_values($vals, $index, $location) {
  $location = explode('/', $location);
  $location_level = count($location);
  for ($n=0; $n<$location_level; ++$n) {
    $val_indexes=$index[$location[$n]];
    $good=0;
    for ($i=0; $i<count($val_indexes); ++$i) {
      $v = $vals[$val_indexes[$i]];
      // level is 1 based, n is 0 based:
      if ($v['level']-1 == $n) {
        if ($v['type'] == 'open') {
          // We found an open tag at the correct level.
          $good=1;
          break; // Remove break to avoid 'open' hiding
                 // 'complete' at last $n. (Speed Vs. Robustness:
                 // For now, I'm going with speed).
        }
        if ($v['type'] == 'complete') {
          // We found it, after finding all the prior elements:
          // You may want to change this to
          // return $v
          // so you can call $v['value'] and $v['attributes']
          return $v['value'];
        }
      }
    }
    if (!$good) {
      return NULL;
    }
  }
}
farinspace-at-hotmail-dot-com 20-Jul-2002 06:41
Wow, took a while to consume all of this. I am a noobie at XML, in fact i just really started working with it today. I went ahead and added to the above code by gdemartini@bol.com.br. I also added the update by nyk@cowham.net.

Added 'value' => $vals[$i]['value'] to the open case, as some nodes have both cdata as well as a children node. In previous versions of the functions the cdata of a node(a) that also had children would get stored in the children's array of the parent node(a). Now only children values are in the children array and the cdata is in the value key of the parent node(a).

Added 'value' => $vals[$i]['value'] to tree array as the vals array produced by PHP includes a value to the top most node if no children exist (for completeness).

Also, using xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE,1) will strip all white space from both around the XML tags as well as inside the cdata. I added a piece of code by waldo@wh-e.com to take care of this. All SPACE characters are now only stripped from around the XML tags and cdata spacing is retained.

CODE:
***************************************

function GetChildren($vals, &$i) {

    $children = array();

    while (++$i < sizeof($vals)) {

        // compair type
        switch ($vals[$i]['type']) {

            case 'cdata':
                $children[] = $vals[$i]['value'];
                break;
            case 'complete':
                $children[] = array(
                    'tag' => $vals[$i]['tag'],
                    'attributes' => $vals[$i]['attributes'],
                    'value' => $vals[$i]['value']
                );
                break;
            case 'open':
                $children[] = array(
                    'tag' => $vals[$i]['tag'],
                    'attributes' => $vals[$i]['attributes'],
                    'value' => $vals[$i]['value'],
                    'children' => GetChildren($vals, $i)
                );
                break;
            case 'close':
                return $children;
        }
    }
}

function GetXMLTree($file) {

    $data = implode('', file($file));

    // by: waldo@wh-e.com - trim space around tags not within
    $data = eregi_replace(">"."[[:space:]]+"."<","><",$data);

    // XML functions
    $p = xml_parser_create();

    // by: anony@mous.com - meets XML 1.0 specification
    xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
    xml_parse_into_struct($p, $data, &$vals, &$index);
    xml_parser_free($p);

    $i = 0;
    $tree = array();
    $tree[] = array(
        'tag' => $vals[$i]['tag'],
        'attributes' => $vals[$i]['attributes'],
        'value' => $vals[$i]['value'],
        'children' => GetChildren($vals, $i)
    );

    return $tree;
}

***************************************
dave at ovumdesign dot com 03-Apr-2002 03:32
Here is another variation on gdemartini@bol.com.br's nice tree algorithm. I have included nyk@cowham.net's "cdata" suggestion. I made a few changes to suppress unitialized variable warnings with error_reporting(E_ALL), and made a few stylistic changes.

There are two functional modifications as well. The first is the added option to expat to turn off "case folding", since XML is technically a case-sensitive language. The second is the returned tree - instead of returning a single-element list (an array with index 0 pointing to the top node) like the original algorithm, it returns the top node itself. This saves you an unnecessary level of indirection.

function xml_get_children($vals, &$i) {
    $children = array();
    if (isset($vals[$i]['value'])) $children[] = $vals[$i]['value'];

    while (++$i < count($vals)) {
        switch ($vals[$i]['type']) {
        case 'cdata':
            $children[] = $vals[$i]['value'];
            break;

        case 'complete':
            $children[] = array(
                'tag'        => $vals[$i]['tag'],
                'attributes' => isset($vals[$i]['attributes'])?
                                $vals[$i]['attributes'] : null,
                'value'      => $vals[$i]['value'],
            );
            break;

        case 'open':
            $children[] = array(
                'tag'        => $vals[$i]['tag'],
                'attributes' => isset($vals[$i]['attributes'])?
                                $vals[$i]['attributes'] : null,
                'children'   => xml_get_children($vals, $i),
            );
            break;

        case 'close':
            return $children;
        }
    }
}

function xml_get_tree($file) {
    $data = join('', file($file));

    $parser = xml_parser_create();
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE,   1);
    xml_parse_into_struct($parser, $data, $vals, $index);
    xml_parser_free($parser);

    return array(
        'tag'        => $vals[0]['tag'],
        'attributes' => isset($vals[0]['attributes'])?
                        $vals[0]['attributes'] : null,
        'children'   => xml_get_children($vals, $i = 0),
    );
}

This function takes a tree returned by xml_get_tree() and simplifies it similarly to voncken@mailandnews.com and oknapp@soly.de's suggestions. It finds any nodes that expat considered "complete" (childless) and contain no attributes, and it moves the tag name (as the key) and value into an element in the parent node's "values" array.

For example:
$tree = xml_get_tree('moldb.xml');
$tree = xml_condense_tree($tree);
echo $tree['children'][1]['values']['name'];

Outputs:
Lysine

function xml_condense_tree($tree) {
    foreach ($tree['children'] as $index => $node) {
        if (isset($node['children'])) {
            $tree['children'][$index] = xml_condense_tree($node);

        } elseif (isset($node['value']) and !$node['attributes']) {
            $tree['values'][$node['tag']] = $node['value'];
            unset($tree['children'][$index]);
        }
    }

    if (!$tree['children']) unset($tree['children']);
    return $tree;
}

Enjoy,
Dave


Commence l'analyse d'un document XML

  • « xml_parse_into_struct
  • xml_parser_create_ns »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Commence l'analyse d'un document XML

xml_parse

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parse — Commence l'analyse d'un document XML

Description

xml_parse ( XMLParser $parser , string $data , bool $is_final = false ) : int

xml_parse() analyse un document XML. Les gestionnaires pour les événements configurés sont appelés autant de fois que nécessaire.

Liste de paramètres

parser

Une référence sur l'analyseur XML à utiliser.

data

Une partie des données à analyser. Un document peut être analysé morceau par morceau par appels successifs à xml_parse() avec de nouvelles données, aussi longtemps que le paramètre is_final est défini et true lorsque les dernières données sont analysées.

is_final

Si défini et vaut true, data sera le dernier morceau de données envoyées à l'analyseur.

Valeurs de retour

Retourne 1 en cas de succès ou 0 en cas d'échec.

Lors d'un échec d'analyse, la cause de l'erreur peut être obtenue grâce
aux fonctions
xml_get_error_code(),
xml_error_string(),
xml_get_current_line_number(),
xml_get_current_column_number() et
xml_get_current_byte_index().

Note:

Quelques erreurs (dont les erreurs d'entités) sont reportées à la fin des données, ceci uniquement si is_final vaut true.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

Exemples

Exemple #1 Analyse de gros documents XML par morceaux

Cet exemple montre comment les gros documents XML peuvent être lus et analysés en morceaux, permettant ainsi de ne pas conserver en mémoire la totalité du document. Aucun gestionnaire d'erreur n'a été positionné pour rendre l'exemple plus concis.

<?php
$stream = fopen('large.xml', 'r');
$parser = xml_parser_create();
// set up the handlers here
while (($data = fread($stream, 16384))) {
    xml_parse($parser, $data); // analyse du morceau courant
}
xml_parse($parser, '', true); // finalisation de l'analyse
xml_parser_free($parser);
fclose($stream);

User Contributed Notes

Programmerdude 06-Aug-2014 07:26
Due to restrictions in libxml2 the maximum length of $data is 9.5MB. If you need to process more than 9.5MB you can do so by calling the function multiple times and setting $is_final on the last call.
alejandro dot anv at gmail dot com 13-Mar-2014 01:00
Here is my array2xml function. I made it because I coudn't find a generic recursive function that generates a prety formatted XML from any array.

Usage:

<?php echo xml2array('rootname',$myarray); ?>

or if you want to specify a spacing character(s) other than TAB:

<?php echo xml2array('rootname',$myarray,'   '); ?>

or if you want avoid spacing at all

<?php echo xml2array('rootname',$myarray,''); ?>

<?php
function array2xml($nombre,$valor,$tab="\t",$nivel=0){

if ($nivel==0) $r='<?xml version="1.0" encoding="ISO-8859-1"?>';

$arr=!is_numeric($nombre);
$spacing=str_repeat($tab,$nivel);
if ($tab!='') $newline="\n";
else $newline='';

if (is_array($valor)){

   if (count($valor)>0){
      $r.=$newline;
      //$r.=str_repeat($tab,$nivel);
      foreach($valor as $k=>$v){
         if ($arr) $r.="$spacing<$nombre>";

         if (is_array($v))  $r.=array2xml($k,$v,$tab,$nivel+$arr);
         else $r.="$spacing<$k>$v</$k>$newline";

         if ($arr) $r.="$spacing</$nombre>$newline";
         }//foreach
      }//count
   else $r.="$spacing<$nombre></$nombre>"; // it's an empty array
   }
else {
     if ($arr) $r.="$spacing<$nombre>";
     $r.=$valor;
     if ($arr) $r.="</$nombre>$newline";
     }

return $r;
}
?>
Ashok dot 893 at gmail dot com 25-Apr-2010 10:52
This is very simple way to convert all applicable objects into associative array.  This works with not only SimpleXML but any kind of object. The input can be either array or object. This function also takes an options parameter as array of indices to be excluded in the return array. And keep in mind, this returns only the array of non-static and accessible variables of the object since using the function get_object_vars().

<?php
function objectsIntoArray($arrObjData, $arrSkipIndices = array())
{
    $arrData = array();

    // if input is object, convert into array
    if (is_object($arrObjData)) {
        $arrObjData = get_object_vars($arrObjData);
    }

    if (is_array($arrObjData)) {
        foreach ($arrObjData as $index => $value) {
            if (is_object($value) || is_array($value)) {
                $value = objectsIntoArray($value, $arrSkipIndices); // recursive call
            }
            if (in_array($index, $arrSkipIndices)) {
                continue;
            }
            $arrData[$index] = $value;
        }
    }
    return $arrData;
}
?>

Usage:

<?php
$xmlUrl = "feed.xml"; // XML feed file/URL
$xmlStr = file_get_contents($xmlUrl);
$xmlObj = simplexml_load_string($xmlStr);
$arrXml = objectsIntoArray($xmlObj);
print_r($arrXml);
?>
lz_speedy at web dot de 30-Dec-2008 10:20
Best seen xml2array function ever
<?php
function xml2array($url, $get_attributes = 1, $priority = 'tag')
{
    $contents = "";
    if (!function_exists('xml_parser_create'))
    {
        return array ();
    }
    $parser = xml_parser_create('');
    if (!($fp = @ fopen($url, 'rb')))
    {
        return array ();
    }
    while (!feof($fp))
    {
        $contents .= fread($fp, 8192);
    }
    fclose($fp);
    xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
    xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
    xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
    xml_parse_into_struct($parser, trim($contents), $xml_values);
    xml_parser_free($parser);
    if (!$xml_values)
        return; //Hmm...
    $xml_array = array ();
    $parents = array ();
    $opened_tags = array ();
    $arr = array ();
    $current = & $xml_array;
    $repeated_tag_index = array ();
    foreach ($xml_values as $data)
    {
        unset ($attributes, $value);
        extract($data);
        $result = array ();
        $attributes_data = array ();
        if (isset ($value))
        {
            if ($priority == 'tag')
                $result = $value;
            else
                $result['value'] = $value;
        }
        if (isset ($attributes) and $get_attributes)
        {
            foreach ($attributes as $attr => $val)
            {
                if ($priority == 'tag')
                    $attributes_data[$attr] = $val;
                else
                    $result['attr'][$attr] = $val; //Set all the attributes in a array called 'attr'
            }
        }
        if ($type == "open")
        {
            $parent[$level -1] = & $current;
            if (!is_array($current) or (!in_array($tag, array_keys($current))))
            {
                $current[$tag] = $result;
                if ($attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                $current = & $current[$tag];
            }
            else
            {
                if (isset ($current[$tag][0]))
                {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                    $repeated_tag_index[$tag . '_' . $level]++;
                }
                else
                {
                    $current[$tag] = array (
                        $current[$tag],
                        $result
                    );
                    $repeated_tag_index[$tag . '_' . $level] = 2;
                    if (isset ($current[$tag . '_attr']))
                    {
                        $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                        unset ($current[$tag . '_attr']);
                    }
                }
                $last_item_index = $repeated_tag_index[$tag . '_' . $level] - 1;
                $current = & $current[$tag][$last_item_index];
            }
        }
        elseif ($type == "complete")
        {
            if (!isset ($current[$tag]))
            {
                $current[$tag] = $result;
                $repeated_tag_index[$tag . '_' . $level] = 1;
                if ($priority == 'tag' and $attributes_data)
                    $current[$tag . '_attr'] = $attributes_data;
            }
            else
            {
                if (isset ($current[$tag][0]) and is_array($current[$tag]))
                {
                    $current[$tag][$repeated_tag_index[$tag . '_' . $level]] = $result;
                    if ($priority == 'tag' and $get_attributes and $attributes_data)
                    {
                        $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                    }
                    $repeated_tag_index[$tag . '_' . $level]++;
                }
                else
                {
                    $current[$tag] = array (
                        $current[$tag],
                        $result
                    );
                    $repeated_tag_index[$tag . '_' . $level] = 1;
                    if ($priority == 'tag' and $get_attributes)
                    {
                        if (isset ($current[$tag . '_attr']))
                        {
                            $current[$tag]['0_attr'] = $current[$tag . '_attr'];
                            unset ($current[$tag . '_attr']);
                        }
                        if ($attributes_data)
                        {
                            $current[$tag][$repeated_tag_index[$tag . '_' . $level] . '_attr'] = $attributes_data;
                        }
                    }
                    $repeated_tag_index[$tag . '_' . $level]++; //0 and 1 index is already taken
                }
            }
        }
        elseif ($type == 'close')
        {
            $current = & $parent[$level -1];
        }
    }
    return ($xml_array);
}
?>

Returns a well formed array like the structure of the xml-document

<root>
 <child1>
  <child1child1/>
 </child1>
</root>

create an array like
array[root][child1][child1child1]

lg
neoyahuu at yahoo dot com 12-Dec-2007 08:18
Instead of passing a URL, we can pass the XML content to this class (either you
 want to use CURL, Socks or fopen to retrieve it first) and instead of using
 array, I'm using separator '|' to identify which data to get (in order to make
 it short to retrieve a complex XML data). Here is my class with built-in fopen
 which you can pass URL or you can pass the content instead :

p/s : thanks to this great help page.

<?php

class xx_xml {

    // XML parser variables
    var $parser;
    var $name;
    var $attr;
    var $data  = array();
    var $stack = array();
    var $keys;
    var $path;

    // either you pass url atau contents.
    // Use 'url' or 'contents' for the parameter
    var $type;

    // function with the default parameter value
    function xx_xml($url='http://www.example.com', $type='url') {
        $this->type = $type;
        $this->url  = $url;
        $this->parse();
    }

    // parse XML data
    function parse()
    {
        $data = '';
        $this->parser = xml_parser_create();
        xml_set_object($this->parser, $this);
        xml_set_element_handler($this->parser, 'startXML', 'endXML');
        xml_set_character_data_handler($this->parser, 'charXML');

        xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);

        if ($this->type == 'url') {
            // if use type = 'url' now we open the XML with fopen

            if (!($fp = @fopen($this->url, 'rb'))) {
                $this->error("Cannot open {$this->url}");
            }

            while (($data = fread($fp, 8192))) {
                if (!xml_parse($this->parser, $data, feof($fp))) {
                    $this->error(sprintf('XML error at line %d column %d',
                    xml_get_current_line_number($this->parser),
                    xml_get_current_column_number($this->parser)));
                }
            }
        } else if ($this->type == 'contents') {
            // Now we can pass the contents, maybe if you want
            // to use CURL, SOCK or other method.
            $lines = explode("\n",$this->url);
            foreach ($lines as $val) {
                if (trim($val) == '')
                    continue;
                $data = $val . "\n";
                if (!xml_parse($this->parser, $data)) {
                    $this->error(sprintf('XML error at line %d column %d',
                    xml_get_current_line_number($this->parser),
                    xml_get_current_column_number($this->parser)));
                }
            }
        }
    }

    function startXML($parser, $name, $attr)    {
        $this->stack[$name] = array();
        $keys = '';
        $total = count($this->stack)-1;
        $i=0;
        foreach ($this->stack as $key => $val)    {
            if (count($this->stack) > 1) {
                if ($total == $i)
                    $keys .= $key;
                else
                    $keys .= $key . '|'; // The saparator
            }
            else
                $keys .= $key;
            $i++;
        }
        if (array_key_exists($keys, $this->data))    {
            $this->data[$keys][] = $attr;
        }    else
            $this->data[$keys] = $attr;
        $this->keys = $keys;
    }

    function endXML($parser, $name)    {
        end($this->stack);
        if (key($this->stack) == $name)
            array_pop($this->stack);
    }

    function charXML($parser, $data)    {
        if (trim($data) != '')
            $this->data[$this->keys]['data'][] = trim(str_replace("\n", '', $data));
    }

    function error($msg)    {
        echo "<div align=\"center\">
            <font color=\"red\"><b>Error: $msg</b></font>
            </div>";
        exit();
    }
}

?>

And example of retrieving XML data:
p/s: example use to retrieve weather

<?php
include_once "xx_xml.class.php";

// Im using simple curl (the original is in class) to get the contents

$pageurl = "http://xml.weather.yahoo.com/forecastrss?p=MYXX0008&u=c";
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_URL, $pageurl );
$thecontents = curl_exec ( $ch );
curl_close($ch);

// We want to pass only a ready XML content instead of URL
// But if you want to use URL , skip the curl functions above and use this
// $xx4 = new xx_xml("url here",'url');

$xx4 = new xx_xml($thecontents,'contents');
// As you can see, we use saparator '|' instead of long array
$Code = $xx4->data ['rss|channel|item|yweather:condition']['code'] ;
$Celcius = $xx4->data ['rss|channel|item|yweather:condition']['temp'] ;
$Text = $xx4->data ['rss|channel|item|yweather:condition']['text'] ;
$Cityname = $xx4->data ['rss|channel|yweather:location']['city'] ;

?>

Hope this helps.
joris dot landman at chello dot nl 28-Jul-2007 07:42
This page has been a great help! I've adapted the examples below to make a class to parse an X(HT)ML file to a multidimensional array.

Spaces, tabs, breaks, etc. are included in the array as TEXT_NODE, since in XHTML they may be functional. A function to trim them can easily be added if so desired.

I've written my class to store multiple tags with the same name. In order to do this I've used nested arrays with the key NODES to store the order in which tags and data were parsed. These NODES arrays can be used as a blueprint to reconstruct the X(HT)ML part of the document in it's entirity, including formatting. (Doctype will have to be added for validity).

<?php

class my_xml_object {

    var $xml_data; # raw xml data from file
    function parse_xml_file($my_uri) {
        $this->xml_data = null; # clear previously parsed file and related variables
        if (is_file($my_uri) && is_readable($my_uri)) { # existing and readable uri?
            $my_file = fopen($my_uri, "r");
            while($my_xml_input = fread($my_file, filesize($my_uri))) {
                $this->xml_data .= $my_xml_input; # add data to xml_data
            }
            fclose($my_file);
            $this->parse_xml_data($this->xml_data); # parse data
        } else {
            trigger_error("supplied argument is not a URI to a (readable) file", E_USER_ERROR);
        }
    }

    var $xml_array = Array(); # xml array from parsed data
    function parse_xml_data($my_data) { # adapted from class by randlem@gmail.com, tgrabietz@bupnet.de, bbellwfu@gmail.com, Kyle Bresin - see http://nl2.php.net/xml_parse
        $this->xml_array = Array(0 => Array()); # clear previously parsed file and related variables; populate first element
        $my_parser = xml_parser_create(); # set up parser
        xml_set_object($my_parser, $this); # enable parser within object
        xml_set_element_handler($my_parser, "xml_tag_open", "xml_tag_close");
        xml_set_character_data_handler($my_parser, "xml_tag_data");
        if (!xml_parse($my_parser, $my_data)) {
            trigger_error("data can not be parsed", E_USER_ERROR); # inspect problems #die(sprintf("<br />\n<b>Error</b>:  %s on line <b>%d</b><br />\n", xml_error_string(xml_get_error_code($my_parser)), xml_get_current_line_number($my_parser)));
        }
        xml_parser_free($my_parser); # free parser
        return $this->xml_array; # return xml array
    }

    var $my_branch = Array();
    function xml_tag_open($my_parser, $my_name, $my_attributes) {
        array_push($this->my_branch, $my_name); # add tag name to branch
        $this->xml_array[] = Array(); # nest array in xml array for data
        if (count($my_attributes)) {
            $this->xml_array[count($this->xml_array) - 1]["ATTRIBUTES"] = $my_attributes; # nest attributes array
        }
    }

    function xml_tag_data($my_parser, $my_data) {
        $this->xml_array[count($this->my_branch)]["TEXT_NODE"][] = $my_data; # add data to nested array
        $this->xml_array[count($this->my_branch)]["NODES"][] = "TEXT_NODE"; # add text node to nested NODES array
    }

    function xml_tag_close($my_parser, $my_name) {
        $this->xml_array[count($this->my_branch) - 1][$this->my_branch[count($this->my_branch) - 1]][] = $this->xml_array[count($this->xml_array) - 1]; # nest arrays to follow document structure
        array_pop($this->xml_array); # pop off element that was nested
        $this->xml_array[count($this->my_branch) - 1]["NODES"][] = $my_name; # add tag node to nested NODES array
        array_pop($this->my_branch); # update branch
    }

?>
dgrimes at scvl dot com 29-Jun-2007 06:14
One note about magic quotes: magic_quotes_runtime needs to be disabled before parsing XML. It can cause strange errors during parsing. Just add the following at the top of your program:

set_magic_quotes_runtime(0);

If you need magic quotes you can use stripslashes or save the current magic quotes setting with get_magic_quotes_runtime() then disable and parse your XML and then restore the previous magic quotes setting.
php at b635 dot com 23-Jun-2007 10:17
The suggestions below have been a great help, but there was one thing I really needed...

I'm parsing Amazon XML data, and I wanted to be able to index into the array using something like:

<?php
  print "<p>" . $strAXML->arrOutput[ITEMLOOKUPRESPONSE][ITEMS][ITEM][SMALLIMAGE][URL];
?>

To solve this, I had to push all of the open tags onto a separate stack, add any tag data to the tail end of an attributed multi-dimensional array, and then pop the tag name off of the stack once it was closed...

<?php

class xml2array {

  var $arrOutput = array();
  var $arrName = array();
  var $objParser;
  var $strXmlData;

  function parse($strInputXML) {

    // standard XML parse object setup

    $this->objParser = xml_parser_create ();
    xml_set_object($this->objParser,$this);
    xml_set_element_handler($this->objParser, "tagOpen", "tagClosed");

    xml_set_character_data_handler($this->objParser, "tagData");

    $this->strXmlData = xml_parse($this->objParser,$strInputXML );
    if(!$this->strXmlData) {
      die(sprintf("XML error: %s at line %d",
        xml_error_string(xml_get_error_code($this->objParser)),
        xml_get_current_line_number($this->objParser)));
    }

    xml_parser_free($this->objParser);

    return $this->arrOutput;
  }

  function tagOpen($parser, $name, $attrs) {
    // push the current tag name to an array of still-open tag names
    array_push ($this->arrName, $name);

    // merge the array of current attributes to the open tag
    // NOTE: this does not currently handle multiple attributes with the same name
    // (i.e. it will overwrite them with the last values)

    $strEval = "\$this->arrOutput";
    foreach ($this->arrName as $value) {
      $strEval .= "[" . $value . "]";
    }
    $strEval = $strEval . " = array_merge (" . $strEval . ",\$attrs);";

    eval ($strEval);
  }

  function tagData($parser, $tagData) {

    // set the latest open tag equal to the tag data

    $strEval = "\$this->arrOutput";
    foreach ($this->arrName as $value) {
      $strEval .= "[" . $value . "]";
    }

    $strEval = $strEval . " = \$tagData;";

    eval ($strEval);
  }

  function tagClosed($parser, $name) {

    // pop this tag (and any subsequent tags) off the stack of open tag names

    for ($i = count ($this->arrName) - 1; $i > 0; $i--) {
      $currName = $this->arrName[$i];
      array_pop ($this->arrName);
      if ($currName == $name) {
        break;
      }
    }
  }

}

?>
james @at@ mercstudio dot Com dot nospam 02-Apr-2006 12:10
hi,

i've modified bbellwfu at gmail dot com to as below:

features added:
  - toXML (convert back array to xml string)
  - changed name, according to macromedia flash xml concept : children -> childrens, tagdata -> nodevalue, name -> nodename,
  - added pointer firstchild to childrens[0] (if exists)

some findings that i would like to share:
 - <![cdata[my value here]]> (does not work on property value
 - xml file must be htmlentity based (if not using cdata)
 - xml line feed on node data seems to be double line feed on windows (still figuring why)
 - xml line feed on attribute value seems to be ignored...

here's my code below :)

class u007xml
{
   var $arrOutput = array();
   var $resParser;
   var $strXmlData;

    function u007xml($tfile = "")
    {
        if(trim($tfile) != "") { $this->loadFile($tfile);}
    }

    function loadFile($tfile)
    {
        $this->thefile = $tfile;

        $th = file($tfile);
        $tdata = implode("\n", $th);

        return $this->parse($tdata);
    }

   function parse($strInputXML)
   {
        $this->resParser = xml_parser_create ();
        xml_set_object($this->resParser,$this);
        xml_set_element_handler($this->resParser, "tagOpen", "tagClosed");

        xml_set_character_data_handler($this->resParser, "tagData");

        $this->strXmlData = xml_parse($this->resParser,$strInputXML );

        if(!$this->strXmlData) {
           die(sprintf("XML error: %s at line %d",
        xml_error_string(xml_get_error_code($this->resParser)),
        xml_get_current_line_number($this->resParser)));
        }

        xml_parser_free($this->resParser);

        return $this->arrOutput;
   }

   //called on each xml tree
   function tagOpen($parser, $name, $attrs) {
       $tag=array("nodename"=>$name,"attributes"=>$attrs);
       array_push($this->arrOutput,$tag);
   }

  //called on data for xml
   function tagData($parser, $tagData) {
       if(trim($tagData)) {
           if(isset($this->arrOutput[count($this->arrOutput)-1]['nodevalue'])) {
               $this->arrOutput[count($this->arrOutput)-1]['nodevalue'] .= $this->parseXMLValue($tagData);
           }
           else {
               $this->arrOutput[count($this->arrOutput)-1]['nodevalue'] = $this->parseXMLValue($tagData);
           }
       }
   }

  //called when finished parsing
   function tagClosed($parser, $name) {
       $this->arrOutput[count($this->arrOutput)-2]['childrens'][] = $this->arrOutput[count($this->arrOutput)-1];

       if(count ($this->arrOutput[count($this->arrOutput)-2]['childrens'] ) == 1)
       {
            $this->arrOutput[count($this->arrOutput)-2]['firstchild'] =& $this->arrOutput[count($this->arrOutput)-2]['childrens'][0];
       }
       array_pop($this->arrOutput);
   }

    function toArray()
    {
        //not used, we can call loadString or loadFile instead...
    }

    function parseXMLValue($tvalue)
    {
        $tvalue = htmlentities($tvalue);
        return $tvalue;
    }

    function toXML($tob = null)
    {
        //return back xml
        $result = "";

        if( $tob == null)
        {
            $tob = $this->arrOutput;
        }

        if(!isset($tob))
        {
            echo "XML Array empty...";
            return null;
        }

        for($c = 0; $c < count($tob); $c++)
        {
            $result .="<" . $tob[$c]["nodename"];

            while (list($key, $value) = each($tob[$c]["attributes"]))
            {
                $result .=" " . $key."=\"" . $this->parseXMLValue($value) . "\"";
            }

            $result .= ">";

            //assign node value
            if( isset($tob[$c]["nodevalue"]) )
            {
                $result .= $tob[$c]["nodevalue"];
            }

            if( count($tob[$c]["childrens"]) > 0 )
            {
                $result .= "\r\n" . $this->toXML(&$tob[$c]["childrens"]) . "";
            }

            $result .= "</" . $tob[$c]["nodename"] . ">\r\n";

        }//end of each array...

        return $result;
    }

    function displayXML()
    {
        print_r($this->arrOutput);
    }

    function getXML($tob = null)
    {
        return "<?xml version='1.0'?>\r\n" . $this->toXML($tob);
    }

}//end of u007xml class

//examples below:

$xx = new u007xml();
$xx->loadFile("xml3.xml");

//$xx->displayXML();

print $xx->getXML();
ben at autonomic dot net 16-Mar-2006 05:12
bbellwfu's code does not handle 'text nodes' properly.
Consider the innards of a tag like <root>xxx<tag2/>yyy</root>
The 'tagData' for root will be "xxxyyy" and you have lost all information about where "tag2" was in that sequence.

Quick and dirty hack.

Replace tagData with this code :
   function tagData($parser, $tagData) {
          $last_element=count($this->arrOutput)-1;
        $this->arrOutput[$last_element]['children'][] = array("textnode",$tagData);
   }

What this does is adds 'textnodes' as children of its containing parent, *in the right sequence* (rather like the internet browsers do it). This then lets you do some more sensible secondary work like recursively looking up internal references within the document...
Kyle Bresin 19-Jan-2006 03:15
Just wanted to note a small bug in bbellwfu's class (which is really great btw).

It fails to capture any datums which are equal to numerical zero.

The problem lies in the function tagData, the first if statement should be:

if(trim($tagData) != '') {
tim at alloutinteraction dot com 01-Oct-2005 07:29
I wanted to create a really simple XML parser, but I found the array management in xml_parse a bit daunting. So I flattened my XML and parsed it using string matching. It wouldn't be difficult to add xml depth (of 2 plus levels) by modifying the parsedXML array.

<?
// here's the raw html
$xmlRaw="<order>Order data</order><label>Label data</label><control>123</control>";
// here are the xml field names
$xmlFieldNames=array("order", "label", "control");
// for each xml field...
foreach ($xmlFieldNames as $xmlField) {
    if(strpos($xmlRaw,$xmlField)!==false){
        // I've broken 1 single line into 4 for display purposes
        $parsedXML[$xmlField]=substr($xmlRaw,
        strpos($xmlRaw,"<$xmlField>")+strlen("<$xmlField>"),
        strpos($xmlRaw,"</$xmlField>")-strlen("<$xmlField>")
        -strpos($xmlRaw,"<$xmlField>"));
    }
}
print_r($parsedXML);
// prints: Array ( [order] => Order data [label] => Label data [control] => 123 )

?>

Hope you find this useful (coded it while ill in bed with streaming cold, but felt much better afterwards!)

Tim (a lazy coder)
bbellwfu at gmail dot com 05-May-2005 02:51
Just improving a little bit on the code examples from tgrabietz and randlem below... everything in one pretty class, plus some checks in place so that the element data doesnt get split up (thanks to flobee on the xml_set_character_data_handler page)

<?php

/* Usage
 Grab some XML data, either from a file, URL, etc. however you want. Assume storage in $strYourXML;

 $objXML = new xml2Array();
 $arrOutput = $objXML->parse($strYourXML);
 print_r($arrOutput); //print it out, or do whatever!

*/
class xml2Array {

    var $arrOutput = array();
    var $resParser;
    var $strXmlData;

    function parse($strInputXML) {

            $this->resParser = xml_parser_create ();
            xml_set_object($this->resParser,$this);
            xml_set_element_handler($this->resParser, "tagOpen", "tagClosed");

            xml_set_character_data_handler($this->resParser, "tagData");

            $this->strXmlData = xml_parse($this->resParser,$strInputXML );
            if(!$this->strXmlData) {
               die(sprintf("XML error: %s at line %d",
            xml_error_string(xml_get_error_code($this->resParser)),
            xml_get_current_line_number($this->resParser)));
            }

            xml_parser_free($this->resParser);

            return $this->arrOutput;
    }
    function tagOpen($parser, $name, $attrs) {
       $tag=array("name"=>$name,"attrs"=>$attrs);
       array_push($this->arrOutput,$tag);
    }

    function tagData($parser, $tagData) {
       if(trim($tagData)) {
            if(isset($this->arrOutput[count($this->arrOutput)-1]['tagData'])) {
                $this->arrOutput[count($this->arrOutput)-1]['tagData'] .= $tagData;
            }
            else {
                $this->arrOutput[count($this->arrOutput)-1]['tagData'] = $tagData;
            }
       }
    }

    function tagClosed($parser, $name) {
       $this->arrOutput[count($this->arrOutput)-2]['children'][] = $this->arrOutput[count($this->arrOutput)-1];
       array_pop($this->arrOutput);
    }
}
?>

Will output something like...

<snippet>
Array
(
    [0] => Array
        (
            [name] => GETMESSAGESRESPONSE
            [attrs] => Array
                (
                )

            [children] => Array
                (
                    [0] => Array
                        (
                            [name] => STATUS
                            [attrs] => Array
                                (
                                )

                        )

</snippet>
alex dot garcia at noos dot fr 14-Mar-2005 01:47
Here is the inverse function which takes parsed xml array in entry and outputs xml string

enjoy !

function getXmlFromArray($root){

        if(count($root) > 0){

            $curr_name = $root['name'];
            $attribs = $root['attrs'];
            $curr_childs = $root['children'];
            $curr_data = $root['cdata'];

            $xml .= '<'.$curr_name;

            if(count($attribs) > 0){
                $i = 1;
                foreach($attribs as $key => $value){
                    $curr_attribs .= $key.'="'.$value.'"';
                    $i++;
                    if($i <= count($attribs)){
                        $curr_attribs .= ' ';
                    }
                }
                $xml .= ' '.$curr_attribs;
            }

            if($curr_data != ''){
                $xml .= '><![CDATA['.$curr_data.']]></'.$curr_name.'>';
            } else {
                if(count($curr_childs) > 0){
                    $xml .= '>';
                    foreach($curr_childs as $child){
                        $xml .= getXmlFromArray($child);
                    }
                    $xml .= '</'.$curr_name.'>';
                } else {
                    $xml .= '/>';
                }
            }

        }
        return $xml;
    }
tgrabietz at bupnet dot de 22-Sep-2004 08:05
it's like randlem at gmail dot com's great code, without using a "class container" but parsing cdata. The script returns the tree-structure in a single array.

<?php
$file = 'simple.xml';
$stack = array();

function startTag($parser, $name, $attrs)
{
   global $stack;
   $tag=array("name"=>$name,"attrs"=>$attrs);
   array_push($stack,$tag);

}

function cdata($parser, $cdata)
{
    global $stack,$i;

    if(trim($cdata))
    {
        $stack[count($stack)-1]['cdata']=$cdata;
    }
}

function endTag($parser, $name)
{
   global $stack;
   $stack[count($stack)-2]['children'][] = $stack[count($stack)-1];
   array_pop($stack);
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startTag", "endTag");
xml_set_character_data_handler($xml_parser, "cdata");

$data = xml_parse($xml_parser,file_get_contents($file));
if(!$data) {
   die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}

xml_parser_free($xml_parser);

print("<pre>\n");
print_r($stack);
print("</pre>\n");
?>
ByK 16-Sep-2004 08:12
modified from yours code. I think it's work!!.
class CXml
{
    var $xml_data;
    var $obj_data;
    var $pointer;

    function CXml() { }

    function Set_xml_data( &$xml_data )
    {
        $this->index = 0;
        $this->pointer[] = &$this->obj_data;

        //strip white space between tags
        $this->xml_data = eregi_replace(">"."[[:space:]]+"."<","><",$xml_data);
        $this->xml_parser = xml_parser_create( "UTF-8" );

        xml_parser_set_option( $this->xml_parser, XML_OPTION_CASE_FOLDING, false );
        xml_set_object( $this->xml_parser, &$this );
        xml_set_element_handler( $this->xml_parser, "_startElement", "_endElement");
        xml_set_character_data_handler( $this->xml_parser, "_cData" );

        xml_parse( $this->xml_parser, $this->xml_data, true );
        xml_parser_free( $this->xml_parser );
    }

    function _startElement( $parser, $tag, $attributeList )
    {
        foreach( $attributeList as $name => $value )
        {
            $value = $this->_cleanString( $value );
            $object->$name = $value;
        }
        //replaces the special characters with the underscore (_) in tag name
        $tag = preg_replace("/[:\-\. ]/", "_", $tag);
        eval( "\$this->pointer[\$this->index]->" . $tag . "[] = \$object;" );
        eval( "\$size = sizeof( \$this->pointer[\$this->index]->" . $tag . " );" );
        eval( "\$this->pointer[] = &\$this->pointer[\$this->index]->" . $tag . "[\$size-1];" );

        $this->index++;
    }

    function _endElement( $parser, $tag )
    {
        array_pop( $this->pointer );
        $this->index--;
    }

    function _cData( $parser, $data )
    {
        if (empty($this->pointer[$this->index])) {
            if (rtrim($data, "\n"))
                $this->pointer[$this->index] = $data;
        } else {
            $this->pointer[$this->index] .= $data;
        }
    }

    function _cleanString( $string )
    {
        return utf8_decode( trim( $string ) );
    }
}

$m_xml = new CXml();
$xml_data = file_get_contents( $filename );

$m_xml->Set_XML_data( $xml_data );

$newsid = $m_xml->obj_data->root[0]->NewsID[0];
randlem at gmail dot com 15-Sep-2004 08:43
Here's a handy way to generate a tree that can be can be decended easily.

<?php
$file = 'xmltest.xml';

$tag_tree = array();
$stack = array();

class tag {
    var $name;
    var $attrs;
    var $children;
    function tag($name, $attrs, $children) {
        $this->name = $name;
        $this->attrs = $attrs;
        $this->children = $children;
    }
}

function startTag($parser, $name, $attrs) {
    global $tag_tree, $stack;
    $tag = new tag($name,$attrs,'');
    array_push($stack,$tag);
}

function endTag($parser, $name) {
    global $stack;
    $stack[count($stack)-2]->children[] = $stack[count($stack)-1];
    array_pop($stack);
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startTag", "endTag");

$data = xml_parse($xml_parser,file_get_contents($file));
if(!$data) {
    die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}

xml_parser_free($xml_parser);

print("\n");
print_r($stack);
print("\n");
?>
michelek 26-Oct-2003 10:42
its maybe not better, but me thinks its more stright-forward

--INPUT:

<?xml version="1.0" encoding="UTF-8"?>
<world>
    <country name="sweden">
        <city name="stockholm">
            <user>Adam</user>
            <user>Eva</user>
        </city>
        <city name="g?teborg">
            <user>God</user>
        </city>
    </country>
    <country name="usa">
        <city name="new york">
            <user>Clinton</user>
            <user>Bush</user>
        </city>
    </country>
</world>

--CODE:
<?
/**
 * m_i_h_k_e_l_AT_w_w_DOT_e_e
 * 26.10.2003
**/
$filename = "m.m.xml";
$xmlC = new XmlC();
$xml_data = file_get_contents( $filename );

$xmlC->Set_XML_data( $xml_data );

echo( "<pre>\n" );
print_r( $xmlC->obj_data );
echo( "</pre>\n" );

class XmlC
{
  var $xml_data;
  var $obj_data;
  var $pointer;

  function XmlC()
  {
  }

  function Set_xml_data( &$xml_data )
  {
    $this->index = 0;
    $this->pointer[] = &$this->obj_data;

    $this->xml_data = $xml_data;
    $this->xml_parser = xml_parser_create( "UTF-8" );

    xml_parser_set_option( $this->xml_parser, XML_OPTION_CASE_FOLDING, false );
    xml_set_object( $this->xml_parser, &$this );
    xml_set_element_handler( $this->xml_parser, "_startElement", "_endElement");
    xml_set_character_data_handler( $this->xml_parser, "_cData" );

    xml_parse( $this->xml_parser, $this->xml_data, true );
    xml_parser_free( $this->xml_parser );
  }

  function _startElement( $parser, $tag, $attributeList )
  {
    foreach( $attributeList as $name => $value )
    {
      $value = $this->_cleanString( $value );
      $object->$name = $value;
    }
    eval( "\$this->pointer[\$this->index]->" . $tag . "[] = \$object;" );
    eval( "\$size = sizeof( \$this->pointer[\$this->index]->" . $tag . " );" );
    eval( "\$this->pointer[] = &\$this->pointer[\$this->index]->" . $tag . "[\$size-1];" );

    $this->index++;
  }

  function _endElement( $parser, $tag )
  {
    array_pop( $this->pointer );
    $this->index--;
  }

  function _cData( $parser, $data )
  {
    if( trim( $data ) )
    {
      $this->pointer[$this->index] = trim( $data );
    }
  }

  function _cleanString( $string )
  {
    return utf8_decode( trim( $string ) );
  }

}
?>
Adam Tylmad 11-Sep-2003 01:11
I've created a parser that returns an
object based on a xml document.

example:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<country name="sweden">
    <city name="stockholm">
        <user>Adam</user>
        <user>Eve</user>
    </city>
    <city name="g?teborg">
        <user>God</user>
    </city>
</country>
<country name="usa">
    <city name="new york">
        <user>Clinton</user>
        <user>Bush</user>
    </city>
</country>

generates the following object structure:
[country] => Array
(
    [0] => stdClass Object
        (
            [name] => sweden
            [city] => Array
                (
                    [0] => stdClass Object
                        (
                            [name] => stockholm
                            [user] => Array
                                (
                                    [0] => Adam
                                    [1] => Eve
                                )
                        )
                    [1] => stdClass Object
                        (
                            [name] => g?teborg
                            [user] => God
                        )
                )
        )
    [1] => stdClass Object
        (
            [name] => usa
            [city] => stdClass
                (
                    [name] => new york
                    [user] => Array
                        (
                            [0] => Clinton
                            [1] => Bush
                        )
                )
        )
)

Here is the code:

class XMLParser {
    var $path;
    var $result;

    function XMLParser($encoding, $data) {
        $this->path = "\$this->result";
        $this->index = 0;

        $xml_parser = xml_parser_create($encoding);
        xml_set_object($xml_parser, &$this);
        xml_set_element_handler($xml_parser, 'startElement', 'endElement');
        xml_set_character_data_handler($xml_parser, 'characterData');

        xml_parse($xml_parser, $data, true);
        xml_parser_free($xml_parser);
    }

        function startElement($parser, $tag, $attributeList) {
            eval("\$vars = get_object_vars(".$this->path.");");
            $this->path .= "->".$tag;
            if ($vars and array_key_exists($tag, $vars)) {
                 eval("\$data = ".$this->path.";");
                     if (is_array($data)) {
                           $index = sizeof($data);
                           $this->path .= "[".$index."]";
                     } else if (is_object($data)) {
                           eval($this->path." = array(".$this->path.");");
                           $this->path .= "[1]";
                     }
            }
            eval($this->path." = null;");

            foreach($attributeList as $name => $value)
                eval($this->path."->".$name. " = '".XMLParser::cleanString($value)."';");
        }

    function endElement($parser, $tag) {
        $this->path = substr($this->path, 0, strrpos($this->path, "->"));
    }

    function characterData($parser, $data) {
        eval($this->path." = '".trim($data)."';");
    }
}

enjoy! And please make it better if you can ;-)


Crée un analyseur XML

  • « xml_parse
  • xml_parser_create »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Crée un analyseur XML

xml_parser_create_ns

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

xml_parser_create_ns — Crée un analyseur XML

Description

xml_parser_create_ns ( string|null $encoding = null , string $separator = ":" ) : XMLParser

xml_parser_create_ns() crée un nouvel analyseur XML avec le support des espaces de noms, et retourne une instance de XMLParser à utiliser avec les autres fonctions XML.

Liste de paramètres

encoding

Ce jeu de caractères est automatiquement détecté et, donc, le paramètre encoding ne spécifie plus que la sortie. En PHP 5.0.0 et PHP 5.0.1, le jeu de caractères d'entrée par défaut est ISO-8859-1, tandis qu'en PHP 5.0.2 et suivant, il vaut UTF-8. Les jeux de caractères supportés sont ISO-8859-1, UTF-8 et US-ASCII.

separator

Avec un analyseur qui supporte les espaces de noms, les balises qui sont passées aux différentes fonctions de gestion seront constituées du nom de l'espace et du nom de balise, séparé par la chaîne seperator.

Valeurs de retour

Retourne une nouvelle instance de XMLParser.

Historique

Version | Description
8.0.0 | Cette fonction retourne désormais une instance de XMLParser; auparavant, une resource était retournée, ou false si une erreur survient.
8.0.0 | encoding est désormais nullable.

Voir aussi

  • xml_parser_create() - Création d'un analyseur XML
  • xml_parser_free() - Détruit un analyseur XML

User Contributed Notes

bishop at php dot net 17-Feb-2019 04:24
Internals has proposed[1] changing this extension from resource-based to object-based. When this change is made, xml_parser_create_ns will return an object, not a resource. Application developers are encouraged to replace any checks for explicit success, like:

<?php
$res = xml_parser_create_ns(/*...*/);
if (! is_resource($res)) {
    // ...
}
?>

With a check for explicit failure:
<?php
$res = xml_parser_create_ns(/*...*/);
if (false === $res) {
    // ...
}

[1]: https://marc.info/?l=php-internals&m=154998365013373&w=2
jonnyNO at SPAM dot sanriowasteland dot net 11-Jun-2002 05:49
This is from the Expat Function Reference by Clark Cooper, which is a reference to the C api.

"XML_Parser XML_ParserCreateNS(const XML_Char*encoding, XML_Char sep)
Constructs a new parser that has namespace processing in effect. Namespace expanded element names and attribute names are returned as a concatenation of the namespace URI, sep, and the local part of the name. This means that you should pick a character for sep that can't be part of a legal URI."

(from http://www.xml.com/pub/a/1999/09/expat/reference.html)

So thats what this function is for.  Now you know.


Création d'un analyseur XML

  • « xml_parser_create_ns
  • xml_parser_free »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Création d'un analyseur XML

xml_parser_create

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parser_create — Création d'un analyseur XML

Description

xml_parser_create ( string|null $encoding = null ) : XMLParser

xml_parser_create() crée un analyseur XML et retourne une instance de XMLParser à utiliser avec les autres fonctions XML.

Liste de paramètres

encoding

Le paramètre optionnel encoding spécifie le jeu de caractères d'encodage pour l'entrée/sortie dans PHP 4. Depuis PHP 5, ce jeu de caractères est automatiquement détecté et, donc, le paramètre encoding ne spécifie plus que la sortie. En PHP 4, le jeu de caractères de sortie par défaut est le même que celui d'entrée. Si une chaîne vide est passée, l'analyseur tente d'identifier quel jeu de caractère a été utilisé pour encoder le document en regardant les 3 ou 4 octets du haut. En PHP 5.0.0 et PHP 5.0.1, le jeu de caractères d'entrée par défaut est ISO-8859-1, tandis qu'en PHP 5.0.2 et suivant, il vaut UTF-8. Les jeux de caractères supportés sont ISO-8859-1, UTF-8 et US-ASCII.

Valeurs de retour

Retourne une nouvelle instance de XMLParser.

Historique

Version | Description
8.0.0 | Cette fonction retourne désormais une instance de XMLParser; auparavant, une resource était retournée, ou false si une erreur survient.
8.0.0 | encoding est désormais nullable.

Voir aussi

  • xml_parser_create_ns() - Crée un analyseur XML
  • xml_parser_free() - Détruit un analyseur XML

User Contributed Notes

bishop at php dot net 17-Feb-2019 04:23
Internals has proposed[1] changing this extension from resource-based to object-based. When this change is made, xml_parser_create will return an object, not a resource. Application developers are encouraged to replace any checks for explicit success, like:

<?php
$res = xml_parser_create(/*...*/);
if (! is_resource($res)) {
    // ...
}
?>

With a check for explicit failure:
<?php
$res = xml_parser_create(/*...*/);
if (false === $res) {
    // ...
}

[1]: https://marc.info/?l=php-internals&m=154998365013373&w=2
marek995 at seznam dot cz 24-Sep-2010 11:46
I created a function, which combines xml_paresr_create and all functions around.

<?php
function html_parse($file)
     {
      $array = str_split($file, 1);
      $count = false;
      $text = "";
      $end = false;
      foreach($array as $temp)
       {
        switch($temp)
         {
          case "<":
           between($text);
           $text = "";
           $count = true;
           $end = false;
           break;
          case ">":
           if($end == true) {end_tag($text);}
           else {start_tag($text);}
           $text = "";
           break;
          case "/":
           if($count == true) {$end = true;}
           else {$text = $text . "/";}
           break;
          default:
           $count = false;
           $text = $text . $temp;
         }
       }
     }
?>
The input value is a string.
It calls functions start_tag() , between() and end_tag() just like the original xml parser.

But it has a few differences:
  - It does NOT check the code. Just resends values to that three functions, no matter, if they are right
  - It works with parameters. For example: from tag <sth b="42"> sends sth b="42"
  - It works wit diacritics. The original parser sometimes wrapped the text before the first diacritics appearance.
  - Works with all encoding. If the input is UTF-8, the output will be UTF-8 too
  - It works with strings. Not with file pointers.
  - No "Reserved XML name" error
  - No doctype needed
  - It does not work with commentaries, notes, programming instructions etc. Just the tags

definition of the handling functions is:

<?php
function between($stuff) {}
?>

No other attributes
juanhdv at NOSPAM dot divvol dot org 05-Dec-2007 12:08
In PHP 5, when including in your xml file the definition '<?xml version="1.0" encoding="ISO-8859-1" ?>',   I'd also recommend adding the option below:

xml_parser_set_option($xml_parser,XML_OPTION_TARGET_ENCODING, "ISO-8859-1").

It works fine!

If your enconding is 'UTF-8', just replace 'ISO-8859-1'.
19-Apr-2006 07:42
I'd also recommend adding the option below
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
Tobbe 25-May-2005 06:01
The above "XML to array" code does not work properly if you have several tags on the same level and with the same name, example:

<currenterrors>
<error>
<description>This is a real error...</description>
</error>
<error>
<description>This is a second error...</description>
</error>
<error>
<description>Lots of errors today...</description>
</error>
<error>
<description>This is the last error...</description>
</error>
</currenterrors>

It will then only display the first <error>-tag.
In this case you will need to number the tags automatically or maybe have several arrays for each new element.
php at stock-consulting dot com 21-Feb-2005 02:47
Even though I passed "UTF-8" as encoding type PHP (Version 4.3.3) did *not* treat the input file as UTF-8. The input file was missing the BOM header bytes (which may indeed be omitted, according to RFC3629...but things are a bit unclear there. The RFC seems to make mere recommendations concering the BOM header). If you want to sure that PHP treats an UTF-8 encoded file correctly, make sure that it begins with the corresponding 3 byte BOM header (0xEF 0xBB 0xBF)
jcalvert at gmx dot net 03-Apr-2004 10:39
To maintain compatibility between PHP4 and PHP5 you should always pass a string argument to this function. PHP4 autodetects the format of the input if you leave it out whereas PHP5 will assume the format to be ISO-8859-1 (and choke on the byte order marker of UTF-8 files).

Calling the function as <?php $res = xml_parser_create('') ?> will cause both versions of PHP to autodetect the format.


Détruit un analyseur XML

  • « xml_parser_create
  • xml_parser_get_option »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Détruit un analyseur XML

xml_parser_free

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parser_free — Détruit un analyseur XML

Description

xml_parser_free ( XMLParser $parser ) : bool

Détruit l'analyseur XML parser.

Attention

Antérieur à PHP 8.0.0, en plus d'appeler la fonction xml_parser_free() à la fin de l'analyse, il était nécessaire de supprimer explicitement la référence au paramètre parser pour éviter les fuites mémoires, si la ressource analysé est référencé depuis un objet, et cet objet fait référence à la ressource analysé.

Liste de paramètres

parser
Une référence sur un analyseur XML.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

User Contributed Notes

nidzho 27-Aug-2016 08:12
Unset the parser after calling xml_parser_free() to prevent memory leaks:

<?php
xml_parser_free($parser);
unset($parser);
?>
dio at edu dot uni-klu dot ac dot at 01-Oct-2005 09:56
If you try to free an XML parser while it is still parsing, strange things will happen - your script will "hang" and no output will be sent to the browser. Consider this pseudo-code example:

-------

...
if (!xml_parse($parser)) echo 'XML error';

xml_parser_free($parser);

...

function SomeCallbackWhichWasSetBefore(...)
{
global $parser;

...

if (some_error_happened) xml_parser_free($parser);  //problem!

...

}

------

It would be logical that xml_parse would return false if the parser was freed while parsing, right? Wrong! Instead, everything hangs and no output will be sent out (no matter whether output buffering is on or not). It took me more than an hour to figure out why: you cannot free a parser handle that is currently parsing. A simple solution:

-------

$xml_error = false;
if (!xml_parse($parser))
echo 'XML error (directly from parser)';
else if ($xml_error)
echo 'XML error (from some callback function);

xml_parser_free($parser);

...

function SomeCallbackWhichWasSetBefore(...)
{
global $parser;
global $xml_error;

if ($xml_error)
return;

...

if (some_error_occured)
{
$xml_error = false;
return;
}

...

}

-------

If you use this solution you will have to check for $xml_error in every callback function. Essentially what you're doing is that, in case you want to stop parsing because of an error, you continue until xml_parse() is finished (without actually doing anything) and then free the parser and act on the error.

Of course the underlying problem is that you cannot stop a parser while it is parsing. There should be some function like xml_throw_error() or xml_parser_stop() or whatever, but unfortunately there isn't.
php dot net at gwprogramming dot com (George Webb) 30-Oct-2003 06:56
I found that with PHP 4.3.4RC1, if you don't call xml_parser_free() before your script ends, some sort of ugliness occurs with the webserver; i.e. the HTTP connection is closed.  (The apache error_log says "exit signal Segmentation fault (11)".)

Usually PHP tends to clean up connections you don't explicitly close (e.g. database connections), but in this case apparently it doesn't.

Some web browsers (MSIE for one) do not actually show this problem, so you may not actually notice it.  Opera 7.11 does show it, which is how I discovered it.

So don't forget to call xml_parser_free() ... always!


Lit les options d'un analyseur XML

  • « xml_parser_free
  • xml_parser_set_option »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Lit les options d'un analyseur XML

xml_parser_get_option

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parser_get_option — Lit les options d'un analyseur XML

Description

xml_parser_get_option ( XMLParser $parser , int $option ) : string|int

Lit les options d'un analyseur XML.

Liste de paramètres

parser
Une référence sur un analyseur XML valide.
option
L'option demandée. XML_OPTION_CASE_FOLDING, XML_OPTION_SKIP_TAGSTART, XML_OPTION_SKIP_WHITE et XML_OPTION_TARGET_ENCODING sont disponibles. Reportez-vous à xml_parser_set_option() pour leurs descriptions.

Valeurs de retour

xml_parser_get_option() retourne false si parser n'est pas un analyseur valide ou si option n'est pas valide (génère aussi un E_WARNING). Sinon, elle retourne la valeur de l'option demandée.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
7.1.24, 7.2.12, 7.3.0 | options supporte désormais XML_OPTION_SKIP_TAGSTART et XML_OPTION_SKIP_WHITE.

User Contributed Notes

dnricky at hotmail dot com 24-Jun-2017 04:57
<?php
$xmlparser = xml_parser_create();

echo "XML_OPTION_CASE_FOLDING:" . xml_parser_get_option($xmlparser, XML_OPTION_CASE_FOLDING) . "<br />"; //Specifies if case-folding is enabled. Enabled by default. Can be 1 (TRUE) or 0 (FALSE)

echo "XML_OPTION_TARGET_ENCODING:" . xml_parser_get_option($xmlparser, XML_OPTION_TARGET_ENCODING ) . "<br />"; //Specifies which target encoding to use in this XML parser. By default, it is set to the same as the xml_parser_create() function. Supported target encodings are ISO-8859-1, US-ASCII and UTF-8.

xml_parser_free($xmlparser);
?>


Affecte les options d'un analyseur XML

  • « xml_parser_get_option
  • xml_set_character_data_handler »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Affecte les options d'un analyseur XML

xml_parser_set_option

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_parser_set_option — Affecte les options d'un analyseur XML

Description

xml_parser_set_option ( XMLParser $parser , int $option , string|int $value ) : bool

Affecte les options d'un analyseur XML.

Liste de paramètres

parser

Une référence vers un analyseur XML.

option

L'option à modifier. Voir ci-dessous.

Les options suivantes sont disponibles :

Options de l'analyseur XML
Option | Type de données | Description
XML_OPTION_CASE_FOLDING | entier | Contrôle la gestion de la casse des balises de cet analyseur XML. Par défaut, activé.
XML_OPTION_SKIP_TAGSTART | entier | Spécifie combien de caractères doivent être éludés du début du nom de la balise.
XML_OPTION_SKIP_WHITE | entier | Élude ou non les valeurs contenant des caractères blancs.
XML_OPTION_TARGET_ENCODING | string | Modifie le codage à la cible utilisé par cet analyseur XML. Par défaut, c'est celui qui a été spécifié lors de l'appel de xml_parser_create(). Les codages supportés sont ISO-8859-1, US-ASCII et UTF-8.

value

La nouvelle valeur de l'option.

Valeurs de retour

Retourne false si parser n'est pas une référence valide sur un analyseur XML, ou si l'option n'a pas pu être modifiée. Sinon, l'option est effectivement modifiée, et la fonction retourne true.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

User Contributed Notes

www.thomaskoch.it 31-Jul-2008 02:22
The option XML_OPTION_SKIP_WHITE has no effect in my PHP 5.2.6 (with expat-1.95.8-5). To skip cdata composed of white space only, simply check for that at the beginning of your cdata callback function:

<?php
function callback_cdata($parser, $cdata)
{
 if(!trim($cdata))
  return;

 // ... continue processing ...
}
?>
j[no_spam_please] at [thx]jessepearson dot net 08-Mar-2007 08:08
In the function below, you need to update two lines if you don't want php to throw warnings.

change these two:
           $elements[$index]['attributes'] = $tag['attributes'];
           $elements[$index]['content'] = $tag['value'];

to this:
      $elements[$index]['attributes'] = empty($tag['attributes']) ? "" : $tag['attributes'];
      $elements[$index]['content']    = empty($tag['value']) ? "" : $tag['value'];
06-Sep-2006 07:56
A little mod to a function posted here...

function xml_to_array( $file )
{
    $parser = xml_parser_create();
    xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, 0 );
    xml_parser_set_option( $parser, XML_OPTION_SKIP_WHITE, 1 );
    xml_parse_into_struct( $parser, file_get_contents($file), $tags );
    xml_parser_free( $parser );

    $elements = array();
    $stack = array();
    foreach ( $tags as $tag )
    {
        $index = count( $elements );
        if ( $tag['type'] == "complete" || $tag['type'] == "open" )
        {
            $elements[$index] = array();
            $elements[$index]['name'] = $tag['tag'];
            $elements[$index]['attributes'] = $tag['attributes'];
            $elements[$index]['content'] = $tag['value'];

            if ( $tag['type'] == "open" )
            {    # push
                $elements[$index]['children'] = array();
                $stack[count($stack)] = &$elements;
                $elements = &$elements[$index]['children'];
            }
        }

        if ( $tag['type'] == "close" )
        {    # pop
            $elements = &$stack[count($stack) - 1];
            unset($stack[count($stack) - 1]);
        }
    }
    return $elements[0];
}
ksavage at achaean dot com 28-Mar-2005 01:25
Had one heck of a time getting curl to send my XML request.  Tried a lot of different things, FINALLY ended up with this.

Im making a curl request to paymentech / Orbital 's payment gateway.   Essentially, I took the same header i made for the fsockopen() request, and used it for this curl request. (Hostinc company didnt allow fsockopen().

You'll note that this specific gateway requires a custom content type header.  Thats what gave me the most trouble.  When using the CURLOPT_HTTPHEADER, and CURLOPT_POSTFIELDS together, it doesnt matter, it sends the default post header because of CURLOPT_POSTFIELDS.

<?php

$url = "https://example.com";
$page = "/proccessing_page.cgi";

$post_string = "<YourXML>All XML stuff Here</YourXML>";

       $header  = "POST ".$page." HTTP/1.0 \r\n";
        $header .= "MIME-Version: 1.0 \r\n";
        $header .= "Content-type: application/PTI26 \r\n";
        $header .= "Content-length: ".strlen($post_string)." \r\n";
        $header .= "Content-transfer-encoding: text \r\n";
        $header .= "Request-number: 1 \r\n";
        $header .= "Document-type: Request \r\n";
        $header .= "Interface-Version: Test 1.4 \r\n";
        $header .= "Connection: close \r\n\r\n";
        $header .= $post_string;

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 4);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);

        $data = curl_exec($ch);         if (curl_errno($ch)) {
           print curl_error($ch);
        } else {
           curl_close($ch);
        }

// use XML Parser on $data, and your set!

        $xml_parser = xml_parser_create();
        xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
        xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1);
        xml_parse_into_struct($xml_parser, $data, $vals, $index);
        xml_parser_free($xml_parser);

// $vals = array of XML tags.  Go get em!

?>

Worked like a dream for me.  Enjoy!
matt at mcbridematt dot dhs dot org 16-Dec-2002 05:56
Re: anony at mous dot com
case folding is a violation of the XHTML specification. xhtml is all in lowercase to be inline with the DOM
pupeno at pupeno dot com 16-Nov-2002 01:14
XML is case sensitive, then, from my point of view, disabling case folding doesn't goes against xml 1.0 specifications but the contrary, disabling case folding allow us to distiguish between diferent cases of the same letter ('a' and 'A') which of XML are two diferent things.
From my point of view, disabling case folding is a good practice and I think it should be disabled by default.
More information on:
http://www.isacat.net/2001/xml/case.htm
and
http://www.w3.org/TR/REC-xml
Thank you.
ta at NOSPAM dot magicsquare dot info 09-Jul-2002 04:52
XML_OPTION_SKIP_WHITE works for me (linux, php 4.2.1)

phpinfo says :

XML Support active
XML Namespace Support active
EXPAT Version expat_1.95.2

i guess it depends on expat version/presence
chris at wildcharacters dot com 21-Oct-2001 07:32
The two 'skip' tags are not available to windows users using PHP 4.0.4.  The following:

$skipWhite = xml_parser_get_option ($xmlParser,XML_OPTION_SKIP_WHITE);
$skipTagStart = xml_parser_get_option ($xmlParser,XML_OPTION_SKIP_TAGSTART);

generates the following errors:
Warning: xml_parser_get_option: unknown option in c:/program files/abria merlin/apache/htdocs/xml/sax_test.php on line 230
anony at mous dot com 20-Apr-2000 05:26
Disable case folding or your code will be violating the XML 1.0 specification.


Affecte les gestionnaires de texte littéral

  • « xml_parser_set_option
  • xml_set_default_handler »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Affecte les gestionnaires de texte littéral

xml_set_character_data_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_character_data_handler — Affecte les gestionnaires de texte littéral

Description

xml_set_character_data_handler ( XMLParser $parser , callable $handler ) : bool

Affecte les gestionnaires de début et de fin de l'analyseur XML parser.

Liste de paramètres

parser

Une référence à un analyseur XML à définir comme fonction gérant les données.

handler

handler est une chaîne qui contient le nom d'une fonction qui existe lorsque xml_parse() est appelé pour créer parser.

La fonction handler doit accepter deux paramètres :

handler ( XMLParser $parser , string $data )
parser
Le premier paramètre, parser, est une référence sur l'analyseur XML qui appelle cette fonction.
data
Le second paramètre, data, contient les caractères sous la forme d'une chaîne.

Le gestionnaire des données est appelé pour chaque pièce du texte d'un document XML. Il peut être appelé plusieurs fois dans chaque fragment (e.g. pour les chaînes non-ASCII).

Si un gestionnaire reçoit une chaîne vide ou false, c'est qu'il est désactivé.

Note: À la place d'un nom de fonction, un tableau contenant une référence d'objet et un nom de méthode peut aussi être utilisé.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

User Contributed Notes

svanegmond at tinyplanet dot ca 08-Oct-2010 12:06
For those who are having their character entities eaten by this function (e.g. &amp; &lt; and so forth):

You will notice that your callback gets called several times.

input: Give me some beans &amp; rice. &#032;

call 1: Give me some beans
call 2: amp; and rice
call 3: #032;

There is an obvious workaround. This is not perfect:

<?php
        $text = preg_replace('/^([a-z]+;)/','&\1', $text);
        $text = preg_replace('/^(#[0-9]+;)/', '&\1', $text);
?>
jhill at live dot com 28-Aug-2008 07:11
To detect that concatenation of data is taking place, you can keep track of whether the last function call was to the data processing function.
e.g. using $this->inside_data variable below:

<?php
xml_set_element_handler($this->parser, "start_tag", "end_tag");
xml_set_character_data_handler($this->parser, "contents");

protected function contents($parser, $data)
{
    switch ($this->current_tag) {
            case "name":
                if ($this->inside_data)
                    $this->name .= $data; // need to concatenate data
                else
                    $this->name = $data;
                break;
         ...
    }
    $this->inside_data = true;
}

protected function start_tag($parser, $name)
{
    $this->current_tag = $name;
    $this->inside_data = false;
}

protected function end_tag() {
    $this->current_tag = '';
    $this->inside_data = false;
}
?>
unspammable-iain at iaindooley dot com 03-Jan-2006 01:41
re: jason at omegavortex dot com below, another way to deal with whitespace issues is:

        function charData($parser,$data)
        {
            $char_data = trim($data);

            if($char_data)
                $char_data = preg_replace('/  */',' ',$data);

            $this->cdata .= $char_data;
        }

This means that:

    <p>here is my text <a href="something">my text</a>
    and here is some more after some spaces at the
    beginning of the line</p>

comes out properly. You could do further replacements if you want to deal with tabs in your files. i only ever use spaces. if you only use trim() then you would lose the space before the <a> tag above, but trim() is a good way to check for completely empty char data, then just replace more than one space with a single space. this will preserve a single space at the beginning and end of the cdata.
jason at omegavortex dot com 06-Dec-2005 11:00
I don't believe the problem has been addressed, but if you're parsing an XML file and run into the line break (or tab) problem I believe this function may help:

if (!preg_match("/((\r|)\n)/i", $data) || preg_match("/\\t+/i", $data)) {
(Code Here)
}
wako057 at gmx dot fr 22-Aug-2005 09:39
That give an example about the note.
When you are creating a class and you need to use a method of your class to the function xml_set_character_data_handler that is the way to point give the method:

class example
{
   function example()
   {
   }

  function data($parseur, $texte)
  {
      switch ($this->derniereBaliseRencontree)
      {
         case "TITLE":
                     -----
          break;
         case "LINK"
                    -----
         break;
        case "DESCRIPTION":
                    -----
        break;
     }
  }

  function fetchOpen($parseur, $nomBalise, $tableauAttributs)
  {
     ----------------
  }

  function fetchClose($parseur, $nomBalise)
  {
     ----------------
  }

  function ZZZ()
  {
      $parseurXML = xml_parser_create();
       xml_set_element_handler($parseurXML, Array(&$this, 'fetchOpen'),   Array(&$this, 'fetchClose'));
         ---------------- <IMPORTANT> --------------------------
       xml_set_character_data_handler($parseurXML, Array(&$this, 'data'));
        ---------------- </IMPORTANT> --------------------------
}
ben at removethis emediastudios dotcom 05-Aug-2005 03:53
I too love the undocumented "splitting" functionality :-p.

Rather than concatinating the data based on whether or not the current tag name has changed from the previous tag name I suggest always concatinating like the following with the $catData variable being unset in the endElement function:

<?php

function endElement ($parser, $data) {
  global $catData;

  // Because we are at an element end we know any splitting is finished
  unset($GLOBALS['catData']);
}

function characterData ($parser, $data) {
  global $catData;

  // Concatinate data in case splitting is taking place
  $catData.=$data;

}

?>

This got me around a problem with data like the following where, because characterData is not called for empty tags, the previous and current tag names were the same even though splitting was not taking place.

<companydept>
<companydeptID></companydeptID>
<companyID>1</companyID>
<companydeptName></companydeptName>
</companydept>
<companydept>
<companydeptID></companydeptID>
<companyID>2</companyID>
<companydeptName></companydeptName>
</companydept>
<companydept>
<companydeptID></companydeptID>
<companyID>3</companyID>
<companydeptName></companydeptName>
</companydept>
yaroukh at email dot cz 25-Apr-2005 08:51
It would be nice if someone could complete documentation of this function. I think that the "splitting" behaviour should (at least) be mentioned within the documentation, if not explained (please!). I'm not quite sure whether the cut comes after each 1024bytes/chars of data.

My experience looks as follows:
[xmlFile]
...
    <label>slo|?ka</label>
    <comment>koment|?&#345; slo?ky</comment>
...
[/xmlFile]
(Places where the character-data got splitted are marked with pipes. Plus there was latin small letter 'r' with caron instead of &#345;.)

Since the splitting is not mentioned in documentation one could assume that it is a bug; especially when you work with UTF-8 and the cuts come right before some special characters.
(Should the concatenating of $cData be considered to be the proper & 'final' way of processing character-data?)

Also I'd suggest to add another line in "Description" when fc has an alternate usage (instead of hiding it within the "Note" :o); in this particular case I'd prefer this:

Description:
bool xml_set_character_data_handler ( resource parser, callback handler )
bool xml_set_character_data_handler ( resource parser, object reference, method name )

... there are dozens of functions ofcourse where documentation works this way (I mean not mentioning the alternate usage in the "Description" part).

Have a nice day
  Yaroukh
flobee 12-Feb-2005 09:53
re. to Philippe Marc , and  karuna_gadde examples

i found out that the xml_set_character_data_handler call back  function can be called more often for the same element in particular the content is just a few chars long (happen on windows)

so a check up can give you the answer an may be for long strings too.
eg:
<?php
xml_set_character_data_handler($this->parser, "cdata");
//...
function cdata($parser, $cdata) {
// ...
if(isset($this->data[$this->currentItem][$this->currentField])) {
    $this->data[$this->currentItem][$this->currentField] .= $cdata;
} else {
    $this->data[$this->currentItem][$this->currentField] = $cdata;
}
?>
Philippe Marc 28-Oct-2004 07:21
How to overide the 1024 characters limitation of xml_set_character_data_handler.
Took me some time to find out how to deal with that!

When calling a basic XML parser:
$parseurXML = xml_parser_create();
xml_set_element_handler($parseurXML, "opentagfunction", "closetagfunction");
xml_set_character_data_handler($parseurXML, "textfunction");

The textfunction only receive 1024 characters at once, even if the text is 4000 characters long. In facts, the parser seems to split the data in pieces of 1024 characters. The way to handle that is to concatenate them.

example:
If you have an XML tag called UNIPROT_ABSTRACT containing a 4000 characters protein description:
function textfunction($parser, $text)
    {
     if ($last_tag_read=='UNIPROT_ABSTRACT') $uniprot.=$text;
    }
The function is called 4 times and receives 1024+1024+1024+928 characters that will be concatenated in the $uniprot variable using the ".=" concatenation fonction.

Easy to do, but not documented!
Brad dot Harrison at griffith dot edu dot au 11-Jul-2004 10:23
If you need to trim the white space for HTML code and don't rely on spaces for formatting text (if you are then it is time to use Style Sheets) then this code will come in very useful.

 $data=eregi_replace(">"."[[:space:]]+"."<","><",$data);
 $data=eregi_replace(">"."[[:space:]]+",">",$data);
 $data=eregi_replace("[[:space:]]+"."<","<",$data);
karuna_gadde at yahoo dot com 27-May-2004 07:01
<?
class Parser {

var $att;
var $id;
var $title;
var $content;
var $index=-1;
var $xml_parser;
var $tagname;

function parser()
{
$file = "data.xml";
$this->xml_parser = xml_parser_create();
xml_set_object($this->xml_parser,$this);
xml_set_element_handler($this->xml_parser, "startElement", "endElement");
xml_set_character_data_handler($this->xml_parser, 'elementContent');
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
    $data=eregi_replace(">"."[[:space:]]+"."<","><",$data);
if (!xml_parse($this->xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($this->xml_parser)),
xml_get_current_line_number($this->xml_parser)));
}
}
xml_parser_free($this->xml_parser);
}

function startElement($parser, $name, $attrs) {
if (($name=="TREE") or ($name=="NODE") or ($name=="LEAFNODE"))
    {
         $this->index++;
         $this->att[$this->index]=$name;
    }
    $this->tagname=$name;
}

function elementContent($parser, $data) {
switch ($this->tagname)
{
     case 'ID':
                 $this->id[$this->index]=trim($data);
                 break;
     case 'TITLE' :
                 $this->title[$this->index]=trim($data);
                 //echo $data;
                 break;
     case 'CONTENT'    :
                 $this->content[$this->index]=trim($data);
                 break;

}
}
function endElement($parser, $name){
$this->tagname=="";
}
}
?>

I thought this class is more help full to know about xml_parser with no white spaces
michael dot stilson at wmich dot edu 04-Mar-2004 12:31
Hello,

This is an addition to the note posted by:
wiart at yahoo dot com
22-Aug-2003 05:31
Which is located below.

I had similar problems manually creating XML docs and adding new-lines within my node data, e.g.

<root>
    ...
    <node attribute="something">
        Here is some data. There is a lot of data, and I want to
        be able to read the data from a terminal window, so I add
        newlines to fit everything within 80 columns.
    </node>
    ...
</root>

So, given the above example, my data handler gets called 3 times and the result left in my variable is:

"newlines to fit everything within 80 columns."

Instead of all of the data within "node", which I was expecting.

By using the concatenation operator; however, as suggested by the mentioned note, I was able to get what I needed. Which is of course:

"Here is some data. There is a lot of data, and I want to be able to read the data from a terminal window, so I add newlines to fit everything within 80 columns."
dan30odd08 at hotmail dot com 01-Dec-2003 04:38
I just want to mention that i ran into a problem when parsing an xml file using the character data handler. If you happen to have a string which is also an internal php function stored in your xml data file and you want to output it as a string the parser dosent seem to recognize it.
   I found a way around this problem. In my case i was storing a string with the value read. This would not allow me to output the data so to work around this problem i added a backslash for every character in the data element.

   e.g.      <xml>
    from    <element>read</element>
    to       <element>////read</element>

i dont know if anyone has ran into this problem or not but i thought i would just put it here just so in case someone is getting stuck with this.
wiart at yahoo dot com 22-Aug-2003 05:31
WARNING !!!
Always use concatenation for getting the content of a XML tag when you write the function that will deal with the Character Data handling

Example:

$mycontent = '';
$xml_parser = xml_parser_create ();
xml_set_character_data_handler($xml_parser, "_characterdata");

function _characterdata($parser, $data){
  global $mycontent;
  //HERE: use .= and not =
  $mycontent .= $data;
}

...

while ($data = fread($fp, 4096)) {
    xml_parse($xml_parser, $data, feof($fp));
}

I had the following problem with the use of '=$data' :

In one of my XML documents, the parsing stopped in the middle of a character data :

In original document:
<prop name="nbres">100</prop>

What happened:
<prop name="nbres">10[parsing stopped here in chunck of 4096bytes]0</prop>

As I did not use the concatenation, when I displayed the value of the 'nbres' property, the value was 0 instead of 100 because the first time the function characterdata was called :
$mycontent = 10;

and the second time:
$mycontent = 0;      //!!!!!!!!!!!!! HO HO !! some problem occured ...

Instead of $mycontent = 100;

CONCLUSION:
IN YOUR CHARACTER DATA HANDLER FUNCTIONS, NEVER FORGET THE . (concatenation operator) !!!!! IF YOU DON'T WANT TO HAVE WEIRD BUGS SOME TIMES
morris_hirsch at hotmail dot com 18-Aug-2003 09:15
Thanks to Christian Stocker for clearing up my entity issues,  where some entities are parsed correctly and others not.

The problem is the ''wide'' entities that have a large numeric code simply can not fit in a single byte, which is the default encoding for both source input to the parser and data output from the parser.  So the parser puts out a ''?'' to say it could not store the code value. One could argue that if the input has a &1234; the output should simply copy it as &1234; instead of the ''?'' but that would still mean the  parser behaves two different ways according to the code values, and anyway they don't do it.

So, we need utf8 encoding for the output, and the slightly not obvious way to say so is

  $xml_parser = xml_parser_create ("UTF-8");

which means BOTH source input and data output are utf8.
Remember that utf8 is a superset of basic ASCII but not of extended ASCII, so your input can contain e.g. &eacute;
spelled out, but a native eacute character is wrong here.
Just utf8_encode your input to be sure.

That should do it, and thanks again for the help.
morris_hirsch at hotmail dot com 06-Aug-2003 12:23
Here are two ways to deal with named entities in the XML.

1. Put a list of named entities at the front so the parser knows what they all mean

  $decl = '<!DOCTYPE rootname [

<!ENTITY frac12  "&#x00BD;" >
<!ENTITY frac14  "&#x00BC;" >
<!ENTITY frac34  "&#x00BE;" >
<!ENTITY frac18  "&#x215B;" >
<!ENTITY frac38  "&#x215C;" >
<!ENTITY frac58  "&#x215D;" >
<!ENTITY frac78  "&#x215E;" >
<!ENTITY frac13  "&#x2153;" >
<!ENTITY frac23  "&#x2154;" >
<!ENTITY frac15  "&#x2155;" >
<!ENTITY frac25  "&#x2156;" >
<!ENTITY frac35  "&#x2157;" >
<!ENTITY frac45  "&#x2158;" >
<!ENTITY frac16  "&#x2159;" >
<!ENTITY frac56  "&#x215A;" >

<!ENTITY mdash  "&#x2014;" >

 ..... lots of others

<!ENTITY uuml    "&#252;" >
<!ENTITY yacute  "&#253;" >
<!ENTITY thorn   "&#254;" >
<!ENTITY yuml    "&#255;" >

]>';

$parseThis = $decl . "<rootname> ..... </rootname>";

This works fine for all the single-byte (European) codes,
but not the wide codes like emdash or frac18.
They seem to be trashed when the character data handler gets them.  They all echo as "?"

There may be a way to make them work, but until I find it,
or a newer release takes care of it, here is a work-around that does work.

2. Rewrite every ampersand as &amp; in the input stream

 $ampXML = str_replace ("&", "&amp;", $sourceXML);

Now the parser will see &amp;foo; instead of &foo;

It does not try to decode it, so wide (two byte) values are not a problem, and no list of names is needed.

When you write that to your output you have &foo;

which is usually fine for the next stage of your process.
www.PhoC.de 20-May-2003 07:39
In some cases it's better to avoid storing data which is not needed. In these cases the function

chop()  ( => Alias of function rtrim() )

could be usefull to prevent data like

"\t"
"\r"
"\o"
"\n"
"\x0B"
" "

to be stored in a array or a string or something like this.

Example: (storing data in a string)
________________
$filename="xyz.xml";

if(!($fp=fopen($filename,"r"))){
   die("Cannot open $filename ");
}

while (!feof($fp))
{
   $data .= chop(fgets($fp, 4096));
}

fclose($fp);
________________

Have a look at the documentation of rtrim() http://www.php.net/manual/en/function.rtrim.php.

Greetz
PhoC
waldo at wh-e dot com 06-Mar-2002 09:52
Here's a way to strip all the spaces between tags in an xml document.

//strip white space between tags
$data=eregi_replace(">"."[[:space:]]+"."<","><",$data);

So this:

<house>
  <garage>
    <car>Waldo</car>
  </garage>
</house>

would be changed to:

<house><garage><car>Waldo</car></garage></house>

It was useful to me. Maybe you too?
ken at positive-edge dot com 29-Jan-2002 08:20
the function handler is called several times when it parses the character data.  It doesn't return the entire string as it suggests.  There are special exceptions that will always force the parser to stop scanning and call the character data handler.  This is when:

- The parser runs into an Entity Declaration, such as &amp; (&) or &apos; (?)
- The parser finishes parsing an entity
- The parser runs into the new-line character (\n)
- The parser runs into a series of tab characters (\t)

And perhaps others.

For instance, if we have this xml content:

<mytag name=?Ken Egervari? title=?Chief Technology Officer?>
    Ken has been Positive Edge&apos;s Chief Technology Officer for 2 years.
</mytag>

The parser will call the character data handler 6 times.  This is what will happen:

1    \n
2    \t
3    Ken has been Positive Edge
4    ?
5    s Chief Technology Officer for 2 years.
6    \n

I hope that helps people out.
mogmios at mlug dot missouri dot edu 24-Oct-2001 04:24
If you want to strip unwanted whitespace in an HTML-like manner then there are two steps.

The first you need to strip consecutive whitespaces from all you input data like this:  $data = eregi_replace ( "[[:space:]]+", " ", $data );

Then in your cdata handler make a check to see if it's blank space. An easy way is like this: if ( trim ( $cdata ) ) { work on cdata }

That should take care of any whitespace issues you might have.
annies at cs dot tu-berlin dot de 03-Aug-2001 10:43
The maximum size of the second parmeter $data seems to be 1024. Is there more character data  in the XML text the handler is called again immediately with the next portion.


Affecte le gestionnaire XML par défaut

  • « xml_set_character_data_handler
  • xml_set_element_handler »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Affecte le gestionnaire XML par défaut

xml_set_default_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_default_handler — Affecte le gestionnaire XML par défaut

Description

xml_set_default_handler ( XMLParser $parser , callable $handler ) : bool

Affecte le gestionnaire par défaut de l'analyseur XML parser.

Liste de paramètres

parser

Une référence à un analyseur XML à définir comme fonction d'analyse par défaut.

handler

handler est une chaîne qui contient le nom d'une fonction qui existe lorsque xml_parse() est appelé pour créer parser.

La fonction handler doit accepter deux paramètres :

handler ( XMLParser $parser , string $data )
parser
Le premier paramètre, parser, est une référence sur l'analyseur XML qui appelle cette fonction.
data
Le second paramètre, data, contient les caractères sous la forme d'une chaîne. Cela peut être une déclaration XML, un type de document, une entité ou d'autres données pour lesquelles aucun gestionnaire n'est prévu.

Si un gestionnaire reçoit une chaîne vide ou false, c'est qu'il est désactivé.

Note: À la place d'un nom de fonction, un tableau contenant une référence d'objet et un nom de méthode peut aussi être utilisé.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

User Contributed Notes

anoril at anoril dot com 13-Jul-2006 07:54
I have the same issue using two installation of PHP5: on accepts to use the default handler while the other only uses the character_data one.

Maybe a configuration problem...

;) Nonor.
phillip 26-Apr-2005 02:13
it seems to me that in PHP5 the function defined as default-handler (using xml_set_default_handler()) doesen't get passed the cdata anymore:

i.e.:
xml_set_element_handler($this->parser, 'parseSTART', 'parseEND');
xml_set_default_handler($this->parser, 'parseDEFAULT');
function parseSTART() { ... }
function parseEND() { ... }
function parseDEFAULT() { ... }

under PHP5, parseDEFAULT will NOT get passed any cdata, but unter PHP4 it will. at least that's my take on the strange stuff (not) happening after migrating to PHP5.

my solution was to add a xml_set_character_data_handler($parser, 'parseDEFAULT'). it worked for me.


Affecte les gestionnaires de début et de fin de balise XML

  • « xml_set_default_handler
  • xml_set_end_namespace_decl_handler »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Affecte les gestionnaires de début et de fin de balise XML

xml_set_element_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_element_handler — Affecte les gestionnaires de début et de fin de balise XML

Description

xml_set_element_handler ( XMLParser $parser , callable $start_handler , callable $end_handler ) : bool

Affecte les gestionnaires de début et de fin de l'analyseur XML parser. start_handler et end_handler sont des chaînes qui contiennent les noms de fonctions qui existent lorsque xml_parse() est appelée pour créer parser.

Liste de paramètres

parser

Une référence d'analyseur XML à définir comme fonction gérant les éléments de début et de fin.

start_handler

La fonction start_handler doit accepter trois paramètres :

start_element_handler ( XMLParser $parser , string $name , array $attribs )
parser
Le premier paramètre, parser, est une référence sur l'analyseur XML qui appelle cette fonction.
name
Le deuxième paramètre, name, contient le nom de l'élément qui a provoqué l'appel du gestionnaire. Si l'analyseur gère la casse, cet élément sera en majuscules.
attribs
Le troisième paramètre, attribs, contient un tableau associatif avec les attributs de l'élément (s'il en existe). Les clés de ce tableau seront les noms des attributs, et les valeurs seront les valeurs correspondantes des attributs. Les noms des attributs seront mis en majuscules si l'analyseur gère la casse. Les valeurs des attributs seront inchangées. L'ordre original des attributs peut être retrouvé en passant en revue le tableau attribs, avec la fonction each(). La première clé sera la première clé du tableau.

Note: À la place d'un nom de fonction, un tableau contenant une référence d'objet et un nom de méthode peut aussi être utilisé.

end_handler

La fonction end_handler doit accepter deux paramètres :

end_element_handler ( XMLParser $parser , string $name )
parser
Le premier paramètre, parser, est une référence sur l'analyseur XML qui appelle cette fonction.
name
Le second paramètre, name, contient le nom de l'élément qui a provoqué l'appel du gestionnaire. Si l'analyseur gère la casse, cet élément sera en majuscules.

Si un gestionnaire reçoit une chaîne vide, ou false, c'est qu'il est en train d'être désactivé.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

User Contributed Notes

kok at nachon dot nl 26-Sep-2008 06:44
Here is another example of detecting empty elements. I works with libxml2. Note that it handles buffer boundaries.

<?php

$depth = 0; //current depth, used for pretty printing
$empty = false; //whether the tag is empty
$offset = 0; //the index of the start of the current buffer within the stream

function tagStart($parser, $name, array $attribs) {
    global $depth, $empty, $data, $offset, $lastchar;
    $idx = xml_get_current_byte_index($parser);
    /* xml_get_current_byte_index returns index within the streams and not
       within the buffer.*/

    /* Check if the index is within the buffer. */
    if (isset($data[$idx - $offset])) {
        $c = $data[$idx - $offset];
    } else {
        /* If it isn't simple use the last character of the buffer. */
        $c = $lastchar;
    }
    $empty = $c == '/';
    echo str_repeat("\t", $depth), "<$name", ($empty ? '/>' : '>'), "\n";
    if (!$empty) ++$depth;
}

function tagEnd($parser, $name) {
    global $depth, $empty;
    if (!$empty) {
        --$depth;
        echo str_repeat("\t", $depth), "</$name>\n";
    } else {
        $empty = false;
    }
}

$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);
xml_set_element_handler($parser, 'tagStart', 'tagEnd');

$data1 = '
<test>
    <empty att="3" />
    <nocontent></nocontent>
    <content>
        <empty/>
        <empty/>
    </content>
    <empty/';

$data2 = '>
    <empty att="5" />
</test>
';

$data = &$data1;
$length = strlen($data1);
$lastchar = $data[$length-1];
xml_parse($parser, $data1);
$offset .= $length;
$data = &$data2;
xml_parse($parser, $data2);
darien at etelos dot com 12-Feb-2007 10:48
This documentation is somewhat awry. I know it's been said many times before, but it bears repeating...

If using PHP4, you may be required to use xml_set_object() instead of calling any of the xml_set_*_handler() functions with a two-item array. It will work fine on PHP5, but move the same code to PHP4 and it will create one copie of $this (even if you use &$this) for each handler you set!

<?php
// This code will fail mysteriously on PHP4.
$this->parser = xml_parser_create();
xml_set_element_handler(
            $this->parser,
            array(&$this,"start_tag"),
            array(&$this,"end_tag")
        );
        xml_set_character_data_handler(
            $this->parser,
            array(&$this,"tag_data")
        );
?>

<?php
// This code will work on PHP4.
$this->parser = xml_parser_create();
xml_set_object($this->parser,&$this);
xml_set_element_handler(
            $this->parser,
            "start_tag",
            "end_tag"
        );
        xml_set_character_data_handler(
            $this->parser,
            "tag_data"
        );
?>
lloeki at gmail dot com 31-Oct-2006 03:07
I modified the previous script, so that it is associative. I find it more useful that way. BTW I prefer strtolower() things, but that's not mandatory at all.

<?php

$file = "data.xml";
$depth = 0;
$tree = array();
$tree['name'] = "root";
$stack[] = &$tree;

function startElement($parser, $name, $attrs) {
   global $depth;
   global $stack;
   global $tree;

   $element = array();
   foreach ($attrs as $key => $value) {
       $element[strtolower($key)]=$value;
   }

   end($stack);
   $stack[key($stack)][strtolower($name)] = &$element;
   $stack[strtolower($name)] = &$element;

   $depth++;
}

function endElement($parser, $name) {
   global $depth;
   global $stack;

   array_pop($stack);
   $depth--;
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
   die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
   if (!xml_parse($xml_parser, $data, feof($fp))) {
       die(sprintf("XML error: %s at line %d",
                   xml_error_string(xml_get_error_code($xml_parser)),
                   xml_get_current_line_number($xml_parser)));
   }
}
xml_parser_free($xml_parser);
$tree = end(end($stack));
echo "<pre>";
print_r($tree);
echo "</pre>";

?>
rubentrancoso at gmail dot com 29-Aug-2006 01:44
My 25 cents. This example show how to parse a XML in a associative array tree.

<?php

$file = "flow/flow.xml";
$depth = 0;
$tree = array();
$tree['name'] = "root";
$stack[count($stack)] = &$tree;

function startElement($parser, $name, $attrs) {
   global $depth;
   global $stack;
   global $tree;

   $element = array();
   $element['name'] = $name;
   foreach ($attrs as $key => $value) {
        //echo $key."=".$value;
        $element[$key]=$value;
    }

   $last = &$stack[count($stack)-1];
   $last[count($last)-1] = &$element;
   $stack[count($stack)] = &$element;

   $depth++;
}

function endElement($parser, $name) {
   global $depth;
   global $stack;

   array_pop($stack);
   $depth--;
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
   die("could not open XML input");
}

while ($data = fread($fp, 4096)) {
   if (!xml_parse($xml_parser, $data, feof($fp))) {
       die(sprintf("XML error: %s at line %d",
                   xml_error_string(xml_get_error_code($xml_parser)),
                   xml_get_current_line_number($xml_parser)));
   }
}
xml_parser_free($xml_parser);
$tree = $stack[0][0];
echo "<pre>";
print_r($tree);
echo "</pre>";
redb 15-May-2006 05:48
Example below (BadParser) works fine with some changes.

xml_set_element_handler ( $parser, array ( &$this, 'tagStart' ), array ( &$this, 'tagEnd' ) );
xml_set_character_data_handler ( $parser, array ( &$this, 'tagContent' ) );
vladimir-leontiev at uiowa dot edu 13-Dec-2005 09:44
It seems that characterData() gets characters in chuncks of 1024; therefore if you have string of characters between you tags that is longer than 1024 then characterData() will be called more that once for single pair of tags. I don't know if this feature(bug?) is documented anywhere, I just wanted to warn everyone about this; it had tripped me. I use php 4.3.10 on Linux.
hendra_g at hotmail dot com 19-Nov-2005 08:10
I ran into the same problem with 'ibjoel at hotmail dot com' in regards to self-closing tags, and found that the script that he/she wrote did not work as I expected.
I played around with some of php's functions and examples and compiled something, which may not be the neatest solution, but it works for the data that 'ibjoel at hotmail dot com' provided.
The data needs to be read from a file though, so the fp can be utilised. It still uses the xml_get_current_byte_index(resource parser) trick, but this time, I check for the last 2 character before the index and test if it's "/>".

<?php
/* myxmltest.xml:
<normal_tag>
  <self_close_tag />
     data
  <normal_tag>data
     <self_close_tag attr="value" />
  </normal_tag>
     data
  <normal_tag></normal_tag>
</normal_tag>
*/

//## Global Variables ##//
$file = "myxmltest.xml";
$character_data_on = false;
$tag_complete = true;

function startElement($parser, $name, $attrs)
{
    global $character_data_on;
    global $tag_complete;

    echo "&lt;<font color=\"#0000cc\">$name</font>";
    //## Print the attributes ##//
    if (sizeof($attrs)) {
        while (list($k, $v) = each($attrs)) {
            echo " <font color=\"#009900\">$k</font>=\"<font
                   color=\"#990000\">$v</font>\"";
        }
    }
    //## Tag is still still incomplete,
    //## will be completed at either endElement or characterData ##//
    $tag_complete = false;
    $character_data_on = false;
}

function endElement($parser, $name)
{
    global $fp;
    global $character_data_on;
    global $tag_complete;

    //#### Test for self-closing tag ####//
    //## xml_get_current_byte_index(resource parser) when run in this
    //## function, gives the index at (indicated by *):
    //##   for self closing tag: <br />*
    //##   for individual closing tag: <div>character data*</div>
    //## So to test for self-closing tag, we can just test for the last 2
    //## characters from the index
    //###################################//

    if (!$character_data_on) {
        //## Record current fp position ##//
        $temp_fp = ftell($fp);

        //## Point fp to 2 bytes before the end element byte index ##//
        $end_element_byte_index = xml_get_current_byte_index($parser);
        fseek($fp,$end_element_byte_index-2);

        //## Gets the last 2 characters before the end element byte index ##//
        $validator = fgets($fp, 3);

        //## Restore fp position ##//
        fseek($fp,$temp_fp);

        //## If the last 2 character is "/>" ##//
        if ($validator=="/>") {
            //// Complete the self-closing tag ////
            echo " /&gt";
            //// Otherwise it is an individual closing tag ////
        } else echo "&gt&lt/<font color=\"#0000cc\">$name</font>&gt";
        $tag_complete = true;
    } else echo "&lt/<font color=\"#0000cc\">$name</font>&gt";

    $character_data_on = false;
}

function characterData($parser, $data)
{
    global $character_data_on;
    global $tag_complete;

    if ((!$character_data_on)&&(!$tag_complete)) {
        echo "&gt";
        $tag_complete = true;
    }
    echo "<b>$data</b>";
    $character_data_on = true;
}

$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}

echo "<pre>";
while ($file_content = fread($fp, 4096)) {
    if (!xml_parse($xml_parser, $file_content, feof($fp))) {
        die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($xml_parser)),
                    xml_get_current_line_number($xml_parser)));
    }
}
echo "</pre>";
xml_parser_free($xml_parser);
?>
turan dot yuksel at tcmb dot gov dot tr 20-Sep-2005 03:41
The method that 'ibjoel at hotmail dot com' have described requires libxml2 as the xml parser, it does not work with expat. For a brief explanation, see xml_get_current_byte_index.
ibjoel at hotmail dot com 01-Aug-2005 03:49
I noticed that in the example below, and all the examples I've seen on this site for viewing xml in html, the look of self closing tags such as <br /> are not preserved. The parser cannot distinguish between <tag /> and <tag></tag>, and if your start and end element functions are like these examples, both instances will be output with both an indvidual start and end tag.  I needed to preserve self-closing tags and it took me a while to figure out this work around. Hope this helps someone...

The start tag is left open, and then completed by it's first child, the next start tag or its end tag.  The end tag will complete with " />", or </tag> depending on the number of bytes between the start and end tags in the parsed data.
<?php
//$data=filepath or string
$data=<<<DATA
<normal_tag>
  <self_close_tag />
      data
  <normal_tag>data
     <self_close_tag attr="value" />
  </normal_tag>
      data
  <normal_tag></normal_tag>
</normal_tag>
DATA;

function startElement($parser, $name, $attrs)
{
        xml_set_character_data_handler($parser, "characterData");
        global $first_child, $start_byte;
        if($first_child)          //close start tag if neccessary
                echo "><br />";
        $first_child=true;
        $start_byte=xml_get_current_byte_index ($parser);
        if(count($attrs)>=1){
                foreach($attrs as $x=>$y){
                        $attr_string .= " $x=\"$y\"";
                }
        }
        echo htmlentities("<{$name}{$attr_string}"); //unclosed starttag
}

function endElement($parser, $name)
{
        global $first_child, $start_byte;
        $byte=xml_get_current_byte_index ($parser);
        if($byte-$start_byte>2){           //if end tag is more than 2 bytes from start tag
                if($first_child)          //close start tag if neccessary
                        echo "><br />";
                echo htmlentities("</{$name}>")."<br />";  //individual end tag
        }else
                echo " /><br />";  // self closing tag
        $first_child=false;

}

function characterData($parser, $data)
{
        global $first_child;
        if($first_child)  //if $data is first child, close start tag
                echo "><br />";
        if($data=trim($data))
                echo "<font color='blue'>$data</font><br />";
        $first_child=false;
}

function ParseData($data)
{
        $xml_parser = xml_parser_create();
        xml_set_element_handler($xml_parser, "startElement", "endElement");
        xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
        if(is_file($data))
        {
                if (!($fp = fopen($file, "r"))) {
                        die("could not open XML input");
                }

                while ($data = fread($fp, 4096)) {
                        if (!xml_parse($xml_parser, $data, feof($fp))) {
                                $error=xml_error_string(xml_get_error_code($xml_parser));
                               $line=xml_get_current_line_number($xml_parser);
                                die(sprintf("XML error: %s at line %d",$error,$line));
                        }
                }
        }else{
                if (!xml_parse($xml_parser, $data, 1)) {
                                $error=xml_error_string(xml_get_error_code($xml_parser));
                                $line=xml_get_current_line_number($xml_parser);
                                die(sprintf("XML error: %s at line %d",$error,$line));
                }
        }

        xml_parser_free($xml_parser);
}

ParseData($data);
?>
youniforever at naver dot com 30-Apr-2005 03:41
<html>
  <head>
    <title>SAX Demonstration</title>
   <META HTTP-EQUIV='Content-type' CONTENT='text/html; charset=euc-kr'>
  </head>
  <body>
    <h1>RSS ??????</h1>

      <?php

     $file = "data.xml";

      $currentTag = "";
      $currentAttribs = "";

      function startElement($parser, $name, $attribs)
      {
          global $currentTag, $currentAttribs;
          $currentTag = $name;

          $currentAttribs = $attribs;
          switch ($name) {

          default:
              echo("<b>&lt$name&gt</b><br>");
              break;
          }
      }

      function endElement($parser, $name)
      {
          global $currentTag;
          switch ($name) {
          default:
              echo("<br><b>&lt/$name&gt</b><br><br>");
              break;
          }
          $currentTag = "";
          $currentAttribs = "";
      }

      function characterData($parser, $data)
      {
          global $currentTag;
          switch ($currentTag) {
          case "link":
              echo("<a href=\"$data\">$data</a>\n");
              break;
          case "title":
              echo("title : $data");
              break;
          default:
              echo($data);
              break;
          }
      }

     $xmlParser = xml_parser_create();

      $caseFold = xml_parser_get_option($xmlParser,
                                        XML_OPTION_CASE_FOLDING);

      $targetEncoding = xml_parser_get_option($xmlParser,
                                              XML_OPTION_TARGET_ENCODING);

      if ($caseFold == 1) {
          xml_parser_set_option($xmlParser, XML_OPTION_CASE_FOLDING, false);
      }

      xml_set_element_handler($xmlParser, "startElement", "endElement");
      xml_set_character_data_handler($xmlParser, "characterData");

      if (!($fp = fopen($file, "r"))) {
          die("Cannot open XML data file: $file");
      }

     while ($data = fread($fp, 4096)) {
          if (!xml_parse($xmlParser, $data, feof($fp))) {
              die(sprintf("XML error: %s at line %d",
                          xml_error_string(xml_get_error_code($xmlParser)),
                          xml_get_current_line_number($xmlParser)));
              xml_parser_free($xmlParser);
          }
      }
      xml_parser_free($xmlParser);
      ?>
    </table>
  </body>
</html>
13-Mar-2005 01:34
In response to aw at avatartechnology dot com...
In response to landb at mail dot net...

When your functions are in an object:
Careful ! Don't forget to add: & (reference) to your parameters.

xml_set_element_handler($parser, array(&$this,"_startElement"), array(&$this,"_endElement"));
--> xmlparse will work on your object (good).

instead of:
xml_set_element_handler($parser, array($this,"_startElement"), array($this,"_endElement"));
---> xmlparse will work on a COPY of your object (often bad)

Vin-s
(sorry for my english)
aw at avatartechnology dot com 21-Oct-2004 08:40
In response to landb at mail dot net...

As the notes mention, you can pass an array that contains the reference to an object and a method name when you need... so you can call methods in your own class as handlers like this:

xml_set_element_handler($parser, array($this,"_startElement"), array($this,"_endElement"));

Hope it helps...
tj at tobyjoe dot com 31-Jan-2003 11:22
It seems that the tag handlers don't block on one another (the end handler is called whether or not the begin handler has finished). this can put you in a tight spot if you don't realize it while planning your app.
11-Oct-2001 04:09
You CAN use classes to parse XML. Just take a look at the following function:

xml_set_object
jg at jmkg dot net 07-May-2001 11:08
If you are using a class for xml parsing, and want to check the return value of xml_set_element_handler in case it  fails, you must do this outside of the class's constructor. Inside the constructor, PHP-4.0.5 will die.

Basically, put all your xml initialisation code in another function of the class, and keep it out of the constructor.


Configure le gestionnaire XML de données

  • « xml_set_element_handler
  • xml_set_external_entity_ref_handler »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Configure le gestionnaire XML de données

xml_set_end_namespace_decl_handler

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

xml_set_end_namespace_decl_handler — Configure le gestionnaire XML de données

Description

xml_set_end_namespace_decl_handler ( XMLParser $parser , callable $handler ) : bool

Définit un gestionnaire à appeler lorsque l'on quitte le contexte d'un espace de noms. Il peut être appelé, pour chaque déclaration de l'espace de noms, après le gestionnaire de la dernière balise de l'élément dont l'espace de noms a été déclaré.

Attention

Cet évènement n'est pas supporté sous libXML, aussi, un gestionnaire enregistré ne sera pas appelé.

Liste de paramètres

parser

Une référence à un analyseur XML.

handler

handler est une chaîne contenant le nom d'une fonction qui doit exister lorsque la fonction xml_parse() est appelée pour l'analyseur parser.

La fonction nommée par le paramètre handler doit accepter 2 paramètres, et doit retourner une valeur entière. Si la valeur retournée du gestionnaire est false (ce qui sera le cas si aucune valeur n'est retournée), l'analyseur XML arrêtera l'analyse et la fonction xml_get_error_code() retournera XML_ERROR_EXTERNAL_ENTITY_HANDLING.

handler ( XMLParser $parser , string $prefix )
parser
Le 3ème paramètre, parser, est une référence à l'analyseur XML appelée par le gestionnaire.
prefix
Le préfixe est une chaîne de caractères utilisée pour référencer l'espace de noms dans un objet.

Si une chaîne vide, ou false, est passée à la fonction représentant le gestionnaire, le gestionnaire en question sera désactivé.

Note: À la place d'un nom de fonction, un tableau contenant une référence d'objet et un nom de méthode peut aussi être utilisé.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

Voir aussi

  • xml_set_start_namespace_decl_handler() - Configure le gestionnaire de caractères

User Contributed Notes

There are no user contributed notes for this page.


Configure le gestionnaire XML de références externes

  • « xml_set_end_namespace_decl_handler
  • xml_set_notation_decl_handler »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Configure le gestionnaire XML de références externes

xml_set_external_entity_ref_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_external_entity_ref_handler — Configure le gestionnaire XML de références externes

Description

xml_set_external_entity_ref_handler ( XMLParser $parser , callable $handler ) : bool

Affecte le gestionnaire d'entité externe de l'analyseur XML parser.

Liste de paramètres

parser

Une référence d'analyseur XML à définir comme fonction de référence d'entités externes.

handler

handler est une chaîne qui contient les noms de fonctions qui existent lorsque xml_parse() est appelé pour créer le parser.

La fonction handler doit accepter 5 paramètres, et retourner un entier. Si la valeur retournée par le gestionnaire est false (par exemple si aucune valeur n'est retournée), l'analyseur XML s'arrêtera, et la fonction xml_get_error_code() retournera XML_ERROR_EXTERNAL_ENTITY_HANDLING.

handler ( XMLParser $parser , string $open_entity_names , string $base , string $system_id , string $public_id )
parser
Le premier paramètre,parser, est une référence sur l'analyseur XML qui appelle cette fonction.
open_entity_names
Le deuxième paramètre, open_entity_names, est la liste de noms d'entités, séparés par des espaces. Ces entités sont accessibles à l'analyse par cette entité (y compris le nom de l'entité référencée).
base
La meilleure base de résolution de l'identifiant système (system_id) de cette entité externe. Actuellement, ce paramètre est toujours une chaîne vide.
system_id
Identifiant système pour cette entité externe.
public_id
Le cinquième paramètre, public_id, est l'identifiant public, comme spécifié dans la déclaration d'entité, ou une chaîne vide, si aucune déclaration n'a été spécifiée. L'espace dans l'identifiant public sera normalisé comme spécifié dans les spécifications XML.

Si un gestionnaire reçoit une chaîne vide, ou false, c'est qu'il est en train d'être désactivé.

Note: À la place d'un nom de fonction, un tableau contenant une référence d'objet et un nom de méthode peut aussi être utilisé.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
7.3.0 | La valeur de retour de handler n'est désormais plus ignoré quand l'extension a été compilé contre libxml. Auparavant, la valeur de retour était ignoré et l'analyse ne s'arrêtait jamais.

User Contributed Notes

There are no user contributed notes for this page.


Configure le gestionnaire XML de notations

  • « xml_set_external_entity_ref_handler
  • xml_set_object »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Configure le gestionnaire XML de notations

xml_set_notation_decl_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_notation_decl_handler — Configure le gestionnaire XML de notations

Description

xml_set_notation_decl_handler ( XMLParser $parser , callable $handler ) : bool

Affecte les gestionnaires de début et de fin de l'analyseur XML parser.

Une notation est une partie du DTD du document, qui a le format suivant :

<!NOTATION <parameter>name</parameter>
{ <parameter>systemId</parameter> | <parameter>publicId</parameter>?>
Reportez-vous à la section » des spécifications XML 1.0 pour connaître les notations des entités externes.

Liste de paramètres

parser

Une référence d'analyseur XML à définir comme fonction de déclaration de notation.

handler

handler est une chaîne qui contient le nom d'une fonction qui existe lorsque xml_parse() est appelé pour créer parser.

La fonction handler doit accepter cinq paramètres :

handler ( XMLParser $parser , string $notation_name , string $base , string $system_id , string $public_id )
parser
Le premier paramètre, parser, est une référence sur l'analyseur XML qui appelle cette fonction.
notation_name
Le nom de la notation, name, comme précisé dans le format de notation ci-dessus.
base
La meilleure base de résolution de l'identifiant système (system_id) de cette entité externe. Actuellement, ce paramètre est toujours une chaîne vide.
system_id
Identifiant système pour cette entité externe.
public_id
Identifiant public pour cette entité externe.

Si un gestionnaire reçoit une chaîne vide ou false, c'est qu'il est en train d'être désactivé.

Note: À la place d'un nom de fonction, un tableau contenant une référence d'objet et un nom de méthode peut aussi être utilisé.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

User Contributed Notes

There are no user contributed notes for this page.


Configure un objet comme analyseur XML

  • « xml_set_notation_decl_handler
  • xml_set_processing_instruction_handler »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Configure un objet comme analyseur XML

xml_set_object

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_object — Configure un objet comme analyseur XML

Description

xml_set_object ( XMLParser $parser , object $object ) : bool

Rend l'analyseur parser utilisable depuis un objet. Toutes les méthodes de rappel, affectées par xml_set_element_handler(), seront les méthodes de cet objet.

Liste de paramètres

parser

Une référence d'analyseur XML à utiliser dans l'objet.

object

L'objet dans lequel nous devons utiliser l'analyseur XML.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

Exemples

Exemple #1 Exemple avec xml_set_object()

<?php
class XMLParser
{
    private $parser;

    function __construct()
    {
        $this->parser = xml_parser_create();

        xml_set_object($this->parser, $this);
        xml_set_element_handler($this->parser, "tag_open", "tag_close");
        xml_set_character_data_handler($this->parser, "cdata");
    }

    function __destruct()
    {
        xml_parser_free($this->parser);
        unset($this->parser);
    }

    function parse($data)
    {
        xml_parse($this->parser, $data);
    }

    function tag_open($parser, $tag, $attributes)
    {
        var_dump($tag, $attributes);
    }

    function cdata($parser, $cdata)
    {
        var_dump($cdata);
    }

    function tag_close($parser, $tag)
    {
        var_dump($tag);
    }
}

$xml_parser = new XMLParser();
$xml_parser->parse("<A ID='hallo'>PHP</A>");
?>

L'exemple ci-dessus va afficher :

string(1) "A"
array(1) {
  ["ID"]=>
  string(5) "hallo"
}
string(3) "PHP"
string(1) "A"

User Contributed Notes

joey at gimo dot co dot uk 10-Aug-2016 10:32
This function seems to be of very limited use when [$object_instance, "method_name"] is a callable.
wake dot shinigami at gmail dot com 23-Nov-2005 08:28
I finally managed to get xml_set_object() to work, after much documentation searching.  As the solution I found has been hinted at, the focus has been wrong.

There have been many problems getting class contained XML parsers to make changes to the members of an instance.  This is because, from what I'm guessing, the functions are using a either a new annonymous instance of the class or an uninstanced version of the class.

What we want to make sure it does it that the parser is accessing its handlers as member methods of a particular instance of a class.  This can be done using the array method for passing a callback, setting the object as a reference to this instance.  This way, you know that the parser is going to call the function properly.

Ex:
<?php
class Parser {

 private $parser;
 private $data;

 public function __construct() {
  $this->parser = NULL;
  $this->data = '';
 }

 private function ParseElementStart($parser, $name, $attrs) {
  // Code
 }
 private function ParseElementEnd($parser, $name) {
  // Code
 }

 public function Parse($XMLdata) {
  $this->parser = xml_parser_create();
  xml_set_object($this->parser, $this);
  xml_set_element_handler($this->parser,
                          array(&$this, 'ParseElementStart'),
                          array(&$this, 'ParseElementEnd'));
  xml_parse($this->parser, $XMLdata);
  xml_parser_free($this->parser);
 }
}
?>

With this, when you call the Parse method, the data in that instance can be modified.  I'm not sure if xml_set_object becomes unneccissary when using the array callbacks, but I leave it in just to make sure that the xml_parse function knows it's in the object.

As above, I'd recommend for memory sake, that the XML parser be created, used, and freed all in the same function, to ensure that everything is cleaned up correctly.
bettmenn at gmx dot de 16-Oct-2004 02:03
Adding to 'lmfe at mega dot ist dot utl dot pt' contribution below, I have to say that this behaviour is very usual for PHP if MemberVars of an Object arent initialized from the constructor.
What worked best for me so far was something like this:
<?php
class foo {
  var $bar
  // the constructor
  function foo() {
    unset($this->bar);  // with every instanciation, the variable is cleared for the object
  }
}
?>
lmfe at mega dot ist dot utl dot pt 29-Sep-2004 10:51
Using PHP 4.3.0, I got this strange behaviour:

<?php
class xml  {

     /* (as specified in the documentation above) */

} // end of class xml

/* This code works */
$xml_parser = new xml();
$xml_parser->parse("<A ID='hallo'>PHP</A>");

/* This code works */
$xml_parser2 = new xml();
$xml_parser2->parse("<A ID='hallo2'>PHP2</A>");

/* This code DON'T work */
$xml_parser = new xml();
$xml_parser->parse("<A ID='hallo3'>PHP3</A>");
?>

In the third block of code, php complains it can't find the handlers it needs.
It seems this problem only happens if the variable is used more than once.
Calling xml_parser_free doesn't help
hwheinzen at t-online dot de 14-Aug-2004 03:38
(Adding to zitan's note)
It seems easy enough to provide output functions for callback handler classes too.

Example:

<?php
class CallBack {
    var $name = 'Callback';
    var $info = 'Information!';
    function toString() {
        return $this->name.': '.$this->info;
    }
}
class Main {
    var $name = 'Main';
    var $callBackObject;
    function setCallBack(&$cBIn) { $this->callBackObject = $cBIn; }
    function toString() {
        return $this->name.': '.$this->callBackObject->toString();
    }
}

$cb = & new CallBack;
$m = & new Main;
$m->setCallBack(&$cb);
echo $cb->toString();
echo $m->toString();
?>

So, after collecting information during the parse operation within the callback handler class, e.g. in tag_close(), retrieving them is possible.
zitan at mediasculpt dot net 01-Sep-2003 09:05
Just a note about creating abstract "call back handlers" as mentioned in some of the other notes.  In this case I recommend extending the base XML class and overwritting the handler methods.  The reason I wanted to do this, is that if you have a separate callback method class it causes problems, for example if you want to collect information out of the XML file and store it in an array.  You can get around it with global variables, but I prefer to use them only when required ;)

Example:

<?php
class xml_output extends xml{

  var $output = array();

   function xml_output(){
    $this->xml();
   }

    //overwrite base methods
    function tag_open($parser, $tag, $attributes)
    {
        array_push($this->output, "<$tag, attributes>");
    }

    function cdata($parser, $cdata)
    {
         array_push($this->output, "$cdata");
    }

    function tag_close($parser, $tag)
    {
         array_push($this->output, "</$tag>");
    }

}

$xml_parser = & new xml_output();
$xml_parser->parse("<A ID='hallo'>PHP</A>");
echo("$xml_parser->output");
?>
sbeam at syxyz dot net 12-Nov-2002 09:34
passing the object as a call-time ref (&$this) as in the example will create a warning in php 4.1+. Pass xml_set_object($xp,$this); instead. This does not seem to break anything - but I dont know for sure.
chiefgeek at ecodedesign.com 04-Aug-2002 10:37
Just adding a little note about my above written example.  It needs some improvements.

Because PHP passes by VALUE by default, when you pass an array like this:
array($callback_handler, 'handler_method')
PHP makes a copy of the callback_handler object and uses the handler_method in the copy.

This is not an ideal situation for many reasons...which I will not get into here...but you should have an idea by now.

The best way to fix this is to change a few things. In the function declaration change the parameter from $callback_handler to &$callback_handler. So now your declaration should look like this

function set_callback_handler(&$callback_handler)
{
  ...
}

Now each time you reference $callback_handler change it to &$callback_handler.  For example:

xml_set_element_handler(
          $this->xml_parser,
          array(&$callback_handler, 'start_element'),
          array(&$callback_handler, 'close_Element' ));

This ensures that PHP will always use the same object.
chiefgeek at ecodedesign.com 03-Aug-2002 08:25
xml_set_object is great, if you want to hard code your start_element, end_element, etc functions within your xml class.

But what if you want to increase the modularity of your application?

Solution, create one generic XMLParser class that handles everything *except* the callback funtions.  Then create an abstract XMLCallbackHandler class which you can extend to provide any customization you want.

So how do you tell the php's xml_parser that you want to use this other class to handle the callback functions.

xml_set_object?  This only works if the functions are *within* the object you called this method from.

The solution lies in the xml_set_element_handler() function.
Take a look at this sample source...

class XMLParser
{

  ...

  function set_callback_handler($callback_handler)
  {
    // Assign the startElement endElement functions
    xml_set_element_handler(
          $this->xml_parser,
          array($callback_handler, 'start_element'),
          array($callback_handler, 'close_Element' ));

    /* By passing an array with this ($object, 'function_name') structure
       to the 2nd and 3rd parameters.  We are able to tell the parser to
       look in another object for these callback functions.
    */

    // Assign the character data function
    xml_set_character_data_handler(
          $this->xml_parser,
          array($callback_handler, 'character_data'));
    }
}

class myCallBackHandler
{
  function start_element(...)
  {
    //code goes here
  }

  function end_element(...)
  {
    //code goes here
  }

  function character_data(...)
  {
    //code goes here
  }
}

Now all thats left to do is use these classes..

$parser = new XMLParser();
$parser->set_callback_handler(new myCallbackHandler());
dfoesch at cs dot nmsu dot edu 12-Apr-2002 05:38
English explaination of why you do: $xml = & new xml();

Ok, when PHP executes "new xml()" it creates an anonymous variable (one that you can't reference with any name) which it then runs the constructor function on.  Ok, now once that's done, it then assigns by VALUE in the example above.  This means that that lovely pointer to your parser is pointing to the anonymous instance of your class, and not the used instance of your class... thus making a "shadow" of all your variables, where assignments inside the parser access different variables than outside the parser.  What PHP _SHOULD_ be doing (similar to C++) is have this statement execute such that the assignment is done by REFERENCE, so that you assign the new name to the class that actually got constructed, and not just a copy of the class that you constructed.

If they did it right, this code wouldn't be broken.
14-Feb-2002 11:10
Call-time pass-by-reference has been deprecated, so the example is buggy as was already mentionned. However since 4.04 (I think) "new" can return objects by reference. So the clean way to have both the parser initialised in the constructor, and to save the result in your object is to do

$xml_parser = & new xml();

see http://www.php.net/manual/en/language.oop.newref.php

Ivan
pete dot nelson at serverSXPYAZMsolved dot com 27-Aug-2001 10:15
<p>in reply to jon9mm's question, I have found the same problem (function 'startElement' does not exist).  I finally found the way around this, by re-reading this doc for xml_set_object.  You HAVE to use the xml_set_object($this->parser, &$this) within your parser function.</p> <p>When that function is called, your object temporarily becomes the parser object and shares scope (so it can see 'startElement', etc).   Once that function is done, the xml_set_object(...) call goes out of scope, and your object is no longer bound to the parser.  So the simplist solution is to call xml_set_object(...), do any parsing, and then call xml_parser_free(...) all within the same function.</p>
<p>And remember, don't call xml_set_object(...) in your object's constructor - your object will be forever bound to the parser object and you'll loose all access to your object's member functions.</p>
<p>This is all explained in the examples above, but it took me reading it a couple of times to grok how it all works.</p>
nick at category4 dot com 14-May-2001 01:45
If you're using the XML parser within an object, be careful not to accidentally call any methods that don't exist within the object. Instead of complaining that the missing method doesn't exist, PHP will say it's not able to find the handler routines, even if you've indicated them correctly. (PHP version 4.0.5 on FreeBSD).
williams at cse dot unl dot edu 06-Dec-2000 12:42
If xml_set_object is not called in the constructor of an object, the values that the parser modifies will be saved. Else, the values do not seem to be saved as stated by "i_sofer" above.
--- Start Example Code ---
class foo {
var xmlparser;
function foo() { \\the constructor
$this->xmlparser=xmlparser_create();
}
function parse() {
xml_set_object($this->xmlparser,&$this);
\\also include data handler
\\and element handlers here
}
}
--- End Example Code ---
i_sofer at yahoo dot com 18-Nov-2000 04:15
Using xml parser in objects seem to have a problem that values modified(even of the object itself) get lost as soon as parsing ends...
malcontent at msgto dot com 20-Aug-2000 12:11
The example will generate a warning unless allow_call_time_pass_reference is set to true in your INI file. It also will not accept a call by value.
robert at webmotion dot com 18-Apr-2000 10:58
While true that there is no automatic destructor for PHP class objects, it is quite simple to create a method called destroy and perform the destruction manually. In the example above it may not be necessary to free the xml parser immediately... it would appear from the example that the object is re-useable.


Affecte les gestionnaires d'instructions exécutables

  • « xml_set_object
  • xml_set_start_namespace_decl_handler »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Affecte les gestionnaires d'instructions exécutables

xml_set_processing_instruction_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_processing_instruction_handler — Affecte les gestionnaires d'instructions exécutables

Description

xml_set_processing_instruction_handler ( XMLParser $parser , callable $handler ) : bool

Affecte le gestionnaire d'instructions exécutables de l'analyseur XML parser.

Une instruction exécutable a la forme suivante :

<?
target data
?>
Vous pouvez mettre du code PHP entre ces balises, mais soyez conscient d'une des limitations des instructions exécutables de XML : la balise de fin d'instruction exécutable (?>) ne peut être échappée, ce qui fait que cette séquence NE DOIT JAMAIS apparaître dans le code PHP placé dans le document PHP. Si un tel texte apparaît, la balise de fin d'instruction exécutable sera reconnue, et le reste du code sera considéré comme des données brutes (et donc, pas exécutées).

Liste de paramètres

parser

Une référence à l'analyseur XML à définir comme fonction d'analyse d'instructions (PI).

handler

handler est une chaîne qui contient le nom d'une fonction qui existe lorsque xml_parse() est appelé pour créer parser.

La fonction handler doit accepter trois paramètres :

handler ( XMLParser $parser , string $target , string $data )
parser
Le premier paramètre, parser, est une référence sur l'analyseur XML qui appelle cette fonction.
target
Le second paramètre, target, contient l'application cible.
data
Le troisième paramètre, data, contient le code sous la forme d'une chaîne.

Si un gestionnaire reçoit une chaîne vide, ou false, c'est qu'il est désactivé.

Note: À la place d'un nom de fonction, un tableau contenant une référence d'objet et un nom de méthode peut aussi être utilisé.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

User Contributed Notes

There are no user contributed notes for this page.


Configure le gestionnaire de caractères

  • « xml_set_processing_instruction_handler
  • xml_set_unparsed_entity_decl_handler »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Configure le gestionnaire de caractères

xml_set_start_namespace_decl_handler

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

xml_set_start_namespace_decl_handler — Configure le gestionnaire de caractères

Description

xml_set_start_namespace_decl_handler ( XMLParser $parser , callable $handler ) : bool

Définit le gestionnaire à appeler lorsque l'espace de noms est déclaré. Les déclarations d'espace de noms surviennent dans les balises de départ. Mais le gestionnaire de départ, appelé lors de la déclaration de l'espace de noms, est appelé avant le gestionnaire de la balise de départ pour chaque espace de noms déclaré dans cette balise.

Liste de paramètres

parser

Une référence vers l'analyseur XML.

handler

handler est une chaîne contenant le nom d'une fonction devant exister lorsque la fonction xml_parse() est appelé pour l'analyseur parser.

La fonction nommée par le paramètre handler doit accepter 3 paramètres, et doit retourner une valeur entière. Si la valeur retournée par le gestionnaire vaut false (ce qui sera le cas lorsqu'aucune valeur n'est retourné), l'analyseur XML arrêtera l'analyse et la fonction xml_get_error_code() retournera XML_ERROR_EXTERNAL_ENTITY_HANDLING.

handler ( XMLParser $parser , string $prefix , string $uri )
parser
Le premier paramètre, parser, est une référence à l'analyseur XML appelée par le gestionnaire.
prefix
Le préfixe est une chaîne de caractères utilisée pour référencer l'espace de noms d'un objet XML.
uri
Identifiant de ressource uniforme (URI) d'un espace de noms.

Si une chaîne vide, ou la valeur false, est passée en guise de fonction pour le gestionnaire, il sera désactivé.

Note: À la place d'un nom de fonction, un tableau contenant une référence d'objet et un nom de méthode peut aussi être utilisé.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

Voir aussi

  • xml_set_end_namespace_decl_handler() - Configure le gestionnaire XML de données

User Contributed Notes

There are no user contributed notes for this page.


Affecte les gestionnaires d'entités non déclarées

  • « xml_set_start_namespace_decl_handler
  • XmlParser »
  • PHP Manual
  • Fonctions d'analyse de fichier XML
  • Affecte les gestionnaires d'entités non déclarées

xml_set_unparsed_entity_decl_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

xml_set_unparsed_entity_decl_handler — Affecte les gestionnaires d'entités non déclarées

Description

xml_set_unparsed_entity_decl_handler ( XMLParser $parser , callable $handler ) : bool

Affecte les gestionnaires d'entités non déclarées de l'analyseur XML parser.

Le gestionnaire parser sera appelé si l'analyseur XML rencontre une déclaration d'entité externe avec une déclaration de NDATA, comme suit :

<!ENTITY <parameter>name</parameter> {<parameter>publicId</parameter> | <parameter>systemId</parameter>}
        NDATA <parameter>notationName</parameter>

Reportez-vous à la section » des spécifications XML 1.0 pour connaître les notations des entités externes.

Liste de paramètres

parser

Une référence à l'analyseur XML à définir à la fonction utilisée par traiter les déclarations d'entités non-analysées.

handler

handler est une chaîne qui contient le nom d'une fonction qui existe lorsque xml_parse() est appelé pour créer parser.

La fonction handler doit accepter six paramètres :

handler ( XMLParser $parser , string $entity_name , string $base , string $system_id , string $public_id , string $notation_name )
parser
Le premier paramètre, parser, est une référence sur l'analyseur XML qui appelle cette fonction.
entity_name
Le nom de l'entité qui va être définie.
base
La meilleure base de résolution de l'identifiant système de cette entité externe. Actuellement, ce paramètre est toujours une chaîne vide.
system_id
Identifiant système pour cette entité externe.
public_id
Identifiant public pour cette entité externe.
notation_name
Nom de la notation de cette entité. (Voir xml_set_notation_decl_handler()).

Si un gestionnaire reçoit une chaîne vide ou false, c'est qu'il est en train d'être désactivé.

Note: À la place d'un nom de fonction, un tableau contenant une référence d'objet et un nom de méthode peut aussi être utilisé.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.

User Contributed Notes

There are no user contributed notes for this page.


The XmlParser class

(PHP 8)

Introduction

A fully opaque class which replaces xml resources as of PHP 8.0.0.

Synopsis de la classe

final XmlParser {
}

User Contributed Notes

There are no user contributed notes for this page.


XMLReader

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • XMLReader — La classe XMLReader
    • XMLReader::close — Ferme l'entrée XMLReader
    • XMLReader::expand — Retourne une copie du noeud courant comme un noeud d'objet DOM
    • XMLReader::getAttribute — Récupère la valeur d'un attribut par nom
    • XMLReader::getAttributeNo — Récupère la valeur d'un attribut par index
    • XMLReader::getAttributeNs — Récupère la valeur d'un attribut par nom local et URI
    • XMLReader::getParserProperty — Indique si la propriété spécifiée a été fixée
    • XMLReader::isValid — Indique si le document analysé est valide
    • XMLReader::lookupNamespace — Consulte l'espace de nom pour un préfixe
    • XMLReader::moveToAttribute — Déplace un curseur à un attribut nommé
    • XMLReader::moveToAttributeNo — Déplace le curseur à un attribut par index
    • XMLReader::moveToAttributeNs — Déplace le curseur à un attribut d'espace de nom
    • XMLReader::moveToElement — Positionne le curseur sur l'élément parent de l'attribut courant
    • XMLReader::moveToFirstAttribute — Positionne le curseur sur le premier attribut
    • XMLReader::moveToNextAttribute — Positionne le curseur sur le prochain attribut
    • XMLReader::next — Déplace le curseur au prochain noeud en sautant tous les sous arbres
    • XMLReader::open — Fixe le URI contenant le XML à analyser
    • XMLReader::read — Déplace le curseur sur le prochain noeud du document
    • XMLReader::readInnerXml — Lit le code XML du noeud courant
    • XMLReader::readOuterXml — Lit le code XML du noeud courant, y compris lui-même
    • XMLReader::readString — Lit le contenu du noeud courant sous forme de chaîne
    • XMLReader::setParserProperty — Fixe des options pour l'analyseur
    • XMLReader::setRelaxNGSchema — Fixe le nom du fichier ou l'URI pour le Schéma RelaxNG
    • XMLReader::setRelaxNGSchemaSource — Spécifie le schéma RelaxNG
    • XMLReader::setSchema — Valide le document avec XSD
    • XMLReader::XML — Fixe les données contenant le XML à analyser

User Contributed Notes

kraussInode at yahoo dot com 27-Mar-2010 12:54
See also XMLWriter: XMLReader and XMLWriter complement each other.


Introduction

L'extension XMLReader un analyseur XML Pull. Le lecteur fonctionne comme un curseur qui avance sur le flux du document et s'arrête à chaque noeud sur le chemin.

Encodage

Il est important de noter que, en interne, libxml utilise l'encodage UTF-8 et donc, l'encodage du contenu récupéré devra toujours être encodé UTF-8.

User Contributed Notes

There are no user contributed notes for this page.


Installation

L'extension XMLReader était au départ une extension PECL pour PHP 5. Elle a été intégrée par la suite au source de PHP et ce, depuis la version 5.1.0. Elle est activée par défaut depuis la version 5.1.2 de PHP.

Cette extension est activée par défaut. Elle peut être désactivée en utilisant l'option de configuration : --disable-xmlreader

User Contributed Notes

Miguel Cruz 11-Jun-2012 01:06
If you are having trouble loading this extension (perhaps with a log message like 'Undefined symbol "dom_node_class_entry"'), make sure that you have xmlreader.so listed AFTER dom.so in php.ini.
alvaro at digdib dot com 02-Jan-2009 02:33
Gentoo users: emerge does not compile dev-lang/php with --enable-xmlreader by default. To enable this option, add the flag xmlreader to your USE variable and recompile php.


La classe XMLReader

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Introduction

L'extension XMLReader est un analyseur XML. L'analyseur fonctionne comme un curseur qui parcourt le document et s'arrête sur chaque noeud.

Synopsis de la classe

XMLReader {
/* Constantes */
const int NONE = 0 ;
const int ELEMENT = 1 ;
const int ATTRIBUTE = 2 ;
const int TEXT = 3 ;
const int CDATA = 4 ;
const int ENTITY_REF = 5 ;
const int ENTITY = 6 ;
const int PI = 7 ;
const int COMMENT = 8 ;
const int DOC = 9 ;
const int DOC_TYPE = 10 ;
const int DOC_FRAGMENT = 11 ;
const int NOTATION = 12 ;
const int WHITESPACE = 13 ;
const int SIGNIFICANT_WHITESPACE = 14 ;
const int END_ELEMENT = 15 ;
const int END_ENTITY = 16 ;
const int XML_DECLARATION = 17 ;
const int LOADDTD = 1 ;
const int DEFAULTATTRS = 2 ;
const int VALIDATE = 3 ;
const int SUBST_ENTITIES = 4 ;
/* Propriétés */
public readonly int $attributeCount ;
public readonly string $baseURI ;
public readonly int $depth ;
public readonly bool $hasAttributes ;
public readonly bool $hasValue ;
public readonly bool $isDefault ;
public readonly bool $isEmptyElement ;
public readonly string $localName ;
public readonly string $name ;
public readonly string $namespaceURI ;
public readonly int $nodeType ;
public readonly string $prefix ;
public readonly string $value ;
public readonly string $xmlLang ;
/* Méthodes */
public close ( ) : bool
public expand ( DOMNode|null $baseNode = null ) : DOMNode|false
public getAttribute ( string $name ) : string|null
public getAttributeNo ( int $index ) : string|null
public getAttributeNs ( string $name , string $namespace ) : string|null
public getParserProperty ( int $property ) : bool
public isValid ( ) : bool
public lookupNamespace ( string $prefix ) : string|null
public moveToAttribute ( string $name ) : bool
public moveToAttributeNo ( int $index ) : bool
public moveToAttributeNs ( string $name , string $namespace ) : bool
public moveToElement ( ) : bool
public moveToFirstAttribute ( ) : bool
public moveToNextAttribute ( ) : bool
public next ( string|null $name = null ) : bool
public static open ( string $uri , string|null $encoding = null , int $flags = 0 ) : bool|XMLReader
public read ( ) : bool
public readInnerXml ( ) : string
public readOuterXml ( ) : string
public readString ( ) : string
public setParserProperty ( int $property , bool $value ) : bool
public setRelaxNGSchema ( string|null $filename ) : bool
public setRelaxNGSchemaSource ( string|null $source ) : bool
public setSchema ( string|null $filename ) : bool
public static XML ( string $source , string|null $encoding = null , int $flags = 0 ) : bool|XMLReader
}

Propriétés

attributeCount

Le nombre d'attributs dans le noeud

baseURI

La base URI du noeud

depth

Profondeur du noeud dans l'arbre démarrant à 0

hasAttributes

Indique si le noeud a des attributs

hasValue

Indique si le noeud a une valeur de texte

isDefault

Indique si l'attribut est par défaut à partir du DTD

isEmptyElement

Indique si le noeud est un élément vide

localName

Le nom local du noeud

name

Le noeud qualifié du noeud

namespaceURI

L'URI de l'espace de nom associé avec le noeud

nodeType

Le type de noeud pour le noeud

prefix

Le préfixe de l'espace de nom associé avec le noeud

value

La valeur du texte du noeud

xmlLang

La portée xml:lang dans lequel le noeud réside

Constantes pré-définies

Types de noeud XMLReader

XMLReader::NONE

Pas de type de noeud

XMLReader::ELEMENT

Élément de départ

XMLReader::ATTRIBUTE

Noeud Attribut

XMLReader::TEXT

Noeud texte

XMLReader::CDATA

Noeud CDATA

XMLReader::ENTITY_REF

Noeud de référence d'entité

XMLReader::ENTITY

Noeud de déclaration d'entité

XMLReader::PI

Noeud d'instruction de processus

XMLReader::COMMENT

Noeud de commentaire

XMLReader::DOC

Noeud document

XMLReader::DOC_TYPE

Noeud de type de document

XMLReader::DOC_FRAGMENT

Noeud de fragment de document

XMLReader::NOTATION

Noeud de notation

XMLReader::WHITESPACE

Noeud "espace"

XMLReader::SIGNIFICANT_WHITESPACE

Noeud "espace" significatif

XMLReader::END_ELEMENT

Élément de fin

XMLReader::END_ENTITY

Entité de fin

XMLReader::XML_DECLARATION

Noeud de déclaration XML

Options de l'analyseur XMLReader

XMLReader::LOADDTD

Charge une DTD mais ne la valide pas

XMLReader::DEFAULTATTRS

Charge une DTD et les attributs par défaut mais ne la valide pas

XMLReader::VALIDATE

Charge une DTD et valide le document au moment de l'analyse

XMLReader::SUBST_ENTITIES

Substitue les entités et étend les références

Sommaire

  • XMLReader::close — Ferme l'entrée XMLReader
  • XMLReader::expand — Retourne une copie du noeud courant comme un noeud d'objet DOM
  • XMLReader::getAttribute — Récupère la valeur d'un attribut par nom
  • XMLReader::getAttributeNo — Récupère la valeur d'un attribut par index
  • XMLReader::getAttributeNs — Récupère la valeur d'un attribut par nom local et URI
  • XMLReader::getParserProperty — Indique si la propriété spécifiée a été fixée
  • XMLReader::isValid — Indique si le document analysé est valide
  • XMLReader::lookupNamespace — Consulte l'espace de nom pour un préfixe
  • XMLReader::moveToAttribute — Déplace un curseur à un attribut nommé
  • XMLReader::moveToAttributeNo — Déplace le curseur à un attribut par index
  • XMLReader::moveToAttributeNs — Déplace le curseur à un attribut d'espace de nom
  • XMLReader::moveToElement — Positionne le curseur sur l'élément parent de l'attribut courant
  • XMLReader::moveToFirstAttribute — Positionne le curseur sur le premier attribut
  • XMLReader::moveToNextAttribute — Positionne le curseur sur le prochain attribut
  • XMLReader::next — Déplace le curseur au prochain noeud en sautant tous les sous arbres
  • XMLReader::open — Fixe le URI contenant le XML à analyser
  • XMLReader::read — Déplace le curseur sur le prochain noeud du document
  • XMLReader::readInnerXml — Lit le code XML du noeud courant
  • XMLReader::readOuterXml — Lit le code XML du noeud courant, y compris lui-même
  • XMLReader::readString — Lit le contenu du noeud courant sous forme de chaîne
  • XMLReader::setParserProperty — Fixe des options pour l'analyseur
  • XMLReader::setRelaxNGSchema — Fixe le nom du fichier ou l'URI pour le Schéma RelaxNG
  • XMLReader::setRelaxNGSchemaSource — Spécifie le schéma RelaxNG
  • XMLReader::setSchema — Valide le document avec XSD
  • XMLReader::XML — Fixe les données contenant le XML à analyser

User Contributed Notes

eef dot vreeland at gmail dot com 10-Aug-2017 05:43
Please discard my previous note; I pressed 'Add Note' too quickly

About (non-)self-closing tags:

 A) <tag></tag>
    $xmlRdr->isEmptyElement => false
    $xmlRdr->hasValue       => false
    $xmlRdr->value          => ''
    $xmlRdr->hasAttributes  => false

 B) <tag />
    $xmlRdr->isEmptyElement => true
    $xmlRdr->hasValue       => false
    $xmlRdr->value          => ''
    $xmlRdr->hasAttributes  => false

 C) <tag attribute="value"></tag>
    $xmlRdr->isEmptyElement => false
    $xmlRdr->hasValue       => false
    $xmlRdr->value          => ''
    $xmlRdr->hasAttributes  => true

 D) <tag attribute="value" />
    $xmlRdr->isEmptyElement => true
    $xmlRdr->hasValue       => false
    $xmlRdr->value          => ''
    $xmlRdr->hasAttributes  => true

... and always use the '===' operator when testing properties
eef dot vreeland at gmail dot com 10-Aug-2017 05:08
Note that when:

A) <tag></tag>
   $xmlRdr->isEmptyElement => false
   $xmlRdr->hasValue       => true
   $xmlRdr->value          => ''
   $xmlRdr->hasAttributes  => false

B) <tag />
   $xmlRdr->isEmptyElement => true
   $xmlRdr->hasValue       => false
   $xmlRdr->value          => ''
   $xmlRdr->hasAttributes  => false

C) <tag attribute="value"></tag>
   $xmlRdr->isEmptyElement => false
   $xmlRdr->hasValue       => false
   $xmlRdr->value          => ''
   $xmlRdr->hasAttributes  => true

D) <tag attribute="value" />
   $xmlRdr->isEmptyElement => true
   $xmlRdr->hasValue       => false
   $xmlRdr->value          => ''
   $xmlRdr->hasAttributes  => true
Sean Colin Ruiz 08-Jan-2017 03:11
As japos mentioned. Take care how you use isEmptyElement. After you are done looping through the attributes: isEmptyElement will be false.  You can use moveToElement() to move the cursor back to the element and then you can use isEmptyElement like normal again.
dkrnl at yandex dot ru 04-Oct-2013 04:10
Wrapper XMLReader class, for simple SAX-reading huge xml:
https://github.com/dkrnl/SimpleXMLReader

Usage example: http://github.com/dkrnl/SimpleXMLReader/blob/master/examples/example1.php

<?php

/**
 * Simple XML Reader
 *
 * @license Public Domain
 * @author Dmitry Pyatkov(aka dkrnl) <dkrnl@yandex.ru>
 * @url http://github.com/dkrnl/SimpleXMLReader
 */
class SimpleXMLReader extends XMLReader
{

    /**
     * Callbacks
     *
     * @var array
     */
    protected $callback = array();

    /**
     * Add node callback
     *
     * @param  string   $name
     * @param  callback $callback
     * @param  integer  $nodeType
     * @return SimpleXMLReader
     */
    public function registerCallback($name, $callback, $nodeType = XMLREADER::ELEMENT)
    {
        if (isset($this->callback[$nodeType][$name])) {
            throw new Exception("Already exists callback $name($nodeType).");
        }
        if (!is_callable($callback)) {
            throw new Exception("Already exists parser callback $name($nodeType).");
        }
        $this->callback[$nodeType][$name] = $callback;
        return $this;
    }

    /**
     * Remove node callback
     *
     * @param  string  $name
     * @param  integer $nodeType
     * @return SimpleXMLReader
     */
    public function unRegisterCallback($name, $nodeType = XMLREADER::ELEMENT)
    {
        if (!isset($this->callback[$nodeType][$name])) {
            throw new Exception("Unknow parser callback $name($nodeType).");
        }
        unset($this->callback[$nodeType][$name]);
        return $this;
    }

    /**
     * Run parser
     *
     * @return void
     */
    public function parse()
    {
        if (empty($this->callback)) {
            throw new Exception("Empty parser callback.");
        }
        $continue = true;
        while ($continue && $this->read()) {
            if (isset($this->callback[$this->nodeType][$this->name])) {
                $continue = call_user_func($this->callback[$this->nodeType][$this->name], $this);
            }
        }
    }

    /**
     * Run XPath query on current node
     *
     * @param  string $path
     * @param  string $version
     * @param  string $encoding
     * @return array(SimpleXMLElement)
     */
    public function expandXpath($path, $version = "1.0", $encoding = "UTF-8")
    {
        return $this->expandSimpleXml($version, $encoding)->xpath($path);
    }

    /**
     * Expand current node to string
     *
     * @param  string $version
     * @param  string $encoding
     * @return SimpleXMLElement
     */
    public function expandString($version = "1.0", $encoding = "UTF-8")
    {
        return $this->expandSimpleXml($version, $encoding)->asXML();
    }

    /**
     * Expand current node to SimpleXMLElement
     *
     * @param  string $version
     * @param  string $encoding
     * @param  string $className
     * @return SimpleXMLElement
     */
    public function expandSimpleXml($version = "1.0", $encoding = "UTF-8", $className = null)
    {
        $element = $this->expand();
        $document = new DomDocument($version, $encoding);
        $node = $document->importNode($element, true);
        $document->appendChild($node);
        return simplexml_import_dom($node, $className);
    }

    /**
     * Expand current node to DomDocument
     *
     * @param  string $version
     * @param  string $encoding
     * @return DomDocument
     */
    public function expandDomDocument($version = "1.0", $encoding = "UTF-8")
    {
        $element = $this->expand();
        $document = new DomDocument($version, $encoding);
        $node = $document->importNode($element, true);
        $document->appendChild($node);
        return $document;
    }

}
?>
kula_shakerz 03-Apr-2013 02:27
Found this in the IXmlReader docs at msdn but it's also valid for XMLReader in PHP.

You should save the value of $isEmptyElement before processing attributes, or call moveToElement to make $isEmptyElement valid after processing attributes.

$isEmptyElement returns FALSE when XMLReader is positioned on an attribute node, even if attribute's parent element is empty.
Mike De Smet 25-Sep-2012 04:35
For those of you getting xml files that do not contain duplicate elements (in the same element), the following converter converts to arrays with key/value mapping (thus overwriting duplicate elements!):

Note this is untested with attributes although I built in support.

<?php
    function xml2assoc($xml, array &$target = array()) {
        while ($xml->read()) {
            switch ($xml->nodeType) {
                case XMLReader::END_ELEMENT:
                    return $target;
                case XMLReader::ELEMENT:
                    $name = $xml->name;
                    $target[$name] = $xml->hasAttributes ? array() : '';
                    if (!$xml->isEmptyElement) {
                        $target[$name] = array();
                        xml2assoc($xml, $target[$name]);
                    }

                    if ($xml->hasAttributes)
                        while($xml->moveToNextAttribute())
                            $target[$name]['@'.$xml->name] = $xml->value;
                    break;
                case XMLReader::TEXT:
                case XMLReader::CDATA:
                    $target = $xml->value;
            }
        }
        return $target;
    }
?>
casella dot email at google dot mail dot com 22-Sep-2012 03:59
To verify that all nodes are read without error/warning you can use this code:
<?php
$endofxml = false;
$xml_url = "example.xml";
$reader = new XMLReader();
if(!$reader->open($xml_url)){
    print "Error to open XML: $xml_url\n";
} else {
    while ($reader->read()) {
        $firstnode = (!isset($firstnode)) ? $reader->name : $firstnode;
/*
DO SOMETHING
*/
        if ($reader->nodeType == XMLReader::END_ELEMENT && $reader->name == $firstnode) {
            $endofxml = true;
        }
    }
}
if($endofxml) {
    print "no error found";
} else {
    print "error found";
}
?>

This code is useful to trap $reader->read() error/warning.
lee8oi at gmail dot com 21-Mar-2012 01:54
Sometimes you have an unusual URL that doesn't actually point to an xml file but still returns xml as output (Like the Battlefield Heroes generated syndication urls). Using get_file_contents(url) you can retrieve the xml data from these urls and pass it as a variable for processing as an XML String.

Unfortunately simpleXML or xml DOM cannot process all xml strings. Some have error boxes added to the end of them (such as Battlefield Heroes syndicated news). These boxes cause an end of file sort of error and closes out the script. XMLReader grabs data from these strings without error.
japos dot trash at googlemail dot com 09-Oct-2010 02:17
Take care about how to use XMLReader::$isElementEmpty. I don't know if it is a bug or not, but $isElementEmpty is set for the current context and NOT just for the element. If you move your cursor to an attribute, $isElementEmpty will ALWAYS be false.

<?php
 $xml = new XMLReader();
 $xml->XML('<tag attr="value" />');
 $xml->read();
 var_dump($xml->isEmptyElement);
 $xml->moveToNextAttribute();
 var_dump($xml->isEmptyElement);
?>

will output

(bool) true
(bool) false

So be sure to store $isEmptyElement before moving the cursor.
jart (at) mail.ru 23-Sep-2010 06:59
Guys, I hope this example will help
you can erase prints showing the process-
and it will be a piece of nice code.

<?php
function xml2assoc($xml, $name)
{
    print "<ul>";

    $tree = null;
    print("I'm inside " . $name . "<br>");

    while($xml->read())
    {
        if($xml->nodeType == XMLReader::END_ELEMENT)
        {
            print "</ul>";
            return $tree;
        }

        else if($xml->nodeType == XMLReader::ELEMENT)
        {
            $node = array();

            print("Adding " . $xml->name ."<br>");
            $node['tag'] = $xml->name;

            if($xml->hasAttributes)
            {
                $attributes = array();
                while($xml->moveToNextAttribute())
                {
                    print("Adding attr " . $xml->name ." = " . $xml->value . "<br>");
                    $attributes[$xml->name] = $xml->value;
                }
                $node['attr'] = $attributes;
            }

            if(!$xml->isEmptyElement)
            {
                $childs = xml2assoc($xml, $node['tag']);
                $node['childs'] = $childs;
            }

            print($node['tag'] . " added <br>");
            $tree[] = $node;
        }

        else if($xml->nodeType == XMLReader::TEXT)
        {
            $node = array();
            $node['text'] = $xml->value;
            $tree[] = $node;
            print "text added = " . $node['text'] . "<br>";
        }
    }

    print "returning " . count($tree) . " childs<br>";
    print "</ul>";

    return $tree;
}

echo "<PRE>";

$xml = new XMLReader();
$xml->open('test.xml');
$assoc = xml2assoc($xml, "root");
$xml->close();

print_r($assoc);
echo "</PRE>";

?>

It reads this xml:

<test>
    <hallo volume="loud"> me <br/> lala </hallo>
    <hallo> me </hallo>
</test>
jnettles at inccrra dot org 02-Oct-2009 09:51
Just in case someone is confused, if you're wanting to simply pass a string of XML instead of an entire file, you would do this.

<?php
$foo = new XMLReader();
$foo->xml($STRING);
?>

.... where $STRING holds your XML. You cannot pass it like $foo = $STRING or $foo->xml = $STRING.
james dot ellis at example dot com 25-Mar-2009 03:16
The "XML2Assoc" functions noted here should be used with caution... basically they are duplicating the functionality already present in SimpleXML. They may work but they won't scale.

Their are two main uses cases for parsing XML, each suited to either XMLReader or SimpleXML.

1. SimpleXML is an excellent tool for easy access to an XML document tree using native PHP data types. It starts to flounder with massive (> 50M or so) XML documents, as it reads the entire document into memory before it can be processed. SimpleXML will just laugh at you then die when your server runs out of memory (or it will cause a load spike).

2. Aside from the reasoning behind massive XML documents, if you have to deal with massive XML documents, use XMLReader to process them. Don't try and gather an entire XML document into a PHP data structure using XMLReader and a PHP xml2assoc() function, you are reinventing the SimpleXML wheel.
When parsing massive XML documents using XMLReader, gather the data you need to perform an operation then perform it before skipping to the next node. Do not build massive data structures from a massive XML document, your server (and it's admins) will not like you.
PxL 23-Jan-2009 03:36
A basic parser

<?php
function xml2assoc($xml) {
    $arr = array();
    if (!preg_match_all('|\<\s*?(\w+).*?\>(.*)\<\/\s*\\1.*?\>|s', $xml, $m)) return $xml;
    if (is_array($m[1]))
        for ($i = 0;$i < sizeof($m[1]); $i++) $arr[$m[1][$i]] = xml2assoc($m[2][$i]);
    else $arr[$m[1]] = xml2assoc($m[2]);

    return $arr;
}
?>
boukeversteegh at gmail dot com 18-Jan-2009 02:06
XML to ASSOCIATIVE ARRAY

Improved algorithm based on Sergey Aikinkulov's. The problem was that it would overwrite nodes if they had the same tag name. Because of that <a><b/><b/><a> would be read as if <a><b/><a/>. This algorithm handles it better and outputs an easy to understand array:

<?php
function xml2assoc($xml) {
    $tree = null;
    while($xml->read())
        switch ($xml->nodeType) {
            case XMLReader::END_ELEMENT: return $tree;
            case XMLReader::ELEMENT:
                $node = array('tag' => $xml->name, 'value' => $xml->isEmptyElement ? '' : xml2assoc($xml));
                if($xml->hasAttributes)
                    while($xml->moveToNextAttribute())
                        $node['attributes'][$xml->name] = $xml->value;
                $tree[] = $node;
            break;
            case XMLReader::TEXT:
            case XMLReader::CDATA:
                $tree .= $xml->value;
        }
    return $tree;
}

?>

Usage:

myxml.xml:
------
<PERSON>
    <NAME>John</NAME>
    <PHONE type="home">555-555-555</PHONE>
</PERSON>
----

<?
    $xml = new XMLReader();
    $xml->open('myxml.xml');
    $assoc = xml2assoc($xml);
    $xml->close();
    print_r($assoc);
?>

Outputs:
Array
(
    [0] => Array
        (
            [tag] => PERSON
            [value] => Array
                (
                    [0] => Array
                        (
                            [tag] => NAME
                            [value] => John
                        )

                    [1] => Array
                        (
                            [tag] => PHONE
                            [value] => 555-555-555
                            [attributes] => Array
                                (
                                    [type] => home
                                )

                        )

                )

        )

)

For reasons that have to do with recursion, it returns an array with the ROOT xml node as the first childNode, rather than to return only the ROOT node.
andrei_antal at yahoo dot com 08-Jan-2009 08:25
<?php
//Pull certain elements
 $reader = new XMLReader();
  $reader->open($xmlfile);
while ($reader->read()) {
 switch ($reader->nodeType) {
   case (XMLREADER::ELEMENT):

if ($reader->name == "Code")
     {
       $reader->read();
       $code = trim($reader->value);
       echo "$code\n";
       break;
     }

 if ($reader->name == "Name")
     {
       $reader->read();
       $customername = trim( $reader->value );
       echo "$name\n";
       break;
     }

 if ($reader->name == "Camp")
    {
      $camp = trim($reader->getAttribute("ID"));
       echo "$camp\n";
      break;
    }
  }
}
?>
godseth at o2 dot pl 28-Nov-2008 02:34
Thanks rein_baarsma33 AT hotmail DOT com for bugfixes.

This is my new child of XML parsing method  based on my and yours modification.

XML2ASSOC Is a complete solution for parsing ordinary XML

<?php
/**
 * XML2Assoc Class to creating
 * PHP Assoc Array from XML File
 *
 * @author godseth (AT) o2.pl & rein_baarsma33 (AT) hotmail.com (Bugfixes in parseXml Method)
 * @uses XMLReader
 *
 */

class Xml2Assoc {

    /**
     * Optimization Enabled / Disabled
     *
     * @var bool
     */
    protected $bOptimize = false;

    /**
     * Method for loading XML Data from String
     *
     * @param string $sXml
     * @param bool $bOptimize
     */

    public function parseString( $sXml , $bOptimize = false) {
        $oXml = new XMLReader();
        $this -> bOptimize = (bool) $bOptimize;
        try {

            // Set String Containing XML data
            $oXml->XML($sXml);

            // Parse Xml and return result
            return $this->parseXml($oXml);

        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }

    /**
     * Method for loading Xml Data from file
     *
     * @param string $sXmlFilePath
     * @param bool $bOptimize
     */
    public function parseFile( $sXmlFilePath , $bOptimize = false ) {
        $oXml = new XMLReader();
        $this -> bOptimize = (bool) $bOptimize;
        try {
            // Open XML file
            $oXml->open($sXmlFilePath);

            // // Parse Xml and return result
            return $this->parseXml($oXml);

        } catch (Exception $e) {
            echo $e->getMessage(). ' | Try open file: '.$sXmlFilePath;
        }
    }

    /**
     * XML Parser
     *
     * @param XMLReader $oXml
     * @return array
     */
    protected function parseXml( XMLReader $oXml ) {

        $aAssocXML = null;
        $iDc = -1;

        while($oXml->read()){
            switch ($oXml->nodeType) {

                case XMLReader::END_ELEMENT:

                    if ($this->bOptimize) {
                        $this->optXml($aAssocXML);
                    }
                    return $aAssocXML;

                case XMLReader::ELEMENT:

                    if(!isset($aAssocXML[$oXml->name])) {
                        if($oXml->hasAttributes) {
                            $aAssocXML[$oXml->name][] = $oXml->isEmptyElement ? '' : $this->parseXML($oXml);
                        } else {
                            if($oXml->isEmptyElement) {
                                $aAssocXML[$oXml->name] = '';
                            } else {
                                $aAssocXML[$oXml->name] = $this->parseXML($oXml);
                            }
                        }
                    } elseif (is_array($aAssocXML[$oXml->name])) {
                        if (!isset($aAssocXML[$oXml->name][0]))
                        {
                            $temp = $aAssocXML[$oXml->name];
                            foreach ($temp as $sKey=>$sValue)
                            unset($aAssocXML[$oXml->name][$sKey]);
                            $aAssocXML[$oXml->name][] = $temp;
                        }

                        if($oXml->hasAttributes) {
                            $aAssocXML[$oXml->name][] = $oXml->isEmptyElement ? '' : $this->parseXML($oXml);
                        } else {
                            if($oXml->isEmptyElement) {
                                $aAssocXML[$oXml->name][] = '';
                            } else {
                                $aAssocXML[$oXml->name][] = $this->parseXML($oXml);
                            }
                        }
                    } else {
                        $mOldVar = $aAssocXML[$oXml->name];
                        $aAssocXML[$oXml->name] = array($mOldVar);
                        if($oXml->hasAttributes) {
                            $aAssocXML[$oXml->name][] = $oXml->isEmptyElement ? '' : $this->parseXML($oXml);
                        } else {
                            if($oXml->isEmptyElement) {
                                $aAssocXML[$oXml->name][] = '';
                            } else {
                                $aAssocXML[$oXml->name][] = $this->parseXML($oXml);
                            }
                        }
                    }

                    if($oXml->hasAttributes) {
                        $mElement =& $aAssocXML[$oXml->name][count($aAssocXML[$oXml->name]) - 1];
                        while($oXml->moveToNextAttribute()) {
                            $mElement[$oXml->name] = $oXml->value;
                        }
                    }
                    break;
                case XMLReader::TEXT:
                case XMLReader::CDATA:

                    $aAssocXML[++$iDc] = $oXml->value;

            }
        }

        return $aAssocXML;
    }

    /**
     * Method to optimize assoc tree.
     * ( Deleting 0 index when element
     *  have one attribute / value )
     *
     * @param array $mData
     */
    public function optXml(&$mData) {
        if (is_array($mData)) {
            if (isset($mData[0]) && count($mData) == 1 ) {
                $mData = $mData[0];
                if (is_array($mData)) {
                    foreach ($mData as &$aSub) {
                        $this->optXml($aSub);
                    }
                }
            } else {
                foreach ($mData as &$aSub) {
                    $this->optXml($aSub);
                }
            }
        }
    }

}

?>

[EDIT BY danbrown AT php DOT net:  Fixes were also provided by "Alex" and (qdog AT qview DOT org) in user notes on this page (since removed).]
Sergey Aikinkulov 19-Jun-2008 03:51
Next version xml2assoc with some improve fixes:
 - no doubled data
 - no buffer arrays

<?php
/*
    Read XML structure to associative array
    --
    Using:
    $xml = new XMLReader();
    $xml->open([XML file]);
    $assoc = xml2assoc($xml);
    $xml->close();
*/
    function xml2assoc($xml) {
      $assoc = null;
      while($xml->read()){
        switch ($xml->nodeType) {
          case XMLReader::END_ELEMENT: return $assoc;
          case XMLReader::ELEMENT:
            $assoc[$xml->name][] = array('value' => $xml->isEmptyElement ? '' : xml2assoc($xml));
            if($xml->hasAttributes){
              $el =& $assoc[$xml->name][count($assoc[$xml->name]) - 1];
              while($xml->moveToNextAttribute()) $el['attributes'][$xml->name] = $xml->value;
            }
            break;
          case XMLReader::TEXT:
          case XMLReader::CDATA: $assoc .= $xml->value;
        }
      }
      return $assoc;
    }
?>
desk_ocean at msn dot com 16-Mar-2008 10:03
make some modify from Sergey Aikinkulov's note

<?php
function xml2assoc(&$xml){
    $assoc = NULL;
    $n = 0;
    while($xml->read()){
        if($xml->nodeType == XMLReader::END_ELEMENT) break;
        if($xml->nodeType == XMLReader::ELEMENT and !$xml->isEmptyElement){
            $assoc[$n]['name'] = $xml->name;
            if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
            $assoc[$n]['val'] = xml2assoc($xml);
            $n++;
        }
        else if($xml->isEmptyElement){
            $assoc[$n]['name'] = $xml->name;
            if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
            $assoc[$n]['val'] = "";
            $n++;
        }
        else if($xml->nodeType == XMLReader::TEXT) $assoc = $xml->value;
    }
    return $assoc;
}
?>

add else if($xml->isEmptyElement)
may be some xml has emptyelement
itari 15-Feb-2008 08:30
<?php
function parseXML($node,$seq,$path) {
global $oldpath;
    if (!$node->read())
      return;
    if ($node->nodeType != 15) {
      print '<br/>'.$node->depth;
      print '-'.$seq++;
      print '  '.$path.'/'.($node->nodeType==3?'text() = ':$node->name);
      print $node->value;
      if ($node->hasAttributes) {
        print ' [hasAttributes: ';
        while ($node->moveToNextAttribute()) print '@'.$node->name.' = '.$node->value.' ';
        print ']';
        }
      if ($node->nodeType == 1) {
        $oldpath=$path;
        $path.='/'.$node->name;
        }
      parseXML($node,$seq,$path);
      }
    else parseXML($node,$seq,$oldpath);
}

$source = "<tag1>this<tag2 id='4' name='foo'>is</tag2>a<tag2 id='5'>common</tag2>record</tag1>";
$xml = new XMLReader();
$xml->XML($source);
print htmlspecialchars($source).'<br/>';
parseXML($xml,0,'');
?>

Output:

<tag1>this<tag2 id='4' name='foo'>is</tag2>a<tag2 id='5'>common</tag2>record</tag1>

0-0 /tag1
1-1 /tag1/text() = this
1-2 /tag1/tag2 [hasAttributes: @id = 4 @name = foo ]
2-3 /tag1/text() = is
1-4 /text() = a
1-5 /tag2 [hasAttributes: @id = 5 ]
2-6 /text() = common
1-7 /text() = record
orion at ftf-hq dot dk 15-Feb-2006 04:50
Some more documentation (i.e. examples) would be nice :-)

This is how I read some mysql parameters in an xml file:

<?php
    $xml = new XMLReader();
    $xml->open("config.xml");
    $xml->setParserProperty(2,true); // This seems a little unclear to me - but it worked :)

    while ($xml->read()) {
        switch ($xml->name) {
        case "mysql_host":
            $xml->read();
            $conf["mysql_host"] = $xml->value;
            $xml->read();
            break;
        case "mysql_username":
            $xml->read();
            $conf["mysql_user"] = $xml->value;
            $xml->read();
            break;
        case "mysql_password":
            $xml->read();
            $conf["mysql_pass"] = $xml->value;
            $xml->read();
            break;
        case "mysql_database":
            $xml->read();
            $conf["mysql_db"] = $xml->value;
            $xml->read();
            break;
        }
    }

    $xml->close();
?>

The XML file used:
<?xml version='1.0'?>
<MySQL_INIT>
   <mysql_host>localhost</mysql_host>
   <mysql_database>db_database</mysql_database>
   <mysql_username>root</mysql_username>
   <mysql_password>password</mysql_password>
</MySQL_INIT>


Ferme l'entrée XMLReader

  • « XMLReader
  • XMLReader::expand »
  • PHP Manual
  • XMLReader
  • Ferme l'entrée XMLReader

XMLReader::close

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::close — Ferme l'entrée XMLReader

Description

public XMLReader::close ( ) : bool

Ferme l'entrée de l'objet XMLReader qui est en train d'être analysé.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • XMLReader::open() - Fixe le URI contenant le XML à analyser
  • XMLReader::xml() - Fixe les données contenant le XML à analyser

User Contributed Notes

There are no user contributed notes for this page.


Retourne une copie du noeud courant comme un noeud d'objet DOM

  • « XMLReader::close
  • XMLReader::getAttribute »
  • PHP Manual
  • XMLReader
  • Retourne une copie du noeud courant comme un noeud d'objet DOM

XMLReader::expand

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::expand — Retourne une copie du noeud courant comme un noeud d'objet DOM

Description

public XMLReader::expand ( DOMNode|null $baseNode = null ) : DOMNode|false

Cette méthode copie le noeud courant et retourne l'objet approprié DOM.

Liste de paramètres

baseNode

Un DOMNode définissant la cible DOMDocument pour l'objet DOM créé.

Valeurs de retour

L'objet DOMNode résultant ou false en cas d'erreur.

User Contributed Notes

There are no user contributed notes for this page.


Récupère la valeur d'un attribut par nom

  • « XMLReader::expand
  • XMLReader::getAttributeNo »
  • PHP Manual
  • XMLReader
  • Récupère la valeur d'un attribut par nom

XMLReader::getAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::getAttribute — Récupère la valeur d'un attribut par nom

Description

public XMLReader::getAttribute ( string $name ) : string|null

Retourne la valeur d'un attribut par nom ou null si l'attribut n'existe pas ou n'est pas positionné sur le noeud.

Liste de paramètres

name

Le nom de l'attribut.

Historique

Version | Description
8.0.0 | Cette fonction ne peut plus retourner false.

Valeurs de retour

La valeur de l'attribut ou null si l'attribut avec le name donné n'existe pas ou n'est pas positionné sur le nœud d'un élément.

Voir aussi

  • XMLReader::getAttributeNo() - Récupère la valeur d'un attribut par index
  • XMLReader::getAttributeNs() - Récupère la valeur d'un attribut par nom local et URI

User Contributed Notes

Anonymous 16-Feb-2011 09:02
Or use XMLReader::ELEMENT and XMLReader::END_ELEMENT rather than the numbers 1 and 15.
Gabi 02-Jul-2007 08:15
might be obvious, but not to everyone ;-) ... when reading attributes from a node that has sub-nodes (and creating an output from this node), the output will be issued twice, once on the <ELEMENT> tag and once on the end tag </ELEMENT>. To avoid this, you can test on which part of the node you are using the property nodeType.
It'll be 1 for the element, 15 for the end element.


Récupère la valeur d'un attribut par index

  • « XMLReader::getAttribute
  • XMLReader::getAttributeNs »
  • PHP Manual
  • XMLReader
  • Récupère la valeur d'un attribut par index

XMLReader::getAttributeNo

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::getAttributeNo — Récupère la valeur d'un attribut par index

Description

public XMLReader::getAttributeNo ( int $index ) : string|null

Retourne la valeur d'un attribut basé sur sa position ou d'une chaîne de caractères vide si l'attribut n'existe pas ou n'est pas positionné sur le noeud.

Liste de paramètres

index

La position de l'attribut.

Valeurs de retour

La valeur de l'attribut, une chaîne de caractères vide (avant PHP 5.6) ou null (depuis PHP 5.6) si aucun attribut n'existe à index ou n'est pas positionné sur l'élément.

Historique

Version | Description
5.6.0 | XMLReader::getAttributeNo() retourne maintenant null si l'attribut n'existe pas.

Voir aussi

  • XMLReader::getAttribute() - Récupère la valeur d'un attribut par nom
  • XMLReader::getAttributeNs() - Récupère la valeur d'un attribut par nom local et URI

User Contributed Notes

There are no user contributed notes for this page.


Récupère la valeur d'un attribut par nom local et URI

  • « XMLReader::getAttributeNo
  • XMLReader::getParserProperty »
  • PHP Manual
  • XMLReader
  • Récupère la valeur d'un attribut par nom local et URI

XMLReader::getAttributeNs

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::getAttributeNs — Récupère la valeur d'un attribut par nom local et URI

Description

public XMLReader::getAttributeNs ( string $name , string $namespace ) : string|null

Retourne la valeur d'un attribut par nom et espace de nom URI ou une chaîne de caractères vide si l'attribut n'existe pas ou n'est pas positionné sur le noeud.

Liste de paramètres

name

Le nom local.

namespace

L'espace de nom URI.

Valeurs de retour

La valeur de l'attribut, une chaîne de caractères vide (avant PHP 5.6), ou null (depuis PHP 5.6) si aucun attribut avec le name et namespace donnés n'est trouvé ou positionné sur l'élément.

Historique

Version | Description
8.0.0 | Cette fonction ne peut plus retourner false.
5.6.0 | XMLReader::getAttributeNS() retourne maintenant null si l'attribut n'existe pas.

Voir aussi

  • XMLReader::getAttribute() - Récupère la valeur d'un attribut par nom
  • XMLReader::getAttributeNo() - Récupère la valeur d'un attribut par index

User Contributed Notes

There are no user contributed notes for this page.


Indique si la propriété spécifiée a été fixée

  • « XMLReader::getAttributeNs
  • XMLReader::isValid »
  • PHP Manual
  • XMLReader
  • Indique si la propriété spécifiée a été fixée

XMLReader::getParserProperty

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::getParserProperty — Indique si la propriété spécifiée a été fixée

Description

public XMLReader::getParserProperty ( int $property ) : bool

Indique si la propriété spécifiée a été fixée.

Liste de paramètres

property

Une des constantes d'analyseur.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • XMLReader::setParserProperty() - Fixe des options pour l'analyseur

User Contributed Notes

There are no user contributed notes for this page.


Indique si le document analysé est valide

  • « XMLReader::getParserProperty
  • XMLReader::lookupNamespace »
  • PHP Manual
  • XMLReader
  • Indique si le document analysé est valide

XMLReader::isValid

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::isValid — Indique si le document analysé est valide

Description

public XMLReader::isValid ( ) : bool

Retourne un booléen indiquant si le document qui est en train d'être analysé est valide.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Validation XML

<?php
$xml = XMLReader::open('test.xml');

// L'option de validation de l'analyseur doit être
// active pour que cette méthode fonctionne correctement
$xml->setParserProperty(XMLReader::VALIDATE, true);

var_dump($xml->isValid());
?>

Notes

Note: Cette méthode vérifie le noeud courant, et non le document complet.

Voir aussi

  • XMLReader::setParserProperty() - Fixe des options pour l'analyseur
  • XMLReader::setRelaxNGSchema() - Fixe le nom du fichier ou l'URI pour le Schéma RelaxNG
  • XMLReader::setRelaxNGSchemaSource() - Spécifie le schéma RelaxNG
  • XMLReader::setSchema() - Valide le document avec XSD

User Contributed Notes

zubin at trattonuovo dot com 20-Jan-2010 03:00
I encountered some problems to use isValid method with xml2assoc function.
I use this way to validate the entire xml file and put it into an associative array.

$xml = new XMLReader();
if (!$xml->xml($xml_string, NULL, LIBXML_DTDVALID)) {
  echo "XML not valid: load error";
  exit();
}

libxml_use_internal_errors(TRUE);

$xml_array = xml2assoc($xml);

$arErrors = libxml_get_errors();
$xml_errors = "";
foreach ($arErrors AS $xmlError) $xml_errors .= $xmlError->message;
if ($xml_errors != "") {
  echo "XML not valid: ".$xml_errors;
  exit();
}

//all ok
remy dot damour at laposte dot net 31-Dec-2008 03:27
1. If you validate against relax-ng, no need to call $xml->setParserProperty(XMLReader::VALIDATE, true);

2. Be aware that $xml->isValid() will return validity for currently active node (ie. node currently positioned using $xml->read()). It won't check validity of your entire tree at once, but rather on a step by step basis
anzenews at volja dot net 22-Jan-2008 10:50
This comment is only partially correct:
"isValid() always returns false unless you enable checking for validity by $reader->setParserProperty(XMLReader::VALIDATE, true);"
This enables DTD checking, but you can also check by using RelaxNG (see setRelaxNGSchema() and setRelaxNGSchemaSource()).

And also, this is NOT correct:
"If you just need to check if XML file is well formed, successful loading into XMLReader object is usually enough."
It is not enough. Pull parsers operate on stream and if you have a large enough file they will not know it is well formed until it is read to the end. If you need to know if it is well formed or/and valid, read it till the end or validation error (you can use next() for fast reading if you don't care about contents).


Consulte l'espace de nom pour un préfixe

  • « XMLReader::isValid
  • XMLReader::moveToAttribute »
  • PHP Manual
  • XMLReader
  • Consulte l'espace de nom pour un préfixe

XMLReader::lookupNamespace

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::lookupNamespace — Consulte l'espace de nom pour un préfixe

Description

public XMLReader::lookupNamespace ( string $prefix ) : string|null

Consulte dans la portée de l'espace de nom pour un préfixe donné.

Liste de paramètres

prefix

Chaînes de caractères contenant le préfixe.

Valeurs de retour

La valeur de l'espace de nom, ou null si aucun espace de nom existe.

Historique

Version | Description
8.0.0 | Cette fonction ne peut plus retourner false.

User Contributed Notes

There are no user contributed notes for this page.


Déplace un curseur à un attribut nommé

  • « XMLReader::lookupNamespace
  • XMLReader::moveToAttributeNo »
  • PHP Manual
  • XMLReader
  • Déplace un curseur à un attribut nommé

XMLReader::moveToAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::moveToAttribute — Déplace un curseur à un attribut nommé

Description

public XMLReader::moveToAttribute ( string $name ) : bool

Positionne le curseur sur l'attribut nommé.

Liste de paramètres

name

Le nom de l'attribut.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • XMLReader::moveToElement() - Positionne le curseur sur l'élément parent de l'attribut courant
  • XMLReader::moveToAttributeNo() - Déplace le curseur à un attribut par index
  • XMLReader::moveToAttributeNs() - Déplace le curseur à un attribut d'espace de nom
  • XMLReader::moveToFirstAttribute() - Positionne le curseur sur le premier attribut

User Contributed Notes

There are no user contributed notes for this page.


Déplace le curseur à un attribut par index

  • « XMLReader::moveToAttribute
  • XMLReader::moveToAttributeNs »
  • PHP Manual
  • XMLReader
  • Déplace le curseur à un attribut par index

XMLReader::moveToAttributeNo

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::moveToAttributeNo — Déplace le curseur à un attribut par index

Description

public XMLReader::moveToAttributeNo ( int $index ) : bool

Positionne le curseur sur l'attribut basé sur sa position.

Liste de paramètres

index

La position de l'attribut.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • XMLReader::moveToElement() - Positionne le curseur sur l'élément parent de l'attribut courant
  • XMLReader::moveToAttribute() - Déplace un curseur à un attribut nommé
  • XMLReader::moveToAttributeNs() - Déplace le curseur à un attribut d'espace de nom
  • XMLReader::moveToFirstAttribute() - Positionne le curseur sur le premier attribut

User Contributed Notes

There are no user contributed notes for this page.


Déplace le curseur à un attribut d'espace de nom

  • « XMLReader::moveToAttributeNo
  • XMLReader::moveToElement »
  • PHP Manual
  • XMLReader
  • Déplace le curseur à un attribut d'espace de nom

XMLReader::moveToAttributeNs

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::moveToAttributeNs — Déplace le curseur à un attribut d'espace de nom

Description

public XMLReader::moveToAttributeNs ( string $name , string $namespace ) : bool

Positionne le curseur sur le nom de l'attribut dans l'espace de nom spécifié.

Liste de paramètres

name

Le nom local.

namespace

L'espace de nom URI.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • XMLReader::moveToElement() - Positionne le curseur sur l'élément parent de l'attribut courant
  • XMLReader::moveToAttribute() - Déplace un curseur à un attribut nommé
  • XMLReader::moveToAttributeNo() - Déplace le curseur à un attribut par index
  • XMLReader::moveToFirstAttribute() - Positionne le curseur sur le premier attribut

User Contributed Notes

There are no user contributed notes for this page.


Positionne le curseur sur l'élément parent de l'attribut courant

  • « XMLReader::moveToAttributeNs
  • XMLReader::moveToFirstAttribute »
  • PHP Manual
  • XMLReader
  • Positionne le curseur sur l'élément parent de l'attribut courant

XMLReader::moveToElement

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::moveToElement — Positionne le curseur sur l'élément parent de l'attribut courant

Description

public XMLReader::moveToElement ( ) : bool

Déplace le curseur de l'élément parent de l'attribut courant.

Valeurs de retour

Retourne true en cas de succès et false en cas d'échec ou non positionné sur un attribut lorsque cette méthode est appelée.

Voir aussi

  • XMLReader::moveToAttribute() - Déplace un curseur à un attribut nommé
  • XMLReader::moveToAttributeNo() - Déplace le curseur à un attribut par index
  • XMLReader::moveToAttributeNs() - Déplace le curseur à un attribut d'espace de nom
  • XMLReader::moveToFirstAttribute() - Positionne le curseur sur le premier attribut

User Contributed Notes

Sean Colin Ruiz 08-Jan-2017 08:54
On an element like this: <self_closing attribute="1" /> isEmptyElement will return FALSE after you have iterated through the attributes.  So you need to use implicitly call moveToElement(), in order to move the cursor back to the parent element and use isEmptyElement again.


Positionne le curseur sur le premier attribut

  • « XMLReader::moveToElement
  • XMLReader::moveToNextAttribute »
  • PHP Manual
  • XMLReader
  • Positionne le curseur sur le premier attribut

XMLReader::moveToFirstAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::moveToFirstAttribute — Positionne le curseur sur le premier attribut

Description

public XMLReader::moveToFirstAttribute ( ) : bool

Déplace le curseur sur le premier attribut.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • XMLReader::moveToElement() - Positionne le curseur sur l'élément parent de l'attribut courant
  • XMLReader::moveToAttribute() - Déplace un curseur à un attribut nommé
  • XMLReader::moveToAttributeNo() - Déplace le curseur à un attribut par index
  • XMLReader::moveToAttributeNs() - Déplace le curseur à un attribut d'espace de nom
  • XMLReader::moveToNextAttribute() - Positionne le curseur sur le prochain attribut

User Contributed Notes

There are no user contributed notes for this page.


Positionne le curseur sur le prochain attribut

  • « XMLReader::moveToFirstAttribute
  • XMLReader::next »
  • PHP Manual
  • XMLReader
  • Positionne le curseur sur le prochain attribut

XMLReader::moveToNextAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::moveToNextAttribute — Positionne le curseur sur le prochain attribut

Description

public XMLReader::moveToNextAttribute ( ) : bool

Déplace le curseur sur le prochain attribut si positionné sur un attribut ou déplace sur le premier attribut si positionné sur un élément.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • XMLReader::moveToElement() - Positionne le curseur sur l'élément parent de l'attribut courant
  • XMLReader::moveToAttribute() - Déplace un curseur à un attribut nommé
  • XMLReader::moveToAttributeNo() - Déplace le curseur à un attribut par index
  • XMLReader::moveToAttributeNs() - Déplace le curseur à un attribut d'espace de nom
  • XMLReader::moveToFirstAttribute() - Positionne le curseur sur le premier attribut

User Contributed Notes

There are no user contributed notes for this page.


Déplace le curseur au prochain noeud en sautant tous les sous arbres

  • « XMLReader::moveToNextAttribute
  • XMLReader::open »
  • PHP Manual
  • XMLReader
  • Déplace le curseur au prochain noeud en sautant tous les sous arbres

XMLReader::next

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::next — Déplace le curseur au prochain noeud en sautant tous les sous arbres

Description

public XMLReader::next ( string|null $name = null ) : bool

Positionne le curseur sur le prochain noeud en sautant tous les sous arbres. Si aucun noeud existe, le curseur est déplacé à la fin du document.

Liste de paramètres

name

Le nom du prochaine noeud à se déplacer.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | name est désormais nullable.

Voir aussi

  • XMLReader::moveToNextAttribute() - Positionne le curseur sur le prochain attribut
  • XMLReader::moveToElement() - Positionne le curseur sur l'élément parent de l'attribut courant
  • XMLReader::moveToAttribute() - Déplace un curseur à un attribut nommé

User Contributed Notes

Quiet Noise 13-Apr-2019 01:39
next() without parameters will bring you to the next sibling node on the same depth as the depth where the current cursor is.
Examples:
1. If you are on an opening ELEMENT node next() will bring you to the new line node next to the closing tag of that element (i.e. if you have each tag in separate line) or it will bring you to the opening tag of next node on the same depth.
2. If you are on a TEXT node next() will bring you to the opening tag if there is one next to it.

If there are no more nodes on the given depth next() will bring you to the closing tag (END_ELEMENT) of the wrapping parent.
ppp dot BOTSNEEDNOTAPPLY at salesfloor dot net 08-Sep-2015 09:48
This method appears to follow these rules:

 - if $localName names a sibling node, the cursor is moved to that node;
 - if $localName names an ancestor node, the cursor is moved to the end of that node;
 - if $localName names a node that is a sibling of any of the current node's ancestors, the cursor is moved to that node;
 - otherwise the cursor is moved outside the document.

Note especially that this method never moves the cursor to child nodes.

For example, given this XML document

<?xml version="1.0" encoding="UTF-8"?>
<root id="root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <aaa id="1">
    <bbb id="1.1"></bbb>
    <bbb id="1.2"></bbb>
  </aaa>
  <ccc id="2" />
  <aaa id="3">
    <ddd id="3.1">
      <aaa id="3.1.1"></aaa>
    </ddd>
    <aaa id="3.2"></aaa>
  </aaa>
  <aaa id="4">
    <eee id="4.1"></eee>
  </aaa>
</root>

going from <root id="root"> to "bbb" places the cursor outside the document;
going from <aaa id="1"> to "bbb" places the cursor outside the document;
going from <aaa id="1"> to "aaa" places the cursor on <aaa id="3">;
going from <bbb id="1.1"> to "bbb" places the cursor on <bbb id="1.2">;
going from <bbb id="1.2"> to "bbb" places the cursor outside the document;
going from <bbb id="1.1"> to "ddd" places the cursor outside the document;
going from <bbb id="1.1"> to "aaa" places the cursor on </aaa>;
going from <bbb id="1.1"> to "ccc" places the cursor on <ccc id="2">;
going from <bbb id="1.1"> to "nonsuch" places the cursor outside the document;
going from <bbb id="1.1"> to "root" places the cursor on </root>;
going from <ddd id="3.1"> to "aaa" places the cursor on <aaa id="3.2">;
going from <ddd id="3.1"> to "eee" places the cursor outside the document;

Try it yourself:

<?php

$document = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<root id="root" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <aaa id="1">
    <bbb id="1.1"></bbb>
    <bbb id="1.2"></bbb>
  </aaa>
  <ccc id="2" />
  <aaa id="3">
    <ddd id="3.1">
      <aaa id="3.1.1"></aaa>
    </ddd>
    <aaa id="3.2"></aaa>
  </aaa>
  <aaa id="4">
    <eee id="4.1"></eee>
  </aaa>
</root>
XML;

$filename = "/tmp/xmlreader.php.xml";
file_put_contents($filename, $document);

echo "given this XML document\n\n$document\n\n";

showNext("root", "bbb");
showNext("1", "bbb");
showNext("1", "aaa");
showNext("1.1", "bbb");
showNext("1.2", "bbb");
showNext("1.1", "ddd");
showNext("1.1", "aaa");
showNext("1.1", "ccc");
showNext("1.1", "nonsuch");
showNext("1.1", "root");
showNext("3.1", "aaa");
showNext("3.1", "eee");

function showNext($from, $to) {
  global $filename;

  $xml = new \XmlReader();
  $xml->open("file://$filename");
  while ($xml->read()) {
    if ($xml->nodeType === \XmlReader::ELEMENT) {
      if ($xml->getAttribute("id") == $from) {
        echo "going from <$xml->name id=\"$from\">";
        break;
      }
    }
  }

  $xml->next($to);
  $destination = "";
  if($xml->nodeType === \XmlReader::NONE) {
    if(!$xml->read()) {
      $destination = "outside the document";
    }
  }

  if(!$destination) {
    if ($xml->nodeType === \XmlReader::END_ELEMENT) {
      $destination = "on </$xml->name>";
    } else if ($xml->nodeType === \XmlReader::ELEMENT) {
      $destination = "on <$xml->name id=\"" . $xml->getAttribute("id") . "\">";
    }
  }

  echo " to \"$to\" places the cursor $destination;\n";

  $xml->close();
}
?>
gholson19 at gmail dot com 13-May-2015 09:21
To skip over deletion nodes in the xml extracted from a word document, do something like this:

if ($paragraph->nodeType == XMLREADER::ELEMENT && $paragraph->name === 'w:del'){$paragraph->next();}


Fixe le URI contenant le XML à analyser

  • « XMLReader::next
  • XMLReader::read »
  • PHP Manual
  • XMLReader
  • Fixe le URI contenant le XML à analyser

XMLReader::open

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::open — Fixe le URI contenant le XML à analyser

Description

public static XMLReader::open ( string $uri , string|null $encoding = null , int $flags = 0 ) : bool|XMLReader

Fixe le URI contenant le document XML à être analysé.

Liste de paramètres

uri

URI pointant vers le document.

encoding

L'encodage du document, ou null.

flags

Un masque de constante LIBXML_*.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient. Si appelée statiquement, retourne un objet XMLReader ou false si une erreur survient.

Erreurs / Exceptions

This method may be called statically, but prior to PHP 8.0.0, will issue an E_DEPRECATED error in this case.

Historique

Version | Description
8.0.0 | XMLReader::open() est désormais déclaré comme méthode statique, mais peut toujours être appelé sur une instance de XMLReader.

Voir aussi

  • XMLReader::xml() - Fixe les données contenant le XML à analyser
  • XMLReader::close() - Ferme l'entrée XMLReader

User Contributed Notes

den at nurfuerspam dot de 29-Apr-2017 10:08
If you like to read the XML from HTTP whit a POST request, you can use libxml_set_streams_context.
Example:

<?php

$param = array('http' => array(
    'method' => 'POST',
    'header' => "Content-type: application/x-www-form-urlencoded\r\n",
    'content' => http_build_query(array(
        'post_param1' => 'value1',
        'post_param2' => 'value2',
    )),
));
libxml_set_streams_context(stream_context_create($param));
$reader = XMLReader::open('https://example.com/get.php?get_param=value3');

?>
dave at sophoservices dot com 02-Dec-2016 07:43
When using the XmlReader to read local XML files, remember it the open function requests a URI. Add 'file://' to the front of the FULL path to the XML. Otherwise you may get:

PHP Warning:  XMLReader::open(): Unable to open source data in ...
mood(_a_)twolate.com 14-Oct-2016 11:03
For some reasons, the open() method keep throwing me this error :

PHP Warning:  XMLReader::open(): Unable to open source data in /var/www/nota/ethamap/fat_xml.php

It doesn't make sense as the xml file target hosted on my server is perfectly reachable. Adding this line before invoking open() fixed it :

libxml_disable_entity_loader(false);

Please view https://bugs.php.net/bug.php?id=62577
It is somehow related.
alvaro at demogracia dot com 14-Nov-2014 12:35
XML can optionally declare its own encoding:

    <?xml version="1.0" encoding="UTF-8"?>

You can use the $encoding parameter to provide this information (if missing) or override it (if wrong).

Output is always UTF-8 (that's how libxml works).
crungmungus at gmail dot com 15-Sep-2008 05:11
Windows users remember to enable php_openssl.dll in your php.ini if you want to be able to use this function (and others) with a HTTPS URL.


Déplace le curseur sur le prochain noeud du document

  • « XMLReader::open
  • XMLReader::readInnerXml »
  • PHP Manual
  • XMLReader
  • Déplace le curseur sur le prochain noeud du document

XMLReader::read

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::read — Déplace le curseur sur le prochain noeud du document

Description

public XMLReader::read ( ) : bool

Déplace le curseur au prochain noeud texte du document.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • XMLReader::moveToElement() - Positionne le curseur sur l'élément parent de l'attribut courant
  • XMLReader::moveToAttribute() - Déplace un curseur à un attribut nommé
  • XMLReader::next() - Déplace le curseur au prochain noeud en sautant tous les sous arbres

User Contributed Notes

peter at 3xe dot co dot uk 13-Oct-2016 12:08
Another approach to the 'also reads closing tags' gotcha:

<?php
$reader = new XMLReader();
$reader->open('users.xml');

while ($reader->read()) {
  if ($reader->nodeType == XMLReader::END_ELEMENT) {
    continue; //skips the rest of the code in this iteration
  }
  //do something with desired node type
  if($reader->name == 'user') {
    //...
  }
}
?>
Anonymous 20-Mar-2015 09:49
> I would have liked to use the next() function instead, but as I needed to parse 2 different subtrees, I couldn't figure out how to find all the columns, reset the pointer, and then find all the rows.

I just use:

$reader->close();
$reader->open($url);

to reset the pointer.
ecziegler at gmail 29-Jan-2014 12:27
If like myself you have been turning the interwebz upside down looking for a solution for this issue:
PHP Warning:  XMLReader::read(): /tmp/xml_feed.xml:4183934: parser error : Input is not proper UTF-8, indicate encoding !

For some reason, this warning breaks the execution - is it a fatal error in disguise?

After days of frustration I found it!!!!
tidy -xml -o output.xml -utf8 -f error.log input.xml

You can invoque tidy using exec, It takes several seconds to convert a 250Mb feed, but it worthy the time.

In my case the issue was with latin1 charset, and for some reason I had to pass the xml through tidy 2 times - first time around creates new errors, second time it fixes everything.

I know invalid xml should be fixed by xml creators, but it works differently in the real world.
Nate 27-Jun-2011 10:49
It is interesting to note that this function will stop on closing tags as well.  I have an XML document similar to the following:

<root>
  <columns>
    <column>columnX</column>
    <column>columnY</column>
  </columns>
  <table>
    <row>
      <columnX>38</columnX>
      <columnY>50</columnY>
    </row>
    <row>
      <columnX>82</columnY>
      <columnY>28</columnY>
    </row>
    ...
  </table>
</root>

I need to parse the <columns> object to know what attributes to check for from each <row> node.  Therefore I was doing the following:

<?php
while ($xml->read()) {
  if ($xml->name === 'column') {
   //parse column node to into $columns array
  }
  elseif ($xml->name === 'row') {
    //parse row node, using constructed $columns array
  }
}
?>

This kind of worked in that I ended up with an array of all the data I wanted, but the array I constructed was twice as large as I expected and every other entry was empty.  Took me a while to debug, but finally figured out that checking <?php $xml->name === 'row' ?> matches both <row> and </row>, so the check should really be something more like:

<?php

if ($xml->name === 'row' && $xml->nodeType == XMLReader::ELEMENT) {
  // parse row node
}

?>

I would have liked to use the next() function instead, but as I needed to parse 2 different subtrees, I couldn't figure out how to find all the columns, reset the pointer, and then find all the rows.
andy at siliconrockstar dot com 16-May-2011 01:01
A very simple way to avoid typing $reader->read() multiple times when you want to skip some nodes:

<?php
class smartXMLReader extends XMLReader {
    public function readTimes($count) {
        $i = 0;
        while($i < $count){
            $this->read();
            $i++;
        }
    }
}
?>

Using this smartXMLReader,

<?php
$reader->readTimes(3);
?>

is equivalent to

<?php
$reader->read();
$reader->read();
$reader->read();
?>

Makes getting around in your XML document a bit easier :)
jirka at kosek dot cz 08-Feb-2006 01:01
libxml2 contains much more useful method readString() that will read and return whole text content of element. You can call it after receiving start tag (XMLReader::ELEMENT). You can use this PHP code to emulate this method until PHP will directly call underlying libxml2 implementation.

<?php
class XMLReader2 extends XMLReader
{
  function readString()
  {
        $depth = 1;
        $text = "";

        while ($this->read() && $depth != 0)
        {
            if (in_array($this->nodeType, array(XMLReader::TEXT, XMLReader::CDATA, XMLReader::WHITESPACE, XMLReader::SIGNIFICANT_WHITESPACE)))
                $text .= $this->value;
            if ($this->nodeType == XMLReader::ELEMENT) $depth++;
            if ($this->nodeType == XMLReader::END_ELEMENT) $depth--;
        }
        return $text;
    }
}
?>

Just use XMLReader2 instead of XMLReader.


Lit le code XML du noeud courant

  • « XMLReader::read
  • XMLReader::readOuterXml »
  • PHP Manual
  • XMLReader
  • Lit le code XML du noeud courant

XMLReader::readInnerXml

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

XMLReader::readInnerXml — Lit le code XML du noeud courant

Description

public XMLReader::readInnerXml ( ) : string

Lit le contenu du noeud courant, incluant les enfants et le balisage.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le contenu du noeud courant sous forme de chaîne. Retourne une chaîne vide en cas d'échec.

Notes

Attention

Cette fonction n'est disponible que si PHP est compilé à l'aide de la librarie libxml 20620 ou ultérieure.

Voir aussi

  • XMLReader::readString() - Lit le contenu du noeud courant sous forme de chaîne
  • XMLReader::readOuterXml() - Lit le code XML du noeud courant, y compris lui-même
  • XMLReader::expand() - Retourne une copie du noeud courant comme un noeud d'objet DOM

User Contributed Notes

Evert Pot 20-Mar-2015 08:26
Disregard my other comment.

readInnerXml does not advance the cursor, so you can call it more than once. I made a mistake testing this.
Evert Pot 20-Mar-2015 08:21
Note that readInnerXml() also advances the cursor.


Lit le code XML du noeud courant, y compris lui-même

  • « XMLReader::readInnerXml
  • XMLReader::readString »
  • PHP Manual
  • XMLReader
  • Lit le code XML du noeud courant, y compris lui-même

XMLReader::readOuterXml

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

XMLReader::readOuterXml — Lit le code XML du noeud courant, y compris lui-même

Description

public XMLReader::readOuterXml ( ) : string

Lit le code XML du noeud courant, y compris lui-même.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Lit le code XML du noeud courant, y compris lui-même, sous forme de chaîne. Retourne une chaîne vide en cas d'erreur.

Notes

Attention

Cette fonction n'est disponible que si PHP est compilé à l'aide de la librarie libxml 20620 ou ultérieure.

Voir aussi

  • XMLReader::readString() - Lit le contenu du noeud courant sous forme de chaîne
  • XMLReader::readInnerXml() - Lit le code XML du noeud courant
  • XMLReader::expand() - Retourne une copie du noeud courant comme un noeud d'objet DOM

User Contributed Notes

ralf dot horlebein at web dot de 21-Jul-2014 10:57
Please note that empty tags like <span></span> will be automatically converted to the short notation <span />.  This could cause trouble in some cases.
simon at avalon dot net dot nz 16-Mar-2011 04:35
Be aware that when you extract a piece of XML from a larger XML document using the readOuterXML() function, it tries to determine the namespaces (as defined in the original XML document) that apply to the new piece, and inserts them into the appropriate tags as xmlns attributes. This can be disconcerting, but it should be a benign alteration in most cases, and I understand that it causes the new chunk of XML to be correctly formatted so it is valid in it's own right.

As far as I'm aware it's not possible to change this behaviour.


Lit le contenu du noeud courant sous forme de chaîne

  • « XMLReader::readOuterXml
  • XMLReader::setParserProperty »
  • PHP Manual
  • XMLReader
  • Lit le contenu du noeud courant sous forme de chaîne

XMLReader::readString

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

XMLReader::readString — Lit le contenu du noeud courant sous forme de chaîne

Description

public XMLReader::readString ( ) : string

Lit le contenu du noeud courant sous forme de chaîne.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne le contenu du noeud courant sous forme de chaîne ou une chaîne vide si une erreur survient.

Notes

Attention

Cette fonction n'est disponible que si PHP est compilé à l'aide de la librarie libxml 20620 ou ultérieure.

Voir aussi

  • XMLReader::readOuterXml() - Lit le code XML du noeud courant, y compris lui-même
  • XMLReader::readInnerXml() - Lit le code XML du noeud courant
  • XMLReader::expand() - Retourne une copie du noeud courant comme un noeud d'objet DOM

User Contributed Notes

alexander_behling at web dot de 25-Jan-2018 03:37
Important:
When using it use -> instead of ::.
You have to use :: only on static functions and then you have not to create a class object.
Lea Hayes 07-Jun-2011 01:51
I would like to reiterate that this does not work when compiled with versions of libxml lower than 20620. I found that it just presents a blank page.

<?php $string = $reader->readString(); ?>

I worked around this issue by adding the following helper function:

<?php
function read_string($reader) {
    $node = $reader->expand();
    return $node->textContent;
}
?>

And then using:

<?php $string = read_string($reader); ?>
Michael Rusch 18-May-2009 10:27
For those who, like me, are having trouble figuring out the difference between getString() an getInnerXML(), the difference is that getString() does NOT include markup.  So, for:

<foo>bar<baz>Hello, world!</baz></foo>

getString() on the <foo> node would return

bar Hello, world!

whereas getInnerXML() would return

bar<baz>Hello, world!</baz>


Fixe des options pour l'analyseur

  • « XMLReader::readString
  • XMLReader::setRelaxNGSchema »
  • PHP Manual
  • XMLReader
  • Fixe des options pour l'analyseur

XMLReader::setParserProperty

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::setParserProperty — Fixe des options pour l'analyseur

Description

public XMLReader::setParserProperty ( int $property , bool $value ) : bool

Fixe des options pour l'analyseur. Les options doivent être fixées après l'appel de XMLReader::open() ou XMLReader::xml() et avant le premier appel de XMLReader::read().

Liste de paramètres

property

Une des constantes d'analyseur.

value

Si fixée à true, l'option sera activée sinon elle sera désactivée.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

User Contributed Notes

There are no user contributed notes for this page.


Fixe le nom du fichier ou l'URI pour le Schéma RelaxNG

  • « XMLReader::setParserProperty
  • XMLReader::setRelaxNGSchemaSource »
  • PHP Manual
  • XMLReader
  • Fixe le nom du fichier ou l'URI pour le Schéma RelaxNG

XMLReader::setRelaxNGSchema

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::setRelaxNGSchema — Fixe le nom du fichier ou l'URI pour le Schéma RelaxNG

Description

public XMLReader::setRelaxNGSchema ( string|null $filename ) : bool

Fixe le nom du fichier ou l'URI pour le Schéma RelaxNG à utiliser pour validation.

Liste de paramètres

filename

Nom du fichier ou URI pointant vers le Schéma RelaxNG.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • XMLReader::setRelaxNGSchemaSource() - Spécifie le schéma RelaxNG
  • XMLReader::setSchema() - Valide le document avec XSD
  • XMLReader::isValid() - Indique si le document analysé est valide

User Contributed Notes

remy dot damour at laposte dot net 30-Dec-2008 04:40
Make sure to load your data prior to calling ->setRelaxNGSchema() otherwise you will get an error.

<?php
$xml_reader = new XMLReader();
$xml_reader->setRelaxNGSchema($rng_schema);
$xml_reader->xml($xml_data);
?>
Above code generates the following warning: "Warning: XMLReader::setRelaxNGSchemaSource()
[xmlreader.setrelaxngschemasource]: Unable to set schema. This must be
set prior to reading or schema contains errors."

whereas the following does not generate a warning:
<?php
$xml_reader = new XMLReader();
$xml_reader->xml($xml_data); // or $xml_reader->xml($xml_file);
$xml_reader->setRelaxNGSchema($rng_schema);
?>

cf. http://bugs.php.net/bug.php?id=46978


Spécifie le schéma RelaxNG

  • « XMLReader::setRelaxNGSchema
  • XMLReader::setSchema »
  • PHP Manual
  • XMLReader
  • Spécifie le schéma RelaxNG

XMLReader::setRelaxNGSchemaSource

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::setRelaxNGSchemaSource — Spécifie le schéma RelaxNG

Description

public XMLReader::setRelaxNGSchemaSource ( string|null $source ) : bool

Spécifie le schéma RelaxNG à utiliser pour validation.

Liste de paramètres

source

Chaîne de caractères contenant le schéma RelaxNG.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • XMLReader::setRelaxNGSchema() - Fixe le nom du fichier ou l'URI pour le Schéma RelaxNG
  • XMLReader::setSchema() - Valide le document avec XSD
  • XMLReader::isValid() - Indique si le document analysé est valide

User Contributed Notes

remy dot damour at laposte dot net 30-Dec-2008 04:43
If you get the following warning message when calling ->setRelaxNGSchemaSource(): "Warning: XMLReader::setRelaxNGSchemaSource()
[xmlreader.setrelaxngschemasource]: Unable to set schema. This must be
set prior to reading or schema contains errors."

Make sure to load data using XMLReader::open() or XMLReader::xml() prior to calling XMLReader::setRelaxNGSchemaSource().

Cf. comment on XMLReader::setRelaxNGSchema for more details.
anzenews at volja dot net 21-Jan-2008 12:18
This function and setRelaxNGSchema() seem picky about when they are called - right after the call to open(). For example:

<?php
  $schema="/path/to/schema.rng";
  $xmlfile="/path/to/xml.xml";

  $xml = new XMLReader();
  $xml->open($xmlfile);
  $xml->setRelaxNGSchemaSource(file_get_contents($schema));

  while ($xml->read()) {
   // ...
  }

  $xml->close();
?>


Valide le document avec XSD

  • « XMLReader::setRelaxNGSchemaSource
  • XMLReader::XML »
  • PHP Manual
  • XMLReader
  • Valide le document avec XSD

XMLReader::setSchema

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

XMLReader::setSchema — Valide le document avec XSD

Description

public XMLReader::setSchema ( string|null $filename ) : bool

Utilise le schéma XSD W3C pour valider le contenu, tel qu'il est traité. L'activation n'est possible qu'avant le premier Read().

Liste de paramètres

filename

Le nom du fichier de schéma XSD.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

Émet une alerte E_WARNING si libxml a été compilé sans le support des schémas, si le schéma contient des erreurs, ou si XMLReader::read() a déjà été appelé.

Notes

Attention

Cette fonction n'est disponible que si PHP est compilé à l'aide de la librarie libxml 20620 ou ultérieure.

Voir aussi

  • XMLReader::setRelaxNGSchema() - Fixe le nom du fichier ou l'URI pour le Schéma RelaxNG
  • XMLReader::setRelaxNGSchemaSource() - Spécifie le schéma RelaxNG
  • XMLReader::isValid() - Indique si le document analysé est valide

User Contributed Notes

There are no user contributed notes for this page.


Fixe les données contenant le XML à analyser

  • « XMLReader::setSchema
  • XMLWriter »
  • PHP Manual
  • XMLReader
  • Fixe les données contenant le XML à analyser

XMLReader::XML

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

XMLReader::XML — Fixe les données contenant le XML à analyser

Description

public static XMLReader::XML ( string $source , string|null $encoding = null , int $flags = 0 ) : bool|XMLReader

Fixe les données contenant le XML à analyser.

Liste de paramètres

source

Chaîne de caractères contenant le XML à analyser.

encoding

L'encodage du document, ou null.

flags

Un masque de constantes LIBXML_*.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient. Si appelée statiquement, retourne un objet XMLReader ou false si une erreur survient.

Erreurs / Exceptions

This method may be called statically, but prior to PHP 8.0.0, will issue an E_DEPRECATED error in this case.

Historique

Version | Description
8.0.0 | XMLReader::xml() est désormais déclaré comme méthode statique, mais peut toujours être appelé sur une instance de XMLReader.

Voir aussi

  • XMLReader::open() - Fixe le URI contenant le XML à analyser
  • XMLReader::close() - Ferme l'entrée XMLReader

User Contributed Notes

There are no user contributed notes for this page.


XMLWriter

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Exemples
    • Créer un document XML basique
    • Travailler avec les espaces de noms XML
    • Travailler avec l'API OO
  • XMLWriter — La classe XMLWriter
    • XMLWriter::endAttribute — Termine un attribut
    • XMLWriter::endCdata — Termine un bloc CDATA
    • XMLWriter::endComment — Termine un commentaire
    • XMLWriter::endDocument — Termine le document courant
    • XMLWriter::endDtd — Termine la DTD courante
    • XMLWriter::endDtdAttlist — Termine la liste des attributs de la DTD courante
    • XMLWriter::endDtdElement — Termine l'élément de la DTD courante
    • XMLWriter::endDtdEntity — Termine l'entité de la DTD courante
    • XMLWriter::endElement — Termine l'élément courant
    • XMLWriter::endPi — Termine le PI courant
    • XMLWriter::flush — Affiche le buffer courant
    • XMLWriter::fullEndElement — Termine l'élément courant
    • XMLWriter::openMemory — Crée un nouveau xmlwriter en utilisant la mémoire pour l'affichage des chaînes
    • XMLWriter::openUri — Crée un nouveau xmlwriter, en utilisant l'URI source pour l'affichage
    • XMLWriter::outputMemory — Retourne le buffer courant
    • XMLWriter::setIndent — Active ou non l'indentation
    • XMLWriter::setIndentString — Définit la chaîne à utiliser pour l'indentation
    • XMLWriter::startAttribute — Crée un attribut
    • XMLWriter::startAttributeNs — Crée un attribut pour l'espace de noms
    • XMLWriter::startCdata — Crée une balise CDATA
    • XMLWriter::startComment — Crée un commentaire
    • XMLWriter::startDocument — Crée un document
    • XMLWriter::startDtd — Crée une DTD
    • XMLWriter::startDtdAttlist — Crée une liste d'attributs pour la DTD
    • XMLWriter::startDtdElement — Crée un élément DTD
    • XMLWriter::startDtdEntity — Crée une entité DTD
    • XMLWriter::startElement — Crée un élément
    • XMLWriter::startElementNs — Crée un élément d'un espace de noms
    • XMLWriter::startPi — Crée une balise PI
    • XMLWriter::text — Écrit du texte
    • XMLWriter::writeAttribute — Écrit un attribut
    • XMLWriter::writeAttributeNs — Écrit un attribut d'un espace de noms
    • XMLWriter::writeCdata — Écrit un bloc CDATA
    • XMLWriter::writeComment — Écrit un commentaire
    • XMLWriter::writeDtd — Écrit une DTD
    • XMLWriter::writeDtdAttlist — Écrit une liste d'attributs DTD
    • XMLWriter::writeDtdElement — Écrit un élément DTD
    • XMLWriter::writeDtdEntity — Écrit une entité DTD
    • XMLWriter::writeElement — Écrit un élément
    • XMLWriter::writeElementNs — Écrit un élément d'un espace de noms
    • XMLWriter::writePi — Écrit la balise PI
    • XMLWriter::writeRaw — Écrit un texte XML brut

User Contributed Notes

lingtalfi 08-Oct-2015 08:35
The single quote predefined entity is not escaped.
The other predefined entities are but not the single quote, so you will have to do it yourself.

That's what you would expect:

Ampersand     &     &amp;
Single Quote     '     &apos;
Double Quote     "     &quot;
Greater Than     >     &gt;
Less Than     <     &lt;

That's what you get with \XmlWriter:

Ampersand     &     &amp;
Single Quote     '     '
Double Quote     "     &quot;
Greater Than     >     &gt;
Less Than     <     &lt;
Alexey Zakhlestin 09-Jun-2008 03:47
important: XMLWriter expects UTF-8 data from you. It can output xml in various encodings, but input should be strictly utf-8!


Introduction

Voici l'extension XMLWriter. Elle utilise l'API libxml xmlWriter.

Cette extension permet la génération de flux et de fichiers au format XML.

Cette extension peut être utilisée dans un style orienté objet ou un style procédural. Chaque méthode documentée décrit l'appel procédural équivalent.

User Contributed Notes

There are no user contributed notes for this page.


Installation

L'extension XMLWriter était au départ une extension PECL pour PHP 5. Elle a été par la suite intégrée au source de PHP, et ce, depuis la version 5.1.2. Cette extension est activée par défaut.

Cette extension est activée par défaut. Elle peut être désactivée en utilisant l'option de configuration : --disable-xmlwriter

User Contributed Notes

There are no user contributed notes for this page.


Types de ressources

Antérieur à PHP 8.0.0, il y avait une ressource, utilisée par la version procédurale de l'extension XMLWriter : celle retournée par la fonction xmlwriter_open_memory() ou la fonction xmlwriter_open_uri().

User Contributed Notes

There are no user contributed notes for this page.


Exemples

Sommaire

  • Créer un document XML basique
  • Travailler avec les espaces de noms XML
  • Travailler avec l'API OO

User Contributed Notes

There are no user contributed notes for this page.


Créer un document XML basique

Cet exemple montre comment utiliser XMLWriter pour créer un document XML en mémoire.

Exemple #1 Créer un document XML basique

<?php

$xw = xmlwriter_open_memory();
xmlwriter_set_indent($xw, 1);
$res = xmlwriter_set_indent_string($xw, ' ');

xmlwriter_start_document($xw, '1.0', 'UTF-8');

// Un premier élément
xmlwriter_start_element($xw, 'tag1');

// Attribut 'att1' pour élément 'tag1'
xmlwriter_start_attribute($xw, 'att1');
xmlwriter_text($xw, 'valueofatt1');
xmlwriter_end_attribute($xw);

xmlwriter_write_comment($xw, 'ceci est un commentaire.');

// Début d'un élément enfant
xmlwriter_start_element($xw, 'tag11');
xmlwriter_text($xw, 'Ceci est du texte, ä');
xmlwriter_end_element($xw); // tag11

xmlwriter_end_element($xw); // tag1

// CDATA
xmlwriter_start_element($xw, 'testc');
xmlwriter_write_cdata($xw, "Ceci est du contenu cdata");
xmlwriter_end_element($xw); // testc

xmlwriter_start_element($xw, 'testc');
xmlwriter_start_cdata($xw);
xmlwriter_text($xw, "test cdata2");
xmlwriter_end_cdata($xw);
xmlwriter_end_element($xw); // testc

// Une instruction de traitement
xmlwriter_start_pi($xw, 'php');
xmlwriter_text($xw, '$foo=2;echo $foo;');
xmlwriter_end_pi($xw);

xmlwriter_end_document($xw);

echo xmlwriter_output_memory($xw);

L'exemple ci-dessus va afficher :

<?xml version="1.0" encoding="UTF-8"?>
<tag1 att1="valueofatt1">
 <!--ceci est un commentaire.-->
 <tag11>Ceci est du texte, ä</tag11>
</tag1>
<testc><![CDATA[Ceci est du contenu cdata]]></testc>
<testc><![CDATA[test cdata2]]></testc>
<?php $foo=2;echo $foo;?>

User Contributed Notes

There are no user contributed notes for this page.


Travailler avec les espaces de noms XML

Cet exemple montre comment créer des éléments dans des espaces de noms XML.

Exemple #1 Travailler avec les espaces de noms XML

<?php

$xw = xmlwriter_open_memory();
xmlwriter_set_indent($xw, 1);
$res = xmlwriter_set_indent_string($xw, ' ');

xmlwriter_start_document($xw, '1.0', 'UTF-8');
// A first element
xmlwriter_start_element_ns($xw,'prefix', 'books', 'uri');
xmlwriter_start_attribute($xw, 'isbn');

xmlwriter_start_attribute_ns($xw, 'prefix', 'isbn', 'uri');
xmlwriter_end_attribute($xw);

xmlwriter_end_attribute($xw);

xmlwriter_text($xw, 'book1');
xmlwriter_end_element($xw);

xmlwriter_end_document($xw);

echo xmlwriter_output_memory($xw);

L'exemple ci-dessus va afficher :

<?xml version="1.0" encoding="UTF-8"?>
<prefix:books isbn="" prefix:isbn="" xmlns:prefix="uri">book1</prefix:books>

User Contributed Notes

There are no user contributed notes for this page.


Travailler avec l'API OO

Cet exemple montre comment travailler avec l'API orienté objet de XMLWriter.

Exemple #1 Travailler avec l'API OO

<?php

$xw = new XMLWriter();
$xw->openMemory();
$xw->startDocument("1.0");
$xw->startElement("book");
$xw->text("example");
$xw->endElement();
$xw->endDocument();
echo $xw->outputMemory();

L'exemple ci-dessus va afficher :

<?xml version="1.0"?>
<book>example</book>

User Contributed Notes

There are no user contributed notes for this page.


La classe XMLWriter

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

Introduction

Synopsis de la classe

XMLWriter {
/* Méthodes */
public endAttribute ( ) : bool
public endCdata ( ) : bool
public endComment ( ) : bool
public endDocument ( ) : bool
public endDtd ( ) : bool
public endDtdAttlist ( ) : bool
public endDtdElement ( ) : bool
public endDtdEntity ( ) : bool
public endElement ( ) : bool
public endPi ( ) : bool
public flush ( bool $empty = true ) : string|int
public fullEndElement ( ) : bool
public openMemory ( ) : bool
public openUri ( string $uri ) : bool
public outputMemory ( bool $flush = true ) : string
public setIndent ( bool $enable ) : bool
public setIndentString ( string $indentation ) : bool
public startAttribute ( string $name ) : bool
public startAttributeNs ( string|null $prefix , string $name , string|null $namespace ) : bool
public startCdata ( ) : bool
public startComment ( ) : bool
public startDocument ( string|null $version = "1.0" , string|null $encoding = null , string|null $standalone = null ) : bool
public startDtd ( string $qualifiedName , string|null $publicId = null , string|null $systemId = null ) : bool
public startDtdAttlist ( string $name ) : bool
public startDtdElement ( string $qualifiedName ) : bool
public startDtdEntity ( string $name , bool $isParam ) : bool
public startElement ( string $name ) : bool
public startElementNs ( string|null $prefix , string $name , string|null $namespace ) : bool
public startPi ( string $target ) : bool
public text ( string $content ) : bool
public writeAttribute ( string $name , string $value ) : bool
public writeAttributeNs ( string|null $prefix , string $name , string|null $namespace , string $value ) : bool
public writeCdata ( string $content ) : bool
public writeComment ( string $content ) : bool
public writeDtd ( string $name , string|null $publicId = null , string|null $systemId = null , string|null $content = null ) : bool
public writeDtdAttlist ( string $name , string $content ) : bool
public writeDtdElement ( string $name , string $content ) : bool
public writeDtdEntity ( string $name , string $content , bool $isParam = false , string|null $publicId = null , string|null $systemId = null , string|null $notationData = null ) : bool
public writeElement ( string $name , string|null $content = null ) : bool
public writeElementNs ( string|null $prefix , string $name , string|null $namespace , string|null $content = null ) : bool
public writePi ( string $target , string $content ) : bool
public writeRaw ( string $content ) : bool
}

Sommaire

  • XMLWriter::endAttribute — Termine un attribut
  • XMLWriter::endCdata — Termine un bloc CDATA
  • XMLWriter::endComment — Termine un commentaire
  • XMLWriter::endDocument — Termine le document courant
  • XMLWriter::endDtd — Termine la DTD courante
  • XMLWriter::endDtdAttlist — Termine la liste des attributs de la DTD courante
  • XMLWriter::endDtdElement — Termine l'élément de la DTD courante
  • XMLWriter::endDtdEntity — Termine l'entité de la DTD courante
  • XMLWriter::endElement — Termine l'élément courant
  • XMLWriter::endPi — Termine le PI courant
  • XMLWriter::flush — Affiche le buffer courant
  • XMLWriter::fullEndElement — Termine l'élément courant
  • XMLWriter::openMemory — Crée un nouveau xmlwriter en utilisant la mémoire pour l'affichage des chaînes
  • XMLWriter::openUri — Crée un nouveau xmlwriter, en utilisant l'URI source pour l'affichage
  • XMLWriter::outputMemory — Retourne le buffer courant
  • XMLWriter::setIndent — Active ou non l'indentation
  • XMLWriter::setIndentString — Définit la chaîne à utiliser pour l'indentation
  • XMLWriter::startAttribute — Crée un attribut
  • XMLWriter::startAttributeNs — Crée un attribut pour l'espace de noms
  • XMLWriter::startCdata — Crée une balise CDATA
  • XMLWriter::startComment — Crée un commentaire
  • XMLWriter::startDocument — Crée un document
  • XMLWriter::startDtd — Crée une DTD
  • XMLWriter::startDtdAttlist — Crée une liste d'attributs pour la DTD
  • XMLWriter::startDtdElement — Crée un élément DTD
  • XMLWriter::startDtdEntity — Crée une entité DTD
  • XMLWriter::startElement — Crée un élément
  • XMLWriter::startElementNs — Crée un élément d'un espace de noms
  • XMLWriter::startPi — Crée une balise PI
  • XMLWriter::text — Écrit du texte
  • XMLWriter::writeAttribute — Écrit un attribut
  • XMLWriter::writeAttributeNs — Écrit un attribut d'un espace de noms
  • XMLWriter::writeCdata — Écrit un bloc CDATA
  • XMLWriter::writeComment — Écrit un commentaire
  • XMLWriter::writeDtd — Écrit une DTD
  • XMLWriter::writeDtdAttlist — Écrit une liste d'attributs DTD
  • XMLWriter::writeDtdElement — Écrit un élément DTD
  • XMLWriter::writeDtdEntity — Écrit une entité DTD
  • XMLWriter::writeElement — Écrit un élément
  • XMLWriter::writeElementNs — Écrit un élément d'un espace de noms
  • XMLWriter::writePi — Écrit la balise PI
  • XMLWriter::writeRaw — Écrit un texte XML brut

User Contributed Notes

There are no user contributed notes for this page.


Termine un attribut

  • « XMLWriter
  • XMLWriter::endCdata »
  • PHP Manual
  • XMLWriter
  • Termine un attribut

XMLWriter::endAttribute

xmlwriter_end_attribute

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endAttribute -- xmlwriter_end_attribute — Termine un attribut

Description

Style orienté objet

public XMLWriter::endAttribute ( ) : bool

Style procédural

xmlwriter_end_attribute ( XMLWriter $writer ) : bool

Termine l'attribut courant.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startAttribute() - Crée un attribut
  • XMLWriter::startAttributeNs() - Crée un attribut pour l'espace de noms
  • XMLWriter::writeAttribute() - Écrit un attribut
  • XMLWriter::writeAttributeNs() - Écrit un attribut d'un espace de noms

User Contributed Notes

There are no user contributed notes for this page.


Termine un bloc CDATA

  • « XMLWriter::endAttribute
  • XMLWriter::endComment »
  • PHP Manual
  • XMLWriter
  • Termine un bloc CDATA

XMLWriter::endCdata

xmlwriter_end_cdata

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endCdata -- xmlwriter_end_cdata — Termine un bloc CDATA

Description

Style orienté objet

public XMLWriter::endCdata ( ) : bool

Style procédural

xmlwriter_end_cdata ( XMLWriter $writer ) : bool

Termine la section CDATA courante.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startCdata() - Crée une balise CDATA
  • XMLWriter::writeCdata() - Écrit un bloc CDATA

User Contributed Notes

There are no user contributed notes for this page.


Termine un commentaire

  • « XMLWriter::endCdata
  • XMLWriter::endDocument »
  • PHP Manual
  • XMLWriter
  • Termine un commentaire

XMLWriter::endComment

xmlwriter_end_comment

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 1.0.0)

XMLWriter::endComment -- xmlwriter_end_comment — Termine un commentaire

Description

Style orienté objet

public XMLWriter::endComment ( ) : bool

Style procédural

xmlwriter_end_comment ( XMLWriter $writer ) : bool

Termine le commentaire courant.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startComment() - Crée un commentaire
  • XMLWriter::writeComment() - Écrit un commentaire

User Contributed Notes

There are no user contributed notes for this page.


Termine le document courant

  • « XMLWriter::endComment
  • XMLWriter::endDtd »
  • PHP Manual
  • XMLWriter
  • Termine le document courant

XMLWriter::endDocument

xmlwriter_end_document

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endDocument -- xmlwriter_end_document — Termine le document courant

Description

Style orienté objet

public XMLWriter::endDocument ( ) : bool

Style procédural

xmlwriter_end_document ( XMLWriter $writer ) : bool

Termine le document courant.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startDocument() - Crée un document

User Contributed Notes

There are no user contributed notes for this page.


Termine la DTD courante

  • « XMLWriter::endDocument
  • XMLWriter::endDtdAttlist »
  • PHP Manual
  • XMLWriter
  • Termine la DTD courante

XMLWriter::endDtd

xmlwriter_end_dtd

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endDtd -- xmlwriter_end_dtd — Termine la DTD courante

Description

Style orienté objet

public XMLWriter::endDtd ( ) : bool

Style procédural

xmlwriter_end_dtd ( XMLWriter $writer ) : bool

Termine la DTD courante du document.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startDtd() - Crée une DTD
  • XMLWriter::writeDtd() - Écrit une DTD

User Contributed Notes

There are no user contributed notes for this page.


Termine la liste des attributs de la DTD courante

  • « XMLWriter::endDtd
  • XMLWriter::endDtdElement »
  • PHP Manual
  • XMLWriter
  • Termine la liste des attributs de la DTD courante

XMLWriter::endDtdAttlist

xmlwriter_end_dtd_attlist

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endDtdAttlist -- xmlwriter_end_dtd_attlist — Termine la liste des attributs de la DTD courante

Description

Style orienté objet

public XMLWriter::endDtdAttlist ( ) : bool

Style procédural

xmlwriter_end_dtd_attlist ( XMLWriter $writer ) : bool

Termine la liste des attributs de la DTD courante.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startDtdAttlist() - Crée une liste d'attributs pour la DTD
  • XMLWriter::writeDtdAttlist() - Écrit une liste d'attributs DTD

User Contributed Notes

There are no user contributed notes for this page.


Termine l'élément de la DTD courante

  • « XMLWriter::endDtdAttlist
  • XMLWriter::endDtdEntity »
  • PHP Manual
  • XMLWriter
  • Termine l'élément de la DTD courante

XMLWriter::endDtdElement

xmlwriter_end_dtd_element

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endDtdElement -- xmlwriter_end_dtd_element — Termine l'élément de la DTD courante

Description

Style orienté objet

public XMLWriter::endDtdElement ( ) : bool

Style procédural

xmlwriter_end_dtd_element ( XMLWriter $writer ) : bool

Termine l'élément de la DTD courante.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startDtdElement() - Crée un élément DTD
  • XMLWriter::writeDtdElement() - Écrit un élément DTD

User Contributed Notes

There are no user contributed notes for this page.


Termine l'entité de la DTD courante

  • « XMLWriter::endDtdElement
  • XMLWriter::endElement »
  • PHP Manual
  • XMLWriter
  • Termine l'entité de la DTD courante

XMLWriter::endDtdEntity

xmlwriter_end_dtd_entity

(PHP 5 >= 5.2.1, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endDtdEntity -- xmlwriter_end_dtd_entity — Termine l'entité de la DTD courante

Description

Style orienté objet

public XMLWriter::endDtdEntity ( ) : bool

Style procédural

xmlwriter_end_dtd_entity ( XMLWriter $writer ) : bool

Termine l'entité de la DTD courante.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startDtdEntity() - Crée une entité DTD
  • XMLWriter::writeDtdEntity() - Écrit une entité DTD

User Contributed Notes

There are no user contributed notes for this page.


Termine l'élément courant

  • « XMLWriter::endDtdEntity
  • XMLWriter::endPi »
  • PHP Manual
  • XMLWriter
  • Termine l'élément courant

XMLWriter::endElement

xmlwriter_end_element

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endElement -- xmlwriter_end_element — Termine l'élément courant

Description

Style orienté objet

public XMLWriter::endElement ( ) : bool

Style procédural

xmlwriter_end_element ( XMLWriter $writer ) : bool

Termine l'élément courant.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startElement() - Crée un élément
  • XMLWriter::writeElement() - Écrit un élément

User Contributed Notes

There are no user contributed notes for this page.


Termine le PI courant

  • « XMLWriter::endElement
  • XMLWriter::flush »
  • PHP Manual
  • XMLWriter
  • Termine le PI courant

XMLWriter::endPi

xmlwriter_end_pi

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::endPi -- xmlwriter_end_pi — Termine le PI courant

Description

Style orienté objet

public XMLWriter::endPi ( ) : bool

Style procédural

xmlwriter_end_pi ( XMLWriter $writer ) : bool

Termine l'instruction courante.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startPi() - Crée une balise PI
  • XMLWriter::writePi() - Écrit la balise PI

User Contributed Notes

There are no user contributed notes for this page.


Affiche le buffer courant

  • « XMLWriter::endPi
  • XMLWriter::fullEndElement »
  • PHP Manual
  • XMLWriter
  • Affiche le buffer courant

XMLWriter::flush

xmlwriter_flush

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 1.0.0)

XMLWriter::flush -- xmlwriter_flush — Affiche le buffer courant

Description

Style orienté objet

public XMLWriter::flush ( bool $empty = true ) : string|int

Style procédural

xmlwriter_flush ( XMLWriter $writer , bool $empty = true ) : string|int

Affiche le buffer courant.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

empty

Si l'on doit vider le buffer ou non. Par défaut, ce paramètre vaut true.

Valeurs de retour

Si vous aviez ouvert le gestionnaire d'écriture en mémoire, cette fonction retourne le buffer XML généré. Si vous utilisez une URI, cette fonction écrira le buffer et retournera le nombre d'octets écrits.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
8.0.0 | Cette fonction ne peut plus retourner false.

User Contributed Notes

There are no user contributed notes for this page.


Termine l'élément courant

  • « XMLWriter::flush
  • XMLWriter::openMemory »
  • PHP Manual
  • XMLWriter
  • Termine l'élément courant

XMLWriter::fullEndElement

xmlwriter_full_end_element

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL xmlwriter >= 2.0.4)

XMLWriter::fullEndElement -- xmlwriter_full_end_element — Termine l'élément courant

Description

Style orienté objet

public XMLWriter::fullEndElement ( ) : bool

Style procédural

xmlwriter_full_end_element ( XMLWriter $writer ) : bool

Termine l'élément XML courant. Écrit une balise de fin même si l'élément est vide.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::endElement() - Termine l'élément courant

User Contributed Notes

There are no user contributed notes for this page.


Crée un nouveau xmlwriter en utilisant la mémoire pour l'affichage des chaînes

  • « XMLWriter::fullEndElement
  • XMLWriter::openUri »
  • PHP Manual
  • XMLWriter
  • Crée un nouveau xmlwriter en utilisant la mémoire pour l'affichage des chaînes

XMLWriter::openMemory

xmlwriter_open_memory

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::openMemory -- xmlwriter_open_memory — Crée un nouveau xmlwriter en utilisant la mémoire pour l'affichage des chaînes

Description

Style orienté objet

public XMLWriter::openMemory ( ) : bool

Style procédural

xmlwriter_open_memory ( ) : XMLWriter|false

Crée un nouvel objet XMLWriter, en utilisant la mémoire pour l'affichage des chaînes.

Liste de paramètres

Valeurs de retour

Style orienté objet : Cette fonction retourne true en cas de succès ou false si une erreur survient.

Style procédural : Retourne une nouvelle instance de XMLWriter pour une utilisation future avec les fonctions xmlwriter en cas de succès, ou false si une erreur survient.

Historique

Version | Description
8.0.0 | Cette fonction retourne désormais une instance de XMLWriter en cas de succès. Auparavant, une ressource était retournée dans ce cas.

Voir aussi

  • XMLWriter::openUri() - Crée un nouveau xmlwriter, en utilisant l'URI source pour l'affichage

User Contributed Notes

There are no user contributed notes for this page.


Crée un nouveau xmlwriter, en utilisant l'URI source pour l'affichage

  • « XMLWriter::openMemory
  • XMLWriter::outputMemory »
  • PHP Manual
  • XMLWriter
  • Crée un nouveau xmlwriter, en utilisant l'URI source pour l'affichage

XMLWriter::openUri

xmlwriter_open_uri

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::openUri -- xmlwriter_open_uri — Crée un nouveau xmlwriter, en utilisant l'URI source pour l'affichage

Description

Style orienté objet

public XMLWriter::openUri ( string $uri ) : bool

Style procédural

xmlwriter_open_uri ( string $uri ) : XMLWriter|false

Crée un nouveau XMLWriter, en utilisant l'uri pour l'affichage.

Liste de paramètres

uri

L'URI de la ressource pour l'affichage.

Valeurs de retour

Style orienté objet : Cette fonction retourne true en cas de succès ou false si une erreur survient.

Style procédural : Retourne une nouvelle instance de XMLWriter pour une utilisation future avec les fonctions xmlwriter en cas de succès, ou false si une erreur survient.

Historique

Version | Description
8.0.0 | Cette fonction retourne désormais une instance de XMLWriter en cas de succès. Auparavant, une ressource était retournée dans ce cas.

Exemples

Exemple #1 Écrire directement de l'XML

Il est possible d'écrire directement de l'XML en utilisant l' enveloppe de flux php://output.

<?php
$out =new XMLWriter();
$out->openURI('php://output');
?>

Notes

Note:

Sur Windows, les fichiers ouvert avec cette fonction sont vérouiller jusqu'à ce que l'objet XMLWriter est libéré.

Voir aussi

  • XMLWriter::openMemory() - Crée un nouveau xmlwriter en utilisant la mémoire pour l'affichage des chaînes

User Contributed Notes

There are no user contributed notes for this page.


Retourne le buffer courant

  • « XMLWriter::openUri
  • XMLWriter::setIndent »
  • PHP Manual
  • XMLWriter
  • Retourne le buffer courant

XMLWriter::outputMemory

xmlwriter_output_memory

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::outputMemory -- xmlwriter_output_memory — Retourne le buffer courant

Description

Style orienté objet

public XMLWriter::outputMemory ( bool $flush = true ) : string

Style procédural

xmlwriter_output_memory ( XMLWriter $writer , bool $flush = true ) : string

Retourne le buffer courant.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

flush

Si l'on doit afficher le buffer ou non. Par défaut, ce paramètre vaut true.

Valeurs de retour

Retourne le buffer courant sous la forme d'une chaîne de caractères.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::flush() - Affiche le buffer courant

User Contributed Notes

There are no user contributed notes for this page.


Active ou non l'indentation

  • « XMLWriter::outputMemory
  • XMLWriter::setIndentString »
  • PHP Manual
  • XMLWriter
  • Active ou non l'indentation

XMLWriter::setIndent

xmlwriter_set_indent

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::setIndent -- xmlwriter_set_indent — Active ou non l'indentation

Description

Style orienté objet

public XMLWriter::setIndent ( bool $enable ) : bool

Style procédural

xmlwriter_set_indent ( XMLWriter $writer , bool $enable ) : bool

Active ou non l'indentation.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

enable

Si l'on doit activer l'indentation ou non.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Exemples

Exemple #1 XMLWriter::setIndent() et divers contenus

L'activation de l'indentation n'est pas conseillé pour le contenu diverse, car le caractère d'indentation sera aussi inséré avant les éléments en ligne.

<?php
$writer = new XMLWriter();
$writer->openMemory();
$writer->setIndent(2);
$writer->startDocument();
$writer->startElement('p');
$writer->text('before');
$writer->writeElement('a', 'element');
$writer->text('after');
$writer->endElement();
$writer->endDocument();
echo $writer->outputMemory();
?>

L'exemple ci-dessus va afficher :

<?xml version="1.0"?>
<p>before <a>element</a>
after</p>

Notes

Note:

L'indentation est réinitialisé quand un XMLWriter est ouvert.

Voir aussi

  • XMLWriter::setIndentString() - Définit la chaîne à utiliser pour l'indentation

User Contributed Notes

There are no user contributed notes for this page.


Définit la chaîne à utiliser pour l'indentation

  • « XMLWriter::setIndent
  • XMLWriter::startAttribute »
  • PHP Manual
  • XMLWriter
  • Définit la chaîne à utiliser pour l'indentation

XMLWriter::setIndentString

xmlwriter_set_indent_string

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::setIndentString -- xmlwriter_set_indent_string — Définit la chaîne à utiliser pour l'indentation

Description

Style orienté objet

public XMLWriter::setIndentString ( string $indentation ) : bool

Style procédural

xmlwriter_set_indent_string ( XMLWriter $writer , string $indentation ) : bool

Définit la chaîne qui sera utilisée pour indenter chaque élément/attribut d'un document XML.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

indentation

La chaîne pour l'indentation.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Notes

Note:

L'indentation est réinitialisé quand un XMLWriter est ouvert.

Voir aussi

  • XMLWriter::setIndent() - Active ou non l'indentation

User Contributed Notes

There are no user contributed notes for this page.


Crée un attribut

  • « XMLWriter::setIndentString
  • XMLWriter::startAttributeNs »
  • PHP Manual
  • XMLWriter
  • Crée un attribut

XMLWriter::startAttribute

xmlwriter_start_attribute

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startAttribute -- xmlwriter_start_attribute — Crée un attribut

Description

Style orienté objet

public XMLWriter::startAttribute ( string $name ) : bool

Style procédural

xmlwriter_start_attribute ( XMLWriter $writer , string $name ) : bool

Commence un attribut.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

name

Le nom de l'attribut.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Exemples

Exemple #1 Utilisation Basique de XMLWriter::startAttribute()

<?php
$writer = new XMLWriter;
$writer->openURI('php://output');
$writer->startDocument('1.0', 'UTF-8');?>
$writer->startElement('element');
$writer->startAttribute('attribute');
$writer->text('value');
$writer->endAttribute();
$writer->endElement();
$writer->endDocument();

Résultat de l'exemple ci-dessus est similaire à :

<?xml version="1.0" encoding="UTF-8"?>
<element attribute="value"/>

Voir aussi

  • XMLWriter::startAttributeNs() - Crée un attribut pour l'espace de noms
  • XMLWriter::endAttribute() - Termine un attribut
  • XMLWriter::writeAttribute() - Écrit un attribut
  • XMLWriter::writeAttributeNs() - Écrit un attribut d'un espace de noms

User Contributed Notes

There are no user contributed notes for this page.


Crée un attribut pour l'espace de noms

  • « XMLWriter::startAttribute
  • XMLWriter::startCdata »
  • PHP Manual
  • XMLWriter
  • Crée un attribut pour l'espace de noms

XMLWriter::startAttributeNs

xmlwriter_start_attribute_ns

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startAttributeNs -- xmlwriter_start_attribute_ns — Crée un attribut pour l'espace de noms

Description

Style orienté objet

public XMLWriter::startAttributeNs ( string|null $prefix , string $name , string|null $namespace ) : bool

Style procédural

xmlwriter_start_attribute_ns ( XMLWriter $writer , string|null $prefix , string $name , string|null $namespace ) : bool

Crée un attribut pour l'espace de noms.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

prefix

Le préfixe pour l'espace de noms.

name

Le nom de l'attribut.

namespace

L'URI de l'espace de noms. Si le namespace vaut null, la déclaration de l'espace de noms sera omise.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
8.0.0 | prefix est désormais nullable.

Voir aussi

  • XMLWriter::startAttribute() - Crée un attribut
  • XMLWriter::endAttribute() - Termine un attribut
  • XMLWriter::writeAttribute() - Écrit un attribut
  • XMLWriter::writeAttributeNs() - Écrit un attribut d'un espace de noms

User Contributed Notes

There are no user contributed notes for this page.


Crée une balise CDATA

  • « XMLWriter::startAttributeNs
  • XMLWriter::startComment »
  • PHP Manual
  • XMLWriter
  • Crée une balise CDATA

XMLWriter::startCdata

xmlwriter_start_cdata

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startCdata -- xmlwriter_start_cdata — Crée une balise CDATA

Description

Style orienté objet

public XMLWriter::startCdata ( ) : bool

Style procédural

xmlwriter_start_cdata ( XMLWriter $writer ) : bool

Commence un bloc CDATA.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::endCdata() - Termine un bloc CDATA
  • XMLWriter::writeCdata() - Écrit un bloc CDATA

User Contributed Notes

There are no user contributed notes for this page.


Crée un commentaire

  • « XMLWriter::startCdata
  • XMLWriter::startDocument »
  • PHP Manual
  • XMLWriter
  • Crée un commentaire

XMLWriter::startComment

xmlwriter_start_comment

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 1.0.0)

XMLWriter::startComment -- xmlwriter_start_comment — Crée un commentaire

Description

Style orienté objet

public XMLWriter::startComment ( ) : bool

Style procédural

xmlwriter_start_comment ( XMLWriter $writer ) : bool

Commence un commentaire.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::endComment() - Termine un commentaire
  • XMLWriter::writeComment() - Écrit un commentaire

User Contributed Notes

There are no user contributed notes for this page.


Crée un document

  • « XMLWriter::startComment
  • XMLWriter::startDtd »
  • PHP Manual
  • XMLWriter
  • Crée un document

XMLWriter::startDocument

xmlwriter_start_document

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startDocument -- xmlwriter_start_document — Crée un document

Description

Style orienté objet

public XMLWriter::startDocument ( string|null $version = "1.0" , string|null $encoding = null , string|null $standalone = null ) : bool

Style procédural

xmlwriter_start_document ( XMLWriter $writer , string|null $version = "1.0" , string|null $encoding = null , string|null $standalone = null ) : bool

Commence un document.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

version

Le numéro de version du document dans la déclaration XML.

encoding

L'encodage du document dans la déclaration XML.

standalone

yes ou no.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::endDocument() - Termine le document courant

User Contributed Notes

There are no user contributed notes for this page.


Crée une DTD

  • « XMLWriter::startDocument
  • XMLWriter::startDtdAttlist »
  • PHP Manual
  • XMLWriter
  • Crée une DTD

XMLWriter::startDtd

xmlwriter_start_dtd

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startDtd -- xmlwriter_start_dtd — Crée une DTD

Description

Style orienté objet

public XMLWriter::startDtd ( string $qualifiedName , string|null $publicId = null , string|null $systemId = null ) : bool

Style procédural

xmlwriter_start_dtd ( XMLWriter $writer , string $qualifiedName , string|null $publicId = null , string|null $systemId = null ) : bool

Commence une DTD.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

qualifiedName

Le nom qualifié du type de document à créer.

publicId

L'identifiant publique externe.

systemId

L'identifiant système externe.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::endDtd() - Termine la DTD courante
  • XMLWriter::writeDtd() - Écrit une DTD

User Contributed Notes

There are no user contributed notes for this page.


Crée une liste d'attributs pour la DTD

  • « XMLWriter::startDtd
  • XMLWriter::startDtdElement »
  • PHP Manual
  • XMLWriter
  • Crée une liste d'attributs pour la DTD

XMLWriter::startDtdAttlist

xmlwriter_start_dtd_attlist

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startDtdAttlist -- xmlwriter_start_dtd_attlist — Crée une liste d'attributs pour la DTD

Description

Style orienté objet

public XMLWriter::startDtdAttlist ( string $name ) : bool

Style procédural

xmlwriter_start_dtd_attlist ( XMLWriter $writer , string $name ) : bool

Crée une liste d'attributs pour la DTD.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

name

Le nom de la liste d'attributs.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::endDtdAttlist() - Termine la liste des attributs de la DTD courante
  • XMLWriter::writeDtdAttlist() - Écrit une liste d'attributs DTD

User Contributed Notes

There are no user contributed notes for this page.


Crée un élément DTD

  • « XMLWriter::startDtdAttlist
  • XMLWriter::startDtdEntity »
  • PHP Manual
  • XMLWriter
  • Crée un élément DTD

XMLWriter::startDtdElement

xmlwriter_start_dtd_element

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startDtdElement -- xmlwriter_start_dtd_element — Crée un élément DTD

Description

Style orienté objet

public XMLWriter::startDtdElement ( string $qualifiedName ) : bool

Style procédural

xmlwriter_start_dtd_element ( XMLWriter $writer , string $qualifiedName ) : bool

Commence un élément DTD.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

qualifiedName

Le nom qualifié du type de document à créer.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::endDtdElement() - Termine l'élément de la DTD courante
  • XMLWriter::writeDtdElement() - Écrit un élément DTD

User Contributed Notes

There are no user contributed notes for this page.


Crée une entité DTD

  • « XMLWriter::startDtdElement
  • XMLWriter::startElement »
  • PHP Manual
  • XMLWriter
  • Crée une entité DTD

XMLWriter::startDtdEntity

xmlwriter_start_dtd_entity

(PHP 5 >= 5.2.1, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startDtdEntity -- xmlwriter_start_dtd_entity — Crée une entité DTD

Description

Style orienté objet

public XMLWriter::startDtdEntity ( string $name , bool $isParam ) : bool

Style procédural

xmlwriter_start_dtd_entity ( XMLWriter $writer , string $name , bool $isParam ) : bool

Commence une entité DTD.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

name

Le nom de l'entité.

isParam

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::endDtdEntity() - Termine l'entité de la DTD courante
  • XMLWriter::writeDtdEntity() - Écrit une entité DTD

User Contributed Notes

There are no user contributed notes for this page.


Crée un élément

  • « XMLWriter::startDtdEntity
  • XMLWriter::startElementNs »
  • PHP Manual
  • XMLWriter
  • Crée un élément

XMLWriter::startElement

xmlwriter_start_element

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startElement -- xmlwriter_start_element — Crée un élément

Description

Style orienté objet

public XMLWriter::startElement ( string $name ) : bool

Style procédural

xmlwriter_start_element ( XMLWriter $writer , string $name ) : bool

Commence un élément.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

name

Le nom de l'élément.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::endElement() - Termine l'élément courant
  • XMLWriter::writeElement() - Écrit un élément

User Contributed Notes

There are no user contributed notes for this page.


Crée un élément d'un espace de noms

  • « XMLWriter::startElement
  • XMLWriter::startPi »
  • PHP Manual
  • XMLWriter
  • Crée un élément d'un espace de noms

XMLWriter::startElementNs

xmlwriter_start_element_ns

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startElementNs -- xmlwriter_start_element_ns — Crée un élément d'un espace de noms

Description

Style orienté objet

public XMLWriter::startElementNs ( string|null $prefix , string $name , string|null $namespace ) : bool

Style procédural

xmlwriter_start_element_ns ( XMLWriter $writer , string|null $prefix , string $name , string|null $namespace ) : bool

Crée un élément d'un espace de noms.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

prefix

Le préfixe de l'espace de noms. Si le paramètre prefix vaut null, l'espace de noms sera omis.

name

Le nom de l'élément.

namespace

L'URI de l'espace de noms. Si le namespace vaut null, la déclaration de l'espace de noms sera omise.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::endElement() - Termine l'élément courant
  • XMLWriter::writeElementNs() - Écrit un élément d'un espace de noms

User Contributed Notes

There are no user contributed notes for this page.


Crée une balise PI

  • « XMLWriter::startElementNs
  • XMLWriter::text »
  • PHP Manual
  • XMLWriter
  • Crée une balise PI

XMLWriter::startPi

xmlwriter_start_pi

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::startPi -- xmlwriter_start_pi — Crée une balise PI

Description

Style orienté objet

public XMLWriter::startPi ( string $target ) : bool

Style procédural

xmlwriter_start_pi ( XMLWriter $writer , string $target ) : bool

Commence une balise d'instruction.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

target

La cible de l'instruction.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::endPi() - Termine le PI courant
  • XMLWriter::writePi() - Écrit la balise PI

User Contributed Notes

There are no user contributed notes for this page.


Écrit du texte

  • « XMLWriter::startPi
  • XMLWriter::writeAttribute »
  • PHP Manual
  • XMLWriter
  • Écrit du texte

XMLWriter::text

xmlwriter_text

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::text -- xmlwriter_text — Écrit du texte

Description

Style orienté objet

public XMLWriter::text ( string $content ) : bool

Style procédural

xmlwriter_text ( XMLWriter $writer , string $content ) : bool

Écrit du texte.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

content

Le contenu du texte. Les caractères <, >, & et " sont écrit en tant que références d'entités (c.à.d. &lt;, &gt;, &amp; et &quot;, respectivement). Tous les autres caractères ' inclus sont écrit littéralement. Pour écrire les caractères XML spéciaux littéralement, ou pour écrire des références d'entités litérales, xmlwriter_write_raw() doit être utilisé.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

User Contributed Notes

There are no user contributed notes for this page.


Écrit un attribut

  • « XMLWriter::text
  • XMLWriter::writeAttributeNs »
  • PHP Manual
  • XMLWriter
  • Écrit un attribut

XMLWriter::writeAttribute

xmlwriter_write_attribute

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeAttribute -- xmlwriter_write_attribute — Écrit un attribut

Description

Style orienté objet

public XMLWriter::writeAttribute ( string $name , string $value ) : bool

Style procédural

xmlwriter_write_attribute ( XMLWriter $writer , string $name , string $value ) : bool

Écrit un attribut.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

name

Le nom de l'attribut.

value

La valeur de l'attribut.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Exemples

Exemple #1 Mélanger des Sous-éléments et Attributs

Lors de l'écriture de sous-éléments avec des attributs mélangé, toute tentative d'écrires des attributs après le premier sous-élément échouera et retournera false.

<?php
$xml = new XMLWriter();
$xml->openMemory();

$xml->startElement('element');
$xml->writeAttribute('attr1', '0');
$xml->writeElement('subelem', '0');
var_dump($xml->writeAttribute('attr2', '0'));
$xml->endElement();

echo $xml->flush();
?>

L'exemple ci-dessus va afficher :

bool(false)
<element attr1="0"><subelem>0</subelem></element>

Voir aussi

  • XMLWriter::writeAttributeNs() - Écrit un attribut d'un espace de noms
  • XMLWriter::startAttribute() - Crée un attribut
  • XMLWriter::startAttributeNs() - Crée un attribut pour l'espace de noms
  • XMLWriter::endAttribute() - Termine un attribut

User Contributed Notes

There are no user contributed notes for this page.


Écrit un attribut d'un espace de noms

  • « XMLWriter::writeAttribute
  • XMLWriter::writeCdata »
  • PHP Manual
  • XMLWriter
  • Écrit un attribut d'un espace de noms

XMLWriter::writeAttributeNs

xmlwriter_write_attribute_ns

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeAttributeNs -- xmlwriter_write_attribute_ns — Écrit un attribut d'un espace de noms

Description

Style orienté objet

public XMLWriter::writeAttributeNs ( string|null $prefix , string $name , string|null $namespace , string $value ) : bool

Style procédural

xmlwriter_write_attribute_ns ( XMLWriter $writer , string|null $prefix , string $name , string|null $namespace , string $value ) : bool

Écrit un attribut d'un espace de noms.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

prefix

Le préfixe de l'espace de noms. Si le paramètre prefix vaut null, l'espace de noms sera omis.

name

Le nom de l'attribut.

namespace

L'URI de l'espace de noms. Si le namespace vaut null, la déclaration de l'espace de noms sera omise.

value

La valeur de l'attribut.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::writeAttribute() - Écrit un attribut
  • XMLWriter::startAttribute() - Crée un attribut
  • XMLWriter::startAttributeNs() - Crée un attribut pour l'espace de noms
  • XMLWriter::endAttribute() - Termine un attribut

User Contributed Notes

There are no user contributed notes for this page.


Écrit un bloc CDATA

  • « XMLWriter::writeAttributeNs
  • XMLWriter::writeComment »
  • PHP Manual
  • XMLWriter
  • Écrit un bloc CDATA

XMLWriter::writeCdata

xmlwriter_write_cdata

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeCdata -- xmlwriter_write_cdata — Écrit un bloc CDATA

Description

Style orienté objet

public XMLWriter::writeCdata ( string $content ) : bool

Style procédural

xmlwriter_write_cdata ( XMLWriter $writer , string $content ) : bool

Écrit un bloc CDATA.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

content

Le contenu du bloc CDATA.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Exemples

Exemple #1 Utilisation Basique de xmlwriter_write_cdata()

<?php
// set up the document
$xml = new XmlWriter();
$xml->openMemory();
$xml->setIndent(true);
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('mydoc');
$xml->startElement('myele');

// CData output
$xml->startElement('mycdataelement');
$xml->writeCData("text for inclusion as CData");
$xml->endElement();

// end the document and output
$xml->endElement();
$xml->endElement();
echo $xml->outputMemory(true);
?>

L'exemple ci-dessus va afficher :

<mydoc>
 <myele>
  <mycdataelement><![CDATA[text for inclusion as CData]?]></mycdataelement>
 </myele>
</mydoc>

Voir aussi

  • XMLWriter::startCdata() - Crée une balise CDATA
  • XMLWriter::endCdata() - Termine un bloc CDATA

User Contributed Notes

There are no user contributed notes for this page.


Écrit un commentaire

  • « XMLWriter::writeCdata
  • XMLWriter::writeDtd »
  • PHP Manual
  • XMLWriter
  • Écrit un commentaire

XMLWriter::writeComment

xmlwriter_write_comment

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeComment -- xmlwriter_write_comment — Écrit un commentaire

Description

Style orienté objet

public XMLWriter::writeComment ( string $content ) : bool

Style procédural

xmlwriter_write_comment ( XMLWriter $writer , string $content ) : bool

Écrit un commentaire.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

content

Le contenu du commentaire.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startComment() - Crée un commentaire
  • XMLWriter::endComment() - Termine un commentaire

User Contributed Notes

There are no user contributed notes for this page.


Écrit une DTD

  • « XMLWriter::writeComment
  • XMLWriter::writeDtdAttlist »
  • PHP Manual
  • XMLWriter
  • Écrit une DTD

XMLWriter::writeDtd

xmlwriter_write_dtd

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeDtd -- xmlwriter_write_dtd — Écrit une DTD

Description

Style orienté objet

public XMLWriter::writeDtd ( string $name , string|null $publicId = null , string|null $systemId = null , string|null $content = null ) : bool

Style procédural

xmlwriter_write_dtd ( XMLWriter $writer , string $name , string|null $publicId = null , string|null $systemId = null , string|null $content = null ) : bool

Écrit une DTD.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

name

Le nom de la DTD.

publicId

L'identifiant publique externe.

systemId

L'identifiant système externe.

content

Le contenu de la DTD.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startDtd() - Crée une DTD
  • XMLWriter::endDtd() - Termine la DTD courante

User Contributed Notes

There are no user contributed notes for this page.


Écrit une liste d'attributs DTD

  • « XMLWriter::writeDtd
  • XMLWriter::writeDtdElement »
  • PHP Manual
  • XMLWriter
  • Écrit une liste d'attributs DTD

XMLWriter::writeDtdAttlist

xmlwriter_write_dtd_attlist

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeDtdAttlist -- xmlwriter_write_dtd_attlist — Écrit une liste d'attributs DTD

Description

Style orienté objet

public XMLWriter::writeDtdAttlist ( string $name , string $content ) : bool

Style procédural

xmlwriter_write_dtd_attlist ( XMLWriter $writer , string $name , string $content ) : bool

Écrit une liste d'attribut DTD.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

name

Le nom de la liste d'attributs DTD.

content

Le contenu de la liste d'attributs DTD.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startDtdAttlist() - Crée une liste d'attributs pour la DTD
  • XMLWriter::endDtdAttlist() - Termine la liste des attributs de la DTD courante

User Contributed Notes

There are no user contributed notes for this page.


Écrit un élément DTD

  • « XMLWriter::writeDtdAttlist
  • XMLWriter::writeDtdEntity »
  • PHP Manual
  • XMLWriter
  • Écrit un élément DTD

XMLWriter::writeDtdElement

xmlwriter_write_dtd_element

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeDtdElement -- xmlwriter_write_dtd_element — Écrit un élément DTD

Description

Style orienté objet

public XMLWriter::writeDtdElement ( string $name , string $content ) : bool

Style procédural

xmlwriter_write_dtd_element ( XMLWriter $writer , string $name , string $content ) : bool

Écrit un élément DTD.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

name

Le nom de l'élément DTD.

content

Le contenu de l'élément.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startDtdElement() - Crée un élément DTD
  • XMLWriter::endDtdElement() - Termine l'élément de la DTD courante

User Contributed Notes

There are no user contributed notes for this page.


Écrit une entité DTD

  • « XMLWriter::writeDtdElement
  • XMLWriter::writeElement »
  • PHP Manual
  • XMLWriter
  • Écrit une entité DTD

XMLWriter::writeDtdEntity

xmlwriter_write_dtd_entity

(PHP 5 >= 5.2.1, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeDtdEntity -- xmlwriter_write_dtd_entity — Écrit une entité DTD

Description

Style orienté objet

public XMLWriter::writeDtdEntity ( string $name , string $content , bool $isParam = false , string|null $publicId = null , string|null $systemId = null , string|null $notationData = null ) : bool

Style procédural

xmlwriter_write_dtd_entity ( XMLWriter $writer , string $name , string $content , bool $isParam = false , string|null $publicId = null , string|null $systemId = null , string|null $notationData = null ) : bool

Écrit une entité DTD.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

name

Le nom de l'entité.

content

Le contenu de l'entité.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
8.0.0 | publicId, systemId et notationData sont désormais nullable.

Voir aussi

  • XMLWriter::startDtdEntity() - Crée une entité DTD
  • XMLWriter::endDtdEntity() - Termine l'entité de la DTD courante

User Contributed Notes

There are no user contributed notes for this page.


Écrit un élément

  • « XMLWriter::writeDtdEntity
  • XMLWriter::writeElementNs »
  • PHP Manual
  • XMLWriter
  • Écrit un élément

XMLWriter::writeElement

xmlwriter_write_element

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeElement -- xmlwriter_write_element — Écrit un élément

Description

Style orienté objet

public XMLWriter::writeElement ( string $name , string|null $content = null ) : bool

Style procédural

xmlwriter_write_element ( XMLWriter $writer , string $name , string|null $content = null ) : bool

Écrit un élément.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

name

Le nom de l'élément.

content

Le contenu de l'élément.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startElement() - Crée un élément
  • XMLWriter::endElement() - Termine l'élément courant
  • XMLWriter::writeElementNs() - Écrit un élément d'un espace de noms

User Contributed Notes

There are no user contributed notes for this page.


Écrit un élément d'un espace de noms

  • « XMLWriter::writeElement
  • XMLWriter::writePi »
  • PHP Manual
  • XMLWriter
  • Écrit un élément d'un espace de noms

XMLWriter::writeElementNs

xmlwriter_write_element_ns

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writeElementNs -- xmlwriter_write_element_ns — Écrit un élément d'un espace de noms

Description

Style orienté objet

public XMLWriter::writeElementNs ( string|null $prefix , string $name , string|null $namespace , string|null $content = null ) : bool

Style procédural

xmlwriter_write_element_ns ( XMLWriter $writer , string|null $prefix , string $name , string|null $namespace , string|null $content = null ) : bool

Écrit un élément d'un espace de noms.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

prefix

Le préfixe de l'espace de noms. Si le paramètre prefix vaut null, l'espace de noms sera omis.

name

Le nom de l'élément.

namespace

L'URI de l'espace de noms. Si le namespace vaut null, la déclaration de l'espace de noms sera omise.

content

Le contenu de l'élément.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startElementNs() - Crée un élément d'un espace de noms
  • XMLWriter::endElement() - Termine l'élément courant
  • XMLWriter::writeElement() - Écrit un élément

User Contributed Notes

There are no user contributed notes for this page.


Écrit la balise PI

  • « XMLWriter::writeElementNs
  • XMLWriter::writeRaw »
  • PHP Manual
  • XMLWriter
  • Écrit la balise PI

XMLWriter::writePi

xmlwriter_write_pi

(PHP 5 >= 5.1.2, PHP 7, PHP 8, PECL xmlwriter >= 0.1.0)

XMLWriter::writePi -- xmlwriter_write_pi — Écrit la balise PI

Description

Style orienté objet

public XMLWriter::writePi ( string $target , string $content ) : bool

Style procédural

xmlwriter_write_pi ( XMLWriter $writer , string $target , string $content ) : bool

Écrit la balise PI.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

target

La cible de l'instruction.

content

Le contenu de l'instruction.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::startPi() - Crée une balise PI
  • XMLWriter::endPi() - Termine le PI courant

User Contributed Notes

There are no user contributed notes for this page.


Écrit un texte XML brut

  • « XMLWriter::writePi
  • XSL »
  • PHP Manual
  • XMLWriter
  • Écrit un texte XML brut

XMLWriter::writeRaw

xmlwriter_write_raw

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL xmlwriter >= 2.0.4)

XMLWriter::writeRaw -- xmlwriter_write_raw — Écrit un texte XML brut

Description

Style orienté objet

public XMLWriter::writeRaw ( string $content ) : bool

Style procédural

xmlwriter_write_raw ( XMLWriter $writer , string $content ) : bool

Écrit un texte XML brut.

Liste de paramètres

writer

Uniquement pour les appels procéduraux. L'instance XMLWriter qui est modifiée. Cet objet provient d'un appel à xmlwriter_open_uri() ou xmlwriter_open_memory().

content

Le texte à écrire.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Historique

Version | Description
8.0.0 | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.

Voir aussi

  • XMLWriter::text() - Écrit du texte

User Contributed Notes

There are no user contributed notes for this page.


XSL

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
    • Configuration à l'exécution
    • Types de ressources
  • Constantes pré-définies
  • Exemples
    • Exemple de fichiers collection.xml et collection.xsl
    • Gestion des erreurs avec les fonctions de gestion d'erreur libxml
  • XSLTProcessor — La classe XSLTProcessor
    • XSLTProcessor::__construct — Crée un nouvel objet XSLTProcessor
    • XSLTProcessor::getParameter — Récupère la valeur d'un paramètre
    • XSLTProcessor::getSecurityPrefs — Récupère les préférences de sécurité
    • XSLTProcessor::hasExsltSupport — Indique si PHP utilise EXSLT
    • XSLTProcessor::importStylesheet — Importe une feuille de style
    • XSLTProcessor::registerPHPFunctions — Active l'utilisation de PHP dans les feuilles de styles XSLT
    • XSLTProcessor::removeParameter — Efface un paramètre
    • XSLTProcessor::setParameter — Définit la valeur d'un paramètre
    • XSLTProcessor::setProfiling — Spécifie le fichier de profilage
    • XSLTProcessor::setSecurityPrefs — Définit les préférences de sécurité
    • XSLTProcessor::transformToDoc — Transforme en un document DOM
    • XSLTProcessor::transformToUri — Transforme en URI
    • XSLTProcessor::transformToXml — Transformer en XML

User Contributed Notes

Jaroslaw Zabiello 23-Jun-2011 07:10
This is more usefull, no files needed, it just takes XML and XSL strings as input parameters and returns transformed XML

<?php
/**
 * @param  $xml
 * @param  $xsl
 * @return string xml
 */
function transform($xml, $xsl) {
   $xslt = new XSLTProcessor();
   $xslt->importStylesheet(new  SimpleXMLElement($xsl));
   return $xslt->transformToXml(new SimpleXMLElement($xml));
}
?>
sudhir dot vis at gmail dot com 25-Apr-2009 11:40
Here is a simplest way to transform the xml from php

<?php
$sXml  = "<xml>";
$sXml .= "<sudhir>hello sudhir</sudhir>";
$sXml .= "</xml>";

# LOAD XML FILE
$XML = new DOMDocument();
$XML->loadXML( $sXml );

# START XSLT
$xslt = new XSLTProcessor();
$XSL = new DOMDocument();
$XSL->load( 'xsl/index.xsl', LIBXML_NOCDATA);
$xslt->importStylesheet( $XSL );
#PRINT
print $xslt->transformToXML( $XML );
?>
allens at nospam dot com 19-Apr-2009 08:45
Problem:
Getting Netbeans error message:
Fatal error: Class 'xsltprocessor' not found

Solution:
place copy of php.ini in the c:\windows directory!

by default the php.ini file has xsl disabled......search for the line

;extension=php_xsl.dll

to enable XSL....remove ; so that the extension gets included

Then if Netbeans gives you the following message:
PHP Startup: Unable to load dynamic library './php_xsl.dll'

then you need to run the php-5.2.9-1-win32-installer.msi again
this time selecting the XSL extension!
visual77 at gmail dot com 20-Sep-2008 04:35
The XSLTProcessor is kind of a pain to use to generate an entire website, mostly due to the tedious process of building an XML tree through DOMDocument's createElement and appendChild functions.

To get an entire website out of nothing but XML and XSL (which really is a superior system to just echoing out the HTML), you could use an object that does all the PHP data structure to XML data tree conversion, and combines with the XSLTProcessor for rendering. A good object like this is DOMi, which you can find at http://domi.sourceforge.net.
emilise dot victor at gmail dot com 12-Mar-2008 08:10
Here is a way to get an output without using <xml:message> : use the var_dump function of php :
- First bind the php functions with
<? $xslt->registerPHPFunctions() ?>
and xmlns:php="http://php.net/xsl" in the stylesheet
- Then you can call the var_dump function like this : <xsl:variable name="a" select="php:function('var_dump', $return)" />

I couldn't find a way to call the function and have it really print the result without creating a variable, but well, it's just for debugging...
shangxiao at php dot net 10-Jan-2008 05:38
When using the DOM api to add xsl commands to your stylesheet dynamically, be sure to use createElementNS() rather than createElement() otherwise the XSLTProcessor will not recognise these DOM nodes.

Eg:
$xsl->createElementNS('http://www.w3.org/1999/XSL/Transform', 'xsl:element');
pb at online-magazin dot at 11-Oct-2007 03:13
Calling the Saxon XSLT Processor is a very esay task to do!

You just need to do some simple task

1. Install the JavaBridge for PHP

2. Download the freeware (B) Saxon distribution from http://saxon.sourceforge.net/

3. Put the jar files in a directory whre you have access

4. Use this sample of code

// Directory where the jar files are located
define("SAXON_DIR", $_SERVER['DOCUMENT_ROOT']."/saxonb8.9.0/");

// include the jars
java_require(SAXON_DIR."saxon8.jar;".SAXON_DIR."saxon8-dom.jar");

$sXslFile = $_SERVER['DOCUMENT_ROOT']."/myfirst.xsl"; // The xsl file
$sXmlFile = $_SERVER['DOCUMENT_ROOT']."/myfirst.xml"; // The xml file

try
{
  $oXslSource = new java("javax.xml.transform.stream.StreamSource", "file://".$sXslFile);
  $oXmlSource = new java("javax.xml.transform.stream.StreamSource", "file://".$sXmlFile);

  $oFeatureKeys = new JavaClass("net.sf.saxon.FeatureKeys");

  // Create the Factory
  $oTransformerFactory = new java("net.sf.saxon.TransformerFactoryImpl");

  //Disable source document validation
  $oTransformerFactory->setAttribute($oFeatureKeys->SCHEMA_VALIDATION, 4);

  // Create a new Transformer
  $oTransFormer = $oTransformerFactory->newTransformer($oXslSource);

  // Create a StreamResult to store the output
  $oResultStringWriter = new java("java.io.StringWriter");
  $oResultStream = new java("javax.xml.transform.stream.StreamResult", $oResultStringWriter);

  // Transform
  $oTransFormer->transform($oXmlSource, $oResultStream);

  // Echo the output from the transformation
  echo java_cast($oResultStringWriter->toString(), "string");

}
catch(JavaException $e){
   echo java_cast($e->getCause()->toString(), "string");
   exit;
}

5. Enjoy

This is working quite well.
Vasil Rangelov 21-Aug-2007 07:31
@basslines at gmail dot com
"
As far as I can tell, the most recent stable versions of LibXML/LibXSLT/LibEXSLT do NOT support xPath 2.0 / XSLT 2.0 transformations. The only support for XSLT 2.0 that I've found is in Java's SAXON processor (http://saxon.sourceforge.net/).
"

Using SAXON or AltovaXML by using their JAVA bindings could prove to be a difficult task to do, and .NET seems to be buggy (at least for me). However, I've made a class that uses SAXON or AltovaXML from the command line. AltovaXML could also be used with COM, provided it's registered as a COM component.

You can download my wrapper from:
http://xslt2processor.sourceforge.net/

I still need to implement a more graceful error handling (the way the XSL extension uses the Libxml functions), and once the bug
http://bugs.php.net/bug.php?id=41577
is fixed, I'll implement the .NET interfaces too.

I'll appreciate any feedback.
geoffreyj dot lee at gmail dot com 01-Jul-2007 11:02
Here are a couple useful tips for those who care about cross-browser compatibility.

Given:

<script type="text/javascript" src="test.js"></script>

XSLT will automatically condense it to:

<script type="text/javascript" src="test.js"/>

While this is good, Internet Explorer breaks on empty script tags. So, the simple solution is to add something to prevent an empty tag. For example:

<script type="text/javascript" src="test.js"><xsl:comment/></script>

Produces:

<script type="text/javascript" src="test.js">

</script>

------------------------

Also, here is a way to use IE's conditional comments:

<xsl:comment>[if gte IE 5]&#62;
&#60;link rel="stylesheet" type="text/css" href="ie.css" /&#62;
&#60;![endif]</xsl:comment>

Produces:

<!--[if gte IE 5]>
<link rel="stylesheet" type="text/css" href="ie.css" />
<![endif]-->

This will let you isolate IE-related CSS without needing to use ugly CSS hacks.
gabriel dot birke at web dot de 10-May-2007 03:19
Each <xsl:message> tag will generate a PHP error (level Warning). If you want to collect and pretty-print them, you could use a custom error handling function that collects the warnings in a static variable.
mnot at mnot dot net 08-May-2007 08:59
You can set an HTTP proxy for the XSLT document() function to use (as well as DTD external references) by setting http_proxy in the environment.

E.g., in Apache configuration;

SetEnv http_proxy http://127.0.0.1:3128/
Ryan D. Hatch 02-May-2007 01:14
Looking for php_xsl.dll?

If you installed on Windows using the MSI Installer - you may not have it.

1.) Add/Remove Programs and Change PHP Installation.  Select XSL Extension.

OR

2.) Download complete .zip file of PHP and you can copy php_xsl.dll into your PHP/etc directory.

Just a note.

Ryan D. Hatch
adrian at foeder dot de 14-Sep-2006 02:45
If you want to use the document()-function inside your XSL stylesheet, please note that you have to use an absolute path there.
Important for windows users: the absolute path *has* to be with forward slashes, so subsitute windows-path-backslashes to forward slashes before you transform the document.

Examples:
This will NOT work:
<xsl:copy-of select="document('test.xml')" />

This will also NOT work:
<xsl:copy-of select="document('c:\temp\test.xml')" />

But this WILL work:
<xsl:copy-of select="document('c:/temp/test.xml')" />
27-Apr-2006 06:26
Enable libxslt library, PHP 5, under windows:

To Enable:
In your php.ini
1. Uncomment ;extension=php_xsl.dll
2. Change extension_dir to
     extension_dir = "./ext"

To Confirm:
1. In a test.php page:
<?php phpinfo() ?>
2. Run test.php
3. Search for "libxslt Version". It should return a version number in a XSL headed table.

Further info Google
"Configuring and Testing PHP Servers for XSL Support"
Fabrice Bonny 30-Mar-2006 01:34
In response to how to use entities from DTD (internal or external) in XSLT. It works if you do this way:

$xsl = new DOMDocument;
$xsl->resolveExternals = TRUE;
$xsl->substituteEntities = TRUE;
$xsl->load(...);

Hope this helps! ;-)
basslines at gmail dot com 29-Mar-2006 10:07
As far as I can tell, the most recent stable versions of LibXML/LibXSLT/LibEXSLT do NOT support xPath 2.0 / XSLT 2.0 transformations. The only support for XSLT 2.0 that I've found is in Java's SAXON processor (http://saxon.sourceforge.net/).
17-Mar-2006 09:14
In response to appletalk at gmail dot com
<snip>
As many of you may have noticed, DOM parser gives errors if the '&nbsp;' entity is present. The E_WARN message looks like:
Warning: DOMDocument::load() [function.load]: Entity 'nbsp' not defined in ...
There're many ways to solve this:
.....
b) Defining &nbsp;
At the top of the document, after the <?xml?> definition, add:
   <!DOCTYPE xsl:stylesheet [
   <!ENTITY nbsp "&#160;" >
   ]>
.......</snip>
Just wanted to let people know that option b does NOT work. I'm not sure why this isn't implemented correctly, but it isn't, so don't waste your time. It's unfortunate the DOMXSL transform is so much less capable than the old xslt function.
venkatesh at lammersmedical dot com 01-Mar-2005 06:17
Here is function to read from the XSL sheet which is saved as a text file.

function ReadExcelSheet($filename){
             $test=file($filename);
             $ar1=str_replace("~[^\t]*\t","\t",$test);
             $ar2=str_replace("~","",$ar1);
             $ar=str_replace("?","",$ar2);
             $temp=array();
             for ($i=0; $i<count($ar); $i++) {
                       if((substr($ar[$i],0,1)!= "\t")){
                           if($ar[$i]!=="\r\n"){
                           array_push($temp,$ar[$i]);
            }
        }
    }
    $name=split("\t",$temp[0]);
    $ExcelList=array();
    for($i=1;$i<count($temp);$i++){
        $split_result=split("\t",$temp[$i]);
        array_push($ExcelList,$split_result);
    }
    $result=insert_into_array($ExcelList,0,$name);
    return($result);
}
appletalk at gmail dot com 04-Feb-2005 10:32
As many of you may have noticed, DOM parser gives errors if the '&nbsp;' entity is present. The E_WARN message looks like:

Warning: DOMDocument::load() [function.load]: Entity 'nbsp' not defined in ...

There're many ways to solve this:
a) The hard way
<xsl:text disable-output-escaping="yes"> &amp;nbsp;</xsl:text>

b) Defining &nbsp;
At the top of the document, after the <?xml?> definition, add:
   <!DOCTYPE xsl:stylesheet [
    <!ENTITY nbsp "&#160;" >
    ]>

c) External Doctype
Just in case you want need other HTML entities, you can call an external doctype with the proper definitions

<!DOCTYPE page SYSTEM "http://gv.ca/dtd/character-entities.dtd">

Of course, you can download the file and place it in your server.
kekoajs at yahoo dot com 22-Dec-2004 02:07
Wow, I spent the better part of a day looking for how one could pass an entire test expression to an XSL stylesheet.  It seems that the XSLT 1.0 specification doesn't support it but PHP 5 (and maybe 4s) inclusion of  EXSLT allows one to do exactly that...

simply add these lines...

xmlns:dyn="http://exslt.org/dynamic"
extension-element-prefixes="dyn"

to the <xsl:stylesheet> element and when using an expression stored in a <xsl:param> element write

<xsl:if test="dyn:evaluate($param-name)">

and viola!  you can now use expressions generated externally in your stylesheet!

EXSLT adds many useful functions that can be integrated into your XSL in a similar fashion.  You can go to http://exslt.org/ to learn more...
rd at jerntorget dot se 24-Sep-2004 03:58
If you get the following warning message:

xsltApplyOneTemplate: _if_ was not compiled in (if can for example be apply-template or some other method), i've found that the problem seems to be an &nbsp; directly before the <xsl:if> or what ever is causing the problem.

One way to get thru the problem is to use span tags around &nbsp;  like : <span>&nbsp;</span>
jw at jwscripts dot com 06-Sep-2004 02:23
The following code is a wrapper to support calls to some of the old xslt_* functions:

<?

if (PHP_VERSION >= 5) {
    // Emulate the old xslt library functions
    function xslt_create() {
        return new XsltProcessor();
    }

    function xslt_process($xsltproc,
                          $xml_arg,
                          $xsl_arg,
                          $xslcontainer = null,
                          $args = null,
                          $params = null) {
        // Start with preparing the arguments
        $xml_arg = str_replace('arg:', '', $xml_arg);
        $xsl_arg = str_replace('arg:', '', $xsl_arg);

        // Create instances of the DomDocument class
        $xml = new DomDocument;
        $xsl = new DomDocument;

        // Load the xml document and the xsl template
        $xml->loadXML($args[$xml_arg]);
        $xsl->loadXML($args[$xsl_arg]);

        // Load the xsl template
        $xsltproc->importStyleSheet($xsl);

        // Set parameters when defined
        if ($params) {
            foreach ($params as $param => $value) {
                $xsltproc->setParameter("", $param, $value);
            }
        }

        // Start the transformation
        $processed = $xsltproc->transformToXML($xml);

        // Put the result in a file when specified
        if ($xslcontainer) {
            return @file_put_contents($xslcontainer, $processed);
        } else {
            return $processed;
        }

    }

    function xslt_free($xsltproc) {
        unset($xsltproc);
    }
}

$arguments = array(
    '/_xml' => file_get_contents("newxslt.xml"),
    '/_xsl' => file_get_contents("newxslt.xslt")
);

$xsltproc = xslt_create();
$html = xslt_process(
    $xsltproc,
    'arg:/_xml',
    'arg:/_xsl',
    null,
    $arguments
);

xslt_free($xsltproc);
print $html;

?>
rojaro 23-Jun-2004 07:43
If you're want to use XML from a variable e.g. $xmldata but the XSLT-StyleSheet from a file, you can do it also the following way:

<?php
$xslt = new xsltProcessor;
$xslt->importStyleSheet(DomDocument::load('filename.xsl'));
print $xslt->transformToXML(DomDocument::loadXML($xmldata));
?>


Introduction

L'extension XSL implémente le standard XSL, et effectue des » transformations XSLT en utilisant la » bibliothèque libxslt

User Contributed Notes

There are no user contributed notes for this page.


Pré-requis

Cette extension requière l'extension PHP libxml. Ceci signifie passer l'option de configuration --with-libxml, ou antérieur à PHP 7.4 l'option de configuration --enable-libxml, bien que ceci est accomplie implicitement car libxml est activé par défaut.

Cette extension utilise libxslt qui peut être trouvée sur » http://xmlsoft.org/XSLT/. libxslt en version 1.1.0 ou ultérieure est requise.

User Contributed Notes

There are no user contributed notes for this page.


Installation

PHP 5 inclut l'extension XSL par défaut et peut être activée en ajoutant l'argument --with-xsl[=DIR] à votre ligne de configuration. DIR est le dossier d'installation de la bibliothèque libxslt.

User Contributed Notes

There are no user contributed notes for this page.


Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

XSL_CLONE_AUTO (entier)
XSL_CLONE_NEVER (entier)
XSL_CLONE_ALWAYS (entier)
LIBXSLT_VERSION (entier)
Version libxslt, par exemple : 10117. Disponible depuis PHP 5.1.2.
LIBXSLT_DOTTED_VERSION (chaîne de caractères)
Version libxslt, par exemple : 1.1.17. Disponible depuis PHP 5.1.2.
LIBEXSLT_VERSION (entier)
Version libexslt, par exemple : 813. Disponible depuis PHP 5.1.2.
LIBEXSLT_DOTTED_VERSION (chaîne de caractères)
Version libexslt, par exemple : 1.1.17. Disponible depuis PHP 5.1.2.
XSL_SECPREF_NONE (int)
Désactive toutes les restrictions de sécurité.
XSL_SECPREF_READ_FILE (entier)
Interdit la lecture de fichiers.
XSL_SECPREF_WRITE_FILE (entier)
Interdit l'écriture de fichiers.
XSL_SECPREF_CREATE_DIRECTORY (entier)
Interdit la création de répertoires.
XSL_SECPREF_READ_NETWORK (entier)
Interdit la lecture de fichiers via le réseau.
XSL_SECPREF_WRITE_NETWORK (entier)
Interdit l'écriture de fichiers via le réseau.
XSL_SECPREF_DEFAULT (int)
Interdit tous les accès en écriture, i.e. un masque XSL_SECPREF_WRITE_NETWORK | XSL_SECPREF_CREATE_DIRECTORY | XSL_SECPREF_WRITE_FILE.

User Contributed Notes

There are no user contributed notes for this page.


Exemples

Sommaire

  • Exemple de fichiers collection.xml et collection.xsl
  • Gestion des erreurs avec les fonctions de gestion d'erreur libxml

User Contributed Notes

There are no user contributed notes for this page.


Exemple de fichiers collection.xml et collection.xsl

De nombreux exemples de ce chapitre nécessitent à la fois un fichier XML et un fichier XSL. Nous utiliserons collection.xml et collection.xsl qui contiennent respectivement :

Exemple #1 collection.xml

<collection>
 <cd>
  <title>Fight for your mind</title>
  <artist>Ben Harper</artist>
  <year>1995</year>
 </cd>
 <cd>
  <title>Electric Ladyland</title>
  <artist>Jimi Hendrix</artist>
  <year>1997</year>
 </cd>
</collection>

Exemple #2 collection.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:param name="owner" select="'Nicolas Eliaszewicz'"/>
 <xsl:output method="html" encoding="iso-8859-1" indent="no"/>
 <xsl:template match="collection">
  Hey! Welcome to <xsl:value-of select="$owner"/>'s sweet CD collection!
  <xsl:apply-templates/>
 </xsl:template>
 <xsl:template match="cd">
  <h1><xsl:value-of select="title"/></h1>
  <h2>by <xsl:value-of select="artist"/> - <xsl:value-of select="year"/></h2>
  <hr />
 </xsl:template>
</xsl:stylesheet>

User Contributed Notes

There are no user contributed notes for this page.


Gestion des erreurs avec les fonctions de gestion d'erreur libxml

libxml fournit des fonctions pour gérer les erreurs qui peuvent être utilisées pour capturer et gérér celles ci lors du traitement XSLT.

Exemple #1 fruits.xml

Un fichier XML valide.

<fruits>
 <fruit>Apple</fruit>
 <fruit>Banana</fruit>
 <fruit>Cherry</fruit>
</fruits>

Exemple #2 fruits.xsl

Contient une expression select invalide.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" encoding="utf-8" indent="no"/>
 <xsl:template match="fruits">
  <ul>
   <xsl:apply-templates/>
  </ul>
 </xsl:template>
 <xsl:template match="fruit">
  <li><xsl:value-of select="THIS IS A DELIBERATE ERROR!"/></li>
 </xsl:template>
</xsl:stylesheet>

Exemple #3 Collating and printing errors

L'exemple ci dessous capture et affiche les erreurs libxml levées lors de l'appel XSLTProcessor::importStyleSheet() avec une feuille de style contenant une erreur.

<?php

$xmldoc = new DOMDocument();
$xsldoc = new DOMDocument();
$xsl = new XSLTProcessor();

$xmldoc->loadXML('fruits.xml');
$xsldoc->loadXML('fruits.xsl');

libxml_use_internal_errors(true);
$result = $xsl->importStyleSheet($xsldoc);
if (!$result) {
    foreach (libxml_get_errors() as $error) {
        echo "Libxml error: {$error->message}\n";
    }
}
libxml_use_internal_errors(false);

if ($result) {
    echo $xsl->transformToXML($xmldoc);
}

?>

Résultat de l'exemple ci-dessus est similaire à :

Libxml error: Invalid expression

Libxml error: compilation error: file fruits.xsl line 9 element value-of
Libxml error: xsl:value-of : could not compile select expression 'THIS IS A DELIBERATE ERROR!'

User Contributed Notes

There are no user contributed notes for this page.


La classe XSLTProcessor

(PHP 5, PHP 7, PHP 8)

Introduction

Synopsis de la classe

XSLTProcessor {
/* Méthodes */
public getParameter ( string $namespace , string $name ) : string|false
public getSecurityPrefs ( ) : int
public hasExsltSupport ( ) : bool
public importStylesheet ( object $stylesheet ) : bool
public registerPHPFunctions ( array|string|null $functions = null ) : void
public removeParameter ( string $namespace , string $name ) : bool
public setParameter ( string $namespace , string $name , string $value ) : bool
public setProfiling ( string|null $filename ) : bool
public setSecurityPrefs ( int $preferences ) : int
public transformToDoc ( object $document , string|null $returnClass = null ) : DOMDocument|false
transformToURI ( DOMDocument $doc , string $uri ) : int
public transformToXml ( object $document ) : string|false|null
}

Sommaire

  • XSLTProcessor::__construct — Crée un nouvel objet XSLTProcessor
  • XSLTProcessor::getParameter — Récupère la valeur d'un paramètre
  • XSLTProcessor::getSecurityPrefs — Récupère les préférences de sécurité
  • XSLTProcessor::hasExsltSupport — Indique si PHP utilise EXSLT
  • XSLTProcessor::importStylesheet — Importe une feuille de style
  • XSLTProcessor::registerPHPFunctions — Active l'utilisation de PHP dans les feuilles de styles XSLT
  • XSLTProcessor::removeParameter — Efface un paramètre
  • XSLTProcessor::setParameter — Définit la valeur d'un paramètre
  • XSLTProcessor::setProfiling — Spécifie le fichier de profilage
  • XSLTProcessor::setSecurityPrefs — Définit les préférences de sécurité
  • XSLTProcessor::transformToDoc — Transforme en un document DOM
  • XSLTProcessor::transformToUri — Transforme en URI
  • XSLTProcessor::transformToXml — Transformer en XML

User Contributed Notes

joandres52725lm at gmail dot com 29-Apr-2020 07:29
[Update] PHP version /.3.15 and Windows Uncomment `extension=xsl` to activate it in your php.ini. Then restart your webserver to refresh php.
tschallacka 29-Feb-2016 09:58
uncomment extension=php_xsl.dll on windows to activate it in your php.ini. Then restart your webserver to refresh php.
flavius 13-Nov-2015 05:49
It requires PHP5 XSL extension. On linux:

sudo apt-get install php5-xsl


Crée un nouvel objet XSLTProcessor

  • « XSLTProcessor
  • XSLTProcessor::getParameter »
  • PHP Manual
  • XSLTProcessor
  • Crée un nouvel objet XSLTProcessor

XSLTProcessor::__construct

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::__construct — Crée un nouvel objet XSLTProcessor

Description

XSLTProcessor::__construct ( )

Crée un nouvel objet XSLTProcessor.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Exemple avec XSLTProcessor

<?php

$xsldoc = new DOMDocument();
$xsldoc->load($xsl_filename);

$xmldoc = new DOMDocument();
$xmldoc->load($xml_filename);

$xsl = new XSLTProcessor();
$xsl->importStyleSheet($xsldoc);
echo $xsl->transformToXML($xmldoc);

?>

User Contributed Notes

There are no user contributed notes for this page.


Récupère la valeur d'un paramètre

  • « XSLTProcessor::__construct
  • XSLTProcessor::getSecurityPrefs »
  • PHP Manual
  • XSLTProcessor
  • Récupère la valeur d'un paramètre

XSLTProcessor::getParameter

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::getParameter — Récupère la valeur d'un paramètre

Description

public XSLTProcessor::getParameter ( string $namespace , string $name ) : string|false

Récupère la valeur d'un paramètre s'il a été défini précédemment par la fonction XSLTProcessor::setParameter().

Liste de paramètres

namespace

L'URI de l'espace de noms du paramètre XSLT.

name

Le nom local du paramètre XSLT.

Valeurs de retour

La valeur du paramètre (sous la forme d'une chaîne de caractères), ou false s'il n'est pas défini.

Voir aussi

  • XSLTProcessor::setParameter() - Définit la valeur d'un paramètre
  • XSLTProcessor::removeParameter() - Efface un paramètre

User Contributed Notes

There are no user contributed notes for this page.


Récupère les préférences de sécurité

  • « XSLTProcessor::getParameter
  • XSLTProcessor::hasExsltSupport »
  • PHP Manual
  • XSLTProcessor
  • Récupère les préférences de sécurité

XSLTProcessor::getSecurityPrefs

(PHP >= 5.4.0, PHP 7, PHP 8)

XSLTProcessor::getSecurityPrefs — Récupère les préférences de sécurité

Description

public XSLTProcessor::getSecurityPrefs ( ) : int

Récupère les préférences de sécurité.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Un masque de constantes XSL_SECPREF_READ_FILE, XSL_SECPREF_WRITE_FILE, XSL_SECPREF_CREATE_DIRECTORY, XSL_SECPREF_READ_NETWORK, XSL_SECPREF_WRITE_NETWORK.

User Contributed Notes

There are no user contributed notes for this page.


Indique si PHP utilise EXSLT

  • « XSLTProcessor::getSecurityPrefs
  • XSLTProcessor::importStylesheet »
  • PHP Manual
  • XSLTProcessor
  • Indique si PHP utilise EXSLT

XSLTProcessor::hasExsltSupport

(PHP 5 >= 5.0.4, PHP 7, PHP 8)

XSLTProcessor::hasExsltSupport — Indique si PHP utilise EXSLT

Description

public XSLTProcessor::hasExsltSupport ( ) : bool

Cette méthode détermine si PHP a été compilé avec la bibliothèque » EXSLT.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Test du support EXSLT

<?php

$proc = new XSLTProcessor;
if (!$proc->hasExsltSupport()) {
    die('Le support d\'EXSLT n\'est pas disponible');
}

// Travaux avec EXSLT

?>

User Contributed Notes

There are no user contributed notes for this page.


Importe une feuille de style

  • « XSLTProcessor::hasExsltSupport
  • XSLTProcessor::registerPHPFunctions »
  • PHP Manual
  • XSLTProcessor
  • Importe une feuille de style

XSLTProcessor::importStylesheet

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::importStylesheet — Importe une feuille de style

Description

public XSLTProcessor::importStylesheet ( object $stylesheet ) : bool

Cette méthode importe une feuille de style dans le XSLTProcessor pour transformations.

Liste de paramètres

stylesheet

La feuille de style importée en tant qu'objet DOMDocument ou objet SimpleXMLElement.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

User Contributed Notes

rbmeo at yahoo dot com 12-Jul-2012 09:52
To make your import dynamic, try this code:

<?php
$dom = new DOMDocument();
$dom->load('main.xsl');
$xpath = new DomXPath($dom);
$importnode= $questionsXsl->createElement('xsl:include');
$attr= $questionsXsl->createAttribute('href');
$attr->value = 'import.xsl';
$importnode->appendChild($attr);
$dom->documentElement->insertBefore($importnode,$ref);
$dom->loadXml($dom->saveXml());
?>

this code basically loads the main stylesheet, prepend the import xsl code then reload as xml string so the imported stylesheet will be loaded at dom.
kevin at metalaxe dot com 17-Nov-2007 03:26
Just for reference, as of this writing, this function does not support importing multiple stylesheets. The following will output only the stylesheet transformation of the second imported sheet:

<?php

# LOAD XML FILE
$XML = new DOMDocument();
$XML->load( 'data.xml' );

# START XSLT
$xslt = new XSLTProcessor();

# IMPORT STYLESHEET 1
$XSL = new DOMDocument();
$XSL->load( 'template1.xsl' );
$xslt->importStylesheet( $XSL );

#IMPORT STYLESHEET 2
$XSL = new DOMDocument();
$XSL->load( 'template2.xsl' );
$xslt->importStylesheet( $XSL );

#PRINT
print $xslt->transformToXML( $XML );
?>

This wasn't documented and quite dissapointing.
fcartegnie 21-Jul-2007 06:11
PHP5 xsl processor has a different behaviour than PHP4's one with CDATA sections. (see http://bugs.php.net/bug.php?id=29837)
Loaded XSL sheet CDATA sections does not allow, by default, output-escaping handling (everything in the CDATA is escaped by default).

So in this case you can't build your XSL Dom the usual way:
    $xsldom = DomDocument::loadXML(file_get_contents('sheet.xsl'));

and must go through this one (allowing LIBXML_NOCDATA parameter):
    $xsldom = new DomDocument;
    $xsldom->load('sheet.xsl', LIBXML_NOCDATA);

Then the CDATA output-escaping behaviour will be correct.
diesel at spbnet dot ru 19-Mar-2007 09:07
This is not a problem. You may set DOMDocument's documentURI property.
Something like this

<?php
$xsl = new DOMDocument('1.0','UTF-8');

$xsl->loadXML(file_get_contents('/foo/bar/somefile.xsl');
$xsl->documentURI = '/foo/bar/somefile.xsl';

$xslProc = new XSLTProcessor();
$xslProc->importStylesheet($xsl);
?>

and document('other.xsl') will work fine!
bbrosseau at gmail 01-Mar-2005 08:46
For those who wants to use external documents, it is important not to use the DomDocument::loadXML because the processor will not have the path to look for other files

So if you want to transform some xml with a pre-generated stylesheet $f:

<?php
$f = 'somestylesheet.xsl';
$xsl = DomDocument::loadXML(file_get_contents($f));
?>

document('other.xml') will not work with relative path and <?php $xsl = DomDocument::load($f); ?> will!


Active l'utilisation de PHP dans les feuilles de styles XSLT

  • « XSLTProcessor::importStylesheet
  • XSLTProcessor::removeParameter »
  • PHP Manual
  • XSLTProcessor
  • Active l'utilisation de PHP dans les feuilles de styles XSLT

XSLTProcessor::registerPHPFunctions

(PHP 5 >= 5.0.4, PHP 7, PHP 8)

XSLTProcessor::registerPHPFunctions — Active l'utilisation de PHP dans les feuilles de styles XSLT

Description

public XSLTProcessor::registerPHPFunctions ( array|string|null $functions = null ) : void

Cette méthode permet d'utiliser les fonctions PHP en tant que fonctions XSLT dans les feuilles de style XSL.

Liste de paramètres

functions

Utilisez ce paramètre pour restreindre les fonctions PHP accessibles depuis XSLT.

Ce paramètre peut être une chaîne (le nom d'une fonction) ou un tableau de noms de fonctions.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Appel d'une fonction PHP depuis une feuille de style

<?php
$xml = <<<EOB
<allusers>
 <user>
  <uid>bob</uid>
 </user>
 <user>
  <uid>joe</uid>
 </user>
</allusers>
EOB;
$xsl = <<<EOB
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:php="http://php.net/xsl">
<xsl:output method="html" encoding="utf-8" indent="yes"/>
 <xsl:template match="allusers">
  <html><body>
    <h2>Users</h2>
    <table>
    <xsl:for-each select="user">
      <tr><td>
        <xsl:value-of
             select="php:function('ucfirst',string(uid))"/>
      </td></tr>
    </xsl:for-each>
    </table>
  </body></html>
 </xsl:template>
</xsl:stylesheet>
EOB;
$xmldoc = DOMDocument::loadXML($xml);
$xsldoc = DOMDocument::loadXML($xsl);

$proc = new XSLTProcessor();
$proc->registerPHPFunctions();
$proc->importStyleSheet($xsldoc);
echo $proc->transformToXML($xmldoc);
?>

User Contributed Notes

Matthew, info at mathias-schaefer dot de 25-Nov-2010 08:34
=> there is no instance of your class needed, you have to take care about the namespace (using 5.3).

<!-- xsl:
<xsl:value-of select="php:function ('My\Name\Space\MyClassName::methodName',1+2)"/>
--->

<?php
namespace My\Name\Space;

   class MyClassName
   {
      static public function methodName($someArgument)
      {
         return "resultis:".$someArgument;
      }
   }
?>

<!-- result:
resultis:3
-->

=> no to-string conversion of the argument needed
=> returning numbers is also possible (maybe DOM nodes too)

Keep on hackin'
Demerit 10-Aug-2010 07:58
Let's get the terminology correct here, folks.

If you are calling a function that is residing within a class, reference it by its INSTANCE name, NOT its class name.

class.my_class.php:

<?php
class class_name {
static function function_name($in){
return ($out);
}
}
?>

calling_document.php:

<?php
require_once('class.my_class.php');
$instance_name=new class_name();
?>

my_xslt.xsl:

<xsl:value-of select="php:function ('instance_name::function_name','garbage')" />

BTW, in 5.1.6 double-colon (::) is the only thing that works when calling a function that resides within a class. However, you must declare your function as static. Using -> as some have suggested (e.g., php:function ('instance_name->function_name','garbage')) doesn't work at all, no matter how you declare your function.
Nic Luciano 22-Jul-2009 11:09
Ritch said "If you wish to use a function from inside a class use the double colon (::) notation..."

Also note that the class function must be declared as static.
Ariz Jacinto 08-Jul-2008 02:21
If you want to use replace() function similar to XPath 2.0[1]  and you want to avoid a long XSLT function similar to this one[2], you can use PHP's str_replace() instead:

   <xsl:value-of select="php:functionString('str_replace','pattern', 'replacement' , . )">

Links:
  [1] http://www.w3.org/TR/2004/WD-xpath-functions-20041029/#func-replace
  [2] http://aspn.activestate.com/ASPN/Cookbook/XSLT/Recipe/65426

_
thsoft at vipmail dot hu 27-Dec-2007 02:22
Unfortunately, you can't pass arrays to PHP from XLST.
But you can pass an arbitrary number of arguments to a PHP function and then get them with func_get_args() as an array.
[There's no sense writing a function that is identical to the array() construct, because a function's return value is converted to a string when passed as an argument to another function. This means deep arrays cannot be handled this way.]
thsoft at vipmail dot hu 31-Jan-2007 03:20
The correct way to receive DOM nodes (let it be element, document, document fragment etc.) returned from PHP is to use <xsl:copy-of select="php:function...

I found the idea and an example here: http://bugs.php.net/bug.php?id=29409

For the technical details about the reason, see http://www.w3.org/TR/xslt#copy-of
phil at worldpoolfederation dot com 01-Dec-2006 03:22
Not true

Use :: to call static functions
Use -> to call non static functions

You must define a function as static in php 5.1 to be able to call it statically.
mark at thirst dot org 10-Oct-2006 07:25
Ritch said "If you wish to use a function from inside a class use the double colon (::) notation..."   This worked in 5.0.4 but no longer works in 5.1.6.
franp at free dot fr 02-Sep-2006 01:45
Note that if you want your output to validate against some xhtml dtd, you must add the following attribute to the xsl:stylesheet element of the xslt stylesheet :
exclude-result-prefixes="php".

Otherwise, you get an "invalid attribute xmlns:php" error.
taylorbarstow at that google mail thingy 26-May-2006 05:33
Add-on to my previous note (below) about returning nodesets to XSLT from PHP functions:

You don't have to return a DOMDocument, DOMElement works just as well.  Plus, retuning a DOMElement gets around the problem of discarding the root node which I discuss below and which is also touched on by "Ingram".
heinemann dot juergen at hjcms dot de 08-Mar-2006 02:23
You can find mor Examples at PHP Sources php-5.*/ext/xsl/tests
<?php

$xform = <<<EOT
<?xml version = '1.0' encoding = 'utf-8' ?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:php="http://php.net/xsl"
    xsl:extension-element-prefixes="php"
>
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<xsl:namespace-alias stylesheet-prefix="php" result-prefix="xsl" />
<xsl:template match="root">
<html>
<head>
    <title>Dateformat</title>
</head>
<body>
<xsl:for-each select="datenode">
    <li>
        <xsl:value-of select="php:functionString('convertDate', . )" />
    </li>
    </xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
EOT;

function convertDate( $i )
{
    setlocale( LC_TIME, 'de_DE' );
    return utf8_encode( strftime( '%B %d %A %Y %H:%M:%S CET', $i ) );
}

$xsl = new XSLTProcessor;
$xsl->registerPHPFunctions();
$xsl->setParameter( 'DOCTYPE', 'PUBLIC', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' );
$xsl->setParameter( 'html', 'xmlns', 'http://www.w3.org/1999/xhtml' );

$xdom = new DomDocument( '1.0', 'utf-8' );
$xdom->loadXML( $xform );

$xsl->importStyleSheet( $xdom );
unset( $xdom );

$dom = new DomDocument( '1.0', 'utf-8' );
$r = $dom->appendChild( $dom->createElement( 'root' ) );
foreach ( range( 1, 12 ) AS $i ) {
    $r->appendChild( $dom->createElement( 'datenode', mktime( date('G'), date('i'), date('s'), $i, date('d'), date('Y') ) ) );
}

header( "Content-Type: text/html; CHARSET=Windows-1252;" );
header( "Content-Encoding: utf-8" );
echo $xsl->transformToXML( $dom );

?>
Ingram 28-Feb-2006 12:33
Upon testing returning of a nodeset contributed by

taylorbarstow at that google mail thingy

(which works excellently, TY!)

I found that with using:

===
"Presumably, it's worth creating a template to do the discard:

<xsl:template select="*" mode="discardRoot">
   <xsl:apply-templates select="./*" />
</xsl:template>

Which you can call like so:

<xsl:apply-templates select="php:function('getNodeSet')" mode="discardRoot" /> "
===

I could only output the text and not any of the tags after applying templates - i.e. it stripped all elements around text.

Instead using:

===
<xsl:template match="/">
   <xsl:for-each select="php:function('getNodeSet')" />
     <xsl:apply-templates />
   </xsl:for-each>
</xsl:template>

which effectively discards the root node.
===

Worked fine and allowed me to apply-templates without problem on the returned nodeset.
hopeseekr at gmail dot com 01-Feb-2006 12:17
One of the peskiest things I had problems with was encoding URL parameters.  I mean, pretend you want to populate a link with "search+terms" instead of just "search terms".  I was including two seperate URLs in the XML and that was ludicrous.

Below is a far more elegant PHP+XSLT solution.  You will also see it uses two *undocumented* features of registerPHPFunctions(), namely php:functionString() and the passing of parameters to the function.  I figured this out by trial and error; I really hope this note helps you as it *greatly* expands the power of php functions in XSLT!

<?php
/* --- XML input --- */
<search_results>
   <query>concert tickets</query>
</search_results>

/* --- XSL code --- */
<!-- Display query -->
<xsl:template match="search_results">
   <!-- Get URL-encoded string via PHP -->
   <xsl:variable name="safeurl" as="xs:string" select="php:functionString('urlencode', query)" />
   <p>Your search for <em><xsl:value-of select="query"/></em> can be continued at <a href="http://www.tixtix.com/search.php?q={$safeurl}">our search engine</a></p>
</xsl:template>

/* --- XHTML output --- */
<p>Your search for <em>concert tickets</em> can be continued at <a href="http://www.tixtix.com/search.php?q=space+cowboy">our search engine</a></p>
?>

Cool, huh?
taylorbarstow at that google mail thingy 01-Dec-2005 07:14
From a PHP function, you can pass a nodeset back to XSL using a DOMDocument.  For example:

<?php

function getNodeSet() {
   $xml =
       "<test>" .
       "<a-node>This is a node</a-node>" .
       "<a-node>This is another node</a-node>" .
       "</test>";
   $doc = new DOMDocument;
   $doc->loadXml($xml);
   return $doc;
}

?>

The only problem I've found is that the root level node in your returned DOM document acts like the root level node of your original.   SO, it's easy to introduce an infinite loop like so:

<xsl:template match="/">
   <xsl:apply-templates select="php:function('getNodeSet')" />
</xsl:template>

To avoid this, I've been using a construct like:

<xsl:template match="/">
   <xsl:for-each select="php:function('getNodeSet')" />
      <xsl:apply-templates />
   </xsl:for-each>
</xsl:template>

which effectively discards the root node.  Presumably, it's worth creating a template to do the discard:

<xsl:template select="*" mode="discardRoot">
   <xsl:apply-templates select="./*" />
</xsl:template>

Which you can call like so:

<xsl:apply-templates select="php:function('getNodeSet')" mode="discardRoot" />
Ritch at Bugsoftware dot co dot uk 22-Jun-2005 03:18
If you wish to use a function from inside a class use the double colon (::) notation, for example;

php:functionString('classname::function')

The funtion is fired off as a static and as such acts like a function in the global namespace.
benbarnett 04-Mar-2005 04:34
You can use the php:functionString() in the XSL, which will automatically convert output to a string!
zac at zacbowling dot com 27-Oct-2004 01:48
One thing I have told a lot of people to do if they are having
issues with this function is to check for any 'xmlns' attributes
that get generated and added to your xml pages by some
types of popular software.

<?php
$file = "http://data.map***.net/m***ck.asmx/GetMessages?IMEI=$id";

$docxml = file_get_contents($file);

//You may have to do something like this where
//I remove any instance of xmlns tags that get
//returned by my ASP.NET SOAP responses.

$docxml =
 str_replace("xmlns=\"http://data.map***.net/m***ck.asmx?WSDL\"",
  "",$docxml);

$xslt = new xsltProcessor;

//You don't remove them then this function will blow up.
$xslt->registerPHPFunctions();
$xslt->importStyleSheet(DomDocument::load('../xsl/message.xsl'));
print $xslt->transformToXML(DomDocument::loadXML($docxml));

?>

Also a few cool tricks with this function is that you can call
built in PHP functions. For example:

<xsl:value-of
  select="php:function('nl2br',string(MessageContent/Message))"
  disable-output-escaping="yes"/>

That XSL value will now return your normal string but replace
all your new line charactors in your xml with '<br />'s.

Also note the 'disable-output-escaping="yes"' statement. If
you don't call this, then the output of that bind will be ran
thru basicly a "htmlencode()" type function.

Last but not least, take a look at the 'string()' function I
called in XSL before passing it back. That is because without
calling that, when it runs it will try and pass the node object,
and not its value (which is what you most likely only want).

This function is very awsome and could lead to some very
interesting code development. Skins could be loaded
remotely. You could write an RSS viewer in PHP without much
code. You could parse XHTML pages into another view (either
localy or remotely). Then you can take that same XML
content and throw it against ASP.NET, Java, or even a
command line processing tool using that same exact XSL
style sheet and generate the front ends for you page without
much change. I'm very excited.

Happy codding.
junkmail at eighteyes dot com 08-Oct-2004 02:52
When writing a stylesheet that uses a callback function be sure to include a namespace declaration for php, as follows:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:php="http://php.net/xsl" version='1.0'>
begemot at php dot com dot ua 28-Sep-2004 06:24
I think it help  your.
<?php

function dateLang () {
        return strftime("%A");
}

$xsl = new DomDocument();
$xsl->load("datetime.xsl");
$inputdom = new DomDocument();
$inputdom->load("today.xml");

$proc = new XsltProcessor();
$proc->registerPhpFunctions();

// Load the documents and process using $xslt
$xsl = $proc->importStylesheet($xsl);

/* transform and output the xml document */
$newdom = $proc->transformToDoc($inputdom);

print $newdom->saveXML();

?>

Here's the XSLT stylesheet, datetime.xsl, that will call that function:

<?xml version="1.0" encoding="iso-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<xsl:template match="/">
  <xsl:value-of select="php:function('dateLang')" />
</xsl:template>
</xsl:stylesheet>

And here's an absolute minimal XML file, today.xml, to pass through the stylesheet (although articles.xml would achieve the same result):

<?xml version="1.0" encoding="iso-8859-1" ?>
<today></today>
zac at zacbowling dot com 26-Aug-2004 09:48
One thing to note about this function. A lot of values need to be converted to a XSLT string using the "string()" function in XLS before you pass them to your functions, and when you return them make sure that if they are strings that you call the "strval()" in php before doing so. This saved me hours.

Hope that helps.

Zac Bowling


Efface un paramètre

  • « XSLTProcessor::registerPHPFunctions
  • XSLTProcessor::setParameter »
  • PHP Manual
  • XSLTProcessor
  • Efface un paramètre

XSLTProcessor::removeParameter

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::removeParameter — Efface un paramètre

Description

public XSLTProcessor::removeParameter ( string $namespace , string $name ) : bool

Efface un paramètre, s'il est défini. Ceci fera que le processeur utilisera la valeur par défaut pour le paramètre comme défini dans la feuille de style.

Liste de paramètres

namespace

L'URI de l'espace de noms du paramètre XSLT.

name

Le nom local du paramètre XSLT.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Voir aussi

  • XSLTProcessor::setParameter() - Définit la valeur d'un paramètre
  • XSLTProcessor::getParameter() - Récupère la valeur d'un paramètre

User Contributed Notes

There are no user contributed notes for this page.


Définit la valeur d'un paramètre

  • « XSLTProcessor::removeParameter
  • XSLTProcessor::setProfiling »
  • PHP Manual
  • XSLTProcessor
  • Définit la valeur d'un paramètre

XSLTProcessor::setParameter

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::setParameter — Définit la valeur d'un paramètre

Description

public XSLTProcessor::setParameter ( string $namespace , string $name , string $value ) : bool
public XSLTProcessor::setParameter ( string $namespace , array $options ) : bool

Spécifie la valeur d'un ou plusieurs paramètres pour être utilisés dans une sous-séquence de transformation avec XSLTProcessor. Si le paramètre n'existe pas dans la feuille de style, il sera ignoré.

Liste de paramètres

namespace

L'URI de l'espace de noms du paramètre XSLT.

name

Le nom local du paramètre XSLT.

value

La nouvelle valeur du paramètre XSLT.

options

Un tableau de paire nom => valeur.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Modification du propriétaire avant la transformation

<?php

$collections = array(
    'Marc Rutkowski' => 'marc',
    'Olivier Parmentier' => 'olivier'
);

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// Configure le transformateur
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // attachement des règles xsl

foreach ($collections as $name => $file) {
    // Chargement de la source XML
    $xml = new DOMDocument;
    $xml->load('collection_' . $file . '.xml');

    $proc->setParameter('', 'owner', $name);
    $proc->transformToURI($xml, 'file:///tmp/' . $file . '.html');
}

?>

Voir aussi

  • XSLTProcessor::getParameter() - Récupère la valeur d'un paramètre
  • XSLTProcessor::removeParameter() - Efface un paramètre

User Contributed Notes

richard at aggmedia dot net 04-Mar-2009 07:47
Note that there is no way to remove a parameter from an XSLTProcessor unless you know its name, and there is no way (that I can find) to get a list of the current parameters.

This means that you cannot reuse an XSLTProcessor with different parameters unless you call XSLTProcessor->removeParameter() on every parameter, and to do that you need to know the names of all the currently set parameters.

I bumped into this because we were caching XSLTProcessors for reuse, and they were spitting out content based on phantom parameters (they were still there from previous uses).
Lennaert van der Linden 13-Feb-2008 06:28
The parameter will not be set if the value contains both single and double quotes. Instead a warning will be shown when transforming the document:

PHP Warning:  XSLTProcessor::transformToXml(): Cannot create XPath expression (string contains both quote and double-quotes)
brettz9 08-May-2007 08:27
It seems heinemann's usage is not correct and does not achieve the intended result.

This method's purpose is to change a global <xsl:param> value in the XSL stylesheet--not to change an attribute of any other element.  <xsl:param> basically lets you set up a stylesheet which can be customized (as from PHP) externally (without needing to tamper with the original XSL file).

Here's an example of usage (that will work):

Stylesheet:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="print_something" select="defaultstring"/>
    <xsl:template match="/mydoc">
        <p style="color:red;">Printed parameter: <xsl:value-of select="$print_something"/></p>
    </xsl:template>
</xsl:stylesheet>

Script:

<?php
$dom = new DOMDocument();
$xsl = new XSLTProcessor;
$xsl->setParameter( '', 'print_something', "Now I've overridden the default!");
$style = realpath( "./my_stylesheet.xslt" );
$dom->load($style);
$xsl->importStyleSheet($dom);
$dom->loadXML('<mydoc></mydoc>');

$out = $xsl->transformToXML( $dom );

var_dump( '<pre>',
    htmlentities( $out, ENT_QUOTES, 'utf-8' ),
    $xsl->getParameter('', 'print_something'),
'</pre>' );
?>

gives:

string(5) "

"
string(143) "<?xml version="1.0"?>
<p style="color:red;">Printed parameter: Now I've overridden the default!</p>
"
string(32) "Now I've overridden the default!"
string(6) "

"

Notice that at present adding a namespace will not work. The only option at present is to set the first parameter for namespace to an empty string (though you can add the prefix with colon to the second argument for name in order to set the parameter for a namespace-prefixed parameter name).

See http://bugs.php.net/bug.php?id=30622
OrionI 01-May-2007 07:19
After looking at this a little further (see http://bugs.php.net/bug.php?id=41248), it appears that it's a shortcoming of libxslt, not PHP, that prevents passing in DOMDocuments or DOMNodes as parameters.
Orion I 30-Apr-2007 08:46
I've been trying to pass in a DOMDocument object as a parameter so I can stuff a bunch of data into XML nodes, but it appears that this function is not capable of it. I was hoping to get it to work like it does in the .NET 2.0 framework. (See http://msdn2.microsoft.com/en-us/library/
system.xml.xsl.xsltargumentlist.addparam.aspx)
But after looking at the PHP 5.2.1 source code, /php-5.2.1/ext/xsl/xsltprocessor.c line 604-650, it appears that it's not possible to do so in PHP even though it appears that libxslt supports it (see http://xmlsoft.org/XSLT/html/libxslt-variables.html
#xsltParseGlobalParam)

In fact, if the parameters aren't exactly what's expected, you'll always get a warning like this:

Wrong parameter count for XSLTProcessor::setParameter()
heinemann dot juergen at hjcms dot de 07-Mar-2006 03:39
Example for how it works.

<?xml version = '1.0' encoding = 'utf-8' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"
    indent="yes"
    encoding="ISO-8859-15"
    doctype-system = "-//W3C//DTD XHTML 1.0 Transitional//EN"
    doctype-public = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
/>
<xsl:template match="docs">
<html>
<head>
    <title>
        <xsl:text>Example</xsl:text>
    </title>
</head>
<body>
    <xsl:for-each select="block">
        <div>
            <xsl:value-of select="." />
        </div>
    </xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

------------------

<?php
$dom = new DomDocument( '1.0', 'utf-8' );
$xsl = new XSLTProcessor;
$xsl->setParameter( 'block', 'xmlns', 'http://www.w3.org/1999/xhtml' );

$style = realpath( "./my_stylesheet.xslt" );
$dom->load( $style );
$xsl->importStyleSheet( $dom );

$dom->loadXML( '<docs>
    <block>Howto set xhtml Transitional Namespaces width php</block>
    <block>see http://www.php.net</block>
</docs>' );

$out = $xsl->transformToXML( $dom );

var_dump( '<pre>',
    htmlentities( $out, ENT_QUOTES, 'utf-8' ),
    $xsl->getParameter( 'block', 'xmlns' ),
    $xsl->getParameter( 'docs', 'xmlns' ),
'</pre>' );

?>
Stoke A 11-Aug-2005 03:40
XSLTProcessor::removeParameter() won't work on parameters set via XSLTProcessor::setParameter(string namespace, array options) in 5.1+ -- they need to be set and removed one by one.


Spécifie le fichier de profilage

  • « XSLTProcessor::setParameter
  • XSLTProcessor::setSecurityPrefs »
  • PHP Manual
  • XSLTProcessor
  • Spécifie le fichier de profilage

XSLTProcessor::setProfiling

(PHP >= 5.3.0, PHP 7, PHP 8)

XSLTProcessor::setProfiling — Spécifie le fichier de profilage

Description

public XSLTProcessor::setProfiling ( string|null $filename ) : bool

Spécifie le fichier de sortie contenant les informations de profilage lors de l'exécution d'une feuille de style.

Liste de paramètres

filename

Chemin vers le fichier pour décharger les informations de profilage.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Exemples

Exemple #1 Exemple d'utilisation du profilage

<?php
// Chargement de la source XML
$xml = new DOMDocument;
$xml->load('collection.xml');

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// Configuration du transformateur
$proc = new XSLTProcessor;
$proc->setProfiling('profiling.txt');
$proc->importStyleSheet($xsl); // attachement des règles xsl

echo trim($proc->transformToDoc($xml)->firstChild->wholeText);
?>

Le code ci-dessus produira les informations suivantes dans le fichier de profilage :

number               match                name      mode  Calls Tot 100us Avg

    0                   cd                                    2      3      1
    1           collection                                    1      1      1

                         Total                                3      4

User Contributed Notes

There are no user contributed notes for this page.


Définit les préférences de sécurité

  • « XSLTProcessor::setProfiling
  • XSLTProcessor::transformToDoc »
  • PHP Manual
  • XSLTProcessor
  • Définit les préférences de sécurité

XSLTProcessor::setSecurityPrefs

(PHP >= 5.4.0, PHP 7, PHP 8)

XSLTProcessor::setSecurityPrefs — Définit les préférences de sécurité

Description

public XSLTProcessor::setSecurityPrefs ( int $preferences ) : int

Définit les préférences de sécurité.

Liste de paramètres

preferences

Les nouvelles préférences de sécurité. Les constantes suivantes peuvent être combinées : XSL_SECPREF_READ_FILE, XSL_SECPREF_WRITE_FILE, XSL_SECPREF_CREATE_DIRECTORY, XSL_SECPREF_READ_NETWORK, XSL_SECPREF_WRITE_NETWORK. Alternatively, XSL_SECPREF_NONE or XSL_SECPREF_DEFAULT can be passed.

Valeurs de retour

Retourne les anciennes préférences de sécurité

User Contributed Notes

There are no user contributed notes for this page.


Transforme en un document DOM

  • « XSLTProcessor::setSecurityPrefs
  • XSLTProcessor::transformToUri »
  • PHP Manual
  • XSLTProcessor
  • Transforme en un document DOM

XSLTProcessor::transformToDoc

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::transformToDoc — Transforme en un document DOM

Description

public XSLTProcessor::transformToDoc ( object $document , string|null $returnClass = null ) : DOMDocument|false

Transforme le noeud source en un DOMDocument en y appliquant la feuille de style donnée par la méthode XSLTProcessor::importStylesheet().

Liste de paramètres

document

Le noeud à transformer.

Valeurs de retour

Le DOMDocument résultant ou false si une erreur survient.

Exemples

Exemple #1 Transformation en un document DOM

<?php

// Chargement de la source XML
$xml = new DOMDocument;
$xml->load('collection.xml');

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// Configuration du transformateur
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // attachement des règles xsl

echo trim($proc->transformToDoc($xml)->firstChild->wholeText);

?>

L'exemple ci-dessus va afficher :

Hey! Welcome to Nicolas Eliaszewicz's sweet CD collection!

Voir aussi

  • XSLTProcessor::transformToUri() - Transforme en URI
  • XSLTProcessor::transformToXml() - Transformer en XML

User Contributed Notes

franp at free dot fr 30-Aug-2006 05:16
In most cases if you expect XML (or XHTML) as output you better use transformToXML() directly. You gain better control over xsl:output attributes, notably omit-xml-declaration.

Instead of :
$proc = new XSLTProcessor();
$proc->importStylesheet($xsl);
$dom = $proc->transformToDoc($xml);
echo $dom->saveXML();

do use :
$proc = new XSLTProcessor();
$proc->importStylesheet($xsl);
$newXml = $proc->transformToXML($xml);
echo $newXml;

In the first case, <?xml version="1.0" encoding="utf-8"?> is added whatever you set the omit-xml-declaration while transformToXML() take the attribute into account.


Transforme en URI

  • « XSLTProcessor::transformToDoc
  • XSLTProcessor::transformToXml »
  • PHP Manual
  • XSLTProcessor
  • Transforme en URI

XSLTProcessor::transformToUri

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::transformToUri — Transforme en URI

Description

XSLTProcessor::transformToURI ( DOMDocument $doc , string $uri ) : int

Transforme le noeud source en une URI en y appliquant la feuille de style donnée par la méthode XSLTProcessor::importStylesheet().

Liste de paramètres

doc

Le document à transformer.

uri

L'URL pour la transformation.

Valeurs de retour

Retourne le nombre d'octets écrits ou false si une erreur survient.

Exemples

Exemple #1 Transformation en un fichier HTML

<?php

// Chargement du source XML
$xml = new DOMDocument;
$xml->load('collection.xml');

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// Configuration du transformateur
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // attachement des règles xsl

$proc->transformToURI($xml, 'file:///tmp/out.html');

?>

Voir aussi

  • XSLTProcessor::transformToDoc() - Transforme en un document DOM
  • XSLTProcessor::transformToXml() - Transformer en XML

User Contributed Notes

jonbarnett at gmail dot com 13-Jul-2007 12:32
Sometimes you don't want to transform to a file, an XML string (because you're using text or html), or a DOMDocument.

To transform to standard output, you can use php://output

<?php
$proc->transformToURI($xml, 'php://output');
?>

To transform to a string (of HTML or text, instead of XML), you can use the above in conjunction with output buffering.
<?php
ob_start();
$proc->transformToURI($xml, 'php://output');
$outputString = ob_get_flush();
?>


Transformer en XML

  • « XSLTProcessor::transformToUri
  • Extensions GUI »
  • PHP Manual
  • XSLTProcessor
  • Transformer en XML

XSLTProcessor::transformToXml

(PHP 5, PHP 7, PHP 8)

XSLTProcessor::transformToXml — Transformer en XML

Description

public XSLTProcessor::transformToXml ( object $document ) : string|false|null

Transforme le noeud source en une chaîne en y appliquant une feuille de style donnée par la méthode xsltprocessor::importStylesheet().

Liste de paramètres

document

L'objet DOMDocument ou SimpleXMLElement a transformer.

Valeurs de retour

Le résultat de la transformation en tant que chaîne de caractères ou false si une erreur survient.

Exemples

Exemple #1 Transformation en une chaîne

<?php

// CHargement du source XML
$xml = new DOMDocument;
$xml->load('collection.xml');

$xsl = new DOMDocument;
$xsl->load('collection.xsl');

// Configuration du transformateur
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // attachement des règles xsl

echo $proc->transformToXML($xml);

?>

L'exemple ci-dessus va afficher :

Hey! Welcome to Nicolas Eliaszewicz's sweet CD collection!

<h1>Fight for your mind</h1><h2>by Ben Harper - 1995</h2><hr>
<h1>Electric Ladyland</h1><h2>by Jimi Hendrix - 1997</h2><hr>

Voir aussi

  • XSLTProcessor::transformToDoc() - Transforme en un document DOM
  • XSLTProcessor::transformToUri() - Transforme en URI

User Contributed Notes

Josef Hornych 04-Mar-2015 07:42
Note that the method's name is sort of deceiving, because it does not only output XML, but any string that is generated by the processor. It should rather be called transformToString. So if your output method is  "text/plain", for example, this is the way to receive the resulting string.
zweibieren at yahoo dot com 15-Sep-2010 11:15
Entities are omitted from the output with the code above.
The symptom was that &nbsp;
-- which should work with UTF-8 encoding --
did not even get to XSLTProcessor, let alone through it.
After too much hacking I discovered the simple fix:
set substituteEntities to true in the DOMDocument for the XSL file.
That is, replace the loading of the xsl document with

<?php
   $xsl = new DOMDocument;
   $xsl->substituteEntities = true;    // <===added line
   $xsl->load('collection.xsl');
?>

However, this fails when data entries have HTML entity references. (Some database entries may even contain user generated text.) libxml has the pedantic habit of throwing a FATAL error for any undefined entitiy. Solution: hide the entities so libxml doesn't see them.

<?php
function hideEntities($data) {
        return str_replace("&", "&amp;", $data);
}
?>

You could just add this to the example, but it is tidier to define a function to load data into a DOMDocument. This way you don't need entity declarations in catalog.xsl, either.

<?php
// Added function for  Example #1

/** Load an XML file and create a DOMDocument.
Handles arbitrary entities, even undefined ones.
*/
function fileToDOMDoc($filename) {
    $dom= new DOMDocument;
    $xmldata = file_get_contents($filename);
    $xmldata = str_replace("&", "&amp;", $xmldata);  // disguise &s going IN to loadXML()
    $dom->substituteEntities = true;  // collapse &s going OUT to transformToXML()
    $dom->loadXML($xmldata);
    return $dom;
}

// Compare with  Example #1 Transforming to a string

// Load the XML sources
$xml = fileToDOMDoc('collection.xml');
$xsl = fileToDOMDoc('collection.xsl');

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);

// transform $xml according to the stylesheet $xsl
echo $proc->transformToXML($xml); // transform the data
?>
michael dot weibel at tilllate dot com 03-Dec-2009 01:33
If you retrieve "false" from the transformToXML method, use libxml_get_last_error() or libxml_get_errors() to retrieve the errors.
Charlie Murder 29-Nov-2009 07:43
To prevent your xsl file from automatically prepending

<?xml version="1.0"?>

whilst keeping the output as xml, which is preferable for a validated strict xhtml file, rather specify output as

<xsl:output method="xml" omit-xml-declaration="yes" />
john 05-Feb-2008 11:09
If your xsl doesn't have <html> tags. The output will contain <?xml version="1.0"?>. To fix this you can add the following to your xsl stylesheet:

<xsl:output
method="html" />
smubldg4 at hotmail dot com 02-Oct-2007 08:58
How to fix:: *Fatal error: Call to undefined method domdocument::load()*

If you get this error, visit the php.ini file and try commenting out the following, like this:

;[PHP_DOMXML]
;extension=php_domxml.dll

Suddenly, the wonderfully simple example above works as advertised.
jeandenis dot boivin at gmail dot com 13-Mar-2007 04:59
$domTranObj = $xslProcessor->transformToDoc($domXmlObj);
$domHtmlText = $domTranObj->saveHTML();

Do fix the <meta> for valid XHTML but do not correctly end empty node like <br /> which ouput like this : <br></br>

Some browser note this as 2 different <br /> ...

To fix this use

$domTranObj = $xslProcessor->transformToDoc($domXmlObj);
$domHtmlText = $domTranObj->saveXML();
Thomas Praxl 22-Jan-2007 01:36
I noticed an incompatibility between libxslt (php4) and the transformation through XSLTProcessor.
Php5 and the XSLTProcessor seem to add implicit CDATA-Section-Elements.
If you have an xslt like

<script type="text/javascript">
foo('<xsl:value-of select="bar" />');
</script>

It will result in

<script type="text/javascript"><![CDATA[
foo('xpath-result-of-bar');
]]></script>

(at least for output method="xml" in order to produce strict xhtml with xslt1)

That brings up an error (at least) in Firefox 1.5 as it is no valid javascript.
It should look like that:

<script type="text/javascript">//<![CDATA[
foo('xpath-result-of-bar');
]]></script>

As the CDATA-Section is implicit, I was not able to disable the output or to put a '//' before it.

I tried everything about xsl:text disable-output-escaping="yes"

I also tried to disable implicit adding of CDATA with <output cdata-section-elements="" />
(I thought that would exclude script-tags. It didn't).

The solution:

<xsl:text disable-output-escaping="yes">&lt;script type="text/javascript"&gt;
  foo('</xsl:text><xsl:value-of select="bar" /><xsl:text disable-output-escaping="yes">');
            &lt;/script&gt;</xsl:text>

Simple, but it took me a while.
werner@mollentze 15-Aug-2006 01:53
The transformToXML function can produce valid XHTML output - it honours the <xsl:output> element's attributes, which defines the format of the output document.

For instance, if you want valid XHTML 1.0 Strict output, you can provide the following attribute values for the <xsl:output> element in your XSL stylesheet:

<xsl:output
method="xml"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" />
lsoethout at hotmail dot com 19-Feb-2006 02:35
The function transformToXML has a problem with the meta content type tag. It outputs it like this:

    <meta http-equiv="Content-Type" content="text/html; CHARSET=Windows-1252">

which is not correct X(HT)ML, because it closes with '>' instead of with '/>'.

A way to get the output correct is to use instead of transformToXML first transformToDoc anf then saveHTML:

    $domTranObj = $xslProcessor->transformToDoc($domXmlObj);
    $domHtmlText = $domTranObj->saveHTML();
jlipps at mac 06-Jan-2005 08:05
transformToXML, if you have registered PHP functions previously, does indeed attempt to execute these functions when it finds them in a php:function() pseudo-XSL function. It even finds static functions within classes, for instance:

<xsl:value-of select="php:function('MyClass::MyFunction', string(@attr), string(.))" disable-output-escaping="yes"/>

However, in this situation transformToXML does not try to execute "MyClass::MyFunction()". Instead, it executes "myclass:myfunction()". In PHP, since classes and functions are (I think) case-insensitive, this causes no problems.

A problem arises when you are combining these features with the __autoload() feature. So, say I have MyClass.php which contains the MyFunction definition. Generally, if I call MyClass::MyFunction, PHP will pass "MyClass" to __autoload(), and __autoload() will open up "MyClass.php".

What we have just seen, however, means that transformToXML will pass "myclass" to __autoload(), not "MyClass", with the consequence that PHP will try to open "myclass.php", which doesn't exist, instead of "MyClass.php", which does. On case-insensitive operating systems, this is not significant, but on my RedHat server, it is--PHP will give a file not found error.

The only solution I have found is to edit the __autoload() function to look for class names which are used in my XSL files, and manually change them to the correct casing.

Another solution, obviously, is to use all-lowercase class and file names.


Extensions GUI

  • UI
    • Introduction
    • Installation/Configuration
    • UI\Point — Represents a position (x,y)
    • UI\Size — Represents dimenstions (width, height)
    • UI\Window — Window
    • UI\Control — Control
    • UI\Menu — Menu
    • UI\MenuItem — Menu Item
    • UI\Area — Area
    • UI\Executor — Execution Scheduler
    • UI\Controls\Tab — Tab Control
    • UI\Controls\Check — Check Control
    • UI\Controls\Button — Button Control
    • UI\Controls\ColorButton — ColorButton Control
    • UI\Controls\Label — Label Control
    • UI\Controls\Entry — Entry Control
    • UI\Controls\MultilineEntry — MultilineEntry Control
    • UI\Controls\Spin — Spin Control
    • UI\Controls\Slider — Slider Control
    • UI\Controls\Progress — Progress Control
    • UI\Controls\Separator — Control Separator
    • UI\Controls\Combo — Combo Control
    • UI\Controls\EditableCombo — EdiableCombo Control
    • UI\Controls\Radio — Radio Control
    • UI\Controls\Picker — Picker Control
    • UI\Controls\Form — Control Form (Arrangement)
    • UI\Controls\Grid — Control Grid (Arrangement)
    • UI\Controls\Group — Control Group (Arrangement)
    • UI\Controls\Box — Control Box (Arrangement)
    • UI\Draw\Pen — Draw Pen
    • UI\Draw\Path — Draw Path
    • UI\Draw\Matrix — Draw Matrix
    • UI\Draw\Color — Color Representation
    • UI\Draw\Stroke — Draw Stroke
    • UI\Draw\Brush — Brushes
    • UI\Draw\Brush\Gradient — Gradient Brushes
    • UI\Draw\Brush\LinearGradient — Linear Gradient
    • UI\Draw\Brush\RadialGradient — Radial Gradient
    • UI\Draw\Text\Layout — Represents Text Layout
    • UI\Draw\Text\Font — Represents a Font
    • UI\Draw\Text\Font\Descriptor — Font Descriptor
    • UI Fonctions
    • UI\Draw\Text\Font\Weight — Font Weight Settings
    • UI\Draw\Text\Font\Italic — Italic Font Settings
    • UI\Draw\Text\Font\Stretch — Font Stretch Settings
    • UI\Draw\Line\Cap — Line Cap Settings
    • UI\Draw\Line\Join — Line Join Settings
    • UI\Key — Key Identifiers
    • UI\Exception\InvalidArgumentException — InvalidArgumentException
    • UI\Exception\RuntimeException — RuntimeException

User Contributed Notes

There are no user contributed notes for this page.


UI

  • Introduction
  • Installation/Configuration
    • Pré-requis
    • Installation
  • UI\Point — Represents a position (x,y)
    • UI\Point::at — Size Coercion
    • UI\Point::__construct — Construct a new Point
    • UI\Point::getX — Retrieves X
    • UI\Point::getY — Retrieves Y
    • UI\Point::setX — Set X
    • UI\Point::setY — Set Y
  • UI\Size — Represents dimenstions (width, height)
    • UI\Size::__construct — Construct a new Size
    • UI\Size::getHeight — Retrieves Height
    • UI\Size::getWidth — Retrives Width
    • UI\Size::of — Point Coercion
    • UI\Size::setHeight — Set Height
    • UI\Size::setWidth — Set Width
  • UI\Window — Window
    • UI\Window::add — Add a Control
    • UI\Window::__construct — Construct a new Window
    • UI\Window::error — Affiche un message d'erreur
    • UI\Window::getSize — Get Window Size
    • UI\Window::getTitle — Get Title
    • UI\Window::hasBorders — Border Detection
    • UI\Window::hasMargin — Margin Detection
    • UI\Window::isFullScreen — Full Screen Detection
    • UI\Window::msg — Show Message Box
    • UI\Window::onClosing — Closing Callback
    • UI\Window::open — Open Dialog
    • UI\Window::save — Save Dialog
    • UI\Window::setBorders — Border Use
    • UI\Window::setFullScreen — Full Screen Use
    • UI\Window::setMargin — Margin Use
    • UI\Window::setSize — Set Size
    • UI\Window::setTitle — Window Title
  • UI\Control — Control
    • UI\Control::destroy — Destroy Control
    • UI\Control::disable — Disable Control
    • UI\Control::enable — Enable Control
    • UI\Control::getParent — Get Parent Control
    • UI\Control::getTopLevel — Get Top Level
    • UI\Control::hide — Hide Control
    • UI\Control::isEnabled — Determine if Control is enabled
    • UI\Control::isVisible — Determine if Control is visible
    • UI\Control::setParent — Set Parent Control
    • UI\Control::show — Control Show
  • UI\Menu — Menu
    • UI\Menu::append — Append Menu Item
    • UI\Menu::appendAbout — Append About Menu Item
    • UI\Menu::appendCheck — Append Checkable Menu Item
    • UI\Menu::appendPreferences — Append Preferences Menu Item
    • UI\Menu::appendQuit — Append Quit Menu Item
    • UI\Menu::appendSeparator — Append Menu Item Separator
    • UI\Menu::__construct — Construct a new Menu
  • UI\MenuItem — Menu Item
    • UI\MenuItem::disable — Disable Menu Item
    • UI\MenuItem::enable — Enable Menu Item
    • UI\MenuItem::isChecked — Detect Checked
    • UI\MenuItem::onClick — On Click Callback
    • UI\MenuItem::setChecked — Set Checked
  • UI\Area — Area
    • UI\Area::onDraw — Draw Callback
    • UI\Area::onKey — Key Callback
    • UI\Area::onMouse — Mouse Callback
    • UI\Area::redraw — Redraw Area
    • UI\Area::scrollTo — Area Scroll
    • UI\Area::setSize — Set Size
  • UI\Executor — Execution Scheduler
    • UI\Executor::__construct — Construct a new Executor
    • UI\Executor::kill — Stop Executor
    • UI\Executor::onExecute — Execution Callback
    • UI\Executor::setInterval — Interval Manipulation
  • UI\Controls\Tab — Tab Control
    • UI\Controls\Tab::append — Append Page
    • UI\Controls\Tab::delete — Delete Page
    • UI\Controls\Tab::hasMargin — Margin Detection
    • UI\Controls\Tab::insertAt — Insert Page
    • UI\Controls\Tab::pages — Page Count
    • UI\Controls\Tab::setMargin — Set Margin
  • UI\Controls\Check — Check Control
    • UI\Controls\Check::__construct — Construct a new Check
    • UI\Controls\Check::getText — Get Text
    • UI\Controls\Check::isChecked — Checked Detection
    • UI\Controls\Check::onToggle — Toggle Callback
    • UI\Controls\Check::setChecked — Set Checked
    • UI\Controls\Check::setText — Set Text
  • UI\Controls\Button — Button Control
    • UI\Controls\Button::__construct — Construct a new Button
    • UI\Controls\Button::getText — Get Text
    • UI\Controls\Button::onClick — Click Handler
    • UI\Controls\Button::setText — Set Text
  • UI\Controls\ColorButton — ColorButton Control
    • UI\Controls\ColorButton::getColor — Get Color
    • UI\Controls\ColorButton::onChange — Change Handler
    • UI\Controls\ColorButton::setColor — Set Color
  • UI\Controls\Label — Label Control
    • UI\Controls\Label::__construct — Construct a new Label
    • UI\Controls\Label::getText — Get Text
    • UI\Controls\Label::setText — Set Text
  • UI\Controls\Entry — Entry Control
    • UI\Controls\Entry::__construct — Construct a new Entry
    • UI\Controls\Entry::getText — Get Text
    • UI\Controls\Entry::isReadOnly — Detect Read Only
    • UI\Controls\Entry::onChange — Change Handler
    • UI\Controls\Entry::setReadOnly — Set Read Only
    • UI\Controls\Entry::setText — Set Text
  • UI\Controls\MultilineEntry — MultilineEntry Control
    • UI\Controls\MultilineEntry::append — Append Text
    • UI\Controls\MultilineEntry::__construct — Construct a new Multiline Entry
    • UI\Controls\MultilineEntry::getText — Get Text
    • UI\Controls\MultilineEntry::isReadOnly — Read Only Detection
    • UI\Controls\MultilineEntry::onChange — Change Handler
    • UI\Controls\MultilineEntry::setReadOnly — Set Read Only
    • UI\Controls\MultilineEntry::setText — Set Text
  • UI\Controls\Spin — Spin Control
    • UI\Controls\Spin::__construct — Construct a new Spin
    • UI\Controls\Spin::getValue — Get Value
    • UI\Controls\Spin::onChange — Change Handler
    • UI\Controls\Spin::setValue — Set Value
  • UI\Controls\Slider — Slider Control
    • UI\Controls\Slider::__construct — Construct a new Slider
    • UI\Controls\Slider::getValue — Get Value
    • UI\Controls\Slider::onChange — Change Handler
    • UI\Controls\Slider::setValue — Set Value
  • UI\Controls\Progress — Progress Control
    • UI\Controls\Progress::getValue — Get Value
    • UI\Controls\Progress::setValue — Set Value
  • UI\Controls\Separator — Control Separator
    • UI\Controls\Separator::__construct — Construct a new Separator
  • UI\Controls\Combo — Combo Control
    • UI\Controls\Combo::append — Append Option
    • UI\Controls\Combo::getSelected — Get Selected Option
    • UI\Controls\Combo::onSelected — Selected Handler
    • UI\Controls\Combo::setSelected — Set Selected Option
  • UI\Controls\EditableCombo — EdiableCombo Control
    • UI\Controls\EditableCombo::append — Append Option
    • UI\Controls\EditableCombo::getText — Get Text
    • UI\Controls\EditableCombo::onChange — Change Handler
    • UI\Controls\EditableCombo::setText — Set Text
  • UI\Controls\Radio — Radio Control
    • UI\Controls\Radio::append — Append Option
    • UI\Controls\Radio::getSelected — Get Selected Option
    • UI\Controls\Radio::onSelected — Selected Handler
    • UI\Controls\Radio::setSelected — Set Selected Option
  • UI\Controls\Picker — Picker Control
    • UI\Controls\Picker::__construct — Construct a new Picker
  • UI\Controls\Form — Control Form (Arrangement)
    • UI\Controls\Form::append — Append Control
    • UI\Controls\Form::delete — Delete Control
    • UI\Controls\Form::isPadded — Padding Detection
    • UI\Controls\Form::setPadded — Set Padding
  • UI\Controls\Grid — Control Grid (Arrangement)
    • UI\Controls\Grid::append — Append Control
    • UI\Controls\Grid::isPadded — Padding Detection
    • UI\Controls\Grid::setPadded — Set Padding
  • UI\Controls\Group — Control Group (Arrangement)
    • UI\Controls\Group::append — Append Control
    • UI\Controls\Group::__construct — Construct a new Group
    • UI\Controls\Group::getTitle — Get Title
    • UI\Controls\Group::hasMargin — Margin Detection
    • UI\Controls\Group::setMargin — Set Margin
    • UI\Controls\Group::setTitle — Set Title
  • UI\Controls\Box — Control Box (Arrangement)
    • UI\Controls\Box::append — Append Control
    • UI\Controls\Box::__construct — Construct a new Box
    • UI\Controls\Box::delete — Delete Control
    • UI\Controls\Box::getOrientation — Get Orientation
    • UI\Controls\Box::isPadded — Padding Detection
    • UI\Controls\Box::setPadded — Set Padding
  • UI\Draw\Pen — Draw Pen
    • UI\Draw\Pen::clip — Clip a Path
    • UI\Draw\Pen::fill — Fill a Path
    • UI\Draw\Pen::restore — Restore
    • UI\Draw\Pen::save — Save
    • UI\Draw\Pen::stroke — Stroke a Path
    • UI\Draw\Pen::transform — Matrix Transform
    • UI\Draw\Pen::write — Draw Text at Point
  • UI\Draw\Path — Draw Path
    • UI\Draw\Path::addRectangle — Draw a Rectangle
    • UI\Draw\Path::arcTo — Draw an Arc
    • UI\Draw\Path::bezierTo — Draw Bezier Curve
    • UI\Draw\Path::closeFigure — Close Figure
    • UI\Draw\Path::__construct — Construct a new Path
    • UI\Draw\Path::end — Finalize Path
    • UI\Draw\Path::lineTo — Draw a Line
    • UI\Draw\Path::newFigure — Draw Figure
    • UI\Draw\Path::newFigureWithArc — Draw Figure with Arc
  • UI\Draw\Matrix — Draw Matrix
    • UI\Draw\Matrix::invert — Invert Matrix
    • UI\Draw\Matrix::isInvertible — Invertible Detection
    • UI\Draw\Matrix::multiply — Multiply Matrix
    • UI\Draw\Matrix::rotate — Rotate Matrix
    • UI\Draw\Matrix::scale — Scale Matrix
    • UI\Draw\Matrix::skew — Skew Matrix
    • UI\Draw\Matrix::translate — Translate Matrix
  • UI\Draw\Color — Color Representation
    • UI\Draw\Color::__construct — Construct new Color
    • UI\Draw\Color::getChannel — Color Manipulation
    • UI\Draw\Color::setChannel — Color Manipulation
  • UI\Draw\Stroke — Draw Stroke
    • UI\Draw\Stroke::__construct — Construct a new Stroke
    • UI\Draw\Stroke::getCap — Get Line Cap
    • UI\Draw\Stroke::getJoin — Get Line Join
    • UI\Draw\Stroke::getMiterLimit — Get Miter Limit
    • UI\Draw\Stroke::getThickness — Get Thickness
    • UI\Draw\Stroke::setCap — Set Line Cap
    • UI\Draw\Stroke::setJoin — Set Line Join
    • UI\Draw\Stroke::setMiterLimit — Set Miter Limit
    • UI\Draw\Stroke::setThickness — Set Thickness
  • UI\Draw\Brush — Brushes
    • UI\Draw\Brush::__construct — Construct a new Brush
    • UI\Draw\Brush::getColor — Get Color
    • UI\Draw\Brush::setColor — Set Color
  • UI\Draw\Brush\Gradient — Gradient Brushes
    • UI\Draw\Brush\Gradient::addStop — Stop Manipulation
    • UI\Draw\Brush\Gradient::delStop — Stop Manipulation
    • UI\Draw\Brush\Gradient::setStop — Stop Manipulation
  • UI\Draw\Brush\LinearGradient — Linear Gradient
    • UI\Draw\Brush\LinearGradient::__construct — Construct a Linear Gradient
  • UI\Draw\Brush\RadialGradient — Radial Gradient
    • UI\Draw\Brush\RadialGradient::__construct — Construct a new Radial Gradient
  • UI\Draw\Text\Layout — Represents Text Layout
    • UI\Draw\Text\Layout::__construct — Construct a new Text Layout
    • UI\Draw\Text\Layout::setColor — Set Color
    • UI\Draw\Text\Layout::setWidth — Set Width
  • UI\Draw\Text\Font — Represents a Font
    • UI\Draw\Text\Font::__construct — Construct a new Font
    • UI\Draw\Text\Font::getAscent — Font Metrics
    • UI\Draw\Text\Font::getDescent — Font Metrics
    • UI\Draw\Text\Font::getLeading — Font Metrics
    • UI\Draw\Text\Font::getUnderlinePosition — Font Metrics
    • UI\Draw\Text\Font::getUnderlineThickness — Font Metrics
  • UI\Draw\Text\Font\Descriptor — Font Descriptor
    • UI\Draw\Text\Font\Descriptor::__construct — Construct a new Font Descriptor
    • UI\Draw\Text\Font\Descriptor::getFamily — Get Font Family
    • UI\Draw\Text\Font\Descriptor::getItalic — Style Detection
    • UI\Draw\Text\Font\Descriptor::getSize — Size Detection
    • UI\Draw\Text\Font\Descriptor::getStretch — Style Detection
    • UI\Draw\Text\Font\Descriptor::getWeight — Weight Detection
  • UI Fonctions
    • UI\Draw\Text\Font\fontFamilies — Récupére les familles de polices
    • UI\quit — Quitte la boucle UI
    • UI\run — Entre dans la boucle UI
  • UI\Draw\Text\Font\Weight — Font Weight Settings
  • UI\Draw\Text\Font\Italic — Italic Font Settings
  • UI\Draw\Text\Font\Stretch — Font Stretch Settings
  • UI\Draw\Line\Cap — Line Cap Settings
  • UI\Draw\Line\Join — Line Join Settings
  • UI\Key — Key Identifiers
  • UI\Exception\InvalidArgumentException — InvalidArgumentException
  • UI\Exception\RuntimeException — RuntimeException

User Contributed Notes

There are no user contributed notes for this page.


Introduction

Cette extension encapsule libui afin de fournir une API OO pour le développement multi-plateforme d’interfaces utilisateur ayant un aspect natif.

User Contributed Notes

There are no user contributed notes for this page.


Installation/Configuration

Sommaire

  • Pré-requis
  • Installation

User Contributed Notes

shevegen at gmail dot com 14-Feb-2021 09:01
I believe this example is not correct; for example it shows "cmake" in
use but after you git clone the above URL, there are no cmake files.

So this can not possibly have worked; and I actually don't think there
ever was cmake used in the above repository, which makes you wonder
why the above code used cmake to begin with. Did it ever work? I am not sure;
I tend to assume it did not work.
whirlwind110 at 163 dot com 18-Apr-2017 04:04
Requirements:
    PHP 7
    libui (use current master)
    Windows/MacOSX/Linux (GTK-3)

Install re2c:
    sudo apt install re2c

Install libui:

    git clone https://github.com/andlabs/libui.git
    cd libui
    sudo cp *.h /usr/local/include/
    cmake .
    cd out
    sudo cp * /usr/lib/

Install ui:

    Method one: use pecl:
        sudo pecl install channel://pecl.php.net/ui-2.0.0

    Method two:build source code:
        git clone https://github.com/krakjoe/ui.git
        cd ui
        phpize
        make
        sudo make install

Enable ui.so:
    sudo echo 'extension=ui.so' > /etc/php/7.0/mods-available/ui.ini
    sudo ln -s /etc/php/7.0/mods-available/ui.ini 20-ui.ini

Test:
    php -m
    git clone https://github.com/krakjoe/ui.git
    cd ui/examples/
    php snake.php


Pré-requis

L'installation nécessite la bibliothèque libui et PHP 7 ou une version plus récente.

Cette extension nécessite l'installation de » la bibliothèque libui version 0.1.0 ou une version plus récente. Consultez la documentation libui pour obtenir une liste des prérequis.

User Contributed Notes

There are no user contributed notes for this page.


Installation

Cette extension » PECL n'est pas intégrée à PHP.

Des informations sur l'installation de ces extensions PECL peuvent être trouvées dans le chapitre du manuel intitulé Installation des extensions PECL. D'autres informations comme les notes sur les nouvelles versions, les téléchargements, les sources des fichiers, les informations concernant les mainteneurs ainsi qu'un CHANGELOG, peuvent être trouvées ici : » https://pecl.php.net/package/ui.

Les binaires Windows (les fichiers DLL) pour cette extension PECL sont disponibles sur le site web PECL.

User Contributed Notes

There are no user contributed notes for this page.


Represents a position (x,y)

(UI 0.9.9)

Introduction

Points are used throughout UI to represent co-ordinates on a screen, control, or area.

Synopsis de la classe

final UI\Point {
/* Propriétés */
public $x ;
public $y ;
/* Constructor */
public __construct ( float $x , float $y )
/* Méthodes */
public static at ( float $point ) : UI\Point
public static at ( UI\Size $size ) : UI\Point
public getX ( ) : float
public getY ( ) : float
public setX ( float $point )
public setY ( float $point )
}

Propriétés

x

Holds the X co-ordinate, can be read/written directly

y

Holds the Y co-ordinate, can be read/written directly

Sommaire

  • UI\Point::at — Size Coercion
  • UI\Point::__construct — Construct a new Point
  • UI\Point::getX — Retrieves X
  • UI\Point::getY — Retrieves Y
  • UI\Point::setX — Set X
  • UI\Point::setY — Set Y

User Contributed Notes

There are no user contributed notes for this page.


Size Coercion

  • « UI\Point
  • UI\Point::__construct »
  • PHP Manual
  • UI\Point
  • Size Coercion

UI\Point::at

(UI 1.0.2)

UI\Point::at — Size Coercion

Description

public static UI\Point::at ( float $point ) : UI\Point
public static UI\Point::at ( UI\Size $size ) : UI\Point

Shall return a UI\Point object where x and y are equal to those supplied, either in float or UI\Size form

Liste de paramètres

point

The value for x and y

size

The Size to convert

Valeurs de retour

The resulting Point

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Point

  • « UI\Point::at
  • UI\Point::getX »
  • PHP Manual
  • UI\Point
  • Construct a new Point

UI\Point::__construct

(UI 0.9.9)

UI\Point::__construct — Construct a new Point

Description

public UI\Point::__construct ( float $x , float $y )

Construct a new Point using new co-ordinates

Liste de paramètres

x

The new X co-ordinate

y

The new Y co-ordinate

User Contributed Notes

There are no user contributed notes for this page.


Retrieves X

  • « UI\Point::__construct
  • UI\Point::getY »
  • PHP Manual
  • UI\Point
  • Retrieves X

UI\Point::getX

(UI 0.9.9)

UI\Point::getX — Retrieves X

Description

public UI\Point::getX ( ) : float

Retrieves the X co-ordinate

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The current X co-ordinate

User Contributed Notes

There are no user contributed notes for this page.


Retrieves Y

  • « UI\Point::getX
  • UI\Point::setX »
  • PHP Manual
  • UI\Point
  • Retrieves Y

UI\Point::getY

(UI 0.9.9)

UI\Point::getY — Retrieves Y

Description

public UI\Point::getY ( ) : float

Retrieves the Y co-ordinate

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The current Y co-ordinate

User Contributed Notes

There are no user contributed notes for this page.


Set X

  • « UI\Point::getY
  • UI\Point::setY »
  • PHP Manual
  • UI\Point
  • Set X

UI\Point::setX

(UI 0.9.9)

UI\Point::setX — Set X

Description

public UI\Point::setX ( float $point )

Set the X co-ordinate

Liste de paramètres

point

The new X co-ordinate

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Set Y

  • « UI\Point::setX
  • UI\Size »
  • PHP Manual
  • UI\Point
  • Set Y

UI\Point::setY

(UI 0.9.9)

UI\Point::setY — Set Y

Description

public UI\Point::setY ( float $point )

Set the Y co-ordinate

Liste de paramètres

point

The new Y co-ordinate

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Represents dimenstions (width, height)

(UI 0.9.9)

Introduction

Sizes are used throughout UI to represent the size of a screen, control, or area.

Synopsis de la classe

final UI\Size {
/* Propriétés */
public $width ;
public $height ;
/* Constructor */
public __construct ( float $width , float $height )
/* Méthodes */
public getHeight ( ) : float
public getWidth ( ) : float
public static of ( float $size ) : UI\Size
public static of ( UI\Point $point ) : UI\Size
public setHeight ( float $size )
public setWidth ( float $size )
}

Propriétés

width

Holds the width, can be read/written directly

height

Holds the height, can be read/written directly

Sommaire

  • UI\Size::__construct — Construct a new Size
  • UI\Size::getHeight — Retrieves Height
  • UI\Size::getWidth — Retrives Width
  • UI\Size::of — Point Coercion
  • UI\Size::setHeight — Set Height
  • UI\Size::setWidth — Set Width

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Size

  • « UI\Size
  • UI\Size::getHeight »
  • PHP Manual
  • UI\Size
  • Construct a new Size

UI\Size::__construct

(UI 0.9.9)

UI\Size::__construct — Construct a new Size

Description

public UI\Size::__construct ( float $width , float $height )

Construct a new Size using new width and height

Liste de paramètres

width

The new width

height

The new height

User Contributed Notes

There are no user contributed notes for this page.


Retrieves Height

  • « UI\Size::__construct
  • UI\Size::getWidth »
  • PHP Manual
  • UI\Size
  • Retrieves Height

UI\Size::getHeight

(UI 0.9.9)

UI\Size::getHeight — Retrieves Height

Description

public UI\Size::getHeight ( ) : float

Retrieves the Height

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The current Height

User Contributed Notes

There are no user contributed notes for this page.


Retrives Width

  • « UI\Size::getHeight
  • UI\Size::of »
  • PHP Manual
  • UI\Size
  • Retrives Width

UI\Size::getWidth

(UI 0.9.9)

UI\Size::getWidth — Retrives Width

Description

public UI\Size::getWidth ( ) : float

Retrieves the Width

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The current Width

User Contributed Notes

There are no user contributed notes for this page.


Point Coercion

  • « UI\Size::getWidth
  • UI\Size::setHeight »
  • PHP Manual
  • UI\Size
  • Point Coercion

UI\Size::of

(UI 1.0.2)

UI\Size::of — Point Coercion

Description

public static UI\Size::of ( float $size ) : UI\Size
public static UI\Size::of ( UI\Point $point ) : UI\Size

Shall return a UI\Size object where width and height are equal to those supplied, either in float or UI\Point form

Liste de paramètres

size

The value for width and height

point

The Point to convert

Valeurs de retour

The resulting Size

User Contributed Notes

There are no user contributed notes for this page.


Set Height

  • « UI\Size::of
  • UI\Size::setWidth »
  • PHP Manual
  • UI\Size
  • Set Height

UI\Size::setHeight

(UI 0.9.9)

UI\Size::setHeight — Set Height

Description

public UI\Size::setHeight ( float $size )

Set new Height

Liste de paramètres

size

The new Height

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Set Width

  • « UI\Size::setHeight
  • UI\Window »
  • PHP Manual
  • UI\Size
  • Set Width

UI\Size::setWidth

(UI 0.9.9)

UI\Size::setWidth — Set Width

Description

public UI\Size::setWidth ( float $size )

Set new Width

Liste de paramètres

size

The new Width

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Window

(UI 0.9.9)

Introduction

Represents a UI Window

Synopsis de la classe

UI\Window extends UI\Control {
/* Propriétés */
protected $controls ;
/* Constructor */
public __construct ( string $title , Size $size , bool $menu = false )
/* Méthodes */
public add ( UI\Control $control )
public error ( string $title , string $msg )
public getSize ( ) : UI\Size
public getTitle ( ) : string
public hasBorders ( ) : bool
public hasMargin ( ) : bool
public isFullScreen ( ) : bool
public msg ( string $title , string $msg )
protected onClosing ( ) : int
public open ( ) : string
public save ( ) : string
public setBorders ( bool $borders )
public setFullScreen ( bool $full )
public setMargin ( bool $margin )
public setSize ( UI\Size $size )
public setTitle ( string $title )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Propriétés

controls

Contains controls, should not be manipulated directly

Sommaire

  • UI\Window::add — Add a Control
  • UI\Window::__construct — Construct a new Window
  • UI\Window::error — Affiche un message d'erreur
  • UI\Window::getSize — Get Window Size
  • UI\Window::getTitle — Get Title
  • UI\Window::hasBorders — Border Detection
  • UI\Window::hasMargin — Margin Detection
  • UI\Window::isFullScreen — Full Screen Detection
  • UI\Window::msg — Show Message Box
  • UI\Window::onClosing — Closing Callback
  • UI\Window::open — Open Dialog
  • UI\Window::save — Save Dialog
  • UI\Window::setBorders — Border Use
  • UI\Window::setFullScreen — Full Screen Use
  • UI\Window::setMargin — Margin Use
  • UI\Window::setSize — Set Size
  • UI\Window::setTitle — Window Title

User Contributed Notes

everton3x at gmail dot com 03-Feb-2017 12:58
This is a example to wizard layout in UI library:

<?php

/*
 * Wizard sample layout builded with PHP UI
 */

use UI\Window;
use UI\Size;
use UI\Controls\Button;
use UI\Controls\Grid;
use UI\Controls\Box;
use UI\Controls\Form;
use UI\Controls\Entry;
use UI\Controls\Label;

/*
 * The window
 */
$window = new Window('Wizard Sample Layout', new Size(640, 480), TRUE);
$window->setMargin(true);

/*
 * Wizard content (sample)
 */
$content = new Form();
$content->setPadded(true);
$content->append('User:', new Entry());
$content->append('Password:', new Entry(Entry::Password));

/*
 * Layout to title, content and buttons
 */
$grid = new Grid();
$grid->setPadded(false);

/*
 * Title
 */
$grid->append(new Label('Wizard Sample'), 0, 0, 6, 1, true, Grid::Fill, false, Grid::Fill);

/*
 * Append content
 */
$grid->append($content, 0, 1, 6, 1, false, Grid::Fill, true, Grid::Fill);

/*
 * Left buttons
 */
$left_box = new Box(Box::Horizontal);
$left_box->append(new Button('&About'));
$left_box->append(new Button('&Help'));

/*
 * Right buttons
 */
$right_box = new Box(Box::Horizontal);
$right_box->append(new Button('&Back'));
$right_box->append(new Button('&Forward'));
$right_box->append(new Button('&Close'));

/**
 * Append buttons
 */
$grid->append($left_box, 0, 2, 1, 1, true, Grid::Start, false, Grid::Fill);
$grid->append($right_box, 5, 2, 1, 1, true, Grid::End, false, Grid::Fill);

/*
 * Append layout and show.
 */
$window->add($grid);

$window->show();

UI\run();

?>


Add a Control

  • « UI\Window
  • UI\Window::__construct »
  • PHP Manual
  • UI\Window
  • Add a Control

UI\Window::add

(UI 0.9.9)

UI\Window::add — Add a Control

Description

public UI\Window::add ( UI\Control $control )

Shall add a Control to this Window

Liste de paramètres

control

The Control to add

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Window

  • « UI\Window::add
  • UI\Window::error »
  • PHP Manual
  • UI\Window
  • Construct a new Window

UI\Window::__construct

(UI 0.9.9)

UI\Window::__construct — Construct a new Window

Description

public UI\Window::__construct ( string $title , Size $size , bool $menu = false )

Shall construct a new Window

Liste de paramètres

title

The title of the Window

size

The size of the Window

menu

Menu switch

User Contributed Notes

There are no user contributed notes for this page.


Affiche un message d'erreur

  • « UI\Window::__construct
  • UI\Window::getSize »
  • PHP Manual
  • UI\Window
  • Affiche un message d'erreur

UI\Window::error

(UI 0.9.9)

UI\Window::error — Affiche un message d'erreur

Description

public UI\Window::error ( string $title , string $msg )

Devrait montrer un message d'erreur

Liste de paramètres

title

Titre du message d'erreur

msg

Message d'erreur

User Contributed Notes

There are no user contributed notes for this page.


Get Window Size

  • « UI\Window::error
  • UI\Window::getTitle »
  • PHP Manual
  • UI\Window
  • Get Window Size

UI\Window::getSize

(UI 0.9.9)

UI\Window::getSize — Get Window Size

Description

public UI\Window::getSize ( ) : UI\Size

Shall return the size of this Window

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Get Title

  • « UI\Window::getSize
  • UI\Window::hasBorders »
  • PHP Manual
  • UI\Window
  • Get Title

UI\Window::getTitle

(UI 0.9.9)

UI\Window::getTitle — Get Title

Description

public UI\Window::getTitle ( ) : string

Shall retrieve the title of this Window

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Border Detection

  • « UI\Window::getTitle
  • UI\Window::hasMargin »
  • PHP Manual
  • UI\Window
  • Border Detection

UI\Window::hasBorders

(UI 0.9.9)

UI\Window::hasBorders — Border Detection

Description

public UI\Window::hasBorders ( ) : bool

Shall detect if borders are used on this Window

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Margin Detection

  • « UI\Window::hasBorders
  • UI\Window::isFullScreen »
  • PHP Manual
  • UI\Window
  • Margin Detection

UI\Window::hasMargin

(UI 0.9.9)

UI\Window::hasMargin — Margin Detection

Description

public UI\Window::hasMargin ( ) : bool

Shall detect if margins are used on this Window

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Full Screen Detection

  • « UI\Window::hasMargin
  • UI\Window::msg »
  • PHP Manual
  • UI\Window
  • Full Screen Detection

UI\Window::isFullScreen

(UI 0.9.9)

UI\Window::isFullScreen — Full Screen Detection

Description

public UI\Window::isFullScreen ( ) : bool

Shall detect if this Window us using the whole screen

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Show Message Box

  • « UI\Window::isFullScreen
  • UI\Window::onClosing »
  • PHP Manual
  • UI\Window
  • Show Message Box

UI\Window::msg

(UI 0.9.9)

UI\Window::msg — Show Message Box

Description

public UI\Window::msg ( string $title , string $msg )

Shall show a message box

Liste de paramètres

title

The title of the message box

msg

The message

User Contributed Notes

There are no user contributed notes for this page.


Closing Callback

  • « UI\Window::msg
  • UI\Window::open »
  • PHP Manual
  • UI\Window
  • Closing Callback

UI\Window::onClosing

(UI 0.9.9)

UI\Window::onClosing — Closing Callback

Description

protected UI\Window::onClosing ( ) : int

Should gracefully destroy this Window

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Open Dialog

  • « UI\Window::onClosing
  • UI\Window::save »
  • PHP Manual
  • UI\Window
  • Open Dialog

UI\Window::open

(UI 0.9.9)

UI\Window::open — Open Dialog

Description

public UI\Window::open ( ) : string

Shall show an open file dialog

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Returns the name of the file selected for opening

User Contributed Notes

There are no user contributed notes for this page.


Save Dialog

  • « UI\Window::open
  • UI\Window::setBorders »
  • PHP Manual
  • UI\Window
  • Save Dialog

UI\Window::save

(UI 0.9.9)

UI\Window::save — Save Dialog

Description

public UI\Window::save ( ) : string

Shall show a save dialog

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Returns the file name selecting for saving

User Contributed Notes

There are no user contributed notes for this page.


Border Use

  • « UI\Window::save
  • UI\Window::setFullScreen »
  • PHP Manual
  • UI\Window
  • Border Use

UI\Window::setBorders

(UI 0.9.9)

UI\Window::setBorders — Border Use

Description

public UI\Window::setBorders ( bool $borders )

Shall enable or disable the use of borders on this Window

Liste de paramètres

borders

User Contributed Notes

There are no user contributed notes for this page.


Full Screen Use

  • « UI\Window::setBorders
  • UI\Window::setMargin »
  • PHP Manual
  • UI\Window
  • Full Screen Use

UI\Window::setFullScreen

(UI 0.9.9)

UI\Window::setFullScreen — Full Screen Use

Description

public UI\Window::setFullScreen ( bool $full )

Shall enable or disable the use of the full screen for this Window

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

full

User Contributed Notes

There are no user contributed notes for this page.


Margin Use

  • « UI\Window::setFullScreen
  • UI\Window::setSize »
  • PHP Manual
  • UI\Window
  • Margin Use

UI\Window::setMargin

(UI 0.9.9)

UI\Window::setMargin — Margin Use

Description

public UI\Window::setMargin ( bool $margin )

Shall enable or disable the use of margins for this Window

Liste de paramètres

margin

User Contributed Notes

There are no user contributed notes for this page.


Set Size

  • « UI\Window::setMargin
  • UI\Window::setTitle »
  • PHP Manual
  • UI\Window
  • Set Size

UI\Window::setSize

(UI 0.9.9)

UI\Window::setSize — Set Size

Description

public UI\Window::setSize ( UI\Size $size )

Shall set the size of this Window

Liste de paramètres

size

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Window Title

  • « UI\Window::setSize
  • UI\Control »
  • PHP Manual
  • UI\Window
  • Window Title

UI\Window::setTitle

(UI 0.9.9)

UI\Window::setTitle — Window Title

Description

public UI\Window::setTitle ( string $title )

Shall set the title for this Window

Liste de paramètres

title

The new title

User Contributed Notes

There are no user contributed notes for this page.


Control

(UI 0.9.9)

Introduction

This is the closed base class for all UI Controls.

Synopsis de la classe

final UI\Control {
/* Méthodes */
public destroy ( )
public disable ( )
public enable ( )
public getParent ( ) : UI\Control
public getTopLevel ( ) : int
public hide ( )
public isEnabled ( ) : bool
public isVisible ( ) : bool
public setParent ( UI\Control $parent )
public show ( )
}

Sommaire

  • UI\Control::destroy — Destroy Control
  • UI\Control::disable — Disable Control
  • UI\Control::enable — Enable Control
  • UI\Control::getParent — Get Parent Control
  • UI\Control::getTopLevel — Get Top Level
  • UI\Control::hide — Hide Control
  • UI\Control::isEnabled — Determine if Control is enabled
  • UI\Control::isVisible — Determine if Control is visible
  • UI\Control::setParent — Set Parent Control
  • UI\Control::show — Control Show

User Contributed Notes

There are no user contributed notes for this page.


Destroy Control

  • « UI\Control
  • UI\Control::disable »
  • PHP Manual
  • UI\Control
  • Destroy Control

UI\Control::destroy

(UI 0.9.9)

UI\Control::destroy — Destroy Control

Description

public UI\Control::destroy ( )

Shall destroy this Control

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Disable Control

  • « UI\Control::destroy
  • UI\Control::enable »
  • PHP Manual
  • UI\Control
  • Disable Control

UI\Control::disable

(UI 0.9.9)

UI\Control::disable — Disable Control

Description

public UI\Control::disable ( )

Shall disable this Control

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Enable Control

  • « UI\Control::disable
  • UI\Control::getParent »
  • PHP Manual
  • UI\Control
  • Enable Control

UI\Control::enable

(UI 0.9.9)

UI\Control::enable — Enable Control

Description

public UI\Control::enable ( )

Shall enable this Control

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Get Parent Control

  • « UI\Control::enable
  • UI\Control::getTopLevel »
  • PHP Manual
  • UI\Control
  • Get Parent Control

UI\Control::getParent

(UI 0.9.9)

UI\Control::getParent — Get Parent Control

Description

public UI\Control::getParent ( ) : UI\Control

Shall return the parent Control

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Get Top Level

  • « UI\Control::getParent
  • UI\Control::hide »
  • PHP Manual
  • UI\Control
  • Get Top Level

UI\Control::getTopLevel

(UI 0.9.9)

UI\Control::getTopLevel — Get Top Level

Description

public UI\Control::getTopLevel ( ) : int

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Hide Control

  • « UI\Control::getTopLevel
  • UI\Control::isEnabled »
  • PHP Manual
  • UI\Control
  • Hide Control

UI\Control::hide

(UI 0.9.9)

UI\Control::hide — Hide Control

Description

public UI\Control::hide ( )

Shall hide this Control

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Determine if Control is enabled

  • « UI\Control::hide
  • UI\Control::isVisible »
  • PHP Manual
  • UI\Control
  • Determine if Control is enabled

UI\Control::isEnabled

(UI 0.9.9)

UI\Control::isEnabled — Determine if Control is enabled

Description

public UI\Control::isEnabled ( ) : bool

Shall detect if this Control is enabled

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Determine if Control is visible

  • « UI\Control::isEnabled
  • UI\Control::setParent »
  • PHP Manual
  • UI\Control
  • Determine if Control is visible

UI\Control::isVisible

(UI 0.9.9)

UI\Control::isVisible — Determine if Control is visible

Description

public UI\Control::isVisible ( ) : bool

Shall detect if this Control is visible

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Set Parent Control

  • « UI\Control::isVisible
  • UI\Control::show »
  • PHP Manual
  • UI\Control
  • Set Parent Control

UI\Control::setParent

(UI 0.9.9)

UI\Control::setParent — Set Parent Control

Description

public UI\Control::setParent ( UI\Control $parent )

Shall set the parent Control of this Control

Liste de paramètres

parent

The parent Control

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Control Show

  • « UI\Control::setParent
  • UI\Menu »
  • PHP Manual
  • UI\Control
  • Control Show

UI\Control::show

(UI 0.9.9)

UI\Control::show — Control Show

Description

public UI\Control::show ( )

Shall show this Control

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Menu

(UI 0.9.9)

Introduction

Menus must be constructed before the first Window, and can be shown on any Window

Synopsis de la classe

UI\Menu {
/* Constructor */
public __construct ( string $name )
/* Méthodes */
public append ( string $name , string $type = UI\MenuItem::class ) : UI\MenuItem
public appendAbout ( string $type = UI\MenuItem::class ) : UI\MenuItem
public appendCheck ( string $name , string $type = UI\MenuItem::class ) : UI\MenuItem
public appendPreferences ( string $type = UI\MenuItem::class ) : UI\MenuItem
public appendQuit ( string $type = UI\MenuItem::class ) : UI\MenuItem
public appendSeparator ( )
}

Sommaire

  • UI\Menu::append — Append Menu Item
  • UI\Menu::appendAbout — Append About Menu Item
  • UI\Menu::appendCheck — Append Checkable Menu Item
  • UI\Menu::appendPreferences — Append Preferences Menu Item
  • UI\Menu::appendQuit — Append Quit Menu Item
  • UI\Menu::appendSeparator — Append Menu Item Separator
  • UI\Menu::__construct — Construct a new Menu

User Contributed Notes

There are no user contributed notes for this page.


Append Menu Item

  • « UI\Menu
  • UI\Menu::appendAbout »
  • PHP Manual
  • UI\Menu
  • Append Menu Item

UI\Menu::append

(UI 0.9.9)

UI\Menu::append — Append Menu Item

Description

public UI\Menu::append ( string $name , string $type = UI\MenuItem::class ) : UI\MenuItem

Shall append a new Menu Item

Liste de paramètres

name

The name (text) for the new item

type

The type for the new item

Valeurs de retour

A constructed object of the given type

User Contributed Notes

There are no user contributed notes for this page.


Append About Menu Item

  • « UI\Menu::append
  • UI\Menu::appendCheck »
  • PHP Manual
  • UI\Menu
  • Append About Menu Item

UI\Menu::appendAbout

(UI 0.9.9)

UI\Menu::appendAbout — Append About Menu Item

Description

public UI\Menu::appendAbout ( string $type = UI\MenuItem::class ) : UI\MenuItem

Shall append an About menu item

Liste de paramètres

type

The type for the new item

Valeurs de retour

A constructed About menu item of the given type

User Contributed Notes

There are no user contributed notes for this page.


Append Checkable Menu Item

  • « UI\Menu::appendAbout
  • UI\Menu::appendPreferences »
  • PHP Manual
  • UI\Menu
  • Append Checkable Menu Item

UI\Menu::appendCheck

(UI 0.9.9)

UI\Menu::appendCheck — Append Checkable Menu Item

Description

public UI\Menu::appendCheck ( string $name , string $type = UI\MenuItem::class ) : UI\MenuItem

Shall append a checkable menu item

Liste de paramètres

name

The name (text) for the new item

type

The type for the new item

Valeurs de retour

A constructed checkable menu item of the given type

User Contributed Notes

There are no user contributed notes for this page.


Append Preferences Menu Item

  • « UI\Menu::appendCheck
  • UI\Menu::appendQuit »
  • PHP Manual
  • UI\Menu
  • Append Preferences Menu Item

UI\Menu::appendPreferences

(UI 0.9.9)

UI\Menu::appendPreferences — Append Preferences Menu Item

Description

public UI\Menu::appendPreferences ( string $type = UI\MenuItem::class ) : UI\MenuItem

Shall append a Preferences menu item

Liste de paramètres

type

The type for the new item

Valeurs de retour

A constructed Preferences menu item of the given type

User Contributed Notes

There are no user contributed notes for this page.


Append Quit Menu Item

  • « UI\Menu::appendPreferences
  • UI\Menu::appendSeparator »
  • PHP Manual
  • UI\Menu
  • Append Quit Menu Item

UI\Menu::appendQuit

(UI 0.9.9)

UI\Menu::appendQuit — Append Quit Menu Item

Description

public UI\Menu::appendQuit ( string $type = UI\MenuItem::class ) : UI\MenuItem

Shall append a Quit menu item

Liste de paramètres

type

The type for the new item

Valeurs de retour

A constructed Quit menu item of the given type

User Contributed Notes

There are no user contributed notes for this page.


Append Menu Item Separator

  • « UI\Menu::appendQuit
  • UI\Menu::__construct »
  • PHP Manual
  • UI\Menu
  • Append Menu Item Separator

UI\Menu::appendSeparator

(UI 0.9.9)

UI\Menu::appendSeparator — Append Menu Item Separator

Description

public UI\Menu::appendSeparator ( )

Shall append a separator

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Menu

  • « UI\Menu::appendSeparator
  • UI\MenuItem »
  • PHP Manual
  • UI\Menu
  • Construct a new Menu

UI\Menu::__construct

(UI 0.9.9)

UI\Menu::__construct — Construct a new Menu

Description

public UI\Menu::__construct ( string $name )

Shall construct a new Menu

Liste de paramètres

name

The name (text) for the menu

User Contributed Notes

There are no user contributed notes for this page.


Menu Item

(UI 0.9.9)

Introduction

Menu Items should only be created by the Menu

Synopsis de la classe

UI\MenuItem {
/* Méthodes */
public disable ( )
public enable ( )
public isChecked ( ) : bool
protected onClick ( )
public setChecked ( bool $checked )
}

Sommaire

  • UI\MenuItem::disable — Disable Menu Item
  • UI\MenuItem::enable — Enable Menu Item
  • UI\MenuItem::isChecked — Detect Checked
  • UI\MenuItem::onClick — On Click Callback
  • UI\MenuItem::setChecked — Set Checked

User Contributed Notes

There are no user contributed notes for this page.


Disable Menu Item

  • « UI\MenuItem
  • UI\MenuItem::enable »
  • PHP Manual
  • UI\MenuItem
  • Disable Menu Item

UI\MenuItem::disable

(UI 0.9.9)

UI\MenuItem::disable — Disable Menu Item

Description

public UI\MenuItem::disable ( )

Shall disable this Menu Item

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Enable Menu Item

  • « UI\MenuItem::disable
  • UI\MenuItem::isChecked »
  • PHP Manual
  • UI\MenuItem
  • Enable Menu Item

UI\MenuItem::enable

(UI 0.9.9)

UI\MenuItem::enable — Enable Menu Item

Description

public UI\MenuItem::enable ( )

Shall enable this Menu Item

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Detect Checked

  • « UI\MenuItem::enable
  • UI\MenuItem::onClick »
  • PHP Manual
  • UI\MenuItem
  • Detect Checked

UI\MenuItem::isChecked

(UI 0.9.9)

UI\MenuItem::isChecked — Detect Checked

Description

public UI\MenuItem::isChecked ( ) : bool

Shall detect if this Menu Item is checked

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


On Click Callback

  • « UI\MenuItem::isChecked
  • UI\MenuItem::setChecked »
  • PHP Manual
  • UI\MenuItem
  • On Click Callback

UI\MenuItem::onClick

(UI 0.9.9)

UI\MenuItem::onClick — On Click Callback

Description

protected UI\MenuItem::onClick ( )

Shall be executed when this Menu Item is clicked

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Checked

  • « UI\MenuItem::onClick
  • UI\Area »
  • PHP Manual
  • UI\MenuItem
  • Set Checked

UI\MenuItem::setChecked

(UI 0.9.9)

UI\MenuItem::setChecked — Set Checked

Description

public UI\MenuItem::setChecked ( bool $checked )

Shall set the checked status of this Menu Item

Liste de paramètres

checked

The new status

User Contributed Notes

There are no user contributed notes for this page.


Area

(UI 0.9.9)

Introduction

An Area represents a canvas which can be used to draw, and respond to mouse and key events.

Synopsis de la classe

UI\Area extends UI\Control {
/* Constants */
const int Ctrl ;
const int Alt ;
const int Shift ;
const int Super ;
const int Down ;
const int Up ;
/* Méthodes */
protected onDraw ( UI\Draw\Pen $pen , UI\Size $areaSize , UI\Point $clipPoint , UI\Size $clipSize )
protected onKey ( string $key , int $ext , int $flags )
protected onMouse ( UI\Point $areaPoint , UI\Size $areaSize , int $flags )
public redraw ( )
public scrollTo ( UI\Point $point , UI\Size $size )
public setSize ( UI\Size $size )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Constantes pré-définies

UI\Area::Ctrl

Shall be set in the modifiers passed to key and mouse events when the CTRL key is active

UI\Area::Alt

Shall be set in the modifiers passed to key and mouse events when the ALT key is active

UI\Area::Shift

Shall be set in the modifiers passed to key and mouse events when the SHIFT key is active

UI\Area::Super

UI\Area::Down

Shall be set in the modifiers passed to key and mouse events

UI\Area::Up

Shall be set in the modifiers passed to key and mouse events

Sommaire

  • UI\Area::onDraw — Draw Callback
  • UI\Area::onKey — Key Callback
  • UI\Area::onMouse — Mouse Callback
  • UI\Area::redraw — Redraw Area
  • UI\Area::scrollTo — Area Scroll
  • UI\Area::setSize — Set Size

User Contributed Notes

There are no user contributed notes for this page.


Draw Callback

  • « UI\Area
  • UI\Area::onKey »
  • PHP Manual
  • UI\Area
  • Draw Callback

UI\Area::onDraw

(UI 0.9.9)

UI\Area::onDraw — Draw Callback

Description

protected UI\Area::onDraw ( UI\Draw\Pen $pen , UI\Size $areaSize , UI\Point $clipPoint , UI\Size $clipSize )

Shall be invoked when this Area requires redrawing

Liste de paramètres

pen

A Pen suitable for drawing in this Area

areaSize

The size of the Area

clipPoint

The clip point of the Area

clipSize

The clip size of the Area

User Contributed Notes

There are no user contributed notes for this page.


Key Callback

  • « UI\Area::onDraw
  • UI\Area::onMouse »
  • PHP Manual
  • UI\Area
  • Key Callback

UI\Area::onKey

(UI 0.9.9)

UI\Area::onKey — Key Callback

Description

protected UI\Area::onKey ( string $key , int $ext , int $flags )

Shall be executed on key events

Liste de paramètres

key

The key pressed

ext

The extended key pressed

flags

Event modifiers

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Mouse Callback

  • « UI\Area::onKey
  • UI\Area::redraw »
  • PHP Manual
  • UI\Area
  • Mouse Callback

UI\Area::onMouse

(UI 0.9.9)

UI\Area::onMouse — Mouse Callback

Description

protected UI\Area::onMouse ( UI\Point $areaPoint , UI\Size $areaSize , int $flags )

Shall be executed on mouse events

Liste de paramètres

areaPoint

The co-ordinates of the event

areaSize

The size of the area of the event

flags

Event modifiers

User Contributed Notes

There are no user contributed notes for this page.


Redraw Area

  • « UI\Area::onMouse
  • UI\Area::scrollTo »
  • PHP Manual
  • UI\Area
  • Redraw Area

UI\Area::redraw

(UI 0.9.9)

UI\Area::redraw — Redraw Area

Description

public UI\Area::redraw ( )

Requests that this Area is redrawn

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Area Scroll

  • « UI\Area::redraw
  • UI\Area::setSize »
  • PHP Manual
  • UI\Area
  • Area Scroll

UI\Area::scrollTo

(UI 0.9.9)

UI\Area::scrollTo — Area Scroll

Description

public UI\Area::scrollTo ( UI\Point $point , UI\Size $size )

Scroll this Area

Liste de paramètres

point

The point to scroll to

size

The size of the scroll pane

User Contributed Notes

There are no user contributed notes for this page.


Set Size

  • « UI\Area::scrollTo
  • UI\Executor »
  • PHP Manual
  • UI\Area
  • Set Size

UI\Area::setSize

(UI 0.9.9)

UI\Area::setSize — Set Size

Description

public UI\Area::setSize ( UI\Size $size )

Sets the size of this Area

Liste de paramètres

size

The new size

User Contributed Notes

There are no user contributed notes for this page.


Execution Scheduler

(UI 2.0.0)

Introduction

This facility schedules repetitive execution of a callback, useful for animations and other such activities.

Synopsis de la classe

abstract UI\Executor {
/* Constructor */
public __construct ( )
public __construct ( int $microseconds )
public __construct ( int $seconds , int $microseconds )
/* Méthodes */
public kill ( ) : void
abstract protected onExecute ( ) : void
public setInterval ( int $microseconds ) : bool
public setInterval ( int $seconds , int $microseconds ) : bool
}

Sommaire

  • UI\Executor::__construct — Construct a new Executor
  • UI\Executor::kill — Stop Executor
  • UI\Executor::onExecute — Execution Callback
  • UI\Executor::setInterval — Interval Manipulation

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Executor

  • « UI\Executor
  • UI\Executor::kill »
  • PHP Manual
  • UI\Executor
  • Construct a new Executor

UI\Executor::__construct

(UI 2.0.0)

UI\Executor::__construct — Construct a new Executor

Description

public UI\Executor::__construct ( )
public UI\Executor::__construct ( int $microseconds )
public UI\Executor::__construct ( int $seconds , int $microseconds )

Shall construct an executor with the given interval, will not start executing until main loop is entered

Liste de paramètres

seconds

Seconds between executions

microseconds

Microseconds between executions

User Contributed Notes

There are no user contributed notes for this page.


Stop Executor

  • « UI\Executor::__construct
  • UI\Executor::onExecute »
  • PHP Manual
  • UI\Executor
  • Stop Executor

UI\Executor::kill

(UI 2.0.0)

UI\Executor::kill — Stop Executor

Description

public UI\Executor::kill ( ) : void

Shall stop an executor, the executor cannot be restarted

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Execution Callback

  • « UI\Executor::kill
  • UI\Executor::setInterval »
  • PHP Manual
  • UI\Executor
  • Execution Callback

UI\Executor::onExecute

(UI 2.0.0)

UI\Executor::onExecute — Execution Callback

Description

abstract protected UI\Executor::onExecute ( ) : void

Shall be repetitively queued for execution in the main thread

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Interval Manipulation

  • « UI\Executor::onExecute
  • UI\Controls\Tab »
  • PHP Manual
  • UI\Executor
  • Interval Manipulation

UI\Executor::setInterval

(UI 2.0.0)

UI\Executor::setInterval — Interval Manipulation

Description

public UI\Executor::setInterval ( int $microseconds ) : bool
public UI\Executor::setInterval ( int $seconds , int $microseconds ) : bool

Shall set the new interval. An interval of 0 will pause the executor until a new interval has been set

Liste de paramètres

seconds

microseconds

Valeurs de retour

Indication of success

User Contributed Notes

There are no user contributed notes for this page.


Tab Control

(UI 0.9.9)

Introduction

A Tab can contain many pages of Controls, each with a title, each selectable by the user.

Synopsis de la classe

UI\Controls\Tab extends UI\Control {
/* Propriétés */
protected $controls ;
/* Méthodes */
public append ( string $name , UI\Control $control ) : int
public delete ( int $index ) : bool
public hasMargin ( int $page ) : bool
public insertAt ( string $name , int $page , UI\Control $control )
public pages ( ) : int
public setMargin ( int $page , bool $margin )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Propriétés

controls

Contains controls, should not be manipulated directly

Sommaire

  • UI\Controls\Tab::append — Append Page
  • UI\Controls\Tab::delete — Delete Page
  • UI\Controls\Tab::hasMargin — Margin Detection
  • UI\Controls\Tab::insertAt — Insert Page
  • UI\Controls\Tab::pages — Page Count
  • UI\Controls\Tab::setMargin — Set Margin

User Contributed Notes

There are no user contributed notes for this page.


Append Page

  • « UI\Controls\Tab
  • UI\Controls\Tab::delete »
  • PHP Manual
  • UI\Controls\Tab
  • Append Page

UI\Controls\Tab::append

(UI 0.9.9)

UI\Controls\Tab::append — Append Page

Description

public UI\Controls\Tab::append ( string $name , UI\Control $control ) : int

Append a new page to this Tab

Liste de paramètres

name

The name for the new page

control

The control for the new page

Valeurs de retour

Shall return the index of the appended control, may be 0

User Contributed Notes

There are no user contributed notes for this page.


Delete Page

  • « UI\Controls\Tab::append
  • UI\Controls\Tab::hasMargin »
  • PHP Manual
  • UI\Controls\Tab
  • Delete Page

UI\Controls\Tab::delete

(UI 0.9.9)

UI\Controls\Tab::delete — Delete Page

Description

public UI\Controls\Tab::delete ( int $index ) : bool

Shall remove the selected page from this Tab

Liste de paramètres

index

The index of the page to remove

Valeurs de retour

Indication of success

User Contributed Notes

There are no user contributed notes for this page.


Margin Detection

  • « UI\Controls\Tab::delete
  • UI\Controls\Tab::insertAt »
  • PHP Manual
  • UI\Controls\Tab
  • Margin Detection

UI\Controls\Tab::hasMargin

(UI 0.9.9)

UI\Controls\Tab::hasMargin — Margin Detection

Description

public UI\Controls\Tab::hasMargin ( int $page ) : bool

Shall detect if the given page has a margin.

Liste de paramètres

page

The index of the page

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Insert Page

  • « UI\Controls\Tab::hasMargin
  • UI\Controls\Tab::pages »
  • PHP Manual
  • UI\Controls\Tab
  • Insert Page

UI\Controls\Tab::insertAt

(UI 0.9.9)

UI\Controls\Tab::insertAt — Insert Page

Description

public UI\Controls\Tab::insertAt ( string $name , int $page , UI\Control $control )

Shall insert a new page into this Tab

Liste de paramètres

name

The name for the new page

page

The index to perform the insertion before

control

The control for the new page

User Contributed Notes

There are no user contributed notes for this page.


Page Count

  • « UI\Controls\Tab::insertAt
  • UI\Controls\Tab::setMargin »
  • PHP Manual
  • UI\Controls\Tab
  • Page Count

UI\Controls\Tab::pages

(UI 0.9.9)

UI\Controls\Tab::pages — Page Count

Description

public UI\Controls\Tab::pages ( ) : int

Shall return the number of pages in this Tab

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The number of pages in this Tab

User Contributed Notes

There are no user contributed notes for this page.


Set Margin

  • « UI\Controls\Tab::pages
  • UI\Controls\Check »
  • PHP Manual
  • UI\Controls\Tab
  • Set Margin

UI\Controls\Tab::setMargin

(UI 0.9.9)

UI\Controls\Tab::setMargin — Set Margin

Description

public UI\Controls\Tab::setMargin ( int $page , bool $margin )

Shall enable or disable margins on the selected page

Liste de paramètres

page

The page to select

margin

Margin switch

User Contributed Notes

There are no user contributed notes for this page.


Check Control

(UI 0.9.9)

Introduction

A Check is a labelled checkable box

Synopsis de la classe

UI\Controls\Check extends UI\Control {
/* Constructor */
public __construct ( string $text )
/* Méthodes */
public getText ( ) : string
public isChecked ( ) : bool
protected onToggle ( )
public setChecked ( bool $checked )
public setText ( string $text )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Sommaire

  • UI\Controls\Check::__construct — Construct a new Check
  • UI\Controls\Check::getText — Get Text
  • UI\Controls\Check::isChecked — Checked Detection
  • UI\Controls\Check::onToggle — Toggle Callback
  • UI\Controls\Check::setChecked — Set Checked
  • UI\Controls\Check::setText — Set Text

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Check

  • « UI\Controls\Check
  • UI\Controls\Check::getText »
  • PHP Manual
  • UI\Controls\Check
  • Construct a new Check

UI\Controls\Check::__construct

(UI 0.9.9)

UI\Controls\Check::__construct — Construct a new Check

Description

public UI\Controls\Check::__construct ( string $text )

Shall construct a new Check

Liste de paramètres

text

The text (label) for the Check box

User Contributed Notes

There are no user contributed notes for this page.


Get Text

  • « UI\Controls\Check::__construct
  • UI\Controls\Check::isChecked »
  • PHP Manual
  • UI\Controls\Check
  • Get Text

UI\Controls\Check::getText

(UI 0.9.9)

UI\Controls\Check::getText — Get Text

Description

public UI\Controls\Check::getText ( ) : string

Shall return the text (label) for this Check

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The current text (label)

User Contributed Notes

There are no user contributed notes for this page.


Checked Detection

  • « UI\Controls\Check::getText
  • UI\Controls\Check::onToggle »
  • PHP Manual
  • UI\Controls\Check
  • Checked Detection

UI\Controls\Check::isChecked

(UI 0.9.9)

UI\Controls\Check::isChecked — Checked Detection

Description

public UI\Controls\Check::isChecked ( ) : bool

Shall detect the status of this Check

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Toggle Callback

  • « UI\Controls\Check::isChecked
  • UI\Controls\Check::setChecked »
  • PHP Manual
  • UI\Controls\Check
  • Toggle Callback

UI\Controls\Check::onToggle

(UI 0.9.9)

UI\Controls\Check::onToggle — Toggle Callback

Description

protected UI\Controls\Check::onToggle ( )

Shall be executed when the status of this Check is changed

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Checked

  • « UI\Controls\Check::onToggle
  • UI\Controls\Check::setText »
  • PHP Manual
  • UI\Controls\Check
  • Set Checked

UI\Controls\Check::setChecked

(UI 0.9.9)

UI\Controls\Check::setChecked — Set Checked

Description

public UI\Controls\Check::setChecked ( bool $checked )

Shall change the status of this Check

Liste de paramètres

checked

The new status

User Contributed Notes

There are no user contributed notes for this page.


Set Text

  • « UI\Controls\Check::setChecked
  • UI\Controls\Button »
  • PHP Manual
  • UI\Controls\Check
  • Set Text

UI\Controls\Check::setText

(UI 0.9.9)

UI\Controls\Check::setText — Set Text

Description

public UI\Controls\Check::setText ( string $text )

Shall set the text (label) for this Check

Liste de paramètres

text

The new text (label)

User Contributed Notes

There are no user contributed notes for this page.


Button Control

(UI 0.9.9)

Introduction

Represents a labelled clickable button

Synopsis de la classe

UI\Controls\Button extends UI\Control {
/* Constructor */
public __construct ( string $text )
/* Méthodes */
public getText ( ) : string
protected onClick ( )
public setText ( string $text )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Sommaire

  • UI\Controls\Button::__construct — Construct a new Button
  • UI\Controls\Button::getText — Get Text
  • UI\Controls\Button::onClick — Click Handler
  • UI\Controls\Button::setText — Set Text

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Button

  • « UI\Controls\Button
  • UI\Controls\Button::getText »
  • PHP Manual
  • UI\Controls\Button
  • Construct a new Button

UI\Controls\Button::__construct

(UI 0.9.9)

UI\Controls\Button::__construct — Construct a new Button

Description

public UI\Controls\Button::__construct ( string $text )

Shall construct a new Button

Liste de paramètres

text

The text (label) for this Button

User Contributed Notes

There are no user contributed notes for this page.


Get Text

  • « UI\Controls\Button::__construct
  • UI\Controls\Button::onClick »
  • PHP Manual
  • UI\Controls\Button
  • Get Text

UI\Controls\Button::getText

(UI 0.9.9)

UI\Controls\Button::getText — Get Text

Description

public UI\Controls\Button::getText ( ) : string

Shall retrieve the text (label) for this Button

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The current text (label)

User Contributed Notes

There are no user contributed notes for this page.


Click Handler

  • « UI\Controls\Button::getText
  • UI\Controls\Button::setText »
  • PHP Manual
  • UI\Controls\Button
  • Click Handler

UI\Controls\Button::onClick

(UI 0.9.9)

UI\Controls\Button::onClick — Click Handler

Description

protected UI\Controls\Button::onClick ( )

Shall be executed when this Button is clicked

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Text

  • « UI\Controls\Button::onClick
  • UI\Controls\ColorButton »
  • PHP Manual
  • UI\Controls\Button
  • Set Text

UI\Controls\Button::setText

(UI 0.9.9)

UI\Controls\Button::setText — Set Text

Description

public UI\Controls\Button::setText ( string $text )

Shall set the text (label) for this Button

Liste de paramètres

text

The new text (label)

User Contributed Notes

There are no user contributed notes for this page.


ColorButton Control

(UI 0.9.9)

Introduction

A Color Button is a button which displays a color picker when clicked

Synopsis de la classe

UI\Controls\ColorButton extends UI\Control {
/* Méthodes */
public getColor ( ) : UI\Color
protected onChange ( )
public setColor ( UI\Draw\Color $color )
public setColor ( int $color )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Sommaire

  • UI\Controls\ColorButton::getColor — Get Color
  • UI\Controls\ColorButton::onChange — Change Handler
  • UI\Controls\ColorButton::setColor — Set Color

User Contributed Notes

There are no user contributed notes for this page.


Get Color

  • « UI\Controls\ColorButton
  • UI\Controls\ColorButton::onChange »
  • PHP Manual
  • UI\Controls\ColorButton
  • Get Color

UI\Controls\ColorButton::getColor

(UI 0.9.9)

UI\Controls\ColorButton::getColor — Get Color

Description

public UI\Controls\ColorButton::getColor ( ) : UI\Color

Shall retrieve the currently selected Color

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Change Handler

  • « UI\Controls\ColorButton::getColor
  • UI\Controls\ColorButton::setColor »
  • PHP Manual
  • UI\Controls\ColorButton
  • Change Handler

UI\Controls\ColorButton::onChange

(UI 0.9.9)

UI\Controls\ColorButton::onChange — Change Handler

Description

protected UI\Controls\ColorButton::onChange ( )

Shall be executed when the selected Color is changed

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Color

  • « UI\Controls\ColorButton::onChange
  • UI\Controls\Label »
  • PHP Manual
  • UI\Controls\ColorButton
  • Set Color

UI\Controls\ColorButton::setColor

(UI 0.9.9)

UI\Controls\ColorButton::setColor — Set Color

Description

public UI\Controls\ColorButton::setColor ( UI\Draw\Color $color )
public UI\Controls\ColorButton::setColor ( int $color )

Shall set the currently selected Color

Liste de paramètres

color

The new color

User Contributed Notes

There are no user contributed notes for this page.


Label Control

(UI 0.9.9)

Introduction

A Label is a single line of text, meant to identify, for the user, some element of the interface.

Synopsis de la classe

UI\Controls\Label extends UI\Control {
/* Constructor */
public __construct ( string $text )
/* Méthodes */
public getText ( ) : string
public setText ( string $text )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Sommaire

  • UI\Controls\Label::__construct — Construct a new Label
  • UI\Controls\Label::getText — Get Text
  • UI\Controls\Label::setText — Set Text

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Label

  • « UI\Controls\Label
  • UI\Controls\Label::getText »
  • PHP Manual
  • UI\Controls\Label
  • Construct a new Label

UI\Controls\Label::__construct

(UI 0.9.9)

UI\Controls\Label::__construct — Construct a new Label

Description

public UI\Controls\Label::__construct ( string $text )

Shall construct a new Label

Liste de paramètres

text

The text for this label

User Contributed Notes

There are no user contributed notes for this page.


Get Text

  • « UI\Controls\Label::__construct
  • UI\Controls\Label::setText »
  • PHP Manual
  • UI\Controls\Label
  • Get Text

UI\Controls\Label::getText

(UI 0.9.9)

UI\Controls\Label::getText — Get Text

Description

public UI\Controls\Label::getText ( ) : string

Shall return the current text for this Label

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Set Text

  • « UI\Controls\Label::getText
  • UI\Controls\Entry »
  • PHP Manual
  • UI\Controls\Label
  • Set Text

UI\Controls\Label::setText

(UI 0.9.9)

UI\Controls\Label::setText — Set Text

Description

public UI\Controls\Label::setText ( string $text )

Shall set the text for this Label

Liste de paramètres

text

The new text

User Contributed Notes

There are no user contributed notes for this page.


Entry Control

(UI 0.9.9)

Introduction

An Entry is a text entry control, suitable for entering plain text, passwords, or search terms.

Synopsis de la classe

UI\Controls\Entry extends UI\Control {
/* Constants */
const int Normal ;
const int Password ;
const int Search ;
/* Constructor */
public __construct ( int $type = UI\Controls\Entry::Normal )
/* Méthodes */
public getText ( ) : string
public isReadOnly ( ) : bool
protected onChange ( )
public setReadOnly ( bool $readOnly )
public setText ( string $text )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Constantes pré-définies

UI\Controls\Entry::Normal

A normal single line entry

UI\Controls\Entry::Password

A password entry

UI\Controls\Entry::Search

A search entry

Sommaire

  • UI\Controls\Entry::__construct — Construct a new Entry
  • UI\Controls\Entry::getText — Get Text
  • UI\Controls\Entry::isReadOnly — Detect Read Only
  • UI\Controls\Entry::onChange — Change Handler
  • UI\Controls\Entry::setReadOnly — Set Read Only
  • UI\Controls\Entry::setText — Set Text

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Entry

  • « UI\Controls\Entry
  • UI\Controls\Entry::getText »
  • PHP Manual
  • UI\Controls\Entry
  • Construct a new Entry

UI\Controls\Entry::__construct

(UI 0.9.9)

UI\Controls\Entry::__construct — Construct a new Entry

Description

public UI\Controls\Entry::__construct ( int $type = UI\Controls\Entry::Normal )

Construct a new entry of the given type

Liste de paramètres

type

Entry::Normal, Entry::Password, or Entry::Search

User Contributed Notes

There are no user contributed notes for this page.


Get Text

  • « UI\Controls\Entry::__construct
  • UI\Controls\Entry::isReadOnly »
  • PHP Manual
  • UI\Controls\Entry
  • Get Text

UI\Controls\Entry::getText

(UI 0.9.9)

UI\Controls\Entry::getText — Get Text

Description

public UI\Controls\Entry::getText ( ) : string

Shall return the current text from this Entry

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The current text

User Contributed Notes

There are no user contributed notes for this page.


Detect Read Only

  • « UI\Controls\Entry::getText
  • UI\Controls\Entry::onChange »
  • PHP Manual
  • UI\Controls\Entry
  • Detect Read Only

UI\Controls\Entry::isReadOnly

(UI 0.9.9)

UI\Controls\Entry::isReadOnly — Detect Read Only

Description

public UI\Controls\Entry::isReadOnly ( ) : bool

Shall detect if this Entry is read only

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Change Handler

  • « UI\Controls\Entry::isReadOnly
  • UI\Controls\Entry::setReadOnly »
  • PHP Manual
  • UI\Controls\Entry
  • Change Handler

UI\Controls\Entry::onChange

(UI 0.9.9)

UI\Controls\Entry::onChange — Change Handler

Description

protected UI\Controls\Entry::onChange ( )

Shall be executed when the text in this Entry changes

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Read Only

  • « UI\Controls\Entry::onChange
  • UI\Controls\Entry::setText »
  • PHP Manual
  • UI\Controls\Entry
  • Set Read Only

UI\Controls\Entry::setReadOnly

(UI 0.9.9)

UI\Controls\Entry::setReadOnly — Set Read Only

Description

public UI\Controls\Entry::setReadOnly ( bool $readOnly )

Shall enable or disable read only for this Entry

Liste de paramètres

readOnly

User Contributed Notes

There are no user contributed notes for this page.


Set Text

  • « UI\Controls\Entry::setReadOnly
  • UI\Controls\MultilineEntry »
  • PHP Manual
  • UI\Controls\Entry
  • Set Text

UI\Controls\Entry::setText

(UI 0.9.9)

UI\Controls\Entry::setText — Set Text

Description

public UI\Controls\Entry::setText ( string $text )

Shall set the text for this Entry

Liste de paramètres

text

The new text

User Contributed Notes

There are no user contributed notes for this page.


MultilineEntry Control

(UI 0.9.9)

Introduction

A Multiline Entry is a text entry control able to hold multiple lines of text, with or without wrapping.

Synopsis de la classe

UI\Controls\MultilineEntry extends UI\Control {
/* Constants */
const int Wrap ;
const int NoWrap ;
/* Constructor */
public __construct ( int $type = ? )
/* Méthodes */
public append ( string $text )
public getText ( ) : string
public isReadOnly ( ) : bool
protected onChange ( )
public setReadOnly ( bool $readOnly )
public setText ( string $text )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Constantes pré-définies

UI\Controls\MultilineEntry::Wrap

Allow lines to wrap

UI\Controls\MultilineEntry::NoWrap

Do not allow lines to wrap

Sommaire

  • UI\Controls\MultilineEntry::append — Append Text
  • UI\Controls\MultilineEntry::__construct — Construct a new Multiline Entry
  • UI\Controls\MultilineEntry::getText — Get Text
  • UI\Controls\MultilineEntry::isReadOnly — Read Only Detection
  • UI\Controls\MultilineEntry::onChange — Change Handler
  • UI\Controls\MultilineEntry::setReadOnly — Set Read Only
  • UI\Controls\MultilineEntry::setText — Set Text

User Contributed Notes

There are no user contributed notes for this page.


Append Text

  • « UI\Controls\MultilineEntry
  • UI\Controls\MultilineEntry::__construct »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Append Text

UI\Controls\MultilineEntry::append

(UI 0.9.9)

UI\Controls\MultilineEntry::append — Append Text

Description

public UI\Controls\MultilineEntry::append ( string $text )

Shall append the given text to the text in this Multiline Entry

Liste de paramètres

text

The text to append

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Multiline Entry

  • « UI\Controls\MultilineEntry::append
  • UI\Controls\MultilineEntry::getText »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Construct a new Multiline Entry

UI\Controls\MultilineEntry::__construct

(UI 0.9.9)

UI\Controls\MultilineEntry::__construct — Construct a new Multiline Entry

Description

public UI\Controls\MultilineEntry::__construct ( int $type = ? )

Shall construct a new Multiline Entry of the given type

Liste de paramètres

type

MultilineEntry::Wrap or MultilineEntry::NoWrap

User Contributed Notes

There are no user contributed notes for this page.


Get Text

  • « UI\Controls\MultilineEntry::__construct
  • UI\Controls\MultilineEntry::isReadOnly »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Get Text

UI\Controls\MultilineEntry::getText

(UI 0.9.9)

UI\Controls\MultilineEntry::getText — Get Text

Description

public UI\Controls\MultilineEntry::getText ( ) : string

Shall return the text in this Multiline Entry

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Read Only Detection

  • « UI\Controls\MultilineEntry::getText
  • UI\Controls\MultilineEntry::onChange »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Read Only Detection

UI\Controls\MultilineEntry::isReadOnly

(UI 0.9.9)

UI\Controls\MultilineEntry::isReadOnly — Read Only Detection

Description

public UI\Controls\MultilineEntry::isReadOnly ( ) : bool

Shall detect if this Multiline Entry is read only

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Change Handler

  • « UI\Controls\MultilineEntry::isReadOnly
  • UI\Controls\MultilineEntry::setReadOnly »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Change Handler

UI\Controls\MultilineEntry::onChange

(UI 0.9.9)

UI\Controls\MultilineEntry::onChange — Change Handler

Description

protected UI\Controls\MultilineEntry::onChange ( )

Shall be executed when the text in this Multiline Entry is changed

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Read Only

  • « UI\Controls\MultilineEntry::onChange
  • UI\Controls\MultilineEntry::setText »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Set Read Only

UI\Controls\MultilineEntry::setReadOnly

(UI 0.9.9)

UI\Controls\MultilineEntry::setReadOnly — Set Read Only

Description

public UI\Controls\MultilineEntry::setReadOnly ( bool $readOnly )

Shall enable or disable read only on this Multiline Entry

Liste de paramètres

readOnly

User Contributed Notes

There are no user contributed notes for this page.


Set Text

  • « UI\Controls\MultilineEntry::setReadOnly
  • UI\Controls\Spin »
  • PHP Manual
  • UI\Controls\MultilineEntry
  • Set Text

UI\Controls\MultilineEntry::setText

(UI 0.9.9)

UI\Controls\MultilineEntry::setText — Set Text

Description

public UI\Controls\MultilineEntry::setText ( string $text )

Shall set the text in this Multiline Entry

Liste de paramètres

text

The new text

User Contributed Notes

There are no user contributed notes for this page.


Spin Control

(UI 0.9.9)

Introduction

A Spin box is a text box with an up-down control which changes the integer value in the box, within a defined range

Synopsis de la classe

UI\Controls\Spin extends UI\Control {
/* Constructor */
public __construct ( int $min , int $max )
/* Méthodes */
public getValue ( ) : int
protected onChange ( )
public setValue ( int $value )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Sommaire

  • UI\Controls\Spin::__construct — Construct a new Spin
  • UI\Controls\Spin::getValue — Get Value
  • UI\Controls\Spin::onChange — Change Handler
  • UI\Controls\Spin::setValue — Set Value

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Spin

  • « UI\Controls\Spin
  • UI\Controls\Spin::getValue »
  • PHP Manual
  • UI\Controls\Spin
  • Construct a new Spin

UI\Controls\Spin::__construct

(UI 0.9.9)

UI\Controls\Spin::__construct — Construct a new Spin

Description

public UI\Controls\Spin::__construct ( int $min , int $max )

Constructs a new Spin with the given range

Liste de paramètres

min

The minimum value allowed

max

The maximum value allowed

User Contributed Notes

There are no user contributed notes for this page.


Get Value

  • « UI\Controls\Spin::__construct
  • UI\Controls\Spin::onChange »
  • PHP Manual
  • UI\Controls\Spin
  • Get Value

UI\Controls\Spin::getValue

(UI 0.9.9)

UI\Controls\Spin::getValue — Get Value

Description

public UI\Controls\Spin::getValue ( ) : int

Get the value in this Spin

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Change Handler

  • « UI\Controls\Spin::getValue
  • UI\Controls\Spin::setValue »
  • PHP Manual
  • UI\Controls\Spin
  • Change Handler

UI\Controls\Spin::onChange

(UI 0.9.9)

UI\Controls\Spin::onChange — Change Handler

Description

protected UI\Controls\Spin::onChange ( )

Shall be executed when the value in this Spin changes

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Value

  • « UI\Controls\Spin::onChange
  • UI\Controls\Slider »
  • PHP Manual
  • UI\Controls\Spin
  • Set Value

UI\Controls\Spin::setValue

(UI 0.9.9)

UI\Controls\Spin::setValue — Set Value

Description

public UI\Controls\Spin::setValue ( int $value )

Set the value in this Spin

Liste de paramètres

value

The new value

User Contributed Notes

There are no user contributed notes for this page.


Slider Control

(UI 0.9.9)

Introduction

A Slider is a control which represents a range, and a current value in the range. The sliding element of the control (sometimes called the "thumb") reflects the value, and can be adjusted within the range.

Synopsis de la classe

UI\Controls\Slider extends UI\Control {
/* Constructor */
public __construct ( int $min , int $max )
/* Méthodes */
public getValue ( ) : int
protected onChange ( )
public setValue ( int $value )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Sommaire

  • UI\Controls\Slider::__construct — Construct a new Slider
  • UI\Controls\Slider::getValue — Get Value
  • UI\Controls\Slider::onChange — Change Handler
  • UI\Controls\Slider::setValue — Set Value

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Slider

  • « UI\Controls\Slider
  • UI\Controls\Slider::getValue »
  • PHP Manual
  • UI\Controls\Slider
  • Construct a new Slider

UI\Controls\Slider::__construct

(UI 0.9.9)

UI\Controls\Slider::__construct — Construct a new Slider

Description

public UI\Controls\Slider::__construct ( int $min , int $max )

Construct a new Slider with the given range

Liste de paramètres

min

The minimum allowed value

max

The maximum allowed value

User Contributed Notes

There are no user contributed notes for this page.


Get Value

  • « UI\Controls\Slider::__construct
  • UI\Controls\Slider::onChange »
  • PHP Manual
  • UI\Controls\Slider
  • Get Value

UI\Controls\Slider::getValue

(UI 0.9.9)

UI\Controls\Slider::getValue — Get Value

Description

public UI\Controls\Slider::getValue ( ) : int

Get the value from this Slider

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Change Handler

  • « UI\Controls\Slider::getValue
  • UI\Controls\Slider::setValue »
  • PHP Manual
  • UI\Controls\Slider
  • Change Handler

UI\Controls\Slider::onChange

(UI 0.9.9)

UI\Controls\Slider::onChange — Change Handler

Description

protected UI\Controls\Slider::onChange ( )

Shall be executed when the value of this Slider changes

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Value

  • « UI\Controls\Slider::onChange
  • UI\Controls\Progress »
  • PHP Manual
  • UI\Controls\Slider
  • Set Value

UI\Controls\Slider::setValue

(UI 0.9.9)

UI\Controls\Slider::setValue — Set Value

Description

public UI\Controls\Slider::setValue ( int $value )

Shall set the value for this Slider

Liste de paramètres

value

The new value

User Contributed Notes

There are no user contributed notes for this page.


Progress Control

(UI 0.9.9)

Introduction

A Progress control is a familiar Progress bar: It represents progress as a percentage, with a possible range of 0 to 100 (inclusive).

Synopsis de la classe

UI\Controls\Progress extends UI\Control {
/* Méthodes */
public getValue ( ) : int
public setValue ( int $value )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Sommaire

  • UI\Controls\Progress::getValue — Get Value
  • UI\Controls\Progress::setValue — Set Value

User Contributed Notes

There are no user contributed notes for this page.


Get Value

  • « UI\Controls\Progress
  • UI\Controls\Progress::setValue »
  • PHP Manual
  • UI\Controls\Progress
  • Get Value

UI\Controls\Progress::getValue

(UI 0.9.9)

UI\Controls\Progress::getValue — Get Value

Description

public UI\Controls\Progress::getValue ( ) : int

Shall retrieve the current value of this Progress bar

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Value

  • « UI\Controls\Progress::getValue
  • UI\Controls\Separator »
  • PHP Manual
  • UI\Controls\Progress
  • Set Value

UI\Controls\Progress::setValue

(UI 0.9.9)

UI\Controls\Progress::setValue — Set Value

Description

public UI\Controls\Progress::setValue ( int $value )

Shall set the value for this Progress bar

Liste de paramètres

value

An integer between 0 and 100 (inclusive)

User Contributed Notes

There are no user contributed notes for this page.


Control Separator

(UI 0.9.9)

Introduction

A Separator represents a control separator, it has no other function.

Synopsis de la classe

UI\Controls\Separator extends UI\Control {
/* Constants */
const int Horizontal ;
const int Vertical ;
/* Constructor */
public __construct ( int $type = UI\Controls\Separator::Horizontal )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Constantes pré-définies

UI\Controls\Separator::Horizontal

A Horizontal Separator

UI\Controls\Separator::Vertical

A Vertical Separator

Sommaire

  • UI\Controls\Separator::__construct — Construct a new Separator

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Separator

  • « UI\Controls\Separator
  • UI\Controls\Combo »
  • PHP Manual
  • UI\Controls\Separator
  • Construct a new Separator

UI\Controls\Separator::__construct

(UI 0.9.9)

UI\Controls\Separator::__construct — Construct a new Separator

Description

public UI\Controls\Separator::__construct ( int $type = UI\Controls\Separator::Horizontal )

Shall construct a new Separator of the given type

Liste de paramètres

type

Separator::Horizonal or Separator::Vertical

User Contributed Notes

There are no user contributed notes for this page.


Combo Control

(UI 0.9.9)

Introduction

A Combo control represents a list of options, like the familiar select HTML element.

Synopsis de la classe

UI\Controls\Combo extends UI\Control {
/* Méthodes */
public append ( string $text )
public getSelected ( ) : int
protected onSelected ( )
public setSelected ( int $index )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Sommaire

  • UI\Controls\Combo::append — Append Option
  • UI\Controls\Combo::getSelected — Get Selected Option
  • UI\Controls\Combo::onSelected — Selected Handler
  • UI\Controls\Combo::setSelected — Set Selected Option

User Contributed Notes

There are no user contributed notes for this page.


Append Option

  • « UI\Controls\Combo
  • UI\Controls\Combo::getSelected »
  • PHP Manual
  • UI\Controls\Combo
  • Append Option

UI\Controls\Combo::append

(UI 0.9.9)

UI\Controls\Combo::append — Append Option

Description

public UI\Controls\Combo::append ( string $text )

Append an option to this Combo

Liste de paramètres

text

The text for the new option

User Contributed Notes

There are no user contributed notes for this page.


Get Selected Option

  • « UI\Controls\Combo::append
  • UI\Controls\Combo::onSelected »
  • PHP Manual
  • UI\Controls\Combo
  • Get Selected Option

UI\Controls\Combo::getSelected

(UI 0.9.9)

UI\Controls\Combo::getSelected — Get Selected Option

Description

public UI\Controls\Combo::getSelected ( ) : int

Shall retrieve the index of the option selected in this Combo

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Selected Handler

  • « UI\Controls\Combo::getSelected
  • UI\Controls\Combo::setSelected »
  • PHP Manual
  • UI\Controls\Combo
  • Selected Handler

UI\Controls\Combo::onSelected

(UI 0.9.9)

UI\Controls\Combo::onSelected — Selected Handler

Description

protected UI\Controls\Combo::onSelected ( )

Shall be executed when an option is selected in this Combo

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Selected Option

  • « UI\Controls\Combo::onSelected
  • UI\Controls\EditableCombo »
  • PHP Manual
  • UI\Controls\Combo
  • Set Selected Option

UI\Controls\Combo::setSelected

(UI 0.9.9)

UI\Controls\Combo::setSelected — Set Selected Option

Description

public UI\Controls\Combo::setSelected ( int $index )

Shall set the currently selected option in this Combo

Liste de paramètres

index

The index of the option to select

User Contributed Notes

There are no user contributed notes for this page.


EdiableCombo Control

(UI 0.9.9)

Introduction

An Editable Combo is a Combo which allows the user to enter custom options

Synopsis de la classe

UI\Controls\EditableCombo extends UI\Control {
/* Méthodes */
public append ( string $text )
public getText ( ) : string
protected onChange ( )
public setText ( string $text )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Sommaire

  • UI\Controls\EditableCombo::append — Append Option
  • UI\Controls\EditableCombo::getText — Get Text
  • UI\Controls\EditableCombo::onChange — Change Handler
  • UI\Controls\EditableCombo::setText — Set Text

User Contributed Notes

There are no user contributed notes for this page.


Append Option

  • « UI\Controls\EditableCombo
  • UI\Controls\EditableCombo::getText »
  • PHP Manual
  • UI\Controls\EditableCombo
  • Append Option

UI\Controls\EditableCombo::append

(UI 0.9.9)

UI\Controls\EditableCombo::append — Append Option

Description

public UI\Controls\EditableCombo::append ( string $text )

Shall append a new option to this Editable Combo

Liste de paramètres

text

The text for the new option

User Contributed Notes

There are no user contributed notes for this page.


Get Text

  • « UI\Controls\EditableCombo::append
  • UI\Controls\EditableCombo::onChange »
  • PHP Manual
  • UI\Controls\EditableCombo
  • Get Text

UI\Controls\EditableCombo::getText

(UI 0.9.9)

UI\Controls\EditableCombo::getText — Get Text

Description

public UI\Controls\EditableCombo::getText ( ) : string

Get the value of the currently selected option in this Editable Combo

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Change Handler

  • « UI\Controls\EditableCombo::getText
  • UI\Controls\EditableCombo::setText »
  • PHP Manual
  • UI\Controls\EditableCombo
  • Change Handler

UI\Controls\EditableCombo::onChange

(UI 0.9.9)

UI\Controls\EditableCombo::onChange — Change Handler

Description

protected UI\Controls\EditableCombo::onChange ( )

Shall be executed when the value of this Editable Combobox changes

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Text

  • « UI\Controls\EditableCombo::onChange
  • UI\Controls\Radio »
  • PHP Manual
  • UI\Controls\EditableCombo
  • Set Text

UI\Controls\EditableCombo::setText

(UI 0.9.9)

UI\Controls\EditableCombo::setText — Set Text

Description

public UI\Controls\EditableCombo::setText ( string $text )

Shall set the text of the currently selected option in this Editable Combo

Liste de paramètres

text

The new text

User Contributed Notes

There are no user contributed notes for this page.


Radio Control

(UI 0.9.9)

Introduction

A Radio is similar to the radio input type familiar from HTML

Synopsis de la classe

UI\Controls\Radio extends UI\Control {
/* Méthodes */
public append ( string $text )
public getSelected ( ) : int
protected onSelected ( )
public setSelected ( int $index )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Sommaire

  • UI\Controls\Radio::append — Append Option
  • UI\Controls\Radio::getSelected — Get Selected Option
  • UI\Controls\Radio::onSelected — Selected Handler
  • UI\Controls\Radio::setSelected — Set Selected Option

User Contributed Notes

There are no user contributed notes for this page.


Append Option

  • « UI\Controls\Radio
  • UI\Controls\Radio::getSelected »
  • PHP Manual
  • UI\Controls\Radio
  • Append Option

UI\Controls\Radio::append

(UI 0.9.9)

UI\Controls\Radio::append — Append Option

Description

public UI\Controls\Radio::append ( string $text )

Shall append a new option to this Radio

Liste de paramètres

text

The text (label) for the option

User Contributed Notes

There are no user contributed notes for this page.


Get Selected Option

  • « UI\Controls\Radio::append
  • UI\Controls\Radio::onSelected »
  • PHP Manual
  • UI\Controls\Radio
  • Get Selected Option

UI\Controls\Radio::getSelected

(UI 0.9.9)

UI\Controls\Radio::getSelected — Get Selected Option

Description

public UI\Controls\Radio::getSelected ( ) : int

Shall retrieve the index of the currently selected option in this Radio

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Selected Handler

  • « UI\Controls\Radio::getSelected
  • UI\Controls\Radio::setSelected »
  • PHP Manual
  • UI\Controls\Radio
  • Selected Handler

UI\Controls\Radio::onSelected

(UI 0.9.9)

UI\Controls\Radio::onSelected — Selected Handler

Description

protected UI\Controls\Radio::onSelected ( )

Shall be executed when the option selected in this Radio changes

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Selected Option

  • « UI\Controls\Radio::onSelected
  • UI\Controls\Picker »
  • PHP Manual
  • UI\Controls\Radio
  • Set Selected Option

UI\Controls\Radio::setSelected

(UI 0.9.9)

UI\Controls\Radio::setSelected — Set Selected Option

Description

public UI\Controls\Radio::setSelected ( int $index )

Shall set the currently selected option in this Radio

Liste de paramètres

index

The index of the option to select

User Contributed Notes

There are no user contributed notes for this page.


Picker Control

(UI 0.9.9)

Introduction

A Picker represents a button which when clicked presents a native Date/Time/DateTime Picker interface to the user.

Synopsis de la classe

UI\Controls\Picker extends UI\Control {
/* Constants */
const int Date ;
const int Time ;
const int DateTime ;
/* Constructor */
public __construct ( int $type = UI\Controls\Picker::Date )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Constantes pré-définies

UI\Controls\Picker::Date

A Date Picker

UI\Controls\Picker::Time

A Time Picker

UI\Controls\Picker::DateTime

A Date and Time Picker

Sommaire

  • UI\Controls\Picker::__construct — Construct a new Picker

User Contributed Notes

falcon560 at gmail dot com 05-Nov-2017 07:54
No getter method for the date/time


Construct a new Picker

  • « UI\Controls\Picker
  • UI\Controls\Form »
  • PHP Manual
  • UI\Controls\Picker
  • Construct a new Picker

UI\Controls\Picker::__construct

(UI 0.9.9)

UI\Controls\Picker::__construct — Construct a new Picker

Description

public UI\Controls\Picker::__construct ( int $type = UI\Controls\Picker::Date )

Construct a new Picker of the given type

Liste de paramètres

type

Picker::Date, Picker::Time, or Picker::DateTime

User Contributed Notes

There are no user contributed notes for this page.


Control Form (Arrangement)

(UI 0.9.9)

Introduction

A Form is a control which allows the arrangement of other controls into a familiar layout (the form).

Synopsis de la classe

UI\Controls\Form extends UI\Control {
/* Propriétés */
protected $controls ;
/* Méthodes */
public append ( string $label , UI\Control $control , bool $stretchy = false ) : int
public delete ( int $index ) : bool
public isPadded ( ) : bool
public setPadded ( bool $padded )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Propriétés

controls

Contains controls, should not be manipulated directly

Sommaire

  • UI\Controls\Form::append — Append Control
  • UI\Controls\Form::delete — Delete Control
  • UI\Controls\Form::isPadded — Padding Detection
  • UI\Controls\Form::setPadded — Set Padding

User Contributed Notes

There are no user contributed notes for this page.


Append Control

  • « UI\Controls\Form
  • UI\Controls\Form::delete »
  • PHP Manual
  • UI\Controls\Form
  • Append Control

UI\Controls\Form::append

(UI 0.9.9)

UI\Controls\Form::append — Append Control

Description

public UI\Controls\Form::append ( string $label , UI\Control $control , bool $stretchy = false ) : int

Shall append the control to the form, and set the label

Liste de paramètres

label

The text for the label

control

A control

stretchy

Should be set true to stretch the control

Valeurs de retour

Shall return the index of the appended control, may be 0

User Contributed Notes

There are no user contributed notes for this page.


Delete Control

  • « UI\Controls\Form::append
  • UI\Controls\Form::isPadded »
  • PHP Manual
  • UI\Controls\Form
  • Delete Control

UI\Controls\Form::delete

(UI 0.9.9)

UI\Controls\Form::delete — Delete Control

Description

public UI\Controls\Form::delete ( int $index ) : bool

Shall delete the control at the given index in this Form

Liste de paramètres

index

The index of the control to remove

Valeurs de retour

Indication of succcess

User Contributed Notes

There are no user contributed notes for this page.


Padding Detection

  • « UI\Controls\Form::delete
  • UI\Controls\Form::setPadded »
  • PHP Manual
  • UI\Controls\Form
  • Padding Detection

UI\Controls\Form::isPadded

(UI 0.9.9)

UI\Controls\Form::isPadded — Padding Detection

Description

public UI\Controls\Form::isPadded ( ) : bool

Shall detect if padding is enabled on this Form

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Padding

  • « UI\Controls\Form::isPadded
  • UI\Controls\Grid »
  • PHP Manual
  • UI\Controls\Form
  • Set Padding

UI\Controls\Form::setPadded

(UI 0.9.9)

UI\Controls\Form::setPadded — Set Padding

Description

public UI\Controls\Form::setPadded ( bool $padded )

Shall enable or disable padding on this Form

Liste de paramètres

padded

User Contributed Notes

There are no user contributed notes for this page.


Control Grid (Arrangement)

(UI 0.9.9)

Introduction

A Grid is a control which is allows the arrangement of children into a grid

Synopsis de la classe

UI\Controls\Grid extends UI\Control {
/* Constants */
const int Fill ;
const int Start ;
const int Center ;
const int End ;
const int Leading ;
const int Top ;
const int Trailing ;
const int Bottom ;
/* Propriétés */
protected $controls ;
/* Méthodes */
public append ( UI\Control $control , int $left , int $top , int $xspan , int $yspan , bool $hexpand , int $halign , bool $vexpand , int $valign )
public isPadded ( ) : bool
public setPadded ( bool $padding )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Constantes pré-définies

UI\Controls\Grid::Fill

UI\Controls\Grid::Start

UI\Controls\Grid::Center

UI\Controls\Grid::End

UI\Controls\Grid::Leading

UI\Controls\Grid::Top

UI\Controls\Grid::Trailing

UI\Controls\Grid::Bottom

Propriétés

controls

Contains controls, should not be manipulated directly

Sommaire

  • UI\Controls\Grid::append — Append Control
  • UI\Controls\Grid::isPadded — Padding Detection
  • UI\Controls\Grid::setPadded — Set Padding

User Contributed Notes

There are no user contributed notes for this page.


Append Control

  • « UI\Controls\Grid
  • UI\Controls\Grid::isPadded »
  • PHP Manual
  • UI\Controls\Grid
  • Append Control

UI\Controls\Grid::append

(UI 0.9.9)

UI\Controls\Grid::append — Append Control

Description

public UI\Controls\Grid::append ( UI\Control $control , int $left , int $top , int $xspan , int $yspan , bool $hexpand , int $halign , bool $vexpand , int $valign )

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

control

The Control to append

left

top

xspan

yspan

hexpand

halign

vexpand

valign

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Padding Detection

  • « UI\Controls\Grid::append
  • UI\Controls\Grid::setPadded »
  • PHP Manual
  • UI\Controls\Grid
  • Padding Detection

UI\Controls\Grid::isPadded

(UI 0.9.9)

UI\Controls\Grid::isPadded — Padding Detection

Description

public UI\Controls\Grid::isPadded ( ) : bool

Shall detect if padding is enabled on this Grid

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Padding

  • « UI\Controls\Grid::isPadded
  • UI\Controls\Group »
  • PHP Manual
  • UI\Controls\Grid
  • Set Padding

UI\Controls\Grid::setPadded

(UI 0.9.9)

UI\Controls\Grid::setPadded — Set Padding

Description

public UI\Controls\Grid::setPadded ( bool $padding )

Shall enable or disable padding for this Grid

Liste de paramètres

padding

User Contributed Notes

There are no user contributed notes for this page.


Control Group (Arrangement)

(UI 0.9.9)

Introduction

A Group is a titled container for child controls

Synopsis de la classe

UI\Controls\Group extends UI\Control {
/* Propriétés */
protected $controls ;
/* Constructor */
public __construct ( string $title )
/* Méthodes */
public append ( UI\Control $control )
public getTitle ( ) : string
public hasMargin ( ) : bool
public setMargin ( bool $margin )
public setTitle ( string $title )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Propriétés

controls

Contains controls, should not be manipulated directly

Sommaire

  • UI\Controls\Group::append — Append Control
  • UI\Controls\Group::__construct — Construct a new Group
  • UI\Controls\Group::getTitle — Get Title
  • UI\Controls\Group::hasMargin — Margin Detection
  • UI\Controls\Group::setMargin — Set Margin
  • UI\Controls\Group::setTitle — Set Title

User Contributed Notes

There are no user contributed notes for this page.


Append Control

  • « UI\Controls\Group
  • UI\Controls\Group::__construct »
  • PHP Manual
  • UI\Controls\Group
  • Append Control

UI\Controls\Group::append

(No version information available, might only be in Git)

UI\Controls\Group::append — Append Control

Description

public UI\Controls\Group::append ( UI\Control $control )

Shall append a control to this Group

Liste de paramètres

control

The control to append

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Group

  • « UI\Controls\Group::append
  • UI\Controls\Group::getTitle »
  • PHP Manual
  • UI\Controls\Group
  • Construct a new Group

UI\Controls\Group::__construct

(UI 0.9.9)

UI\Controls\Group::__construct — Construct a new Group

Description

public UI\Controls\Group::__construct ( string $title )

Shall construct a new Group with the given title

Liste de paramètres

title

The text for the title label

User Contributed Notes

There are no user contributed notes for this page.


Get Title

  • « UI\Controls\Group::__construct
  • UI\Controls\Group::hasMargin »
  • PHP Manual
  • UI\Controls\Group
  • Get Title

UI\Controls\Group::getTitle

(UI 0.9.9)

UI\Controls\Group::getTitle — Get Title

Description

public UI\Controls\Group::getTitle ( ) : string

Shall return the current title for this Group

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The current title

User Contributed Notes

There are no user contributed notes for this page.


Margin Detection

  • « UI\Controls\Group::getTitle
  • UI\Controls\Group::setMargin »
  • PHP Manual
  • UI\Controls\Group
  • Margin Detection

UI\Controls\Group::hasMargin

(UI 0.9.9)

UI\Controls\Group::hasMargin — Margin Detection

Description

public UI\Controls\Group::hasMargin ( ) : bool

Shall detect if this Group has a margin

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Margin

  • « UI\Controls\Group::hasMargin
  • UI\Controls\Group::setTitle »
  • PHP Manual
  • UI\Controls\Group
  • Set Margin

UI\Controls\Group::setMargin

(UI 0.9.9)

UI\Controls\Group::setMargin — Set Margin

Description

public UI\Controls\Group::setMargin ( bool $margin )

Shall enable or disable margins for this Group

Liste de paramètres

margin

User Contributed Notes

There are no user contributed notes for this page.


Set Title

  • « UI\Controls\Group::setMargin
  • UI\Controls\Box »
  • PHP Manual
  • UI\Controls\Group
  • Set Title

UI\Controls\Group::setTitle

(UI 0.9.9)

UI\Controls\Group::setTitle — Set Title

Description

public UI\Controls\Group::setTitle ( string $title )

Shall set the title for this Group

Liste de paramètres

title

The text for the new title

User Contributed Notes

There are no user contributed notes for this page.


Control Box (Arrangement)

(UI 0.9.9)

Introduction

A Box allows the arrangement of other controls

Synopsis de la classe

UI\Controls\Box extends UI\Control {
/* Constants */
const int Vertical ;
const int Horizontal ;
/* Propriétés */
protected $controls ;
/* Constructor */
public __construct ( int $orientation = UI\Controls\Box::Horizontal )
/* Méthodes */
public append ( Control $control , bool $stretchy = false ) : int
public delete ( int $index ) : bool
public getOrientation ( ) : int
public isPadded ( ) : bool
public setPadded ( bool $padded )
/* Méthodes héritées */
public UI\Control::destroy ( )
public UI\Control::disable ( )
public UI\Control::enable ( )
public UI\Control::getParent ( ) : UI\Control
public UI\Control::getTopLevel ( ) : int
public UI\Control::hide ( )
public UI\Control::isEnabled ( ) : bool
public UI\Control::isVisible ( ) : bool
public UI\Control::setParent ( UI\Control $parent )
public UI\Control::show ( )
}

Propriétés

controls

Contains controls, should not be manipulated directly

Constantes pré-définies

UI\Controls\Box::Vertical

UI\Controls\Box::Horizontal

Sommaire

  • UI\Controls\Box::append — Append Control
  • UI\Controls\Box::__construct — Construct a new Box
  • UI\Controls\Box::delete — Delete Control
  • UI\Controls\Box::getOrientation — Get Orientation
  • UI\Controls\Box::isPadded — Padding Detection
  • UI\Controls\Box::setPadded — Set Padding

User Contributed Notes

There are no user contributed notes for this page.


Append Control

  • « UI\Controls\Box
  • UI\Controls\Box::__construct »
  • PHP Manual
  • UI\Controls\Box
  • Append Control

UI\Controls\Box::append

(UI 0.9.9)

UI\Controls\Box::append — Append Control

Description

public UI\Controls\Box::append ( Control $control , bool $stretchy = false ) : int

Shall append the given control to this Box

Liste de paramètres

control

The control to append

stretchy

Set true to stretch the control

Valeurs de retour

Shall return the index of the appended control, may be 0

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Box

  • « UI\Controls\Box::append
  • UI\Controls\Box::delete »
  • PHP Manual
  • UI\Controls\Box
  • Construct a new Box

UI\Controls\Box::__construct

(UI 0.9.9)

UI\Controls\Box::__construct — Construct a new Box

Description

public UI\Controls\Box::__construct ( int $orientation = UI\Controls\Box::Horizontal )

Shall construct a new box

Liste de paramètres

orientation

Box::Horizontal or Box::Vertical

User Contributed Notes

There are no user contributed notes for this page.


Delete Control

  • « UI\Controls\Box::__construct
  • UI\Controls\Box::getOrientation »
  • PHP Manual
  • UI\Controls\Box
  • Delete Control

UI\Controls\Box::delete

(UI 0.9.9)

UI\Controls\Box::delete — Delete Control

Description

public UI\Controls\Box::delete ( int $index ) : bool

Shall delete the control at the given index from this Box

Liste de paramètres

index

The index of the control to delete

Valeurs de retour

Indication of success

User Contributed Notes

There are no user contributed notes for this page.


Get Orientation

  • « UI\Controls\Box::delete
  • UI\Controls\Box::isPadded »
  • PHP Manual
  • UI\Controls\Box
  • Get Orientation

UI\Controls\Box::getOrientation

(UI 0.9.9)

UI\Controls\Box::getOrientation — Get Orientation

Description

public UI\Controls\Box::getOrientation ( ) : int

Shall retrieve the orientation of this Box

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Padding Detection

  • « UI\Controls\Box::getOrientation
  • UI\Controls\Box::setPadded »
  • PHP Manual
  • UI\Controls\Box
  • Padding Detection

UI\Controls\Box::isPadded

(UI 0.9.9)

UI\Controls\Box::isPadded — Padding Detection

Description

public UI\Controls\Box::isPadded ( ) : bool

Shall detect if padding is enabled on this Box

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Set Padding

  • « UI\Controls\Box::isPadded
  • UI\Draw\Pen »
  • PHP Manual
  • UI\Controls\Box
  • Set Padding

UI\Controls\Box::setPadded

(UI 0.9.9)

UI\Controls\Box::setPadded — Set Padding

Description

public UI\Controls\Box::setPadded ( bool $padded )

Shall enable or disable padding on this Box

Liste de paramètres

padded

User Contributed Notes

There are no user contributed notes for this page.


Draw Pen

(UI 0.9.9)

Introduction

The Pen is passed to the Area Draw event handler, it is used for clipping, filling, stroking, and writing to Draw Paths.

Synopsis de la classe

final UI\Draw\Pen {
/* Méthodes */
public clip ( UI\Draw\Path $path )
public fill ( UI\Draw\Path $path , UI\Draw\Brush $with )
public fill ( UI\Draw\Path $path , UI\Draw\Color $with )
public fill ( UI\Draw\Path $path , int $with )
public restore ( )
public save ( )
public stroke ( UI\Draw\Path $path , UI\Draw\Brush $with , UI\Draw\Stroke $stroke )
public stroke ( UI\Draw\Path $path , UI\Draw\Color $with , UI\Draw\Stroke $stroke )
public stroke ( UI\Draw\Path $path , int $with , UI\Draw\Stroke $stroke )
public transform ( UI\Draw\Matrix $matrix )
public write ( UI\Point $point , UI\Draw\Text\Layout $layout )
}

Sommaire

  • UI\Draw\Pen::clip — Clip a Path
  • UI\Draw\Pen::fill — Fill a Path
  • UI\Draw\Pen::restore — Restore
  • UI\Draw\Pen::save — Save
  • UI\Draw\Pen::stroke — Stroke a Path
  • UI\Draw\Pen::transform — Matrix Transform
  • UI\Draw\Pen::write — Draw Text at Point

User Contributed Notes

There are no user contributed notes for this page.


Clip a Path

  • « UI\Draw\Pen
  • UI\Draw\Pen::fill »
  • PHP Manual
  • UI\Draw\Pen
  • Clip a Path

UI\Draw\Pen::clip

(UI 0.9.9)

UI\Draw\Pen::clip — Clip a Path

Description

public UI\Draw\Pen::clip ( UI\Draw\Path $path )

Shall clip the given Path

Liste de paramètres

path

The path to clip

User Contributed Notes

There are no user contributed notes for this page.


Fill a Path

  • « UI\Draw\Pen::clip
  • UI\Draw\Pen::restore »
  • PHP Manual
  • UI\Draw\Pen
  • Fill a Path

UI\Draw\Pen::fill

(UI 0.9.9)

UI\Draw\Pen::fill — Fill a Path

Description

public UI\Draw\Pen::fill ( UI\Draw\Path $path , UI\Draw\Brush $with )
public UI\Draw\Pen::fill ( UI\Draw\Path $path , UI\Draw\Color $with )
public UI\Draw\Pen::fill ( UI\Draw\Path $path , int $with )

Shall fill the given path

Liste de paramètres

path

The path to fill

with

The color or brush to fill with

User Contributed Notes

There are no user contributed notes for this page.


Restore

  • « UI\Draw\Pen::fill
  • UI\Draw\Pen::save »
  • PHP Manual
  • UI\Draw\Pen
  • Restore

UI\Draw\Pen::restore

(UI 0.9.9)

UI\Draw\Pen::restore — Restore

Description

public UI\Draw\Pen::restore ( )

Shall restore a previously saved Pen

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Save

  • « UI\Draw\Pen::restore
  • UI\Draw\Pen::stroke »
  • PHP Manual
  • UI\Draw\Pen
  • Save

UI\Draw\Pen::save

(UI 0.9.9)

UI\Draw\Pen::save — Save

Description

public UI\Draw\Pen::save ( )

Shall save the Pen

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Stroke a Path

  • « UI\Draw\Pen::save
  • UI\Draw\Pen::transform »
  • PHP Manual
  • UI\Draw\Pen
  • Stroke a Path

UI\Draw\Pen::stroke

(UI 0.9.9)

UI\Draw\Pen::stroke — Stroke a Path

Description

public UI\Draw\Pen::stroke ( UI\Draw\Path $path , UI\Draw\Brush $with , UI\Draw\Stroke $stroke )
public UI\Draw\Pen::stroke ( UI\Draw\Path $path , UI\Draw\Color $with , UI\Draw\Stroke $stroke )
public UI\Draw\Pen::stroke ( UI\Draw\Path $path , int $with , UI\Draw\Stroke $stroke )

Shall stroke the given path

Liste de paramètres

path

The path to stroke

with

The color or brush to stroke with

stroke

The configuration of the stroke

User Contributed Notes

There are no user contributed notes for this page.


Matrix Transform

  • « UI\Draw\Pen::stroke
  • UI\Draw\Pen::write »
  • PHP Manual
  • UI\Draw\Pen
  • Matrix Transform

UI\Draw\Pen::transform

(UI 0.9.9)

UI\Draw\Pen::transform — Matrix Transform

Description

public UI\Draw\Pen::transform ( UI\Draw\Matrix $matrix )

Shall perform matrix transformation

Liste de paramètres

matrix

The matrix to use

User Contributed Notes

There are no user contributed notes for this page.


Draw Text at Point

  • « UI\Draw\Pen::transform
  • UI\Draw\Path »
  • PHP Manual
  • UI\Draw\Pen
  • Draw Text at Point

UI\Draw\Pen::write

(UI 0.9.9)

UI\Draw\Pen::write — Draw Text at Point

Description

public UI\Draw\Pen::write ( UI\Point $point , UI\Draw\Text\Layout $layout )

Shall draw the given text layout at the given point

Liste de paramètres

point

The point to perform the drawing

layout

The layout of the text to draw

User Contributed Notes

There are no user contributed notes for this page.


Draw Path

(UI 0.9.9)

Introduction

A Draw Path guides a Draw Pen, telling the Pen where to draw on an Area.

Synopsis de la classe

UI\Draw\Path {
/* Constants */
const int Winding ;
const int Alternate ;
/* Constructor */
public __construct ( int $mode = UI\Draw\Path::Winding )
/* Méthodes */
public addRectangle ( UI\Point $point , UI\Size $size )
public arcTo ( UI\Point $point , float $radius , float $angle , float $sweep , float $negative )
public bezierTo ( UI\Point $point , float $radius , float $angle , float $sweep , float $negative )
public closeFigure ( )
public end ( )
public lineTo ( UI\Point $point , float $radius , float $angle , float $sweep , float $negative )
public newFigure ( UI\Point $point )
public newFigureWithArc ( UI\Point $point , float $radius , float $angle , float $sweep , float $negative )
}

Constantes pré-définies

UI\Draw\Path::Winding

This is the default draw path mode

UI\Draw\Path::Alternate

This is the alternate draw path mode

Sommaire

  • UI\Draw\Path::addRectangle — Draw a Rectangle
  • UI\Draw\Path::arcTo — Draw an Arc
  • UI\Draw\Path::bezierTo — Draw Bezier Curve
  • UI\Draw\Path::closeFigure — Close Figure
  • UI\Draw\Path::__construct — Construct a new Path
  • UI\Draw\Path::end — Finalize Path
  • UI\Draw\Path::lineTo — Draw a Line
  • UI\Draw\Path::newFigure — Draw Figure
  • UI\Draw\Path::newFigureWithArc — Draw Figure with Arc

User Contributed Notes

There are no user contributed notes for this page.


Draw a Rectangle

  • « UI\Draw\Path
  • UI\Draw\Path::arcTo »
  • PHP Manual
  • UI\Draw\Path
  • Draw a Rectangle

UI\Draw\Path::addRectangle

(UI 0.9.9)

UI\Draw\Path::addRectangle — Draw a Rectangle

Description

public UI\Draw\Path::addRectangle ( UI\Point $point , UI\Size $size )

Shall map the path of a rectangle of the given size, at the given point

Liste de paramètres

point

The point to begin the shape

size

The size of the rectangle

User Contributed Notes

There are no user contributed notes for this page.


Draw an Arc

  • « UI\Draw\Path::addRectangle
  • UI\Draw\Path::bezierTo »
  • PHP Manual
  • UI\Draw\Path
  • Draw an Arc

UI\Draw\Path::arcTo

(UI 0.9.9)

UI\Draw\Path::arcTo — Draw an Arc

Description

public UI\Draw\Path::arcTo ( UI\Point $point , float $radius , float $angle , float $sweep , float $negative )

Shall map the path for an arc

Liste de paramètres

point

The point to begin mapping

radius

The radius of the arc

angle

The angle of the arc

sweep

The sweep of the arc

negative

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Draw Bezier Curve

  • « UI\Draw\Path::arcTo
  • UI\Draw\Path::closeFigure »
  • PHP Manual
  • UI\Draw\Path
  • Draw Bezier Curve

UI\Draw\Path::bezierTo

(UI 0.9.9)

UI\Draw\Path::bezierTo — Draw Bezier Curve

Description

public UI\Draw\Path::bezierTo ( UI\Point $point , float $radius , float $angle , float $sweep , float $negative )

Shall draw a bezier curve

Liste de paramètres

point

The point at which to begin mapping

radius

The radius of the curve

angle

The angle of the curve

sweep

The sweep of the curve

negative

User Contributed Notes

There are no user contributed notes for this page.


Close Figure

  • « UI\Draw\Path::bezierTo
  • UI\Draw\Path::__construct »
  • PHP Manual
  • UI\Draw\Path
  • Close Figure

UI\Draw\Path::closeFigure

(UI 0.9.9)

UI\Draw\Path::closeFigure — Close Figure

Description

public UI\Draw\Path::closeFigure ( )

Shall close the current figure

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Path

  • « UI\Draw\Path::closeFigure
  • UI\Draw\Path::end »
  • PHP Manual
  • UI\Draw\Path
  • Construct a new Path

UI\Draw\Path::__construct

(UI 0.9.9)

UI\Draw\Path::__construct — Construct a new Path

Description

public UI\Draw\Path::__construct ( int $mode = UI\Draw\Path::Winding )

Shall construct a new path in the given mode

Liste de paramètres

mode

Path::Winding or Path::Alternate

User Contributed Notes

There are no user contributed notes for this page.


Finalize Path

  • « UI\Draw\Path::__construct
  • UI\Draw\Path::lineTo »
  • PHP Manual
  • UI\Draw\Path
  • Finalize Path

UI\Draw\Path::end

(UI 0.9.9)

UI\Draw\Path::end — Finalize Path

Description

public UI\Draw\Path::end ( )

Shall finalize this Path

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Draw a Line

  • « UI\Draw\Path::end
  • UI\Draw\Path::newFigure »
  • PHP Manual
  • UI\Draw\Path
  • Draw a Line

UI\Draw\Path::lineTo

(UI 0.9.9)

UI\Draw\Path::lineTo — Draw a Line

Description

public UI\Draw\Path::lineTo ( UI\Point $point , float $radius , float $angle , float $sweep , float $negative )

Shall map the path for a line

Liste de paramètres

point

The point to begin mapping

radius

angle

sweep

negative

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Draw Figure

  • « UI\Draw\Path::lineTo
  • UI\Draw\Path::newFigureWithArc »
  • PHP Manual
  • UI\Draw\Path
  • Draw Figure

UI\Draw\Path::newFigure

(UI 0.9.9)

UI\Draw\Path::newFigure — Draw Figure

Description

public UI\Draw\Path::newFigure ( UI\Point $point )

Shall map a new figure at the given point

Liste de paramètres

point

The point to begin mapping

User Contributed Notes

There are no user contributed notes for this page.


Draw Figure with Arc

  • « UI\Draw\Path::newFigure
  • UI\Draw\Matrix »
  • PHP Manual
  • UI\Draw\Path
  • Draw Figure with Arc

UI\Draw\Path::newFigureWithArc

(UI 0.9.9)

UI\Draw\Path::newFigureWithArc — Draw Figure with Arc

Description

public UI\Draw\Path::newFigureWithArc ( UI\Point $point , float $radius , float $angle , float $sweep , float $negative )

Liste de paramètres

point

radius

angle

sweep

negative

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Draw Matrix

(UI 0.9.9)

Introduction

Synopsis de la classe

UI\Draw\Matrix {
/* Méthodes */
public invert ( )
public isInvertible ( ) : bool
public multiply ( UI\Draw\Matrix $matrix ) : UI\Draw\Matrix
public rotate ( UI\Point $point , float $amount )
public scale ( UI\Point $center , UI\Point $point )
public skew ( UI\Point $point , UI\Point $amount )
public translate ( UI\Point $point )
}

Sommaire

  • UI\Draw\Matrix::invert — Invert Matrix
  • UI\Draw\Matrix::isInvertible — Invertible Detection
  • UI\Draw\Matrix::multiply — Multiply Matrix
  • UI\Draw\Matrix::rotate — Rotate Matrix
  • UI\Draw\Matrix::scale — Scale Matrix
  • UI\Draw\Matrix::skew — Skew Matrix
  • UI\Draw\Matrix::translate — Translate Matrix

User Contributed Notes

There are no user contributed notes for this page.


Invert Matrix

  • « UI\Draw\Matrix
  • UI\Draw\Matrix::isInvertible »
  • PHP Manual
  • UI\Draw\Matrix
  • Invert Matrix

UI\Draw\Matrix::invert

(UI 0.9.9)

UI\Draw\Matrix::invert — Invert Matrix

Description

public UI\Draw\Matrix::invert ( )

Shall invert this matrix

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Invertible Detection

  • « UI\Draw\Matrix::invert
  • UI\Draw\Matrix::multiply »
  • PHP Manual
  • UI\Draw\Matrix
  • Invertible Detection

UI\Draw\Matrix::isInvertible

(UI 0.9.9)

UI\Draw\Matrix::isInvertible — Invertible Detection

Description

public UI\Draw\Matrix::isInvertible ( ) : bool

Shall detect if this Matrix may be inverted

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Multiply Matrix

  • « UI\Draw\Matrix::isInvertible
  • UI\Draw\Matrix::rotate »
  • PHP Manual
  • UI\Draw\Matrix
  • Multiply Matrix

UI\Draw\Matrix::multiply

(UI 0.9.9)

UI\Draw\Matrix::multiply — Multiply Matrix

Description

public UI\Draw\Matrix::multiply ( UI\Draw\Matrix $matrix ) : UI\Draw\Matrix

Shall multiply this matrix with the given matrix

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The new Matrix

User Contributed Notes

There are no user contributed notes for this page.


Rotate Matrix

  • « UI\Draw\Matrix::multiply
  • UI\Draw\Matrix::scale »
  • PHP Manual
  • UI\Draw\Matrix
  • Rotate Matrix

UI\Draw\Matrix::rotate

(UI 0.9.9)

UI\Draw\Matrix::rotate — Rotate Matrix

Description

public UI\Draw\Matrix::rotate ( UI\Point $point , float $amount )

Shall rotate this Matrix

Liste de paramètres

point

amount

User Contributed Notes

There are no user contributed notes for this page.


Scale Matrix

  • « UI\Draw\Matrix::rotate
  • UI\Draw\Matrix::skew »
  • PHP Manual
  • UI\Draw\Matrix
  • Scale Matrix

UI\Draw\Matrix::scale

(UI 0.9.9)

UI\Draw\Matrix::scale — Scale Matrix

Description

public UI\Draw\Matrix::scale ( UI\Point $center , UI\Point $point )

Shall scale this Matrix

Liste de paramètres

center

point

User Contributed Notes

There are no user contributed notes for this page.


Skew Matrix

  • « UI\Draw\Matrix::scale
  • UI\Draw\Matrix::translate »
  • PHP Manual
  • UI\Draw\Matrix
  • Skew Matrix

UI\Draw\Matrix::skew

(UI 0.9.9)

UI\Draw\Matrix::skew — Skew Matrix

Description

public UI\Draw\Matrix::skew ( UI\Point $point , UI\Point $amount )

Shall skew this Matrix

Liste de paramètres

point

amount

User Contributed Notes

There are no user contributed notes for this page.


Translate Matrix

  • « UI\Draw\Matrix::skew
  • UI\Draw\Color »
  • PHP Manual
  • UI\Draw\Matrix
  • Translate Matrix

UI\Draw\Matrix::translate

(UI 0.9.9)

UI\Draw\Matrix::translate — Translate Matrix

Description

public UI\Draw\Matrix::translate ( UI\Point $point )

Shall translate this Matrix

Liste de paramètres

point

User Contributed Notes

There are no user contributed notes for this page.


Color Representation

(UI 0.9.9)

Introduction

Represents RGBA colours, individual channels are accessible via public properties.

Synopsis de la classe

UI\Draw\Color {
/* Constants */
const int Red ;
const int Green ;
const int Blue ;
const int Alpha ;
/* Propriétés */
public $r ;
public $g ;
public $b ;
public $a ;
/* Constructor */
public __construct ( UI\Draw\Color $color = ? )
public __construct ( int $color = ? )
/* Méthodes */
public getChannel ( int $channel ) : float
public setChannel ( int $channel , float $value ) : void
}

Propriétés

r

Provides access to the red channel

g

Provides access to the green channel

b

Provides access to the blue channel

a

Provides access to the alpha channel

Constantes pré-définies

UI\Draw\Color::Red

Identifies the red channel

UI\Draw\Color::Green

Identifies the green channel

UI\Draw\Color::Blue

Identifies the blue channel

UI\Draw\Color::Alpha

Identifies the alpha channel

Sommaire

  • UI\Draw\Color::__construct — Construct new Color
  • UI\Draw\Color::getChannel — Color Manipulation
  • UI\Draw\Color::setChannel — Color Manipulation

User Contributed Notes

There are no user contributed notes for this page.


Construct new Color

  • « UI\Draw\Color
  • UI\Draw\Color::getChannel »
  • PHP Manual
  • UI\Draw\Color
  • Construct new Color

UI\Draw\Color::__construct

(UI 0.9.9)

UI\Draw\Color::__construct — Construct new Color

Description

public UI\Draw\Color::__construct ( UI\Draw\Color $color = ? )
public UI\Draw\Color::__construct ( int $color = ? )

Shall construct a new color

Liste de paramètres

color

May be UI\Draw\Color or RRGGBBAA

User Contributed Notes

There are no user contributed notes for this page.


Color Manipulation

  • « UI\Draw\Color::__construct
  • UI\Draw\Color::setChannel »
  • PHP Manual
  • UI\Draw\Color
  • Color Manipulation

UI\Draw\Color::getChannel

(UI 0.9.9)

UI\Draw\Color::getChannel — Color Manipulation

Description

public UI\Draw\Color::getChannel ( int $channel ) : float

Shall retrieve the value for a channel

Liste de paramètres

channel

Constant channel identity

Valeurs de retour

The current value of the requested channel

User Contributed Notes

There are no user contributed notes for this page.


Color Manipulation

  • « UI\Draw\Color::getChannel
  • UI\Draw\Stroke »
  • PHP Manual
  • UI\Draw\Color
  • Color Manipulation

UI\Draw\Color::setChannel

(UI 0.9.9)

UI\Draw\Color::setChannel — Color Manipulation

Description

public UI\Draw\Color::setChannel ( int $channel , float $value ) : void

Shall set the selected channel to the given value

Liste de paramètres

channel

Constant channel identity

value

The new value for the selected channel

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Draw Stroke

(UI 0.9.9)

Introduction

Holds the configuration for the Pen to perform a stroke

Synopsis de la classe

UI\Draw\Stroke {
/* Constructor */
public __construct ( int $cap = UI\Draw\Line\Cap::Flat , int $join = UI\Draw\Line\Join::Miter , float $thickness = 1 , float $miterLimit = 10 )
/* Méthodes */
public getCap ( ) : int
public getJoin ( ) : int
public getMiterLimit ( ) : float
public getThickness ( ) : float
public setCap ( int $cap )
public setJoin ( int $join )
public setMiterLimit ( float $limit )
public setThickness ( float $thickness )
}

Sommaire

  • UI\Draw\Stroke::__construct — Construct a new Stroke
  • UI\Draw\Stroke::getCap — Get Line Cap
  • UI\Draw\Stroke::getJoin — Get Line Join
  • UI\Draw\Stroke::getMiterLimit — Get Miter Limit
  • UI\Draw\Stroke::getThickness — Get Thickness
  • UI\Draw\Stroke::setCap — Set Line Cap
  • UI\Draw\Stroke::setJoin — Set Line Join
  • UI\Draw\Stroke::setMiterLimit — Set Miter Limit
  • UI\Draw\Stroke::setThickness — Set Thickness

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Stroke

  • « UI\Draw\Stroke
  • UI\Draw\Stroke::getCap »
  • PHP Manual
  • UI\Draw\Stroke
  • Construct a new Stroke

UI\Draw\Stroke::__construct

(UI 0.9.9)

UI\Draw\Stroke::__construct — Construct a new Stroke

Description

public UI\Draw\Stroke::__construct ( int $cap = UI\Draw\Line\Cap::Flat , int $join = UI\Draw\Line\Join::Miter , float $thickness = 1 , float $miterLimit = 10 )

Shall construct a new Stroke

Liste de paramètres

cap

UI\Draw\Line\Cap::Flat, UI\Draw\Line\Cap::Round, or UI\Draw\Line\Cap::Square

join

UI\Draw\Line\Join::Miter, UI\Draw\Line\Join::Round, or UI\Draw\Line\Join::Bevel

thickness

The thickness of the stroke

miterLimit

Miter limit (default is sensible for all supported platforms)

User Contributed Notes

There are no user contributed notes for this page.


Get Line Cap

  • « UI\Draw\Stroke::__construct
  • UI\Draw\Stroke::getJoin »
  • PHP Manual
  • UI\Draw\Stroke
  • Get Line Cap

UI\Draw\Stroke::getCap

(UI 0.9.9)

UI\Draw\Stroke::getCap — Get Line Cap

Description

public UI\Draw\Stroke::getCap ( ) : int

Shall retrieve the line cap setting of this Stroke

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

UI\Draw\Line\Cap::Flat, UI\Draw\Line\Cap::Round, or UI\Draw\Line\Cap::Square

User Contributed Notes

There are no user contributed notes for this page.


Get Line Join

  • « UI\Draw\Stroke::getCap
  • UI\Draw\Stroke::getMiterLimit »
  • PHP Manual
  • UI\Draw\Stroke
  • Get Line Join

UI\Draw\Stroke::getJoin

(UI 0.9.9)

UI\Draw\Stroke::getJoin — Get Line Join

Description

public UI\Draw\Stroke::getJoin ( ) : int

Shall retrieve the line join setting of this Stroke

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

UI\Draw\Line\Join::Miter, UI\Draw\Line\Join::Round, or UI\Draw\Line\Join::Bevel

User Contributed Notes

There are no user contributed notes for this page.


Get Miter Limit

  • « UI\Draw\Stroke::getJoin
  • UI\Draw\Stroke::getThickness »
  • PHP Manual
  • UI\Draw\Stroke
  • Get Miter Limit

UI\Draw\Stroke::getMiterLimit

(UI 0.9.9)

UI\Draw\Stroke::getMiterLimit — Get Miter Limit

Description

public UI\Draw\Stroke::getMiterLimit ( ) : float

Shall retrieve the miter limit of this Stroke

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The current miter limit

User Contributed Notes

There are no user contributed notes for this page.


Get Thickness

  • « UI\Draw\Stroke::getMiterLimit
  • UI\Draw\Stroke::setCap »
  • PHP Manual
  • UI\Draw\Stroke
  • Get Thickness

UI\Draw\Stroke::getThickness

(UI 0.9.9)

UI\Draw\Stroke::getThickness — Get Thickness

Description

public UI\Draw\Stroke::getThickness ( ) : float

Shall retrieve the thickness of this Stroke

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The current thickness

User Contributed Notes

There are no user contributed notes for this page.


Set Line Cap

  • « UI\Draw\Stroke::getThickness
  • UI\Draw\Stroke::setJoin »
  • PHP Manual
  • UI\Draw\Stroke
  • Set Line Cap

UI\Draw\Stroke::setCap

(UI 0.9.9)

UI\Draw\Stroke::setCap — Set Line Cap

Description

public UI\Draw\Stroke::setCap ( int $cap )

Shall set the line cap setting for this Stroke

Liste de paramètres

cap

UI\Draw\Line\Cap::Flat, UI\Draw\Line\Cap::Round, or UI\Draw\Line\Cap::Square

User Contributed Notes

There are no user contributed notes for this page.


Set Line Join

  • « UI\Draw\Stroke::setCap
  • UI\Draw\Stroke::setMiterLimit »
  • PHP Manual
  • UI\Draw\Stroke
  • Set Line Join

UI\Draw\Stroke::setJoin

(UI 0.9.9)

UI\Draw\Stroke::setJoin — Set Line Join

Description

public UI\Draw\Stroke::setJoin ( int $join )

Shall set the line join setting for this Stroke

Liste de paramètres

join

UI\Draw\Line\Join::Miter, UI\Draw\Line\Join::Round, or UI\Draw\Line\Join::Bevel

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Set Miter Limit

  • « UI\Draw\Stroke::setJoin
  • UI\Draw\Stroke::setThickness »
  • PHP Manual
  • UI\Draw\Stroke
  • Set Miter Limit

UI\Draw\Stroke::setMiterLimit

(UI 0.9.9)

UI\Draw\Stroke::setMiterLimit — Set Miter Limit

Description

public UI\Draw\Stroke::setMiterLimit ( float $limit )

Set the miter limit for this Stroke

Liste de paramètres

limit

The new limit

User Contributed Notes

There are no user contributed notes for this page.


Set Thickness

  • « UI\Draw\Stroke::setMiterLimit
  • UI\Draw\Brush »
  • PHP Manual
  • UI\Draw\Stroke
  • Set Thickness

UI\Draw\Stroke::setThickness

(UI 0.9.9)

UI\Draw\Stroke::setThickness — Set Thickness

Description

public UI\Draw\Stroke::setThickness ( float $thickness )

Shall set the thickness for this Stroke

Liste de paramètres

thickness

The new thickness

User Contributed Notes

There are no user contributed notes for this page.


Brushes

(UI 0.9.9)

Introduction

Represents a solid color brush

Synopsis de la classe

UI\Draw\Brush {
/* Constructor */
public __construct ( UI\Draw\Color $color )
public __construct ( int $color )
/* Méthodes */
public getColor ( ) : UI\Draw\Color
public setColor ( UI\Draw\Color $color ) : void
public setColor ( int $color ) : void
}

Sommaire

  • UI\Draw\Brush::__construct — Construct a new Brush
  • UI\Draw\Brush::getColor — Get Color
  • UI\Draw\Brush::setColor — Set Color

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Brush

  • « UI\Draw\Brush
  • UI\Draw\Brush::getColor »
  • PHP Manual
  • UI\Draw\Brush
  • Construct a new Brush

UI\Draw\Brush::__construct

(UI 0.9.9)

UI\Draw\Brush::__construct — Construct a new Brush

Description

public UI\Draw\Brush::__construct ( UI\Draw\Color $color )
public UI\Draw\Brush::__construct ( int $color )

Shall construct a solid brush using the given color

Liste de paramètres

color

Can be a UI\Draw\Color or RRGGBBAA

User Contributed Notes

There are no user contributed notes for this page.


Get Color

  • « UI\Draw\Brush::__construct
  • UI\Draw\Brush::setColor »
  • PHP Manual
  • UI\Draw\Brush
  • Get Color

UI\Draw\Brush::getColor

(UI 0.9.9)

UI\Draw\Brush::getColor — Get Color

Description

public UI\Draw\Brush::getColor ( ) : UI\Draw\Color

Shall return a UI\Draw\Color for this brush

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

The current color of the brush

User Contributed Notes

There are no user contributed notes for this page.


Set Color

  • « UI\Draw\Brush::getColor
  • UI\Draw\Brush\Gradient »
  • PHP Manual
  • UI\Draw\Brush
  • Set Color

UI\Draw\Brush::setColor

(UI 0.9.9)

UI\Draw\Brush::setColor — Set Color

Description

public UI\Draw\Brush::setColor ( UI\Draw\Color $color ) : void
public UI\Draw\Brush::setColor ( int $color ) : void

Shall set the color of this brush to the color provided

Liste de paramètres

color

Can be a UI\Draw\Color or RRGGBBAA

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Gradient Brushes

(UI 2.0.0)

Introduction

Abstract for gradient brushes

Synopsis de la classe

abstract UI\Draw\Brush\Gradient extends UI\Draw\Brush {
/* Méthodes */
public addStop ( float $position , UI\Draw\Color $color ) : int
public addStop ( float $position , int $color ) : int
public delStop ( int $index ) : int
public setStop ( int $index , float $position , UI\Draw\Color $color ) : bool
public setStop ( int $index , float $position , int $color ) : bool
/* Méthodes héritées */
public UI\Draw\Brush::getColor ( ) : UI\Draw\Color
public UI\Draw\Brush::setColor ( UI\Draw\Color $color ) : void
public UI\Draw\Brush::setColor ( int $color ) : void
}

Sommaire

  • UI\Draw\Brush\Gradient::addStop — Stop Manipulation
  • UI\Draw\Brush\Gradient::delStop — Stop Manipulation
  • UI\Draw\Brush\Gradient::setStop — Stop Manipulation

User Contributed Notes

There are no user contributed notes for this page.


Stop Manipulation

  • « UI\Draw\Brush\Gradient
  • UI\Draw\Brush\Gradient::delStop »
  • PHP Manual
  • UI\Draw\Brush\Gradient
  • Stop Manipulation

UI\Draw\Brush\Gradient::addStop

(UI 2.0.0)

UI\Draw\Brush\Gradient::addStop — Stop Manipulation

Description

public UI\Draw\Brush\Gradient::addStop ( float $position , UI\Draw\Color $color ) : int
public UI\Draw\Brush\Gradient::addStop ( float $position , int $color ) : int

Shall at a stop of the given color at the given position

Liste de paramètres

position

The position for the new stop

color

The color for the new stop, may be UI\Draw\Color or RRGGBBAA

Valeurs de retour

Total number of stops

User Contributed Notes

There are no user contributed notes for this page.


Stop Manipulation

  • « UI\Draw\Brush\Gradient::addStop
  • UI\Draw\Brush\Gradient::setStop »
  • PHP Manual
  • UI\Draw\Brush\Gradient
  • Stop Manipulation

UI\Draw\Brush\Gradient::delStop

(UI 2.0.0)

UI\Draw\Brush\Gradient::delStop — Stop Manipulation

Description

public UI\Draw\Brush\Gradient::delStop ( int $index ) : int

Avertissement

Cette fonction est actuellement non documentée ; seule la liste des arguments est disponible.

Liste de paramètres

index

Valeurs de retour

Total number of stops

User Contributed Notes

There are no user contributed notes for this page.


Stop Manipulation

  • « UI\Draw\Brush\Gradient::delStop
  • UI\Draw\Brush\LinearGradient »
  • PHP Manual
  • UI\Draw\Brush\Gradient
  • Stop Manipulation

UI\Draw\Brush\Gradient::setStop

(UI 2.0.0)

UI\Draw\Brush\Gradient::setStop — Stop Manipulation

Description

public UI\Draw\Brush\Gradient::setStop ( int $index , float $position , UI\Draw\Color $color ) : bool
public UI\Draw\Brush\Gradient::setStop ( int $index , float $position , int $color ) : bool

Liste de paramètres

index

The index of the stop to set

position

The position for the stop

color

The color for the stop, may be UI\Draw\Color or RRGGBBAA

Valeurs de retour

Indication of success

User Contributed Notes

There are no user contributed notes for this page.


Linear Gradient

(UI 2.0.0)

Introduction

Synopsis de la classe

UI\Draw\Brush\LinearGradient extends UI\Draw\Brush\Gradient {
/* Constructor */
public __construct ( UI\Point $start , UI\Point $end )
/* Méthodes héritées */
public UI\Draw\Brush\Gradient::addStop ( float $position , UI\Draw\Color $color ) : int
public UI\Draw\Brush\Gradient::addStop ( float $position , int $color ) : int
public UI\Draw\Brush\Gradient::delStop ( int $index ) : int
public UI\Draw\Brush\Gradient::setStop ( int $index , float $position , UI\Draw\Color $color ) : bool
public UI\Draw\Brush\Gradient::setStop ( int $index , float $position , int $color ) : bool
}

Sommaire

  • UI\Draw\Brush\LinearGradient::__construct — Construct a Linear Gradient

User Contributed Notes

There are no user contributed notes for this page.


Construct a Linear Gradient

  • « UI\Draw\Brush\LinearGradient
  • UI\Draw\Brush\RadialGradient »
  • PHP Manual
  • UI\Draw\Brush\LinearGradient
  • Construct a Linear Gradient

UI\Draw\Brush\LinearGradient::__construct

(UI 2.0.0)

UI\Draw\Brush\LinearGradient::__construct — Construct a Linear Gradient

Description

public UI\Draw\Brush\LinearGradient::__construct ( UI\Point $start , UI\Point $end )

Shall construct a new linear gradient

Liste de paramètres

start

end

User Contributed Notes

There are no user contributed notes for this page.


Radial Gradient

(UI 2.0.0)

Introduction

Synopsis de la classe

UI\Draw\Brush\RadialGradient extends UI\Draw\Brush\Gradient {
/* Constructor */
public __construct ( UI\Point $start , UI\Point $outer , float $radius )
/* Méthodes héritées */
public UI\Draw\Brush\Gradient::addStop ( float $position , UI\Draw\Color $color ) : int
public UI\Draw\Brush\Gradient::addStop ( float $position , int $color ) : int
public UI\Draw\Brush\Gradient::delStop ( int $index ) : int
public UI\Draw\Brush\Gradient::setStop ( int $index , float $position , UI\Draw\Color $color ) : bool
public UI\Draw\Brush\Gradient::setStop ( int $index , float $position , int $color ) : bool
}

Sommaire

  • UI\Draw\Brush\RadialGradient::__construct — Construct a new Radial Gradient

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Radial Gradient

  • « UI\Draw\Brush\RadialGradient
  • UI\Draw\Text\Layout »
  • PHP Manual
  • UI\Draw\Brush\RadialGradient
  • Construct a new Radial Gradient

UI\Draw\Brush\RadialGradient::__construct

(UI 2.0.0)

UI\Draw\Brush\RadialGradient::__construct — Construct a new Radial Gradient

Description

public UI\Draw\Brush\RadialGradient::__construct ( UI\Point $start , UI\Point $outer , float $radius )

Shall construct a new radial gradient

Liste de paramètres

start

outer

radius

User Contributed Notes

There are no user contributed notes for this page.


Represents Text Layout

(UI 0.9.9)

Introduction

A Text Layout represents the layout of text which will be drawn by the Pen

Synopsis de la classe

UI\Draw\Text\Layout {
/* Constructor */
public __construct ( string $text , UI\Draw\Text\Font $font , float $width )
/* Méthodes */
public setColor ( UI\Draw\Color $color , int $start = 0 , int $end = ? )
public setColor ( int $color , int $start = 0 , int $end = ? )
public setWidth ( float $width )
}

Sommaire

  • UI\Draw\Text\Layout::__construct — Construct a new Text Layout
  • UI\Draw\Text\Layout::setColor — Set Color
  • UI\Draw\Text\Layout::setWidth — Set Width

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Text Layout

  • « UI\Draw\Text\Layout
  • UI\Draw\Text\Layout::setColor »
  • PHP Manual
  • UI\Draw\Text\Layout
  • Construct a new Text Layout

UI\Draw\Text\Layout::__construct

(UI 0.9.9)

UI\Draw\Text\Layout::__construct — Construct a new Text Layout

Description

public UI\Draw\Text\Layout::__construct ( string $text , UI\Draw\Text\Font $font , float $width )

Shall construct a new Text Layout

Liste de paramètres

text

The text for the layout

font

The font to use for writing

width

The width of the layout

User Contributed Notes

There are no user contributed notes for this page.


Set Color

  • « UI\Draw\Text\Layout::__construct
  • UI\Draw\Text\Layout::setWidth »
  • PHP Manual
  • UI\Draw\Text\Layout
  • Set Color

UI\Draw\Text\Layout::setColor

(UI 0.9.9)

UI\Draw\Text\Layout::setColor — Set Color

Description

public UI\Draw\Text\Layout::setColor ( UI\Draw\Color $color , int $start = 0 , int $end = ? )
public UI\Draw\Text\Layout::setColor ( int $color , int $start = 0 , int $end = ? )

Shall set the Color for all of, or a range of the text in the Layout

Liste de paramètres

color

The color to use

start

The starting character

end

The ending character, by default the end of the string

User Contributed Notes

There are no user contributed notes for this page.


Set Width

  • « UI\Draw\Text\Layout::setColor
  • UI\Draw\Text\Font »
  • PHP Manual
  • UI\Draw\Text\Layout
  • Set Width

UI\Draw\Text\Layout::setWidth

(UI 0.9.9)

UI\Draw\Text\Layout::setWidth — Set Width

Description

public UI\Draw\Text\Layout::setWidth ( float $width )

Shall set the width of this Text Layout

Liste de paramètres

width

The new width

User Contributed Notes

There are no user contributed notes for this page.


Represents a Font

(UI 0.9.9)

Introduction

Loads a described font

Synopsis de la classe

UI\Draw\Text\Font {
/* Constructor */
public __construct ( UI\Draw\Text\Font\Descriptor $descriptor )
/* Méthodes */
public getAscent ( ) : float
public getDescent ( ) : float
public getLeading ( ) : float
public getUnderlinePosition ( ) : float
public getUnderlineThickness ( ) : float
}

Sommaire

  • UI\Draw\Text\Font::__construct — Construct a new Font
  • UI\Draw\Text\Font::getAscent — Font Metrics
  • UI\Draw\Text\Font::getDescent — Font Metrics
  • UI\Draw\Text\Font::getLeading — Font Metrics
  • UI\Draw\Text\Font::getUnderlinePosition — Font Metrics
  • UI\Draw\Text\Font::getUnderlineThickness — Font Metrics

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Font

  • « UI\Draw\Text\Font
  • UI\Draw\Text\Font::getAscent »
  • PHP Manual
  • UI\Draw\Text\Font
  • Construct a new Font

UI\Draw\Text\Font::__construct

(UI 0.9.9)

UI\Draw\Text\Font::__construct — Construct a new Font

Description

public UI\Draw\Text\Font::__construct ( UI\Draw\Text\Font\Descriptor $descriptor )

Shall construct a new Font using the given descriptor

Liste de paramètres

descriptor

The descriptor for the Font

User Contributed Notes

There are no user contributed notes for this page.


Font Metrics

  • « UI\Draw\Text\Font::__construct
  • UI\Draw\Text\Font::getDescent »
  • PHP Manual
  • UI\Draw\Text\Font
  • Font Metrics

UI\Draw\Text\Font::getAscent

(UI 1.0.3)

UI\Draw\Text\Font::getAscent — Font Metrics

Description

public UI\Draw\Text\Font::getAscent ( ) : float

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Font Metrics

  • « UI\Draw\Text\Font::getAscent
  • UI\Draw\Text\Font::getLeading »
  • PHP Manual
  • UI\Draw\Text\Font
  • Font Metrics

UI\Draw\Text\Font::getDescent

(UI 1.0.3)

UI\Draw\Text\Font::getDescent — Font Metrics

Description

public UI\Draw\Text\Font::getDescent ( ) : float

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Font Metrics

  • « UI\Draw\Text\Font::getDescent
  • UI\Draw\Text\Font::getUnderlinePosition »
  • PHP Manual
  • UI\Draw\Text\Font
  • Font Metrics

UI\Draw\Text\Font::getLeading

(UI 1.0.3)

UI\Draw\Text\Font::getLeading — Font Metrics

Description

public UI\Draw\Text\Font::getLeading ( ) : float

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Font Metrics

  • « UI\Draw\Text\Font::getLeading
  • UI\Draw\Text\Font::getUnderlineThickness »
  • PHP Manual
  • UI\Draw\Text\Font
  • Font Metrics

UI\Draw\Text\Font::getUnderlinePosition

(UI 1.0.3)

UI\Draw\Text\Font::getUnderlinePosition — Font Metrics

Description

public UI\Draw\Text\Font::getUnderlinePosition ( ) : float

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Font Metrics

  • « UI\Draw\Text\Font::getUnderlinePosition
  • UI\Draw\Text\Font\Descriptor »
  • PHP Manual
  • UI\Draw\Text\Font
  • Font Metrics

UI\Draw\Text\Font::getUnderlineThickness

(UI 1.0.3)

UI\Draw\Text\Font::getUnderlineThickness — Font Metrics

Description

public UI\Draw\Text\Font::getUnderlineThickness ( ) : float

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Font Descriptor

(UI 0.9.9)

Introduction

Describes a font

Synopsis de la classe

UI\Draw\Text\Font\Descriptor {
/* Constructor */
public __construct ( string $family , float $size , int $weight = UI\Draw\Text\Font\Weight::Normal , int $italic = UI\Draw\Text\Font\Italic::Normal , int $stretch = UI\Draw\Text\Font\Stretch::Normal )
/* Méthodes */
public getFamily ( ) : string
public getItalic ( ) : int
public getSize ( ) : float
public getStretch ( ) : int
public getWeight ( ) : int
}

Sommaire

  • UI\Draw\Text\Font\Descriptor::__construct — Construct a new Font Descriptor
  • UI\Draw\Text\Font\Descriptor::getFamily — Get Font Family
  • UI\Draw\Text\Font\Descriptor::getItalic — Style Detection
  • UI\Draw\Text\Font\Descriptor::getSize — Size Detection
  • UI\Draw\Text\Font\Descriptor::getStretch — Style Detection
  • UI\Draw\Text\Font\Descriptor::getWeight — Weight Detection

User Contributed Notes

There are no user contributed notes for this page.


Construct a new Font Descriptor

  • « UI\Draw\Text\Font\Descriptor
  • UI\Draw\Text\Font\Descriptor::getFamily »
  • PHP Manual
  • UI\Draw\Text\Font\Descriptor
  • Construct a new Font Descriptor

UI\Draw\Text\Font\Descriptor::__construct

(UI 0.9.9)

UI\Draw\Text\Font\Descriptor::__construct — Construct a new Font Descriptor

Description

public UI\Draw\Text\Font\Descriptor::__construct ( string $family , float $size , int $weight = UI\Draw\Text\Font\Weight::Normal , int $italic = UI\Draw\Text\Font\Italic::Normal , int $stretch = UI\Draw\Text\Font\Stretch::Normal )

Shall construct a new Font Descriptor

Liste de paramètres

family

The name of a valid family of fonts

size

The preferred size

weight

UI\Draw\Text\Font\Weight constant

italic

UI\Draw\Text\Font\Italic constant

stretch

UI\Draw\Text\Font\Stretch constant

User Contributed Notes

There are no user contributed notes for this page.


Get Font Family

  • « UI\Draw\Text\Font\Descriptor::__construct
  • UI\Draw\Text\Font\Descriptor::getItalic »
  • PHP Manual
  • UI\Draw\Text\Font\Descriptor
  • Get Font Family

UI\Draw\Text\Font\Descriptor::getFamily

(UI 1.0.3)

UI\Draw\Text\Font\Descriptor::getFamily — Get Font Family

Description

public UI\Draw\Text\Font\Descriptor::getFamily ( ) : string

Shall return the requested font family

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Style Detection

  • « UI\Draw\Text\Font\Descriptor::getFamily
  • UI\Draw\Text\Font\Descriptor::getSize »
  • PHP Manual
  • UI\Draw\Text\Font\Descriptor
  • Style Detection

UI\Draw\Text\Font\Descriptor::getItalic

(UI 1.0.3)

UI\Draw\Text\Font\Descriptor::getItalic — Style Detection

Description

public UI\Draw\Text\Font\Descriptor::getItalic ( ) : int

Shall return constant setting

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Size Detection

  • « UI\Draw\Text\Font\Descriptor::getItalic
  • UI\Draw\Text\Font\Descriptor::getStretch »
  • PHP Manual
  • UI\Draw\Text\Font\Descriptor
  • Size Detection

UI\Draw\Text\Font\Descriptor::getSize

(UI 1.0.3)

UI\Draw\Text\Font\Descriptor::getSize — Size Detection

Description

public UI\Draw\Text\Font\Descriptor::getSize ( ) : float

Shall return the requested size

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Style Detection

  • « UI\Draw\Text\Font\Descriptor::getSize
  • UI\Draw\Text\Font\Descriptor::getWeight »
  • PHP Manual
  • UI\Draw\Text\Font\Descriptor
  • Style Detection

UI\Draw\Text\Font\Descriptor::getStretch

(UI 1.0.3)

UI\Draw\Text\Font\Descriptor::getStretch — Style Detection

Description

public UI\Draw\Text\Font\Descriptor::getStretch ( ) : int

Shall return requested stretch

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Weight Detection

  • « UI\Draw\Text\Font\Descriptor::getStretch
  • UI Fonctions »
  • PHP Manual
  • UI\Draw\Text\Font\Descriptor
  • Weight Detection

UI\Draw\Text\Font\Descriptor::getWeight

(UI 1.0.3)

UI\Draw\Text\Font\Descriptor::getWeight — Weight Detection

Description

public UI\Draw\Text\Font\Descriptor::getWeight ( ) : int

Shall return requested weight

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


UI Fonctions

Sommaire

  • UI\Draw\Text\Font\fontFamilies — Récupére les familles de polices
  • UI\quit — Quitte la boucle UI
  • UI\run — Entre dans la boucle UI

User Contributed Notes

There are no user contributed notes for this page.


Récupére les familles de polices

  • « UI Fonctions
  • UI\quit »
  • PHP Manual
  • UI Fonctions
  • Récupére les familles de polices

UI\Draw\Text\Font\fontFamilies

(UI 0.9.9)

UI\Draw\Text\Font\fontFamilies — Récupére les familles de polices

Description

UI\Draw\Text\Font\fontFamilies ( ) : array

Retourne un tableau des familles de polices valide pour le système actuel

Liste de paramètres

Cette fonction ne contient aucun paramètre.

User Contributed Notes

There are no user contributed notes for this page.


Quitte la boucle UI

  • « UI\Draw\Text\Font\fontFamilies
  • UI\run »
  • PHP Manual
  • UI Fonctions
  • Quitte la boucle UI

UI\quit

(UI 2.0.0)

UI\quit — Quitte la boucle UI

Description

UI\quit ( ) : void

Doit faire arrêter la boucle principale

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Entre dans la boucle UI

  • « UI\quit
  • UI\Draw\Text\Font\Weight »
  • PHP Manual
  • UI Fonctions
  • Entre dans la boucle UI

UI\run

(UI 2.0.0)

UI\run — Entre dans la boucle UI

Description

UI\run ( int $flags = ? ) : void

Doit pousser PHP à entrer dans la boucle principale. Par défaut, le contrôle ne sera pas retourné à la fonction appelante.

Liste de paramètres

flags

Mettre UI\Loop pour retourner le contrôle et UI\Wait pour retourner le contrôle après l'attente.

Valeurs de retour

User Contributed Notes

There are no user contributed notes for this page.


Font Weight Settings

(UI 0.9.9)

Introduction

Synopsis de la classe

final UI\Draw\Text\Font\Weight {
/* Constants */
const int Thin ;
const int UltraLight ;
const int Light ;
const int Book ;
const int Normal ;
const int Medium ;
const int SemiBold ;
const int Bold ;
const int UltraBold ;
const int Heavy ;
const int UltraHeavy ;
}

User Contributed Notes

There are no user contributed notes for this page.


Italic Font Settings

(UI 0.9.9)

Introduction

Synopsis de la classe

final UI\Draw\Text\Font\Italic {
/* Constants */
const int Normal = 0 ;
const int Oblique = 1 ;
const int Italic = 2 ;
}

User Contributed Notes

There are no user contributed notes for this page.


Font Stretch Settings

(UI 0.9.9)

Introduction

Synopsis de la classe

final UI\Draw\Text\Font\Stretch {
/* Constants */
const int UltraCondensed = 0 ;
const int ExtraCondensed = 1 ;
const int Condensed = 2 ;
const int SemiCondensed = 3 ;
const int Normal = 4 ;
const int SemiExpanded = 5 ;
const int Expanded = 6 ;
const int ExtraExpanded = 7 ;
const int UltraExpanded = 8 ;
}

User Contributed Notes

There are no user contributed notes for this page.


Line Cap Settings

(UI 0.9.9)

Introduction

Synopsis de la classe

final UI\Draw\Line\Cap {
/* Constants */
const int Flat ;
const int Round ;
const int Square ;
}

User Contributed Notes

There are no user contributed notes for this page.


Line Join Settings

(UI 0.9.9)

Introduction

Synopsis de la classe

final UI\Draw\Line\Join {
/* Constants */
const int Miter ;
const int Round ;
const int Bevel ;
}

User Contributed Notes

There are no user contributed notes for this page.


Key Identifiers

(UI 1.0.0)

Introduction

Synopsis de la classe

final UI\Key {
/* Constants */
const int Escape ;
const int Insert ;
const int Delete ;
const int Home ;
const int End ;
const int PageUp ;
const int PageDown ;
const int Up ;
const int Down ;
const int Left ;
const int Right ;
const int F1 ;
const int F2 ;
const int F3 ;
const int F4 ;
const int F5 ;
const int F6 ;
const int F7 ;
const int F8 ;
const int F9 ;
const int F10 ;
const int F11 ;
const int F12 ;
const int N0 ;
const int N1 ;
const int N2 ;
const int N3 ;
const int N4 ;
const int N5 ;
const int N6 ;
const int N7 ;
const int N8 ;
const int N9 ;
const int NDot ;
const int NEnter ;
const int NAdd ;
const int NSubtract ;
const int NMultiply ;
const int NDivide ;
}

User Contributed Notes

There are no user contributed notes for this page.


InvalidArgumentException

(UI 1.0.3)

Introduction

Synopsis de la classe

UI\Exception\InvalidArgumentException extends InvalidArgumentException implements Throwable {
/* Propriétés héritées */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* Méthodes héritées */
final public Exception::getMessage ( ) : string
final public Exception::getPrevious ( ) : Throwable
final public Exception::getCode ( ) : mixed
final public Exception::getFile ( ) : string
final public Exception::getLine ( ) : int
final public Exception::getTrace ( ) : array
final public Exception::getTraceAsString ( ) : string
public Exception::__toString ( ) : string
final private Exception::__clone ( ) : void
}

User Contributed Notes

There are no user contributed notes for this page.


RuntimeException

(UI 1.0.3)

Introduction

Synopsis de la classe

UI\Exception\RuntimeException extends RuntimeException implements Throwable {
/* Propriétés héritées */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* Méthodes héritées */
final public Exception::getMessage ( ) : string
final public Exception::getPrevious ( ) : Throwable
final public Exception::getCode ( ) : mixed
final public Exception::getFile ( ) : string
final public Exception::getLine ( ) : int
final public Exception::getTrace ( ) : array
final public Exception::getTraceAsString ( ) : string
public Exception::__toString ( ) : string
final private Exception::__clone ( ) : void
}

User Contributed Notes

There are no user contributed notes for this page.


FAQ : foire Aux Questions

  • Informations générales
  • Listes de diffusion — Listes de diffusions
  • Obtenir PHP
  • Considérations sur les bases de données
  • Installation
  • Problèmes de compilation
  • Utiliser PHP
  • Hachage de mots de passe — Hachage de mots de passe sûr
  • PHP et HTML
  • PHP et COM
  • Questions diverses

User Contributed Notes

There are no user contributed notes for this page.


Informations générales

Cette section présente les questions les plus fréquentes à propos de PHP : ce qu'est PHP et ce qu'il fait.

  1. Qu'est-ce que PHP ?
  2. Que représente l'acronyme PHP ?
  3. Quelle est la relation entre les versions ?
  4. Puis-je utiliser plusieurs versions de PHP en même temps ?
  5. Je pense avoir trouvé un bogue ! Qui dois-je contacter ?
Qu'est-ce que PHP ?

Depuis la préface de ce manuel :

PHP est un langage de script HTML, exécuté coté serveur. Sa syntaxe est empruntée aux langages C, Java et Perl, et est facile à apprendre. Le but de ce langage est de permettre aux développeurs web d'écrire des pages dynamiques rapidement, mais vous pouvez faire beaucoup plus avec PHP.

Que représente l'acronyme PHP ?

PHP signifie PHP: Hypertext Preprocessor. La confusion vient du fait que la première lettre de l'acronyme représente l'acronyme lui-même. Ce type d'acronyme est appelé un acronyme récursif. Pour plus d'informations, les plus curieux peuvent visiter "» Free On-Line Dictionary of Computing" ou l'» entrée Wikipedia sur les acronymes récursifs.

Quelle est la relation entre les versions ?

PHP/FI 2.0 est une des premières versions de PHP et elle n'est plus supportée. PHP 3 en est son successeur et est beaucoup plus convivial. PHP 8 est la génération actuelle de PHP, qui utilise le moteur Zend 4 qui apporte, entre autres, beaucoup de nouveautés dans le modèle objet.

Puis-je utiliser plusieurs versions de PHP en même temps ?

Oui. Voir le fichier INSTALL inclus dans les sources de PHP.

Je pense avoir trouvé un bogue ! Qui dois-je contacter ?

Vous devriez aller sur la base de données de bogues PHP afin de vous assurer qu'il n'est pas déjà connu. Si vous ne le trouvez pas, utilisez le formulaire de rapport de bogues pour le faire connaître. Il est important d'utiliser la base de données de bogues au lieu d'envoyer simplement un courriel à une des listes de diffusion car le bogue se verra assigner un numéro qui vous sera utile pour suivre son évolution. La base de données de bogues peut être trouvée à » https://bugs.php.net/.

User Contributed Notes

There are no user contributed notes for this page.


Listes de diffusions

Cette section traite des questions à propos de la communication avec la communauté PHP. Le meilleur moyen est l'utilisation des listes de diffusion.

  1. Existe-t-il des listes de diffusion PHP ?
  2. Y a-t-il d'autres communautés ?
  3. Puis-je mettre en place ma propre liste de diffusion PHP ?
  4. Aidez-moi ! Je ne peux visiblement pas m'inscrire à une / me désinscrire d'une des listes de diffusion !
  5. Y a-t-il une archive des listes de diffusion quelque part ?
  6. Que puis-je demander sur les listes de diffusion ?
  7. Quelle information devrais-je inclure lors de l'écriture de mon message à la liste de diffusion ?
Existe-t-il des listes de diffusion PHP ?

Bien sûr ! Il y a beaucoup de listes de diffusion traitant de beaucoup de sujets. Une liste des listes de diffusion les plus communes peut être trouvée sur cette » page.

La liste de diffusion la plus générale est la liste php-general. Pour s'y inscrire, envoyez un courriel vide à » php-general-subscribe@lists.php.net. Pour se déinscrire, envoyez un courriel vide à » php-general-unsubscribe@lists.php.net.

Vous pouvez également vous inscrire et vous désinscrire en utilisant l'interface web sur cette » page; les instructions pour se désinscrire sont également présentes en bas de chaque courriel de la liste.

Y a-t-il d'autres communautés ?

Il y a énormément de communautés PHP à travers le monde, et nous avons une liste de la plupart des ressources (ainsi que des informations pour en connaître d'autres) sur notre page de » support.

Puis-je mettre en place ma propre liste de diffusion PHP ?

Absolument ! En fait, nous ne faisons pas que l'autoriser, mais nous l'encourageons ! Le fait d'aider les autres en partageant ses compétences et son expérience de PHP aide dans le développement de la communauté PHP mais aussi dans le language en tant que tel.

Aidez-moi ! Je ne peux visiblement pas m'inscrire à une / me désinscrire d'une des listes de diffusion !

Si vous avez des problèmes pour l'inscription/la désinscription depuis la liste de diffusion php-general, cela peut être dû au fait que le logiciel de listes de diffusion n'arrive pas à traiter correctement la liste de diffusion à utiliser. Si votre adresse e-mail est joeblow@example.com, vous pouvez envoyer une requête d'inscription à php-general-subscribe-joeblow=example.com@lists.php.net, ou une requête de désinscription à php-general-unsubscribe-joeblow=example.com@lists.php.net. Utilisez la même méthode avec les autres listes de diffusion.

La plupart du temps, lorsque les utilisateurs rencontrent des problèmes pour se désinscrire d'une liste de diffusion PHP, c'est à cause des courriels redirigés. Par exemple, si votre adresse est danbrown@example.com, mais que vous vous êtes inscrit en utilisant la redirection php-lists@example.com et ensuite, vous redirigez la liste vers danbrown@example.com, le fait de tenter de se désinscrire en utilisant danbrown@example.com ne fonctionnera pas. À la place, vous devez vous désinscrire en utilisant l'adresse recevant les courriels de la liste - dans notre exemple, php-lists@example.com.

Y a-t-il une archive des listes de diffusion quelque part ?

Oui, vous pouvez trouver la liste des sites proposant des archives sur la page des » listes de diffusion. Vous pouvez également trouver plusieurs sites qui archivent ou publient le contenu de nos listes de diffusion en utilisant votre moteur de recherche Internet préféré, en cherchant, par exemple, la chaîne "php mailing list archives".

Tous les messages de nos listes de diffusion sont également archivés dans des newsgroup. Vous pouvez accéder à ces serveurs sur » news://news.php.net/ avec un client adapté. Il y a également une interface web expérimentale pour ces serveurs à l'adresse » http://news.php.net/

Que puis-je demander sur les listes de diffusion ?

PHP devient de plus en plus populaire chaque jour, augmentant ainsi le trafic sur la liste de diffusion php-general qui accueille de 75 à 200 messages chaque jour. Aussi, c'est dans l'intérêt de tous que d'utiliser la liste de diffusion en dernier ressort, lorsque vous avez déjà épuisé toutes les autres voies.

Avant de poster sur cette liste, merci de lire la FAQ (Foire Aux Questions) afin de voir si vous n'y trouvez pas de l'aide. S'il n'y a rien concernant votre problème, essayez dans les archives de la liste de diffusion (voir précédemment). Si vous avez des problèmes pour l'installation ou la configuration de PHP, lisez toute la documentation s'y rapportant, ainsi que les fichiers README. Si vous ne trouvez toujours pas de réponse à votre problème, vous êtes le bienvenu sur la liste de diffusion.

Afin d'avoir la meilleure réponse à votre question (et pour éviter d'agacer les développeurs), assurez-vous de poser votre question sur la liste de diffusion appropriée. Par exemple, si vous avez des difficultés à installer PHP, vous devez poser votre question sur la liste de diffusion php-install. Attention : certaines listes ont des noms similaires, mais des usages totalement différents ; une question vis à vis des scripts PHP sous Windows doit être dirigée vers la liste des utilisateurs PHP sous Windows, et non vers la liste interne Windows.

Avant de poser une question, vous devriez lire l'article intitulé "» Comment poser une question de la meilleur façon" ; c'est une bonne idée, pour tout le monde.

Quelle information devrais-je inclure lors de l'écriture de mon message à la liste de diffusion ?

Les messages comme "Je n'arrive pas à faire fonctionner PHP !! Aidez-moi !! Qu'est-ce qu'il ne va pas ??" sont totalement inutiles, pour tous. Si vous avez des problèmes pour faire fonctionner PHP, vous devez inclure le système sur lequel le problème survient, quelle version de PHP vous tentez de faire fonctionner, sous quelle forme vous l'avez installée (précompilé, Git, RPMs, etc.), qu'est-ce que vous avez fait pour le moment, l'endroit où vous êtes coincé et quel est le message d'erreur.

Cela est valable pour n'importe quel type de problème. Vous devez inclure les informations sur ce que vous avez fait, où vous êtes coincé, ce que vous cherché à faire et, si possible, le message d'erreur obtenu. Si vous avez un problème avec votre code source, vous devez également inclure la portion de code qui ne fonctionne pas. N'incluez que le code nécessaire à la compréhension du problème ! Si vous incluez tout le code, votre message sera difficile à lire et, à cause de cela, beaucoup de personnes passeront sans même le lire. Si vous n'êtes pas sûr sur la quantité d'informations à inclure à votre message, il est préférable d'en mettre trop que pas assez et préparez-vous à fournir d'autres informations.

Un autre point important à ne pas oublier est de résumer votre problème dans l'objet du message. Un objet qui ressemble à "Aidez-moi !!!!" ou "Quel est le souci ici ?" sera ignoré par la majorité des lecteurs.

Et pour finir, vous êtes encouragé à lire l'article sur "» Comment poser une question de la meilleur façon", ce qui sera une aide énorme pour tous, et tout spécialement pour vous.

User Contributed Notes

There are no user contributed notes for this page.


Obtenir PHP

Cette section traite du téléchargement de PHP et les problèmes liés aux systèmes d'exploitation.

  1. Où puis-je obtenir PHP ?
  2. Est-ce que les versions binaires pré-compilées sont disponibles ?
  3. Où puis-je obtenir les bibliothèques dont j'ai besoin pour compiler les extensions optionnelles de PHP ?
  4. Comment faire fonctionner ces bibliothèques ?
  5. J'ai la dernière version du code source de PHP, téléchargée à partir de Git. De quoi ai-je besoin pour le compiler sous Windows ?
  6. Où puis-je trouver le fichier Browser Capabilities ?
  7. Que signifie thread safety lors du téléchargement de PHP?
Où puis-je obtenir PHP ?

Vous pouvez télécharger PHP à partir d'un des membres du réseau de sites PHP. Vous pouvez les trouver sur » https://www.php.net/. Vous pouvez aussi utiliser Git pour obtenir la toute dernière version des sources. Pour plus d'informations, allez sur » https://www.php.net/git.php.

Est-ce que les versions binaires pré-compilées sont disponibles ?

Nous ne les distribuons que pour le système Windows, car nous ne pouvons compiler PHP pour chaque plate-forme Linux/Unix avec toutes les combinaisons d'extensions. Notez aussi que plusieurs distributions Linux fournissent PHP d'office de nos jours. Les binaires Windows peuvent être téléchargés à partir de notre page de » Téléchargement, pour les binaires Linux, visitez le site de votre distribution.

Où puis-je obtenir les bibliothèques dont j'ai besoin pour compiler les extensions optionnelles de PHP ?

Note: Celles marquées d'une étoile (*) ne sont pas thread safe ; nous vous recommandons de ne pas les utiliser en environnement multi-threadé.

  • » LDAP (Unix).
  • » LDAP (Unix/Win) : Mozilla Directory (LDAP) SDK
  • » free LDAP server.
  • » Berkeley DB2 (Unix/Win) : http://www.sleepycat.com/.
  • » SNMP* (Unix): .
  • » GD (Unix/Win).
  • » mSQL* (Unix).
  • » PostgreSQL (Unix).
  • » IMAP* (Win/Unix).
  • » Sybase-CT* (Linux, libc5) : Disponible localement.
  • » FreeType (libttf):.
  • » ZLib (Unix/Win32).
  • » expat XML parser (Unix/Win32).
  • » PDFLib.
  • » mcrypt.
  • » mhash.
  • » t1lib.
  • » dmalloc.
  • » aspell.
  • » readline.

Comment faire fonctionner ces bibliothèques ?

Vous devrez suivre les instructions fournies avec les bibliothèques. Quelques une d'entre elles sont détectées automatiquement lorsque vous exécutez le script 'configure' de PHP (comme la bibliothèque GD), pour les autres, vous devrez les activer en utilisant l'option '--with-EXTENSION' de 'configure'. Exécutez 'configure --help' pour en avoir la liste complète.

J'ai la dernière version du code source de PHP, téléchargée à partir de Git. De quoi ai-je besoin pour le compiler sous Windows ?

Voir le wiki PHP pour les dernières instructions : » Instructions de compilation étape par étape

Où puis-je trouver le fichier Browser Capabilities ?

Vous pouvez trouver un fichier browscap.ini sur » http://browscap.org/.

Que signifie thread safety lors du téléchargement de PHP?

Thread Safety signifie que le binaire peut fonctionner sur des serveurs à contexte multi-thread comme Apache 2 sous Windows. La sécurité des threads (Thread Safety) fonctionne en créant un espace de stockage local pour chaque thread de telle sorte que les données n'entrent pas en collision entre les threads.

Donc, que choisir? Si vous utilisez PHP comme CGI, alors vous n'avez pas besoin de la sécurité des threads car le binaire est invoqué à chaque requête. Concernant les serveurs multi-threads, comme IIS5 et IIS6, vous devriez utiliser la version threadée de PHP.

User Contributed Notes

There are no user contributed notes for this page.


Considérations sur les bases de données

Cette section traite de questions relatives aux relations entre PHP et les bases de données. Oui, PHP peut accéder virtuellement à n'importe quelle base de données disponible aujourd'hui.

  1. J'ai entendu dire qu'il était possible d'accéder à Microsoft SQL Server à partir de PHP. Comment est-ce possible ?
  2. Puis-je accéder à des bases Microsoft Access ?
  3. Pourquoi m'encourage-t-on à ne plus utiliser l'extension MySQL (ext/mysql) que j'utilise depuis 10 ans ? Est-elle obsolète ? Que dois-je utiliser à la place ? Comment dois-je migrer ?
  4. Pourquoi est ce que j'obtiens une erreur comme celle-ci : "Warning: 0 is not a MySQL result index in <file> on line <x>" ou "Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>" ?
J'ai entendu dire qu'il était possible d'accéder à Microsoft SQL Server à partir de PHP. Comment est-ce possible ?

Sur les machines UNIX, vous pouvez utiliser PDO_ODBC ou Unified ODBC API.

Sur les machines Windows, vous pouvez également utiliser PDO_SQLSRV ou SQLSRV.

Jetez aussi un oeil à la réponse à la question suivante.

Puis-je accéder à des bases Microsoft Access ?

Oui. Vous avez déjà tous les outils nécessaires si vous utilisez uniquement Windows 9x/Me, ou NT/2000, et que vous utilisez ODBC avec les pilotes ODBC pour Microsoft Access.

Si vous utilisez PHP sur une machine Unix et que vous voulez vous connecter à une base Access sur une machine Windows, vous aurez besoin des pilotes ODBC Unix. » OpenLink Software fournit des pilotes ODBC pour Unix qui peuvent le faire.

Une autre solution consiste à utiliser un serveur SQL qui a des pilotes ODBC Windows et l'utiliser pour stocker les données, que vous pouvez utiliser à partir de Microsoft Access (en utilisant ODBC) et PHP (en utilisant les pilotes inclus), ou bien utiliser un format de fichier intermédiaire que Access et PHP peuvent traiter tous les deux, comme des fichier bruts ou des bases de données dBase. À ce sujet, Tim Hayes de Openlink software écrit :

Utiliser une autre base de données comme intermédiaire n'est pas une bonne idée lorsque vous pouvez utiliser ODBC de PHP directement vers vos bases de données - par exemple avec les pilotes Openlink. Si vous avez besoin d'un format de fichier intermédiaire, Openlink a publié Virtuoso (un moteur de base de données virtuel) pour NT, Linux et d'autres plates-formes Unix. Visitez notre » site pour un téléchargement gratuit.

Une solution qui a fait ses preuves est d'utiliser MySQL et ses pilotes ODBC sous Windows et de synchroniser les bases de données. Steve Lawrence écrit :

  • Installez MySQL sur votre plate-forme conformément aux instructions de MySQL. Vous pouvez l'obtenir sur » http://www.mysql.com/. Aucune configuration particulière n'est nécessaire, mis à part que lorsque vous configurez une base de données et un compte utilisateur, il faille spécifier % dans le champ host, ou bien le nom de la machine Windows avec laquelle vous voulez accéder à MySQL. Notez bien votre nom de serveur, d'utilisateur et votre mot de passe.
  • Téléchargez les pilotes MyODBC pour Windows à partir du site de MySQL. Installez les sur votre machine Windows. Vous pouvez tester votre installation avec les utilitaires fournis avec les pilotes.
  • Créez un utilisateur ou une source de données système dans votre administration ODBC, dans le panneau de configuration. Donnez un nom de source de données dsn, entrez votre nom d'hôte, identifiant, mot de passe, port, etc. pour la base de données configurée à l'étape 1.
  • Installez Access avec une installation complète pour être sûr d'avoir tous les composants nécessaires... Vous aurez besoin d'au moins le support ODBC et le gestionnaire de tables liées.
  • Maintenant, la partie amusante ! Créez un accès à une base de données. Dans la fenêtre de la table, cliquez droit et sélectionner Lier les Tables, ou, dans le menu Fichier, sélectionnez Obtenir des données externes et alors Lier les Tables. Quand la fenêtre de gestion de fichiers apparaît, sélectionnez les fichiers de type : ODBC. Sélectionnez dsn Système et le nom de votre dsn créée à l'étape 3. Sélectionnez la table à lier, cliquez sur OK, et voilà ! Vous pouvez maintenant ouvrir la table et ajouter/supprimer/éditer des données sur votre serveur MySQL ! Vous pouvez ainsi exécuter des requêtes, importer/exporter des tables vers MySQL, construire des formulaires et des rapports, etc.

Trucs et astuces :

  • Vous pouvez construire vos tables dans Access et les exporter dans MySQL, puis les lier de nouveau. Cela rend la création de table très rapide.
  • Lorsque vous créez des tables dans Access, vous devez avoir une clé primaire définie pour avoir accès en écriture à la table. Assurez-vous que vous avez bien créé une clé primaire dans MySQL avant de lier le tout à Access.
  • Si vous changez une table dans MySQL, vous devez la lier de nouveau à Access. Allez dans Outils>suppléments>gestionnaire de tables liées, cherchez votre DSN ODBC, et sélectionnez la table à lier de nouveau. Vous pouvez aussi changer votre source dsn à partir de là, en cliquant sur l'option toujours demander pour un nouvel emplacement avant de presser OK.

Pourquoi m'encourage-t-on à ne plus utiliser l'extension MySQL (ext/mysql) que j'utilise depuis 10 ans ? Est-elle obsolète ? Que dois-je utiliser à la place ? Comment dois-je migrer ?

Il y a 3 extensions MySQL, tel que décrit dans la section Choisir une API MySQL. L'ancienne API ne doit plus être utilisée, elle est devenue obsolète depuis PHP 5.5.0 et a été supprimé de PECL depuis PHP 7.0.0. Vous êtes vivement encouragé à écrire vos nouvelles lignes de code en utilisant l'extension mysqli ou PDO_MySQL.

Les scripts de migration ne sont pas disponibles actuellement, bien que l'API mysqli contient à la fois une API procédurale et orientée objet, dont la version procédurale est très similaire à ext/mysql.

Il n'est pas possible de mixer les extensions. Aussi, par exemple, le fait de passer une connexion mysqli à PDO_MySQL ou ext/mysql ne fonctionnera pas.

Pourquoi est ce que j'obtiens une erreur comme celle-ci : "Warning: 0 is not a MySQL result index in <file> on line <x>" ou "Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>" ?

Vous essayez d'utiliser un identifiant de résultat qui vaut 0. Le 0 indique que votre requête a échoué pour une quelconque raison. Vous devez alors chercher les erreurs après avoir exécuté une requête et avant même de vouloir traiter le résultat. Une façon propre de le faire est de coder comme ceci :

<?php

$result = mysql_query("SELECT * FROM tables_priv");
if (!$result) {
    echo mysql_error();
    exit;
}
?>
ou
<?php

$result = mysql_query("SELECT * FROM tables_priv")
    or die("Bad query: " . mysql_error());
?>

User Contributed Notes

doug at unlikelysource dot com 31-Mar-2017 08:53
To enable SQL Server access from ubuntu 16.04:

* Run these commands:
```
sudo curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > mssql-release.list
sudo mv mssql-release.list /etc/apt/sources.list.d
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install msodbcsql unixodbc-dev
sudo apt-get install php7.1-dev
sudo apt-get install autoconf
sudo pecl install pdo_sqlsrv-4.1.6.1
```

*  Confirm ODBC driver installation:
```
odbcinst -q -d -n "ODBC Driver 13 for SQL Server"
```

* Update the php.ini file: run` php --ini` to find the path to your php.ini file
* Add this line to /path/to/php.ini
```
extension=pdo_sqlsrv.so
```
* Run `php -i` to confirm SQLSRV support was added
* NOTE: extensions (on my computer) were installed here:
`/usr/local/lib/php/extensions/no-debug-non-zts-20160303/`

* Test user access directly on the Windows server running MSSQL:
```
sqlcmd -S ip_address -U username -P password -d database -q "select * from table_name"
```
* On the Windows server: open port 1433 in your firewall

* Install the FreeTds utils to test the connection:
```
sudo apt-get install freetds-bin
tsql -H mssql.host.ip.address -U username -P password -D database -p 1433
```

* Formulate the correct DSN (Data Source Name):
    See: http://php.net/manual/en/ref.pdo-sqlsrv.connection.php

* Sample PHP Code:
```
<?php
// Database params
$tcp  = '192.168.3.126';
$port = 1433;
$user = "test";
$password = "Password123";
$database = "test";

// Open connection
try {
    // Database connect -- use one of the two statements below
    $dsn =  'sqlsrv:Server=tcp:' . $tcp . ',' . $port . ';Database=' . $database;
    $dbh = new PDO( $dsn, $user, $password, array());
    // SQL prepare
    $sql = "SELECT * FROM prospects";
    $sth = $dbh->prepare($sql);
    // Execute
    $sth->execute();
    // Fetch results
    $row = $sth->fetch(PDO::FETCH_ASSOC);
    if ($row) {
        $output = '<pre>';
        $output .= implode("\t", array_keys($row)) . PHP_EOL;
        $output .= implode("\t", $row) . PHP_EOL;
        while ($row = $sth->fetch(PDO::FETCH_NUM)) {
            $output .= implode("\t", $row) . PHP_EOL;
        }
    }
} catch (PDOException $e) {
    $output .= $e->getMessage();
}
$output .= '</pre>';
echo $output;
```
knb at gfz-potsdam dot de 11-Oct-2004 02:53
This is a crucial piece of information for SYBASE users:

If you are using the free, but old, 11.x client libs from sybase,
 then compile with option  "--with-sybase-ct=$SYBASE"
substitute $SYBASE with the appropriate directory name.

option --with-sybase (without ct) can somehow be used to talk to old MS-SQL servers, but only with the 11.x client libs.

If you are using free, or have legally obtained, 12.x client libs from sybase, then compile with option  "--with-sybase-ct=$SYBASE/$SYBASE_OCS"
substitute $SYBASE/$SYBASE_OCS with the appropriate directory name.


Installation

Cette section traite de questions courantes sur la façon d'installer PHP. PHP est disponible sur la plupart des systèmes d'exploitation et pour quasiment n'importe quel serveur web.

Pour installer PHP, suivez les instructions présentes dans Installation et configuration.

  1. Pourquoi ne doit-on pas utiliser Apache 2 dans un environnement threadé multiprocesseur de production ?
  2. Unix/Windows : où doit être placé mon fichier php.ini ?
  3. Unix : j'ai installé PHP, mais à chaque fois que je charge un document, j'obtiens l'erreur 'Document Contains No Data' ! Que se passe-t-il ?
  4. Unix : J'ai installé PHP en utilisant des fichiers sources RPM, mais apache ne traite pas les pages PHP. Que se passe-t-il ?
  5. Unix : J'ai patché Apache avec l'extension FrontPage et subitement, PHP ne fonctionne plus. Est-ce que PHP est incompatible avec l'extension FrontPage pour Apache ?
  6. Unix/Windows : J'ai installé PHP, mais lorsque je tente d'accéder à un fichier contenant un script PHP via mon navigateur, j'obtiens un écran vide.
  7. Unix/Windows : J'ai installé PHP, mais lorsque je tente d'accéder à un fichier contenant un script PHP via mon navigateur, j'obtiens une erreur de type 'server 500 error'.
  8. Quelques systèmes d'exploitations : J'ai installé PHP sans erreur, mais lorsque je tente de démarrer Apache, j'obtiens une erreur du type 'Undefined symbols' : [mybox:user /src/php5] root# apachectl configtest apachectl: /usr/local/apache/bin/httpd Undefined symbols: _compress _uncompress
  9. Windows : J'ai installé PHP, mais lorsque je tente d'accèder à un fichier contenant un script PHP via mon navigateur, j'obtiens l'erreur : cgi error: The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:
  10. Windows : J'ai suivi toutes les instructions, mais je n'arrive toujours pas à faire fonctionner PHP et IIS ensemble !
  11. Lorsque vous exécutez PHP comme CGI avec IIS, PWS, OmniHTTPD ou Xitami, j'obtiens l'erreur suivante : Security Alert! PHP CGI cannot be accessed directly..
  12. Comment puis-je savoir si mon php.ini a bien été trouvé et lu ? Cela semble être le cas mais aucun de mes changements n'ont eu d'effet.
  13. Où dois-je ajouter mon répertoire PHP à la variable PATH sous Windows ?
  14. Comment rendre le fichier php.ini disponible à PHP sous Windows ?
  15. Est-il possible d'utiliser la négociation sur le contenu fournie par Apache (option MultiViews) avec PHP ?
  16. Est-ce que PHP est limité au traitement des méthodes GET et POST ?
Pourquoi ne doit-on pas utiliser Apache 2 dans un environnement threadé multiprocesseur de production ?

PHP est un mortier. C'est un mortier utilisé pour construire de belles applications web en utilisant beaucoup de bibliothèques ensemble, apparaissant comme une seule entité à travers un langage intuitif et facile à apprendre. La flexibilité et la puissance de PHP se fondent sur la stabilité et la robustesse de la plate-forme fondamentale. Il a besoin d'un OS qui fonctionne, d'un serveur web qui fonctionne et de bibliothèques externes pour coller le tout. Lorsqu'un seul de ces éléments arrêtent subitement de fonctionner, PHP doit identifier le problème et le réparer au plus vite. En rendant le cadre fondamental plus complexe en ne séparant pas les exécutions des threads, ni les segments mémoires, ni un endroit clos pour traiter chaque requête entrante, de nouvelles faiblesses sont introduites dans le système PHP.

Si vous voulez utiliser un MPM threadé, regardez du côté d'une configuration FastCGI dans lequel PHP s'exécute dans son propre espace mémoire.

Unix/Windows : où doit être placé mon fichier php.ini ?

Par défaut sous Unix, il doit être placé dans /usr/local/lib qui est en fait <install-path>/lib. La plupart des personnes voudront changer ceci lors de la compilation avec l'option --with-config-file-path. Vous pouvez par exemple le régler de cette façon :

--with-config-file-path=/etc
Et alors vous copierez le fichier php.ini-development livré avec les sources vers /etc/php.ini et l'éditer pour l'adapter à vos besoins.

--with-config-file-scan-dir=PATH

Sous Windows, le chemin par défaut de php.ini est le répertoire de Windows. Si vous utilisez le serveur web Apache, php.ini est tout d'abord cherché dans le répertoire d'installation de Apache, c'est-à-dire c:\program files\apache group\apache. De cette façon, vous pouvez avoir un php.ini différent pour chaque version de Apache installée.

Consultez aussi le chapitre sur le fichier de configuration.

Unix : j'ai installé PHP, mais à chaque fois que je charge un document, j'obtiens l'erreur 'Document Contains No Data' ! Que se passe-t-il ?

Cela signifie probablement que PHP rencontre un problème et génère un fichier core. Consultez vos fichiers de logs de votre serveur pour voir si c'est le cas, et tentez de reproduire le problème avec un test simple. Si vous savez utiliser 'gdb', il serait très utile de fournir un backtrace avec votre rapport de bogue, afin d'aider les développeurs à cerner le problème. Si vous utilisez PHP en module Apache, essayez ceci :

  • Stoppez vos processus httpd

  • gdb httpd

  • Stoppez vos processus httpd

  • > run -X -f /path/to/httpd.conf

  • Pointez alors avec votre navigateur vers l'URL posant problème.

  • > run -X -f /path/to/httpd.conf

  • Si vous obtenez un fichier core, gdb doit alors vous en informer.

  • tapez : bt

  • Vous devriez inclure votre backtrace dans votre rapport de bogue. Celui-ci doit être posté sur » https://bugs.php.net/.

Si votre script utilise les expressions rationnelles (preg_match() et consorts), assurez-vous que PHP et Apache ont été compilés avec les même outils d'expression rationnelles. Cela doit être automatiquement le cas avec PHP et Apache 1.3.x.

Unix : J'ai installé PHP en utilisant des fichiers sources RPM, mais apache ne traite pas les pages PHP. Que se passe-t-il ?

En supposant que vous avez installé à la fois Apache et PHP à partir de fichiers RPM, vous devrez commenter ou ajouter au moins quelques unes des lignes suivantes dans votre fichier httpd.conf :

# Extra Modules
AddModule mod_php.c
AddModule mod_perl.c

# Extra Modules
LoadModule php_module         modules/mod_php.so
LoadModule php5_module        modules/libphp5.so
LoadModule perl_module        modules/libperl.so
Et ajouter :
AddType application/x-httpd-php .php
... aux propriétés globales ou aux propriétés du VirtualDomain ou vous voulez que PHP officie.

Unix : J'ai patché Apache avec l'extension FrontPage et subitement, PHP ne fonctionne plus. Est-ce que PHP est incompatible avec l'extension FrontPage pour Apache ?

Non, PHP fonctionne très bien avec l'extension FrontPage. Le souci vient du fait que le patch pour l'installation de FrontPage modifie la structure d'Apache, qui est relié à PHP. Recompiler PHP (en utilisant 'make clean ; make') après avoir patché Apache avec l'extension FrontPage devrait résoudre ce problème.

Unix/Windows : J'ai installé PHP, mais lorsque je tente d'accéder à un fichier contenant un script PHP via mon navigateur, j'obtiens un écran vide.

Affichez le code source du document dans votre navigateur et vous devriez probablement trouver le code source de votre script PHP. Cela signifie que le serveur web n'a pas envoyé le script à PHP pour interprétation. Quelque chose est donc incorrecte dans le fichier de configuration de votre serveur web - re-vérifiez la configuration du serveur web en vous référant aux instructions d'installations de PHP.

Unix/Windows : J'ai installé PHP, mais lorsque je tente d'accéder à un fichier contenant un script PHP via mon navigateur, j'obtiens une erreur de type 'server 500 error'.

Quelque chose se passe mal lorsque le serveur tente d'utiliser PHP. Pour tenter de récupérer un message d'erreur, depuis la ligne de commande, placez-vous dans le répertoire contenant l'exécutable PHP (php.exe sous Windows) et exécutez la commande php -i. Si PHP a un problème quelconque l'empêchant de fonctionner, un message d'erreur devrait s'afficher qui devrait expliquer comment résoudre ce souci. Si un écran de code HTML apparaît (la sortie de la fonction phpinfo()), cela signifie que PHP fonctionne correctement et que le problème doit certainement venir de la configuration de votre serveur web que vous devriez re-vérifier.

Quelques systèmes d'exploitations : J'ai installé PHP sans erreur, mais lorsque je tente de démarrer Apache, j'obtiens une erreur du type 'Undefined symbols' :
[mybox:user /src/php5] root# apachectl configtest
 apachectl: /usr/local/apache/bin/httpd Undefined symbols:
  _compress
  _uncompress

Cela n'a actuellement rien à voir avec PHP mais avec la bibliothèque cliente MySQL. Suivant les versions, elle a besoin que PHP soit compilé avec l'option --with-zlib, d'autre non. Ce problème est également traité dans la FAQ de MySQL.

Windows : J'ai installé PHP, mais lorsque je tente d'accèder à un fichier contenant un script PHP via mon navigateur, j'obtiens l'erreur :
cgi error:
 The specified CGI application misbehaved by not
 returning a complete set of HTTP headers.
 The headers it did return are:

Ce message d'erreur signifie que PHP a échoué lors de l'affichage. Pour tenter de récupérer un message d'erreur, depuis la ligne de commande, placez-vous dans le répertoire contenant l'exécutable PHP (php.exe sous Windows) et exécutez la commande php -i. Si PHP a un quelconque souci de fonctionnement, alors un message d'erreur le décrivant s'affichera. Si vous obtenez un écran de code HTML (le contenu du résultat de la fonction phpinfo()), alors PHP fonctionne correctement.

Si PHP fonctionne depuis la ligne de commande, tentez d'accéder à votre script encore une fois via votre navigateur. S'il échoue toujours, alors, il se peut que ce soit l'un des soucis suivants :

  • Les permissions de votre script PHP des fichiers php.exe, php5ts.dll, php.ini ou de toute extension nécessaire à PHP que vous tentez de charger, sont telles que l'utilisateur internet anonyme de votre système ISUR_<machinename> ne peut pas y accéder.
  • Le script PHP n'existe pas (ou n'est pas à l'endroit que vous pensez, relativement au répertoire racine de votre serveur web). Notez que pour le serveur web IIS, vous pouvez vérifier cela en cochant la case 'vérifier si le fichier existe' lors de la configuration de l'exécution des scripts dans le gestionnaire de services Internet. Si un fichier de script n'existe pas, le serveur web retournera une erreur 404. IIS a également l'avantage d'effectuer toutes les identifications requises à votre place, basés sur les permissions NTLanMan, sur votre fichier de script.
Windows : J'ai suivi toutes les instructions, mais je n'arrive toujours pas à faire fonctionner PHP et IIS ensemble !

Assurez-vous que chaque utilisateur qui a besoin d'exécuter un script PHP possède les droits requis pour exécuter le fichier php.exe ! IIS utilise un utilisateur anonyme qui est ajouté lors de l'installation de IIS. Cet utilisateur doit avoir les droits suffisant sur le fichier php.exe. De même, tous les utilisateurs enregistrés doivent posséder les droits requis pour exécuter le fichier php.exe. Pour IIS4, vous devez lui dire que PHP est un moteur de script. De plus, vous devriez lire cette FAQ.

Lorsque vous exécutez PHP comme CGI avec IIS, PWS, OmniHTTPD ou Xitami, j'obtiens l'erreur suivante : Security Alert! PHP CGI cannot be accessed directly..

Vous devez définir la directive cgi.force_redirect à 0. Par défaut, elle vaut 1, donc, soyez sûrs que cette directive n'est pas commentée (précédée d'un point virgule). Comme toutes les directives, elles sont définies dans le php.ini.

Comme la valeur par défaut vaut 1, il est impératif que vous soyez sûrs à 100% que le bon fichier php.ini a été lu. Lisez cette FAQ pour plus de détails.

Comment puis-je savoir si mon php.ini a bien été trouvé et lu ? Cela semble être le cas mais aucun de mes changements n'ont eu d'effet.

Pour être sûr que votre php.ini a été lu par PHP, effectuez un appel à la fonction phpinfo(). Vers le haut du document résultant, il devrait figurer une liste appelée Configuration File (php.ini). Cela vous indiquera où PHP a cherché le php.ini et si oui ou non il l'a lu. Si seul un dossier PATH existe et qu'il est accessible en lecture, vous devez copier votre php.ini dans ce dossier. Si le php.ini est présent dans le chemin, cela signifie qu'il a bien été lu.

Si le php.ini a bien été lu et que vous exécutez PHP comme module, alors assurez-vous de redémarrer le serveur web après avoir effectué les modifications à votre php.ini.

Voir aussi la fonction php_ini_loaded_file().

Où dois-je ajouter mon répertoire PHP à la variable PATH sous Windows ?

Sous Windows 7, XP, Vista, 2008, 2012 et plus récent :

  • Allez dans le centre de contrôle et ouvrez l'icône système (Démarrer ? Paramètres ? Panneau de configuration ? Système ou juste Démarrer ? centre de contrôle ? Système pour Windows XP/2003+)

  • Allez à l'onglet "Avancé"

  • Cliquez sur le bouton "Variables d'environnements"

  • Regardez dans le panneau "Variables systèmes"

  • Trouvez l'entrée Path (vous devriez avoir à faire descendre l'ascenseur pour le trouver)

  • Double cliquez sur l'entrée Path

  • Entrez votre répertoire PHP à la fin, sans oublier le point virgule (;) avant (par exemple ;C:\php)

  • Confirmez en cliquant sur OK

Sous Windows 98/Me, vous devez éditer le fichier autoexec.bat :

  • Ouvrez Notepad (Démarrer -> Exécuter et entrez notepad)

  • Ouvrez le fichier C:\autoexec.bat

  • Repérez la ligne contenant PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;..... et ajoutez : ;C:\php à la fin de la ligne.

  • Sauvegardez le fichier et redémarrer l'ordinateur

Note: Assurez-vous de redémarrer l'ordinateur après avoir suivi cette procédure afin que les modifications sur la variable PATH soient bien prises en compte.

Le manuel PHP vous encourage à copier les fichiers dans le dossier système de Windows car ce dossier (C:\Windows, C:\WINNT, etc.) se trouve par défaut dans le PATH système. Copier les fichiers dans le dossier système de Windows est depuis obsolète et peut causer des problèmes.

Comment rendre le fichier php.ini disponible à PHP sous Windows ?

Il y a plusieurs façons de faire cela. Si vous utilisez Apache, lisez leurs instructions spécifiques d'installation (Apache 1, Apache 2) sinon, vous devez définir la variable d'environnement PHPRC :

Sous Windows :

  • Allez dans le centre de contrôle et ouvrez l'icône système (Démarrer ? Paramètres ? Panneau de configuration ? Système ou juste Démarrer ? centre de contrôle ? Système)

  • Allez à l'onglet "Avancé"

  • Cliquez sur le bouton "Variables d'environnements"

  • Regardez dans le panneau "Variables systèmes"

  • Cliquez sur "Nouveau" et entrez "PHPRC" comme nom de variable et le dossier où se trouve votre fichier php.ini comme valeur (par exemple C:\php)

  • Confirmez en cliquant sur OK et redémarrer votre ordinateur

Sous Windows 98/Me, vous devez éditer le fichier autoexec.bat :

  • Ouvrez Notepad (Démarrer ? Exécuter et entrez notepad)

  • Ouvrez le fichier C:\autoexec.bat

  • Ajouter une nouvelle ligne à la fin du fichier : set PHPRC C:\php (remplacez C:\php avec le dossier où se trouve le fichier php.ini). Notez que le chemin ne peut contenir d'espace. Aussi, si vous avez installé PHP dans le dossier C:\Program Files\PHP, vous devez entrer le chemin C:\PROGRA~1\PHP.

  • Sauvegardez le fichier et redémarrer l'ordinateur

Est-il possible d'utiliser la négociation sur le contenu fournie par Apache (option MultiViews) avec PHP ?

Si les liens vers les fichiers PHP incluent l'extension, tout fonctionne parfaitement. Cette entrée de la FAQ traite uniquement du cas où les liens vers les fichiers PHP n'incluent pas l'extension et que vous voulez utiliser la négociation sur le contenu fourni par Apache pour choisir les fichiers PHP depuis une URL qui ne contient pas d'extension. Dans ce cas, remplacez la ligne AddType application/x-httpd-php .php par :

AddHandler php5-script php
AddType text/html php
Cette solution ne fonctionne pas pour Apache 1 car le module PHP ne captura pas le php-script.

Est-ce que PHP est limité au traitement des méthodes GET et POST ?

Non, il est possible de gérer tout type de méthode, comme CONNECT. Les bons en-têtes de réponse peuvent être envoyés avec la fonction header(). Si seules les méthodes POST et GET doivent être gérées, vous pouvez configurer Apache comme ce qui suit :

<LimitExcept GET POST>
Deny from all
</LimitExcept>

User Contributed Notes

ssaxena at nriol dot com 12-Mar-2010 02:28
Here are my struggle to get PHP 5.2.12 working on Windows XP SP3, IIS 5.1 (Please note Win XP SP3 has issue of FastCGI)

1. Dowloaded installer and installed in C:\Program Files\PHP as ISAPI module

---->Did not work

Added php5isapi.dll in ISAPI Filter and added the extension .php in Home Dir->Configuration
(For every setting change restarted IIS on cmd->iisreset)

---->Did not work

(And the Google was pointing to the Fast CGI issue; Don't know why microsoft has MS-FAST ! )
Uninstalled the PHP and cleaned up the folders, PATH environment variable & PHPRC, the IIS settings and registry entries and shut down(restart is different from shut down) the system to make it very clean

2. Reinstalled the PHP in C:\PHP as ISAPI and did the same as above in IIS
(For every setting change restarted IIS on cmd->iisreset)

---->Did not work

Uninstalled and cleaned up same as above and took a breath to make sure what I am doing wrong.
Shutdown the system.

3. Unzipped the php-5.2.12-Win32.zip and did the same as above (this time manually PATH variable and security permission for the PHP folder and following settings)

short_open_tag = On
error_reporting = E_ALL & ~E_NOTICE
display_errors = On
doc_root = "C:\Inetpub\wwwroot"
extension_dir = "C:\PHP\ext"
cgi.force_redirect = 0

---->Did not work

Uninstalled and cleaned up same as above
Shutdown the system.

4. Downloaded Microsoft Web Platform Installer 2.0 and select the PHP+Fast CGI+Windows Cache for PHP extension and Web Deployment Tools
restarted the system to take effect the settings

---->Did not work

Uninstalled and cleaned up same as above
Shutdown the system

5. Took the prev version of PHP php-5.2.4-Win32.zip unzip the folder and did the following changes:

short_open_tag = On
error_reporting = E_ALL & ~E_NOTICE
display_errors = On
doc_root = "C:\Inetpub\wwwroot"
extension_dir = "C:\PHP\ext"
cgi.force_redirect = 0

set the security permission as IIS_machinename with full access to the C:\PHP folder

------->IT GOT WOKRING

Hope people would be aware of php-5.2.12 and would love the php-5.2.4
john dot calder at manukau dot ac dot nz 03-May-2008 10:19
WINDOWS 2003 and IIS.  BIG LESSON FOR ME was "don't mess with the optional components".
I had lots of trouble until I tried installing without asking for extras and then it was very smooth.
I have found no need to set up paths.
I have found no need to configure IIS.
I have found no need to change security on the PHP folder.

What works for me with Windows/IIS:

1.  You need to be logged-on as "administrator"

2.  Run  "php-5.2.6-win32-installer.msi"
Your ONLY action during this wizard is to select "IIS ISAPI" as the webserver.  Do NOT CHANGE anything else!  I am guessing that the optional extras apply only to Apache because after enabling them I see Apache-related error messages.

3.  Setup a test virtual directory as you would for an ASP or ASP.NET web app.  eg "phptest"
Then use notepad to create a test page eg "test.php"
<?php
phpinfo();
?>

4.  In Internet Explorer, test with eg this address
http://localhost/phptest/test.php

IF this does not give you a beautiful page of details THEN start reading other advice on this page - especially helpful for me was the faq advice to test run "php.exe -i" from the command prompt.
charleslynch at xybersoftware dot com 17-Apr-2008 07:30
One final note to the message below if you are getting the message about not having rights to execute...You need to use IIS right click on the website and choose 'Properties/Home Directory' then on the 'Execute Permissions' combo box you need to choose 'Scripts only'...Click ok...another dialog may appear asking which directories to apply the action too...choose any directories that you intend on using php in and click ok...It should work now...
joerg at fenin dot de 02-Nov-2007 02:35
To limit HTTP Request Methods on the Apache server running PHP you should use mod_rewrite or mod_security instead of LimitExcept, to give you more control over the handling of such http errors.  Can go in .htaccess file or httpd.conf

# mod_rewrite
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|POST)$
  RewriteRule .* - [F,L]
</IfModule>

# mod_security
<IfModule mod_security.c>
  SecFilterSelective REQUEST_METHOD "!^(GET|HEAD|POST)$" "deny,log,status:403"
</IfModule>

You can use the php request method scanner at askapache to see exactly how your server deals with various request methods, and check that your server is configured properly..

http://www.askapache.com/online-tools/request-method-scanner/
scott at chaisson dot net 19-Sep-2007 09:18
Windows 2000 Server and IIS (SP4 and all patches):

After many frustrating hours of trying to figure out the install (again), It took a while, but here are a couple tips:

PHP working with IIS uses c:\winnt\php.ini

It doesn't matter what you set the path to, nor what you set the PHPRC environment variable to. After you get PHP running correctly in the installation folder (using php -i) copy the php.ini file into the c:\winnt folder.

Here's what worked for me:

- Add PHP path to System environment variable

- Add php5activescript.dll from http://snaps.php.net/ to the PHP folder, then Register it: "regsvr32 php5activescript.dll"

Set extension_dir and doc_root directives in PHP.INI:
  extension_dir = C:\WWW\PHP\ext
  doc_root = C:\WWW\Site
  cgi.force_redirect = 0

(the last cgi.force_redirect isn't required, but I like to set it anyway)

Copy the .INI file into WINNT folder

In IIS Manager, right-click "Default Web Site", Click "Home Directory",
  Click "Configuration", "Add" the ISAPI application:
    Executable: <your php install>\php5isapi.dll
    Extension: .php
    Limit to: GET,HEAD,POST
    Check: "Script Engine"
    Uncheck: "Check that file exists"

Finally: Set up an ISAPI filter:
  Click the "ISAPI Filters" tab,
  Filter Name: PHP
  Executable: <your php install>\php5isapi.dll

Notes: You don't have to set any of your folders as "Script source" folders. .PHP files aren't scripts, merely text files that require processing before being shipped off to the browser, which is what the ISAPI filter does.

Finally, working again.

Chase
christianfelix at laszlo dot com 16-Jul-2007 03:39
For Windows XP users

Just add php.ini to windows/system 32 and also save a copy in the setup folder e.g. c:/php/php.ini, c:/php5/php.ini,

You have to follow the suggestions, add to path, uncomment extensions and voila!!
Meiki67 skipthis at geemail 07-Jun-2007 04:41
Had a hard day to MSI install 5.2.3 on WinXP with MySQL. I use a drive substitution (subst drive: path - in my case subst d: c:\drive_d) and installed PHP in D:\PHP - which in reality is C:\DRIVE_D\PHP.  To make a long story short - only after (1) changing all substituted D:\ back to C:\DRIVE_D and (2) resolving all DOS short names to Win long names PHP started to work. The first one is clear - the substitution works only for the active console user - not for services or IUSR. For the second one I have no explanation, since DOS short names should work systemwide - maybe Win handles them correctly but PHP not ?

BTW <?php phpinfo(); ?> was of tremendeous help

Meiki
Curtis 18-May-2007 07:39
I have some additional troubleshooting tips for 53.7, which deals with getting a blank screen on your browser when running a PHP script.

In addition to server misconfiguration, it may also be that PHP isn't configured to output errors to the browser, which is the case if you or your host uses a more secure php.ini. If this is the case, you need to find out where errors are being logged to find out if any errors are preventing normal output from being delivered to the client.

If you have access to php.ini, check the 'display_errors' directive, which is, by default, located under the 'error_reporting' directive. It's helpful to have 'display_errors' on during debugging phases, but best to have it off in production environments.

Related functions: http://php.net/ini_set | http://php.net/error_reporting | http://php.net/error_log
knutw at sparhell dot no 06-Nov-2006 09:15
I recntly upgraded from PHP 5.1 to 5.2 on my Windows Server 2003 using IIS6. I selected CGI as before. My PHP folder is as always C:\Program Files\PHP. I also edited my brand new php.ini, enabling all my old extensions and recommended settings for IIS. I like not to keep my old config into a new version.

After upgrade, I just got blank pages in my browser, and the response status was 404 Not found.

I checked my installation twice, using this FAQ, but got no way.

Then I went to IIS Manager, Web Service Extensions. The php Service Extension was Allowed as it should. I deleted the Service Extension and added it. The old extension used short file names containing tilde (PROGRA~) character, but I don'æt know if that gas anything to do with the problem. Anyway, after allowing my" new" Service Extension, pointing to php-cgi.exe as before, mye web sites suddenly worked. So will revommend anyone with thos problem to delete and add the Servcie Extension. It didn't help re-allowing it, restarting IIS or the complete server.
13-Sep-2006 07:03
After setting the PHPRC environment variable, none of my PHP files would hit the preprocessor. The browser was just serving out PHP source code right there in the "view source."

The manual was telling me to set this var to "c:\php," but nothing was working. It's almost as if IIS/Win2000 wasn't reading my php.ini at all.

After I set that variable to "c:\php\php.ini," all of a sudden I was getting honest to goodness PHP pages working.
emzeperx at emzeper dot hu 01-Jan-2006 12:36
You do not have to restart the whole system make effect of changing the PATH env var. For me (sbs2003) worked automatically.
on older systems you can use

set $Path=%path%;c:\php

command to extend immediately the path var.
JUSTANOTHERUSER 14-Aug-2005 11:23
<LimitExcept GET POST>
Deny from all
</LimitExcept>

Does not work with Apache2+ & PHP5 . Apache Refuses to start
per dot fikse at ipj dot no 12-Jul-2005 01:22
Installing PHP 4 or 5 on Windows Server 2003 x64 results in http error 505. This is not a PHP bug. It is due to running a 32-bit ISAPI DLL under the 64-bit version of IIS 6, as documented here: http://support.microsoft.com/?id=895976

Solution: Flip the Metabase flag for Enable32bitAppOnWin64 as described in http://support.microsoft.com/?id=894435 ,
like this: CSCRIPT ADSUTIL.VBS SET W3SVC/AppPools/Enable32bitAppOnWin64 1

(Alternatively with full path: cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1)
barry dot fagin at usafa dot af dot mil 04-Jan-2005 09:22
Fixing 404 (file not found) errors with PHP 5.0.3 and IIS 6.0

IIS 6.0 is installed with security settings that don't permit dynamic content.  This means that even if all the hints in the FAQ are paid attention to (.ini modified correctly, security and permissions correct for IUSR_xxx user, etc), you still get 404 errors for all php files.

To fix this:  IIS Manager -> expand local computer -> Web Services Extensions -> Add web service or extension -> .php, browse to c:\php\php-cgi.exe or wherever you had the php executable installed. That plus setting the doc_root in the .ini file solved the problem.

--BF
jeff_graham at datacenterservices dot net 01-Feb-2004 01:51
As stated within the note "jimo at mail dot azhsv dot com
29-Nov-2003 04:33
PHP 4 and IIS 6.0 (Windows Server 2003)," I found the same steps were requiered for installation of PhP 5 beta 3 on my Windows 2003 server (Standard Edition)
nigel dot salt at hotmail dot com 13-Dec-2003 05:00
Finally got IIS 5 and PHP 5 to talk.

What worked for me was:

1) Set
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
W3SVC\Parameters\Script Map]
".php"="your path to php\\php.exe"

2) ensure there is not a php.ini in the windows system folder and that there is one wherever you've put PHP

3) edit php.ini and set cgi force redirect to 0 and cgi.rfc2616_headers = 1

4) Put the PHP scripts in their own folder underneath the inetpub root

5) Open the IIS console, right click your new php folder
In the Directory tab
 set application name to the name of the folder
 set executable and script as permission
 set application protection to low
Click configuration and check that .php is mapped to wherever you put
PHP

Restart IIS

Try a very simple PHP page and it should work

Nigel
jimo at mail dot azhsv dot com 29-Nov-2003 07:33
PHP 4 and IIS 6.0 (Windows Server 2003)

Had difficulty getting PHP 4.3.3 to work with Win2003 Ent Server for use with SquirrelMail.  Problem found and believed solved.  Appears to be something New with IIS 6.0 (More security by Micro$oft)  Was getting 404 error and php was not being run as a cgi even though it was in extensions and IIS user had rights to execute it. (php from command line operated correctly)

If you are installing on Windows Server 2003 (only have Enterprise Edition ? Not sure if this applies to standard edition), and you have done the normal procedures for inclusion of PHP scripts (either ISAPI or CGI) in IIS, you will still get a 404 error when attempting to execute those scripts even though IIS has rights and the extension points to the correct file.  To alleviate this problem, perform the following:

1.    Open a command prompt window
2.    Change to C:\windows\system32
3.    Execute the command:  cscript  iisext.vbs /AddFile c:\php\php.exe 1 php 0 php
4.    Execute the command:  cscript iisext.vbs /EnFile c:\php\php.exe
5.    To check for correct execution of the above,
6.    Execute the command:  cscript IisExt.vbs /ListFile ? the php extension should be listed

If you try just step 4 without step 3 you get an error that the file is not in the list (and won?t be there till you do step 3 above)

After this, IIS seems to like the php extension and work normally.

For additional reference, see the below 3 Micro$oft KB Articles:
HOWTO: Enable and Disable ISAPI Extensions and CGI Applications in IIS 6.0 (MS KB Article 328360)

HOWTO List Web Server Extensions and Extension Files in IIS 6.0 (MS KB Article 328505)

HOWTO Add and Remove Web Service Extension Files in IIS 6.0 (MS KB Article 328419)
peter dot mosinskisNOSPAM at csuci dot edu 06-Mar-2003 12:36
Running Win2K AS + IIS5.0 + PHP 4.3.1, I ran into a nasty problem that I mistakenly thought had to do with something in the php.ini configuration. When I would try to submit a form using the HTTP method GET it would work, but I would get a "404 Page Not Found" error using the POST method.

All my permissions were set correctly, the php.ini was configured correctly. It had to do with URLScan being installed on IIS (see below)

Page 404 File Not Found Error When Using POST method in PHP (and Perl, and otherwise)
-------------------------------------------

This is related to the Microsoft URLScan utility. If you have this problem, the IIS administrator has probably run the IIS Lockdown tool as well as configured URLScan to reject this type of HTTP method when sent in a URL. These tools are meant to enhance web server security.

URLScan configuration files can be found in the \WINNT\system32\inetsrv\urlscan folder on the web server. Specifically, the file to modify is urlscan.ini.

The changes to make are as follows:
1. Make sure UseAllowVerbs=1 under [options]
2. Under the [AllowVerbs] section, list your allowed HTTP methods to include:
    GET
    POST

For more information on the IIS Lockdown tool and URLScan, visit http://technet.microsoft.com
monroe at peoplego dot com 17-May-2002 10:32
INSTALLATION ON OPENBSD 3.1 VIA PORTS COLLECTION
Would have succeed but no mysql support.
I commented out the FLAVORS+= dbase filepro mysql mysql_bundled postgresql iodbc in the /usr/ports/www/php4/Makefile and in the configure options added
--with-mysql=/usr/local   and it worked.

Good Luck


Problèmes de compilation

Cette section couvre les erreurs les plus communes pouvant se produire lors de la compilation de PHP.

  1. J'ai téléchargé la dernière version des sources de PHP en utilisant Git, mais il n'y a pas de script configure !
  2. J'ai des problèmes pour configurer PHP avec Apache. On m'indique que httpd.h n'est pas trouvé, mais il est bien là ou je l'ai spécifié !
  3. Pendant la configuration de PHP (./configure), vous rencontrez une erreur semblable à celle-ci : checking lex output file root... ./configure: lex: command not found configure: error: cannot find output from lex; giving up
  4. Quand je lance Apache, j'obtiens le message suivant : fatal: relocation error: file /path/to/libphp4.so: symbol ap_block_alarms: referenced symbol not found
  5. Quand je lance le ./configure, on me dit que les fichiers d'en-tête de GD, gdbm, ... ne sont pas trouvés !
  6. Quand le fichier language-parser.tab.c est compilé, j'obtiens un message yytname undeclared.
  7. Quand je lance make, tout semble bien se passer, mais ça échoue quand il essaie de lier l'application finale, en prétendant qu'il manque des fichiers.
  8. Au moment de lier PHP, il y a des références indéfinies.
  9. Je ne vois pas comment compiler PHP avec Apache 1.3.
  10. J'ai suivi toutes les étapes pour installer le module Apache sous Unix, mais malgré tout, mes scripts PHP s'affichent en clair dans mon navigateur ou celui-ci me demande de sauver le fichier.
  11. Il est dit d'utiliser --activate-module=src/modules/php4/libphp4.a, mais ce fichier n'existe pas, alors je l'ai changé pour --activate-module=src/modules/php4/libmodphp4.a et ça ne fonctionne pas. Qu'est ce qui se passe ?
  12. Quand j'essaie de compiler Apache avec PHP en module statique en utilisant --activate-module=src/modules/php4/libphp4.a on me répond que mon compilateur n'est pas conforme aux normes ANSI.
  13. Quand j'esaie de compiler PHP avec --with-apxs, j'obtiens des messages d'erreur étranges.
  14. Pendant le make, j'ai des erreurs concernant microtime et beaucoup de RUSAGE_.
  15. Quand je compile PHP avec le support MySQL, le configure se passe bien, mais pendant le make, j'obtiens une erreur de ce style : ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp', qu'est ce qui ne va pas ?
  16. Je veux mettre à jour mon PHP. Où puis-je trouver la ligne ./configure qui a été utilisée pour mon installation actuelle de PHP?
  17. Quand je compile PHP avec le support de la bibliothèque GD, j'obtiens des erreurs de compilation étrange, voire même des erreurs de segmentation.
  18. Quand je compile PHP, j'obtiens des erreurs aléatoires, voire même tout s'arrête. J'utilise Solaris.
J'ai téléchargé la dernière version des sources de PHP en utilisant Git, mais il n'y a pas de script configure !

Vous devez avoir le logiciel GNU autoconf d'installé pour générer le script configure à partir de configure.in. Lancez juste ./buildconf à la racine du répertoire des sources après avoir récupéré celles-ci à partir du serveur Git. (De plus, à moins que vous ne lanciez configure avec l'option --enable-maintainer-mode, le script configure ne sera pas automatiquement reconstruit si configure.in est mis à jour, vous obligeant à le faire à la main quand vous remarquez que configure.in est mis à jour. Une conséquence de ceci est que l'on trouve des choses telles que @VARIABLE@ dans votre Makefile après que configure ou config.status soit lancé.)

J'ai des problèmes pour configurer PHP avec Apache. On m'indique que httpd.h n'est pas trouvé, mais il est bien là ou je l'ai spécifié !

Vous devez spécifier au script de configuration (configure) l'emplacement du répertoire ou sont les sources de Apache. Cela signifie que vous devez spécifier --with-apache=/chemin/vers/apache et pas --with-apache=/chemin/vers/apache/src.

Pendant la configuration de PHP (./configure), vous rencontrez une erreur semblable à celle-ci :

checking lex output file root... ./configure: lex: command not found
configure: error: cannot find output from lex; giving up

Assurez-vous de bien avoir lu les instructions d'installation et d'avoir flex et bison d'installés pour compiler PHP. Selon votre système, vous devrez installer bison et flex à partir de sources ou bien de paquets, tel qu'un RPM.

Quand je lance Apache, j'obtiens le message suivant :

fatal: relocation error: file /path/to/libphp4.so:
symbol ap_block_alarms: referenced symbol not found

Cette erreur survient généralement quand quelqu'un compile le coeur Apache comme bibliothèque partagée DSO. Essayez de reconfigurer Apache, en vous assurant d'utiliser les options suivantes :

--enable-shared=max --enable-rule=SHARED_CORE

Pour davantage d'informations, lisez le fichier INSTALL à la racine de votre répertoire source Apache ou bien » le manuel des bibliothèques DSO.

Quand je lance le ./configure, on me dit que les fichiers d'en-tête de GD, gdbm, ... ne sont pas trouvés !

Vous pouvez forcer le script configure à chercher les fichiers d'en-tête à des endroits non-standard en passant des options supplémentaires au préprocesseur C et à l'éditeur de liens, par exemple :

    CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
Si vous utilisez une variante de csh, utilisez plutôt :
    env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure

Quand le fichier language-parser.tab.c est compilé, j'obtiens un message yytname undeclared.

Vous devez mettre à jour votre version de bison. Vous pourrez trouver la dernière version sur » http://www.gnu.org/software/bison/bison.html.

Quand je lance make, tout semble bien se passer, mais ça échoue quand il essaie de lier l'application finale, en prétendant qu'il manque des fichiers.

Certaines anciennes versions de make ne déplacent pas correctement les versions compilées des fichiers dans le répertoire functions. Essayez de lancer cp *.o functions et de relancer make pour voir si le problème est résolu. Si tel est le cas, vous devriez vraiment mettre à jour votre version de GNU make.

Au moment de lier PHP, il y a des références indéfinies.

Jetez un oeil à la ligne de lien et assurez-vous que toutes les bibliothèques nécessaires ont été incluses à la fin. Celles qui manquent probablement sont '-ldl' et les bibliothèques relatives aux bases de données dont vous voulez le support.

Des personnes nous ont rapporté qu'elle devaient ajouter '-ldl' immédiatement après libphp4.a lors de la compilation avec Apache.

Je ne vois pas comment compiler PHP avec Apache 1.3.

C'est relativement simple. Suivez attentivement ces étapes :

  • Téléchargez la dernière version de Apache 1.3 sur » http://httpd.apache.org/download.cgi.
  • Désarchivez le tout, par exemple dans /usr/local/src/apache-1.3.
  • Compilez PHP en lançant tout d'abord ./configure --with-apache=/<path>/apache-1.3 (remplacez <path> par le chemin de votre répertoire apache-1.3).
  • Tapez make puis make install pour compiler PHP et copier les fichiers nécessaires dans le répertoire source Apache.
  • Déplacez-vous dans votre répertoire /<path>/apache-1.3/src et éditez le fichier Configuration. Ajoutez y : AddModule modules/php4/libphp4.a.
  • Tapez : ./configure puis make.
  • Vous devriez alors avoir une bibliothèque httpd avec le support de PHP !

Note: Vous pouvez utiliser le nouveau script ./configure de Apache. Suivez les instructions du fichier README.configure fourni avec votre version de Apache. Lisez aussi le fichier INSTALL inclus avec les sources de PHP.

J'ai suivi toutes les étapes pour installer le module Apache sous Unix, mais malgré tout, mes scripts PHP s'affichent en clair dans mon navigateur ou celui-ci me demande de sauver le fichier.

Cela signifie que le module PHP n'est pas chargé, pour une raison ou pour une autre. Avant de chercher de l'aide ailleurs, veuillez vérifier ces quelques points :

  • Assurez-vous que le binaire httpd que vous exécutez est bien le nouveau binaire que vous avez compilé. Pour cela, essayez de lancer : /chemin/vers/le/binaire/httpd -l Si vous ne voyez pas mod_php4.c dans la liste, c'est que vous n'utilisez pas le bon binaire. Trouvez et installez correctement le bon binaire.
  • Assurez-vous que vous avez bien ajouté le bon type Mime à un de vos fichiers Apache .conf. Ce devrait être : AddType application/x-httpd-php .php Assurez-vous aussi que cette ligne Addtype n'est pas dissimulée dans un contexte de <Virtualhost> ou <Directory> qui l'empêcherait de s'appliquer à l'emplacement de vos scripts.
  • Enfin, l'emplacement par défaut des fichiers de configuration Apache a changé entre Apache 1.2 et Apache 1.3. Vous devriez vérifier que les fichiers de configuration auxquels vous ajoutez la ligne Addtype sont bien ceux qui sont pris en compte. Vous pouvez introduire une erreur de syntaxe dans votre httpd.conf (ou bien tout autre changement incorrect) pour vous assurer que c'est bien ce fichier qui est pris en compte.

Il est dit d'utiliser --activate-module=src/modules/php4/libphp4.a, mais ce fichier n'existe pas, alors je l'ai changé pour --activate-module=src/modules/php4/libmodphp4.a et ça ne fonctionne pas. Qu'est ce qui se passe ?

Notez que le fichier libphp4.a n'est pas supposé exister. Le processus apache le créera !

Quand j'essaie de compiler Apache avec PHP en module statique en utilisant --activate-module=src/modules/php4/libphp4.a on me répond que mon compilateur n'est pas conforme aux normes ANSI.

C'est un mauvais message d'erreur de Apache qui n'apparaît plus dans des versions plus récentes.

Quand j'esaie de compiler PHP avec --with-apxs, j'obtiens des messages d'erreur étranges.

Il y a trois choses à vérifier ici. Tout d'abord, quand Apache crée le script Perl apxs, il s'interrompt parfois en étant compilé sans le bon compilateur ou les bonnes options. Trouvez votre script apxs (lancez la commande which apxs), qui se trouve souvent à /usr/local/apache/bin/apxs ou bien /usr/sbin/apxs. Éditez-le et vérifiez que des lignes similaires sont présentes :

my $CFG_CFLAGS_SHLIB  = ' ';          # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = ' ';          # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = ' ';          # substituted via Makefile.tmpl
Si c'est ce que vous voyez, vous avez trouvé votre problème. Elles peuvent contenir juste des espaces ou d'autres valeurs incorrectes, comme 'q()'. Changez ces lignes pour obtenir :
my $CFG_CFLAGS_SHLIB  = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl
my $CFG_LD_SHLIB      = 'gcc';                   # substituted via Makefile.tmpl
my $CFG_LDFLAGS_SHLIB = q(-shared);              # substituted via Makefile.tmpl
Le deuxième problème potentiel est uniquement relatif aux distributions Red Hat 6.1 et 6.2. The scripts apxs de Red Hat est défectueux. Cherchez cette ligne :
my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install
Si vous la voyez telle quelle, changez-la en :
my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install
Enfin, si vous reconfigurez/réinstallez Apache, lancez un make clean entre votre ./configure et votre make.

Pendant le make, j'ai des erreurs concernant microtime et beaucoup de RUSAGE_.

Pendant le make, si vous rencontrez des problèmes identiques à celui-ci :

microtime.c: In function `php_if_getrusage':
microtime.c:94: storage size of `usg' isn't known
microtime.c:97: `RUSAGE_SELF' undeclared (first use in this function)
microtime.c:97: (Each undeclared identifier is reported only once
microtime.c:97: for each function it appears in.)
microtime.c:103: `RUSAGE_CHILDREN' undeclared (first use in this function)
make[3]: *** [microtime.lo] Error 1
make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/master/php-4.0.1/ext/standard'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/master/php-4.0.1/ext'
make: *** [all-recursive] Error 1

Votre système est défectueux. Vous devez corriger vos fichiers /usr/include en instalant un paquet glibc-devel qui correspond à votre version de la glibc. Cela n'a rien à voir avec PHP. Pour vous en convaincre, essayez ceci :

$ cat >test.c <<X
#include <sys/resource.h>
X
$ gcc -E test.c >/dev/null
Si vous obtenez des erreurs, c'est que vos fichiers d'en-tête sont mauvais.

Quand je compile PHP avec le support MySQL, le configure se passe bien, mais pendant le make, j'obtiens une erreur de ce style : ext/mysql/libmysqlclient/my_tempnam.o(.text+0x46): In function my_tempnam': /php4/ext/mysql/libmysqlclient/my_tempnam.c:103: the use of tempnam' is dangerous, better use mkstemp', qu'est ce qui ne va pas ?

Tout d'abord, il est important de savoir que ce n'est qu'un Warning et pas une erreur fatale. Comme c'est souvent la dernière erreur vu lors du make, ça a l'air d'une erreur fatale, mais ça n'en est pas une. Bien sûr, si vous demandez à votre compilateur de stopper à chaque Warning, ça en deviendra une. Notez aussi que le support de MySQL est activé par défaut.

Note:

Depuis PHP 4.3.2, vous verrez le texte suivant après la compilation (make) :

Build complete.
(It is safe to ignore warnings about tempnam and tmpnam).

Je veux mettre à jour mon PHP. Où puis-je trouver la ligne ./configure qui a été utilisée pour mon installation actuelle de PHP?

Vous pouvez jetez un oeil au fichier config.nice dans votre répertoire source ou sinon simplement exécuter un script

<?php phpinfo(); ?>
Au début du résultat affiché figure la ligne ./configure qui fût utilisée lors de la configuration de votre PHP actuel.

Quand je compile PHP avec le support de la bibliothèque GD, j'obtiens des erreurs de compilation étrange, voire même des erreurs de segmentation.

Assurez-vous que votre bibliothèque GD et PHP sont liés aux mêmes bibliothèques (libpng, par exemple).

Quand je compile PHP, j'obtiens des erreurs aléatoires, voire même tout s'arrête. J'utilise Solaris.

L'utilisation d'utilitaires non-GNU pour compiler PHP peut poser problème. Assurez-vous de bien utiliser des outils GNU pour être certain que votre compilation arrive à terme. Par exemple, sous Solaris, utiliser les version SunOS BSD-compatible ou Solaris de sed ne fonctionnera pas, mais utiliser les versions GNU ou Sun POSIX (xpg4) de sed fonctionnera. Liens : » GNU sed, » GNU flex et » GNU bison.

User Contributed Notes

synnus at gmail dot com 25-Jun-2017 10:10
j'ai réalisé pour vous une machine virtuel pour compiler php 7
il suffira d'utiliser mon logiciel pour télécharger l'image disque virtuel
qui fonctionne sous virtualbox ; cette image contient une version gratuite
légale de windows 10 proposé par Microsoft lui même Réarmable .
tout le nécessaire pour compiler php 7 sera sur le bureau.

Le dossier Release pour récupérer les fichiers compiler
le lancer de compilation avec les commandes
Buildconf
Configure
nmake ...

voir la documentation https://wiki.php.net/internals/windows/stepbystepbuild
tout est déjà pré configuré vous vous trouvez à la section "Compile"
partie "4.Run : "

pour télécharger l'image c'est ici
https://github.com/Darksynx/Compiling-php7-to-a-virtual-machine

=========

I realized for you a virtual machine to compile php 7
It will suffice to use my software to download the virtual disk image
Which runs under virtualbox; This image contains a free version
Legal of Windows 10 proposed by Microsoft itself Resettable.
All necessary to compile php 7 will be on the desktop.

The Release folder to recover the compile files
The compilation run with commands
buildconf
Sets
Nmake ...

See the documentation https://wiki.php.net/internals/windows/stepbystepbuild
Everything is already preconfigured you are in the section "Compile"
Party "4.Run:"

To download the image here
https://github.com/Darksynx/Compiling-php7-to-a-virtual-machine
Fabio 22-Feb-2012 01:47
When building PHP 5.3.x for Apache 2.4.x you may get an error in the apxs query for the MPM_NAME.
This is because the apxs included in Apache 2.4.x doesn't recognize that query anymore.

To resolve this issue one should modify the PHP configure file to use the right MPM module used by Apache.

To know the used MPM you can execute this command: apachectl -t -D DUMP_MODULES | grep mpm

Then, edit the PHP configure file, search for the APXS_MPM variable and force its value to prefork, event or worker according to the value returned by the previous command.

Hope it helps.
-
Fabio
terry at mackintoshweb dot com 19-Sep-2009 08:43
The configure script of PHP 5.3.0 has some test lines that use expr with the option --, my expr (version 2.0) does not except --.  This causes a run of error messages from the shell like:

./configure: line 2xxx: test: =: unary operator expected
expr: syntax error

I used buildconf --force to see if it would fix this.
While it resulted in a quit different file, it still had the lines of code with expr -- in it.
05-May-2007 06:48
@ anca-phpdoc at anca dot tv:

You can use ./configure --with-libxml-dir=/path_to_xml2-config
anca-phpdoc at anca dot tv 08-Dec-2005 07:48
For the configure newbies among us:

If you update or reinstall any of the libraries used to compile in a different directory than they started out, you will need to make sure that you update the config.cache file (or re-generate it) so that configure will not look in the wrong place for the information.

On Mac OS X, for example, I updated my libxml using Fink.  Fink placed the files in the /sw directory.  However, php was still looking for important libxml files (such as xml2-config) in the old directory (/usr/bin/xml2-config).   After updating config.cache with the new value of the xml2-config path, I was able to compile correctly.


Utiliser PHP

Cette section regroupe plusieurs erreurs que vous pouvez rencontrer lors de l'écriture de vos scripts PHP.

  1. Je ne me rappelle par de l'ordre des paramètres dans les fonctions PHP, sont-ils aléatoires ?
  2. J'aimerais écrire un script PHP générique qui pourrait traiter les données provenant de tout formulaire. Comment savoir quelles variables de la méthode POST sont disponibles ?
  3. Il faut que je convertisse tous les guillemets simples (') en un antislash suivi d'un guillemet simple (\'). Comment le faire avec une expression régulière ? J'aimerais aussi convertir " en \" et \ en \\.
  4.       Quand je fais ce qui suit, l'affichage se fait dans le mauvais ordre :

<?php
function mafonction($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo "mafonction($variable) = " . mafonction($variable);
?>

     que se passe-t-il ?
  5. Hey, où sont mes nouvelles lignes ? <pre> <?php echo "Ceci est ma première ligne."; ?> <?php echo "Celle-ci devrait s'afficher en dessous de la première."; ?> </pre>
  6. J'obtiens le message 'Warning: Cannot send session cookie - headers already sent...' ou 'Cannot add header information - headers already sent...'.
  7. J'ai besoin d'accéder à des informations dans l'en-tête de requête directement. Comment puis-je le faire ?
  8. Quand j'essaye d'utiliser l'identification avec IIS j'obtiens 'No Input file specified'.
  9. Windows: Je ne peux pas accéder aux fichiers partagés sur un autre ordinateur utilisant IIS
  10. Comment mélanger XML et PHP ? PHP se plaint de mes balises <?xml !
  11. Où puis-je trouver une liste complète des variables prédéfinies que je peux utiliser dans mes scripts PHP ?
  12. Comment puis-je générer des fichiers PDF sans utiliser les bibliothèques non libres PDFLib ? J'aimerais une façon gratuite et qui ne requiert pas de bibliothèques PDF externes.
  13. J'essaye d'accéder à une des variables standard CGI (comme $DOCUMENT_ROOT ou $HTTP_REFERER) dans une fonction écrite par moi-même, et il semblerait qu'elle ne soit pas définie. Que se passe-t-il ?
  14. Certaines directives PHP peuvent prendre des noms littéraux, et pas seulement des valeurs entier. Quelles sont tous les raccourcis disponibles?
  15. Windows: Il y a des echecs de connexions (timeouts) en utilisant localhost, alors que "127.0.0.1" fonctionne?
Je ne me rappelle par de l'ordre des paramètres dans les fonctions PHP, sont-ils aléatoires ?

PHP rassemble des centaines de bibliothèques externes et ça peut paraître parfois déroutant. Cependant, une règle simple à retenir :

Les paramètres concernant les fonctions sur les tableaux sont dans l'ordre "needle, haystack" tandis que les paramètres sur les fonctions gérants les chaînes sont exactement à l'opposé "haystack, needle".

J'aimerais écrire un script PHP générique qui pourrait traiter les données provenant de tout formulaire. Comment savoir quelles variables de la méthode POST sont disponibles ?

PHP fournit plusieurs variables pré-définies, comme la superglobale $_POST. Vous pouvez boucler sur $_POST puisque c'est un tableau associatif de toutes les valeurs envoyés par la méthode POST. Par exemple, bouclons dessus simplement avec foreach, vérifions les valeurs vides et affichons-les.

<?php
$empty = $post = array();
foreach ($_POST as $nomvar => $valeurvar) {
    if (empty($varvalue)) {
        $empty[$nomvar] = $valeurvar;
    } else {
        $post[$nomvar] = $valeurvar;
    }
}

echo '<pre>';
if (empty($empty)) {
    print "Aucune valeur POSTée n'est vide, postées :\n";
    var_dump($post);
} else {
    print "Nous avons " . count($empty) . " valeurs vides\n";
    print "Postées :\n"; var_dump($post);
    print "Vides :\n";  var_dump($empty);
    exit;
}
echo '</pre>';
?>

Il faut que je convertisse tous les guillemets simples (') en un antislash suivi d'un guillemet simple (\'). Comment le faire avec une expression régulière ? J'aimerais aussi convertir " en \" et \ en \\.

Si l'on suppose que c'est pour une base de données, utilisez le méchanisme d'échappement fourni avec la base de données. Par exemple, utilisez la fonction mysql_real_escape_string() avec MySQL et pg_escape_string() avec PostgreSQL. Il y a également les fonctions génériques comme addslashes() et stripslashes(), qui sont plus communes avec l'ancien code PHP.

Quand je fais ce qui suit, l'affichage se fait dans le mauvais ordre :
<?php
function mafonction($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo "mafonction($variable) = " . mafonction($variable);
?>
que se passe-t-il ?

Pour pouvoir utiliser le résultat de votre fonction dans une expression (comme le concaténer avec une chaîne comme dans cet exemple), vous devez retourner la valeur avec return, et non pas l'afficher avec echo.

Hey, où sont mes nouvelles lignes ?
<pre>
<?php echo "Ceci est ma première ligne."; ?>
<?php echo "Celle-ci devrait s'afficher en dessous de la première."; ?>
</pre>

En PHP, la fin d'un bloc de code est soit "?>" ou "?>\n" (où \n signifie une nouvelle ligne). Donc dans l'exemple plus haut, les phrases affichées le seront sur une seule ligne, car PHP oublie les nouvelles lignes après la fin du bloc. Cela signifie que vous devez insérer une nouvelle ligne de plus après chaque bloc de code PHP pour la lui faire afficher.

Pourquoi PHP fait-il cela ? Car lors du formatage du HTML, cela vous simplifie la vie car vous ne voulez pas de cette nouvelle ligne, mais vous devez créer de très longues lignes ou rendre la source brute de la page illisible pour arriver à cet effet.

J'obtiens le message 'Warning: Cannot send session cookie - headers already sent...' ou 'Cannot add header information - headers already sent...'.

Les fonctions header(), setcookie(), et les fonctions de session doivent ajouter des en-têtes au flux de sortie, mais ceux-ci ne peuvent être envoyés qu'avant le reste du contenu. Il ne doit y avoir aucun affichage avant d'utiliser ces fonctions, comme le HTML par exemple. La fonction headers_sent() vérifiera si votre script a déjà envoyé des en-têtes. Voyez aussi les fonctions de bufferisation de sortie.

J'ai besoin d'accéder à des informations dans l'en-tête de requête directement. Comment puis-je le faire ?

La fonction getallheaders() le fera si vous exécutez PHP en tant que module Apache. Le code suivant vous montrera tous les en-têtes de requête :

<?php
$headers = getallheaders();
foreach ($headers as $nom => $contenu) {
    echo "headers[$nom] = $contenu<br />\n";
}
?>

Voir aussi
apache_lookup_uri(),
apache_response_headers() et
fsockopen().

Quand j'essaye d'utiliser l'identification avec IIS j'obtiens 'No Input file specified'.

Le modèle sécuritaire de IIS est en faute. C'est un problème commun à tous les programmes CGI fonctionnant avec IIS. Une alternative est de créer un fichier HTML (non exécuté par PHP) comme page d'entrée dans le dossier où il faut s'identifier. Utilisez alors une balise META pour rediriger vers la page PHP, ou encore proposez un lien vers celle-ci. PHP reconnaîtra alors l'identification correctement. Cela ne devrait pas non plus affecter d'autres serveurs NT. Pour plus d'informations, voyez : » http://support.microsoft.com/kb/q160422/ et la section du manuel concernant l'identification HTTP.

Windows: Je ne peux pas accéder aux fichiers partagés sur un autre ordinateur utilisant IIS

Vous devez modifier le service Go to Internet Information Services. Localisez votre fichier PHP et éditez ces propriétés. Placez-vous sur l'onglet File Security, Edit -< Anonymous access and authentication control.

Vous pouvez résoudre ce souci soit en décochant la case Anonymous Access et en laissant la case Integrated Window Authentication cochée, soit en cochant la case Anonymous Access et en éditant l'utilisateur qui ne doit pas avoir les droits d'accès.

Comment mélanger XML et PHP ? PHP se plaint de mes balises <?xml !

Pour inclure <?xml dans votre code PHP, vous devrez désactiver les short tags en configurant la directive PHP short_open_tags à 0. Vous ne pouvez pas modifier cette directive avec ini_set(). Que short_open_tags soit à on ou off, vous pouvez toujours faire ceci : <?php echo '<?xml'; ?>. La valeur par défaut pour cette directive est On.

Où puis-je trouver une liste complète des variables prédéfinies que je peux utiliser dans mes scripts PHP ?

Lisez la page du manuel qui concerne les variables prédéfinies vu qu'elle présente une liste partielle des variables prédéfinies disponibles dans votre script. Une liste complète des variables disponibles (et beaucoup d'informations) peut être vue en appelant la fonction phpinfo(). Lisez la section du manuel traitant des variables non-issues de PHP, elle décrit des scénarios communs pour les variables externes, comme celles issues d'un formulaire HTML, d'un cookie, et de l'URL.

Note: register_globals : note importante

À partir de PHP 4.2.0, la valeur par défaut de la directive de configuration PHP register_globals vaut off. La communauté PHP décourage la dépendance à cette directive, et encourage l'utilisation d'autres moyens pour accéder aux données, tels que les superglobals.

Comment puis-je générer des fichiers PDF sans utiliser les bibliothèques non libres PDFLib ? J'aimerais une façon gratuite et qui ne requiert pas de bibliothèques PDF externes.

Il y a quelques alternatives écrites en PHP tel que » FPDF et » TCPDF.

J'essaye d'accéder à une des variables standard CGI (comme $DOCUMENT_ROOT ou $HTTP_REFERER) dans une fonction écrite par moi-même, et il semblerait qu'elle ne soit pas définie. Que se passe-t-il ?

Utilisez à la place $_SERVER['DOCUMENT_ROOT'] et $_SERVER['HTTP_REFERER'].

Certaines directives PHP peuvent prendre des noms littéraux, et pas seulement des valeurs entier. Quelles sont tous les raccourcis disponibles?

Les options disponibles sont K (pour Kilo octets) et M (pour mégaoctet) et G (pour gigaoctet ; disponible depuis PHP 5.1.0), ils sont insensibles à la casse. Tout autre syntaxe est supposée représenter des octets. 1M équivaut à un mégaoctet ou 1048576 octets. 1K équivaut à un kilooctet ou 1024 octets. Ces notations abrégées peuvent être utilisées dans le fichier php.ini et dans la fonction ini_set(). Notez que la valeur numérique est transtypé en entier ; par exemple, 0.5M est interprété comme 0.

Note: kilooctet contre kibibyte

La notation PHP décrit un kilooctet comme étant égal à 1024 octets, alors que le standard IEC considère ça comme un kibioctet (kibibyte). En bref: k et K = 1024 octets.

Windows: Il y a des echecs de connexions (timeouts) en utilisant localhost, alors que "127.0.0.1" fonctionne?

Avant PHP 5.3.4, il y avait un bug dans le code réseau de résolution des noms qui faisait échouer la résolution de localhost si IPv6 est activé. Utiliser "127.0.0.1" ne posait pas de problème, ou encore désactiver la résolution IPV6 dans le fichier hosts.

User Contributed Notes

robjbrain at gmail dot com 10-Oct-2016 04:37
There is no error message given if you accidentally use KB, MB or GB instead of K, M or G. From what I can tell the alphabetic characters will be ignored and it will be treated as bytes, so 1GB actually equals 1 Byte. phpinfo() and ini_get() will report what you have written e.g. 1GB, so it will not be clear that there is anything wrong with your setting even though there is.


Hachage de mots de passe sûr

Cette section explique les raisons d'utiliser des fonctions de hachage pour les mots de passe, ainsi que la façon de le faire efficacement.

  1. Pourquoi devrais-je hacher les mots de passe envoyés par les utilisateurs de mon application ?
  2. Pourquoi les fonctions traditionnelles de hachage comme md5 et sha1 sont-elles inappropriées aux mots de passe ?
  3. Alors, comment hacher mes mots de passe ?
  4. Qu'est ce que le grain de sel ?
  5. Comment stocker mes salts ?
Pourquoi devrais-je hacher les mots de passe envoyés par les utilisateurs de mon application ?

Le hachage de mot de passe est l'une des pratiques de sécurité les plus basiques qui doit être effectuée. Sans cela, chaque mot de passe stocké peut être volé si le support de stockage (typiquement une base de données) est compromis. Ce mot de passe peut alors être immédiatement utilisé pour accéder frauduleusement non seulement à votre application mais aussi sur d'autres applications si l'utilisateur utilise le même mot de passe ailleurs.

En appliquant un hachage sur le mot de passe avant de le stocker, vous rendez la tâche d'un attaquant très difficile pour connaitre le mot de passe original, et vous avez toujours la possibilité de comparer le mot de passe hashé à une chaîne reçue.

Il est important de noter que le hachage ne fait que protéger les mots de passe dans la base, pas leur éventuelle interception alors qu'ils sont envoyés à l'application par l'utilisateur, via du code malicieux injecté dans l'application, par exemple.

Pourquoi les fonctions traditionnelles de hachage comme md5() et sha1() sont-elles inappropriées aux mots de passe ?

Les algorithmes de hachage comme MD5, SHA1 et SHA256 sont destinés à être rapides et efficaces. Avec les équipements informatiques modernes, il est devenu facile d'attaquer par force brute la sortie de ces algorithmes pour retrouver la chaîne originale.

C'est la raison pour laquelle de nombreux experts en sécurité considèrent ces algorithmes comme faibles et les déconseillent fortement pour hacher un mot de passe utilisateur.

Alors, comment hacher mes mots de passe ?

Lorsqu'on hashe des mots de passe, les deux considérations les plus importantes sont le temps de traitement, et le grain de sel. Plus la puissance de traitement requise est élevée, plus il faudra du temps pour casser le mot de passe en analysant sa sortie.

PHP 5.5 fournit une API native de hachage de mot de passe qui gère à la fois le hachage et la vérification de mots de passe, le tout, de manière totalement sécurisée. Il existe aussi une » bibliothèque pure PHP de compatibilité pour PHP 5.3.7 et suivants.

Une autre option est la fonction crypt(), qui supporte différents algorithmes de hachage en PHP 5.3 et suivants. Lors de l'utilisation de cette fonction, vous avez la garantie que l'algorithme sélectionné est disponible, sachant que PHP contient une implémentation native de chaque algorithme supporté, dans le cas où un ou plusieurs algorithmes n'est pas supporté par votre système.

L'algorithme suggéré à utiliser pour le hachage de mots de passe est Blowfish, qui est aussi l'algorithme par défaut de l'API de hachage de mots de passe, sachant qu'il est significativement plus gourmand en calcul que MD5 ou SHA1, mais plus évolutif.

Notez que si vous utilisez la fonction crypt() pour vérifier un mot de passe, vous devez faire attention aux attaques de synchronisation, en utilisant une constante de temps pour la comparaison. Ni les opérateurs == et === ni la fonction strcmp() n'effectuent de comparaisons en utilisant des constantes de temps. Sachant que la fonction password_verify() le fera pour vous, vous êtes vivement encouragé à utiliser l'API native de hachage de mots de passe lorsque vous le pouvez.

Qu'est ce que le grain de sel ?

Un grain de sel, ou "salt", en cryptographie, est appliqué durant le processus de hachage pour éliminer la possibilité d'attaques par dictionnaires (hachages enregistrés dans une grande liste et comparés).

En d'autres termes, un grain de sel est une petite donnée additionnelle qui renforce significativement la puissance du hachage pour le rendre beaucoup plus difficile à cracker. Il existe de nombreux services en ligne qui proposent de volumineux dictionnaires de mots de passe avec leur hash. L'utilisation d'un grain de sel rend ces dictionnaires inutiles.

password_hash() va créer un salt aléatoire si vous n'en fournissez pas, et c'est généralement la façon la plus sécurisée et la plus simple.

Comment stocker mes salts ?

Lors de l'utilisation de la fonction password_hash() ou de la fonction crypt(), la valeur retournée inclue le salt comme parti du hash généré. Cette valeur devrait être stockée telle quelle dans votre base de données, sachant qu'elle inclue les informations sur la fonction de hachage utilisée et peut donc être fournie directement à la fonction password_verify() ou la fonction crypt() lors de la vérification des mots de passe.

Le diagramme suivant montre le format d'une valeur retournée de la fonction crypt() ou password_hash(). Comme vous pouvez le voir, tout est présent, comme toutes les informations sur l'algorithme et le salt nécessaires pour une future vérification de mots de passe.

Les composants de la valeur retournée par la fonction password_hash et crypt : dans l'ordre, l'algorithme choisi, les options de l'algorithme, le salt utilisé, et le mot de passe hashé.

User Contributed Notes

swardx at gmail dot com 29-Jun-2016 09:36
A great read..

https://nakedsecurity.sophos.com/2013/11/20/serious-security-how-to-store-your-users-passwords-safely/

Serious Security: How to store your users’ passwords safely

In summary, here is our minimum recommendation for safe storage of your users’ passwords:

    Use a strong random number generator to create a salt of 16 bytes or longer.
    Feed the salt and the password into the PBKDF2 algorithm.
    Use HMAC-SHA-256 as the core hash inside PBKDF2.
    Perform 20,000 iterations or more. (June 2016.)
    Take 32 bytes (256 bits) of output from PBKDF2 as the final password hash.
    Store the iteration count, the salt and the final hash in your password database.
    Increase your iteration count regularly to keep up with faster cracking tools.

Whatever you do, don’t try to knit your own password storage algorithm.
alf dot henrik at ascdevel dot com 12-Mar-2014 07:58
I feel like I should comment some of the clams being posted as replies here.

For starters, speed IS an issue with MD5 in particular and also SHA1. I've written my own MD5 bruteforce application just for the fun of it, and using only my CPU I can easily check a hash against about 200mill. hash per second. The main reason for this speed is that you for most attempts can bypass 19 out of 64 steps in the algorithm. For longer input (> 16 characters) it won't apply, but I'm sure there's some ways around it.

If you search online you'll see people claiming to be able to check against billions of hashes per second using GPUs. I wouldn't be surprised if it's possible to reach 100 billion per second on a single computer alone these days, and it's only going to get worse. It would require a watt monster with 4 dual high-end GPUs or something, but still possible.

Here's why 100 billion per second is an issue:
Assume most passwords contain a selection of 96 characters. A password with 8 characters would then have 96^8 = 7,21389578984e+15 combinations.
With 100 billion per second it would then take 7,21389578984e+15 / 3600 = ~20 hours to figure out what it actually says. Keep in mind that you'll need to add the numbers for 1-7 characters as well. 20 hours is not a lot if you want to target a single user.

So on essence:
There's a reason why newer hash algorithms are specifically designed not to be easily implemented on GPUs.

Oh, and I can see there's someone mentioning MD5 and rainbow tables. If you read the numbers here, I hope you realize how incredibly stupid and useless rainbow tables have become in terms of MD5. Unless the input to MD5 is really huge, you're just not going to be able to compete with GPUs here. By the time a storage media is able to produce far beyond 3TB/s, the CPUs and GPUs will have reached much higher speeds.

As for SHA1, my belief is that it's about a third slower than MD5. I can't verify this myself, but it seems to be the case judging the numbers presented for MD5 and SHA1. The issue with speeds is basically very much the same here as well.

The moral here:
Please do as told. Don't every use MD5 and SHA1 for hasing passwords ever again. We all know passwords aren't going to be that long for most people, and that's a major disadvantage. Adding long salts will help for sure, but unless you want to add some hundred bytes of salt, there's going to be fast bruteforce applications out there ready to reverse engineer your passwords or your users' passwords.
fluffy at beesbuzz dot biz 11-Jun-2012 11:33
The security issue with simple hashing (md5 et al) isn't really the speed, so much as the fact that it's idempotent; two different people with the same password will have the same hash, and so if one person's hash is brute-forced, the other one will as well.  This facilitates rainbow attacks.  Simply slowing the hash down isn't a very useful tactic for improving security.  It doesn't matter how slow and cumbersome your hash algorithm is - as soon as someone has a weak password that's in a dictionary, EVERYONE with that weak password is vulnerable.

Also, hash algorithms such as md5 are for the purpose of generating a digest and checking if two things are probably the same as each other; they are not intended to be impossible to generate a collision for.  Even if an underlying password itself requires a lot of brute forcing to determine, that doesn't mean it will be impossible to find some other bit pattern that generates the same hash in a trivial amount of time.

As such: please, please, PLEASE only use salted hashes for password storage.  There is no reason to implement your own salted hash mechanism, either, as crypt() already does an excellent job of this.


PHP et HTML

PHP et HTML sont très interactifs : PHP peut générer du HTML et HTML peut passer des informations à PHP. Avant de lire cette faq (foire aux questions), il est important que vous appreniez comment récupérer des variables externes à PHP. La page du manuel correspondante contient beaucoup d'exemples.

  1. Quel encodage/décodage ai-je besoin lors du passage d'une valeur via un formulaire/une URL ?
  2. J'essaye d'utiliser <input type="image"> mais les variables $foo.x et $foo.y ne sont pas disponibles. $_GET['foo.x'] n'existe pas non plus. Où sont-elles ?
  3. Comment créer un tableau dans une balise <form> HTML ?
  4. Comment puis-je récupérer le résultat d'un champ HTML SELECT multiple ?
  5. Comment puis-je passer une variable de Javascript vers PHP ?
Quel encodage/décodage ai-je besoin lors du passage d'une valeur via un formulaire/une URL ?

Il y a plusieurs étapes pour lesquelles le codage est important. En supposant que vous avez une chaîne de caractères $data, qui contient la chaîne que vous voulez passer de manière non-encodée, voici les étapes appropriées :

  • Interprétation HTML. Afin d'indiquer une chaîne aléatoire, vous devez l'inclure entre doubles guillemets et utiliser la fonction htmlspecialchars() pour encoder la chaîne.

  • URL : une URL est constituée de plusieurs parties. Si vous voulez que vos données soient interprétées comme un seul élément, vous devez les encoder avec la fonction urlencode().

Exemple #1 Un élément de formulaire HTML caché

<?php
    echo '<input type="hidden" value="' . htmlspecialchars($data) . '" />'."\n";
?>

Note: Il n'est pas correct d'utiliser la fonction urlencode() pour vos données $data, car il en est de la responsabilité du navigateur de les encoder. Tous les navigateurs populaires le font correctement. Notez que cela s'effectue sans considération de la méthode utilisée (c'est-à-dire GET ou POST). Vous devez uniquement noter ce cas pour les requêtes GET, car les requêtes POST sont généralement cachées.

Exemple #2 Données éditables par l'utilisateur

<?php
echo "<textarea name=\"mydata\">\n";
echo htmlspecialchars($data)."\n";
echo '</textarea>';
?>

Note: Les données sont montrées dans le navigateur comme prévues, car celui-ci interprétera les symboles HTML échappés. Au moment de la validation, via la méthode GET ou POST, les données devraient être url-encodées par le navigateur avant le transfert et directement url-décodées par PHP. Donc, finalement, vous n'avez pas à effectuer d'url-encodage/url-decodage vous-même, tout est effectué automatiquement.

Exemple #3 Dans une URL

<?php
    echo '<a href="' . htmlspecialchars("/nextpage.php?stage=23&data=" .
        urlencode($data)) . '">'."\n";
?>

Note: En fait, vous simulez une requête GET HTML, il est nécessaire d'utiliser manuellement la fonction urlencode() sur vos données.

Note: Vous devez utiliser htmlspecialchars() sur l'URL complète, car l'URL se comporte comme la valeur d'un attribut HTML. Dans ce cas, le navigateur fera un htmlspecialchars() sur la valeur et passera le résultat à l'URL. PHP devrait comprendre l'URL correctement, car vous avez url-encodé les données. Vous devez noter que & dans l'URL est remplacé par &amp;. Bien que la plupart des navigateurs devraient corriger cela si vous l'oubliez, ce n'est pas toujours le cas. Donc, même si votre URL n'est pas dynamique, vous devez utiliser la fonction htmlspecialchars() sur l'URL.

J'essaye d'utiliser <input type="image"> mais les variables $foo.x et $foo.y ne sont pas disponibles. $_GET['foo.x'] n'existe pas non plus. Où sont-elles ?

Lorsque vous validez un formulaire, il est possible d'utiliser une image au lieu du bouton standard de type "submit" avec une balise du type :

<input type="image" src="image.gif" name="foo" />
Lorsque l'utilisateur clique sur l'image, le formulaire est transmis au serveur avec deux variables supplémentaires : foo.x et foo.y qui représentent les coordonnées du point cliqué.

Comme foo.x et foo.y sont des noms de variables invalides en PHP, elles sont automatiquement converties en foo_x et foo_y. Les points sont remplacés par des soulignés. Donc, vous devez accéder à ces variables comme n'importe quelle autre variable tel que décrit dans la section "Variables provenant d'autres sources". Par exemple, en utilisant $_GET['foo_x'].

Note:

Les espaces dans les noms de variables sont également converties en un souligné bas.

Comment créer un tableau dans une balise <form> HTML ?

Pour envoyer le résultat du <form> comme un tableau de variables à votre script PHP, vous devez nommer, via l'attribut name, les balises <input>, <select> ou <textarea> comme cela :

<input name="MonTableau[]" />
<input name="MonTableau[]" />
<input name="MonTableau[]" />
<input name="MonTableau[]" />
Noter les crochets après le nom de la variable, c'est ce qui fait que celle-ci sera un tableau. Vous pouvez grouper les éléments dans différents tableaux de variables en assignant le même nom à différents éléments :
<input name="MonTableau[]" />
<input name="MonTableau[]" />
<input name="MonAutreTableau[]" />
<input name="MonAutreTableau[]" />
Cela produira deux tableaux de variables, MonTableau et MonAutreTableau, qui seront envoyés au script PHP. Il est également possible d'assigner des clés spécifiques à votre tableau :
<input name="UnAutreTableau[]" />
<input name="UnAutreTableau[]" />
<input name="UnAutreTableau[email]" />
<input name="UnAutreTableau[telephone]" />
Le tableau UnAutreTableau contiendra les clés 0, 1, email et telephone.

Note:

Le fait de spécifier une clé à un tableau est optionnel en HTML. Si vous ne le faites pas, les clés du tableau suiveront l'ordre d'apparition des éléments dans le formulaire. Dans notre premier exemple, le tableau contient les clés 0, 1, 2 et 3.

Voir aussi les fonctions sur les tableaux de variables et la section sur les variables provenant d'autres sources.

Comment puis-je récupérer le résultat d'un champ HTML SELECT multiple ?

Le champ SELECT multiple en HTML permet à l'utilisateur de sélectionner plusieurs éléments d'une liste. Ces éléments seront transmis à la page pointée par l'attribut action de la balise form. Le problème est que ces éléments sont tous passés avec le même nom de variable.

<select name="var" multiple="yes">
Chaque option sélectionnée arrivera au mécanisme de traitement sous la forme :
var=option1
var=option2
var=option3
Chaque option effacera donc le contenu de la précédente variable $var. La solution consiste à utiliser un tableau de variables dans cet élément de formulaire HTML, par exemple :
<select name="var[]" multiple="yes">
Cela fera que PHP traitera $var comme un tableau de variables et que chaque assignement de valeur à var[] ajoutera un index au tableau. La première option choisie sera mise dans $var[0], la suivante sera mise dans $var[1], etc. La fonction count() peut être utilisée pour déterminer combien d'options ont été sélectionnées, et la fonction sort() peut être utilisée pour trier le tableau, si nécessaire.

Notez que si vous utilisez Javascript, [] dans le nom de l'élément peut vous poser problème lorsque vous tenterez d'accéder à celui-ci par son nom. Utilisez plutôt l'indice numérique de l'élément dans ce cas, ou bien utilisez les simples guillemets pour entourer cet élément, comme :

variable = document.forms[0].elements['var[]'];

Comment puis-je passer une variable de Javascript vers PHP ?

Javascript est (habituellement) une technologie côté client et PHP est (habituellement) une technologie côté serveur et sachant que HTTP est un protocole statique, les deux langages ne peuvent pas directement partager des variables.

Cependant, il est possible de faire passer des variables entre les deux. Une des solutions pour cela est de générer un code Javascript à l'aide de PHP et de faire rafraîchir le navigateur tout seul, passant ainsi des variables spécifiques au script PHP. L'exemple suivant montre précisément comme réaliser cela -- il permet à PHP de récupérer les dimensions de l'écran du client, ce qui est normalement possible qu'en technologie coté client.

Exemple #4 Génération de Javascript avec PHP

<?php
if (isset($_GET['largeur']) AND isset($_GET['hauteur'])) {
  // Affichage des variables
  echo 'La largeur de l\'écran est : ' . $_GET['largeur'] ."<br />\n";
  echo 'La hauteur de l\'écran est : ' . $_GET['hauteur'] . "<br />\n";
} else {
  // passage des variables de dimensions
  // (préservation de la requête d'origine
  //   -- les variables par méthode POST doivent être traitées différemment)

  echo "<script type=\"text/javascript\">\n";
  echo "  location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}"
            . "&largeur=\" + screen.width + \"&hauteur=\" + screen.height;\n";
  echo "</script>\n";
  exit();
}
?>

User Contributed Notes

murphy 28-Jan-2020 08:58
The scenario:

1. There is a php script which (possibly complemented by a direct written HTML code) consrtucts a HTML page via its echo command, based on whatever algoritmus eventually based on supplementary data from server files or databases.

2. This php script leads to data being saved into string variable(s), which (possibly) can contain arbitrary characters, including control codes (newline, tab...), HTML special characters (&,<...) and non-ASCII (international) characters.

3. These non-ASCII characters are UTF-8 encoded, as well as the HTML page (I do highly recommend) *)

4. The values of these PHP string variables have to be transferred into javascript variables for further processing by javascript (or exposing these values in HTML directly)

The problem:

it is not safe to PHP-echo such variables into HTML (javascript) directly, because some of characters possily contained in them cause malfunction of the HTML. These strings need some encoding/escaping in order to become strings of non-conflicting characters

The solution

There may be a big lot of ways of this encoding. The following one seems to me the easiest one:
The PHP variable with unpredictable value can originate from some file, as an example (or from user input as well):

$variable=file_get_content(...)

1. Convert all bytes of that string into hex values and prepend all hex-digit-pairs with %

$variable_e=preg_replace("/(..)/","%$1",bin2hex($variable))

The new variable is now guarantied to contain only %1234567890abcdefABCDEF chracters (e.g. %61%63%0a...) and can safely be directly echoed into HTML:

var variable="<?php echo $variable_e;?>" //that's NOT all folks

But now the value is still encoded. To get the original value of the variable, it has te be decoded: *)

var variable=decodeURIComponent("<?php echo $variable_e;?>")

The value of the variable is now the same as the original value.

*) I have no idea about non-UTF-8 encoded pages/data, espetially how the decodeURIComponent works in such a case, because i have no reason to use other encodings and handle them as highly deprecatad.

WARNING: this approach is not (generally) safe against code injection. I highly recommend some further check (parsing) of the value depending on the particular case.

P.S. For very large amount of data, I would recomment to save them into file on the PHP side (file_put_content) and read them by javascript via HTTP Request.

I use this approach as it needs one line of code on server as well as client side. I do agree with arguement that not all chaeacters have to be encoded.

Do not enjoy my possibly stupid solution, if you have a better idea

murphy
starbugfourtytwo at gmail dot com 29-May-2019 11:04
Why use such a complicated example for js to php? why not do this..so we can understand:

javascript:

const variable = "A"

php:

do whatever it takes to get A from javascript
smileytechguy at smileytechguy dot com 02-Feb-2018 04:55
The (at least that I've found) best way to pass data from PHP to JS is json_encode.  Doing so will convert arrays, strings, numbers, etc. as best as possible.

<?php
$myInt = 7;
// a bunch of special characters to demonstrate proper encoding
$myString = <<<EOF
" ' ; &\ $
EOF;
$myArr = [1, "str", 2];
$myAssocArr = ["foo" => "bar"];
?>

<script>
var myInt = <?= json_encode($myInt) ?>;
var myString = <?= json_encode($myString) ?>;
var myArr = <?= json_encode($myArr) ?>;
var myAssocArr = <?= json_encode($myAssocArr) ?>;
</script>

This will render the following JS code, which correctly stores the variables:
<script>
var myInt = 7;
var myString = "\" ' ; &\\ $";
var myArr = [1,"str",2];
var myAssocArr = {"foo":"bar"};
</script>

Do note that there are no "s or anything like that around the json_encode output; json_encode handles that for you.
Jay 01-Apr-2014 09:25
If you have a really large form, be sure to check your max_input_vars setting.  Your array[] will get truncated if it exceeds this.  http://www.php.net/manual/en/info.configuration.php#ini.max-input-vars
jetboy 30-Dec-2005 07:06
While previous notes stating that square brackets in the name attribute are valid in HTML 4 are correct, according to this:

http://www.w3.org/TR/xhtml1/#C_8

the type of the name attribute has been changed in XHTML 1.0, meaning that square brackets in XHTML's name attribute are not valid.

Regardless, at the time of writing, the W3C's validator doesn't pick this up on a XHTML document.


PHP et COM

PHP peut être utilisé pour accéder à des objets COM et DCOM sur les plates-formes Win32.

  1. J'ai compilé une DLL pour calculer quelque chose. Y a-t-il un moyen d'utiliser cette DLL sous PHP ?
  2. Que signifie 'Unsupported variant type: xxxx (0xxxxx)' ?
  3. Est-il possible de manipuler des objets visuels en PHP ?
  4. Puis-je stocker un objet COM dans une session ?
  5. Comment puis-je intercepter des erreurs COM ?
  6. Puis-je générer des fichiers DLL à partir de PHP comme je le fais avec Perl ?
  7. Que signifie 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}' ?
  8. Comment puis-je utiliser des objets COM à partir d'un serveur distant ?
  9. J'obtiens 'DCOM is disabled in C:\path...\scriptname.php on line 6', que dois-je faire ?
  10. Est-il possible de charger/manipuler des objets ActiveX dans une page en PHP ?
  11. Est-il possible d'obtenir une instance fonctionnelle d'un composant ?
  12. Y a-t-il moyen de manipuler un événement envoyé par un objet COM ?
  13. J'ai des problèmes quand j'invoque une méthode d'un objet COM qui expose plus d'une interface. Que puis-je faire ?
  14. Bon, PHP fonctionne avec COM, mais qu'en est-il de COM+ ?
  15. Si PHP peut manipuler des objets COM, peut-on imaginer d'utiliser des ressources de composants, en conjonction avec PHP ?
J'ai compilé une DLL pour calculer quelque chose. Y a-t-il un moyen d'utiliser cette DLL sous PHP ?

Si c'est une DLL simple, il n'y a aucun moyen pour le moment de l'utiliser avec PHP. Si la DLL contient un serveur COM, vous pourrez l'utiliser si elle implémente l'interface IDispatch.

Que signifie 'Unsupported variant type: xxxx (0xxxxx)' ?

Il y a des dizaines de types de VARIANT et de combinaisons entre elles. La plupart d'entre elles sont déjà supportées, mais quelques une ne sont toujours pas implémentées. Les tableaux ne sont pas complètement supportés. Seuls le tableaux unidimensionnels indexés peuvent être transmis entre PHP et COM. Si vous trouvez d'autres types qui ne sont pas supportés, reportez-les nous comme un bogue (si ce n'est pas déjà fait) et fournissez le plus d'informations possibles.

Est-il possible de manipuler des objets visuels en PHP ?

Généralement, c'est possible, mais comme PHP est utilisé le plus souvent en tant que langage de script web et dans un environnement de serveur web, les objets visuels n'apparaîtront jamais sur le bureau du serveur. Si vous voulez utiliser PHP pour scripter des applications, par exemple avec PHP-GTK, il n'y a aucune limitation à accéder et manipuler des objets visuels via COM.

Puis-je stocker un objet COM dans une session ?

Non, vous ne pouvez pas. Les instances COM sont traitées comme des ressources, ce qui signifie qu'elles ne sont disponibles que dans un seul contexte de script.

Comment puis-je intercepter des erreurs COM ?

L'extension COM envoie des exceptions com_exception, que vous pouvez intercepter en inspectant le membre code pour déterminer que faire.

Puis-je générer des fichiers DLL à partir de PHP comme je le fais avec Perl ?

Non, il n'y a malheureusement pas d'outil disponible pour le faire en PHP.

Que signifie 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}' ?

Cette erreur peut avoir plusieurs causes :

  • le CLSID est incorrect
  • la DLL demandée est introuvable
  • le composant demandé n'implémente pas l'interface IDispatch

Comment puis-je utiliser des objets COM à partir d'un serveur distant ?

Exactement de la même manière qu'avec des objets locaux. Vous devez juste passer l'adresse IP de la machine distante en deuxième paramètre du constructeur COM.

Assurez-vous que vous avez spécifié com.allow_dcom =true dans votre php.ini.

J'obtiens 'DCOM is disabled in C:\path...\scriptname.php on line 6', que dois-je faire ?

Éditez votre php.ini et mettez com.allow_dcom =true.

Est-il possible de charger/manipuler des objets ActiveX dans une page en PHP ?

Cela n'a rien à voir avec PHP. Les objets ActiveX sont chargés côté client s'ils sont demandés par le document HTML. Il n'y a aucune relation avec le script PHP et il n'y a pas d'interaction directe possible avec le serveur.

Est-il possible d'obtenir une instance fonctionnelle d'un composant ?

C'est possible avec l'aide de monikers. Si vous voulez des références multiples au même mot d'instance, vous pouvez créer une instance de la façon suivante :

<?php
$word = new COM("C:\docs\word.doc");
?>

Cela créera une nouvelle instance s'il n'y en a aucune disponible ou retournera un descripteur vers l'instance courante, si elle est disponible.

Y a-t-il moyen de manipuler un événement envoyé par un objet COM ?

Vous pouvez définir un moniteur d'événement (sink) et le lier en utilisant com_event_sink(). Vous pouvez utiliser com_print_typeinfo() pour que PHP génère un squelette pour la classe du moniteur d'événement.

J'ai des problèmes quand j'invoque une méthode d'un objet COM qui expose plus d'une interface. Que puis-je faire ?

La réponse est aussi simple que non satisfaisante. Je ne sais pas exactement, mais je pense que vous ne pouvez rien faire. Si quelqu'un a des informations spécifiques sur ce sujet, faites-le » moi savoir :)

Bon, PHP fonctionne avec COM, mais qu'en est-il de COM+ ?

COM+ étend COM avec un canevas pour gérer des composants via MTS et MSMQ mais il n'y a rien de particulier que PHP doit supporter pour utiliser de tels composants.

Si PHP peut manipuler des objets COM, peut-on imaginer d'utiliser des ressources de composants, en conjonction avec PHP ?

PHP ne supporte pas encore les transactions. Ainsi, si une erreur se produit, aucun rollback n'est initié. Si vous utilisez des composants qui supportent les transactions, vous devrez implémenter le gestionnaire de transactions par vous-même.

User Contributed Notes

codeslinger at compsalot dot com 27-Jan-2007 05:18
in response to item #1 above:  "If this is a simple DLL there is no way yet to run it from PHP."

Answer: There are several different packages/add-ons to php that enable low level access to the windows api. One of the most popular of these packages is available at http://www.winbinder.org

Winbinder does have the ability to load a dll and call it's functions.  Winbinder also provides a large set of windows apis for creating windows and controls.  This is useful for creating stand-alone desktop apps.  It is a possible alternative to php-gtk.

I've had mixed results with Winbinder, some things work very well, others are buggy; source code is available.  It's worth a look, Evaluate carefully.
17-Jul-2005 04:56
Re: The Windows English CHM Sample with MS Word Automation.

I see that $Word->Release() is called after $Word->Quit().
This seems to be erroneous. Actually, $Word->Release() should not have to be called if proper COM garbage collection is taking place. Release() is a C++ construction not used in either Visual Basic or VBScript or even MS-JScript. Just to be sure, however, I ran the sample through php.exe (5.04 CLI on Windows XP SP1 with Office 2003) and got a RPC failed error on the line containing $Word->Release(). The rest of the sample works fine, and the results are as expected. So, I propose 2 scenarios:
      1.There is a problem with the documentation (more likely).
      2.There is a problem with PHP504 itself, as this problem is reproduced with any COM Automation call, not just Word.
junk.ghost@virgin dOtt net 05-Oct-2004 09:27
It may be obvious to everyone else but...

If you want to write your own COM DLL in MSVC++6 and you want to pass it a string, you need the following in your .idl file:

HRESULT function_name([in] BSTR parameter_name,
                      [retval, out] BSTR * retval);

retval is the result of your function as a string to be passed back.

BSTR is an unsigned short *, so if you want to use your string with STL string etc. you may need to convert parameters to and from char *.

The burden of my message is that from PHP

$comThing = new COM("comThing.comThing");
print $comThing->function_name("Jeremy");

Jeremy will be marshalled as wide chars, which match BSTR.


Questions diverses

Il y'a quelques questions inclassables. Vous les trouverez ici.

  1. Comment puis-je manipuler le manuel compressé en bzip2 sous Windows ?
Comment puis-je manipuler le manuel compressé en bzip2 sous Windows ?

Si vous n'avez pas d'outil d'archivage prenant en charge les fichiers au format bz2, » téléchargez l'outil en ligne de commande à partir de Redhat (merci de lire les informations plus bas).

Si vous préférez ne pas utiliser d'outil en ligne de commande, vous pouvez essayer des outils gratuits comme » Stuffit Expander, » UltimateZip, » 7-Zip, ou » Quick Zip. Si vous avez des outils comme » WinRAR ou » Power Archiver, vous pouvez facilement décompresser les fichiers bz2 avec. Si vous utilisez Total Commander (autrefois Windows Commander), un plugin bz2 est disponible gratuitement sur le site de » Total Commander.

L'outil en ligne commande bzip2 de Redhat :

Les utilisateurs du service pack 2 de Win2K doivent prendre la version 1.0.2, tous les autres utilisateurs de Windows doivent prendre la version 1.00. Après avoir téléchargé, renommez l'exécutable en bzip2.exe. Pour votre convenance, mettez-le dans un dossier dans votre path, c'est à dire C:\Windows où C représente votre disque où Windows est installé.

Note : Dans ce qui suit, lang représente votre langue et x le format désiré, par exemple : pdf. Pour décompresser php_manual_lang.x.bz2 suivez les instructions suivantes :

  • ouvrez un invite de commande
  • déplacez-vous dans le dossier où se trouvent les fichiers php_manual_lang.x.bz2
  • lancez la commande bzip2 -d php_manual_lang.x.bz2, pour extraire php_manual_lang.x dans ce même dossier

Dans le cas où vous avez téléchargé le fichier php_manual_lang.tar.bz2 avec beaucoup de fichiers HTML à l'intérieur, la procédure est la même. La seule différence est que vous obtiendrez un fichier php_manual_lang.tar. Le format tar est connu pour être pris en compte par la plupart des archiveurs de Windows, comme » WinZip.

User Contributed Notes

doerr at apkk dot de 28-Dec-2010 05:41
If you only needed register_globals for get/post variables, the effictive solution for 5.3 is:
  import_request_variables("GPC", "");

But if the skripts relied on session_register() you'll have to do more:
- Replace all variables that appeared after session_register with _SESSION equivalents - so $myvar becomes $_SESSION['myvar']
- Take care if your variables appeared inside strings - 'Hello $user !' works, but 'Hello $_SESSION['user'] !' not - so you have to concatenate the string: 'Hello '.$_SESSION['user'] .' !'
- Session variables in function declarations (for whatever purpose) will not work - keeping the old (local) names will work in most cases.
- Finally, replace the session_register(..) line with session_start()
markus 18-Jun-2005 03:34
Considering the comment below. I think there's a way to avoid that "problem":

<?php
//
// $starttime is an example of a variable that we might need to define,
// even before, running the "register_globals OFF" emulator below.
//
list($msec, $sec) = explode(' ', microtime());
$starttime = ((float)$msec + (float)$sec);

//
// If register_globals is ON, ensure no unexpected globals are defined.
// ie. We'll try to emulate a register_globals OFF environment.
//
if( (bool)@ini_get('register_globals') )
{
    $superglobals = array($_ENV, $_GET, $_POST, $_COOKIE, $_FILES, $_SERVER);
    if( isset($_SESSION) )
    {
        array_unshift($superglobals, $_SESSION);
    }
    $knownglobals = array(
        //
        // Known PHP Reserved globals and superglobals:
        //
        '_ENV',        'HTTP_ENV_VARS',
        '_GET',        'HTTP_GET_VARS',
        '_POST',    'HTTP_POST_VARS',
        '_COOKIE',    'HTTP_COOKIE_VARS',
        '_FILES',    'HTTP_FILES_VARS',
        '_SERVER',    'HTTP_SERVER_VARS',
        '_SESSION',    'HTTP_SESSION_VARS',
        '_REQUEST',

        //
        // Global variables used by this code snippet:
        //
        'superglobals',
        'knownglobals',
        'superglobal',
        'global',
        'void',

        //
        // Known global variables defined before this code snippet is reached.
        //
        'starttime',
    );
    foreach( $superglobals as $superglobal )
    {
        foreach( $superglobal as $global => $void )
        {
            if( !in_array($global, $knownglobals) )
            {
                unset($GLOBALS[$global]);
            }
        }
    }
}
?>

Note the stuff related to the $_SESSION array depends on whether the PHP session has been started or not. You might want to call session_start() before this point (or set session.auto_start ON).

HTH+ :)
php at REMOVEMEkennel17 dot co dot uk 12-Apr-2005 08:22
Regarding simulating register_globals = off, note that it is impossible to adequately prevent $_SESSION variables from being globalised, as the array (and thus the globals) are created on a call to session_start().  You would therefore have to 'undo' this when you start a session as using it at the start of your script will have no effect.

To avoid potential problems, use a prefix that is unique for all session variables (e.g. 'SESS_'), and only access them via the $_SESSION array.  The prefix ensures that you don't have a naming clash (and therefore a security risk) with any non-session globals.


Annexes

  • Histoire de PHP
    • Histoire de PHP
    • Quelques projets liés à PHP
    • Livres traitant de PHP
    • Publications à propos de PHP
  • Migrating from PHP 7.4.x to PHP 8.0.x
    • New Features
    • Backward Incompatible Changes
    • Deprecated Features
    • Other Changes
  • Migration de PHP 7.3.x vers PHP 7.4.x
    • Nouvelles fonctionnalités
    • Nouvelles Classes et Interfaces
    • Nouvelles fonctions
    • Nouvelles constantes globales
    • Modifications entrainant une incompatibilité ascendante
    • Fonctionnalités obsolètes
    • Extensions supprimées
    • Autres changements
    • Gestion de Windows
  • Migration de PHP 7.2.x vers PHP 7.3.x
    • Nouvelles fonctionnalités
    • Nouvelles fonctions
    • Nouvelles constantes globales
    • Modifications entrainant une incompatibilité ascendante
    • Fonctionnalités devenues obsolètes
    • Autres changements
    • Support de Windows
  • Migration de PHP 7.1.x vers PHP 7.2.x
    • Nouvelles fonctionnalités
    • Nouvelles fonctions
    • Nouvelles constantes globales
    • Évolutions incompatibles avec les versions précédentes
    • Fonctionnalités devenues obsolètes en PHP 7.2.x
    • Autres changements
  • Migration de PHP 7.0.x vers PHP 7.1.x
    • Nouvelles fonctionnalités
    • Nouvelles fonctions
    • Nouvelles constantes globales
    • Modifications entrainant une incompatibilité ascendante
    • Les fonctionnalités dépréciées dans PHP 7.1.x
    • Fonctions modifiées
    • Autres changements
    • Support Windows
  • Migration de PHP 5.6.x vers PHP 7.0.x
    • Modifications entrainant une incompatibilité ascendante
    • Nouvelles fonctionnalités
    • Les fonctionnalités dépréciées dans PHP 7.0.x
    • Fonctions modifiées
    • Nouvelles fonctions
    • Nouvelles Classes et Interfaces
    • Nouvelles constantes globales
    • Modifications des modules SAPI
    • Extensions et SAPI supprimés
    • Autres changements
  • Migration de PHP 5.5.x à PHP 5.6.x
    • Modifications entrainant une incompatibilité ascendante
    • Nouvelles fonctionnalités
    • Fonctionnalités devenues obsolètes en PHP 5.6.x
    • Fonctions modifiées
    • Nouvelles fonctions
    • Changement pour OpenSSL dans PHP 5.6.x
    • Autres modifications dans les extensions
    • Nouvelles constantes globales
  • Débogueur PHP
    • À propos du débogueur en PHP
  • Options de configuration
    • Liste des options de configuration internes
  • Directives du php.ini
    • Liste des directives du php.ini
    • Liste des sections du fichier php.ini
    • Description des directives internes du php.ini
  • Catégorie/Liste des extensions
    • Par ordre alphabétique
    • Adhésion
    • État
  • Liste des alias
  • Mots réservés en PHP
    • Liste de mots-clés
    • Classes prédéfinies
    • Constantes pré-définies
    • Autre liste de mots réservés
  • Types des ressources PHP
  • Liste des filtres standards
    • Filtres de chaînes de caractères
    • Filtres de conversion
    • Filtres de compression
    • Filtres de chiffrement
  • Liste des modes de transport de sockets disponibles
    • Domaines Internet : TCP, UDP, SSL et TLS
    • Domaine Unix : UNIX et UDG
  • Comparaison de types en PHP
  • Liste des tokens de l'analyseur
  • Guide de nommage de l'espace utilisateur
    • Espace de noms global
    • Règles
    • Astuces
  • À propos du manuel
    • Formats
    • À propos des notes utilisateurs
    • Comment lire la définition d'une fonction (prototype)
    • Versions de PHP documentées dans ce manuel
    • Où trouver plus d'informations sur PHP ?
    • Comment aider à l'amélioration de la documentation ?
    • Comment sont générées les documentations
    • Traductions
  • Creative Commons Attribution 3.0
  • Liste de l'index
    • Liste des fonctions et des méthodes
    • Liste d'examples
  • Historique des modifications

User Contributed Notes

There are no user contributed notes for this page.


Histoire de PHP

Sommaire

  • Histoire de PHP
  • Quelques projets liés à PHP
  • Livres traitant de PHP
  • Publications à propos de PHP

PHP a suivi un long chemin depuis sa naissance au milieu de l'année 1990. Depuis ses débuts modestes, jusqu'à devenir l'un des plus éminents langage de programmation pour le web, l'évolution de PHP est un véritable conte de fées technologique. Figurez-vous qu'une telle croissance n'a pas été tâche facile. Ceux d'entre vous qui sont intéressés par un bref récapitulatif de ce qu'a été l'histoire de PHP jusqu'à aujourd'hui, poursuivez la lecture de ce document. Si vous souhaitez récupérer des pièces uniques de l'histoire d'Internet, vous pouvez trouver les anciennes versions de PHP dans notre » musée.

User Contributed Notes

tarlepp 21-Jul-2017 12:01
It seems like PHP7 is missing here totally, also some comment about why skip PHP6 version would be nice.


Histoire de PHP

PHP Tools, FI, Construction Kit, et PHP/FI

PHP, tel qu'il est connu aujourd'hui, est le successeur d'un produit appelé PHP/FI. Créée en 1994 par Rasmus Lerdorf, la toute première incarnation de PHP était un simple jeu de binaires CGI écrits en langage C. Originairement utilisée pour suivre les visiteurs de son curriculum vitae en ligne, il nomme cette suite de scripts "Personal Home Page Tools" (ndt : Outils pour page personnelle), plus fréquemment appelée "PHP Tools". Au fil du temps, de plus en plus de fonctionnalités sont demandées, et Rasmus ré-écrit les outils PHP, produisant ainsi une implémentation plus large et plus riche. Ce nouveau modèle était capable d’interagir avec une base de données, mais aussi, fournissait un framework permettant aux utilisateurs de développer une application dynamique simple pour le web, comme des livres d'or. En Juin 1995, Rasmus » fournit le code source de PHP Tools au grand public, permettant ainsi aux développeurs de l'utiliser comme bon leur semblait. Ceci a également permis - et encouragé - aux utilisateurs de fournir des patches pour corriger les bogues, mais aussi pour éprouver la stabilité du produit.

En septembre de cette année là, Rasmus continua d'élargir PHP et - pour un temps très court - supprima le nom PHP. Faisant dorénavant référence aux outils sous le nom de FI (abréviation pour "Forms Interpreter" ou interpréteur de formulaire), la nouvelle implémentation incluait plusieurs fonctionnalités de base que nous connaissons encore aujourd'hui. Elle avait ces variables qui ressemblent au Perl, un système d'interprétation automatique des variables de formulaires, et une syntaxe qui s'intègre facilement dans HTML. La syntaxe elle-même était similaire à celle du Perl, bien que beaucoup plus limitée, plus simple, et un peu incohérente. En fait, pour embarquer du code dans un fichier HTML, les développeurs devaient utiliser des commentaires HTML. Malgré le fait que cette méthode ne soit pas accueillie avec un grand enthousiasme, FI continua de rassembler de plus en plus de monde, et fut accepté comme outil CGI --- mais toujours pas comme un langage. Cependant, ceci commença à changer les mois suivants ; en octobre 1995, Rasmus livra une nouvelle version totalement ré-écrite. Reprenant le nom de PHP, elle était maintenant nommée (brièvement) "Personal Home Page Construction Kit", et était la première version à mettre en avant le fait que PHP était considéré comme une interface de scripts avancée. Le langage fut délibérément architecturé pour ressembler à la structure du C, rendant ainsi son adoption facile pour les développeurs familiers avec les langages comme C, Perl et consorts. Dans un premier temps limité aux systèmes Unix et POSIX, son potentiel pour une implémentation sous Windows NT commença à être exploré.

Le code fut de nouveau repris de zéro, et en Avril 1996, combinant les noms des précédentes versions, Rasmus introduisit PHP/FI. Cette implémentation de seconde génération commença à faire réellement évoluer PHP d'une simple suite d'outils vers un vrai langage de programmation. Il incluait un support interne pour les bases de données DBM, mSQL et Postgres95, pour les cookies, un support des fonctions définies par l'utilisateur, et bien plus. Ce mois de Juin, PHP/FI prenait un statut de version 2.0. Un point intéressant, cependant, était qu'il n'existait qu'une seule et unique version de PHP 2.0. Quand elle est finalement sortie du statut béta en Novembre 1997, le moteur d'analyse interne était déjà en cours de ré-écriture complète.

Bien qu'il fournît un cycle de développement très court, il continua de gagner en popularité dans ce monde où le développement web était encore très récent. En 1997 et 1998, PHP/FI comptait plusieurs milliers d'utilisateurs à travers le monde. Le site de surveillance Netcraft, en Mai 1998, indiquait qu'environ 60.000 domaines exportaient l'en-tête "PHP", indiquant ainsi que le serveur hôte l'avait d'installé. Ce nombre correspondait à environ 1% des domaines d'Internet de l'époque. Malgré ce chiffre impressionnant, la maturation de PHP/FI était condamnée à ses limitations ; bien qu'il y ait plusieurs contributeurs mineurs, il était encore principalement développé par un seul individu.

Exemple #1 Exemple de code PHP/FI

<!--include /text/header.html-->

<!--getenv HTTP_USER_AGENT-->
<!--ifsubstr $exec_result Mozilla-->
  Hé, vous utilisez Netscape !<p>
<!--endif-->

<!--sql database select * from table where user='$username'-->
<!--ifless $numentries 1-->
  Désolé, cette ligne n'existe pas<p>
<!--endif exit-->
  Bienvenue <!--$user--> !<p>
  Vous avez <!--$index:0--> crédits sur votre compte.<p>

<!--include /text/footer.html-->

PHP 3

PHP 3.0 fut la première version du langage tel que nous le connaissons actuellement. Trouvant que PHP/FI 2.0 était toujours insuffisant et manquait de fonctionnalités nécessaires pour mettre en oeuvre une application d'eCommerce, qu'ils développaient dans le cadre d'un projet universitaire, Andi Gutmans et Zeev Suraski de la ville de Tel Aviv (Israël) commencèrent encore une autre ré-écriture complète de l'analyseur interne en 1997. Se rapprochant de Rasmus via le web, ils discutèrent de divers aspects de l'implémentation courante et de leur re-développement de PHP. Dans une logique d'amélioration du moteur, et pour profiter des utilisateurs existant de PHP/FI, Andi, Rasmus et Zeev décidèrent de collaborer dans le développement d'un nouvel et indépendant langage de programmation. Ce tout nouveau langage a été publié sous un nouveau nom, qui supprima l'idée d'utilisation personnelle limitée inclue dans le nom de PHP/FI 2.0. Il fut ainsi tout simplement renommé 'PHP', dont la signification devint un acronyme récursif - PHP: Hypertext Preprocessor.

Une des améliorations notables de PHP 3.0 fut ses capacités d'extension. En plus de fournir une infrastructure mature pour de multiples bases de données, protocoles, et APIs, la facilité d'extension du langage en lui-même attira des dizaines de développeurs, qui produisirent de nombreux modules. Ce fut sans aucun doute une des clés de l'énorme succès de PHP 3.0. Une autre de ces clés fut l'introduction d'un support de programmation orientée objet, ainsi qu'une syntaxe de langage bien plus puissante et plus consistante.

En Juin 1998, avec plusieurs nouveaux développeurs de par le monde rejoignant le projet, PHP 3.0 fut annoncé par la nouvelle équipe de développement de PHP comme le successeur officiel de PHP/FI 2.0. Le développement actif de PHP/FI 2.0, qui avait en réalité cessé depuis le mois de Novembre de l'année précédente, était maintenant officiellement terminé. Après environ 9 mois de tests publics, lorsque l'annonce de la version officielle de PHP 3.0 fut publiée, il était déjà installé sur plus de 70.000 domaines à travers le monde, et n'était plus limité aux systèmes POSIX. Une petite partie des domaines rapportant une installation de PHP étaient installés sur des serveurs fonctionnant sous Windows 95, 98, NT, et Macintosh. À son apogée, PHP 3.0 était installé sur approximativement 10% des serveurs web d'Internet.

PHP 4

Durant l'hiver 1998, juste après la publication de PHP 3.0, Andi Gutmans et Zeev Suraski commencèrent une réécriture du moteur interne de PHP. Les objectifs étaient d'améliorer les performances de PHP sur les applications complexes, et d'améliorer la modularité du code. Ces applications étaient rendues possibles par les nouvelles fonctionnalités de PHP 3.0 et le support d'un grand nombre de bases de données et d'APIs, mais PHP 3.0 n'était pas conçu pour gérer efficacement des applications si complexes.

Le nouveau moteur, appelé 'Zend Engine' (combinaison des prénoms de Zeev et Andi), atteignit cet objectif avec succès, et la première version fut publiée vers la mi-1999. PHP 4.0, s'appuyant sur ce moteur, et amélioré par un grand nombre de nouvelles fonctionnalités, fut publié officiellement en mai 2000, presque 2 ans après son prédécesseur. En plus de performances nettement plus élevées, PHP 4.0 apportait le support de nombreux serveurs web, des sessions HTTP, la bufferisation de sortie, une sécurité accrue de la gestion des informations visiteurs, et plusieurs nouvelles structures de langage.

PHP 5

PHP 5 est sorti en Juillet 2004, après un long développement et plusieurs pré-versions. Il est régi par son moteur, le Zend Engine 2.0 avec un nouveau modèle objet et des dizaines d'autres nouvelles fonctionnalités.

L'équipe de développement de PHP regroupe des dizaines de développeurs, en plus des dizaines d'autres travaillant sur des projets en rapport avec PHP, comme PEAR, PECL, et la documentation, ainsi qu'un réseau d'infrastructure sous-jacent d'une centaine de serveurs web individuels sur 6 des 7 continents du monde. En s'appuyant sur une estimation basée sur les statistiques de l'année précédente, il est convenable de supposer que PHP est maintenant installé sur des dizaines, voire même des centaines, de millions de domaines autour du monde.

User Contributed Notes

There are no user contributed notes for this page.


Quelques projets liés à PHP

PEAR

» PEAR, qui signifie PHP Extension and Application Repository (initialement, PHP Extension and Add-on Repository), est la première version des classes de base en PHP, et pourrait devenir à terme un moyen privilégié de distribuer des extensions PHP entre développeurs.

PEAR est né durant les débats tenus lors des PHP Developers' Meeting (PDM) (Rencontres de développeurs PHP), qui ont eu lieu en Janvier 2000 à Tel Aviv. Il a été créé à l'initiative de Stig S. Bakken, et est dédié à sa première fille, Malin Bakken.

Depuis l'an 2000, PEAR a grossi jusqu'à devenir un projet significatif avec un groupe de développeurs compétents, qui travaillent à mettre en place une bibliothèque complète, réutilisable et commune, au bénéfice de la communauté PHP entière. Aujourd'hui, PEAR inclut une vaste sélection de classes de base pour accéder à des bases de données, pour stocker du contenu en cache, réaliser des calculs mathématiques, des transactions de commerce électronique, etc.

Plus d'informations sur PEAR sont disponibles dans » le manuel.

Equipe d'assurance Qualité

» L'équipe d'assurance Qualité de PHP a été mise en place durant l'été 2000, en réponse aux critiques reçues par PHP 3.0, qui n'était pas suffisamment testé pour des environnements de production. L'équipe est maintenant composée d'un groupe de développeurs de haut niveau, qui ont une bonne connaissance des sources PHP. Ces développeurs passent une bonne partie de leur temps à localiser et corriger les bogues trouvés dans PHP. De plus, il y a un bon nombre d'autres membres du groupe PHP qui testent et fournissent un compte-rendu fidèle de l'utilisation de PHP sur différentes plate-formes.

PHP-GTK

» PHP-GTK est la solution PHP pour écrire des applications avec interface graphique, coté client. Andrei Zmievski se souvient de la création de PHP-GTK :

La programmation d'interface GUI m'a toujours intéressée, et je pensais que Gtk+ était une excellente bibliothèque, hormis le fait que programmer avec en C est plutôt laborieux. Après avoir assisté aux implémentations de PyGtk et GTK-Perl, j'ai décidé de voir si PHP pouvait disposer de sa propre interface avec Gtk+, même minimale. J'ai commencé au mois d'août 2000, alors que j'avais un peu plus de temps libre, et j'ai réalisé les premières expérimentations. Mon guide principal fut l'implémentation de PyGtk, qui était plutôt complète et avait une interface orientée objet. James Henstridge, l'auteur de PyGtk, fut d'une aide précieuse au démarrage de ce projet.

Réécrire toutes les interfaces de Gtk+ à la main était hors de question et j'ai pensé à réaliser un générateur de code, exactement comme PyGtk l'avait fait. Le générateur de code est un programme PHP qui lit un ensemble de fichiers .defs, contenant les classes, constantes et méthodes Gtk+, puis génére le code C qui sert d'interface à PHP. Ce qui ne peut pas être généré automatiquement peut être écrit à la main, dans le fichier .overrides.

Travailler sur le générateur de code et sur l'infrastructure prit un peu de temps, car je n'avais que peu de temps à consacrer à PHP-GTK durant l'automne 2000. Après que j'ai montré PHP-GTK à Frank Kromann, il s'y intéressa et commença à m'aider sur le générateur et l'implémentation Win32. Lorsque nous écrivîmes le premier programme 'Hello World', ce fut extrêmement exitant. Il fallut encore quelques mois pour que le projet soit présentable, et la version initiale fut publiée en mars 2001. La nouvelle fut rapidement relayée sur SlashDot.

Anticipant que PHP-GTK pourrait devenir un projet à part entière, j'ai mis en place des listes de diffusion et un serveur CVS indépendants, de même que le site gtk.php.net avec l'aide de Colin Viebrock. La documentation avait aussi besoin d'être rédigée, et James Moore vint me porter une aide précieuse.

Depuis sa publication PHP-GTK a gagné en popularité. Nous avons notre propre équipe de documentation, le manuel s'améliore de plus en plus, des gens ont commencé à écrire des extensions pour PHP-GTK, ainsi des applications de plus en plus importantes l'utilisant.

User Contributed Notes

There are no user contributed notes for this page.


Livres traitant de PHP

Au fur et à mesure que PHP a évolué, il est petit à petit devenu une plate-forme de développement mondialement populaire. Un des signes qui ne trompent pas est que le nombre de livres dédiés à PHP a augmenté en parallèle, au fil des années.

À notre connaissance, le premier livre dédié à PHP fut 'PHP - tvorba interaktivních internetových aplikací' (PHP - Créer des Applications Interactives pour Internet), un livre tchèque publié en avril 1999, écrit par Jirka Kosek. Le mois suivant parut un livre allemand écrit par Egon Schmid, Christian Cartus et Richard Blume. Le premier livre en anglais sur PHP fut publié juste après : 'Core PHP Programming' par Leon Atkinson. Ces livres se rapportaient à PHP 3.0.

Même si ces livres étaient les premiers de leur genre, ils furent rapidement suivis par un grand nombre d'autres livres, de différents auteurs et éditeurs. On dénombre plus de 400 livres en anglais, plus de 100 en allemand, et plus de 50 en français ou espagnol ! De plus, on peut maintenant trouver des livres à propos de PHP dans de nombreuses autres langues, comme le coréen, le japonais ou l'hébreu.

De toute évidence, ce grand nombre de livres, écrits par différents auteurs et publiés par de nombreux éditeurs, ainsi que leur disponibilité en différentes langues, témoigne clairement du succès planétaire de PHP.

User Contributed Notes

There are no user contributed notes for this page.


Publications à propos de PHP

À notre connaissance, le premier article consacré à PHP dans un magazine papier fut publié dans la version tchèque de Computerworld, au printemps 1998, et se rapportait à PHP 3.0. Comme pour les livres, ce fut le premier d'une longue série d'articles publiés dans un nombre important de magazines.

Des articles sur PHP ont été publiés dans Dr. Dobbs, Linux Enterprise, Linux Magazine et bien d'autres. Il existe même des articles sur la migration d'applications ASP vers PHP sous Windows dans la bibliothèque MSDN de Microsoft.

User Contributed Notes

There are no user contributed notes for this page.


Migrating from PHP 7.4.x to PHP 8.0.x

Sommaire

  • New Features
  • Backward Incompatible Changes
  • Deprecated Features
  • Other Changes

This new major version brings with it a number of new features and some incompatibilities that should be tested for before switching PHP versions in production environments.

Voir aussi les guides de migration entre les différentes versions de PHP 7.0.x, 7.1.x, 7.2.x, 7.3.x. 7.4.x.

User Contributed Notes

There are no user contributed notes for this page.


New Features

PHP Core

Named Arguments

Support for Named Arguments has been added.

Attributes

Support for Attributes has been added.

Constructor Property Promotion

Support for constructor property promotion (declaring properties in the constructor signature) has been added.

Union Types

Support for union types has been added.

Match Expression

Support for match expressions has been added.

Nullsafe Operator

Support for the nullsafe operator (?->) has been added.

Other new Features

  • The WeakMap class has been added.

  • The ValueError class has been added.

  • Any number of function parameters may now be replaced by a variadic argument, as long as the types are compatible. For example, the following code is now allowed:

    <?php
    class A {
         public function     method(int $many, string $parameters, $here) {}
    }
    class     B extends A {
         public function     method(...$everything) {}
    }
    ?>

  • static (as in "late static binding") can now be used as a return type:

    <?php
    class Test {
         public function     create(): static {
              return new static();
         }
    }
    ?>

  • It is now possible to fetch the class name of an object using $object::class. The result is the same as get_class($object).

  • new and instanceof can now be used with arbitrary expressions, using new (expression)(...$args) and $obj instanceof (expression).

  • Some consistency fixes to variable syntax have been applied, for example writing Foo::BAR::$baz is now allowed.

  • Added Stringable interface, which is automatically implemented if a class defines a __toString() method.

  • Traits can now define abstract private methods. Such methods must be implemented by the class using the trait.

  • throw can now be used as an expression. That allows usages like:

    <?php
    $fn     = fn() => throw new Exception('Exception in arrow function');
    $user = $session->user ?? throw new Exception('Must have user');

  • An optional trailing comma is now allowed in parameter lists.

    <?php
    function functionWithLongSignature(
            Type1 $parameter1,
            Type2 $parameter2, // <-- This comma is now allowed.
    ) {
    }

  • It is now possible to write catch (Exception) to catch an exception without storing it in a variable.

  • Support for mixed type has been added.

  • Private methods declared on a parent class no longer enforce any inheritance rules on the methods of a child class (with the exception of final private constructors). The following example illustrates which restrictions have been removed:

    <?php
    class ParentClass {
        private function     method1() {}
        private function     method2() {}
        private static function     method3() {}
            // Throws a warning, as "final" no longer has an effect:
            private final function method4() {}
    }
    class     ChildClass extends ParentClass {
            // All of the following are now allowed, even though the modifiers aren't
        // the same as for the private methods in the parent class.
            public abstract function method1() {}
        public static function     method2() {}
        public function     method3() {}
        public function     method4() {}
    }
    ?>

  • get_resource_id() has been added, which returns the same value as (int) $resource. It provides the same functionality under a clearer API.

Date and Time

  • DateTime::createFromInterface() and DateTimeImmutable::createFromInterface() have been added.

  • The DateTime format specifier p has been added, which is the same as P but returns Z rather than +00:00 for UTC.

DOM

DOMParentNode and DOMChildNode with new traversal and manipulation APIs have been added.

Filter

FILTER_VALIDATE_BOOL has been added as an alias for FILTER_VALIDATE_BOOLEAN. The new name is preferred, as it uses the canonical type name.

Enchant

enchant_dict_add(), enchant_dict_is_added(), and LIBENCHANT_VERSION have been added.

FPM

Added a new option pm.status_listen that allows getting the status from different endpoint (e.g. port or UDS file) which is useful for getting the status when all children are busy with serving long running requests.

Hash

HashContext objects can now be serialized.

Internationalization Functions

The IntlDateFormatter::RELATIVE_FULL,
IntlDateFormatter::RELATIVE_LONG,
IntlDateFormatter::RELATIVE_MEDIUM, and
IntlDateFormatter::RELATIVE_SHORT
constants have been added.

LDAP

ldap_count_references() has been added, which returns the number of reference messages in a search result.

OPcache

If the opcache.record_warnings ini setting is enabled, OPcache will record compile-time warnings and replay them on the next include, even if it is served from cache.

OpenSSL

Added Cryptographic Message Syntax (CMS) (» RFC 5652) support composed of functions for encryption, decryption, signing, verifying and reading. The API is similar to the API for PKCS #7 functions with an addition of new encoding constants: OPENSSL_ENCODING_DER, OPENSSL_ENCODING_SMIME and OPENSSL_ENCODING_PEM:

  • openssl_cms_encrypt() encrypts the message in the file with the certificates and outputs the result to the supplied file.
  • openssl_cms_decrypt() that decrypts the S/MIME message in the file and outputs the results to the supplied file.
  • openssl_cms_read() that exports the CMS file to an array of PEM certificates.
  • openssl_cms_sign() that signs the MIME message in the file with a cert and key and output the result to the supplied file.
  • openssl_cms_verify() that verifies that the data block is intact, the signer is who they say they are, and returns the certs of the signers.

Regular Expressions (Perl-Compatible)

preg_last_error_msg() has been added, which returns a human-readable message for the last PCRE error. It complements preg_last_error(), which returns an integer enum value instead.

Reflection

  • The following methods can now return information about default values of parameters of internal functions:

    • ReflectionParameter::isDefaultValueAvailable()
    • ReflectionParameter::getDefaultValue()
    • ReflectionParameter::isDefaultValueConstant()
    • ReflectionParameter::getDefaultValueConstantName()

SQLite3

SQLite3::setAuthorizer() and respective class constants have been added to set a userland callback that will be used to authorize or not an action on the database.

Standard Library

  • str_contains(), str_starts_with() and str_ends_with() have been added, which check whether haystack contains, starts with or ends with needle, respectively.

  • fdiv() has been added, which performs a floating-point division under IEEE 754 semantics. Division by zero is considered well-defined and will return one of Inf, -Inf or NaN.

  • get_debug_type() has been added, which returns a type useful for error messages. Unlike gettype(), it uses canonical type names, returns class names for objects, and indicates the resource type for resources.

  • printf() and friends now support the %h and %H format specifiers. These are the same as %g and %G, but always use "." as the decimal separator, rather than determining it through the LC_NUMERIC locale.

  • printf() and friends now support using "*" as width or precision, in which case the width/precision is passed as an argument to printf. This also allows using precision -1 with %g, %G, %h and %H. For example, the following code can be used to reproduce PHP's default floating point formatting:

    <?php
    printf    ("%.*H", (int) ini_get("precision"), $float);
    printf("%.*H", (int) ini_get("serialize_precision"), $float);
    ?>

  • proc_open() now supports pseudo-terminal (PTY) descriptors. The following attaches stdin, stdout and stderr to the same PTY:

    <?php
    $proc     = proc_open($command, [['pty'], ['pty'], ['pty']], $pipes);
    ?>

  • proc_open() now supports socket pair descriptors. The following attaches a distinct socket pair to stdin, stdout and stderr:

    <?php
    $proc     = proc_open($command, [['socket'], ['socket'], ['socket']], $pipes);
    ?>

    Unlike pipes, sockets do not suffer from blocking I/O issues on Windows. However, not all programs may work correctly with stdio sockets.

  • Sorting functions are now stable, which means that equal-comparing elements will retain their original order.

  • array_diff(), array_intersect() and their variations can now be used with a single array as argument. This means that usages like the following are now possible:

    <?php
    // OK even if $excludes is empty:
    array_diff($array, ...$excludes);
    // OK even if $arrays only contains a single array:
    array_intersect(...$arrays);
    ?>

  • The flag parameter of ob_implicit_flush() was changed to accept a bool rather than an int.

Tokenizer

PhpToken adds an object-based interface to the tokenizer. It provides a more uniform and ergonomic representation, while being more memory efficient and faster.

Zip

  • The Zip extension has been updated to version 1.19.1.

  • New ZipArchive::setMtimeName() and ZipArchive::setMtimeIndex() to set the modification time of an entry.

  • New ZipArchive::registerProgressCallback() to provide updates during archive close.

  • New ZipArchive::registerCancelCallback() to allow cancellation during archive close.

  • New ZipArchive::replaceFile() to replace an entry content.

  • New ZipArchive::isCompressionMethodSupported() to check optional compression features.

  • New ZipArchive::isEncryptionMethodSupported() to check optional encryption features.

  • The ZipArchive::lastId property to get the index value of the last added entry has been added.

  • Errors can now be checked after an archive has been closed using the
ZipArchive::status and
ZipArchive::statusSys properties, or the
ZipArchive::getStatusString() method.

  • The 'remove_path' option of ZipArchive::addGlob() and ZipArchive::addPattern() is now treated as an arbitrary string prefix (for consistency with the 'add_path' option), whereas formerly it was treated as a directory name.

  • Optional compression / encryption features are now listed in phpinfo.

User Contributed Notes

There are no user contributed notes for this page.


Backward Incompatible Changes

PHP Core

String to Number Comparison

Non-strict comparisons between numbers and non-numeric strings now work by casting the number to string and comparing the strings. Comparisons between numbers and numeric strings continue to work as before. Notably, this means that 0 == "not-a-number" is considered false now.

Comparison | Before | After
0 == "0" | true | true
0 == "0.0" | true | true
0 == "foo" | true | false
0 == "" | true | false
42 == " 42" | true | true
42 == "42foo" | true | false

Other incompatible Changes

  • match is now a reserved keyword.

  • Assertion failures now throw by default. If the old behavior is desired, assert.exception=0 can be set in the INI settings.

  • Methods with the same name as the class are no longer interpreted as constructors. The __construct() method should be used instead.

  • The ability to call non-static methods statically has been removed. Thus is_callable() will fail when checking for a non-static method with a classname (must check with an object instance).

  • The (real) and (unset) casts have been removed.

  • The track_errors ini directive has been removed. This means that php_errormsg is no longer available. The error_get_last() function may be used instead.

  • The ability to define case-insensitive constants has been removed. The third argument to define() may no longer be true.

  • The ability to specify an autoloader using an __autoload() function has been removed. spl_autoload_register() should be used instead.

  • The errcontext argument will no longer be passed to custom error handlers set with set_error_handler().

  • create_function() has been removed. Anonymous functions may be used instead.

  • each() has been removed. foreach or ArrayIterator should be used instead.

  • The ability to unbind this from closures that were created from a method, using Closure::fromCallable() or ReflectionMethod::getClosure(), has been removed.

  • The ability to unbind this from proper closures that contain uses of this has also been removed.

  • The ability to use array_key_exists() with objects has been removed. isset() or property_exists() may be used instead.

  • The behavior of array_key_exists() regarding the type of the key parameter has been made consistent with isset() and normal array access. All key types now use the usual coercions and array/object keys throw a TypeError.

  • Any array that has a number n as its first numeric key will use n+1 for its next implicit key, even if n is negative.

  • The default error_reporting level is now E_ALL. Previously it excluded E_NOTICE and E_DEPRECATED.

  • display_startup_errors is now enabled by default.

  • Using parent inside a class that has no parent will now result in a fatal compile-time error.

  • The @ operator will no longer silence fatal errors (E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR, E_PARSE). Error handlers that expect error_reporting to be 0 when @ is used, should be adjusted to use a mask check instead:

    <?php
    // Replace
    function my_error_handler($err_no, $err_msg, $filename, $linenum) {
        if (    error_reporting() == 0) {
            return     false; // Silenced
            }
            // ...
    }

    // With
    function my_error_handler($err_no, $err_msg, $filename, $linenum) {
        if (!(    error_reporting() & $err_no)) {
            return     false; // Silenced
            }
            // ...
    }
    ?>

    Additionally, care should be taken that error messages are not displayed in production environments, which can result in information leaks. Please ensure that display_errors=Off is used in conjunction with error logging.

  • #[ is no longer interpreted as the start of a comment, as this syntax is now used for attributes.

  • Inheritance errors due to incompatible method signatures (LSP violations) will now always generate a fatal error. Previously a warning was generated in some cases.

  • The precedence of the concatenation operator has changed relative to bitshifts and addition as well as subtraction.

    <?php
    echo "Sum: " . $a + $b;
    // was previously interpreted as:
    echo ("Sum: " . $a) + $b;
    // is now interpreted as:
    echo "Sum:" . ($a + $b);
    ?>

  • Arguments with a default value that resolves to null at runtime will no longer implicitly mark the argument type as nullable. Either an explicit nullable type, or an explicit null default value has to be used instead.

    <?php
    // Replace
    function test(int $arg = CONST_RESOLVING_TO_NULL) {}
    // With
    function test(?int $arg = CONST_RESOLVING_TO_NULL) {}
    // Or
    function test(int $arg = null) {}
    ?>

  • A number of warnings have been converted into Error exceptions:

    • Attempting to write to a property of a non-object. Previously this implicitly created an stdClass object for null, false and empty strings.
    • Attempting to append an element to an array for which the PHP_INT_MAX key is already used.
    • Attempting to use an invalid type (array or object) as an array key or string offset.
    • Attempting to write to an array index of a scalar value.
    • Attempting to unpack a non-array/Traversable.
    • Attempting to access unqualified constants which are undefined. Previously, unqualified constant accesses resulted in a warning and were interpreted as strings.

    A number of notices have been converted into warnings:

    • Attempting to read an undefined variable.
    • Attempting to read an undefined property.
    • Attempting to read an undefined array key.
    • Attempting to read a property of a non-object.
    • Attempting to access an array index of a non-array.
    • Attempting to convert an array to string.
    • Attempting to use a resource as an array key.
    • Attempting to use null, a boolean, or a float as a string offset.
    • Attempting to read an out-of-bounds string offset.
    • Attempting to assign an empty string to a string offset.

  • Attempting to assign multiple bytes to a string offset will now emit a warning.

  • Unexpected characters in source files (such as NUL bytes outside of strings) will now result in a ParseError exception instead of a compile warning.

  • Uncaught exceptions now go through "clean shutdown", which means that destructors will be called after an uncaught exception.

  • The compile time fatal error "Only variables can be passed by reference" has been delayed until runtime, and converted into an "Argument cannot be passed by reference" Error exception.

  • Some "Only variables should be passed by reference" notices have been converted to "Argument cannot be passed by reference" exception.

  • The generated name for anonymous classes has changed. It will now include the name of the first parent or interface:

    <?php
    new class extends ParentClass {};
    // -> ParentClass@anonymous
    new class implements FirstInterface, SecondInterface {};
    // -> FirstInterface@anonymous
    new class {};
    // -> class@anonymous
    ?>

    The name shown above is still followed by a NUL byte and a unique suffix.

  • Non-absolute trait method references in trait alias adaptations are now required to be unambiguous:

    <?php
    class X {
        use     T1, T2 {
                func as otherFunc;
        }
        function     func() {}
    }
    ?>

    If both T1::func() and T2::func() exist, this code was previously silently accepted, and func was assumed to refer to T1::func. Now it will generate a fatal error instead, and either T1::func or T2::func needs to be written explicitly.

  • The signature of abstract methods defined in traits is now checked against the implementing class method:

    <?php
    trait MyTrait {
        abstract private function     neededByTrait(): string;
    }

    class     MyClass {
        use     MyTrait;

            // Error, because of return type mismatch.
            private function neededByTrait(): int { return 42; }
    }
    ?>

  • Disabled functions are now treated exactly like non-existent functions. Calling a disabled function will report it as unknown, and redefining a disabled function is now possible.

  • data:// stream wrappers are no longer writable, which matches the documented behavior.

  • The arithmetic and bitwise operators +, -, *, /, **, %, <<, >>, &, |, ^, ~, ++, -- will now consistently throw a TypeError when one of the operands is an tableau, ressource or non-overloaded objet. The only exception to this is the array + array merge operation, which remains supported.

  • Float to string casting will now always behave locale-independently.

    <?php
    setlocale    (LC_ALL, "de_DE");
    $f = 3.14;
    echo     $f, "\n";
    // Previously: 3,14
    // Now:        3.14
    ?>

    See printf(), number_format() and NumberFormatter() for ways to customize number formatting.

  • Support for deprecated curly braces for offset access has been removed.

    <?php
    // Instead of:
    $array{0};
    $array{"key"};
    // Write:
    $array[0];
    $array["key"];
    ?>

  • Applying the final modifier on a private method will now produce a warning unless that method is the constructor.

  • If an object constructor exit()s, the object destructor will no longer be called. This matches the behavior when the constructor throws.

  • Namespaced names can no longer contain whitespace: While Foo\Bar will be recognized as a namespaced name, Foo \ Bar will not. Conversely, reserved keywords are now permitted as namespace segments, which may also change the interpretation of code: new\x is now the same as constant('new\x'), not new \x().

  • Nested ternaries now require explicit parentheses.

  • debug_backtrace() and Exception::getTrace() will no longer provide references to arguments. It will not be possible to change function arguments through the backtrace.

  • Numeric string handling has been altered to be more intuitive and less error-prone. Trailing whitespace is now allowed in numeric strings for consistency with how leading whitespace is treated. This mostly affects:

    • The is_numeric() function
    • String-to-string comparisons
    • Type declarations
    • Increment and decrement operations

    The concept of a "leading-numeric string" has been mostly dropped; the cases where this remains exist in order to ease migration. Strings which emitted an E_NOTICE "A non well-formed numeric value encountered" will now emit an E_WARNING "A non-numeric value encountered" and all strings which emitted an E_WARNING "A non-numeric value encountered" will now throw a TypeError. This mostly affects:

    • Arithmetic operations
    • Bitwise operations

    This E_WARNING to TypeError change also affects the E_WARNING "Illegal string offset 'string'" for illegal string offsets. The behavior of explicit casts to int/float from strings has not been changed.

  • Magic Methods will now have their arguments and return types checked if they have them declared. The signatures should match the following list:

    • __call(string $name, array $arguments): mixed
    • __callStatic(string $name, array $arguments): mixed
    • __clone(): void
    • __debugInfo(): ?array
    • __get(string $name): mixed
    • __invoke(mixed $arguments): mixed
    • __isset(string $name): bool
    • __serialize(): array
    • __set(string $name, mixed $value): void
    • __set_state(array $properties): object
    • __sleep(): array
    • __unserialize(array $data): void
    • __unset(string $name): void
    • __wakeup(): void

  • call_user_func_array() array keys will now be interpreted as parameter names, instead of being silently ignored.

  • Declaring a function called assert() inside a namespace is no longer allowed, and issues E_COMPILE_ERROR. The assert() function is subject to special handling by the engine, which may lead to inconsistent behavior when defining a namespaced function with the same name.

Resource to Object Migration

Several ressources have been migrated to objets. Return value checks using is_resource() should be replaced with checks for false.

  • curl_init() will now return a CurlHandle object rather than a ressource. The curl_close() function no longer has an effect, instead the CurlHandle instance is automatically destroyed if it is no longer referenced.

  • curl_multi_init() will now return a CurlMultiHandle object rather than a ressource. The curl_multi_close() function no longer has an effect, instead the CurlMultiHandle instance is automatically destroyed if it is no longer referenced.

  • curl_share_init() will now return a CurlShareHandle object rather than a ressource. The curl_share_close() function no longer has an effect, instead the CurlShareHandle instance is automatically destroyed if it is no longer referenced.

  • enchant_broker_init() will now return an EnchantBroker object rather than a ressource.

  • enchant_broker_request_dict() and enchant_broker_request_pwl_dict() will now return an EnchantDictionary object rather than a ressource.

  • The GD extension now uses GdImage objects as the underlying data structure for images, rather than ressources. The imagedestroy() function no longer has an effect; instead the GdImage instance is automatically destroyed if it is no longer referenced.

  • openssl_x509_read() and openssl_csr_sign() will now return an OpenSSLCertificate object rather than a ressource. The openssl_x509_free() function is deprecated and no longer has an effect, instead the OpenSSLCertificate instance is automatically destroyed if it is no longer referenced.

  • openssl_csr_new() will now return an OpenSSLCertificateSigningRequest object rather than a ressource.

  • openssl_pkey_new() will now return an OpenSSLAsymmetricKey object rather than a ressource. The openssl_pkey_free() function is deprecated and no longer has an effect, instead the OpenSSLAsymmetricKey instance is automatically destroyed if it is no longer referenced.

  • shmop_open() will now return a Shmop object rather than a ressource. The shmop_close() function no longer has an effect, and is deprecated; instead the Shmop instance is automatically destroyed if it is no longer referenced.

  • socket_create(), socket_create_listen(), socket_accept(), socket_import_stream(), socket_addrinfo_connect(), socket_addrinfo_bind(), and socket_wsaprotocol_info_import() will now return a Socket object rather than a ressource. socket_addrinfo_lookup() will now return an array of AddressInfo objects rather than ressources.

  • msg_get_queue() will now return an SysvMessageQueue object rather than a ressource.

  • sem_get() will now return an SysvSemaphore object rather than a ressource.

  • shm_attach() will now return an SysvSharedMemory object rather than a ressource.

  • xml_parser_create() and xml_parser_create_ns() will now return an XMLParser object rather than a ressource. The xml_parser_free() function no longer has an effect, instead the XMLParser instance is automatically destroyed if it is no longer referenced.

  • The XMLWriter functions now accept and return, respectively, XMLWriter objects instead of ressources.

  • inflate_init() will now return an InflateContext object rather than a ressource.

  • deflate_init() will now return a DeflateContext object rather than a ressource.

COM and .Net (Windows)

The ability to import case-insensitive constants from type libraries has been removed. The second argument to com_load_typelib() may no longer be false; com.autoregister_casesensitive may no longer be disabled; case-insensitive markers in com.typelib_file are ignored.

CURL

CURLOPT_POSTFIELDS no longer accepts objects as arrays. To interpret an object as an array, perform an explicit (array) cast. The same applies to other options accepting arrays as well.

Date and Time

mktime() and gmmktime() now require at least one argument. time() can be used to get the current timestamp.

DOM

Unimplemented classes from the DOM extension that had no behavior and contained test data have been removed. These classes have also been removed in the latest version of the DOM standard:

  • DOMNameList
  • DomImplementationList
  • DOMConfiguration
  • DomError
  • DomErrorHandler
  • DOMImplementationSource
  • DOMLocator
  • DOMUserDataHandler
  • DOMTypeInfo

Enchant

  • enchant_broker_list_dicts(), enchant_broker_describe() and enchant_dict_suggest() will now return an empty array instead of null.

Exif

read_exif_data() has been removed; exif_read_data() should be used instead.

Filter

  • The FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED flags for the FILTER_VALIDATE_URL filter have been removed. The scheme and host are (and have been) always required.

  • The INPUT_REQUEST and INPUT_SESSION source for filter_input() etc. have been removed. These were never implemented and their use always generated a warning.

GD

  • The deprecated functions image2wbmp() has been removed.

  • The deprecated functions png2wbmp() and jpeg2wbmp() have been removed.

  • The default mode parameter of imagecropauto() no longer accepts -1. IMG_CROP_DEFAULT should be used instead.

  • On Windows, php_gd2.dll has been renamed to php_gd.dll.

GMP

gmp_random() has been removed. One of gmp_random_range() or gmp_random_bits() should be used instead.

Iconv

iconv implementations which do not properly set errno in case of errors are no longer supported.

IMAP

  • The unused default_host argument of imap_headerinfo() has been removed.

  • The imap_header() function which is an alias of imap_headerinfo() has been removed.

Internationalization Functions

  • The deprecated constant INTL_IDNA_VARIANT_2003 has been removed.

  • The deprecated Normalizer::NONE constant has been removed.

LDAP

  • The deprecated functions ldap_sort(),
ldap_control_paged_result() and
ldap_control_paged_result_response() have been removed.

  • The interface of ldap_set_rebind_proc() has changed; the callback parameter does not accept empty strings anymore; null should be used instead.

MBString

  • The mbstring.func_overload directive has been removed. The related MB_OVERLOAD_MAIL, MB_OVERLOAD_STRING, and MB_OVERLOAD_REGEX constants have also been removed. Finally, the "func_overload" and "func_overload_list" entries in mb_get_info() have been removed.

  • mb_parse_str() can no longer be used without specifying a result array.

  • A number of deprecated mbregex aliases have been removed. See the following list for which functions should be used instead:

    • mbregex_encoding() ? mb_regex_encoding()
    • mbereg() ? mb_ereg()
    • mberegi() ? mb_eregi()
    • mbereg_replace() ? mb_ereg_replace()
    • mberegi_replace() ? mb_eregi_replace()
    • mbsplit() ? mb_split()
    • mbereg_match() ? mb_ereg_match()
    • mbereg_search() ? mb_ereg_search()
    • mbereg_search_pos() ? mb_ereg_search_pos()
    • mbereg_search_regs() ? mb_ereg_search_regs()
    • mbereg_search_init() ? mb_ereg_search_init()
    • mbereg_search_getregs() ? mb_ereg_search_getregs()
    • mbereg_search_getpos() ? mb_ereg_search_getpos()
    • mbereg_search_setpos() ? mb_ereg_search_setpos()

  • The e modifier for mb_ereg_replace() has been removed. mb_ereg_replace_callback() should be used instead.

  • A non-string pattern argument to mb_ereg_replace() will now be interpreted as a string instead of an ASCII codepoint. The previous behavior may be restored with an explicit call to chr().

  • The needle argument for mb_strpos(),
mb_strrpos(), mb_stripos(),
mb_strripos(), mb_strstr(),
mb_stristr(), mb_strrchr() and
mb_strrichr() can now be empty.

  • The is_hex parameter, which was not used internally, has been removed from mb_decode_numericentity().

  • The legacy behavior of passing the encoding as the third argument instead of an offset for the mb_strrpos() function has been removed; an explicit 0 offset with the encoding should be provided as the fourth argument instead.

  • The ISO_8859-* character encoding aliases have been replaced by ISO8859-* aliases for better interoperability with the iconv extension. The mbregex ISO 8859 aliases with underscores (ISO_8859_* and ISO8859_*) have also been removed.

  • mb_ereg() and mb_eregi() will now return boolean true on a successful match. Previously they returned integer 1 if matches was not passed, or max(1, strlen($matches[0])) if matches was passed.

OCI8

  • The OCI-Lob class is now called OCILob, and the OCI-Collection class is now called OCICollection for name compliance enforced by PHP 8 arginfo type annotation tooling.

  • Several alias functions have been marked as deprecated.

  • oci_internal_debug() and its alias ociinternaldebug() have been removed.

ODBC

  • odbc_connect() no longer reuses connections.

  • The unused flags parameter of odbc_exec() has been removed.

OpenSSL

  • openssl_seal() and openssl_open() now require method to be passed, as the previous default of "RC4" is considered insecure.

Regular Expressions (Perl-Compatible)

When passing invalid escape sequences they are no longer interpreted as literals. This behavior previously required the X modifier – which is now ignored.

PHP Data Objects

  • The default error handling mode has been changed from "silent" to "exceptions". See Errors and error handling for details.

  • The signatures of some PDO methods have changed:

    • PDO::query(string $query, ?int $fetchMode = null, mixed ...$fetchModeArgs)
    • PDOStatement::setFetchMode(int $mode, mixed ...$args)

PDO ODBC

The php.ini directive pdo_odbc.db2_instance_name has been removed.

PDO MySQL

PDO::inTransaction() now reports the actual transaction state of the connection, rather than an approximation maintained by PDO. If a query that is subject to "implicit commit" is executed, PDO::inTransaction() will subsequently return false, as a transaction is no longer active.

PostgreSQL

  • The deprecated pg_connect() syntax using multiple parameters instead of a connection string is no longer supported.

  • The deprecated pg_lo_import() and pg_lo_export() signature that passes the connection as the last argument is no longer supported. The connection should be passed as first argument instead.

  • pg_fetch_all() will now return an empty array instead of false for result sets with zero rows.

Phar

Metadata associated with a phar will no longer be automatically unserialized, to fix potential security vulnerabilities due to object instantiation, autoloading, etc.

Reflection

  • The method signatures

    • ReflectionClass::newInstance($args)
    • ReflectionFunction::invoke($args)
    • ReflectionMethod::invoke($object, $args)

    have been changed to:

    • ReflectionClass::newInstance(...$args)
    • ReflectionFunction::invoke(...$args)
    • ReflectionMethod::invoke($object, ...$args)

    Code that must be compatible with both PHP 7 and PHP 8 can use the following signatures to be compatible with both versions:

    • ReflectionClass::newInstance($arg = null, ...$args)
    • ReflectionFunction::invoke($arg = null, ...$args)
    • ReflectionMethod::invoke($object, $arg = null, ...$args)

  • The ReflectionType::__toString() method will now return a complete debug representation of the type, and is no longer deprecated. In particular the result will include a nullability indicator for nullable types. The format of the return value is not stable and may change between PHP versions.

  • Reflection export() methods have been removed. Instead reflection objects can be cast to string.

  • ReflectionMethod::isConstructor() and
ReflectionMethod::isDestructor() now also return true for
__construct() and
__destruct() methods of interfaces.
Previously, this would only be true for methods of classes and traits.

  • ReflectionType::isBuiltin() method has been moved to ReflectionNamedType. ReflectionUnionType does not have it.

Sockets

  • The deprecated AI_IDN_ALLOW_UNASSIGNED and AI_IDN_USE_STD3_ASCII_RULES flags for socket_addrinfo_lookup() have been removed.

Standard PHP Library (SPL)

  • SplFileObject::fgetss() has been removed.

  • SplFileObject::seek() now always seeks to the beginning of the line. Previously, positions =1 sought to the beginning of the next line.

  • SplHeap::compare() now specifies a method signature. Inheriting classes implementing this method will now have to use a compatible method signature.

  • SplDoublyLinkedList::push(), SplDoublyLinkedList::unshift() and SplQueue::enqueue() now return void instead of true.

  • spl_autoload_register() will now always throw a TypeError on invalid arguments, therefore the second argument do_throw is ignored and a notice will be emitted if it is set to false.

  • SplFixedArray is now an IteratorAggregate and not an Iterator. SplFixedArray::rewind(), SplFixedArray::current(), SplFixedArray::key(), SplFixedArray::next(), and SplFixedArray::valid() have been removed. In their place, SplFixedArray::getIterator() has been added. Any code which uses explicit iteration over SplFixedArray must now obtain an Iterator through SplFixedArray::getIterator(). This means that SplFixedArray is now safe to use in nested loops.

Standard Library

  • assert() will no longer evaluate string arguments, instead they will be treated like any other argument. assert($a == $b) should be used instead of assert('$a == $b'). The assert.quiet_eval ini directive and the ASSERT_QUIET_EVAL constant have also been removed, as they would no longer have any effect.

  • parse_str() can no longer be used without specifying a result array.

  • The string.strip_tags filter has been removed.

  • The needle argument of strpos(), strrpos(), stripos(), strripos(), strstr(), strchr(), strrchr(), and stristr() will now always be interpreted as a string. Previously non-string needles were interpreted as an ASCII code point. An explicit call to chr() can be used to restore the previous behavior.

  • The needle argument for strpos(),
strrpos(), stripos(), strripos(),
strstr(), stristr() and strrchr() can
now be empty.

  • The length argument for substr(), substr_count(), substr_compare(), and iconv_substr() can now be null. null values will behave as if no length argument was provided and will therefore return the remainder of the string instead of an empty string.

  • The length argument for array_splice() can now be null. null values will behave identically to omitting the argument, thus removing everything from the offset to the end of the array.

  • The args argument of vsprintf(), vfprintf(), and vprintf() must now be an array. Previously any type was accepted.

  • The 'salt' option of password_hash() is no longer supported. If the 'salt' option is used a warning is generated, the provided salt is ignored, and a generated salt is used instead.

  • The quotemeta() function will now return an empty string if an empty string was passed. Previously false was returned.

  • The following functions have been removed:

    • hebrevc()
    • convert_cyr_string()
    • money_format()
    • ezmlm_hash()
    • restore_include_path()
    • get_magic_quotes_gpc()
    • get_magic_quotes_runtime()
    • fgetss()

  • FILTER_SANITIZE_MAGIC_QUOTES has been removed.

  • Calling implode() with parameters in a reverse order ($pieces, $glue) is no longer supported.

  • parse_url() will now distinguish absent and empty queries and fragments:

    • http://example.com/foo ? query = null, fragment = null
    • http://example.com/foo? ? query = "", fragment = null
    • http://example.com/foo# ? query = null, fragment = ""
    • http://example.com/foo?# ? query = "", fragment = ""
    Previously all cases resulted in query and fragment being null.

  • var_dump() and debug_zval_dump() will now print floating-point numbers using serialize_precision rather than precision. In a default configuration, this means that floating-point numbers are now printed with full accuracy by these debugging functions.

  • If the array returned by __sleep() contains non-existing properties, these are now silently ignored. Previously, such properties would have been serialized as if they had the value null.

  • The default locale on startup is now always "C". No locales are inherited from the environment by default. Previously, LC_ALL was set to "C", while LC_CTYPE was inherited from the environment. However, some functions did not respect the inherited locale without an explicit setlocale() call. An explicit setlocale() call is now always required if a locale component should be changed from the default.

  • The deprecated DES fallback in crypt() has been removed. If an unknown salt format is passed to crypt(), the function will fail with *0 instead of falling back to a weak DES hash now.

  • Specifying out of range rounds for SHA256/SHA512 crypt() will now fail with *0 instead of clamping to the closest limit. This matches glibc behavior.

  • The result of sorting functions may have changed, if the array contains elements that compare as equal.

  • Any functions accepting callbacks that are not explicitly specified to accept parameters by reference will now warn if a callback with reference parameters is used. Examples include array_filter() and array_reduce(). This was already the case for most, but not all, functions previously.

  • The HTTP stream wrapper as used by functions like file_get_contents() now advertises HTTP/1.1 rather than HTTP/1.0 by default. This does not change the behavior of the client, but may cause servers to respond differently. To retain the old behavior, set the 'protocol_version' stream context option, e.g.

    <?php
    $ctx     = stream_context_create(['http' => ['protocol_version' => '1.0']]);
    echo     file_get_contents('http://example.org', false, $ctx);
    ?>

  • Calling crypt() without an explicit salt is no longer supported. If you would like to produce a strong hash with an auto-generated salt, use password_hash() instead.

  • substr(), mb_substr(), iconv_substr() and grapheme_substr() now consistently clamp out-of-bounds offsets to the string boundary. Previously, false was returned instead of the empty string in some cases.

  • On Windows, the program execution functions (proc_open(), exec(), popen() etc.) using the shell, now consistently execute %comspec% /s /c "$commandline", which has the same effect as executing $commandline (without additional quotes).

Sysvsem

  • The auto_release parameter of sem_get() was changed to accept bool values rather than int.

Tidy

  • The use_include_path parameter, which was not used internally, has been removed from tidy_repair_string().

  • tidy::repairString() and tidy::repairFile() became static methods.

Tokenizer

  • T_COMMENT tokens will no longer include a trailing newline. The newline will instead be part of a following T_WHITESPACE token. It should be noted that T_COMMENT is not always followed by whitespace, it may also be followed by T_CLOSE_TAG or end-of-file.

  • Namespaced names are now represented using the T_NAME_QUALIFIED (Foo\Bar), T_NAME_FULLY_QUALIFIED (\Foo\Bar) and T_NAME_RELATIVE (namespace\Foo\Bar) tokens. T_NS_SEPARATOR is only used for standalone namespace separators, and only syntactially valid in conjunction with group use declarations.

XMLReader

XMLReader::open() and XMLReader::xml() are now static methods. They can still be called as instance methods, but inheriting classes need to declare them as static if they override these methods.

XML-RPC

The XML-RPC extension has been moved to PECL and is no longer part of the PHP distribution.

Zip

ZipArchive::OPSYS_Z_CPM has been removed (this name was a typo). Use ZipArchive::OPSYS_CPM instead.

Zlib

  • gzgetss() has been removed.

  • zlib.output_compression is no longer automatically disabled for Content-Type: image/*.

Windows PHP Test Packs

The test runner has been renamed from run-test.php to run-tests.php, to match its name in php-src.

User Contributed Notes

There are no user contributed notes for this page.


Deprecated Features

PHP Core

  • If a parameter with a default value is followed by a required parameter, the default value has no effect. This is deprecated as of PHP 8.0.0 and can generally be resolved by dropping the default value, without a change in functionality:

    <?php
    function test($a = [], $b) {} // Before
    function test($a, $b) {}      // After
    ?>

    One exception to this rule are parameters of the form Type $param = null, where the null default makes the type implicitly nullable. This usage remains allowed, but it is recommended to use an explicit nullable type instead:

    <?php
    function test(A $a = null, $b) {} // Still allowed
    function test(?A $a, $b) {}       // Recommended
    ?>

  • Calling get_defined_functions() with exclude_disabled explicitly set to false is deprecated and no longer has an effect. get_defined_functions() will never include disabled functions.

Enchant

  • enchant_broker_set_dict_path() and enchant_broker_get_dict_path() are deprecated, because that functionality is neither available in libenchant < 1.5 nor in libenchant-2.

  • enchant_dict_add_to_personal() is deprecated; use enchant_dict_add() instead.

  • enchant_dict_is_in_session() is deprecated; use enchant_dict_is_added() instead.

  • enchant_broker_free() and enchant_broker_free_dict() are deprecated; unset the object instead.

  • The ENCHANT_MYSPELL and ENCHANT_ISPELL constants are deprecated.

LibXML

libxml_disable_entity_loader() has been deprecated. As libxml 2.9.0 is now required, external entity loading is guaranteed to be disabled by default, and this function is no longer needed to protect against XXE attacks.

PGSQL / PDO PGSQL

  • The constant PGSQL_LIBPQ_VERSION_STR now has the same value as PGSQL_LIBPQ_VERSION, and thus is deprecated.

  • Function aliases in the pgsql extension have been deprecated. See the following list for which functions should be used instead:

    • pg_errormessage() ? pg_last_error()
    • pg_numrows() ? pg_num_rows()
    • pg_numfields() ? pg_num_fields()
    • pg_cmdtuples() ? pg_affected_rows()
    • pg_fieldname() ? pg_field_name()
    • pg_fieldsize() ? pg_field_size()
    • pg_fieldtype() ? pg_field_type()
    • pg_fieldnum() ? pg_field_num()
    • pg_result() ? pg_fetch_result()
    • pg_fieldprtlen() ? pg_field_prtlen()
    • pg_fieldisnull() ? pg_field_is_null()
    • pg_freeresult() ? pg_free_result()
    • pg_getlastoid() ? pg_last_oid()
    • pg_locreate() ? pg_lo_create()
    • pg_lounlink() ? pg_lo_unlink()
    • pg_loopen() ? pg_lo_open()
    • pg_loclose() ? pg_lo_close()
    • pg_loread() ? pg_lo_read()
    • pg_lowrite() ? pg_lo_write()
    • pg_loreadall() ? pg_lo_read_all()
    • pg_loimport() ? pg_lo_import()
    • pg_loexport() ? pg_lo_export()
    • pg_setclientencoding() ? pg_set_client_encoding()
    • pg_clientencoding() -> pg_client_encoding()

Standard Library

  • Sort comparison functions that return true or false will now throw a deprecation warning, and should be replaced with an implementation that returns an integer less than, equal to, or greater than zero.

    <?php
    // Replace
    usort($array, fn($a, $b) => $a > $b);
    // With
    usort($array, fn($a, $b) => $a <=> $b);
    ?>

Zip

  • Using an empty file as ZipArchive is deprecated. Libzip 1.6.0 does not accept empty files as valid zip archives any longer. The existing workaround will be removed in the next version.

  • The procedural API of Zip is deprecated. Use ZipArchive instead. Iteration over all entries can be accomplished using ZipArchive::statIndex() and a for loop:

    <?php
    // iterate using the procedural API
    assert(is_resource($zip));
    while (    $entry = zip_read($zip)) {
        echo     zip_entry_name($entry);
    }

    // iterate using the object-oriented API
    assert($zip instanceof ZipArchive);
    for (    $i = 0; $entry = $zip->statIndex($i); $i++) {
        echo     $entry['name'];
    }
    ?>

Reflection

  • ReflectionFunction::isDisabled() is deprecated, as it is no longer possible to create a ReflectionFunction for a disabled function. This method now always returns false.

  • ReflectionParameter::getClass(),
ReflectionParameter::isArray(), and
ReflectionParameter::isCallable() are deprecated.
ReflectionParameter::getType() and the
ReflectionType APIs should be used instead.

User Contributed Notes

There are no user contributed notes for this page.


Other Changes

Changes in SAPI Modules

Apache2Handler

The PHP module has been renamed from php7_module to php_module.

Changed Functions

Reflection

ReflectionClass::getConstants() and ReflectionClass::getReflectionConstants() results can be now filtered via a new parameter filter. Three new constants were added to be used with it:

  • ReflectionClassConstant::IS_PUBLIC
  • ReflectionClassConstant::IS_PROTECTED
  • ReflectionClassConstant::IS_PRIVATE

Zip

  • The ZipArchive::addGlob() and ZipArchive::addPattern() methods accept more values in the options array argument:

    • flags
    • comp_method
    • comp_flags
    • env_method
    • enc_password

  • ZipArchive::addEmptyDir(), ZipArchive::addFile() and ZipArchive::addFromString() methods have a new flags argument. This allows managing name encoding (ZipArchive::FL_ENC_*) and entry replacement (ZipArchive::FL_OVERWRITE).

  • ZipArchive::extractTo() now restores the file modification time.

Other Changes to Extensions

CURL

  • The CURL extension now requires at least libcurl 7.29.0.

  • The deprecated parameter version of curl_version() has been removed.

Date and Time

DatePeriod now implements IteratorAggregate (instead of Traversable).

DOM

DOMNamedNodeMap and DOMNodeList now implement IteratorAggregate (instead of Traversable).

Intl

IntlBreakIterator and ResourceBundle now implement IteratorAggregate (instead of Traversable).

Enchant

The enchant extension now uses libenchant-2 by default when available. libenchant version 1 is still supported but is deprecated and could be removed in the future.

GD

  • The num_points parameter of imagepolygon(), imageopenpolygon() and imagefilledpolygon() is now optional, i.e. these functions may be called with either 3 or 4 arguments. If the argument is omitted, it is calculated as count($points)/2.

  • The function imagegetinterpolation() to get the current interpolation method has been added.

JSON

The JSON extension cannot be disabled anymore and is always an integral part of any PHP build, similar to the date extension.

MBString

The Unicode data tables have been updated to version 13.0.0.

PDO

PDOStatement now implements IteratorAggregate (instead of Traversable).

LibXML

The minimum required libxml version is now 2.9.0. This means that external entity loading is now guaranteed to be disabled by default, and no extra steps need to be taken to protect against XXE attacks.

MySQLi / PDO MySQL

  • When mysqlnd is not used (which is the default and recommended option), the minimum supported libmysqlclient version is now 5.5.

  • mysqli_result now implements IteratorAggregate (instead of Traversable).

PGSQL / PDO PGSQL

The PGSQL and PDO PGSQL extensions now require at least libpq 9.1.

Readline

Calling readline_completion_function() before the interactive prompt starts (e.g. in auto_prepend_file) will now override the default interactive prompt completion function. Previously, readline_completion_function() only worked when called after starting the interactive prompt.

SimpleXML

SimpleXMLElement now implements RecursiveIterator and absorbed the functionality of SimpleXMLIterator. SimpleXMLIterator is an empty extension of SimpleXMLElement.

Changes to INI File Handling

  • com.dotnet_version is a new INI directive to choose the version of the .NET framework to use for dotnet objects.

  • zend.exception_string_param_max_len is a new INI directive to set the maximum string length in an argument of a stringified stack strace.

EBCDIC

EBCDIC targets are no longer supported, though it's unlikely that they were still working in the first place.

Performance

  • A Just-In-Time (JIT) compiler has been added to the opcache extension.

  • array_slice() on an array without gaps will no longer scan the whole array to find the start offset. This may significantly reduce the runtime of the function with large offsets and small lengths.

  • strtolower() now uses a SIMD implementation when using the "C" LC_CTYPE locale (which is the default).

User Contributed Notes

There are no user contributed notes for this page.


Migration de PHP 7.3.x vers PHP 7.4.x

Sommaire

  • Nouvelles fonctionnalités
  • Nouvelles Classes et Interfaces
  • Nouvelles fonctions
  • Nouvelles constantes globales
  • Modifications entrainant une incompatibilité ascendante
  • Fonctionnalités obsolètes
  • Extensions supprimées
  • Autres changements
  • Gestion de Windows

Cette nouvelle version mineure apporte avec elle un certain nombre de nouvelles fonctionnalités et quelques incompatibilités qui devraient être testées avant de changer les versions PHP dans les environnements de production.

Voir aussi les guides de migration entre les différentes versions de PHP 7.0.x, 7.1.x, 7.2.x et 7.3.x.

User Contributed Notes

There are no user contributed notes for this page.


Nouvelles fonctionnalités

Cœur de PHP

Propriétés typées

Les propriétés des classes supportent désormais la déclaration du type.

<?php
class User {
    public int $id;
    public string $name;
}
?>
L'exemple ci-dessus s'assurera que $user->id ne peut se voir attribuer que des valeurs d'entier et $user->name ne peut se voir attribuer que des valeurs chaîne de caractères.

Fonctions flèches

Les fonctions flèches fournissent une syntaxe courte pour définir des fonctions qui lient la portée par valeur implicitement.

<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
?>

Type de retour covariant et type d'argument contravariant limité

Le code suivant va désormais fonctionner :

<?php
class A {}
class B extends A {}

class Producer {
    public function method(): A {}
}
class ChildProducer extends Producer {
    public function method(): B {}
}
?>
Le support de variance totale est seulement disponible quand l'autoloading est utilisé. Dans un fichier unique seules des références de types non cycliques sont possibles, car toutes les classes doivent être disponibles avant qu'elles soient référencées.

Opérateur d'assignement de fusion Null

<?php
$array['key'] ??= computeDefault();
// is roughly equivalent to
if (!isset($array['key'])) {
    $array['key'] = computeDefault();
}
?>

Déballage dans les tableaux

<?php
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
?>

Séparateur numérique litéral

Les nombres littéraux peuvent contenir un caractère de soulignement entre les chiffres.

<?php
6.674_083e-11; // float
299_792_458;   // decimal
0xCAFE_F00D;   // hexadecimal
0b0101_1111;   // binary
?>

Références faibles

Les références faibles permettent au développeur de retenir une référence à un object qui n'empêche pas l'objet d'être détruit.

Autoriser des Exceptions depuis __toString()

Lancer des exceptions depuis __toString() est désormais permis. Précédemment, ceci résultait en une erreur fatale. Les erreurs fatales récupérables dans les conversions de chaîne de caractères ont été converties en exceptions Error.

CURL

CURLFile supporte désormais les enveloppes de flux en plus des noms de fichiers bruts, si l'extension a été compilée avec libcurl >= 7.56.0.

Filtre

Le filtre FILTER_VALIDATE_FLOAT supporte désormais les options min_range et max_range, avec la même sémantique que FILTER_VALIDATE_INT.

FFI

FFI est une nouvelle extension, qui fournit une manière simple d'appeler les fonctions natives, un accès natif aux variables, et la création/l'accès à des structures de données définies dans des bibliothèques C.

GD

Ajout du filtre d'image IMG_FILTER_SCATTER pour appliquer un filtre à dispersions aux images.

Hash

Ajout du hash crc32c utilisant le polynôme de Castagnoli. Cette variante de CRC32 est utilisée par les systèmes de stockage, tels que iSCSI, SCTP, Btrfs et ext4.

Chaînes Multi-octet

Ajout de la fonction mb_str_split(), qui fournit la même fonctionnalité que str_split(), mais opère sur des points de code au lieu d'octets.

OPcache

Le support pour le préchargement de code a été ajouté.

Expressions Régulières (Compatible Perl)

Les fonctions preg_replace_callback() et preg_replace_callback_array() acceptent désormais un argument flags additionnel, avec le support des drapeaux PREG_OFFSET_CAPTURE et PREG_UNMATCHED_AS_NULL. Ceci influence le format du tableau de matchs passé à la fonction de rappel.

PDO

Le nom d'utilisateur et le mot de passe peuvent désormais être spécifiés en tant que partie du DSN PDO pour les pilotes mysql, mssql, sybase, dblib, firebird et oci. Précédemment, ceci était seulement supporté pour le pilote pgsql. Si un nom d'utilisateur/mot de passe est défini à la fois dans le constructeur et le DSN, le constructeur prend précédence.

Il est désormais possible d'échapper les points d'interrogations dans les requêtes SQL pour éviter qu'ils ne soient interprétés comme paramètre fictif. Écrire ?? permet d'envoyer un seul point d'interrogation à la base de données et, par exemple, utiliser l'opérateur PostgreSQL JSON pour savoir si une clef existe (?).

PDO_OCI

PDOStatement::getColumnMeta() est désormais disponible.

PDO_SQLite

PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT) permet de vérifier si la déclaration est en lecture seule, c.à.d. si elle ne modifie pas la base de données.

PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true) active l'utilisation des codes de résultats étendus dans PDO::errorInfo() et PDOStatement::errorInfo().

SQLite3

Ajout de SQLite3::lastExtendedErrorCode() pour récupérer le dernier code étendu du résultat.

Ajout de SQLite3::enableExtendedResultCodes($enable = true), qui fera retourner des codes de résultats étendus par SQLite3::lastErrorCode().

Standard

strip_tags() avec un tableau de noms de tag

strip_tags() accepte désormais un tableau de tags autorisés : au lieu de strip_tags($str, '<a><p>') il est désormais possible d'écrire strip_tags($str, ['a', 'p']).

Linéarisation personalisée d'objets

Un nouveau mécanisme de linéarisation personalisée d'objets a été ajouté, qui utilise deux nouvelles méthodes magiques : __serialize et __unserialize.

<?php
// Retourne un tableau contenant tout l'état nécessaire de l'objet.
public function __serialize(): array;

// Restaure l'état d'un objet depuis le tableau de données fourni.
public function __unserialize(array $data): void;
?>
Le nouveau mécanisme de linéarisation succèdera à l'interface Serializable, qui sera rendu obsolète dans le futur.

Les fonctions array merge sans arguments

array_merge() et array_merge_recursive() peuvent désormais être appelées sans arguments, dans ce cas-là elles retourneront un tableau vide. Ceci est utile en conjonction avec l'opérateur de décomposition, par exemple array_merge(...$arrays).

La fonction proc_open()

proc_open() accepte désormais un tableau au lieu d'une chaîne de caractères pour la commande. Dans ce cas-là, le processus est ouvert directement (sans passer à travers un shell) et PHP s'occupera d'échapper argument nécessaire.

<?php
proc_open(['php', '-r', 'echo "Hello World\n";'], $descriptors, $pipes);
?>

proc_open() supporte désormais les descripteurs redirect et null.

<?php
// Like 2>&1 on the shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);
// Like 2>/dev/null or 2>nul on the shell
proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);
?>

argon2i(d) sans libargon

password_hash() a désormais les implémentations de argon2i et argon2id de l'extension sodium quand PHP est compilé sans libargon.

User Contributed Notes

wow-apps.pro 26-Feb-2020 08:42
<?php

// How to get property type? For example for testing:

class Foo
{
    private int $num;
    private bool $isPositive;
    private $notes;
}

$reflection = new \ReflectionClass(Foo::class);
$classProperties = $reflection->getProperties(\ReflectionProperty::IS_PRIVATE);
foreach ($classProperties as $classProperty) {
    var_dump((string) $classProperty->getType());
}

/**
 * Result:
 * "int"
 * "bool"
 * ""
 */
Rain 27-Jan-2020 08:44
It should be noted that typed properties internally are never initialized to a default null. Unless of course you initialize them to null yourself. That's why you will always going to encounter this error if you try to access them before initialization.

**Typed property foo::$bar must not be accessed before initialization**

<?php
class User
{
    public $id;
    public string $name; // Typed property (Uninitialized)
    public ?string $age = null; //  Typed property (Initialized)
}

$user = new User;
var_dump(is_null($user->id)); // bool(true)
var_dump(is_null($user->name)); // PHP Fatal error: Typed property User::$name must not be accessed before initialization
var_dump(is_null($user->age));// bool(true)
?>

Another thing worth noting is that it's not possible to initialize a property of type object to anything other than null.  Since the evaluation of properties happens at compile-time and object instantiation happens at runtime. One last thing, callable type is not supported due to its context-dependent behavior.


  • « Nouvelles fonctionnalités
  • Nouvelles fonctions »
  • PHP Manual
  • Migration de PHP 7.3.x vers PHP 7.4.x
  • Nouvelles Classes et Interfaces

Nouvelles Classes et Interfaces

Reflection

  • ReflectionReference

User Contributed Notes

There are no user contributed notes for this page.


Nouvelles fonctions

PHP Core

  • get_mangled_object_vars()
  • password_algos()
  • sapi_windows_set_ctrl_handler()

GD

  • imagecreatefromtga()

OpenSSL

  • openssl_x509_verify()

Process Control

  • pcntl_unshare()

SQLite3

  • SQLite3::backup()
  • SQLite3Stmt::getSQL()

User Contributed Notes

shaman_master at list dot ru 17-Jun-2020 11:42
Also added mb_str_split()  — given a multibyte string, return an array of its characters


Nouvelles constantes globales

PHP Core

  • PHP_WINDOWS_EVENT_CTRL_C
  • PHP_WINDOWS_EVENT_CTRL_BREAK

Chaîne multioctet

  • MB_ONIGURUMA_VERSION

Sockets

Added the following FreeBSD-specific socket options:

  • SO_LABEL
  • SO_PEERLABEL
  • SO_LISTENQLIMIT
  • SO_LISTENQLEN
  • SO_USER_COOKIE

Tidy

  • TIDY_TAG_ARTICLE
  • TIDY_TAG_ASIDE
  • TIDY_TAG_AUDIO
  • TIDY_TAG_BDI
  • TIDY_TAG_CANVAS
  • TIDY_TAG_COMMAND
  • TIDY_TAG_DATALIST
  • TIDY_TAG_DETAILS
  • TIDY_TAG_DIALOG
  • TIDY_TAG_FIGCAPTION
  • TIDY_TAG_FIGURE
  • TIDY_TAG_FOOTER
  • TIDY_TAG_HEADER
  • TIDY_TAG_HGROUP
  • TIDY_TAG_MAIN
  • TIDY_TAG_MARK
  • TIDY_TAG_MENUITEM
  • TIDY_TAG_METER
  • TIDY_TAG_NAV
  • TIDY_TAG_OUTPUT
  • TIDY_TAG_PROGRESS
  • TIDY_TAG_SECTION
  • TIDY_TAG_SOURCE
  • TIDY_TAG_SUMMARY
  • TIDY_TAG_TEMPLATE
  • TIDY_TAG_TIME
  • TIDY_TAG_TRACK
  • TIDY_TAG_VIDEO

User Contributed Notes

There are no user contributed notes for this page.


Modifications entrainant une incompatibilité ascendante

PHP Core

Accès de type tableau des non-tableaux

Essayer d'utiliser des valeurs de type null, bool, int, float ou ressource comme un tableau (comme $null["clé"]) va maintenant générer un avis.

Fonction get_declared_classes()

La fonction get_declared_classes() ne renvoie plus les classes anonymes qui n'ont pas encore été instanciées.

mot-clé fn

fn est maintenant un mot-clé réservé. En particulier, il ne peut plus être utilisé comme une fonction ou un nom de classe. Il peut encore être utilisé comme une méthode ou un nom de constante de classe.

<?php tag à la fin du fichier

<?php à la fin du fichier (sans nouvelle ligne) sera désormais interprété comme une balise PHP d'ouverture. Auparavant, il était interprété soit comme une balise courte d'ouverture suivie d'une php littérale et aboutissait à une erreur de syntaxe (avec short_open_tag=1) ou était interprété comme une chaîne <?php (avec short_open_tag=0).

Filtres de flux

Lors de l'utilisation de include/require sur un flux, streamWrapper::stream_set_option() sera invoqué avec l'option STREAM_OPTION_READ_BUFFER. Les implémentations de filtre de flux personnalisés peuvent avoir besoin d'implémenter la méthode streamWrapper::stream_set_option() pour éviter un avertissement (toujours en retouner false est une implémentation suffisante).

Sérialisation

Le format o de sérialisation a été supprimé. Comme il n'est jamais produit par PHP, cela peut seulement briser la déserialisation des chaînes construites manuellement.

Constantes d'algorithme de mot de passe

Les identificateurs d'algorithme de hachage de mot de passe sont maintenant des chaînes nullables plutôt que des entiers.

  • PASSWORD_DEFAULT était l'entier 1; maintenant est null
  • PASSWORD_BCRYPT était l'entier 1; maintenant est '2y'
  • PASSWORD_ARGON2I était l'entier 2; maintenant est 'argon2i'
  • PASSWORD_ARGON2ID était l'entier 3; maintenant est 'argon2id'

Applications utilisant correctement les constantes PASSWORD_DEFAULT, PASSWORD_BCRYPT, PASSWORD_ARGON2I, et PASSWORD_ARGON2ID continueront à fonctionner correctement.

Fonction htmlentities()

htmlentities() va maintenant lever un avis (au lieu d'un avertissement de normes strictes) s'il est utilisé avec un codage pour lequel seule la substitution d'entité de base est supportée, auquel cas il est équivalent à htmlspecialchars().

Les fonctions fread() et fwrite()

fread() et fwrite() vont maintenant retourner false si l'opération échoue. Auparavant, une chaîne vide ou 0 était retourné(e). EAGAIN/EWOULDBLOCK ne sont pas considérés comme des échecs.

Ces fonctions soulèvent également un avis sur l'échec, par exemple lorsque vous essayez d'écrire à une ressource de fichier en lecture uniquement.

BCMath Arbitrary Precision Mathematics

Les fonctions BCMath avertiront désormais si un nombre non bien formé est adopté, tel que "32foo". L'argument sera interprété comme zéro, comme avant.

CURL

Tenter de sérialiser une classe CURLFile va maintenant générer une exception. Auparavant, l'exception n'était lancée que sur la désérialisation.

L'utilisation de CURLPIPE-HTTP1 est dépréciée et n'est plus prise en charge à partir de 7.62.0 cURL.

Le paramètre $version de curl_version () est déprécié. Si une valeur n'est pas égale à la valeur par défaut CURLVERSION_NOW est passé, un avertissement est levé et le paramètre est ignoré.

Date et heure

Appeler var_dump() ou similaire sur une instance DateTime ou DateTimeImmutable ne laissera plus de propriétés accessibles sur l'objet.

La comparaison des objets DateInterval (à l'aide de ==, <, etc.) va maintenant générer un avertissement et toujours retourner false. Auparavant, tous les DateInterval objets étaient considérés comme égaux, à moins qu'ils n'aient des propriétés.

Intl

La valeur par défaut du paramètre de idn_to_ascii() et idn_to_utf8() est maintenant INTL_IDNA_VARIANT_UTS46 au lieu de la valeur déconseillée INTL_IDNA_VARIANT_2003.

MySQLi

La fonctionnalité du serveur intégré a été supprimée. Elle a été cassée depuis au moins PHP 7.0.

La propriété non documentée mysqli::$stat a été supprimée au profit de mysqli::stat().

OpenSSL

La fonction openssl_random_pseudo_bytes() lance une exception dans les situations d'erreur, semblable à random_bytes(). En particulier, un Error est lancé si le nombre d'octets demandés est inférieur ou égal à zéro, et une Exception est lancé si un caractère aléatoire suffisant ne peut pas être recueilli. L'argument de sortie $crypto_strong output est garanti d'être toujours true si la fonction ne lance pas d'exception, afin de vérifier explicitement qu'il n'est pas nécessaire.

Expressions rationnelles (compatible Perl)

Lorsque le mode PREG_UNMATCHED_AS_NULL est utilisé, les groupes de capture non trouvés seront désormais également réglés à null (ou [null, -1] si la capture offset est activée). Cela signifie que la taille de $matches sera toujours la même.

PHP Data Objects

Une tentative de sérialisation d'une instance de PDO ou PDOStatement va désormais générer une Exception plutôt qu'une PDOException, compatible avec d'autres classes internes qui ne prennent pas en charge la sérialisation.

Reflection

Les objets Reflection génèrent désormais une exception si une tentative est faite pour les sérialiser. La sérialisation des objets Reflection n'a jamais été prise en charge et a donné lieu à des objets Reflection corrompus. Il a été explicitement interdit maintenant.

Bibliothèque PHP standard (SPL)

L'appel get_object_vars() sur une instance ArrayObject retournera toujours les propriétés de l'ArrayObject lui-même (ou d'une sous-classe). Auparavant, il retournait les valeurs du tableau/objet à moins que le drapeau ArrayObject::STD_PROP_LIST n'ai été spécifié.

Les autres opérations touchées sont les suivante :

  • ReflectionObject::getProperties()
  • reset(), current(), etc. Utiliser plutôt les méthodes d'Iterator.
  • Potentiellement d'autres fonctions travaillant sur les propriétés de l'objet comme une liste, e.g. array_walk().

Les modifications de type (array) ne sont pas affectés. Ils continueront à retourner soit le tableau enveloppé, soit les propriétés ArrayObject, selon que le drapeau ArrayObject::STD_PROP_LIST est utilisé.

SplPriorityQueue::setExtractFlags() lancera une exception si zéro est passé. Auparavant, cela générerait une erreur fatale récupérable lors de la prochaine opération d'extraction.

ArrayObject, ArrayIterator, SplDoublyLinkedList et SplObjectStorage gèrent maintenant __serialize() et __unserialize() en plus de l'interface Serializable. Cela signifie que les charges utiles de sérialisation créées sur les anciennes versions PHP peuvent toujours être désérialisées, mais les nouvelles charges utiles créées par PHP 7.4 ne seront pas compatibles par les anciennes versions.

Tokenizer

token_get_all() émettra maintenant un jeton T-BAD-CHARACTER pour les caractères inattendus au lieu de laisser derrière eux des trous dans le flux de jetons.

Cookies entrants

Depuis PHP 7.4.11, le nom des cookies entrants ne sont plus url-décodés pour des raisons de sécurité.

User Contributed Notes

happydog at kennel17 24-Jan-2021 11:23
Re: "The o serialization format has been removed. As it is never produced by PHP, this may only break unserialization of manually crafted strings."

This little-o serialisation format was used by PHP3 but was never generated by PH PHP4 or above.  The deserialization code still recognised it, though, for reasons of backwards-compatibility with PHP3.

However, based on a bit of investigation, it looks like this code has been broken for about 15 years, so although this is listed as a deprecation, in practice it wasn't.

See this Stack Overflow question for a really great answer, with a lot more detail about this: https://stackoverflow.com/questions/65289729/what-was-phps-o-serialization-format-for


Fonctionnalités obsolètes

Cœur de PHP

Opérateurs ternaires imbriqués sans parenthèses explicites

Les opérateurs ternaires imbriqués doivent explicitement utiliser des parenthèses pour dicter l'ordre des opérations. Précedement, quand utilisée sans parenthèses, l'associativité-gauche ne résulterait pas dans le comportement attendue pour la plupart des cas.

<?php
1 ? 2 : 3 ? 4 : 5;   // obsolète
(1 ? 2 : 3) ? 4 : 5; // ok
1 ? 2 : (3 ? 4 : 5); // ok
?>

Les parenthèses ne sont pas requis lors de l'imbrication dans l'opérant du milieu car ceci est toujours sans ambiguïté et n'est pas affecté par l'associativité :

1 ? 2 ? 3 : 4 : 5 // ok

Accès de position de tableau et de chaînes en utilisant les accolades

La syntaxe pour accéder à la position des tableaux et chaîne de caractères avec les accolades est obsolète. Utiliser $var[$idx] au lieu de $var{$idx}.

Le transtypage (real) et la fonction is_real()

Le transtypage (real) est obsolète, utiliser (float) à la place.

La fonction is_real() est aussi obsolète, utiliser is_float() à la place.

Délier $this quand $this est utilisé

Délié $this d'une fermeture non statique qui utilise $this est obsolète.

Mot clé parent sans classe parente

L'utilisation de parent à l'intérieur d'une classe sans parent est obsolète, et émettra une erreur lors de la compilation dans le futur. Actuellement seul une erreur sera générée si/quand un parent est accédé lors de l'exécution.

Option INI allow_url_include

La directive INI allow_url_include est obsolète. L'activer génèrera un avis d'obsolescence lors du démarrage.

Caractères invalides dans les fonctions de conversion de base

Passer des caractères invalides à base_convert(), bindec(), octdec() et hexdec() génèrera désromais avis d'obsolescence. Le résultat sera toujours calculé comme si les caractères invalides n'existaient pas. Les caractères d'espacement blanc, aussi bien que les préfixes de type 0x (en fonction de la base) continue d'être accepté.

L'utilisation de array_key_exists() sur des objets

L'utilisation de array_key_exists() sur des objets est obsolète. À la place isset() ou property_exists() devraient être utilisé.

Fonctions des guiellemets magiques

Les fonctions get_magic_quotes_gpc() et get_magic_quotes_runtime() sont obsolètes. Elles retournent toujours false.

Fonction hebrevc()

La fonction hebrevc() est obsolète. Elle peut être remplacée par nl2br(hebrev($str)) ou, de préférence, en utilisant le support Unicode RTL (Droite à Gauche).

Fonction convert_cyr_string()

La fonction convert_cyr_string() est obsolète. Elle peut être remplacée par l'une de mb_convert_string(), iconv() ou UConverter.

Fonction money_format()

La fonction money_format() est obsolète. Elle peut être remplacée par la fonctionnalité intl NumberFormatter.

Fonction ezmlm_hash()

La fonction ezmlm_hash() est obsolète.

Fonction restore_include_path()

La fonction restore_include_path() est obsolète. Elle peut être remplacée par ini_restore('include_path').

Implode avec l'ordre de paramètre historique

Passer les paramètres à implode() dans l'ordre inverse est obsolète, utiliser implode($glue, $parts) au lieu de implode($parts, $glue).

COM

L'importation de bibliothèques de type avec l'enregistrement de constantes non sensible à la casse a été rendu obsolète.

Filtre

FILTER_SANITIZE_MAGIC_QUOTES est obsolète, utiliser FILTER_SANITIZE_ADD_SLASHES à la place.

Chaînes Multi-octet

Passer un pattern qui n'est pas une chaîne de caractères à mb_ereg_replace() est obsolète. Actuellement, les patterns qui ne sont pas des chaîne de caractères sont interprétés en tant que point de code ASCII. En PHP 8, le pattern sera interprété comme une chaîne de caractères à la place.

Passer l'encodage en tant que troisième paramètre à mb_strrpos() est obsolète. À la place passer une position de 0, et l'encodage en tant que quatrième paramètre.

Lightweight Directory Access Protocol (LDAP)

ldap_control_paged_result_response() et ldap_control_paged_result() sont obsolètes. Les contrôles de paginations peuvent être envoyés avec ldap_search() à la place.

Reflection

L'appel à ReflectionType::__toString() génère maintenant un avis d'obsolescence. Cette méthode a été dépréciée en faveur de ReflectionNamedType::getName() dans la documentation à partir de PHP 7.1, mais ne lançait pas un avis d'obsolescence pour des raisons techniques.

Les méthodes export() dans toutes les classes Reflection sont obsolètes. Créer un objet Reflection et le convertir en chaîne de caractères à la place :

<?php
// ReflectionClass::export(Foo::class, false) est :
echo new ReflectionClass(Foo::class), "\n";

// $str = ReflectionClass::export(Foo::class, true) est :
$str = (string) new ReflectionClass(Foo::class);
?>

Socket

Les drapeaux AI_IDN_ALLOW_UNASSIGNED et AI_IDN_USE_STD3_ASCII_RULES pour socket_addrinfo_lookup() sont obsolètes, en raison d'une dépréciation en amont dans glibc.

User Contributed Notes

Techlemur 13-Nov-2020 08:58
^((?!\().*)(\?[^php]).*(\:)([\s\v]+)(?!\().*[^\/](\?)([\s\v\h]*).*(\:[^=])
Regex to find deprecated nested ternaries
Ahmad Asjad 03-Jun-2020 10:01
(\?[^php]).*(\:).*(\?).*(\:[^=])
Above regex can help others to find the nested ternary operator


Extensions supprimées

Ces extensions ont été transférées à PECL et ne font plus partie de la distribution PHP. Les versions paquet PECL de ces extensions seront créées en fonction de la demande des utilisateurs.

  • Firebird/Interbase - l'accès à une base de données InterBase et/ou Firebird est toujours disponible avec le pilote Firebird du PDO.
  • Recode
  • WDDX

User Contributed Notes

There are no user contributed notes for this page.


Autres changements

Amélioration des Performances

Cœur de PHP

Un opcode de VM spécialisé pour la fonction array_key_exists() a été ajouté, ceci améliore les performances de cette fonction si elle peut être résolue statiquement. Dans du code sous un espace de nom, ceci peut nécessité d'écrire \array_key_exists() ou importer explicitement la fonction.

Expression Régulières (Compatible Perl)

Quand preg_match() en mode UTF-8 (modificateur "u") est appelée à plusieurs reprises sur la même chaîne de caractères (mais posiblement différentes positions), elle ne sera vérifiée qu'une seule fois pour la validité UTF-8.

Modifications Apportées à la Gestion de Fichiers INI

zend.exception_ignore_args est une nouvelle directive INI pour inclure ou exclure les arguments des traces de pile généré par les exceptions.

opcache.preload_user est une nouvelle directive INI permettant de spécifier le compte utilisateur ayant pour rôle d'exécuter le code pré-chargé (l'utilisateur root n'est pas autorisé pour des raisons de sécurité).

Migration vers pkg-config

Un nombre d'extension ont été migré pour utiliser exclusivement pkg-config pour la détection des dépendances de bibliothèques. Généralement, ceci signifie qu'au lieu d'utiliser --with-foo-dir=DIR ou similaire seul --with-foo est utilisé. Les chemins de bibliothèques personalisés peuvent être spécifié soit en ajoutant des dossiers supplémentaires à PKG_CONFIG_PATH soit en spécifiant les options de compilations explicitement à travers FOO_CFLAGS et FOO_LIBS.

Les extensions et SAPIs suivants sont affectées :

  • CURL :
    • --with-curl n'accepte plus un dossier.
  • Enchant :
    • --with-enchant n'accepte plus un dossier.
  • FPM :
    • --with-fpm-systemd utilise désormais uniauement pkg-config pour les vérifications libsystem. La version minimale libsystemd requise est 209.
  • GD :
    • --with-gd devient --enable-gd (pour activer l'extension) et --with-external-gd (pour opter pour l'utilisation d'un libgd externe, plutôt que celui fourni).
    • --with-png-dir a été supprimé. libpng est requis.
    • --with-zlib-dir a été supprimé. zlib est requis.
    • --with-freetype-dir devient --with-freetype
    • --with-jpeg-dir devient --with-jpeg
    • --with-webp-dir devient --with-webp
    • --with-xpm-dir devient --with-xpm
  • IMAP :
    • --with-kerberos-systemd n'accepte plus un dossier.
  • Intl :
    • --with-icu-dir a été supprimé. Si --enable-intl est passé, alors libicu est toujours requis.
  • LDAP :
    • --with-ldap-sasl n'accepte plus un dossier.
  • Libxml :
    • --with-libxml-dir a été supprimé.
    • --enable-libxml devient --with-libxml.
    • --with-libexpat-dir a été renommé en --with-expat et n'accepte plus un dossier.
  • Litespeed :
    • --with-litespeed devient --enable-litespeed.
  • Mbstring :
    • --with-onig a été supprimé. Suf si --disable-mbregex a été passé, libonig est requis.
  • ODBC :
    • --with-iodbc n'accepte plus un dossier.
    • --with-unixODBC sans un dossier utilise désormais phg-config (préférable). Le dossier est toujours accepté pour les anciennes versions sans libodbc.pc.
  • OpenSSL :
    • --with-openssl n'accepte plus un dossier.
  • PCRE :
    • --with-pcre-regex a été supprimé. À la place --with-external-pcre est offert pour opter pour l'utilisation d'une bibliothèque PCRE externe, plutôt que celle fourni.
  • PDO_SQLite :
    • --with-pdo-sqlite n'accepte plus un dossier.
  • Readline :
    • --with-libedit n'accepte plus un dossier.
  • Sodium :
    • --with-sodium n'accepte plus un dossier.
  • SQLite3 :
    • --with-sqlite3 n'accepte plus un dossier.
  • XSL :
    • --with-xsl n'accepte plus un dossier.
  • Zip :
    • --with-libzip a été supprimé.
    • --enable-zip devient --with-zip.

Échappement CSV

fputcsv(),
fgetcsv(),
SplFileObject::fputcsv(),
SplFileObject::fgetcsv(), et
SplFileObject::setCsvControl()
acceptent désormais une chaîne de caractères vide en tant qu'argument
$escape, qui désactive le mécanisme d'échappement
propriétaire de PHP.

Le comportement de str_getcsv() a été ajusté par conséquent has been (auparavant, une chaîne de caractères vide était identique à utiliser les valeurs par défault).

SplFileObject::getCsvControl() peut, par conséquent désormais aussi retourner une chaîne de caractères vide pour le troisième élément du tableau.

Filtration de Données

L'extension filter n'expose plus --with-pcre-dir pour les builds Unix qui peut désormais être compilé de manière fiable en tant que partagé lors de l'utilisation de ./configure

GD

Le comportement de imagecropauto() dans la bibliothèque libgd fourni a été synchronisé avec celle de libgd système :

  • IMG_CROP_DEFAULT ne se replie plus sur IMG_CROP_SIDES
  • Le seuil-recadrage (Threshold-cropping) utilise désormais l'algorithme de libgd système.

La paramètre par défaut $mode de imagecropauto() a été modifié en IMG_CROP_DEFAULT ; fournir -1 est désormais obsolète.

imagescale() supporte désormais la préservation du rapport hauteur / largeur lors de la mise à échelle à une hauteur fixe en passant -1 à $new_width.

HASH Message Digest Framework

L'extension hash ne peut plus être désactivé et est toujours une part intégrale de n'importe quel build PHP, similaire à l'extension date.

Intl

L'extension intl requis désormais au moins ICU 50.1.

ResourceBundle implémente désormais Countable.

Lightweight Directory Access Protocol (LDAP)

Support pour nsldap et umich_ldap ont été supprimées.

Libxml

Toutes les extensiosn basées sur libxml nécessite lib 2.7.6 ou ultérieur.

Chaînes Multi-octet

La bibliothèque oniguruma n'est plus fourni avec PHP, à la place libonig doit être disponible sur le système. Alternativement --disable-mbregex peut être utilisé pour désactiver le composant mbregex.

OPcache

Les options de configurations --disable-opcache-file et --enable-opcache-file ont été supprimées en faveur de la directive INI opcache.file_cache.

Hachage de Mot de Passe

Les fonctions password_hash() et acceptent désormais des chaîne de caractères et entier nullable pour l'arguement $algo.

PEAR

L'installation de PEAR (inclus PECL) n'est plus activé par défault. Ceci peut être explicitement activé en utilisant --with-pear. Cette option est obsolète et pourra être supprimée dans le futur.

Reflection

Les valeurs numériques des consantes de modificateur (IS_ABSTRACT, IS_DEPRECATED, IS_EXPLICIT_ABSTRACT, IS_FINAL, IS_IMPLICIT_ABSTRACT, IS_PRIVATE, IS_PROTECTED, IS_PUBLIC, et IS_STATIC) sur les classes ReflectionClass, ReflectionFunction, ReflectionMethod, ReflectionObject, et ReflectionProperty ont été modifié.

SimpleXML

SimpleXMLElement implémente désormais Countable.

SQLite3

La bibliothèque libsqlite intégré a été supprimée. Pour compilier l'extension SQLite3 une libsqlite3 = 3.7.4 système est désormais requis. Pour compiler l'extension PDO_SQLite une libsqlite3 = 3.5.0 système est désormais requis.

La linéarisation et délinéarisation de SQLite3, SQLite3Stmt et SQLite3Result est désormais explicitement interdit. Auparavent, la linéarisation d'instances de ces classes étaient possible, mais la dénéarisation générait des objets inutilisables.

La notation @param peut désormais être utilisé pour dénoter les paramètres de requête SQL.

Zip

La bibliothèque libzip intégré a été supprimée. Une libzip >= 0.11 système est désormais requis pour compiler l'extension zip.

User Contributed Notes

santi at mola dot io 31-Jul-2020 07:54
Note for internals/extensions:

Many opcode values changed between PHP 7.3 and 7.4, so most documentation resources are outdated in that regard. You can look the definitions at Zend/zend_vm_opcodes.h in php-src. For example, ZEND_ECHO changes from 40 to 136.

While opcode changes happen in a lot of PHP versions, the change in 7.4 is quite significant.
ohcc at 163 dot com 09-Jun-2020 04:56
As of PHP 7.4, an exception thrown within the user-defined shutdown function can be caught by the user-defined exception handler.

<?php
    set_error_handler(
        function($level, $error, $file, $line){
            if(0 === error_reporting()){
                return false;
            }
            throw new ErrorException($error, -1, $level, $file, $line);
        },
        E_ALL
    );

    register_shutdown_function(function(){
        $error = error_get_last();
        if($error){
            throw new ErrorException($error['message'], -1, $error['type'], $error['file'], $error['line']);
        }
    });

    set_exception_handler(function($exception){
        // ... more code ...
    });

    require 'NotExists.php';
Florent H (Sowapps) 16-Feb-2020 07:37
This version brings an important changes with the directive zend.exception_ignore_args set to On by default.
In all stack traces, the args key is now missing.
All php frameworks have to handle this to report errors & exceptions.


Gestion de Windows

Drapeaux configure

configure supporte les variables d'environnement CFLAGS et LDFLAGS.

Traitement CTRL

CTRL+C et CTRL+BREAK sur la console peut être pris en définissant un gestionnaire avec la fonction sapi_windows_set_ctrl_handler().

L'option "create_process_group" peut être passé à proc_open() sur Windows. Elle est nécessaire si le processus enfant est censé gérer les événements CTRL.

OPcache

OPcache prend désormais en charge un nombre arbitraire de caches séparées par utilisateur via la directive INI opcache.cache-id. Tous les processus avec le même identifiant de cache et le même utilisateur partagent une instance OPcache.

stat

L'implémentation de la stat a été refactorisée.

  • Un numéro d'inode est livré et est basé sur l'index de fichier NTFS.
  • Le numéro de l'appareil est maintenant basé sur le numéro de série du volume.

Notez que les deux valeurs sont dérivées du système et fournies tel qu'il est sur les systèmes 64 bits. Sur les systèmes 32 bits, ces valeurs peuvent dépasser l'entier 32 bits dans PHP, donc ils sont faux.

libsqlite3

libsqlite3 n'est plus compilé statiquement en php_sqlite3.dll et php_pdo_sqlite.dll, mais plutôt est disponible en tant que libsqlite3.dll. Se référer aux instructions d'installation de SQLite3 et PDO_SQLITE, respectivement.

User Contributed Notes

There are no user contributed notes for this page.


Migration de PHP 7.2.x vers PHP 7.3.x

Sommaire

  • Nouvelles fonctionnalités
  • Nouvelles fonctions
  • Nouvelles constantes globales
  • Modifications entrainant une incompatibilité ascendante
  • Fonctionnalités devenues obsolètes
  • Autres changements
  • Support de Windows

Cette nouvelle version mineure apporte avec elle un certain nombre de nouvelles fonctionnalités et quelques incompatibilités qui devraient être testées avant de changer les versions PHP dans les environnements de production.

Voir aussi les guides de migration entre les différentes versions de PHP 7.0.x, 7.1.x et 7.2.x.

User Contributed Notes

jrg dot guzz at gmail dot com 10-Jun-2020 09:00
Como parte del aumento de la seguridad, se recomienda mantener actualizada su versión de PHP. Aquí hemos proporcionado los pasos para actualizar la versión actual de PHP 7.2 a 7.3 en las versiones de Ubuntu 14/16/18 /19/20 sin eliminar la anterior. Para que podamos volver a las versiones anteriores si hay algo incompatible con la nueva después de cambiar.
    1. Inicie sesión en el servidor a través de SSH como root.
       * Sino sabes no importa usa el comando sudo (como yo)
    2. Verifique su versión actual de PHP.
       $ php -v
PHP 7.2.36

    3. Para instalar PHP 7.3, primero debemos agregar el repositorio:
       (Mucho ojo  aquí,(PRECAUCIÓN) ...Si te encuentras en la versión Ubuntu  19 / 20 no es necesario agregar repositorios , los trae por default.Puedes consultar con este comando los repositorios:

 $sudo apt-cache policy | grep http | awk '{print $2 $3}' | sort -u

 Sino se encuentran app/php o app/apache2 usa este comando:

$sudo add-apt-repository ppa: ondrej / php

    4. Luego ejecute una actualización:
$sudo apt-get update

    5. Después de completar la actualización, necesitamos instalar PHP 7.3.
$ sudo apt install php7.3

    6.  Luego instale los paquetes PHP requeridos según su instalación actual:
$sudo apt install php7.3-common php7.3-cli php7.3-bz2 php7.3-curl php7.3-gd php7.3-intl php7.3-json php7.3-readline php7.3-xml php7. 3-zip php7.3-fpm php7.3-bcmath php7.3-mbstring

      Se suman nuevos comandos para la version 7.3 de Php.En el orden que se escriben para no dañar los modulos.

Detener el Servidor Apache
$sudo systemctl stop apache2

Desactivar el Modulo Php 7.2
 $sudo a2dismod php7.2

Activas Modulo Proxy fcgi
$sudo a2enmod proxy_fcgi setenvif

Activar Modulo fpm
$sudo a2enmod php7.3-fpm

Activar Modulo de Php 7.3
$sudo a2enmod php7.3

    7. Luego reinicie Apache:
$sudo systemctl start apache2

    8. Por último comprobamos el Status del Sercidor Apache2, apagar y  prender un par de veces el servidor.(Todo correcto):

 $sudo systenctl status apache2

    9. La nueva versión de PHP debería estar activa ahora. Puede verificarlo desde la línea de comando:

$php -v
PHP 7.3.28


Nouvelles fonctionnalités

Cœur de PHP

Syntaxe Plus Flexible pour Heredoc et Nowdoc

Le marqueur fermant pour les chaînes doc n'est plus requis d'être suivi par un point virgule ou un retour à la ligne. Additionellement le marqueur fermant peut être indenté, dans ce cas l'indentation sera retirée de toute les lignes dans la chaîne doc.

La Déstructuration de Tableaux prend en charge les Assignations de Référence

La déstructuration de tableaux supporte désormais les assignements de référence en utilisant la syntaxe [&$a, [$b, &$c]] = $d. Ceci est aussi supporté pour list().

L'Opérateur Instanceof accepte les Littéraux

instanceof accepte désormais les littéraux comme premier opérant, dans ce cas le résultat est toujours false.

Exception CompileError au lieu de quelques Erreurs de Compilation

Une nouvelle exception CompileError a été ajoutée, duquel ParseError inhérite. Un petit nombre d'erreurs de compilation lanceront désormais CompileError au lieu de générer une erreur fatale. Actuellement ceci affecte uniquement les erreurs de compilation qui peuvent être lancées par token_get_all() dans le mode TOKEN_PARSE, mais plus d'erreurs pourront être converties dans le futur.

Les Virgules de Fin sont Autorisés dans les Appels

Les virgules de fin dans les appels de fonctions et méthodes sont désormais autorisées.

Support pour Argon2id

L'argument de configuration --with-password-argon2[=dir] fournit désormais le support pour les hash Argon2i et Argon2id dans les fonctions password_hash(), password_verify(), password_get_info(), et password_needs_rehash(). Les mots de passe peuvent être hachés et vérifiés en utilisant la constante PASSWORD_ARGON2ID. Le support pour Argon2i et Argon2id dans les fonctions password_*() nécessite désormais que PHP soit lié contre la bibliothèque de référence libargon2 = 20161029.

Gestionnaire de Processus FastCGI

De nouvelles options ont été ajoutées pour personnaliser les journaux d'événements FPM :

log_limit
Cette option globale peut être utilisée pour définir la limite de journal pour la ligne journalisée, ce qui permet de consigner des messages de plus de 1024 caractères sans retour à la ligne. Il corrige également divers problèmes d'emballage (retour à la ligne).
log_buffering
Cette option globale permet une journalisation expérimentale sans mise en mémoire tampon supplémentaire.
decorate_workers_output
Cette option de pool permet de désactiver la décoration de sortie pour les sorties des workers quand catch_workers_output est activé.

Fonctions BC Math

bcscale() peut désormais être utilisé en tant que récupérateur pour récupérer la précision actuellement en utilisation.

Lightweight Directory Access Protocol

Support total pour les Contrôles LDAP a été ajouté au fonctions de requête LDAP et ldap_parse_result() :

  • Un paramètre $serverctrls pour envoyer les contrôles
au serveur dans ldap_add(),
ldap_mod_replace(), ldap_mod_add(),
ldap_mod_del(), ldap_rename(),
ldap_compare(), ldap_delete(),
ldap_modify_batch(),
ldap_search(), ldap_list() et
ldap_read() a été ajouté.
  • Le paramètre de sortie $serverctrls pour récupérer les contrôles depuis le serveur dans ldap_parse_result() a été ajouté.
  • Support pour LDAP_OPT_SERVER_CONTROLS et LDAP_OPT_CLIENT_CONTROLS dans ldap_get_option() et ldap_set_option() a été corrigé.

Fonctions pour les Chaînes Multi-Octets

Support pour le Mappage Pleine Casse et Pliage de Casse

Support pour le mappage pleine casse et pliage de casse a été ajouté. Contrairement au mappage basique de casse, le mapping pleine casse peut modifier la longueur de la chaîne. Par exemple :

<?php
mb_strtoupper("Straße");
// Produit STRAßE en PHP 7.2
// Produit STRASSE en PHP 7.3
?>
Les différents mode de mappage et de pliage de casse sont disponible à travers mb_convert_case() :
  • MB_CASE_LOWER (utilisé par mb_strtolower())
  • MB_CASE_UPPER (utilisé par mb_strtoupper())
  • MB_CASE_TITLE
  • MB_CASE_FOLD
  • MB_CASE_LOWER_SIMPLE
  • MB_CASE_UPPER_SIMPLE
  • MB_CASE_TITLE_SIMPLE
  • MB_CASE_FOLD_SIMPLE (utilisé par les opérations insensible à la casse)
Seul un mappage complet des cas, inconditionnel et indépendant de la langue, est effectué.

Les Opérations de Chaînes Insensible à la Casse utilise le Pliage de Casse

Les opérations de chaînes insensible à la casse utilise désormais le pliage de casse au lieu du mappage de casse lors des comparaisons. Ceci signifie que plus de caractères seront considéré (insensible à la casseà égal désormais.

MB_CASE_TITLE exécute une Conversion Casse de Titre

mb_convert_case() avec MB_CASE_TITLE exécute désormais une conversion casse de titre basé sur les propriétés dérivé Unicode Cased et CaseIgnorable. En particulier ceci améliore aussi la gestions des guillemets et apostrophes.

Support pour Unicode 11

Les tables de données pour les Chaînes Multi-octets ont été mis à jour pour Unicode 11.

Support pour les Chaînes Longues

Les Fonctions de Chaînes Multi-Octets supportent désormais correctement les chaînes plus grande que 2Go.

Amélioration des Performances

Les performances de l'extension des Chaînes Multi-Octets a été amélioré de façon significative à tous les niveaux. Les plus grandes améliorations sont dans les fonctions de convertion de casse.

Support pour les Captures Nommées

Les fonctions mb_ereg_* supportent désormais les captures nommées. Les fonctions de correspondances comme mb_ereg() retourneront désormais les captures nommées en utilisant à la fois leurs numéro de groupe et leurs nom, similaire à PCRE :

<?php
mb_ereg('(?<word>\w+)', '?', $matches);
// => [0 => "?", 1 => "?", "word" => "?"];
?>
De plus, mb_ereg_replace() supporte désormais les notations \k<> et \k'' pour faire référence au captures nommées dans la chaîne de remplacement :
<?php
mb_ereg_replace('\s*(?<word>\w+)\s*', "_\k<word>_\k'word'_", ' foo ');
// => "_foo_foo_"
?>
\k<> et \k'' peuvent aussi être utilisé pour les références numériques, qui fonctionnent aussi avec des nombres de groupe supérieur à 9.

Readline

Le support pour les options completion_append_character et completion_suppress_append ont été ajoutées à readline_info(). Ces options sont seulement disponible si PHP est lié contre libreadline (plutôt que libedit).

User Contributed Notes

yoander dot valdes at yahoo dot com 31-May-2019 11:34
"Trailing commas in function and method calls are now allowed" means function parameters, example:

<?php

function my1() {
        echo "xxxxxx\n";
}

function my2() {
        echo "yyyyyy\n";
}

my1(),my2(); // PHP Parse error:  syntax error

my1(,); // PHP Parse error:  syntax error

my1(1,); my2(2,); // OK

?>


Nouvelles fonctions

Cœur de PHP

  • array_key_first()
  • array_key_last()
  • gc_status()
  • hrtime()
  • is_countable()
  • net_get_interfaces()

FastCGI Process Manager

  • fpm_get_status()

Date et Temps

  • DateTime::createFromImmutable()

GNU Multiple Precision

  • gmp_binomial()
  • gmp_kronecker()
  • gmp_lcm()
  • gmp_perfect_power()

Fonctions d'Internationalisation

  • Normalizer::getRawDecomposition()
  • normalizer_get_raw_decomposition()
  • Spoofchecker::setRestrictionLevel()

Lightweight Directory Access Protocol (LDAP)

  • ldap_add_ext()
  • ldap_bind_ext()
  • ldap_delete_ext()
  • ldap_exop_refresh()
  • ldap_mod_add_ext()
  • ldap_mod_replace_ext()
  • ldap_mod_del_ext()
  • ldap_rename_ext()

OpenSSL

  • openssl_pkey_derive()

Sockets

  • socket_wsaprotocol_info_export()
  • socket_wsaprotocol_info_import()
  • socket_wsaprotocol_info_release()

User Contributed Notes

There are no user contributed notes for this page.


Nouvelles constantes globales

Cœur de PHP

  • PASSWORD_ARGON2ID

Librairie Client URL

  • CURLAUTH_BEARER
  • CURLAUTH_GSSAPI
  • CURLE_WEIRD_SERVER_REPLY
  • CURLINFO_APPCONNECT_TIME_T
  • CURLINFO_CONNECT_TIME_T
  • CURLINFO_CONTENT_LENGTH_DOWNLOAD_T
  • CURLINFO_CONTENT_LENGTH_UPLOAD_T
  • CURLINFO_FILETIME_T
  • CURLINFO_HTTP_VERSION
  • CURLINFO_NAMELOOKUP_TIME_T
  • CURLINFO_PRETRANSFER_TIME_T
  • CURLINFO_PROTOCOL
  • CURLINFO_PROXY_SSL_VERIFYRESULT
  • CURLINFO_REDIRECT_TIME_T
  • CURLINFO_SCHEME
  • CURLINFO_SIZE_DOWNLOAD_T
  • CURLINFO_SIZE_UPLOAD_T
  • CURLINFO_SPEED_DOWNLOAD_T
  • CURLINFO_SPEED_UPLOAD_T
  • CURLINFO_STARTTRANSFER_TIME_T
  • CURLINFO_TOTAL_TIME_T
  • CURL_LOCK_DATA_CONNECT
  • CURL_LOCK_DATA_PSL
  • CURL_MAX_READ_SIZE
  • CURLOPT_ABSTRACT_UNIX_SOCKET
  • CURLOPT_DISALLOW_USERNAME_IN_URL
  • CURLOPT_DNS_SHUFFLE_ADDRESSES
  • CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS
  • CURLOPT_HAPROXYPROTOCOL
  • CURLOPT_KEEP_SENDING_ON_ERROR
  • CURLOPT_PRE_PROXY
  • CURLOPT_PROXY_CAINFO
  • CURLOPT_PROXY_CAPATH
  • CURLOPT_PROXY_CRLFILE
  • CURLOPT_PROXY_KEYPASSWD
  • CURLOPT_PROXY_PINNEDPUBLICKEY
  • CURLOPT_PROXY_SSLCERT
  • CURLOPT_PROXY_SSLCERTTYPE
  • CURLOPT_PROXY_SSL_CIPHER_LIST
  • CURLOPT_PROXY_SSLKEY
  • CURLOPT_PROXY_SSLKEYTYPE
  • CURLOPT_PROXY_SSL_OPTIONS
  • CURLOPT_PROXY_SSL_VERIFYHOST
  • CURLOPT_PROXY_SSL_VERIFYPEER
  • CURLOPT_PROXY_SSLVERSION
  • CURLOPT_PROXY_TLS13_CIPHERS
  • CURLOPT_PROXY_TLSAUTH_PASSWORD
  • CURLOPT_PROXY_TLSAUTH_TYPE
  • CURLOPT_PROXY_TLSAUTH_USERNAME
  • CURLOPT_REQUEST_TARGET
  • CURLOPT_SOCKS5_AUTH
  • CURLOPT_SSH_COMPRESSION
  • CURLOPT_SUPPRESS_CONNECT_HEADERS
  • CURLOPT_TIMEVALUE_LARGE
  • CURLOPT_TLS13_CIPHERS
  • CURLPROXY_HTTPS
  • CURLSSH_AUTH_GSSAPI
  • CURL_SSLVERSION_MAX_DEFAULT
  • CURL_SSLVERSION_MAX_NONE
  • CURL_SSLVERSION_MAX_TLSv1_0
  • CURL_SSLVERSION_MAX_TLSv1_1
  • CURL_SSLVERSION_MAX_TLSv1_2
  • CURL_SSLVERSION_MAX_TLSv1_3
  • CURL_SSLVERSION_TLSv1_3
  • CURL_VERSION_ALTSVC (à partir de PHP 7.3.6)
  • CURL_VERSION_ASYNCHDNS
  • CURL_VERSION_BROTLI
  • CURL_VERSION_CONV
  • CURL_VERSION_CURLDEBUG (à partir de PHP 7.3.6)
  • CURL_VERSION_DEBUG
  • CURL_VERSION_GSSAPI
  • CURL_VERSION_GSSNEGOTIATE
  • CURL_VERSION_HTTPS_PROXY
  • CURL_VERSION_IDN
  • CURL_VERSION_LARGEFILE
  • CURL_VERSION_MULTI_SSL
  • CURL_VERSION_NTLM
  • CURL_VERSION_NTLM_WB
  • CURL_VERSION_PSL (à partir de PHP 7.3.6)
  • CURL_VERSION_SPNEGO
  • CURL_VERSION_SSPI
  • CURL_VERSION_TLSAUTH_SRP

Filtrage des données

  • FILTER_SANITIZE_ADD_SLASHES

JavaScript Object Notation

  • JSON_THROW_ON_ERROR

Lightweight Directory Access Protocol

  • LDAP_CONTROL_ASSERT
  • LDAP_CONTROL_MANAGEDSAIT
  • LDAP_CONTROL_PROXY_AUTHZ
  • LDAP_CONTROL_SUBENTRIES
  • LDAP_CONTROL_VALUESRETURNFILTER
  • LDAP_CONTROL_PRE_READ
  • LDAP_CONTROL_POST_READ
  • LDAP_CONTROL_SORTREQUEST
  • LDAP_CONTROL_SORTRESPONSE
  • LDAP_CONTROL_PAGEDRESULTS
  • LDAP_CONTROL_AUTHZID_REQUEST
  • LDAP_CONTROL_AUTHZID_RESPONSE
  • LDAP_CONTROL_SYNC
  • LDAP_CONTROL_SYNC_STATE
  • LDAP_CONTROL_SYNC_DONE
  • LDAP_CONTROL_DONTUSECOPY
  • LDAP_CONTROL_PASSWORDPOLICYREQUEST
  • LDAP_CONTROL_PASSWORDPOLICYRESPONSE
  • LDAP_CONTROL_X_INCREMENTAL_VALUES
  • LDAP_CONTROL_X_DOMAIN_SCOPE
  • LDAP_CONTROL_X_PERMISSIVE_MODIFY
  • LDAP_CONTROL_X_SEARCH_OPTIONS
  • LDAP_CONTROL_X_TREE_DELETE
  • LDAP_CONTROL_X_EXTENDED_DN
  • LDAP_CONTROL_VLVREQUEST
  • LDAP_CONTROL_VLVRESPONSE

Chaîne de caractères multi-octet

  • MB_CASE_FOLD
  • MB_CASE_LOWER_SIMPLE
  • MB_CASE_UPPER_SIMPLE
  • MB_CASE_TITLE_SIMPLE
  • MB_CASE_FOLD_SIMPLE

OpenSSL

  • STREAM_CRYPTO_PROTO_SSLv3
  • STREAM_CRYPTO_PROTO_TLSv1_0
  • STREAM_CRYPTO_PROTO_TLSv1_1
  • STREAM_CRYPTO_PROTO_TLSv1_2

PostgreSQL

  • PGSQL_DIAG_SCHEMA_NAME
  • PGSQL_DIAG_TABLE_NAME
  • PGSQL_DIAG_COLUMN_NAME
  • PGSQL_DIAG_DATATYPE_NAME
  • PGSQL_DIAG_CONSTRAINT_NAME
  • PGSQL_DIAG_SEVERITY_NONLOCALIZED

User Contributed Notes

There are no user contributed notes for this page.


Modifications entrainant une incompatibilité ascendante

Cœur de PHP

Interprétation des Labels de Terminaison Heredoc/Nowdoc

Avec l'introduction de la syntaxe flexible heredoc / nowdoc, les chaîne de caractères doc qui contiennent le label de terminaison dans leur corps peuvent causer des erreurs de syntaxe ou changer en interprétation. Par exemple dans :

<?php
$str = <<<FOO
abcdefg
   FOO
FOO;
?>
l'occurrence indentée de FOO n'avait pas de signification particulière précédemment. Désormais elle sera interprétée comme la fin de la chaîne de caractères heredoc et le FOO; suivant causera une erreur de syntaxe. Ce problème peut toujours être résolu en choisissant un label de terminaison qui n'apparait pas dans le contenu de la chaîne de caractères.

Continue visant Switch génèrent des Avertissements

Les déclarations continue visant les structures de flux de contrôle switch généreront désormais un avertissement. En PHP ces déclarations continue sont équivalentes à break, alors qu'ils se comportent comme continue 2 dans d'autres langages.

<?php
while ($foo) {
    switch ($bar) {
      case "baz":
         continue;
         // Warning: "continue" targeting switch is equivalent to
         //          "break". Did you mean to use "continue 2"?
   }
}
?>

Interprétation Stricte des Clés de Chaînes de Caractères Entiers sur ArrayAccess

Les accès de tableau du type $obj["123"], où $obj implémente ArrayAccess et "123" est une chaîne de caractères d'entier litérale ne résultera plus en une conversion implicite en entier, c.à.d., $obj->offsetGet("123") sera appellé au lieu de $obj->offsetGet(123). Ceci correspond au comportement pour les non litérales. Le comportement des tableau n'est pas affecté d'une quelconque manière, ils continuent de convertir implicitement des clés de chaîne de caractères en entier.

Les Propriétés Statiques ne sont plus séparées par l'Affectation de Référence

En PHP, les propriétés statiques sont partagées entre les classes héritantes, sauf si la propriété statique est explicitement remplacée dans une classe enfant. Cependant à cause d'un artefact d'implémentation il était possible de séparer les propriétés statiques en affectant une référence. Cette lacune a été corrigée.

<?php
class Test {
    public static $x = 0;
}
class Test2 extends Test { }

Test2::$x = &$x;
$x = 1;

var_dump(Test::$x, Test2::$x);
// Previously: int(0), int(1)
// Now:        int(1), int(1)
?>

Les références retournées par les Tableaux et les accès aux propriétés sont immédiatement décompressées

Les références retournées par les tableaux et les accès aux propriétés sont désormais décompressés dans le cadre de l'accès. Ceci signifie qu'il n'est plus possible de modifier la référence entre l'accès et l'utilisation de la valeur accèdée :

<?php
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// Previously: int(4), Now: int(3)
?>
Ceci rend le comportement des références et non références cohérent. Il est à noter que lire et écrire une valeur à l'intérieur d'une unique expression continue d'être un comportement non défini et peut changer de nouveau dans le futur.

La décompression d'arguments de Traversables avec des clés non-entières n'est plus prise en charge

La décompression d'arguments a cessé de fonctionner avec Traversables avec des clés non-entières Le code suivant fonctionnait en PHP 5.6-7.2 par accident.

<?php
function foo(...$args) {
    var_dump($args);
}
function gen() {
    yield 1.23 => 123;
}
foo(...gen());
?>

Divers

L'utilitaire ext_skel a été entièrement repensé avec de nouvelles options et certaines anciennes options supprimées. Ceci est maintenant écrit en PHP et n'a aucune dépendance externe.

Le support pour BeOS a été abandonné.

Les exceptions lancées à cause d'une conversion automatique d'avertissements en exceptions avec le mode EH_THROW (par exemple certaines exceptions de DateTime) ne remplissent plus l'état de error_get_last(). En tant que tels, ils fonctionnent désormais de la même manière que les exceptions levées manuellement.

TypeError rapporte désormais les mauvais types en tant que int et bool au lieu de integer et boolean, respectivement.

Les variables indéfinies passées à compact() seront désormais rapportées avec une notice.

getimagesize() et les fonctions connexes rapportent désormais le type MIME des images BMP en tant que image/bmp au lieu de image/x-ms-bmp, car le premier a été inscrit avec l'IANA (voir » RFC 7903).

stream_socket_get_name() retourne désormais les adresses IPv6 avec des crochets. Par exemple "[::1]:1337" sera retourné au lieu de "::1:1337".

BCMath Arbitrary Precision Mathematics

Tous les avertissements lancés par les fonctions BCMath utilisent désormais le gestionnaire d'erreur de PHP. Auparavant certains avertissements étaient écrits directement à stderr.

bcmul() et bcpow() retourne désormais les nombres avec la précision demandée. Auparavant, certain nombres pouvaient omettre les zéros de fin décimaux.

IMAP, POP3 et NNTP

Les authentifications rsh/ssh sont désactivées par défaut. Utilisez imap.enable_insecure_rsh si vous voulez les activer. Il est à noter que la bibliothèque IMAP ne filtre pas les noms des boîtes aux lettres avant de les passer aux commandes rsh/ssh, ainsi passer des données non fiable à cette fonction avec rsh/ssh activé est dangereux.

Chaînes de Caractères Multioctets

En raison de la prise en charge des captures nommées, les masques mb_ereg_*() utilisant les captures nommées se comporteront différemment. En particulier les captures nommées feront partie des correspondances et mb_ereg_replace() interprétera la syntaxe additionnelle. Voir Capture Nommées pour plus d'information.

Extension MySQL Améliorée (MySQLi)

Les déclarations préparées rapportent désormais les fractions de secondes pour les colonnes DATETIME, TIME et TIMESTAMP avec spécificateur décimal (par example TIMESTAMP(6) lors de l'utilisation de microsecondes). Auparavant les fractions de secondes étaient tout simplement omises des valeurs de retours.

Fonctions MySQL (PDO_MYSQL)

Les déclarations préparées rapportent désormais les fractions de secondes pour les colonnes DATETIME, TIME et TIMESTAMP avec spécificateur décimal (par example TIMESTAMP(6) lors de l'utilisation de microsecondes). Auparavant les fractions de secondes étaient tout simplement omises des valeurs de retours. Veuillez noter que ceci affecte uniquement l'utilisation de PDO_MYSQL avec les déclarations préparées émulées désactivées (par exemple en utilisant la fonctionnalité native de préparation). Les déclarations utilisant des connexions qui ont PDO::ATTR_EMULATE_PREPARES=true (ce qui est par défaut) ne sont pas affectées par la correction de bogue et récupéraient déjà les valeurs des fractions de secondes depuis le moteur.

Reflection

Les exportations de Reflection en chaîne de caractères utilisent désormais int et bool au lieu de integer et boolean, respectivement.

Bibliothéque Standard de PHP (SPL)

Si un auto-chargeur SPL lance une exception, les auto-chargeurs suivant ne seront pas exécutés. Précédemment tous les auto-chargeurs étaient exécutés et les exceptions étaient chainées.

SimpleXML

Les opérations mathématiques impliquant les objets SimpleXML traiteront désormais le texte comme un entier ou un nombre décimal, selon ce qui est plus approprié. Auparavant les valeurs étaient traitées comme un entier sans condition.

Cookies entrants

Depuis PHP 7.3.23, le nom des cookies entrants ne sont plus url-décodés pour les raisons de sécurité.

User Contributed Notes

gmoreno 13-Feb-2021 09:49
Chris, that is actually mentioned here: https://www.php.net/manual/en/migration73.other-changes.php#migration73.other-changes.pcre
chris at ocproducts dot com 01-May-2020 08:17
PCRE has been updated (https://wiki.php.net/rfc/pcre2-migration#backward_incompatible_changes).
The new PCRE version is stricter in some cases.


Fonctionnalités devenues obsolètes

Cœur de PHP

Constantes non sensibles à la casse

La déclaration des constantes non sensibles à la casse a été déconseillée. Le passage de true comme troisième argument à define() générera désormais un avertissement d'obsolescence. L'utilisation de constantes non sensibles à la casse avec une casse qui diffère de la déclaration est également obsolète.

assert() dans un espace de nom

La déclaration d'une fonction appelée assert() dans un espace de noms est déconseillée. La fonction assert() est sujette à une manipulation spéciale par le moteur, ce qui peut conduire à un comportement incohérent lors de la définition d'une fonction dans un espace de nom avec le même nom.

Recherche de chaînes avec Needle non-chaîne

Passer une valeur recherchée qui n'est pas du texte dans les fonction de recherche est déconseillé. Dans le futur la valeur recherchée sera interprétée comme une chaîne en ASCII. Selon le comportement prévu, vous devez soit explicitement caster la recherche en chaîne ou effectuer un appel explicite à chr(). Les fonctions suivantes sont affectées :

  • strpos()
  • strrpos()
  • stripos()
  • strripos()
  • strstr()
  • strchr()
  • strrchr()
  • stristr()

Strip-Tags Streaming

La fonction fgetss() et le filtre de flux string.strip_tags sont maintenant déconseillé. Cela effecte également la méthode SplFileObject::fgetss() et la fonction gzgetss().

Filtrage des données

L'utilisation explicite des constantes FILTER_FLAG_SCHEME_REQUIRED et FILTER_FLAG_HOST_REQUIRED est maintenant déconseillé; les deux sont implicites pour FILTER_VALIDATE_URL de toute façon.

Traitement d'image et GD

La fonction image2wbmp() est déconseillée.

Fonctions d'internationalisation

L'utilisation de la forme Normalizer::NONE lève un avertissement d'obsolescence, si PHP est lié à l'ICU = 56.

Chaîne multi-octet

Les alias mbereg_*() non documentés suivants sont déconseillés. Utilisez plutôt les variantes mb_ereg_*() correspondantes.

  • mbregex_encoding()
  • mbereg()
  • mberegi()
  • mbereg_replace()
  • mberegi_replace()
  • mbsplit()
  • mbereg_match()
  • mbereg_search()
  • mbereg_search_pos()
  • mbereg_search_regs()
  • mbereg_search_init()
  • mbereg_search_getregs()
  • mbereg_search_getpos()
  • mbereg_search_setpos()

Fonction ODBC et DB2 (PDO_ODBC)

Le paramètre ini pdo_odbc.db2_instance_name a été formellement déconseillé. Il est déconseillé dans la documentation à partir de PHP 5.1.1.

User Contributed Notes

There are no user contributed notes for this page.


Autres changements

PHP Core

Set(raw)cookie accepte l'argument $option

setcookie() et setrawcookie() prennent également la signature suivante :

setcookie ( string $name , string $value = "" , array $options = [] ) : bool
où $options est un tableau associatif qui peu avoir l'une des clés suivantes "expires", "path", "domain", "secure", "httponly" et "samesite".

Nouvelles directives INI Syslog

Les directives INI suivantes ont été ajoutées pour personnaliser l'enregistrement, si le error_log est définie sur syslog:

syslog.facility
Spécifie quel type de programme enregistre le message.
syslog.filter
Spécifie le type de filtre pour filtrer les messages enregistrés. Il existe trois types de filtres pris en charge - all, no-ctrl et ascii.
syslog.ident
Spécifie la chaîne ident qui préfixera chaque méssage.

Collecteur de mémoire

Le GC cyclique a été amélioré, ce qui améliore grandement les performances.

Divers

var_export() exporte maintenant les objets stdClass comme un tableau modifié en objet ((object) array( ... )), plutôt de l'utiliser la méthode inexistante stdClass::__setState().

debug_zval_dump() a été modifié pour afficher les tableaux et les objets récuscifs de la même manière que var_dump(). Maintenant, il ne les affiches pas deux fois.

array_push() et array_unshift() peuvent maintenant être appelés avec un seul argument, ce qui particulièrement pratique avec l'opétateur de décomposition.

Débogueur PHP interactif

Les constantes inutilisées PHPDBG_FILE, PHPDBG_METHOD, PHPDBG_LINENO et PHPDBG_FUNC ont été supprimées.

Gestionnaire de processus FastCGI

La fonction getallheaders() est maintenant également disponible.

Bibliothèque URL client

libcurl = 7.15.5 est maintenant nécessaire.

Filtrage des données

FILTER_VALIDATE_FLOAT gère maintenant l'option thousand, qui définit l'ensemble de caratères de séparation pour les milliers. La valeur par défaut est ("',.") entièrement rétrocompatible avec les anciennes versions PHP.

FILTER_SANITIZE_ADD_SLASHES a été ajouté comme un alias du filtre magic_quotes (FILTER_SANITIZE_MAGIC_QUOTES). Le filtre magic_quotes est susceptible d'être supprimé dans les futures versions de PHP.

FTP

Le mode de transfert par défaut a été modifié pour binary.

Fonctions d'internationalisation

Normalizer::NONE est déprécié, lorsque PHP est lié à ICU = 56.

Introduction de Normalizer::FORM_KC_CF en tant qu'argument de Normalizer::normalize() pour la normalisation NFKC_Casefold; disponible lorsque PHP est lié à ICU = 56.

Notation d'objets JavaScript

Un nouveau drapeau été ajouté, JSON_THROW_ON_ERROR, qui peut être utilisé avec json_decode() ou json_encode() et provoque la levé de la nouvelle exception JsonException lors d'une erreur, au lieu de définit l'état d'erreur globale qui est récupéré avec json_last_error() et json_last_error_msg(). JSON_PARTIAL_OUTPUT_ON_ERROR prend le pas sur JSON_THROW_ON_ERROR.

Chaîne multioctet

L'option de configuration --with-libmbfl n'est plus disponible.

ODBC (Unifié)

La gestion de ODBCRouter et Birdstep incluant la directive ini birdstep.max_links a été supprimé.

OPcache

La directive ini opcache.inherited_hack a été supprimée. La valeur était ignorée depuis PHP 5.3.0.

OpenSSL

Les options de flux ssl min_proto_version et max_proto_version ainsi que des constantes liées pour d'éventuelles valeurs de protocole TLS ont été aoutées.

Expressions rationnelles (Perl-Compatible)

L'extension PCRE a été mise à niveau vers PCRE2, ce qui peut provoqier des changements mineurs de comportement (par exemple, les plages de caratères dans les classes sont maintenant plus strictement interprétées), et augmente la syntaxe d'expression rationnelle existante.

preg_quote() échape désormais le caratère '#'.

Fonctions Microsoft SQL Server et Sybase (PDO_DBLIB)

L'attribut PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS a été ajouté pour permettre le saut automatique des ensembles de lignes vides.

L'attribut PDO::DBLIB_ATTR_TDS_VERSION a été ajouté pour exposer la version de TDS.

Les colonnes DATETIME2 sont désormais traitées comme des colonnes DATETIME.

Fonctions SQLite (PDO_SQLITE)

Les bases de données SQLite3 peuvent désormais être ouverte en lecture seule en définissant le nouvel attribut PDO::SQLITE_ATTR_OPEN_FLAGS à PDO::SQLITE_OPEN_READONLY.

Manipulation de session

session_set_cookie_params() gère désormais en charge la signature suivante :

session_set_cookie_params ( array $options ) : bool
où $options est un tableau associatif qui peut contenur chacune de ces clés "lifetime", "path", "domain", "secure", "httponly" et "samesite". Par conséquent, la valeur de retour de session_get_cookie_params() a maintenant également un élément avec la clé "samesite". En outre, la nouvelle directive ini session.cookie_samesite a été ajouté pour définir la valeur par défaut de SameSite pour les cookies. Par défaut à "" (chaîne vide), de sorte qu'aucune directive SameSite n'est définie. La valeur peut être "Lax" ou "Strict", qui définie la valeur de SameSite.

Tidy

Construire avec » tidyp est maintenant géré de façon transparente. Etant donnée que tidyp n'offre pas d'API pour obtenir la date de sortie, tidy_get_release() et tidy::getRelease() retourne 'unknown' dans ce cas.

Parseur XML

La valeur de retour de la procédure de rappel de xml_set_external_entity_ref_handler() n'est plus ignoré si l'extension a été construite avec libxml. Auparavant, la valeur de retour était ignorée, et l'analyse ne sessait jamais.

Zip

Construire statiquement libzip est déconseillé, main toujours possible en ajoutant l'option de configuration --without-libzip.

Zlib Compression

L'option de contexte zlib/level pour compress.zlib wrapper pour faciliter la définition du niveau de compression souhaité a été ajouté.

User Contributed Notes

There are no user contributed notes for this page.


Support de Windows

Cœur de PHP

Suppression de fichier plus conforme à POSIX

Les descripteurs de fichiers sont ouverts en mode partagé lecture/écriture/suppression par défaut. Cela mappe efficacement la sémantique POSIX et permet de supprimer des fichiers avec des pointeurs en cours d'utilisation. Il n'est pas 100% identique, certaines différences de plate-forme persistent encore. Après la suppression, l'entrée de nom de fichier est bloquée, jusqu'à ce que tous les pointeurs ouverts soit fermés.

User Contributed Notes

There are no user contributed notes for this page.


Migration de PHP 7.1.x vers PHP 7.2.x

Sommaire

  • Nouvelles fonctionnalités
  • Nouvelles fonctions
  • Nouvelles constantes globales
  • Évolutions incompatibles avec les versions précédentes
  • Fonctionnalités devenues obsolètes en PHP 7.2.x
  • Autres changements

Cette nouvelle version mineure apporte avec elle un certain nombre de nouvelles fonctionnalités et quelques incompatibilités qui devraient être testées avant de changer les versions PHP dans les environnements de production.

Voir aussi les guides de migration entre les différentes versions de PHP 7.0.x et 7.1.x.

User Contributed Notes

There are no user contributed notes for this page.


Nouvelles fonctionnalités

Nouveau type object

Un nouveau type, object, a été introduit. Il peut être utilisé pour typer un paramètre (contravariant) ou pour typer le retour (covariant).

<?php

function test(object $obj) : object
{
    return new SplQueue();
}

test(new StdClass());

Chargement des extensions par leur nom

Les extensions partagées ne demanderons plus de saisir leur nom complet (.so pour Unix ou .dll pour Windows). C'est actif pour le fichier php.ini et pour la fonction dl().

Substitution de méthode abstraite

Les méthodes abstraites peuvent maintenant être surchargées quand une classe abstraite étend une autre classe abstraite.

<?php

abstract class A
{
    abstract function test(string $s);
}
abstract class B extends A
{
    // overridden - still maintaining contravariance for parameters and covariance for return
    abstract function test($s) : int;
}

Sodium est maintenant une extension du noyau

La bibliothèque moderne de cryptographie sodium est maintenant devenue une extension de base dans PHP.

Pour une référence de fonction complète, consultez le chapitre Sodium.

Hachage de mot de passe avec Argon2

Argon2 a été ajouté à l'API pour le hachage de mot de passe, et les constantes suivantes ont été exposées :

  • PASSWORD_ARGON2I
  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THREADS

Types de chaîne étendue pour PDO

Type de chaîne de PDO a été étendu pour prendre en charge le type de caractère national lors de l’utilisation des requêtes préparées. Cela a été fait avec l’une des constantes suivantes :

  • PDO::PARAM_STR_NATL
  • PDO::PARAM_STR_CHAR
  • PDO::ATTR_DEFAULT_STR_PARAM

Ces constantes sont utilisées avec l’opérateur de bits OR et PDO::PARAM_STR :

<?php

$db->quote('über', PDO::PARAM_STR | PDO::PARAM_STR_NATL);

Ajout d'information de déboggage pour l'émulation des requêtes préparées pour PDO

La méthode PDOStatement::debugDumpParams() a été mis à jour pour inclure le SQL envoyé à la DB, où la requête complète, requête brute (y compris les espaces réservés remplacées par leurs valeurs protégées) sera montrée. Ceci a été ajouté afin de faciliter le débogage de l'émulation des requêtes préparées (et donc il sera disponible lorsque l'émulation des requêtes préparées est activée).

Prise en charge pour les opérations étendues dans LDAP

La prise en charge des EXOP a été ajoutée dans l'extension LDAP. Cela a été fait en exposant les constantes et les fonctions suivantes :

  • ldap_parse_exop()
  • ldap_exop()
  • ldap_exop_passwd()
  • ldap_exop_whoami()
  • LDAP_EXOP_START_TLS
  • LDAP_EXOP_MODIFY_PASSWD
  • LDAP_EXOP_REFRESH
  • LDAP_EXOP_WHO_AM_I
  • LDAP_EXOP_TURN

Informations additionnelles des adresses dans l'extension Sockets

L'extension sockets a maintenant la capacité de rechercher les informations sur l'adresse, mais aussi de s'y connecter, de se lier dessus et de l'expliquer. Les quatre fonctions suivantes ont été ajoutées pour cela :

  • socket_addrinfo_lookup()
  • socket_addrinfo_connect()
  • socket_addrinfo_bind()
  • socket_addrinfo_explain()

Elargissement du type des arguments

Les types de paramètres de méthodes substituées et des implémentations de l’interface peuvent maintenant être omises. C’est toujours dans le respect de LSP, puisque les types de paramètres sont contravariants.

<?php

interface A
{
    public function Test(array $input);
}

class B implements A
{
    public function Test($input){} // type omis pour $input
}

Permettre une virgule de fin pour les espaces de noms groupés

Une virgule de fin peut maintenant être ajoutée à la syntaxe d’utilisation groupé introduite en PHP 7.0.

<?php

use Foo\Bar\{
    Foo,
    Bar,
    Baz,
};

Prise en charge sur Windows de proc_nice()

La fonction proc_nice() est maintenant prise en charge sur Windows.

Prise en charge de endian pour pack() et unpack()

Les fonctions pack() et unpack() prennent en charge les nombres décimaux et doubles dans les deux Little et Big endian.

Améliorations de l'extension EXIF

L'extension EXIF a été mise à jour pour prendre en charge une gamme beaucoup plus large de formats. Cela signifie que leurs balises spécifiques au format sont maintenant correctement traduites lors de l'analyse des images avec la fonction exif_read_data(). Les nouveaux formats suivants sont désormais pris en charge :

  • Samsung
  • DJI
  • Panasonic
  • Sony
  • Pentax
  • Minolta
  • Sigma/Foveon
  • AGFA
  • Kyocera
  • Ricoh
  • Epson

Les fonctions EXIF exif_read_data() et exif_thumbnail() prennent désormais en charge des flux en tant que premier argument.

Nouvelles fonctionnalités dans PCRE

  • Le modificateur J pour définir PCRE_DUPNAMES a été ajouté.

SQLite3 permet l'écriture de BLOBs

SQLite3::openBlob() permet maintenant d'ouvrir des champs BLOB en mode écriture; auparavant, seul le mode lecture était pris en charge.

Oracle OCI8 prise en charge du Transparent Application Failover

La prise en charge de la fonction de rappel de Transparent Application Failover (TAF) a été ajouté. TAF permet aux applications PHP oci8 de se reconnecter automatiquement à une base de données préconfigurée lorsqu'une connexion est rompue. Le nouveau support de rappel TAF permet aux applications PHP de surveiller et de contrôler la reconnexion pendant le basculement.

Améliorations de l'extension ZIP

La prise en charge de la lecture et de l'écriture d'archive chiffrée a été ajouté (nécessite libzip 1.2.0).

La classe ZipArchive implémente maintenant l'interface Countable.

Le flux zip:// accepte maintenant l'option de contexte 'password'.

User Contributed Notes

info at ensostudio dot ru 11-Sep-2020 07:28
Note: you cant change parameter type for abstract method defined in interface.
<?php
abstract class AbstractAssocArray imlements ArrayAccess
{
    abstract public function offsetSet($offset, $value): void;
    ...
}
abstract class AbstractAssocArray2 extends AbstractAssocArray
{
    abstract public function offsetSet(string $offset, $value): void;
}
class AssocArray extends AbstractAssocArray2
{
    public function offsetSet(string $offset, $value): void
    {
         $this->{$offset} = $value;
    }
}
?>
It's throw fatal error: Declaration of AbstractAssocArray::offsetSet(string $offset, $value): void must be compatible with AbstractAssocArrayAccess::offsetSet($offset, $value).


Nouvelles fonctions

Cœur de PHP

  • stream_isatty()
  • sapi_windows_vt100_support()

SPL

  • spl_object_id()

DOM

  • DomNodeList::count()
  • DOMNamedNodeMap::count()

FTP

  • ftp_append()

GD

  • imagesetclip()
  • imagegetclip()
  • imageopenpolygon()
  • imageresolution()
  • imagecreatefrombmp()
  • imagebmp()

Hash

  • hash_hmac_algos()

LDAP

  • ldap_parse_exop()
  • ldap_exop()
  • ldap_exop_passwd()
  • ldap_exop_whoami()

Chaînes multi-octets

  • mb_chr()
  • mb_ord()
  • mb_scrub()

Oracle OCI8

  • oci_register_taf_callback()
  • oci_unregister_taf_callback()

Sockets

  • socket_addrinfo_lookup()
  • socket_addrinfo_connect()
  • socket_addrinfo_bind()
  • socket_addrinfo_explain()

Sodium

  • sodium_add()
  • sodium_bin2hex()
  • sodium_compare()
  • sodium_crypto_aead_aes256gcm_decrypt()
  • sodium_crypto_aead_aes256gcm_encrypt()
  • sodium_crypto_aead_aes256gcm_is_available()
  • sodium_crypto_aead_aes256gcm_keygen()
  • sodium_crypto_aead_chacha20poly1305_decrypt()
  • sodium_crypto_aead_chacha20poly1305_encrypt()
  • sodium_crypto_aead_chacha20poly1305_ietf_decrypt()
  • sodium_crypto_aead_chacha20poly1305_ietf_encrypt()
  • sodium_crypto_aead_chacha20poly1305_ietf_keygen()
  • sodium_crypto_aead_chacha20poly1305_keygen()
  • sodium_crypto_auth_keygen()
  • sodium_crypto_auth_verify()
  • sodium_crypto_auth()
  • sodium_crypto_box_keypair_from_secretkey_and_publickey()
  • sodium_crypto_box_keypair()
  • sodium_crypto_box_open()
  • sodium_crypto_box_publickey_from_secretkey()
  • sodium_crypto_box_publickey()
  • sodium_crypto_box_seal_open()
  • sodium_crypto_box_seal()
  • sodium_crypto_box_secretkey()
  • sodium_crypto_box_seed_keypair()
  • sodium_crypto_box()
  • sodium_crypto_generichash_final()
  • sodium_crypto_generichash_init()
  • sodium_crypto_generichash_keygen()
  • sodium_crypto_generichash_update()
  • sodium_crypto_generichash()
  • sodium_crypto_kdf_derive_from_key()
  • sodium_crypto_kdf_keygen()
  • sodium_crypto_kx_client_session_keys()
  • sodium_crypto_kx_keypair()
  • sodium_crypto_kx_publickey()
  • sodium_crypto_kx_secretkey()
  • sodium_crypto_kx_seed_keypair()
  • sodium_crypto_kx_server_session_keys()
  • sodium_crypto_pwhash_scryptsalsa208sha256_str_verify()
  • sodium_crypto_pwhash_scryptsalsa208sha256_str()
  • sodium_crypto_pwhash_scryptsalsa208sha256()
  • sodium_crypto_pwhash_str_verify()
  • sodium_crypto_pwhash_str()
  • sodium_crypto_pwhash()
  • sodium_crypto_scalarmult_base()
  • sodium_crypto_scalarmult()
  • sodium_crypto_secretbox_keygen()
  • sodium_crypto_secretbox_open()
  • sodium_crypto_secretbox()
  • sodium_crypto_shorthash_keygen()
  • sodium_crypto_shorthash()
  • sodium_crypto_sign_detached()
  • sodium_crypto_sign_ed25519_pk_to_curve25519()
  • sodium_crypto_sign_ed25519_sk_to_curve25519()
  • sodium_crypto_sign_keypair_from_secretkey_and_publickey()
  • sodium_crypto_sign_keypair()
  • sodium_crypto_sign_open()
  • sodium_crypto_sign_publickey_from_secretkey()
  • sodium_crypto_sign_publickey()
  • sodium_crypto_sign_secretkey()
  • sodium_crypto_sign_seed_keypair()
  • sodium_crypto_sign_verify_detached()
  • sodium_crypto_sign()
  • sodium_crypto_stream_keygen()
  • sodium_crypto_stream_xor()
  • sodium_crypto_stream()
  • sodium_hex2bin()
  • sodium_increment()
  • sodium_memcmp()
  • sodium_memzero()
  • sodium_pad()
  • sodium_unpad()

ZIP

  • ZipArchive::count()
  • ZipArchive::setEncryptionName()
  • ZipArchive::setEncryptionIndex()

User Contributed Notes

There are no user contributed notes for this page.


Nouvelles constantes globales

Constantes prédéfinies

  • PHP_FLOAT_DIG
  • PHP_FLOAT_EPSILON
  • PHP_FLOAT_MIN
  • PHP_FLOAT_MAX
  • PHP_OS_FAMILY

Informations sur les fichiers

  • FILEINFO_EXTENSION

JSON

  • JSON_INVALID_UTF8_IGNORE
  • JSON_INVALID_UTF8_SUBSTITUTE

GD

  • IMG_EFFECT_MULTIPLY
  • IMG_BMP

LDAP

  • LDAP_EXOP_START_TLS
  • LDAP_EXOP_MODIFY_PASSWD
  • LDAP_EXOP_REFRESH
  • LDAP_EXOP_WHO_AM_I
  • LDAP_EXOP_TURN

Table de hachage de mot de passe

  • PASSWORD_ARGON2I
  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THREADS

PCRE

  • PREG_UNMATCHED_AS_NULL

PDO

  • PDO::PARAM_STR_NATL
  • PDO::PARAM_STR_CHAR
  • PDO::ATTR_DEFAULT_STR_PARAM

Sodium

  • SODIUM_LIBRARY_VERSION
  • SODIUM_LIBRARY_MAJOR_VERSION
  • SODIUM_LIBRARY_MINOR_VERSION
  • SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES
  • SODIUM_CRYPTO_AEAD_AES256GCM_NSECBYTES
  • SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES
  • SODIUM_CRYPTO_AEAD_AES256GCM_ABYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_ABYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES
  • SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_ABYTES
  • SODIUM_CRYPTO_AUTH_BYTES
  • SODIUM_CRYPTO_AUTH_KEYBYTES
  • SODIUM_CRYPTO_BOX_SEALBYTES
  • SODIUM_CRYPTO_BOX_SECRETKEYBYTES
  • SODIUM_CRYPTO_BOX_PUBLICKEYBYTES
  • SODIUM_CRYPTO_BOX_KEYPAIRBYTES
  • SODIUM_CRYPTO_BOX_MACBYTES
  • SODIUM_CRYPTO_BOX_NONCEBYTES
  • SODIUM_CRYPTO_BOX_SEEDBYTES
  • SODIUM_CRYPTO_KDF_BYTES_MIN
  • SODIUM_CRYPTO_KDF_BYTES_MAX
  • SODIUM_CRYPTO_KDF_CONTEXTBYTES
  • SODIUM_CRYPTO_KDF_KEYBYTES
  • SODIUM_CRYPTO_KX_SEEDBYTES
  • SODIUM_CRYPTO_KX_SESSIONKEYBYTES
  • SODIUM_CRYPTO_KX_PUBLICKEYBYTES
  • SODIUM_CRYPTO_KX_SECRETKEYBYTES
  • SODIUM_CRYPTO_KX_KEYPAIRBYTES
  • SODIUM_CRYPTO_GENERICHASH_BYTES
  • SODIUM_CRYPTO_GENERICHASH_BYTES_MIN
  • SODIUM_CRYPTO_GENERICHASH_BYTES_MAX
  • SODIUM_CRYPTO_GENERICHASH_KEYBYTES
  • SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MIN
  • SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MAX
  • SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13
  • SODIUM_CRYPTO_PWHASH_ALG_DEFAULT
  • SODIUM_CRYPTO_PWHASH_SALTBYTES
  • SODIUM_CRYPTO_PWHASH_STRPREFIX
  • SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE
  • SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
  • SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE
  • SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE
  • SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE
  • SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE
  • SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_SALTBYTES
  • SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_STRPREFIX
  • SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE
  • SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE
  • SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_SENSITIVE
  • SODIUM_CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE
  • SODIUM_CRYPTO_SCALARMULT_BYTES
  • SODIUM_CRYPTO_SCALARMULT_SCALARBYTES
  • SODIUM_CRYPTO_SHORTHASH_BYTES
  • SODIUM_CRYPTO_SHORTHASH_KEYBYTES
  • SODIUM_CRYPTO_SECRETBOX_KEYBYTES
  • SODIUM_CRYPTO_SECRETBOX_MACBYTES
  • SODIUM_CRYPTO_SECRETBOX_NONCEBYTES
  • SODIUM_CRYPTO_SIGN_BYTES
  • SODIUM_CRYPTO_SIGN_SEEDBYTES
  • SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES
  • SODIUM_CRYPTO_SIGN_SECRETKEYBYTES
  • SODIUM_CRYPTO_SIGN_KEYPAIRBYTES
  • SODIUM_CRYPTO_STREAM_NONCEBYTES
  • SODIUM_CRYPTO_STREAM_KEYBYTES

Zip

  • ZipArchive::EM_NONE
  • ZipArchive::EM_AES_128
  • ZipArchive::EM_AES_192
  • ZipArchive::EM_AES_256

User Contributed Notes

There are no user contributed notes for this page.


Évolutions incompatibles avec les versions précédentes

Empêcher number_format() de retourner zéro négatif

Auparavant, il était possible pour la fonction number_format() retourne -0. Bien que cela soit parfaitement valide conformément à la norme "IEEE 754 floating point spécification", cette bizarrerie n'était pas souhaitable pour l’affichage des nombres mis en forme sous une forme lisible par l'homme.

<?php

var_dump(number_format(-0.01)); // maintenant affiche string(1) "0" à la place de string(2) "-0"

Conversion des clés numériques dans les objets et tableau lors de cast

Les clé numériques sont maintenant mieux appréhendées lors de cast d'un tableau en objets et d'objets en tableaux (cast explicite ou par la fonction settype()).

Cela signifie que les clés représentées par un entier (ou un entier sous forme de texte) d'un tableau casté en objet sont désormais accessibles :

<?php

// tableau vers un objet
$arr = [0 => 1];
$obj = (object)$arr;
var_dump(
    $obj,
    $obj->{'0'}, // désormais accessible
    $obj->{0} // désormais accessible
);

L'exemple ci-dessus va afficher :

object(stdClass)#1 (1) {
  ["0"]=>    // désormais clé texte plutôt qu'une clé entière
  int(1)
}
int(1)
int(1)

Et entier (ou entier sous forme de texte) clés des objets casté en tableaux sont désormais accessibles :

<?php

// objet vers tableau
$obj = new class {
    public function __construct()
    {
        $this->{0} = 1;
    }
};
$arr = (array)$obj;
var_dump(
    $arr,
    $arr[0], // désormais accessible
    $arr['0'] // désormais accessible
);

L'exemple ci-dessus va afficher :

array(1) {
  [0]=>    // désormais clé entière plutôt qu'une clé texte
  int(1)
}
int(1)
int(1)

Interdire de passer null à get_class()

Auparavant, passer null à la fonction get_class() retournait le nom de la classe en cours. Ce comportement a été supprimé, une erreur E_WARNING est affichée à la place. Pour retrouver le même comportement qu'avant, l’argument devrait simplement être supprimé.

Avertir lors du comptage des types non dénombrables

Un E_WARNING sera émis lors de la tentative de d'utilisation de la fonction count() sur un type non dénombrable (cela inclut la fonction alias sizeof()).

<?php

var_dump(
    count(null), // NULL is not countable
    count(1), // un entier n'est pas dénombrable
    count('abc'), // une chaîne n'est pas dénombrable
    count(new stdclass), // un objet qui n'implémente pas l'interface Countable n'est pas dénombrable
    count([1,2]) // un tableau est dénombrable
);

L'exemple ci-dessus va afficher :

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d
int(0)
int(1)
int(1)
int(1)
int(2)

Remplacement ext/hash de ressources en objets

Dans le cadre de la migration à long terme de ressources, l’extension Hash a été mise à jour pour utiliser les objets au lieu de ressources. Le changement devrait être transparent pour les développeurs PHP, à l’exception où des vérifications avec is_resource() ont été faites (il sera nécessaire de remplacer par is_object()).

Améliorer les valeurs par défaut SSL/TLS

Les modifications suivantes concernant les valeurs par défaut ont été apportées :

  • tls:// maintenant par défaut TLSv1.0 ou TLSv1.1 ou TLSv1.2
  • ssl:// est un alias de tls://
  • STREAM_CRYPTO_METHOD_TLS_* constantes par défaut de TLSv1.0 ou TLSv1.1 + TLSv1.2, à la place de TLSv1.0 uniquement.

gettype() valeur de retour sur les ressources fermées

Auparavant, l'utilisation de gettype() sur une ressource fermée retournait une chaîne "unknown type". Maintenant, la chaîne "resource (closed)" sera retournée.

is_object() et __PHP_Incomplete_Class

Auparavant, l'utilisation de is_object() sur la classe __PHP_Incomplete_Class retournait false. Maintenant, true sera retourné.

Augmentation du niveau d'erreur des constantes non définies

Les références non qualifiées aux constantes non définies généreront désormais une E_WARNING (à la place d'une E_NOTICE). Dans la prochaine version majeure de PHP, ils généreront une exception Error.

Prise en charge de Windows

Les versions minimales officiellement supportées pour Windows sont Windows 7/ Server 2008 R2.

Vérification des valeurs par défaut des propriétés des traits

Les contrôles de compatibilité sur les valeurs par défaut des propriétés de trait n'effectueront plus la conversion.

object pour les noms de classes

Le nom object était précédement soft-réservé en PHP 7.0. Il est maintenant réservé, interdisant son utilisation comme nom de classe, de trait ou d'interface.

Prise en charge de NetWare

La prise en charge de NetWare a maintenant été supprimée.

array_unique() avec SORT_STRING

Alors que array_unique() avec SORT_STRING anciennement copiait le tableau et supprimait des éléments non uniques (sans emballer le tableau par la suite), maintenant un nouveau tableau est construit en ajoutant les éléments uniques. Cela peut entraîner des index numériques différents.

bcmod() change pour des nombres décimaux

La fonction bcmod() ne tronque plus les nombres fractionnaires en entier. En tant que tel, son comportement suit maintenant fmod(), plutôt que l'opérateur %. Par exemple bcmod('4', '3.5') retourne maintenant 0.5 à la place de 1.

Fonctions de hachage et hachages non cryptographiques

Les fonctions hash_hmac(), hash_hmac_file(), hash_pbkdf2(), et hash_init() (avec HASH_HMAC) n'acceptent plus les hachages non cryptographiques.

Options de la fonction json_decode()

L'option JSON_OBJECT_AS_ARRAY de la fonction json_decode() est maintenant utilisé si le second paramètre (assoc) est null. Précédement JSON_OBJECT_AS_ARRAY a toujours été ignoré.

Sortie de rand() et mt_rand()

Les séquences générées par rand() et mt_rand() pour des cas spécifiques peuvent différer de PHP 7.1 sur les machines 64 bits (en raison de la correction d'un bug dans l'implémentation de la polarisation du modulo).

Suppression du paramètre INI sql.safe_mode

Le paramètre INI sql.safe_mode a maintenant été supprimé.

Changement dans date_parse() et date_parse_from_format()

L'élément de zone du tableau retourné par date_parse() et date_parse_from_format() représente des secondes au lieu des minutes, et son signe est inversé. Par exemple -120 est maintenant 7200.

Incoming Cookies

Depuis PHP 7.2.34, le nom des cookies entrants ne sont plus url-décodés pour des raisons de sécurité.

User Contributed Notes

There are no user contributed notes for this page.


Fonctionnalités devenues obsolètes en PHP 7.2.x

Des chaînes non délimitées

Des chaînes qui sont des constantes globales inexistantes sont considérées comme des chaînes d’elles-mêmes. Ce comportement émettait une E_NOTICE, mais maintenant émet une E_WARNING. Dans la prochaine version majeure de PHP, une exception sera levée à la place.

<?php

var_dump(NONEXISTENT);

/* Output:
Warning: Use of undefined constant NONEXISTENT - assumed 'NONEXISTENT' (this will throw an Error in a future version of PHP) in %s on line %d
string(11) "NONEXISTENT"
*/

png2wbmp() et jpeg2wbmp()

Les fonctions png2wbmp() et jpeg2wbmp() de l'extension GD ont maintenant été désaprouvées et seront supprimées dans la prochaine version majeur de PHP.

Variante INTL_IDNA_VARIANT_2003

L'extension Intl a désaprouvé la variante INTL_IDNA_VARIANT_2003, qui est actuellement utilisée par idn_to_ascii() et idn_to_utf8(). La valeur par défaut sera changée dans PHP 7.4 par INTL_IDNA_VARIANT_UTS46, et la valeur INTL_IDNA_VARIANT_2003 sera supprimée dans la prochaine version majeur de PHP.

Méthode __autoload()

La méthode __autoload() a été déconseillée car inférieure à spl_autoload_register() (car elle n'est pas capable d'accepter plusieurs chargeurs automatiques), et les deux styles de chargement automatique ne sont pas interopérables.

Directive de configuration track_errors et la variable $php_errormsg

Lorsque la directive de configuration track_errors est activé, une variable $php_errormsg est créée dans la portée locale lorsqu'une erreur non fatale se produit. Étant donné que le meilleur moyen de récupérer ces informations d’erreur est d'utiliser error_get_last(), cette fonctionnalité a été désapprouvée.

Fonction create_function()

Étant donné les problèmes de sécurité de cette fonction (qui est un wrapper mince autour de eval()) cette ancienne fonction est maintenant obsolète. Le meilleur moyen de créer des fermetures est en définissant des fonctions anonymes.

Directive de configuration mbstring.func_overload

Étant donné les problèmes d’interopérabilité des fonctions basés sur une chaîne utilisées dans les environnements lorsque ce paramètre est activé, il est maintenant obsolète.

(unset) cast

Casting de n’importe quelle expression à ce type entraînera toujours un résultat null, et ce type de cast superflu est maintenant obsolète.

parse_str() sans second argument

Sans second argument à la fonction parse_str(), les paramètres de la requête sont allouées dans des variables locales. Étant donné les implications de ce fonctionnement sur la sécurité, l'utilisation de parse_str() sans un second argument est maintenant obsolète. La fonction doit toujours être utilisée avec deux arguments, car le deuxième argument entraîne l'analyse de la chaîne de requête dans un tableau.

Fonction gmp_random()

Cette fonction génère un nombre aléatoire basé sur une plage qui est calculée par une taille non exposés, spécifique à la plateforme membre. Pour cette raison, la fonction est maintenant obsolète. Le meilleur moyen de générer un nombre aléatoire est l'utilisation de l’extension GMP avec les fonction gmp_random_bits() et gmp_random_range().

Fonction each()

Cette fonction est beaucoup plus lente à l’itération qu’un normal foreach et entraîne des problèmes de mise en œuvre de certains changements de langue. Elle a donc été désapprouvée.

assert() avec un argument texte

Lors de l'utilisation d'assert() avec un argument texte, il est nécessaire que le texte soit évalué par la fonction eval(). Compte tenu du potentiel pour l’exécution de code à distance, avec un argument de chaîne à l’aide de assert() a maintenant été désapprouvée en faveur de l’utilisation des expressions booléennes.

$errcontext argument de gestionnaires d’erreurs

L’argument $errcontext contient toutes les variables locales de l’emplacement de l’erreur. Compte tenu de son utilisation rare et les problèmes qu'elle provoque avec des optimisations internes, il est maintenant devenu obsolète. Au lieu de cela, un débogueur doit être utilisé pour récupérer des informations sur les variables locales à l’emplacement de l’erreur.

Fonction read_exif_data()

L'alias read_exif_data() a été déconseillé. La fonction exif_read_data() peut être utilisée à la place.

User Contributed Notes

Anonymous 26-Jul-2018 05:09
An empty <?php?> Codeblock in PHP 7.2.0 will put out an "Unquoted strings" warning. To prevent that, add at least one empty space into the codeblock.

Example:
<?php

<?php/*
echo "This was some useful code.\n";
*/?>

?>
Gives: PHP Warning:  Use of undefined constant php - assumed 'php' (this will throw an Error in a future version of PHP)

Fix via:
<?php

<?php   /*
echo "This was some useful code.\";
*/?>

?>

Don't know if that is an intentional behaviour or a side effect.
webmaster at thedigitalorchard dot ca 01-Feb-2018 05:14
Instead of __autoload(), you can use spl_autoload_register() very easily, as per the documentation:

spl_autoload_register(function ($class) {
    include 'classes/' . $class . '.class.php';
});

And this lets you have multiple autoloaders instead of one global one.


Autres changements

Déplacement de utf8_encode() et utf8_decode()

Les fonctions utf8_encode() et utf8_decode() ont maintenant été déplacées vers l'extension standard en tant que fonctions de chaîne, alors qu'avant l'extension XML était requise pour qu'elles soient disponible.

Changement pour mail() et mb_sendmail()

Le parametre $additional_headers de mail() et mb_sendmail() accepte maintenant un array à la place d'un string

Prise en charge de LMDB

L'extension DBA prend maintenant en charge LMDB.

Modifications apportées au système build de PHP

  • Unix: Autoconf 2.64 ou plus est maintenant nécessaire pour construire PHP.
  • Unix: L'argument de configuration --with-pdo-oci n'a plus besoin de la version de Oracle Instant Client.
  • Unix: L'argument de configuration --enable-gd-native-ttf a été supprimé. Il n'a pas été utilisé depuis PHP 5.5.0.
  • Windows: L'argument de configuration --with-config-profile a été ajouté. Cela peut être utilisé pour enregistrer des configurations spécifiques, un peu comme le fichier magique config.nice.bat.

Changement dans GD

  • imageantialias() est également disponible si construit avec libgd du système.
  • imagegd() stocke des images TrueColor comme de vraies images TrueColor. Autrefois, ils ont été convertis en palette.

Déplacement de MCrypt vers PECL

L'extension MCrypt est mainenant été déplacé du noyau vers PECL. Étant donné que la bibliothèque mcrypt n'a pas vu de mises à jour depuis 2007, son utilisation est fortement découragé. Au lieu de cela, soit OpenSSL ou l'extension Sodium doit être utilisé.

session_module_name()

Le passage de "user" à session_module_name() déclenche maintenant une erreur de niveau E_RECOVERABLE_ERROR. Auparavant, cela a été ignoré silencieusement.

User Contributed Notes

There are no user contributed notes for this page.


Migration de PHP 7.0.x vers PHP 7.1.x

Sommaire

  • Nouvelles fonctionnalités
  • Nouvelles fonctions
  • Nouvelles constantes globales
  • Modifications entrainant une incompatibilité ascendante
  • Les fonctionnalités dépréciées dans PHP 7.1.x
  • Fonctions modifiées
  • Autres changements
  • Support Windows

Cette nouvelle version mineure apporte avec elle un certain nombre de nouvelles fonctionnalités et quelques incompatibilités qui devraient être testées avant de changer les versions PHP dans les environnements de production.

Voir aussi les guides de migration entre les différentes versions de PHP 7.0.x.

User Contributed Notes

There are no user contributed notes for this page.


Nouvelles fonctionnalités

Type nullable

La déclaration des types de paramètre et de valeur de retour peuvent désormais être marqués en tant que nullable en préfixant le nom du type avec un point d'interrogation. Ceci signifie que le type spécifié aussi bien que null peuvent être passés comme argument, ou retournés en tant que valeur, respectivement.

<?php

function testReturn(): ?string
{
    return 'elePHPant';
}

var_dump(testReturn());

function testReturn(): ?string
{
    return null;
}

var_dump(testReturn());

function test(?string $name)
{
    var_dump($name);
}

test('elePHPant');
test(null);
test();

L'exemple ci-dessus va afficher :

string(10) "elePHPant"
NULL
string(10) "elePHPant"
NULL
Uncaught Error: Too few arguments to function test(), 0 passed in...

Fonctions Void

Le type de retour void à été introduit. Fonction déclaré avec void en tant que leur type de retour doivent soit ommettre la déclaration de retour entièrement, ou utiliser une déclaration de retour vide. null n'est pas un type de retour valide pour une fonction void.

<?php
function swap(&$left, &$right): void
{
    if ($left === $right) {
        return;
    }

    $tmp = $left;
    $left = $right;
    $right = $tmp;
}

$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);

L'exemple ci-dessus va afficher :

null
int(2)
int(1)

Essayer d'utiliser la valeur de retour d'une fonction void évalue simplement à null, sans avertissement émit. La raison pour ceci est qu'un avertissement impliquerait l'usage de fonction générique d'ordre supérieur.

Déconstruction symétrique de tableau

L'abréviation de la syntaxe array [] peut désormais être utilisée pour déconstruire des tableaux pour des affectations (y compris au sein de foreach), à la place de la syntaxe existante list(), qui est toujours supporté.

<?php
$data = [
    [1, 'Tom'],
    [2, 'Fred'],
];

// list() style
list($id1, $name1) = $data[0];

// [] style
[$id1, $name1] = $data[0];

// list() style
foreach ($data as list($id, $name)) {
    // logic here with $id and $name
}

// [] style
foreach ($data as [$id, $name]) {
    // logic here with $id and $name
}

Visbilité des constantes de classes

Le support pour spécifier la visbilité des constantes de classes a été ajouté.

<?php
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

Le pseudo-type iterable

Un nouveau pseudo-type (similaire à callable) appellé iterable a été introduit. Il peut être utilisé aves les paramètres et retour typés, où il accepte soit des tableau soit des objets qui implémentent l'interface Traversable. En ce qui concerne le sous-typage, les types de paramètres des classes enfant peuvent élargir une déclaration d'un parent de array ou Traversable en iterable. Avec les types de retour, les classes enfant peuvent restreindre le type de retour iterable du parent en array ou un objet qui implémente Traversable.

<?php
function iterator(iterable $iter)
{
    foreach ($iter as $val) {
        //
    }
}

Gestion du catch de plusieurs exceptions

Plusieurs exceptions par bloc catch peuvent désormais être spécifié en utilisant le caractère barre verticale (|). Ceci est utile quand différentes exception sont gérées de façon identique.

<?php
try {
    // du code
} catch (FirstException | SecondException $e) {
    // gère les exceptions first et second
}

Support des clés dans list()

Il est désormais possible de spécifier des clés dans list(), ou sa nouvelle syntaxe abréviée []. Ceci permet la déconstruction des tableaux qui ont des clés non entières ou non séquentielles.

<?php
$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];

// list() style
list("id" => $id1, "name" => $name1) = $data[0];

// [] style
["id" => $id1, "name" => $name1] = $data[0];

// list() style
foreach ($data as list("id" => $id, "name" => $name)) {
    // logique ici avec $id et $name
}

// [] style
foreach ($data as ["id" => $id, "name" => $name]) {
    // logique ici avec $id et $name
}

Support pour les positions négatives des chaîne de caractères

Le support des positions négatives des chaîne de caractères a été ajouté aux fonctions de manipulation de chaîne de caractères qui accepte une position, ainsi qu'a l'indexation de chaîne de caractères avec [] ou {}. Dans de tel cas, une position négative est interprété comme une position en partant de la fin de la chaîne de caractères.

<?php
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));

L'exemple ci-dessus va afficher :

string (1) "e"
int(3)

Les positions négative des chaîne de caractères et tableaux sont aussi supportées avec la syntaxe simple d'analyse dans les chaîne de caractères.

<?php
$string = 'bar';
echo "Le dernier caractère de '$string' est '$string[-1]'.\n";
?>

L'exemple ci-dessus va afficher :

Le dernier caractère de 'bar' est 'r'.

Support pour AEAD dans ext/openssl

Support pour AEAD (modes GCM et CCM) a été ajouté en étendant les fonctions openssl_encrypt() et openssl_decrypt() avec des paramètres additionels.

Convertir des callables en Closures avec Closure::fromCallable()

Une nouvelle méthode statique a été indroduite à la classe Closure pour permettre des callables d'être facilement convertit en objet Closure.

<?php
class Test
{
    public function exposeFunction()
    {
        return Closure::fromCallable([$this, 'privateFunction']);
    }

    private function privateFunction($param)
    {
        var_dump($param);
    }
}

$privFunc = (new Test)->exposeFunction();
$privFunc('some value');

L'exemple ci-dessus va afficher :

string(10) "some value"

Gestion des signaux asynchrones

Une nouvelle fonction appellé pcntl_async_signals() a été introduite pour permettre la gestion des signaux asynchrones sans utiliser les ticks (ce qui introduisait beaucoup de surcoût).

<?php
pcntl_async_signals(true); // activer les signaux asynchrones

pcntl_signal(SIGHUP,  function($sig) {
    echo "SIGHUP\n";
});

posix_kill(posix_getpid(), SIGHUP);

L'exemple ci-dessus va afficher :

SIGHUP

Support des push serveur HTTP/2 dans ext/curl

Suport pour les push serveur a été ajouté à l'extension CURL (nécessite la version 7.46 ou ultérieur). Ceci peut être exploité à travers la fonction curl_multi_setopt() avec la nouvelle constante CURLMOPT_PUSHFUNCTION. Les constantes CURL_PUSH_OK et CURL_PUSH_DENY ont aussi été ajouté pour que l'exécution de la fonction de rappel du push serveur peuvent être approuvé ou refusé.

Options du Contexte de Flux (Stream Context Options)

L'option du contexte de flux tcp_nodelay a été ajouté.

User Contributed Notes

DYM 09-Apr-2018 10:36
<?php
function swap( &$a, &$b ): void
  { [ $a, $b ] = [ $b, $a ]; }
?>
unti1x 06-Apr-2018 11:20
Note that declaring nullable return type does not mean that you can skip return statement at all. For example:

php > function a(): ?string { }
php > a();
PHP Warning:  Uncaught TypeError: Return value of a() must be of the type string or null, none returned in php shell code:2

php > function b(): ?string { return; }
PHP Fatal error:  A function with return type must return a value (did you mean "return null;" instead of "return;"?) in php shell code on line 2


Nouvelles fonctions

Cœur de PHP

  • sapi_windows_cp_get()
  • sapi_windows_cp_set()
  • sapi_windows_cp_conv()
  • sapi_windows_cp_is_utf8()

Closure

  • Closure::fromCallable()

CURL

  • curl_multi_errno()
  • curl_share_errno()
  • curl_share_strerror()

OpenSSL

  • openssl_get_curve_names()

Session

  • session_create_id()
  • session_gc()

SPL

  • is_iterable()

PCNTL

  • pcntl_async_signals()
  • pcntl_signal_get_handler()

User Contributed Notes

There are no user contributed notes for this page.


Nouvelles constantes globales

Core Predefined Constants

  • PHP_FD_SETSIZE

CURL

  • CURLMOPT_PUSHFUNCTION
  • CURL_PUSH_OK
  • CURL_PUSH_DENY

Data Filtering

  • FILTER_FLAG_EMAIL_UNICODE

Image Processing et GD

  • IMAGETYPE_WEBP

JSON

  • JSON_UNESCAPED_LINE_TERMINATORS

LDAP

  • LDAP_OPT_X_SASL_NOCANON
  • LDAP_OPT_X_SASL_USERNAME
  • LDAP_OPT_X_TLS_CACERTDIR
  • LDAP_OPT_X_TLS_CACERTFILE
  • LDAP_OPT_X_TLS_CERTFILE
  • LDAP_OPT_X_TLS_CIPHER_SUITE
  • LDAP_OPT_X_TLS_KEYFILE
  • LDAP_OPT_X_TLS_RANDOM_FILE
  • LDAP_OPT_X_TLS_CRLCHECK
  • LDAP_OPT_X_TLS_CRL_NONE
  • LDAP_OPT_X_TLS_CRL_PEER
  • LDAP_OPT_X_TLS_CRL_ALL
  • LDAP_OPT_X_TLS_DHFILE
  • LDAP_OPT_X_TLS_CRLFILE
  • LDAP_OPT_X_TLS_PROTOCOL_MIN
  • LDAP_OPT_X_TLS_PROTOCOL_SSL2
  • LDAP_OPT_X_TLS_PROTOCOL_SSL3
  • LDAP_OPT_X_TLS_PROTOCOL_TLS1_0
  • LDAP_OPT_X_TLS_PROTOCOL_TLS1_1
  • LDAP_OPT_X_TLS_PROTOCOL_TLS1_2
  • LDAP_OPT_X_TLS_PACKAGE
  • LDAP_OPT_X_KEEPALIVE_IDLE
  • LDAP_OPT_X_KEEPALIVE_PROBES
  • LDAP_OPT_X_KEEPALIVE_INTERVAL

PostgreSQL

  • PGSQL_NOTICE_LAST
  • PGSQL_NOTICE_ALL
  • PGSQL_NOTICE_CLEAR

SPL

  • MT_RAND_PHP

User Contributed Notes

There are no user contributed notes for this page.


Modifications entrainant une incompatibilité ascendante

Exception en passant trop peu d'arguments de fonction

Auparavant, un avertissement etait émis pour invoquer des fonctions définies par l'utilisateur avec trop peu d'arguments. Maintenant, cet avertissement a été promu en une exception d'erreur. Cette modification s'applique uniquement aux fonctions définies par l'utilisateur, et non aux fonctions internes. Par exemple:

<?php
function test($param){}
test();

Résultat de l'exemple ci-dessus est similaire à :

Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d

Interdire les appels dynamiques aux fonctions d'introspection de portée

Les appels dynamiques pour certaines fonctions ont été interdits (sous la forme de $func() ou array_map('extract', ...), etc.). Ces fonctions inspectent ou modifient une autre étendue, et présentent avec eux un comportement ambigu et non fiable. Les fonctions sont les suivantes:

  • assert() - avec une chaîne comme premier argument
  • compact()
  • extract()
  • func_get_args()
  • func_get_arg()
  • func_num_args()
  • get_defined_vars()
  • mb_parse_str() - avec un argument
  • parse_str() - avec un argument
<?php
(function () {
    $func = 'func_num_args';
    $func();
})();

L'exemple ci-dessus va afficher :

Warning: Cannot call func_num_args() dynamically in %s on line %d

Nom de class, interface, et trait invalide

Les noms suivants ne peuvent pas être utilisés pour nommer des classes, des interfaces ou des traits:

  • void
  • iterable

Les conversions de chaînes numériques respectent désormais la notation scientifique

Les opérations entières et les conversions sur les chaînes numériques respectent désormais la notation scientifique. Cela inclut également l'opération de cast (int) et les fonctions suivantes: intval() (où la base est 10), settype(), decbin(), decoct() et dechex().

Correctifs à l'algorithme mt_rand()

mt_rand() utilise désormais par défaut la version fixe de l'algorithme Mersenne Twister. Si la sortie déterministe de mt_srand() a été invoquée, alors la possibilité de conserver l'ancienne (et incorrecte) implémentation est possible via la valeur MT_RAND_PHP du deuxième paramètre facultatif de mt_srand().

rand() alias de mt_rand() et srand() alias de mt_srand()

rand() et srand() sont désormais des alias de mt_rand() et mt_srand(), respectivement. Cela signifie que la sortie pour les fonctions suivantes ont été modifié : rand(), shuffle(), str_shuffle() et array_rand().

Interdire le caractère de contrôle de suppression ASCII dans les identificateurs

Le caractère de contrôle de suppression ASCII (0X7f) ne peut plus être utilisé dans les identificateurs qui ne sont pas entre guillemets.

error_log change pour la valeur syslog

Si le paramètre INI error_log est défini sur syslog, les niveaux d'erreur PHP sont mappés aux niveaux d'erreur syslog. Cela apporte une différenciation plus fine dans les journaux d'erreurs contrairement à l'approche précédente où toutes les erreurs sont enregistrées avec le niveau d'avis uniquement.

N'appelez pas les destructeurs sur des objets incomplets

Les destructeurs ne sont désormais jamais appelés pour les objets qui lèvent une exception pendant l'exécution de leur constructeur. Dans les versions précédentes, ce comportement dépendait de la question de savoir si l'objet était référencé en dehors du constructeur (par exemple par une exception backtrace).

call_user_func() gestion des arguments de référence

call_user_func() va maintenant toujours générer un avertissement sur les appels aux fonctions qui attendent des références comme arguments. Auparavant, cela dépendait de la question de savoir si l'appel était entièrement qualifié.

En outre, call_user_func() et call_user_func_array() n'abandonneront plus l'appel de fonction dans ce cas. L'avertissement "référence attendue" sera émis, mais l'appel va continuer comme d'habitude.

L'opérateur d'index vide n'est plus pris en charge pour les chaînes

L'application de l'opérateur d'index vide à une chaîne (par exemple $str[] = $x) lève une erreur fatale au lieu de la convertir silencieusement en tableau.

Affectation via l'accès d'index de chaîne sur une chaîne vide

La modification de chaîne par caractère sur une chaîne vide fonctionne désormais comme pour les chaînes non vides, c'est-à-dire l'écriture dans un décalage hors plage de la chaîne avec des espaces, où les types non entiers sont convertis en entier, et seul le premier caractère de la chaîne assignée est utilisé. Autrefois, les chaînes vides était silencieusement traité comme un tableau vide.

<?php
$a = '';
$a[10] = 'foo';
var_dump($a);
?>

Résultat de l'exemple ci-dessus en PHP 7.0 :

array(1) {
  [10]=>
  string(3) "foo"
}

Résultat de l'exemple ci-dessus en PHP 7.1 :

string(11) "          f"

Directives ini supprimées

Les directives ini suivantes ont été supprimées :

  • session.entropy_file
  • session.entropy_length
  • session.hash_function
  • session.hash_bits_per_character

L'odonancement des éléments d'un tableau a changé lorsque qu'ils sont créés automatiquement pendant les affectations par référence

L'ordre des éléments dans un tableau a changé lorsque ces éléments ont été créés automatiquement en les référençant dans une assignation par référence. Par exemple:

<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>

Résultat de l'exemple ci-dessus en PHP 7.0 :

array(2) {
  ["a"]=>
  &int(1)
  ["b"]=>
  &int(1)
}

Résultat de l'exemple ci-dessus en PHP 7.1 :

array(2) {
  ["b"]=>
  &int(1)
  ["a"]=>
  &int(1)
}

Ordre de tri des éléments égaux

L'algorithme de tri interne a été amélioré, ce qui peut entraîner un ordre de tri différent des éléments, qui se comparaient comme égaux auparavant.

Note:

Ne comptez pas sur l'ordre des éléments qui se comparent comme égaux; il pourrait changer à tout moment.

Message d'erreur pour les erreurs E_RECOVERABLE

Le message d'erreur pour les erreurs E_RECOVERABLE a été modifié de "Catchable fatal error" à "Recoverable fatal error".

Paramètre $options de unserialize()

L'élément allowed_classes du paramètre $options de unserialize() est maintenant strictement typé, c'est-à-dire que si une valeur autre qu'un tableau ou un booléen est donnée, unserialize() retourne false et émet un E_WARNING.

Le constructeur de DateTime incorpore microsecondes

DateTime et DateTimeImmutable intègrent désormais correctement les microsecondes lorsqu'elles sont construites à partir de l'heure actuelle, soit explicitement, soit avec une chaîne relative (par exemple "first day of next month"). Cela signifie que les comparaisons naïves de deux instances nouvellement créées seront désormais plus susceptibles de retourner false au lieu de true:

<?php
new DateTime() == new DateTime();
?>

Conversions des erreurs fatales en exceptions Error

Dans l'extension date, les données de sérialisation invalide pour les classes DateTime ou DatePeriod , ou l'échec de l'initialisation du fuseau horaire à partir de données sérialisées, lèvera désormais une exception Error à partir de la métode __wakeup() ou __set_state(), au lieu de se traduit par une erreur fatale.

Dans l'extension DBA, les fonctions de modification des données (telles que dba_insert()) lèvera désormais une exception Error au lieu de déclencher une erreur fatale capturable si la clé ne contient pas exactement deux éléments.

Dans l'extension DOM, les contextes de validation de schéma ou de RelaxNG non valides lèvera désormais une exception Error au lieu de résulter en une erreur fatale. De même, la tentative d'inscription d'une classe de nœud qui n'étend pas la classe de base appropriée, ou tente de lire une propriété non valide ou d'écrire dans une propriété en lecture seule, lèvera également une exception Error .

Dans l'extension IMAP, les adresses de messagerie plus longues que 16385 octets lèvera une exception Error au lieu de se traduit par une erreur fatale.

Dans l'extension Intl, le fait de ne pas appeler le constructeur parent dans une classe qui étend Collator avant d'appeler les méthodes parent lèvera maintenant une Error au lieu d'avoir pour résultat une erreur fatale récupérable. En outre, le clonage d'un objet Transliterator lève désormais une exception Error en cas d'echec du clonage du Transliterator interne au lieu d'une erreur fatale.

Dans l'extension LDAP, la fourniture d'un type de modification inconnu à ldap_batch_modify() lèvera désormais une exception Error au lieu d'une erreur fatale.

Dans l'extension mbstring, les fonctions mb_ereg() et mb_eregi() lèveront désormais une exception ParseError si une expression PHP non valide est fournie et que l'option 'e' est utilisée.

Dans l'extension mcrypt, mcrypt_encrypt() et mcrypt_decrypt() lèveront maintenant une exception Error au lieu d'une erreur fatale si mcrypt ne peut pas être initialisée.

Dans l'extension mysqli, la tentative de lecture d'une propriété non valide ou d'écriture dans une propriété en lecture seule lève maintenant une exception Error au lieu de se traduire par une erreur fatale.

Dans l'extension Reflection, le fait de ne pas récupérer un objet de réflexion ou de récupérer une propriété d'objet lève maintenant une exception Error au lieu de se traduire par une erreur fatale.

Dans l'extension de session, les gestionnaires de session personnalisés qui ne retournent pas de chaînes pour les ID de session lèvera désormais une exception Error au lieu de provoquer une erreur fatale lorsqu'une fonction est appelée pour générer un ID de session.

Dans l'extension SimpleXML, la création d'un attribut sans nom ou dupliqué va maintenant lever une exception Error au lieu de générer une erreur fatale.

In the SPL extension, attempting to clone an SplDirectory object will now throw an Error exception instead of resulting in a fatal error. Similarly, calling ArrayIterator::append() when iterating over an object will also now throw an Error exception.

Dans l'extension standard, la fonction assert(), lorsqu'elle est fournie avec un argument de chaîne comme premier paramètre, lèvera maintenant une exception ParseError au lieu d'une erreur fatale capturable si le code PHP n'est pas valide. De même, l'appel à forward_static_call() en dehors d'une étendue de classe lève maintenant une exception Error .

Dans l'extension Tidy, la création manuelle d'un tidyNode lèvera une exception Error au lieu d'une erreur fatale.

Dans l'extension WDDX, une référence circulaire lors de la sérialisation va maintenant lever une exception Error au lieu d'une erreur fatale.

Dans l'extension XML-RPC, une référence circulaire lors de la sérialisation lève maintenant une instance d'exception Error au lieu de se traduire par une erreur fatale.

Dans l'extension Zip, la méthode ZipArchive::addGlob() lève maintenant une exception Error au lieu de se traduire par une erreur fatale si la prise en charge de glob n'est pas disponible.

Les variables liées Lexiquement ne peuvent pas réutiliser les noms

Les variables liées à une fonction anonyme via la construction use ne peuvent pas utiliser le même nom que n'importe quel superglobals, $this ou n'importe quel paramètre. Par exemple, toutes ces définitions de fonction entraînera une erreur fatale :

<?php
$f = function () use ($_SERVER) {};
$f = function () use ($this) {};
$f = function ($param) use ($param) {};

long2ip() changement de type de paramètre

long2ip() attend maintenant un int à la place de string.

Encodage et décodage JSON

Le paramètre INI serialize_precision contrôle maintenant la précision de sérialisation lors de l'encodage des double.

Le décodage d'une clé vide entraîne désormais un nom de propriété vide, plutôt que _empty_ comme nom de propriété.

<?php
var_dump(json_decode(json_encode(['' => 1])));

Résultat de l'exemple ci-dessus est similaire à :

object(stdClass)#1 (1) {
  [""]=>
  int(1)
}

Lorsque vous fournissez l'indicateur JSON_UNESCAPED_UNICODE à json_encode(), les séquences U+2028 et U+2029 sont maintenant échappées.

Modifications de la sémantique des paramètres de mb_ereg() et mb_eregi()

Le troisième paramètre des fonctions mb_ereg() et mb_eregi() (regs) est désormais défini sur un tableau vide si rien n'a été mis en correspondance. Auparavant, le paramètre n'aurait pas été modifié.

Abandon des flux sslv2

Le flux SSLv2 a maintenant été abandonné dans OpenSSL.

Interdit "return;" pour les retours typés lors de la compilation

Une déclaration de retour sans arguments dans les fonctions qui déclarent un type de retour émet désormais E_COMPILE_ERROR (sauf si le type de retour est déclaré comme void), même si la déclaration de retour ne serait jamais atteinte.

User Contributed Notes

david at artefactual dot com 04-Apr-2019 05:29
Regarding the ArgumentCountError, PHP 7.1+ does still support user functions with a variable number of arguments, using the "func(...$args) {}" syntax, see: https://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list
mikem at gmail dot com 21-Nov-2017 12:09
ArgumentCountError - this modification is the main reason to avoid this version on older projects.
kees at twekaers dot net 21-Mar-2017 11:49
The backwards incompatible change 'The empty index operator is not supported for strings anymore' has a lot more implications than just a fatal error on the following code

<?php
$a = "";
$a[] = "hello world";
var_dump($a);
?>

This will give a fatal error in 7.1 but will work as expected in 7.0 or below and give you: (no notice, no warning)

array(1) {
  [0]=>
  string(11) "hello world"
}

However, the following is also changed:

<?php
$a = "";
$a[0] = "hello world";
var_dump($a);
// 7.1: string(1) "h"
// pre-7.1: array(1) {  [0]=>  string(11) "hello world" }

$a = "";
$a[5] = "hello world";
var_dump($a);
// 7.1: string(6) "     h"
// pre-7.1: array(1) {  [0]=>  string(11) "hello world" }

?>
m dot r dot sopacua at gmail dot com 30-Dec-2016 03:49
"OMFG! Why was session.hash_function removed?!? Dude!"

https://wiki.php.net/rfc/session-id-without-hashing

There. Saved ya a search.
love at sickpeople dot se 24-Nov-2016 07:59
For anyone migrating from 5.x to 7.1:

About "Array ordering when elements are automatically created during by reference assignments has changed" on this page

(http://php.net/manual/en/migration71.incompatible.php#migration71.incompatible.array-order)

The behaviour of 7.1 is THE SAME as of PHP 5. It is only 7.0 that differs.

See https://3v4l.org/frbUc

<?php

$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);


Les fonctionnalités dépréciées dans PHP 7.1.x

ext/mcrypt

L'extension mcrypt a été abandonnée pendant près d'une décennie maintenant, et était également assez complexe à utiliser. Elle a donc été déprécié en faveur de OpenSSL, et elle sera retirée du noyau et dans PECL en PHP 7.2.

L'options Eval pour mb_ereg_replace() et mb_eregi_replace()

Le modificateur de motif e a été déprécié pour les fonctions mb_ereg_replace() et mb_eregi_replace().

User Contributed Notes

There are no user contributed notes for this page.


Fonctions modifiées

Cœur de PHP

  • getopt() a un troisième paramètre optionnel qui expose l'index de l'élément suivant dans la liste des vecteurs d'arguments à traiter. Ceci est fait via un paramètre by-ref.
  • getenv() ne nécessite plus son paramètre. Si le paramètre est omis, les variables d'environnement actuelles seront renvoyées en tant que tableau associatif.
  • get_headers() a maintenant un paramètre supplémentaire pour permettre le passage de contextes de flux personnalisés.
  • output_reset_rewrite_vars() ne réinitialise plus la réécriture des URL des variables de session.
  • parse_url() est maintenant plus restrictif et supporte RFC3986.
  • unpack() accepte maintenant un troisième paramètre optionnel pour spécifier l'offset du début du dépacketage.

Système de fichier

  • file_get_contents() accepte maintenant un offset de recherche négatif si le flux est cherchable.
  • tempnam() émet maintenant un notice quand on revient dans le répertoire système temporaire.

JSON

  • json_encode() accepte maintenant une nouvelle option, JSON_UNESCAPED_LINE_TERMINATORS, pour désactiver l'échappement des caractères U+2028 et U+2029 quand JSON_UNESCAPED_UNICODE est fournit.

Chaîne multi-octets

  • mb_ereg() rejette maintenant les séquences d'octets illégales.
  • mb_ereg_replace() rejette maintenant les séquences d'octets illégales.

PDO

  • PDO::lastInsertId() pour PostgreSQL va maintneant déclencher une erreur quand nextval n'a pas été appelé pour la session courante. (la connexion postgres).

PostgreSQL

  • pg_last_notice() accepte maintenant un paramètre optionnel pour spécifier une opération. Ceci peut être fait avec une des nouvelles constantes suivantes : PGSQL_NOTICE_LAST, PGSQL_NOTICE_ALL, or PGSQL_NOTICE_CLEAR.
  • pg_fetch_all() accepte maintenant un second paramètre optionnel pour spécifier le type de résultat (similaire au troisième paramètre de pg_fetch_array()).
  • pg_select() accepte maintenant un quatrième paramètre pour spécifier le type de résultat (similaire au troisième paramètre de pg_fetch_array()).

Session

  • session_start() maintenant retourne false et n'initialise plus $_SESSION quand le démarrage de la session échoue.

User Contributed Notes

There are no user contributed notes for this page.


Autres changements

Notices et avertisements sur opérations arithmétiques avec chaînes invalides

Des nouvelles erreurs E_WARNING et E_NOTICE ont été introduite quand des chaîne de caractères invalides sont contraint en utilisant des opérateurs s'attendant à des nombres (+ - * / ** % << >> | & ^) ou leurs assignements équivalent. Une E_NOTICE est émise quand la chaîne de caractères commence avec une valeur numérique mais contient des caractères non numériques de fin, et une E_WARNING est émise quand la chaîne de caractères ne contient pas une valeur numérique.

<?php
'1b' + 'something';

L'exemple ci-dessus va afficher :

Notice: A non well formed numeric value encountered in %s on line %d
Warning: A non-numeric value encountered in %s on line %d

Avertir en cas de débordement de la séquence d'échappement octale

Auparavant, les séquences d'échappement de chaîne octale de 3 octets débordaient silencieusement. Désormais, ils déborderont toujours, mais une E_WARNING sera émise.

<?php
var_dump("\500");

L'exemple ci-dessus va afficher :

Warning: Octal escape sequence overflow \500 is greater than \377 in %s on line %d
string(1) "@"

Correction des incohérences de $this

Bien que $this est considéré une variable spéciale en PHP, elle lui manquait des contrôles appropriés pour s'assurer qu'elle n'était pas utilisé comme nom de variable ou réassigné. Ceci a été désormais rectifié pour s'assurer que $this ne peut pas être une variable définit par l'utilisateur, réassigné à une différente valeur, ou globalisé.

Génération d'ID de session sans hachage

Les IDs de session ne seront plus hashé dès la génération. Avec ce changement ceci amène à la suppression des quatres paramètres ini suivant :

  • session.entropy_file
  • session.entropy_length
  • session.hash_function
  • session.hash_bits_per_character

Et l'addition des deux paramètres ini suivant :

  • session.sid_length - définit la longeur de l'ID de session, par défaut 32 caractères pour la rétrocompatibilité.
  • session.sid_bits_per_character - définit le nombre de bits à enregistrer par caractère (c.à.d augmente l'intervale de caractères qui peuvent être utilisé dans l'ID de session), par défaut 4 pour la rétrocompatibilité.

Modifications apportées à la gestion des fichiers INI

precision

Si la valeur est définit à -1, alors le mode dtoa 0 est utilisé. La valeur par défaut est toujours 14.

serialize_precision

Si la valeur est définit à -1, alors le mode dtoa 0 est utilisé. La valeur -1 est désormais utilisé par défaut.

gd.jpeg_ignore_warning

La valeur par défaut de ce paramètre php.ini a été modifié à 1, donc par défaut les avertissements libjpeg sont ignorés.

opcache.enable_cli

La valeur par défaut de ce paramètre php.ini a été modifié à 1 (activé) en PHP 7.1.2, et retour à 0 (désactivé) en PHP 7.1.7.

Génération des IDs de sessions seulement avec un CSPRNG

Les IDs de sessions seront désormais seulement générés avec un CSPRNG (Crypto Secure Pseudo Random Number Generator)

Des messages TypeError plus informatifs quand null est permit

Les exceptions TypeError pour les vérifications de type arg_info fourniront désormais des messages d'erreurs plus informatifs. Si le type du paramètre ou la type de retour accepte null (soit en ayant une valeur par défaut de null soit en étant un type nullable), alors le message d'erreur mentionnera désormais ceci avec un message "must be ... or null" ou "must ... or be null."

User Contributed Notes

Ta7To7 27-Feb-2018 05:47
Note that using Incrementing/Decrementing operators on string is legal
<?php
$str = "";
echo ++$str; // output: 1
?>


Support Windows

Support pour les chemins long et UTF-8

Si une application web est conforme à l'UTF-8, aucune action supplémentaire n'est requise. Pour des applications qui dépendent de chemins dans un encodage différent que UTF-8 pour l'I/O, une directive INI doit être explicitement définit. La vérification des paramètres d'encodage INI se fie à l'ordre dans le cœur (core) :

  • internal_encoding
  • default_charset
  • zend.multibyte

Plusieurs fonction pour la gestion des codepage ont été introduite :

  • sapi_windows_cp_set() to set the default codepage
  • sapi_windows_cp_get() to retrieve the current codepage
  • sapi_windows_cp_is_utf8()
  • sapi_windows_cp_conv() to convert between codepages, using iconv() compatible signature

Ces fonctions sont thread safe.

La sortie de la console codepage est ajusté en fonction de l'encodage utilisé en PHP. En fonction du codepage OEM du système concret, la sortie visible pourrait ou pourrait ne pas être correct. Par exemple, avec le cmd.exe par défaut et sur un système avec le codepage OEM 437, la sortie dans codepage 1251, 1252, 1253 et d'autres peuvent être montrer correctement en utilisant UTF-8. Sur les mêmes systèmes, les caractères dans codepage tel que 20932 seront probablement pas montré correctement. Ceci fait référence aux régles système particulières pour codepage, la compabilité de la police et le choix du programme de console utilisé. PHP définit automatiquement la codepage console en accord avec les régles d'encodages depuis php.ini. Utiliser des consoles alternative à la place de cmd.exe directement pourrait apporter une meilleure expérience dans certains cas.

Toutefois soyez conscient, changer de codepage après que la requête a commencé peut causer des effets secondaires inattendue en CLI. La façon préférable est php.ini. Quand PHP CLI est utilisé dans un émulateur de console, qui ne supporte pas Unicode, il est possiblement nécessaire, d'éviter de changer la codepage de la console. La meilleure façon pour achever ceci est de définir l'encodage interne ou par défault pour correspondre à la codepage ANSI. Une autre méthode est de définir la directive INI output_encoding et input_encoding à la codepage requise, cependant dans ce cas la différence entre les codepages interne et I/O risque de causer du mojibake. Dans de rare cas, si PHP arrive à planter gracieusement, la codepage originale de la console peut ne pas être restaurée. Dans ce cas, la commande chcp peut être utilisé, pour la restaurer manuellement.

Attention particulière pour les systèmes DBCS - le changement de codepage lors de l'exécution en utilisant ini_set() risque de causer des problèmes d'affichage. À la différence des systèmes non DBCS, c'est que les caractères étendues nécessites deux consoles pour être affiché. Dans certains cas, seulement la mise en correspondance des caractères dans le jeu de glyphes de la police pourrait se produire, aucun changement de police se produit. Ceci est la nature des systèmes DBCS, la manière la plus simple de prévenir des problèmes d'affichages et d'éviter l'usage de ini_set() pour le changement de codepage.

En conséquence du support d'UTF-8 dans les flux, les scripts PHP ne sont plus limité à des noms de fichiers ASCII ou ANSI. Ceci est prêt à l'emplois en CLI. Pour d'autres SAPI, la documentation pour le serveur correspondant est utile.

Le support des chemins long est transparent. Les chemins plus long que 260 octets sont automatiquement préfixé par \\?\. La longeur maximale du chemin est limité à 2018 octets. Soyez conscient, que la limite des segments de chemin (longeur du basename) persiste.

Pour la meilleure portabilité, il est fortement recommendé de gérer les noms de fichiers, I/O et autre sujets connexe UTF-8. En outre, pour les applications console, l'usage d'une police TrueType est préférable et l'usage de ini_set() pour le le changement de codepage est déconseillé.

readline

L'extension readline est supporté à travers la » bibliothèque WinEditLine. Ainsi l'interface système interactive CLI est aussi supporté (php.exe -a).

PHP_FCGI_CHILDREN

PHP_FCGI_CHILDREN est désormais respecté. Si cette variable d'environement est définit, le premier processus php-cgi.exe exécutera le nombre spécifié d'enfant. Ceci partageront le même socket TCP.

ftok()

Ajout du support pour ftok()

User Contributed Notes

There are no user contributed notes for this page.


Migration de PHP 5.6.x vers PHP 7.0.x

Sommaire

  • Modifications entrainant une incompatibilité ascendante
  • Nouvelles fonctionnalités
  • Les fonctionnalités dépréciées dans PHP 7.0.x
  • Fonctions modifiées
  • Nouvelles fonctions
  • Nouvelles Classes et Interfaces
  • Nouvelles constantes globales
  • Modifications des modules SAPI
  • Extensions et SAPI supprimés
  • Autres changements

Bien que PHP 7.0 soit une nouvelle version majeure, des efforts ont été faits pour rendre la migration aussi facile que possible. Cette version vise principalement à retirer les fonctionnalités qui ne sont plus supportées et à améliorer la cohérence du langage.

Il y a quelques incompatibilités et nouvelles fonctionnalités qui devraient être considérées, et le code devrait être testé avant de changer la version de PHP dans un environnement de production.

User Contributed Notes

There are no user contributed notes for this page.


Modifications entrainant une incompatibilité ascendante

Modifications apportées à la gestion des erreurs et des exceptions

De nombreuses erreurs fatales et récupérables ont été converties en exceptions dans PHP 7. Ces exceptions d'erreur héritent de la classe Error, qui implémente elle-même l'interface Throwable (la nouvelle interface de base dont toutes les exceptions héritent).

Cela signifie que les gestionnaires d'erreurs personnalisés peuvent ne plus être déclenchés car des exceptions peuvent être levées à la place (provoquant de nouvelles erreurs irrécupérables pour les exceptions Error non interceptée).

Une description plus complète de la façon dont les erreurs fonctionnent en PHP 7 se trouve sur la page des erreurs PHP 7. Ce guide de migration énumérera simplement les modifications qui affectent la rétrocompatibilité.

set_exception_handler() n'est plus garanti de recevoir des objets Exception

Le code qui implémente un gestionnaire d'exceptions inscrit avec set_exception_handler() à l'aide d'une déclaration de type Exception provoquera une erreur fatale lorsqu'un objet Error est levé.

Si le gestionnaire doit fonctionner à la fois avec PHP 5 et 7, vous devriez supprimer la déclaration de type du gestionnaire, tandis que le code qui est migré pour travailler sur PHP 7 exclusivement peut simplement remplacer la déclaration de type Exception par Throwable.

<?php
// Code pour PHP 5 qui va se briser.
function handler(Exception $e) { ... }
set_exception_handler('handler');

// Compatible PHP 5 et 7.
function handler($e) { ... }

// PHP 7 seulement.
function handler(Throwable $e) { ... }
?>

Les constructeurs internes lèvent toujours des exceptions en cas d'échec

Auparavant, certaines classes internes retournaient null ou un objet inutilisable lorsque le constructeur échouait. Toutes les classes internes lèveront maintenant une Exception dans ce cas de la même manière que les classes d'utilisateurs.

Les erreurs d'analyse lèvent une ParseError

Les erreurs d'analyseur lèvent maintenant un objet ParseError. La gestion des erreurs pour eval() doit maintenant inclure un bloc catch qui peut gérer cette erreur.

Changements de gravité des avis E_STRICT

Tous les avis E_STRICT ont été reclassés à d'autres niveaux. La constante E_STRICT est conservée, donc les appels comme error_reporting(E_ALL|E_STRICT) ne provoquera pas d'erreur.

Changements de gravité des avis E_STRICT
Situation | Nouveau niveau/comportement
Indexation par une ressource | E_NOTICE
Méthodes statiques abstraites | Avis supprimé, déclenche aucune erreur
"Redéfinir" un constructeur | Avis supprimé, déclenche aucune erreur
Incompatibilité de signature pendant l'héritage | E_WARNING
Même propriété (compatible) dans deux traits utilisés | Avis supprimé, déclenche aucune erreur
Accès à une propriété statique non statiquement | E_NOTICE
Seules les variables doivent être attribuées par référence | E_NOTICE
Seules les variables doivent être transmises par référence | E_NOTICE
Appel de méthodes non statiques statiquement | E_DEPRECATED

Modifications apportées à la gestion des variables

PHP 7 utilise maintenant une arborescence de syntaxe abstraite lors de l'analyse des fichiers sources. Cela a permis de nombreuses améliorations à la langue qui étaient auparavant impossibles en raison des limitations dans l'analyseur utilisé dans les versions antérieures de PHP, mais a abouti à la suppression de quelques cas spéciaux pour des raisons de cohérence, qui a abouti à casser la rétro-compatibilité. Ces cas sont détaillés dans cette section.

Modifications apportées à la gestion des variables, propriétés et méthodes indirectes

L'accès indirect aux variables, propriétés et méthodes sera maintenant évalué strictement dans l'ordre de gauche à droite, par opposition à la combinaison précédente de cas spéciaux. Le tableau ci-dessous montre comment l'ordre d'évaluation a changé.

Ancienne et nouvelle évaluation des expressions indirectes
Expression | Interprétation PHP 5 | Interprétation PHP 7
$$foo['bar']['baz'] | ${$foo['bar']['baz']} | ($$foo)['bar']['baz']
$foo->$bar['baz'] | $foo->{$bar['baz']} | ($foo->$bar)['baz']
$foo->$bar['baz']() | $foo->{$bar['baz']}() | ($foo->$bar)['baz']()
Foo::$bar['baz']() | Foo::{$bar['baz']}() | (Foo::$bar)['baz']()

Le code qui utilisait l'ancien ordre d'évaluation de droite à gauche doit être réécrit pour utiliser explicitement cet ordre d'évaluation avec des accolades (voir la colonne du milieu ci-dessus). Cela rendra le code compatible avec PHP 7.x et rétrocompatible avec PHP 5.x.

Cela affecte également le mot clé global. La syntaxe des accolades peut être utilisée pour émuler le comportement précédent si nécessaire :

<?php
function f() {
    // Valide en PHP 5 uniquement.
    global $$foo->bar;

    // Valide en PHP 5 et 7.
    global ${$foo->bar};
}
?>

Modifications apportées à la gestion des list()

la fonction list() n'assigne plus de variable dans l'ordre inverse

list() assignera désormais des valeurs aux variables dans l'ordre dans lequel elles sont définies, plutôt que dans l'ordre inverse. En général, cela affecte uniquement le cas où list() est utilisée en conjonction avec l'opérateur de tableau [], comme illustré ci-dessous :

<?php
list($a[], $a[], $a[]) = [1, 2, 3];
var_dump($a);
?>

Résultat de l'exemple ci-dessus en PHP 5 :

array(3) {
  [0]=>
  int(3)
  [1]=>
  int(2)
  [2]=>
  int(1)
}

Résultat de l'exemple ci-dessus en PHP 7 :

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

En général, il est recommandé de ne pas compter sur l'ordre dans lequel les affectations de la fonction list() se produisent, car il s'agit d'un détail d'implémentation qui peut changer à nouveau à l'avenir.

Les affectations de list() vides ont été supprimées

Les constructions de list() ne peuvent plus être vides. Les éléments suivants ne sont plus autorisés :

<?php
list() = $a;
list(,,) = $a;
list($x, list(), $y) = $a;
?>
list() ne peut pas défaire chaîne de caractères

list() ne peut plus défaire les variables de chaîne de caractères. str_split() devrait être utilisé à la place.

L'ordre des éléments des tableaux a changé lorsque les éléments sont créés automatiquement pendant les affectations de référence

L'ordre des éléments dans un tableau a changé lorsque ces éléments ont été créés automatiquement en les référençant dans une assignation par référence. Par exemple :

<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>

Résultat de l'exemple ci-dessus en PHP 5 :

array(2) {
  ["b"]=>
  &int(1)
  ["a"]=>
  &int(1)
}

Résultat de l'exemple ci-dessus en PHP 7 :

array(2) {
  ["a"]=>
  &int(1)
  ["b"]=>
  &int(1)
}

Les parenthèses autour des arguments de fonction n'affectent plus le comportement

En PHP 5, l'utilisation de parenthèses redondantes autour d'un argument de fonction peut calmer les avertissements de normes strictes lorsque l'argument de fonction a été passé par référence. L'avertissement est maintenant toujours émis.

<?php
function getArray() {
    return [1, 2, 3];
}

function squareArray(array &$a) {
    foreach ($a as &$v) {
        $v **= 2;
    }
}

// Generates a warning in PHP 7.
squareArray((getArray()));
?>

L'exemple ci-dessus va afficher :

Notice: Only variables should be passed by reference in /tmp/test.php on line 13

Changements concernant foreach

Des changements mineurs ont été faits sur le comportement de la structure de contrôle foreach, principalement sur la gestion du pointeur interne de tableau et la modification du tableau étant parcouru.

foreach ne modifie plus le pointeur interne de tableau

Antérieur à PHP 7, le pointeur interne de tableau était modifié pendant qu'un tableau était parcouru avec foreach. Cela n'est plus le cas, comme le montre l'exemple suivant :

<?php
$array = [0, 1, 2];
foreach ($array as &$val) {
    var_dump(current($array));
}
?>

Résultat de l'exemple ci-dessus en PHP 5 :

int(1)
int(2)
bool(false)

Résultat de l'exemple ci-dessus en PHP 7 :

int(0)
int(0)
int(0)

foreach par valeur travaille sur une copie du tableau

Lors de l'utilisation du mode par défaut (par valeur), foreach travaille maintenant sur une copie du tableau en cours parcouru plutôt que sur le tableau lui-même. Cela signifie que les changements réalisés sur le tableau pendant son parcours n'affecteront pas les valeurs qui sont parcourues.

Le comportement du parcours de foreach par référence a été amélioré

Lors du parcours d'un tableau par référence, foreach identifie mieux les changements faits au tableau pendant son parcours. Par exemple, si des valeurs sont ajoutées à un tableau pendant son parcours, alors ces nouvelles valeurs seront également parcourues :

<?php
$array = [0];
foreach ($array as &$val) {
    var_dump($val);
    $array[1] = 1;
}
?>

Résultat de l'exemple ci-dessus en PHP 5 :

int(0)

Résultat de l'exemple ci-dessus en PHP 7 :

int(0)
int(1)

Parcours d'objets non-Traversable

Le parcours d'un objet non-Traversable est maintenant identique au parcours d'un tableau par référence. En conséquence l'amélioration du comportement lors de la modification d'un tableau pendant son parcours est également appliquée lorsque des propriétés sont ajoutées ou supprimées d'un objet.

Modifications apportées à la gestion d'entier

Littéraux octaux non valides

Auparavant, les littéraux octaux qui contenaient des nombres non valides étaient tronqués silencieusement (0128 a été pris comme 012). Désormais, un littéral octal non valide provoquera une erreur d'analyse.

Décalage de bits négatif

Les décalages de bits par nombres négatifs vont maintenant lancer une ArithmeticError:

<?php
var_dump(1 >> -1);
?>

Résultat de l'exemple ci-dessus en PHP 5 :

int(0)

Résultat de l'exemple ci-dessus en PHP 7 :

Fatal error: Uncaught ArithmeticError: Bit shift by negative number in /tmp/test.php:2
Stack trace:
#0 {main}
  thrown in /tmp/test.php on line 2

Décalage de bits hors plage

Les décalages de bits (dans les deux sens) au-delà de la largeur de bit d'un entier retournera toujours 0. Auparavant, le comportement de ces décalages était dépendant de l'architecture.

Changements apportés à la division par zéro

Auparavant, lorsque 0 a été utilisé comme diviseur pour les opérateurs de division (/) ou de modulo (%), un E_WARNING était émis et false était retourné. Désormais, l'opérateur de division retourne un float en tant que +INF,-INF ou NAN, comme spécifié par IEEE 754. Le E_WARNING de l'opérateur de modulo a été supprimé et lèvera une exception DivisionByZeroError.

<?php
var_dump(3/0);
var_dump(0/0);
var_dump(0%0);
?>

Résultat de l'exemple ci-dessus en PHP 5 :

Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)

Warning: Division by zero in %s on line %d
bool(false)

Résultat de l'exemple ci-dessus en PHP 7 :

Warning: Division by zero in %s on line %d
float(INF)

Warning: Division by zero in %s on line %d
float(NAN)

PHP Fatal error:  Uncaught DivisionByZeroError: Modulo by zero in %s line %d

Modifications apportées à la gestion des chaîne de caractères

Les chaînes hexadécimales ne sont plus considérées comme numériques

Les chaîne de caractères contenant des nombres hexadécimaux ne sont plus considérées comme numériques. Par exemple :

<?php
var_dump("0x123" == "291");
var_dump(is_numeric("0x123"));
var_dump("0xe" + "0x1");
var_dump(substr("foo", "0x1"));
?>

Résultat de l'exemple ci-dessus en PHP 5 :

bool(true)
bool(true)
int(15)
string(2) "oo"

Résultat de l'exemple ci-dessus en PHP 7 :

bool(false)
bool(false)
int(0)

Notice: A non well formed numeric value encountered in /tmp/test.php on line 5
string(3) "foo"

filter_var() peut être utilisé pour vérifier si une chaîne de caractères contient un nombre hexadécimal, et aussi pour convertir une chaîne de caractères de ce type en un entier :

<?php
$str = "0xffff";
$int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if (false === $int) {
    throw new Exception("Invalid integer!");
}
var_dump($int); // int(65535)
?>

\u{ peut provoquer des erreurs

En raison de l'ajout de la nouvelle syntaxe d'échappement du point de code Unicode, les chaîne de caractères contenant un littéral \u{ suivi d'une séquence non valide provoquera une erreur fatale. Pour éviter cela, la barre oblique inverse principale doit être échappé.

Fonctions supprimées

call_user_method() et call_user_method_array()

Ces fonctions ont été dépréciées en PHP 4.1.0 en faveur de call_user_func() et call_user_func_array(). Vous pourriez également utiliser les fonctions variables et/ou l'opérateur ....

Toutes les fonctions ereg*

Toutes les fonctions ereg ont été supprimées. PCRE est une alternative recommandée.

Aliasmcrypt

La fonction obsolète mcrypt_generic_end() a été remplacée par mcrypt_generic_deinit().

De plus, les fonctions obsolètes mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() et mcrypt_ofb() ont été remplacées par l'utilisation de mcrypt_decrypt() avec la constante appropriée MCRYPT_MODE_*.

Toutes les fonctions ext/mysql

Toutes les fonctions ext/mysql ont été supprimées. Pour plus d'informations sur le choix d'une autre API MySQL, consultez choisir une API MySQL.

Toutes les fonctions ext/mssql

Toutes les fonctions ext/mssql ont été supprimées.

  • PDO_SQLSRV
  • PDO_ODBC
  • SQLSRV
  • Unified ODBC API

intl aliases

Les alias obsolètes datefmt_set_timezone_id() et
IntlDateFormatter::setTimeZoneID() ont été supprimés
et remplacés respectivement par datefmt_set_timezone() et
IntlDateFormatter::setTimeZone().

set_magic_quotes_runtime()

set_magic_quotes_runtime(), ainsi que son alias magic_quotes_runtime(), ont été supprimées. Elles étaient obsolètes à partir PHP 5.3.0, et sans effet depuis la suppression des guillemets magiques en PHP 5.4.0.

set_socket_blocking()

L'alias obsolète set_socket_blocking() a été supprimé et remplacé par stream_set_blocking().

dl() avec PHP-FPM

dl() ne peut plus être utilisé avec PHP-FPM. Il continue à fonctionner dans les SAPIs CLI et Embed.

Fonctions GD Type1

Le support des polices PostScript Type1 a été supprimé de l'extension GD, entraînant la suppression des fonctions suivantes :

  • imagepsbbox()
  • imagepsencodefont()
  • imagepsextendfont()
  • imagepsfreefont()
  • imagepsloadfont()
  • imagepsslantfont()
  • imagepstext()

À la place, il est recommandé d'utiliser les polices TrueType et leurs fonctions associées.

Directives INI supprimées

Fonctionnalités supprimées

Les directives INI suivantes ont été supprimées car leurs fonctionnalités associées ont également été supprimées:

  • always_populate_raw_post_data
  • asp_tags

xsl.security_prefs

La directive xsl.security_prefs a été supprimée. Au lieu de cela, la méthode XsltProcessor::setSecurityPrefs() doit être appelée pour contrôler les préférences de sécurité sur une base du processeur.

Autres modifications rétro-incompatibles

Les nouveaux objets ne peuvent pas être attribués par référence

Le résultat de l'instruction new ne peut plus être assigné à une variable par référence :

<?php
class C {}
$c =& new C;
?>

Résultat de l'exemple ci-dessus en PHP 5 :

Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3

Résultat de l'exemple ci-dessus en PHP 7 :

Parse error: syntax error, unexpected 'new' (T_NEW) in /tmp/test.php on line 3

Noms de classe, d'interface et de traits invalides

Les noms suivants ne peuvent pas être utilisés pour nommer des classes, des interfaces ou des traits :

  • bool
  • int
  • float
  • string
  • null
  • true
  • false

En outre, les noms suivants ne doivent pas être utilisés. Bien qu'ils ne génèrent pas une erreur dans PHP 7.0, ils sont réservés pour une utilisation future et doivent être considérés comme obsolètes.

  • resource
  • object
  • mixed
  • numeric

ASP et script PHP Tags supprimés

La prise en charge de l'utilisation des balises ASP et script pour délimiter le code PHP a été supprimée. Les balises affectées sont :

Suppression des balises ASP et script
Balise d'ouverture | Balise de fermeture
<% | %>
<%= | %>
<script language="php"> | </script>

Appels d'un contexte incompatible supprimés

Précédemment déconseillé dans PHP 5.6, les appels statiques effectués à une méthode non statique avec un contexte incompatible se traduira désormais par la méthode appelée ayant une variable $this non définie et un avertissement d'obsolescence est émis.

<?php
class A {
    public function test() { var_dump($this); }
}

// Note: Does NOT extend A
class B {
    public function callNonStaticMethodOfA() { A::test(); }
}

(new B)->callNonStaticMethodOfA();
?>

Résultat de l'exemple ci-dessus en PHP 5.6 :

Deprecated: Non-static method A::test() should not be called statically, assuming $this from incompatible context in /tmp/test.php on line 8
object(B)#1 (0) {
}

Résultat de l'exemple ci-dessus en PHP 7 :

Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8

Notice: Undefined variable: this in /tmp/test.php on line 3
NULL

yield est maintenant un opérateur associatif à droite

La construction yield ne nécessite plus de parenthèses et a été remplacée par un opérateur associatif droit avec la priorité entre print et =>. Cela peut entraîner un changement de comportement :

<?php
echo yield -1;
// A été précédemment interprété comme
echo (yield) - 1;
// Et est maitenant interprété comme
echo yield (-1);

yield $foo or die;
// A été précédemment interprété comme
yield ($foo or die);
// Et est maitenant interprété comme
(yield $foo) or die;
?>

Les parenthèses peuvent être utilisées pour lever l'ambiguïté sur ces cas.

Les fonctions ne peuvent pas avoir plusieurs paramètres avec le même nom

Il n'est plus possible de définir deux ou plusieurs paramètres de fonction avec le même nom. Par exemple, la fonction suivante déclenchera un E_COMPILE_ERROR:

<?php
function foo($a, $b, $unused, $unused) {
    //
}
?>

Fonctions d'inspection des arguments signalent la valeur actuelle du paramètre

func_get_arg(), func_get_args(), debug_backtrace() et les traces d'exception ne signalent plus la valeur d'origine qui a été passée à un paramètre, mais fourniront plutôt la valeur actuelle (qui aurait pu être modifiée).

<?php
function foo($x) {
    $x++;
    var_dump(func_get_arg(0));
}
foo(1);?>

Résultat de l'exemple ci-dessus en PHP 5 :

1

Résultat de l'exemple ci-dessus en PHP 7 :

2

Les instructions Switch ne peuvent pas avoir plusieurs blocs par défaut

Il n'est plus possible de définir deux ou plusieurs blocs par défaut dans une instruction switch. Par exemple, l'instruction switch suivante déclenchera un E_COMPILE_ERROR :

<?php
switch (1) {
    default:
    break;
    default:
    break;
}
?>

$HTTP_RAW_POST_DATA a été supprimée

$HTTP_RAW_POST_DATA n'est plus disponible. Le flux php://input doit être utilisé à la place.

Les commentaires # dans le fichier INI ont été supprimés

La prise en charge des commentaires avec le préfix # dans les fichiers INI a été supprimée. ; (point-virgule) doit être utilisé à la place. Cette modification s'applique aux php.ini, ainsi qu'aux fichiers gérés par parse_ini_file() et parse_ini_string().

Extension JSON remplacée par JSOND

L'extension JSON a été remplacée par JSOND, provoquant trois incompatibilités BC mineures. Premièrement, un nombre ne doit pas se terminer par une virgule décimale (c.-à-d. 34. doit être modifié en 34.0 ou en 34). Deuxièmement, lors de l'utilisation de la notation scientifique, l'exposant e ne doit pas suivre immédiatement un point décimal (c.-à-d. 3.e3 doit être modifié soit en 3.0e3 ou en 3e3). Enfin, une chaîne vide n'est plus considérée comme du JSON valide.

Défaillance de la fonction interne sur le débordement

Auparavant, les fonctions internes devaient tronquer silencieusement les nombres produits à partir de contraintes de type float à entier lorsque le nombre était trop volumineux pour représenter un entier. Désormais, un E_WARNING sera émis et null sera renvoyé.

Correctifs aux valeurs de retour de gestionnaire de session personnalisé

Toutes les fonctions de prédicat implémentées par des gestionnaires de session personnalisés qui retournent false ou -1 seront des erreurs fatales. Si une valeur de ces fonctions autre qu'un booléen, -1 ou 0 est retournée, elle échouera et un E_WARNING sera émis.

Ordre de tri des éléments égaux

L'algorithme de tri interne a été amélioré, ce qui peut entraîner un ordre de tri différent des éléments, qui se comparent comme égaux auparavant.

Note:

Ne comptez pas sur l'ordre des éléments qui se comparent comme égaux; il pourrait changer à tout moment.

Instructions de coupure et de commutation mal placé

Les instructions break et continue en dehors d'une boucle ou d'une structure de contrôle switch sont maintenant détectées au moment de la compilation au lieu de l'exécution comme avant, et déclenchent un E_COMPILE_ERROR.

Mhash n'est plus une extension

L'extension mhash a été entièrement intégrée dans l'extension Hash. Par conséquent, il n'est plus possible de détecter le support mhash avec extension_loaded(); utiliser function_exists() à la place. En outre, mhash n'est plus rapporté par get_loaded_extensions() et les fonctionnalités connexes.

declare(ticks)

La directive declare(ticks) ne fuit plus dans des unités de compilation différentes.

User Contributed Notes

ilya dot chase at yandex dot ru 30-Apr-2019 09:22
Take note that in preg_replace() function, flag '\e' was deleted in PHP 7.0.0. This function will return null always with this flag. Doc: https://www.php.net/manual/ru/function.preg-replace.php
tkondrashov at gmail dot com 02-Oct-2018 04:34
split() was also removed in 7.0, so be sure to check your old code for it as well as the functions listed in this doc
Ray.Paseur sometimes uses Gmail 23-Mar-2017 03:51
In the section captioned "Changes to the handling of indirect variables, properties, and methods" there are parentheses used in the table directly beneath "PHP 7 interpretation."

The parentheses are intended to show the evaluation order, but they are not part of the syntax, and should not be used in the variable definition or reference.  This juxtaposition confused one of my colleagues; hopefully this note will save someone else some time.

Examples of the correct curly-brace syntax is further down the page, in the section captioned "global only accepts simple variables."
viktor dot csiky at nospam dot nospam dot eu 21-Jul-2016 11:16
It is stated:

"foreach by-value operates on a copy of the array

When used in the default by-value mode, foreach will now operate on a copy of the array being iterated rather than the array itself. This means that changes to the array made during iteration will not affect the values that are iterated."

Please note that this is not exactly true. New foreach operates on a copy of the array, by-value or by-reference. It seems that in the latter case, the array copy is simply moved over (to) the original array before it is presumably destroyed.

As a consequence of this, you may not "dereference" an array containing values - e.g. for use with ReflectionMethod::invokeArgs() or the good ole' call_user_func().
Consider the snippet below:

<?php
function deref(Array $inputArray)
{
        $retVal = [];

        foreach ($inputArray as &$inputValue)
        {
            $retVal[] = $inputValue;
        }

        return $retVal;
}
?>

As of PHP 7.0, this *will no longer work*. You will get the usual suspect:

PHP Warning:  Parameter n to whatever() expected to be a reference, value given in baz.php on line x

You need to convert it to explicitly reference the original array:
<?php
function deref(Array $inputArray)
{
        $retVal = [];

        foreach ($inputArray as $inputKey => $inputValue)
        {
            $retVal[$inputKey] = &$inputArray[$inputKey];
        }

        return $retVal;
}
?>

PLEASE NOTE that this might have the unforeseen consequence of your code not working anymore in php versions less than 5.3 (that is, 5.2 and below).
maba at mb-systemhaus dot net 12-May-2016 09:52
NOTE:
the new variable handling in PHP 7 also has side effects on the COM .NET extension. Numeric variants (in the Windows application space) now must be quoted when passed over from PHP. This is the case when the receiving application expects a variable of type variant.

Here is an example:

<?php
  $word = new COM('Word.Application');

  // now load a document, ...

  // the following works in PHP 5 but will throw an exception in PHP 7
  $word->ActiveDocument->PrintOut(false, false, 0, $outfile);

  // the following works in PHP 7 as well, please note the quotes around the '0'
  $word->ActiveDocument->PrintOut(false, false, '0', $outfile);
?>
Frank 11-Apr-2016 03:40
[Editor's Note: that change is listed in the "Changed functions" section.]

The substr function has also been changed in a backward incompatible way.

<?php
substr("test",4);  # false in PHP 5,  "" in PHP 7
?>

In fact, this is the only thing we had to change in a number of places for our code base to run on PHP 7. It's definitely an improvement though, as the old behavior tended to cause bugs in border cases.
mossy2100 19-Dec-2015 05:29
Although $x/0 is technically not infinity in a purely mathematical sense, when you understand why the IEEE float includes a value for infinity, and returns infinity in this case, it makes sense that PHP would agree with this.

The reason is that programmers don't usually divide by 0 on purpose. A value of 0 as a divisor usually occurs due to underflow, i.e. a value which is too small to be represented as a float. So, for example, if you have values like:
$x = 1;
$y = 1e-15 * 1e-15;
$z = $x/$y;
Because $y will have underflowed to 0, the division operation will throw the division by zero warning, and $z will be set to INF. In a better computer, however, $y would not have the value 0 (it would be 1e-30) and $z would not have the value INF (it would be 1e30).

In other words, 0 is not only representative of an actual 0, but also a very small number which float cannot represent correctly (underflow), and INF does not only represent infinity, but also a very big number which float cannot represent correctly (overflow). We do the best we can within the limitations of floating point values, which are really just good approximations of the actual numbers being represented.

What does bother me is that division by zero is handled in two different ways depending on the operator. I would have preferred the new DivisionByZeroError exception to be thrown in all cases, for consistency and to enforce good programming practices.
tuxedobob 11-Dec-2015 09:23
As a programmer, I don't care whether 3/0 is INF or NaN. Both answers are (probably) equally useless, and tell me that something somewhere else is screwed up.
opitz dot alexander at googlemail dot com 04-Dec-2015 04:14
About the division by zero, please see discussion to IEEEE 754
For example: http://stackoverflow.com/questions/14682005/why-does-division-by-zero-in-ieee754-standard-results-in-infinite-value
me at fquff dot io 04-Dec-2015 06:45
[Editor's note: fixed limit on user request]

As a mathematician, 3/0 == +INF IS JUST WRONG. You can't just assume 3/0 == lim_{x->0+} 3/x, which is +INF indeed, because division IS NOT A CONTINUOUS FUNCTION in x == 0.

Also, 3/0 == +INF ("positive" infinity) while -3/0 == -INF ("negative" infinity) requires the assumption that 0 is a positive number, which is just as illogical as it looks like.

The fact that a warning is emitted is good, but it should definitely equals to NaN. ±INF is just illogical (and arithmetically wrong).

Except for this "detail", looks an amazing update, can't wait to test it even further!

Cheers,
P.


Nouvelles fonctionnalités

Déclarations du type scalaire

Les déclarations de type scalaire viennent en deux modes : coercitive (par défaut) ou stricte. Les types de paramètres suivants peuvent être renforcés (soit coercitif soit strict) : les chaînes de caractères (string), les entiers (int), les décimaux (float) et les valeurs booléennes (bool). Ils complémentent les autres types introduits dans PHP 5 : les noms des classes, les interfaces, les tableaux (array) et les fonctions appelables (callable).

<?php
// Mode coercitive
function sommeEntiers(int ...$entiers)
{
    return array_sum($entiers);
}

var_dump(sommeEntiers(2, '3', 4.1));

L'exemple ci-dessus va afficher :

int(9)

Pour activer le mode strict, une seule directive declare doit être placée en haut du fichier. Ceci signifie que le mode strict de déclaration du type scalaire est configurée par fichier. La directive n'affecte pas seulement la déclaration des paramètres mais aussi le type de retour de la fonction (voir les déclarations du type de retour dans les fonctions PHP et celles issues des extensions).

Une documentation complète et des exemples de déclarations du type scalaire peuvent être trouvés dans la référence : Déclarations de type.

Déclarations du type de retour

PHP 7 ajoute un support pour les déclarations du type de retour. Similaires aux déclarations du type d'argument, les déclarations du type de retour spécifient le type de la valeur qui sera retournée par la fonction. Les mêmes types qui sont disponibles pour les déclarations du type de retour sont disponibles pour les déclarations du type d'argument.

<?php

function sommeTableaux(array ...$tableaux): array
{
    return array_map(function(array $tableaux): int {
        return array_sum($tableaux);
    }, $tableaux);
}

print_r(sommeTableaux([1,2,3], [4,5,6], [7,8,9]));

L'exemple ci-dessus va afficher :

Array
(
    [0] => 6
    [1] => 15
    [2] => 24
)

Une documentation complète et des exemples de déclarations du type de retour peuvent être trouvés dans la référence : Déclarations du type de retour.

L'opérateur Null coalescent

L'opérateur Null coalescent (??) a été ajouté comme un sucre syntaxique pour les cas de besoin le plus commun d'utiliser une troisième conjonction avec la fonction isset(). Il retourne le premier opérande s'il existe et n'a pas une valeur null; et retourne le second opérande sinon.

<?php
// Récupére la valeur de $_GET['utilisateur'] retourne 'aucun'
// s'il n'existe pas.
$identifiant = $_GET['utilisateur'] ?? 'aucun';
// Ceci est équivalent à :
$identifiant = isset($_GET['utilisateur']) ? $_GET['utilisateur'] : 'aucun';

// L'opérateur permet de faire du chaînage : Ceci va retourner la première
// valeur définie respectivement dans $_GET['utilisateur'], $_POST['utilisateur']
// et 'aucun'.
$identifiant = $_GET['utilisateur'] ?? $_POST['utilisateur'] ?? 'aucun';
?>

L'opérateur Spaceship

L'opérateur Spaceship est utilisé pour comparer deux expressions. Il retourne -1, 0 ou 1 quand $a est respectivement inférieur, égal ou supérieur à $b. Les comparaisons sont effectuées selon les règles de comparaison de types habituelles de PHP.

<?php
// Entiers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Nombres à virgule flottante
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Chaînes de caractères
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>

Les tableaux constants à l'aide de define()

Les tableaux (Array) constants peuvent maintenant être définis avec la fonction define(). Dans PHP 5.6, ils pouvaient être défini seulement avec const.

<?php
define('ANIMAUX', [
    'chien',
    'chat',
    'oiseau'
]);

echo ANIMAUX[1]; // affiche "chat"
?>

Les classes anonymes

La prise en charge des classes anonymes a été ajouté à travers l'instanciation new class. Celle-ci peut être utilisée au lieu de définir toute une classe pour des objets jetables :

<?php
interface Logger {
    public function log(string $msg);
}

class Application {
    private $logger;

    public function getLogger(): Logger {
         return $this->logger;
    }

    public function setLogger(Logger $logger) {
         $this->logger = $logger;
    }
}

$app = new Application;
$app->setLogger(new class implements Logger {
    public function log(string $msg) {
        echo $msg;
    }
});

var_dump($app->getLogger());
?>

L'exemple ci-dessus va afficher :

object(class@anonymous)#2 (0) {
}

La documentation complète peut être trouvée dans la référence des classes anonymes.

Syntaxe d’échappement du point de code Unicode

Cela prend un point de code Unicode sous forme hexadécimale, dans une chaîne entre doubles guillemets ou une syntaxe heredoc, pour le convertir en UTF-8. N’importe quel point de code valide est accepté, les zéros en début de chaîne étant facultatifs.

echo "\u{aa}";
echo "\u{0000aa}";
echo "\u{9999}";

L'exemple ci-dessus va afficher :

ª
ª (même affichage que la ligne précédente mais avec des zéros en début de chaîne)
?

Closure::call()

La méthode Closure::call() est devenue plus performante. Une façon plus courte de lier temporairement une fermeture à la portée d'un objet et l'invoquer.

<?php
class A {private $x = 1;}

// Code avant PHP 7
$getX = function() {return $this->x;};
$getXCB = $getX->bindTo(new A, 'A'); // fermeture intermédiaire
echo $getXCB();

// Code PHP 7+
$getX = function() {return $this->x;};
echo $getX->call(new A);

L'exemple ci-dessus va afficher :

1
1

unserialize() est filtrée

Cette fonctionnalité vise à garantir une meilleure sécurité lorsque la désérialisation d’objets est effectuée avec des données non fiables. Elle empêche les injections de code possible en permettant au développeur de whitelister les classes qui peuvent être désérialisées.

<?php

// Convertit tous les objets vers un objet __PHP_Incomplete_Class
$data = unserialize($foo, ["allowed_classes" => false]);

// Convertit tous les objets vers un objet __PHP_Incomplete_Class
// excepté ceux de MyClass et MyClass2
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]]);

// Comportement par défaut (le même que lorsqu'on omet le deuxième argument)
// qui accepte toutes les classes
$data = unserialize($foo, ["allowed_classes" => true]);

IntlChar

La nouvelle classe IntlChar cherche à exposer la fonctionnalité ICU en plus. La classe elle-même définit un nombre de méthodes statiques et de constantes qui peuvent être utilisées pour manipuler les caractères unicode.

<?php

printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));

L'exemple ci-dessus va afficher :

10ffff
COMMERCIAL AT
bool(true)

Pour utiliser cette classe, vous devez installer l'extension Intl.

Les attentes

Les attentes sont une amélioration rétro-compatible apportée à l'ancienne fonction assert(). Ils offrent des assertions à très faible coût dans le code de production et permettent de lever des exceptions personnalisées lorsque l’assertion échoue.

Alors que l'ancienne API continue à être maintenue pour des raisons de compatibilité, la fonction assert() est maintenant une construction de language, permettant au premier paramètre d'être une expression plutôt qu'un string à évaluer ou un bool à tester.

<?php
ini_set('assert.exception', 1);

class CustomError extends AssertionError {}

assert(false, new CustomError('Un message d\'erreur'));
?>

L'exemple ci-dessus va afficher :

Fatal error: Uncaught CustomError: Un message d\'erreur

On trouvera plus de détails sur cette fonctionnalité, y compris la façon de le configurer dans les environnements de développement et de production, dans la section attentes dans la référence de la fonction assert().

Grouper les déclarations use

Les classes, les fonctions and les constantes importées à partir du même namespace peuvent être groupées maintenant dans une seule instruction use.

<?php
// Code avant PHP 7
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// Code PHP 7+
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
?>

Expressions de retour générateur

Cette fonction se base sur la fonctionnalité de générateur introduite dans PHP 5.5. Il permet d'utiliser une instruction return dans un générateur pour retourner une expression finale (le retour par référence n'est pas autorisé). Cette valeur peut être extraite en utilisant la nouvelle méthode Generator::getReturn(), qui ne peut être utilisé que lorsque le générateur a fini de rendre les valeurs.

<?php

$gen = (function() {
    yield 1;
    yield 2;

    return 3;
})();

foreach ($gen as $val) {
    echo $val, PHP_EOL;
}

echo $gen->getReturn(), PHP_EOL;

L'exemple ci-dessus va afficher :

1
2
3

C'est très pratique d'être capable de renvoyer explicitement une valeur finale d'un générateur. Car cela permet à une valeur finale, susceptible d'être gérée spécialement par le code client exécutant le générateur, d'être retourné par le générateur (peut-être à partir d'une forme de calcul coroutine). C'est de loin plus simple que de forcer le code client à vérifier d'abord si la valeur finale a été rendue, puis de gérer spécifiquement la valeur quand c'est le cas.

Délégation de générateur

Les générateurs peuvent maintenant être délégués automatiquement à un autre générateur, un objet Traversable ou un array, en utilisant yield from, sans avoir recours à un boilerplate.

<?php
function gen()
{
    yield 1;
    yield 2;
    yield from gen2();
}

function gen2()
{
    yield 3;
    yield 4;
}

foreach (gen() as $val)
{
    echo $val, PHP_EOL;
}
?>

L'exemple ci-dessus va afficher :

1
2
3
4

La division d’entiers avec intdiv()

La nouvelle fonction intdiv() retourne le résultat de la division d'entiers effectuée sur ses opérandes.

<?php
var_dump(intdiv(10, 3));
?>

L'exemple ci-dessus va afficher :

int(3)

Les options de session

La fonction session_start() accepte maintenant un array d'options qui surcharge les directives de configuration de session manuellement configurées dans le fichier php.ini.

Ces options ont aussi étendu le support pour l'option session.lazy_write, qui est activé par défaut et pousse PHP à surcharger les fichiers de session seulement si les données de session ont été mis à jour, et l'option read_and_close, ne pouvant être passé à la fonction session_start() que pour indiquer si les données de session doivent être lu avant que la session soit terminée sans changements.

Par exemple, pour mettre session.cache_limiter à private et fermer immédiatement la session après l'avoir lu :

<?php
session_start([
    'cache_limiter' => 'private',
    'read_and_close' => true,
]);
?>

preg_replace_callback_array()

La nouvelle fonction preg_replace_callback_array() permet au code d'être écrit de façon plus propre en utilisant la fonction preg_replace_callback(). Avant PHP 7, les fonctions de rappel (callback) devaient être exécutées par expression régulière ce qui demande à la fonction de rappel d'être sali avec beaucoup de ramifications.

Maintenant, les fonctions de rappel peuvent être enregistrés pour chaque expression régulière en utilisant un tableau associatif, là où la clé est une expression régulière ayant la fonction de rappel comme valeur.

Les fonctions CSPRNG

Deux nouvelles fonctions ont été ajoutée pour générer cryptographiquement des entiers et des chaînes de caractères sécurisés de façon multi-plateforme : random_bytes() et random_int().

La fonction list() peut toujours déballer les objets qui implémentent ArrayAccess

Auparavant, la fonction list() ne pouvait pas opérer à 100% sur des objets qui implémentent ArrayAccess. Maintenant, ça a été corrigé.

Autres fonctionnalités

  • L'accès aux membres de la classe (attributs et méthodes) lors du clonage a été ajouté. Exemple, (clone $foo)->bar().

User Contributed Notes

Julian Sawicki 12-Sep-2020 02:30
Currying was possible in php 5.6. But in php 7.0 it is now possible to invoke a curryied function with a one liner.

<?php
// A curried function
function add($a) {
  return function($b) use ($a) {
    return $a + $b;
  };
}

// Invoking a curried function in PHP 7
$result = add(10)(15);
var_dump($result); // int 25

// Invoking a curried function in PHP 5.6
$add10 = add(10);
$result = $add10(15);
var_dump($result); // int 25
?>
Julian Sawicki 12-Sep-2020 01:52
In php 7.0 it's possible to curry functions in a way that's similar to JavaScript.

<?php

// A curried function
function add($a) {
  return function($b) use ($a) {
    return $a + $b;
  };
}

// Invoking curried function in PHP 7
$result = add(10)(15);

var_dump($result); // int 25

?>

Currying in this way is not possible in php 5.6.
nevercode at pm dot me 18-Aug-2020 09:03
It is worth nothing that the following code just works in PHP 7.4:

```
function nullOrDefault($x = null)
{
    $x ??= 3222;

    return $x;
}
```
Adrian Wiik 16-Jan-2020 01:52
A good rule of thumb for remembering what the spaceship operator expression returns is to replace the spaceship operator with a minus sign (-). If the result is negative, 0 or positive, the expression will return -1, 0 or 1 respectively.

Example:
<?php
echo 5 <=> 8; // 5 - 8 = -3, prints -1
echo 2 <=> 2; // 2 - 2 = 0, prints 0
echo 4 <=> 2; // 4 - 2 = 2, prints 1
ricasiano at gmail dot com 08-Jan-2020 12:53
Be careful on performing null coalesce on typecasted properties. Enclose them in parenthesis

<?php
$foo = new StdClass;
//(int) 23
$bar = $foo->bas ?? 23;
var_dump($bar);

$foo = new StdClass;
//(int) 23
$bar = (int) ($foo->bas ?? 23);
var_dump($bar);

$foo = new StdClass;
$bar = (int) $foo->bas ?? 23;
//Notice: Undefined property: stdClass::$bas
var_dump($bar);
TerryE 21-Jun-2017 09:13
$a = ''; // or 0 or false

$b = $a ?? 'a';
// $b is '' or 0 or false

$c = $a ?: 'a';
// $c is 'a'
PawelD 19-Jul-2016 09:23
<?php
class foo { static $bar = 'baz'; }
var_dump('foo'::$bar);
?>

if < php7.0

then we will receive a syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM)

but php7 returns string(3) "baz"

I think it's not documented anywhere


Les fonctionnalités dépréciées dans PHP 7.0.x

Constructeurs de PHP 4

Les constructeurs de style PHP 4 (méthodes ayant le même nom que la classe dans laquelle elles sont définies) sont obsolètes et seront supprimés à l’avenir. PHP 7 émet E_DEPRECATED si le constructeur de PHP 4 est le seul constructeur défini dans la classe. Les classes qui implémentent une méthode __construct() ne sont pas affectées par ce changement.

<?php
class foo {
    function foo() {
        echo 'Je suis le constructeur';
    }
}
?>

L'exemple ci-dessus va afficher :

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; foo has a deprecated constructor in example.php on line 3

Les appels statiques à des méthodes non statiques

Les appels statiques aux méthodes qui ne sont pas déclarées avec le mot-clé static sont dépréciés et peuvent être supprimés dans le futur.

<?php
class foo {
    function bar() {
        echo 'Je ne suis pas statique !';
    }
}

foo::bar();
?>

L'exemple ci-dessus va afficher :

Deprecated: Non-static method foo::bar() should not be called statically in - on line 8
Je ne suis pas statique !

L'option salt de la fonction password_hash()

L'option salt de la fonction password_hash() est dépréciée pour épargner aux développeurs de générer leurs propres salts (habituellement non sécurisés). La fonction elle-même génère cryptographiquement un salt sécurisé en l’absence d'un salt fourni par le développeur. Donc, la génération d'un salt sur mesure ne sera plus nécessaire.

L'option capture_session_meta du contexte SSL

L'option capture_session_meta du contexte SSL est dépréciée. Les métadonnées SSL sont maintenant disponibles à travers la fonction stream_get_meta_data().

Dépréciation dans LDAP

Les fonctions suivantes sont dépréciées :

  • ldap_sort()

User Contributed Notes

There are no user contributed notes for this page.


Fonctions modifiées

Cœur de PHP

  • debug_zval_dump() affiche désormais "int" au lieu de "long" et "float" au lieu de "double"
  • La fonction dirname() prend désormais un deuxième paramètre optionnel, depth, pour indiquer le nombre de niveaux plus haut (par rapport au dossier courant) pour atteindre le nom du dossier dans l'arborescence.
  • getrusage() est désormais supporté sur Windows.
  • Les fonctions mktime() et gmmktime() n'acceptent plus le paramètre is_dst.
  • la fonction preg_replace() ne supporte plus "\e" (PREG_REPLACE_EVAL). preg_replace_callback() devrait être utilisé à la place.
  • La fonction setlocale() n'accepte plus que le paramètre category soit passé comme chaîne de caractères. Les constantes LC_* doivent être utilisées à la place.
  • Les fonctions exec(), system() et passthru() ont désormais l'octet NULL de protection.
  • shmop_open() retourne désormais une ressource à la place d'un entier qui doit être passé aux fonctions shmop_size(), shmop_write(), shmop_read(), shmop_close() et shmop_delete().
  • substr() et iconv_substr() retourne désormais une chaîne de caractères vide, si la longueur de la chaîne est égale à $start.
  • xml_parser_free() n'est plus suffisant pour libérer la ressource de l'analyseur, s'il fait référence à un objet et que cet objet fait référence à cette ressource d'analyseur. Dans ce cas, il est nécessaire de libérer également le $parser.

User Contributed Notes

There are no user contributed notes for this page.


Nouvelles fonctions

Closure

  • Closure::call()

CSPRNG

  • random_bytes()
  • random_int()

Gestion des erreurs et des journaux

  • error_clear_last()

Générateur

  • Generator::getReturn()

GNU Multiple Precision

  • gmp_random_seed()

Math

  • intdiv()

PCRE

  • preg_replace_callback_array()

Options/Info PHP

  • gc_mem_caches()
  • get_resources()

POSIX

  • posix_setrlimit()

Reflection

  • ReflectionParameter::getType()
  • ReflectionParameter::hasType()
  • ReflectionFunctionAbstract::getReturnType()
  • ReflectionFunctionAbstract::hasReturnType()

Zip

  • ZipArchive::setCompressionIndex()
  • ZipArchive::setCompressionName()

Compression Zlib

  • inflate_add()
  • deflate_add()
  • inflate_init()
  • deflate_init()

User Contributed Notes

There are no user contributed notes for this page.


Nouvelles Classes et Interfaces

Intl

  • IntlChar

Reflection

  • ReflectionGenerator
  • ReflectionType

Gestion des sessions

  • SessionUpdateTimestampHandlerInterface

Hiérarchie des exceptions

  • Throwable
  • Error
  • TypeError
  • ParseError
  • AssertionError
  • ArithmeticError
  • DivisionByZeroError

User Contributed Notes

There are no user contributed notes for this page.


Nouvelles constantes globales

Constantes prédéfinies

  • PHP_INT_MIN

GD

  • IMG_WEBP (à partir de PHP 7.0.10)

JSON

  • JSON_ERROR_INVALID_PROPERTY_NAME
  • JSON_ERROR_UTF16

LibXML

  • LIBXML_BIGLINES

PCRE

  • PREG_JIT_STACKLIMIT_ERROR

POSIX

  • POSIX_RLIMIT_AS
  • POSIX_RLIMIT_CORE
  • POSIX_RLIMIT_CPU
  • POSIX_RLIMIT_DATA
  • POSIX_RLIMIT_FSIZE
  • POSIX_RLIMIT_LOCKS
  • POSIX_RLIMIT_MEMLOCK
  • POSIX_RLIMIT_MSGQUEUE
  • POSIX_RLIMIT_NICE
  • POSIX_RLIMIT_NOFILE
  • POSIX_RLIMIT_NPROC
  • POSIX_RLIMIT_RSS
  • POSIX_RLIMIT_RTPRIO
  • POSIX_RLIMIT_RTTIME
  • POSIX_RLIMIT_SIGPENDING
  • POSIX_RLIMIT_STACK
  • POSIX_RLIMIT_INFINITY

Zlib

  • ZLIB_ENCODING_RAW
  • ZLIB_ENCODING_DEFLATE
  • ZLIB_ENCODING_GZIP
  • ZLIB_FILTERED
  • ZLIB_HUFFMAN_ONLY
  • ZLIB_FIXED
  • ZLIB_RLE
  • ZLIB_DEFAULT_STRATEGY
  • ZLIB_BLOCK
  • ZLIB_FINISH
  • ZLIB_FULL_FLUSH
  • ZLIB_NO_FLUSH
  • ZLIB_PARTIAL_FLUSH
  • ZLIB_SYNC_FLUSH

User Contributed Notes

There are no user contributed notes for this page.


Modifications des modules SAPI

FPM

Les ports d'écoute non qualifiés écoutent maintenant sur IPv4 et IPv6

En PHP 5, une directive d'écoute avec seulement un numéro de port écouterait toutes les interfaces, mais seulement sur IPv4. PHP 7 accepte désormais les demandes faites via IPv4 et IPv6.

Cela n'affecte pas les directives qui incluent des adresses IP spécifiques; celle-ci continueront à écouter seulement sur cette adresse et protocole.

User Contributed Notes

There are no user contributed notes for this page.


Extensions et SAPI supprimés

Extensions supprimées

  • ereg
  • mssql
  • mysql
  • sybase_ct

SAPI supprimés

  • aolserver
  • apache
  • apache_hooks
  • apache2filter
  • caudium
  • continuity
  • isapi
  • milter
  • nsapi
  • phttpd
  • pi3web
  • roxen
  • thttpd
  • tux
  • webjames

User Contributed Notes

There are no user contributed notes for this page.


Autres changements

Assouplissement des restrictions des mots réservés

Globalement, l'utilisation des mots réservés en tant que nom de propriété, constante ou méthode dans des classes, des interfaces ou des traits sont désormais autorisés. Ceci réduit la surface des casses de rétrocompatibilité quand des nouveaux mots-clés sont introduits et évite les restrictions de nommage sur les APIs.

Ceci est particulièrement utile lorsque vous créez des DSLs internes avec des interfaces "fluent" :

<?php
// 'new', 'private' et 'for' étaient inutilisable auparavant
Project::new('Project Name')->private()->for('purpose here')->with('username here');
?>

La seule limitation est que le mot-clé class ne peut toujours pas être utilisé comme nom de constante, sinon elle serait en conflit avec la syntaxe de résolution du nom de la classe (ClassName::class).

Enlèvement de l'avertissement date.timezone

Auparavant, un avertissement était émit si le paramètre INI date.timezone n'avait pas été définie avant d'utiliser les fonctions de date/temps. Maintenant, cet avertissement a été supprimée (avec date.timezone qui continue d'être UTC par défaut).

User Contributed Notes

There are no user contributed notes for this page.


Migration de PHP 5.5.x à PHP 5.6.x

Sommaire

  • Modifications entrainant une incompatibilité ascendante
  • Nouvelles fonctionnalités
  • Fonctionnalités devenues obsolètes en PHP 5.6.x
  • Fonctions modifiées
  • Nouvelles fonctions
  • Changement pour OpenSSL dans PHP 5.6.x
  • Autres modifications dans les extensions
  • Nouvelles constantes globales

La majorité des améliorations de PHP 5.6.x n'ont pas d'impact sur le code existant. Il y a néanmoins quelques incompatibilités et nouvelles fonctionnalités qui doivent être prise en considération, et le code doit être testé avant de changer de version sur les environnements de production.

User Contributed Notes

There are no user contributed notes for this page.


Modifications entrainant une incompatibilité ascendante

Bien que la plupart du code PHP 5 existant devrait fonctionner sans aucune modification, vous devez prendre en considération quelques incompatibilités ascendantes :

Les clés des tableaux ne sont pas écrasées lors de la définition d'un tableau comme une propriété d'une classe via un tableau littéral

Précédemment, les tableaux déclarés comme des propriétés de classe qui mixaient des clés explicites et implicites pouvaient voir leurs éléments écrasés sans avertissement si une clé explicite était identique à une clé séquentielle implicite. Par exemple :

<?php
class C {
    const ONE = 1;
    public $array = [
        self::ONE => 'foo',
        'bar',
        'quux',
    ];
}

var_dump((new C)->array);
?>

Résultat de l'exemple ci-dessus en PHP 5.5 :

array(2) {
  [0]=>
  string(3) "bar"
  [1]=>
  string(4) "quux"
}

Résultat de l'exemple ci-dessus en PHP 5.6 :

array(3) {
  [1]=>
  string(3) "foo"
  [2]=>
  string(3) "bar"
  [3]=>
  string(4) "quux"
}

Rigueur de json_decode()

json_decode() rejette maintenant les variantes non écrites en minuscule des littéraux JSON true, false et null, en accord avec la spécification JSON, et json_last_error() est renseignée en conséquence. Précédemment, les valeurs passées à json_decode() contenant l'une de ces valeurs en majuscules ou dans une casse mixte étaient acceptées.

Ce changement va affecter uniquement les cas ou du JSON invalide serait passé à json_decode() : du JSON valide ne sera pas affecté et sera analysé normalement.

Les gestionnaires de flux vérifient maintenant par défaut les certificats de pair et les noms d'hôtes lors de l'utilisation de SSL/TLS

Tous les flux clients cryptés activent désormais la vérification par paire par défaut. Par défaut, ceci va utiliser le CA OpenSSL par défaut pour vérifier la paire de certificat. Dans la plupart des cas, aucune modification n'a besoin d'être faite pour communiquer avec des serveurs et des certificats SSL valides, sachant que les distributeurs configurent généralement OpenSSL pour utiliser les CA connus.

Le CA par défaut peut être écrasé sur une base globale en utilisant les options de configuration openssl.cafile ou openssl.capath, ou via une requête basique en utilisant les options de contexte cafile ou capath.

Bien que ce ne soit pas conseillé en général, il est possible de désactiver la vérification de certificats par paire pour une requête en définissant l'option de contexte verify_peer à false, et pour désactiver la validation du nom des paires, en configurant l'option de contexte verify_peer_name à false.

Les ressources GMP sont maintenant des objets

Les ressources GMP sont maintenant des objets. L'API de l'extension GMP n'a pas changé et le code existant devrait continuer à fonctionner sans modification à moins qu'une vérification explicite ne soit faite en utilisant is_resource() ou équivalent.

Les fonctions Mcrypt requièrent maintenant des clés ou IV valides

mcrypt_encrypt(), mcrypt_decrypt(), mcrypt_cbc(), mcrypt_cfb(), mcrypt_ecb(), mcrypt_generic() et mcrypt_ofb() n'acceptent plus de clés ou de vecteurs d'initialisation (IVs) de tailles incorrectes, et les modes de ciphers par blocs qui requièrent des IVs échoueront désormais si un IV n'est pas fourni.

Téléchargement de fichiers avec cURL

Le téléchargement de fichier en utilisant la syntaxe @file nécessite maintenant que la directive CURLOPT_SAFE_UPLOAD soit définie à false. CURLFile doit plutôt être utilisé à la place.

User Contributed Notes

Roger 22-Jun-2017 10:15
Another breaking change involves opening the special "php://input" stream for decompression. In PHP 5.5, the following code would allow PHP to decode a gzip'd request input stream:

<?php
// Open the input stream for requests with Content-Encoding: gzip.
$input = gzopen('php://input','r');
// This has the same effect as fopen('compress.zlib://php://input','r').

// Get the decompressed request body.
var_dump(stream_get_contents($input));
?>

However in PHP 5.6 this does not work. Instead PHP gives the following warning: gzopen(): cannot represent a stream of type Input as a File Descriptor.

It is unclear whether this is a bug or intentional, backward-incompatible change.


Nouvelles fonctionnalités

Expressions de constante

Il est désormais possible de fournir une expression scalaire impliquant des numériques et des chaîne de caractères littérales et/ou des constantes dans les contextes où PHP attendait précédemment une valeur statique, comme une constante ou une déclaration de propriétés et les arguments par défaut de fonction.

<?php
const UN = 1;
const DEUX = UN * 2;

class C {
    const TROIS = DEUX + 1;
    const UN_TIERS = UN / self::TROIS;
    const RESULTAT = 'La valeur de TROIS est '.self::TROIS;

    public function f($a = UN + self::TROIS) {
        return $a;
    }
}

echo (new C)->f()."\n";
echo C::RESULTAT;
?>

L'exemple ci-dessus va afficher :

4
La valeur de TROIS est 3

Il est aussi possible de définir une constante tableau en utilisant le mot clé const :

<?php
const ARR = ['a', 'b'];

echo ARR[0];
?>

L'exemple ci-dessus va afficher :

a

Fonctions variables via l'opérateur de décomposition ...

Les fonctions variables peuvent maintenant être implémentées en utilisant l'opérateur de décomposition ..., au lieu d'utiliser la fonction func_get_args().

<?php
function f($req, $opt = null, ...$params) {
    // $params est un tableau contenant les arguments restants.
    printf('$req: %d; $opt: %d; Nombre d\'arguments : %d'."\n",
           $req, $opt, count($params));
}

f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
?>

L'exemple ci-dessus va afficher :

$req: 1; $opt: 0; Nombre d'arguments : 0
$req: 1; $opt: 2; Nombre d'arguments : 0
$req: 1; $opt: 2; Nombre d'arguments : 1
$req: 1; $opt: 2; Nombre d'arguments : 2
$req: 1; $opt: 2; Nombre d'arguments : 3

Décompression des arguments via l'opérateur de décomposition ...

Les Tableaux et les objets Traversable peuvent être décompressés dans la liste d'arguments lors d'appel à une fonction en utilisant l'opérateur de décomposition .... Cette méthode est connue sous le nom d'opérateur astérisque dans d'autres langages comme Ruby par exemple.

<?php
function add($a, $b, $c) {
    return $a + $b + $c;
}

$operators = [2, 3];
echo add(1, ...$operators);
?>

L'exemple ci-dessus va afficher :

6

L'exponentiation via l'opérateur **

Un opérateur ** associatif à droite a été ajouté pour supporter l'exponentiation, en conjonction de l'opérateur d'assignement **=.

<?php
printf("2 ** 3 ==      %d\n", 2 ** 3);
printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);

$a = 2;
$a **= 3;
printf("a ==           %d\n", $a);
?>

L'exemple ci-dessus va afficher :

2 ** 3 ==      8
2 ** 3 ** 2 == 512
a ==           8

use function et use const

L'opérateur use a été étendu pour supporter l'importation de fonctions et de constantes en plus des classes. Ceci est réalisé en utilisant les constructions use function et use const, respectivement.

<?php
namespace Name\Space {
    const FOO = 42;
    function f() { echo __FUNCTION__."\n"; }
}

namespace {
    use const Name\Space\FOO;
    use function Name\Space\f;

    echo FOO."\n";
    f();
}
?>

L'exemple ci-dessus va afficher :

42
Name\Space\f

phpdbg

PHP inclut désormais un débogueur interactif appelé phpdbg, implémenté comme module SAPI. Pour plus d'informations, visitez la documentation phpdbg.

Encodage de caractères par défaut

default_charset est désormais utilisé comme jeu de caractères par défaut pour les fonctions htmlentities(), html_entity_decode() et htmlspecialchars(). Notez que si les configurations d'encodage (maintenant obsolète) d'iconv et mbstring sont définies, elles prendront le dessus par rapport à la configuration de default_charset pour les fonctions iconv et mbstring, respectivement.

La valeur par défaut pour cette configuration est UTF-8.

php://input est ré-utilisable

php://input peut maintenant être ré-ouvert et lu autant de fois que nécessaire. Ce nouveau mécanisme a permis également de réduire significativement la quantité de mémoire requise lors des opérations POST.

Téléchargement de gros fichiers

Les fichiers de plus de 2 GigaOctets sont maintenant acceptés.

GMP supporte la surcharge d'opérateur

Les objets GMP supportent maintenant la surcharge des opérateurs et le transtypage en types scalaires. Ceci permet un code plus expressif en utilisant GMP :

<?php
$a = gmp_init(42);
$b = gmp_init(17);

if (version_compare(PHP_VERSION, '5.6', '<')) {
    echo gmp_intval(gmp_add($a, $b)), PHP_EOL;
    echo gmp_intval(gmp_add($a, 17)), PHP_EOL;
    echo gmp_intval(gmp_add(42, $b)), PHP_EOL;
} else {
    echo $a + $b, PHP_EOL;
    echo $a + 17, PHP_EOL;
    echo 42 + $b, PHP_EOL;
}
?>

L'exemple ci-dessus va afficher :

59
59
59

hash_equals() pour la comparaison des chaîne de caractères permettant d'éviter les attaques de type timing

La fonction hash_equals() a été ajoutée pour comparer deux chaîne de caractères en temps constant. Ceci devrait être utilisé pour éviter les attaques de type timing, par exemple, lors d'un test du hash d'un mot de passe créé via la fonction crypt() (en supposant que vous ne pouvez pas utiliser les fonctions password_hash() et password_verify(), qui ne sont pas sensibles aux attaques de type timing).

<?php
$expected  = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$correct   = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$incorrect = crypt('1234',  '$2a$07$usesomesillystringforsalt$');

var_dump(hash_equals($expected, $correct));
var_dump(hash_equals($expected, $incorrect));
?>

L'exemple ci-dessus va afficher :

bool(true)
bool(false)

__debugInfo()

La méthode magique __debugInfo() a été ajoutée pour permettre aux objets de changer les propriétés et les valeurs qui sont affichées lorsque l'objet est affiché en utilisant la fonction var_dump().

<?php
class C {
    private $prop;

    public function __construct($val) {
        $this->prop = $val;
    }

    public function __debugInfo() {
        return [
            'propSquared' => $this->prop ** 2,
        ];
    }
}

var_dump(new C(42));
?>

L'exemple ci-dessus va afficher :

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}

Algorithme de hachage gost-crypto

L'algorithme de hachage gost-crypto a été ajouté. Il implémente la fonction de hachage GOST, en utilisant les tables CryptoPro S-box tel que spécifié par la » RFC 4357, section 11.2.

Améliorations SSL/TLS

Un large éventail d'améliorations ont été réalisé sur le support SSL/TLS en PHP 5.6. Ceci inclut l'activation de la vérification par paire par défaut, supportant la correspondance des certificats d'empreintes, permettant de limiter les attaques à la renégociation TLS, ainsi que plusieurs nouvelles options de contexte SSL permettant un contrôle plus fin du protocole et des vérifications des configurations lors de l'utilisation des flux chiffrés.

Ces modifications sont décrites en détail dans la section sur les changements OpenSSL en PHP 5.6.x du guide de migration.

Support async pgsql

L'extension pgsql supporte désormais les connexions et requêtes asynchrones, en activant un comportement non-bloquant lors de l'interaction avec une base de données PostgreSQL. Les connexions asynchrones peuvent être établies via la constante PGSQL_CONNECT_ASYNC, et les nouvelles fonctions pg_connect_poll(), pg_socket(), pg_consume_input() et pg_flush() peuvent être utilisées pour gérer les connexions et les requêtes asynchrones.

User Contributed Notes

stocki dot r at gmail dot com 25-Feb-2021 02:24
You can create a self-documented, named argument workaround in PHP 5.6-7 with ... operator:

<?php
htmlspecialchars($string, ...array_values([
    'flags'         => ENT_COMPAT | ENT_HTML401,
    'encoding'      => 'UTF-8',
    'double_encode' => false,
]))
?>
BernieV 04-Dec-2019 12:31
The splat operator (...) is documented everywhere with no space after it.
But it seems to work just as well with whitespace between ... and what follows.
My IDE line-wrapped, introducing white-space, immediately after the ...
ciachn 06-Sep-2014 07:20
Having 2 ** 3 ** 2 = 512 is actually that is the exact correct behavior for a right-associative operator just as specified in the "**" documentation.
Anonymous 15-Jul-2014 12:58
Remember, that

    ($a ** $b) ** $c === $a ** ($b * $c)

Thats why exponent operator** is RIGHT associative.
ashnazg at php dot net 21-Apr-2014 03:07
Note the order of operations in that exponentiation operator, as it was opposite of what my first expectation was:

<?php
// what I had expected,
// evaluating left to right,
// since no parens were used to guide the order of operations
2 ** 3 ** 2 == 64; // (2 ** 3) ** 2 = 8 ** 2 = 64

// the given example,
// which appears to evaluate right to left
2 ** 3 ** 2 == 512; // 2 ** (3 ** 2) = 2 ** 9 = 512
?>
gmblar+php at gmail dot com 31-Jan-2014 02:36
<?php

function array_zip(...$arrays) {
    return array_merge(...array_map(NULL, ...$arrays));
}

$a = array(1, 4, 7);
$b = array(2, 5, 8);
$c = array(3, 6, 9);

var_dump(implode(', ', array_zip($a, $b, $c)));

// Output
string(25) "1, 2, 3, 4, 5, 6, 7, 8, 9"
tr0y 25-Jan-2014 07:02
It is also possible ( in 5.6.0alpha ) to typehint the ...-operator

function foo (stdclass ... $inbound) {
   var_dump($inbound);
}

// ok:
foo( (object)['foo' => 'bar'], (object)['bar' => 'foo'] );

// fails:
foo( 1, 2, 3, 4 );


Fonctionnalités devenues obsolètes en PHP 5.6.x

Appel depuis un contexte incompatible

L'appel des méthodes depuis un contexte incompatible est désormais obsolète et va générer une erreur E_DEPRECATED au lieu d'une E_STRICT. Le support de ces appels sera retiré dans une version future de PHP.

Un exemple d'un tel appel est :

<?php
class A {
    function f() { echo get_class($this); }
}

class B {
    function f() { A::f(); }
}

(new B)->f();
?>

L'exemple ci-dessus va afficher :

Deprecated: Non-static method A::f() should not be called statically, assuming $this from incompatible context in - on line 7
B

$HTTP_RAW_POST_DATA et always_populate_raw_post_data

always_populate_raw_post_data génère désormais une erreur E_DEPRECATED quand la variable $HTTP_RAW_POST_DATA est remplie. Le nouveau code devrait utiliser php://input à la place de $HTTP_RAW_POST_DATA, qui sera supprimé dans une version future de PHP. Vous pouvez basculer vers le nouveau comportement (dans lequel $HTTP_RAW_POST_DATA n'est jamais défini, et donc aucune alerte de niveau E_DEPRECATED ne sera générée) en définissant always_populate_raw_post_data à -1.

Configuration d'encodage iconv et mbstring

Les options de configuration iconv et mbstring relatives à l'encodage sont devenues obsolètes en faveur de l'option default_charset. Les options obsolètes sont :

  • iconv.input_encoding
  • iconv.output_encoding
  • iconv.internal_encoding
  • mbstring.http_input
  • mbstring.http_output
  • mbstring.internal_encoding

User Contributed Notes

There are no user contributed notes for this page.


Fonctions modifiées

Cœur de PHP

  • crypt() lève maintenant une erreur E_NOTICE si le paramètre salt est omit.
  • substr_compare() accepte désormais 0 pour son paramètre length.
  • unserialize() va désormais échouer si les données linéarisées passées ont été manipulées pour instancier un objet sans appeler son constructeur.

cURL

  • L'envoi de fichier en utilisant la syntaxe @file est maintenant uniquement supporté si l'option CURLOPT_SAFE_UPLOAD est définie à false. CURLFile devrait être utilisé à la place.

Mcrypt

  • Le paramètre source de mcrypt_create_iv() a maintenant pour valeur de défaut MCRYPT_DEV_URANDOM à la place de MCRYPT_DEV_RANDOM.

OpenSSL

  • stream_socket_enable_crypto() permet désormais au paramètre crypto_type d'être optionnel si le contexte SSL de flux inclut la nouvelle option crypto_type.

PostgreSQL

  • pg_insert(), pg_select(), pg_update() et pg_delete() ne sont plus à l'état expérimental.
  • pg_send_execute(),
pg_send_prepare(), pg_send_query()
et pg_send_query_params()  ne bloqueront plus jusqu'à
la fin de l'écriture de la requête si la connexion vers la base est
établie en mode non bloquant.

Reflection

  • ReflectionClass::newInstanceWithoutConstructor() autorise désormais les classes internes non-finales à être instanciées.

XMLReader

  • XMLReader::getAttributeNs() et XMLReader::getAttributeNo() retournent maintenant null si l'attribut ne peut être trouvé, comme XMLReader::getAttribute().

User Contributed Notes

There are no user contributed notes for this page.


Nouvelles fonctions

Date et Temps

  • DateTimeImmutable::createFromMutable()

GMP

  • gmp_root()
  • gmp_rootrem()

Hash

  • hash_equals()

LDAP

  • ldap_escape()
  • ldap_modify_batch()

MySQLi

  • mysqli_get_links_stats()

OCI8

  • oci_get_implicit_resultset()

OpenSSL

  • openssl_get_cert_locations()
  • openssl_x509_fingerprint()
  • openssl_spki_new()
  • openssl_spki_verify()
  • openssl_spki_export_challenge()
  • openssl_spki_export()

PostgreSQL

  • pg_connect_poll()
  • pg_consume_input()
  • pg_flush()
  • pg_socket()

PDO_PGSQL

  • PDO::pgsqlGetNotify()
  • PDO::pgsqlGetPid()

Session

  • session_abort()
  • session_reset()

Zip

  • ZipArchive::setPassword()

User Contributed Notes

There are no user contributed notes for this page.


Changement pour OpenSSL dans PHP 5.6.x

Les wrappers de flux vérifient désormais les certificats d'homologue et les noms d'hôte par défaut lors de l'utilisation de SSL/TLS

Tous les flux clients cryptés activent désormais la vérification par paire par défaut. Par défaut, ceci va utiliser le CA OpenSSL par défaut pour vérifier la paire de certificat. Dans la plupart des cas, aucune modification n'a besoin d'être faite pour communiquer avec des serveurs et des certificats SSL valides, sachant que les distributeurs configurent généralement OpenSSL pour utiliser les CA connus.

Le CA par défaut peut être écrasé sur une base globale en utilisant les options de configuration openssl.cafile ou openssl.capath, ou via une requête basique en utilisant les options de contexte cafile ou capath.

Bien que ce ne soit pas conseillé en général, il est possible de désactiver la vérification de certificats par paire pour une requête en définissant l'option de contexte verify_peer à false, et pour désactiver la validation du nom des paires, en configurant l'option de contexte verify_peer_name à false.

Empreintes digitales de certificat

Le support a été ajouté pour extraire et vérifier les empreintes digitales des certificats. openssl_x509_fingerprint() a été ajouté pour extraire une empreinte digitale d'un certificat X.509 et deux options de contexte de flux SSL ont été ajoutées: capture_peer_cert pour capturer le certificat X.509 de l'homologue et peer_fingerprint pour certifier que le certificat de l'homologue doit correspondre à l'empreinte digitale donnée.

Chiffrements par défaut mis à jour

Les chiffrements par défaut utilisés par PHP ont été mis à jour vers une liste plus sécurisée basée sur les » recommandations de chiffrement de Mozilla, avec deux exclusions supplémentaires: chiffrements Diffie-Hellman anonymes et RC4.

Cette liste est accessible via la nouvelle constante OPENSSL_DEFAULT_STREAM_CIPHERS et peut être remplacée (comme dans les versions précédentes de PHP) en définissant l'option de contexte chiffrements.

Compression désactivée par défaut

La compression SSL/TLS a été désactivée par défaut pour atténuer l'attaque CRIME. PHP 5.4.13 a ajouté une option de contexte disable_compression pour permettre à la compression d'être désactivée: elle est maintenant définie à true (c'est-à-dire que la compression est désactivée) par défaut.

Autoriser les serveurs à préférer leur ordre de chiffrement

L'option de contexte SSL honor_cipher_order a été ajoutée pour permettre aux serveurs de flux chiffrés d'atténuer les vulnérabilités de BEAST en préférant les chiffrements du serveur au client.

Accéder au protocole négocié et au chiffrement

Le protocole et le chiffrement qui ont été négociés pour un flux chiffré peuvent désormais être accédé via stream_get_meta_data() ou stream_context_get_options() lorsque l'option de contexte SSL capture_session_meta est définie à true.

<?php
$ctx = stream_context_create(['ssl' => [
    'capture_session_meta' => TRUE
]]);

$html = file_get_contents('https://google.com/', FALSE, $ctx);
$meta = stream_context_get_options($ctx)['ssl']['session_meta'];
var_dump($meta);
?>

L'exemple ci-dessus va afficher :

array(4) {
  ["protocol"]=>
  string(5) "TLSv1"
  ["cipher_name"]=>
  string(20) "ECDHE-RSA-AES128-SHA"
  ["cipher_bits"]=>
  int(128)
  ["cipher_version"]=>
  string(11) "TLSv1/SSLv3"
}

De nouvelles options pour la confidentialité persistante sur les serveurs de flux chiffrés

Les flux de clients chiffrés prennent déjà en charge la confidentialité persistante, car il est généralement contrôlé par le serveur. Les flux de serveurs chiffrés en PHP à l'aide de certificats capables d'une confidentialité persistante n'ont pas besoin de prendre d'autres mesures pour activer PFS; Toutefois, un certain nombre de nouvelles options de contexte SSL ont été ajoutées pour permettre un plus grand contrôle sur PFS et traiter les problèmes de compatibilité qui peuvent survenir.

ecdh_curve

Cette option permet de sélectionner une courbe spécifique à utiliser avec les chiffrements ECDH. S'il n'est pas spécifié, prime256v1 sera utilisé.

dh_param

Chemin d'accès à un fichier contenant des paramètres pour l'échange de clés Diffie-Hellman, tel que celui créé par la commande suivante :

openssl dhparam -out /path/to/my/certs/dh-2048.pem 2048
single_dh_use

Si définie à true, une nouvelle paire de clés sera créée lors de l'utilisation des paramètres Diffie-Hellman, améliorant ainsi la confidentialité persistante.

single_ecdh_use

Si définie à true, une nouvelle paire de clés sera toujours générée lors de la négociation des suites de chiffrement ECDH. Cela améliore la confidentialité persistante.

Sélection de la version SSL/TLS

Il est désormais possible de sélectionner des versions spécifiques de SSL et TLS via l'option de contexte SSL crypto_method ou en spécifiant un transport spécifique lors de la création d'un wrapper de flux (par exemple, en appelant stream_socket_client() ou stream_socket_ serveur()).

L'option de contexte SSL crypto_method accepte un masque de bits énumérant les protocoles qui sont autorisés, comme le fait le crypto_type de stream_socket_enable_crypto().

Versions de protocole sélectionnées et options correspondantes
Pprotocole(s) | Drapeau client | Drapeau serveur | Transport
Toute version TLS ou SSL | STREAM_CRYPTO_METHOD_ANY_CLIENT | STREAM_CRYPTO_METHOD_ANY_SERVER | ssl://
Toute version TLS | STREAM_CRYPTO_METHOD_TLS_CLIENT | STREAM_CRYPTO_METHOD_TLS_SERVER | tls://
TLS 1.0 | STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_0_SERVER | tlsv1.0://
TLS 1.1 | STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_1_SERVER | tlsv1.1://
TLS 1.2 | STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT | STREAM_CRYPTO_METHOD_TLSv1_2_SERVER | tlsv1.2://
SSL 3 | STREAM_CRYPTO_METHOD_SSLv3_CLIENT | STREAM_CRYPTO_METHOD_SSLv3_SERVER | sslv3://
<?php

// Nécessitant TLS 1.0 ou mieux lors de l'utilisation de file_get_contents():
$ctx = stream_context_create([
    'ssl' => [
        'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT,
    ],
]);
$html = file_get_contents('https://google.com/', false, $ctx);

// Nécessitant TLS 1.1 ou 1.2:
$ctx = stream_context_create([
    'ssl' => [
        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT |
                           STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
    ],
]);
$html = file_get_contents('https://google.com/', false, $ctx);

// Connexion à l'aide du transport de socket tlsv1.2://.
$sock = stream_socket_client('tlsv1.2://google.com:443/');

?>

Ajout de openssl_get_cert_locations()

La fonction openssl_get_cert_locations() a été ajoutée : elle renvoie les emplacements par défaut que PHP recherchera lors de la recherche de paquets CA.

<?php
var_dump(openssl_get_cert_locations());
?>

L'exemple ci-dessus va afficher :

array(8) {
  ["default_cert_file"]=>
  string(21) "/etc/pki/tls/cert.pem"
  ["default_cert_file_env"]=>
  string(13) "SSL_CERT_FILE"
  ["default_cert_dir"]=>
  string(18) "/etc/pki/tls/certs"
  ["default_cert_dir_env"]=>
  string(12) "SSL_CERT_DIR"
  ["default_private_dir"]=>
  string(20) "/etc/pki/tls/private"
  ["default_default_cert_area"]=>
  string(12) "/etc/pki/tls"
  ["ini_cafile"]=>
  string(0) ""
  ["ini_capath"]=>
  string(0) ""
}

Support de SPKI

Le support a été ajouté pour générer, extraire et vérifier les clés et les défis publics signés (SPKAC). openssl_spki_new(), openssl_spki_verify(), openssl_spki_export_challenge() et openssl_spki_export() ont été ajoutées pour créer, vérifier la clé publique PEM d'exportation et le défi associé de SPKAC générés à partir d'un élément HTML5 KeyGen.

openssl_spki_new

Génère un nouveau SPKAC en utilisant la clé privée, chaîne de caractères de défi et l'algorithme de hachage.

<?php
$pkey = openssl_pkey_new();
openssl_pkey_export($pkey, 'secret passphrase');

$spkac = openssl_spki_new($pkey, 'challenge string');
?>

L'exemple ci-dessus va afficher :

SPKAC=MIIBXjCByDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA3L0IfUijj7+A8CPC8EmhcdNoe5fUAog7OrBdhn7EkxFButUp40P7+LiYiygYG1TmoI/a5EgsLU3s9twEz3hmgY9mYIqb/rb+SF8qlD/K6KVyUORC7Wlz1Df4L8O3DuRGzx6/+3jIW6cPBpfgH1sVuYS1vDBsP/gMMIxwTsKJ4P0CAwEAARYkYjViMzYxMTktNjY5YS00ZDljLWEyYzctMGZjNGFhMjVlMmE2MA0GCSqGSIb3DQEBAwUAA4GBAF7hu0ifzmjonhAak2FhhBRsKFDzXdKIkrWxVNe8e0bZzMrWOxFM/rqBgeH3/gtOUDRS5Fnzyq425UsTYbjfiKzxGeCYCQJb1KJ2V5Ij/mIJHZr53WYEXHQTNMGR8RPm7IxwVXVSHIgAfXsXZ9IXNbFbcaLRiSTr9/N4U+MXUWL7
openssl_spki_verify

Vérifie le SPKAC fourni.

<?php
$pkey = openssl_pkey_new();
openssl_pkey_export($pkey, 'secret passphrase');

$spkac = openssl_spki_new($pkey, 'challenge string');
var_dump(openssl_spki_verify($spkac));
?>
openssl_spki_export_challenge

Exportations du défi associé au SPKAC fourni.

<?php
$pkey = openssl_pkey_new();
openssl_pkey_export($pkey, 'secret passphrase');

$spkac = openssl_spki_new($pkey, 'challenge string');
$challenge = openssl_spki_export_challenge($spkac):
echo $challenge;
?>

L'exemple ci-dessus va afficher :

challenge string
openssl_spki_export

Exporte la clé publique RSA au format PEM du SPAKC.

<?php
$pkey = openssl_pkey_new();
openssl_pkey_export($pkey, 'secret passphrase');

$spkac = openssl_spki_new($pkey, 'challenge string');
echo openssl_spki_export($spkac);
?>

L'exemple ci-dessus va afficher :

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcvQh9SKOPv4DwI8LwSaFx02h7
l9QCiDs6sF2GfsSTEUG61SnjQ/v4uJiLKBgbVOagj9rkSCwtTez23ATPeGaBj2Zg
ipv+tv5IXyqUP8ropXJQ5ELtbXPUN/gvw7cO5EbPHr/7eMhbpw8Gl+AfWxW5hLW8
MGw/+AwwjHBOwong/QIDAQAB
-----END PUBLIC KEY-----

User Contributed Notes

Victor 27-Oct-2015 09:36
To get back to the "old behavior" with self-signed ("snakeoil") certificates to possibly incorrect name, you need to set both options.

<?php
            $streamContext = stream_context_create([
                'ssl' => [
                    'verify_peer'      => false,
                    'verify_peer_name' => false
                ]
            ]);
            $contents = file_get_contents('https://url', false, $streamContext);
?>


Autres modifications dans les extensions

cURL

Un certain nombre de constantes de la bibliothèque cURL, précédemment marqué comme obsolète, ont été supprimés :

  • CURLOPT_CLOSEPOLICY
  • CURLCLOSEPOLICY_CALLBACK
  • CURLCLOSEPOLICY_LEAST_RECENTLY_USED
  • CURLCLOSEPOLICY_LEAST_TRAFFIC
  • CURLCLOSEPOLICY_OLDEST
  • CURLCLOSEPOLICY_SLOWEST

OCI8

  • Le support des jeux de résultats implicites pour Oracle Database 12c a été ajouté via la nouvelle fonction oci_get_implicit_resultset().
  • Utiliser oci_execute($s, OCI_NO_AUTO_COMMIT) pour un SELECT ne lance plus nécessairement un ROLLBACK interne lors la fermeture de la connexion.
  • Ajout de sondes DTrace contrôlées par l'option de configuration --enable-dtrace.
  • oci_internal_debug() n'a plus d'effet.
  • Le format de sortie de phpinfo() pour OCI8 a changé.

Zip

Une option de configuration --with-libzip est ajoutée pour utiliser une installation système de libzip. La version 0.11 de libzip est requise, mais il est recommandé d'utiliser une version 0.11.2 ou plus récente.

MySQLi

Une nouvelle option mysqli.rollback_on_cached_plink a été ajoutée, elle contrôle le comportement de restauration des connexions persistantes.

User Contributed Notes

There are no user contributed notes for this page.


Nouvelles constantes globales

GD

  • IMG_WEBP (depuis PHP 5.6.25)

LDAP

  • LDAP_ESCAPE_DN
  • LDAP_ESCAPE_FILTER

OpenSSL

  • OPENSSL_DEFAULT_STREAM_CIPHERS
  • STREAM_CRYPTO_METHOD_ANY_CLIENT
  • STREAM_CRYPTO_METHOD_ANY_SERVER
  • STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT
  • STREAM_CRYPTO_METHOD_TLSv1_0_SERVER
  • STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
  • STREAM_CRYPTO_METHOD_TLSv1_1_SERVER
  • STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
  • STREAM_CRYPTO_METHOD_TLSv1_2_SERVER

PostgreSQL

  • PGSQL_CONNECT_ASYNC
  • PGSQL_CONNECTION_AUTH_OK
  • PGSQL_CONNECTION_AWAITING_RESPONSE
  • PGSQL_CONNECTION_MADE
  • PGSQL_CONNECTION_SETENV
  • PGSQL_CONNECTION_SSL_STARTUP
  • PGSQL_CONNECTION_STARTED
  • PGSQL_DML_ESCAPE
  • PGSQL_POLLING_ACTIVE
  • PGSQL_POLLING_FAILED
  • PGSQL_POLLING_OK
  • PGSQL_POLLING_READING
  • PGSQL_POLLING_WRITING

User Contributed Notes

There are no user contributed notes for this page.


Débogueur PHP

Sommaire

  • À propos du débogueur en PHP

User Contributed Notes

Anonymous 06-Aug-2020 08:51
I often rely on a Slack channel open that is solely dedicated to debug output in whatever project I'm working on. Then I use a PHP function called debug($obj) that takes $obj and uses the Slack API to post a message with that value to that channel. It's helped me immensely and hopefully it would help others too.
shananpk95 at gmail dot com 12-Mar-2020 04:51
I am using two ways to debug code

one is print the data and die the function in specific point.

     print_r($data);die;

second one is writing log file in specific point in code.

function write_log($log_msg)
{
    $log_filename = "logs";
    if (!file_exists($log_filename))
    {
        mkdir($log_filename, 0777, true);
    }
    $log_file_data = $log_filename.'/debug.log';
  file_put_contents($log_file_data, $log_msg . "\n", FILE_APPEND);

}

write_log("Writing Log");
$a = array(
        array('id' => '1','date' => '09-04-2018','length' => '10'),
        array('id' => '2','date' => '09-04-2018','length' => '20'),
        array('id' => '1','date' => '10-04-2018','length' => '11')
    );
write_log(print_r($a,1));
Fonstw 26-Feb-2020 08:54
For me, just outputting variables only works when I know a method should be broken.

I use Xdebug in PHP Storm (available on other IDE's and editors as well)
It allows me to use line breaks and fully inspect anything that's set and how their values are changed and allows me to call single method even at (paused) runtime to see what behaviour the method really gives at any given point, which gives me a much better insight on how my code works and how to get it to work like it should.

I wholeheartedly recomend anyone to try a fuller-fledged debugger like that!
metron19 at yandex dot ru 31-Jul-2019 12:56
A good example of data output to the console via <script> tags, I myself used this first, but he broke the captcha job, because <script> tags were inserted into the base64 code of the captcha picture. Then I began to display logs in the headers with such a function (it may help someone else, in a similar situation):

<?php

function header_log($data){
  $bt = debug_backtrace();
  $caller = array_shift($bt);
  $line = $caller['line'];
  $file = array_pop(explode('/', $caller['file']));
  header('log_'.$file.'_'.$caller['line'].': '.json_encode($data));
}

?>

Usage:
$myvar = array(1,2,3);
header_log( $myvar ); // in headers we see: log_filename_rownumber: [1,2,3]
tekintian at gmail dot com 24-Mar-2019 12:07
<?php
/**
 * ??????
 * @FileName: test_helper.php
 * @Author: TekinTian
 * @QQ: 3316872019
 * @Email: tekintian@gmail.com
 * @Supported: http://dev.yunnan.ws/
 * @Date:   2017-01-23 11:45:26
 * @Last Modified 2019-03-04
 */

if (!function_exists('dd')) {
    /**
     * ??????
     * @param  [type] $arr [description]
     * @return [type]      [description]
     */
    function dd($arr) {
        if (is_array($arr)) {
            echo "<pre>";
            print_r($arr);
            echo "</pre>";
        } else if (is_object($arr)) {
            echo "<pre>";
            print_r($arr);
            echo "</pre>";

        } else {
            echo $arr;
        }
        die;
    }
}

if (!function_exists('pp')) {
    /**
     * ?????
     * @param  [type] $arr [description]
     * @return [type]      [description]
     */
    function pp($arr) {
        if (is_array($arr)) {
            echo "<pre>";
            print_r($arr);
            echo "</pre>";
        } else if (is_object($arr)) {
            echo "<pre>";
            print_r($arr);
            echo "</pre>";

        } else {
            echo $arr;
        }
        die;
    }
}

if (!function_exists('pr')) {
    /**
     * ?????
     */
    function pr($arr) {
        if (is_array($arr)) {
            echo "<pre>";
            print_r($arr);
            echo "</pre>";
        } else if (is_object($arr)) {
            echo "<pre>";
            print_r($arr);
            echo "</pre>";

        } else {
            echo $arr;
        }
    }
}

if (!function_exists('vd')) {
    /**
     * ??????
     * @param  [type] $arr [description]
     * @return [type]      [description]
     */
    function vd($arr) {
        echo "<pre>";
        var_dump($arr);
        echo "</pre>";
        die;
    }
}

if (!function_exists('vv')) {
    function vv($arr) {
        echo "<pre>";
        var_dump($arr);
        echo "</pre>";
    }
}

if (!function_exists('console_log')) {
    /**
     * console.log???????
     * @param  [type] $data [?????????? ???????????]
     * @return [type]       [description]
     */
    function console_log($data) {
        if (is_array($data) || is_object($data)) {
            echo ("<script>console.log('" . json_encode($data) . "');</script>");
        } else {
            echo ("<script>console.log('" . $data . "');</script>");
        }
    }
}

/**
 * ??????????,????????
 *
 * @param     mixed   $var       ????????
 * @param     bool    $echo      ??????
 * @param     string  $label     ??????,???,???"???:"????
 * @param     bool    $strict    ??????
 * @return    string
 */
if (!function_exists('dump')) {
    function dump($var, $echo = true, $label = null, $strict = true) {
        $label = ($label === null) ? '' : rtrim($label) . ' ';
        if (!$strict) {
            if (ini_get('html_errors')) {
                $output = print_r($var, true);
                $output = "<pre>" . $label . htmlspecialchars($output, ENT_QUOTES) . "</pre>";
            } else {
                $output = $label . " : " . print_r($var, true);
            }
        } else {
            ob_start();
            var_dump($var);
            $output = ob_get_clean();
            if (!extension_loaded('xdebug')) {
                $output = preg_replace("/\]\=\>\n(\s+)/m", "] => ", $output);
                $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
            }
        }
        if ($echo) {
            echo ($output);
            return null;
        } else {
            return $output;
        }

    }
}
rajendra at skydevelopers dot net 29-Sep-2018 11:06
I also use a method to print complete data from www.skydevelopers.net company:

function dd($data) {
    echo '<pre>';
    print_r($data);
    exit;
}

well this is also very beneficial
eric at derewonko dot com 14-Jan-2018 09:08
None of the given examples here do fit my needs.
When I debug, I want to see clearly what's going on and where is the debug data. Also it has to accommodate with the current styles and not fall behind or get mixed with other text etc.
This snippet will give you real debug notices in a flashy table:
- complete backtrace of calls on the left with line numbers
- arguments content on the right, with the variable name and coloring per variable type

<?php
function wtf(){
  error_reporting(E_ALL);
  $args = func_get_args();
  $backtrace = debug_backtrace();
  $file = file($backtrace[0]['file']);
  $src  = $file[$backtrace[0]['line']-1];  // select debug($varname) line where it has been called
  $pat  = '#(.*)'.__FUNCTION__.' *?\( *?\$(.*) *?\)(.*)#i';  // search pattern for wtf(parameter)
  $arguments  = trim(preg_replace($pat, '$2', $src));  // extract arguments pattern
  $args_arr = array_map('trim', explode(',', $arguments));

  print '<style>
  div.debug {visible; clear: both; display: table; width: 100%; font-family: Courier,monospace; border: medium solid red; background-color: yellow; border-spacing: 5px; z-index: 999;}
  div.debug > div {display: unset; margin: 5px; border-spacing: 5px; padding: 5px;}
  div.debug .cell {display: inline-flex; padding: 5px; white-space: pre-wrap;}
  div.debug .left-cell {float: left; background-color: Violet;}
  div.debug .array {color: RebeccaPurple; background-color: Violet;}
  div.debug .object pre {color: DodgerBlue; background-color: PowderBlue;}
  div.debug .variable pre {color: RebeccaPurple; background-color: LightGoldenRodYellow;}
  div.debug pre {white-space: pre-wrap;}
  </style>'.PHP_EOL;
  print '<div class="debug">'.PHP_EOL;
  foreach ($args as $key => $arg) {
    print '<div><div class="left-cell cell"><b>';
    array_walk(debug_backtrace(),create_function('$a,$b','print "{$a[\'function\']}()(".basename($a[\'file\']).":{$a[\'line\']})<br> ";'));
    print '</b></div>'.PHP_EOL;
    if (is_array($arg)) {
      print '<div class="cell array"><b>'.$args_arr[$key].' = </b>';
      print_r(htmlspecialchars(print_r($arg)), ENT_COMPAT, 'UTF-8');
      print '</div>'.PHP_EOL;
    } elseif (is_object($arg)) {
      print '<div class="cell object"><pre><b>'.$args_arr[$key].' = </b>';
      print_r(htmlspecialchars(print_r(var_dump($arg))), ENT_COMPAT, 'UTF-8');
      print '</pre></div>'.PHP_EOL;
    } else {
      print '<div class="cell variable"><pre><b>'.$args_arr[$key].' = </b>&gt;';
      print_r(htmlspecialchars($arg, ENT_COMPAT, 'UTF-8').'&lt;');
      print '</pre></div>'.PHP_EOL;
    }
    print '</div>'.PHP_EOL;
  }
  print '</div>'.PHP_EOL;
}
?>

Usage: wtf($arg1, $arg2,..);
That's it!
Bladimir 28-Sep-2017 02:24
Following example above using variable-lenght arguments to support similar Web API's console.log implementation

<?php
function console_log( ...$messages ){
  $msgs = '';
  foreach ($messages as $msg) {
    $msgs .= json_encode($msg);
  }

  echo '<script>';
  echo 'console.log('. json_encode($msgs) .')';
  echo '</script>';
}

?>
Anonymous 19-Apr-2017 08:17
I would like to add http://phpdebugbar.com/ which is also a handy tool for debugging/profiling data. and you could use it whenever framework you are using. :-)
netyou 27-Sep-2015 07:29
I find it very useful to print out to the browsers console instead of just var_dumping:

function console_log( $data ){
  echo '<script>';
  echo 'console.log('. json_encode( $data ) .')';
  echo '</script>';
}

Usage:
$myvar = array(1,2,3);
console_log( $myvar ); // [1,2,3]
skatebiker at gmail dot com 05-Dec-2014 01:24
p_r() is a function for logging variable values.

In this example the function p_r() does only log when the URL parameter d=<nonzero> is set. Reset it by d=0.
When  the parameter is a valid filename (relative to the script's path) it will be logged to that file rather than to the browser.

[code]
@session_start();
// debug
if (isset($_GET['d']))
{
  $_SESSION['d'] = $_GET['d'];
}

if (@$_SESSION['d']) {

function p_r($exp)
{
  $res = "";
  $trace = debug_backtrace();
  $level = 0;
  $e = error_reporting(E_ALL&~E_NOTICE);
  $file = strrpos($trace[$level]['file'], "/");
  $file = substr($trace[$level]['file'],$file+1);
  $line = date("H:i:s"). " " . $file . ' ' . $trace[$level]['line'] . ' ' . $trace[$level+1]['function'] . "()";
  $e = error_reporting($e);
  if (!is_string($exp)) $exp = var_export($exp,1);
  if (substr($_SESSION["d"],-4)==".log") {
    file_put_contents ($_SESSION["d"],$line . ": ". $exp . "\n",  FILE_APPEND);
  } else {
    $res = $line . "\n<pre>".htmlentities($exp). "</pre>\n";
    echo $res;
  }
  return $res;
}

    // refresh to prevent timeout
  $a = $_SESSION['d'];
  $_SESSION['d'] = $a;
  error_reporting (E_ALL);

} else {
  function  p_r() {}
}  // end if debug

[/code]
online _ use _ only == hotmail.com 15-Mar-2006 03:41
I still find that printing out variable values at problem points in the code is one of the easiest ways for me to debug.  If you're interested in knowing the full contents of an object/array/scalar, then use

var_dump($var).


À propos du débogueur en PHP

PHP embarque le débogueur interactif phpdbg. Des débogueurs tierces peuvent aussi être utilisé. L'environnement de développement » Zend IDE inclut un débogueur, et il y a les extensions gratuites telles que DBG (» http://www.php-debugger.com/dbg/), » Advanced PHP Debugger (APD) ou » Xdebug.

User Contributed Notes

Marco 17-Feb-2020 06:10
Kint is an awesome debugger.
To quote the author ... Its var_dump BUT ON STEROIDS !
pegasus.is.a.geek[at]gmail 24-May-2019 07:51
NOTE: ADP hasn't been maintained since 2004


Options de configuration

Sommaire

  • Liste des options de configuration internes

User Contributed Notes

squeeNoSpam at NoSpamAddress dot com 14-Aug-2002 12:06
[Editor's note: The reason why some general options for the "configure" scripts are not documented is that said script is part of the GNU autoconf tools, and as such its general options are documented elsewhere, e.g.: http://www.gnu.org/manual/autoconf/index.html and http://www.airs.com/ian/configure/. Some are also documented in the INSTALL file that comes with the source distribution.]

The --prefix=PREFIX configure option isn't mentioned here. It apparently defaults to /usr/local, and sets the position of the php includes and libs. (in PREFIX/include/php and PREFIX/lib/php)


Liste des options de configuration internes

Ci-dessous une liste partielle des options de configuration utilisées par le script PHP configure lors de la compilation sur les systèmes Unix et assimilés. La plupart des options de configuration sont listées dans leur emplacement approprié sur les pages de référence de l'extension et non pas ici. Pour une liste complète des options de configuration, exécutez la commande ./configure --help dans le répertoire contenant les sources de PHP après avoir exécuté la commande autoconf (voir aussi le chapitre sur l'installation de PHP). Vous pouvez également être intéressé par la lecture de la documentation sur la » configuration GNU pour plus d'informations sur les options de la commande configure comme --prefix=PREFIX.

Note:

Ils sont également utilisés lors de la compilation. Si vous voulez modifier la configuration de l'exécution de PHP, lisez le chapitre sur la configuration de l'exécution.

  • Divers
  • Comportement de PHP
  • Serveur

Options de configuration

Options diverses

--enable-debug

Compile en activant les symboles de déboguage

--with-layout=TYPE

Spécifie la façon dont les fichiers installés seront présentés. TYPE peut valoir PHP (valeur par défaut) ou GNU.

--with-pear=DIR

Installe PEAR dans le dossier DIR (par défaut, PREFIX/lib/php).

--without-pear

Ne pas installer PEAR.

--enable-sigchild

Active le propre traitement du SIGCHLD de PHP.

--disable-rpath

Désactive le passage de chemins additionnels de recherche de bibliothèques d'exécution.

--enable-libgcc

Active explicitement le lien avec la bibliothèque libgcc.

--enable-php-streams

Inclut le support expérimental des flux PHP. Utilisez-le seulement si vous testez le code !

--with-zlib-dir[=DIR]

Définit le chemin du répertoire d'installation de la bibliothèque zlib.

--with-tsrm-pthreads

Utilise les threads POSIX (par défaut).

--enable-shared[=PKGS]

Compile les bibliothèques de partage [defaut=oui].

--enable-static[=PKGS]

Compile les bibliothèques statiques [default=oui].

--enable-fast-install[=PKGS]

Optimise pour une installation rapide [default=oui].

--with-gnu-ld

Le compilateur C utilise GNU ld [default=non].

--disable-libtool-lock

Évite de verrouiller (cela pourrait casser des constructions parallèles).

--with-pic

Tente d'utiliser uniquement les objets PIC/non-PIC [default=utilisation des deux].

--enable-memory-limit

Compile avec le support de limitation de mémoire. (non disponible depuis PHP 5.2.1 - toujours activé)

--disable-url-fopen-wrapper

Désactive le gestionnaire de ressources distantes, qui permet d'accéder à des fichiers via des URL et HTTP ou FTP. (non disponible depuis PHP 5.2.5)

--enable-versioning

Exporte uniquement les symboles requis. Voir le fichier INSTALL pour plus d'informations.

Options PHP

--enable-maintainer-mode

Active des règles de compilation (make) et des dépendances pas toujours utiles aux utilisateurs occasionnels.

--with-config-file-path=PATH

Indique le chemin dans lequel réside le fichier php.ini. Par défaut, c'est PREFIX/lib.

--enable-safe-mode

Active le safe mode (mode sécurisé) par défaut.

Avertissement

Cette fonctionnalité est OBSOLÈTE à partir de PHP 5.3.0 et a été SUPPRIMÉE à partir de PHP 5.4.0.

--with-exec-dir[=DIR]

Autorise uniquement des exécutables dans le dossier DIR lorsque le safe mode est activé ; par défaut, DIR vaut /usr/local/php/bin.

Avertissement

Cette fonctionnalité est OBSOLÈTE à partir de PHP 5.3.0 et a été SUPPRIMÉE à partir de PHP 5.4.0.

--enable-magic-quotes

Active les guillemets magiques.

Avertissement

Cette fonctionnalité est OBSOLÈTE à partir de PHP 5.3.0 et a été SUPPRIMÉE à partir de PHP 5.4.0.

--disable-short-tags

Désactive les balises courtes <?.

--enable-zend-multibyte

Active le codage multi-octets dans l'analyseur lexical et syntaxique. Lorsque PHP est compilé avec une telle option, la directive encoding est disponible dans la construction declare.

Avertissement

Cette fonctionnalité est OBSOLÈTE à partir de PHP 5.3.0 et a été SUPPRIMÉE à partir de PHP 5.4.0.

--with-libdir

Précise le chemin vers les bibliothèques de construction Unix pour construire PHP. Pour les systèmes 64bits, vous devez renseigner le dossier lib64 comme cela: --with-libdir=lib64.

Options SAPI

La liste suivante contient les options valides SAPI&s (Server Application Programming Interface) pour PHP.

--with-apxs[=FILE]

Compile un module Apache partagé. FILE est un chemin d'accès optionnel vers les outils apxs d'Apache. Par défaut, c'est apxs. Assurez-vous de spécifier la version d'apxs qui est réellement installée sur votre système, et NON pas celle qui est fournie avec Apache.

--with-apache[=DIR]

Compile le module Apache. DIR est le chemin du dossier d'installation d'Apache. Par défaut, DIR vaut /usr/local/apache.

--with-mod_charset

Active les tables de transfert pour mod_charset (version russe de Apache).

--with-apxs2[=FILE]

Compile le module partagé Apache 2.0. FILE est un chemin d'accès optionnel vers les outils apxs d'Apache. Par défaut, c'est apxs.

--disable-cli

Empêche la compilation de la version CLI de PHP (cela force aussi l'option --without-pear). Plus d'informations dans la section sur l'utilisation de PHP en ligne de commande.

--enable-phpdbg

Active le support du module SAPI de débogage intéractif phpdbg en PHP 5.6.x et supérieur.

--enable-embed[=TYPE]

Active la compilation de la bibliothèque intégrée SAPI. TYPE vaut soit shared, soit static. Par défaut, c'est shared.

--with-servlet[=DIR]

Inclut le support des servlets. DIR est le chemin d'installation du JSDK. Cette SAPI impose que l'extension java soit compilée comme une bibliothèque partagée.

--disable-cgi

Empêche la compilation de la version CGI de PHP.

Depuis PHP 5.3.0, cet argument active aussi FastCGI qui devait avant être précisé had to be enabled using --enable-fastcgi.

--enable-force-cgi-redirect

Active la sécurité lors des redirections internes du serveur. Il est recommandé d'utiliser cette option lorsque vous utilisez PHP en CGI avec Apache.

Depuis PHP 5.3.0, cet argument est activé par défaut et n'existe plus. Pour le désactiver, la directive ini cgi.force_redirect doit être passée à 0.

--enable-discard-path

Si cette option est activée, l'exécutable CGI PHP peut être placé hors de l'arborescence web, en toute sécurité. Il ne sera pas possible de contourner les fichiers .htaccess. security.

Depuis PHP 5.3.0, cet argument est désactivé par défaut et n'est plus disponible. Pour activer la directive, utilisez le paramètre ini cgi.discard_path et mettez le à 1.

--enable-fastcgi

Si cette option est activée, le module CGI sera compilé avec le support FastCGI.

Depuis PHP 5.3.0, cette directive n'existe plus. Voyez --enable-cgi à la place.

--disable-path-info-check

Si cette option est désactivée, des chemins tels que /info.php/test?a=b ne pourront pas fonctionner. Pour plus d'informations, voir le » Manuel Apache.

Depuis PHP 5.3.0 cet arguemnt est activé par défaut et n'existe plus. Pour désactiver cette fonctionnalité, définir la directive ini cgi.fix_pathinfo à 0.

User Contributed Notes

atesin () gmail ! com 04-Feb-2021 08:55
i'll answer myself (FINALLY!)

current "configure options" can be viewed with "php-config" shell script, aside with other compile time options too =D!!! ...

in some distributions it comes with the "php-devel" package... but until in this online manual "php-config" is mentioned in pecl extensions documentation (i couldn't find on pecl site), idk if that "php-devel" has something to do with this

... however i noticed they are literal strings inside the script, i hope the script itself were built together with php compilation o_O

in the previous page "configure options" (link shown above ^), there is an editor note with additional info about it
atesin () gmail ! com 04-Feb-2021 02:38
please somebody tell me how to display configure options used in php actual binary

it was shown in phpinfo() some years before, it was very useful, specially with 'phpize' recompilation and to enable some pecl/pear module :/

please tell me also which ctriteria had php guys used to suddenly decided to hide (or obfuscate) this info :/

thanks in advance


Directives du php.ini

Sommaire

  • Liste des directives du php.ini
  • Liste des sections du fichier php.ini
  • Description des directives internes du php.ini

User Contributed Notes

There are no user contributed notes for this page.


Liste des directives du php.ini

Cette liste inclut les directives du php.ini que vous pouvez définir pour configurer votre installation de PHP.

La colonne "Modifiable" montre les modes déterminant quand et où une directive peut être définie. Voir la section sur les valeurs du mode modifiable pour leurs définitions.

Options de configuration
Nom | Défaut | Modifiable | Historique
allow_url_fopen | "1" | PHP_INI_SYSTEM |
allow_url_include | "0" | PHP_INI_SYSTEM | Obsolète à partir de PHP 7.4.0.
arg_separator.input | "&" | PHP_INI_PERDIR |
arg_separator.output | "&" | PHP_INI_ALL |
assert.active | "1" | PHP_INI_ALL |
assert.bail | "0" | PHP_INI_ALL |
assert.callback | NULL | PHP_INI_ALL |
assert.exception | "0" | PHP_INI_ALL |
assert.quiet_eval | "0" | PHP_INI_ALL |
assert.warning | "1" | PHP_INI_ALL |
auto_append_file | NULL | PHP_INI_PERDIR |
auto_detect_line_endings | "0" | PHP_INI_ALL |
auto_globals_jit | "1" | PHP_INI_PERDIR |
auto_prepend_file | NULL | PHP_INI_PERDIR |
bcmath.scale | "0" | PHP_INI_ALL |
browscap | NULL | PHP_INI_SYSTEM |
cgi.check_shebang_line | "1" | PHP_INI_SYSTEM |
cgi.discard_path | "0" | PHP_INI_SYSTEM |
cgi.fix_pathinfo | "1" | PHP_INI_SYSTEM |
cgi.force_redirect | "1" | PHP_INI_SYSTEM |
cgi.nph | "0" | PHP_INI_ALL |
cgi.redirect_status_env | NULL | PHP_INI_SYSTEM |
cgi.rfc2616_headers | "0" | PHP_INI_ALL |
child_terminate | "0" | PHP_INI_ALL |
cli.pager | "" | PHP_INI_ALL | Disponible depuis PHP 5.4.0.
cli.prompt | "\\b \\> " | PHP_INI_ALL | Disponible depuis PHP 5.4.0.
cli_server.color | "0" | PHP_INI_ALL | Disponible depuis PHP 5.4.0.
com.allow_dcom | "0" | PHP_INI_SYSTEM |
com.autoregister_typelib | "0" | PHP_INI_ALL |
com.autoregister_verbose | "0" | PHP_INI_ALL |
com.autoregister_casesensitive | "1" | PHP_INI_ALL |
com.code_page | "" | PHP_INI_ALL |
com.dotnet_version | "" | PHP_INI_SYSTEM | Depuis PHP 8.0.0
com.typelib_file | "" | PHP_INI_SYSTEM |
curl.cainfo | NULL | PHP_INI_SYSTEM | Disponible depuis PHP 5.3.7.
date.default_latitude | "31.7667" | PHP_INI_ALL |
date.default_longitude | "35.2333" | PHP_INI_ALL |
date.sunrise_zenith | "90.583333" | PHP_INI_ALL |
date.sunset_zenith | "90.583333" | PHP_INI_ALL |
date.timezone | "" | PHP_INI_ALL | Disponible à partir de PHP 5.1.0.
dba.default_handler | DBA_DEFAULT | PHP_INI_ALL |
default_charset | "UTF-8" | PHP_INI_ALL | Par défaut "UTF-8".
default_mimetype | "text/html" | PHP_INI_ALL |
default_socket_timeout | "60" | PHP_INI_ALL |
disable_classes | "" | php.ini uniquement |
disable_functions | "" | php.ini uniquement |
display_errors | "1" | PHP_INI_ALL |
display_startup_errors | "0" | PHP_INI_ALL |
docref_ext | "" | PHP_INI_ALL |
docref_root | "" | PHP_INI_ALL |
doc_root | NULL | PHP_INI_SYSTEM |
enable_dl | "1" | PHP_INI_SYSTEM | Cette fonctionnalité obsolète sera certainement supprimée dans le futur.
enable_post_data_reading | On | PHP_INI_PERDIR |
engine | "1" | PHP_INI_ALL |
error_append_string | NULL | PHP_INI_ALL |
error_log | NULL | PHP_INI_ALL |
error_prepend_string | NULL | PHP_INI_ALL |
error_reporting | NULL | PHP_INI_ALL |
exif.encode_unicode | "ISO-8859-15" | PHP_INI_ALL |
exif.decode_unicode_motorola | "UCS-2BE" | PHP_INI_ALL |
exif.decode_unicode_intel | "UCS-2LE" | PHP_INI_ALL |
exif.encode_jis | "" | PHP_INI_ALL |
exif.decode_jis_motorola | "JIS" | PHP_INI_ALL |
exif.decode_jis_intel | "JIS" | PHP_INI_ALL |
exit_on_timeout | "" | PHP_INI_ALL |
expect.timeout | "10" | PHP_INI_ALL |
expect.loguser | "1" | PHP_INI_ALL |
expect.logfile | "" | PHP_INI_ALL |
expect.match_max | "" | PHP_INI_ALL |
expose_php | "1" | php.ini uniquement |
extension | NULL | php.ini uniquement |
extension_dir | "/path/to/php" | PHP_INI_SYSTEM |
fastcgi.impersonate | "0" | PHP_INI_SYSTEM |
fastcgi.logging | "1" | PHP_INI_SYSTEM |
fbsql.allow_persistent | "1" | PHP_INI_SYSTEM |
fbsql.autocommit | "1" | PHP_INI_SYSTEM |
fbsql.batchsize | "1000" | PHP_INI_ALL |
fbsql.default_database | "" | PHP_INI_SYSTEM |
fbsql.default_database_password | "" | PHP_INI_SYSTEM |
fbsql.default_host | NULL | PHP_INI_SYSTEM |
fbsql.default_password | "" | PHP_INI_SYSTEM |
fbsql.default_user | "_SYSTEM" | PHP_INI_SYSTEM |
fbsql.generate_warnings | "0" | PHP_INI_SYSTEM |
fbsql.max_connections | "128" | PHP_INI_SYSTEM |
fbsql.max_links | "128" | PHP_INI_SYSTEM |
fbsql.max_persistent | "-1" | PHP_INI_SYSTEM |
fbsql.max_results | "128" | PHP_INI_SYSTEM |
fbsql.show_timestamp_decimals | "0" | PHP_INI_SYSTEM |
file_uploads | "1" | PHP_INI_SYSTEM |
filter.default | "unsafe_raw" | PHP_INI_PERDIR | PHP_INI_ALL en filter <= 0.9.4. Disponible à partir de PHP 5.2.0.
filter.default_flags | NULL | PHP_INI_PERDIR | PHP_INI_ALL en filter <= 0.9.4. Disponible à partir de PHP 5.2.0.
from | "" | PHP_INI_ALL |
gd.jpeg_ignore_warning | "1" | PHP_INI_ALL |
geoip.custom_directory | "" | PHP_INI_ALL |
hard_timeout | "2" | PHP_INI_SYSTEM | Disponible à partir de PHP 7.1.0.
highlight.comment | "#FF8000" | PHP_INI_ALL |
highlight.default | "#0000BB" | PHP_INI_ALL |
highlight.html | "#000000" | PHP_INI_ALL |
highlight.keyword | "#007700" | PHP_INI_ALL |
highlight.string | "#DD0000" | PHP_INI_ALL |
html_errors | "1" | PHP_INI_ALL |
ibase.allow_persistent | "1" | PHP_INI_SYSTEM |
ibase.max_persistent | "-1" | PHP_INI_SYSTEM |
ibase.max_links | "-1" | PHP_INI_SYSTEM |
ibase.default_db | NULL | PHP_INI_SYSTEM |
ibase.default_user | NULL | PHP_INI_ALL |
ibase.default_password | NULL | PHP_INI_ALL |
ibase.default_charset | NULL | PHP_INI_ALL |
ibase.timestampformat | "%Y-%m-%d %H:%M:%S" | PHP_INI_ALL |
ibase.dateformat | "%Y-%m-%d" | PHP_INI_ALL |
ibase.timeformat | "%H:%M:%S" | PHP_INI_ALL |
ibm_db2.binmode | "1" | PHP_INI_ALL |
ibm_db2.i5_all_pconnect | "0" | PHP_INI_SYSTEM | Disponible depuis ibm_db2 1.6.5.
ibm_db2.i5_allow_commit | "0" | PHP_INI_SYSTEM | Disponible depuis ibm_db2 1.5.0.
ibm_db2.i5_dbcs_alloc | "0" | PHP_INI_SYSTEM | Disponible depuis ibm_db2 1.0.2.
ibm_db2.instance_name | NULL | PHP_INI_SYSTEM |
ibm_db2.i5_ignore_userid | "0" | PHP_INI_SYSTEM | Disponible depuis ibm_db2 1.8.0.
iconv.input_encoding | "" | PHP_INI_ALL | Obsolète en PHP 5.6.0.
iconv.output_encoding | "" | PHP_INI_ALL | Obsolète en PHP 5.6.0.
iconv.internal_encoding | "" | PHP_INI_ALL | Obsolète en PHP 5.6.0.
ignore_repeated_errors | "0" | PHP_INI_ALL |
ignore_repeated_source | "0" | PHP_INI_ALL |
ignore_user_abort | "0" | PHP_INI_ALL |
implicit_flush | "0" | PHP_INI_ALL |
include_path | ".:/path/to/php/pear" | PHP_INI_ALL |
intl.default_locale |  | PHP_INI_ALL |
intl.error_level | 0 | PHP_INI_ALL |
intl.use_exceptions | 0 | PHP_INI_ALL | Disponible depuis PHP 5.5 et PECL 3.0.0a1
ingres.allow_persistent | "1" | PHP_INI_SYSTEM | Disponible depuis ingres 1.0.0
ingres.array_index_start | "1" | PHP_INI_ALL | Disponible depuis ingres 1.4.0.
ingres.auto | "1" | PHP_INI_ALL | Disponible depuis ingres 2.0.0.
ingres.blob_segment_length | "4096" | PHP_INI_ALL | Disponible depuis ingres 1.2.0.
ingres.cursor_mode | "0" | PHP_INI_ALL | Disponible depuis ingres 1.1.0.
ingres.default_database | NULL | PHP_INI_ALL | Disponible depuis ingres 1.0.0
ingres.default_password | NULL | PHP_INI_ALL | Disponible depuis ingres 1.0.0
ingres.default_user | NULL | PHP_INI_ALL | Disponible depuis ingres 1.0.0
ingres.describe | 1 | PHP_INI_ALL | Disponible depuis ingres 2.1.0
ingres.fetch_buffer_size | 100 | PHP_INI_ALL | Disponible depuis ingres 2.1.0
ingres.max_links | "-1" | PHP_INI_SYSTEM | Disponible depuis ingres 1.0.0
ingres.max_persistent | "-1" | PHP_INI_SYSTEM | Disponible depuis ingres 1.0.0
ingres.reuse_connection | "1" | PHP_INI_ALL | Disponible depuis ingres 2.0.0
ingres.scrollable | "1" | PHP_INI_ALL | Disponible depuis ingres 2.0.0.
ingres.trace | "0" | PHP_INI_ALL | Disponible depuis ingres 2.0.0.
ingres.trace_connect | "0" | PHP_INI_ALL | Disponible depuis ingres 1.2.1.
ingres.utf8 | "1" | PHP_INI_ALL | Disponible depuis ingres 2.0.0.
last_modified | "0" | PHP_INI_ALL |
ldap.max_links | "-1" | PHP_INI_SYSTEM |
log_errors | "0" | PHP_INI_ALL |
log_errors_max_len | "1024" | PHP_INI_ALL |
mail.add_x_header | "0" | PHP_INI_PERDIR |
mail.force_extra_parameters | NULL | php.ini uniquement |
mail.log | "" | PHP_INI_PERDIR |
max_execution_time | "30" | PHP_INI_ALL |
max_input_nesting_level | "64" | PHP_INI_PERDIR |
max_input_vars | 1000 | PHP_INI_PERDIR |
max_input_time | "-1" | PHP_INI_PERDIR |
mbstring.language | "neutral" | PHP_INI_ALL | PHP_INI_PERDIR en PHP <= 5.2.6
mbstring.detect_order | NULL | PHP_INI_ALL |
mbstring.http_input | "pass" | PHP_INI_ALL | Obsolète en PHP 5.6.0.
mbstring.http_output | "pass" | PHP_INI_ALL | Obsolète en PHP 5.6.0.
mbstring.internal_encoding | NULL | PHP_INI_ALL | Obsolète en PHP 5.6.0.
mbstring.script_encoding | NULL | PHP_INI_ALL | Supprimé en PHP 5.4.0. Utilisez zend.script_encoding à la place.
mbstring.substitute_character | NULL | PHP_INI_ALL |
mbstring.func_overload | "0" | PHP_INI_SYSTEM | PHP_INI_PERDIR en PHP <= 5.2.6. Obsolète à partir de PHP 7.2.0; supprimée à partir de PHP 8.0.0.
mbstring.encoding_translation | "0" | PHP_INI_PERDIR |
mbstring.http_output_conv_mimetypes | "^(text/|application/xhtml\+xml)" | PHP_INI_ALL | Disponible à partir de PHP 5.3.0.
mbstring.strict_detection | "0" | PHP_INI_ALL | Disponible à partir de PHP 5.1.2.
mcrypt.algorithms_dir | null | PHP_INI_ALL |
mcrypt.modes_dir | null | PHP_INI_ALL |
memcache.allow_failover | "1" | PHP_INI_ALL | Disponible depuis memcache 2.0.2.
memcache.max_failover_attempts | "20" | PHP_INI_ALL | Disponible depuis memcache 2.1.0.
memcache.chunk_size | "8192" | PHP_INI_ALL | Disponible depuis memcache 2.0.2.
memcache.default_port | "11211" | PHP_INI_ALL | Disponible depuis memcache 2.0.2.
memcache.hash_strategy | "standard" | PHP_INI_ALL | Disponible depuis memcache 2.2.0.
memcache.hash_function | "crc32" | PHP_INI_ALL | Disponible depuis memcache 2.2.0.
session.save_handler | "files" | PHP_INI_ALL | Supporté depuis memcache 2.1.2
session.save_path | "" | PHP_INI_ALL | Supporté depuis memcache 2.1.2
memcache.protocol | ascii | PHP_INI_ALL | Supporté depuis memcache 3.0.0
memcache.redundancy | 1 | PHP_INI_ALL | Supporté depuis memcache 3.0.0
memcache.session_redundancy | 2 | PHP_INI_ALL | Supporté depuis memcache 3.0.0
memcache.compress_threshold | 20000 | PHP_INI_ALL | Supporté depuis memcache 3.0.3
memcache.lock_timeout | 15 | PHP_INI_ALL | Supporté depuis memcache 3.0.4
memory_limit | "128M" | PHP_INI_ALL |
mongo.allow_empty_keys | 0 | PHP_INI_ALL |
mongo.allow_persistent | 1 | PHP_INI_ALL | Supprimé en 1.2.0
mongo.chunk_size | 262144 | PHP_INI_ALL |
mongo.cmd | "$" | PHP_INI_ALL |
mongo.default_host | "localhost" | PHP_INI_ALL |
mongo.default_port | 27017 | PHP_INI_ALL |
mongo.is_master_interval | 15 | PHP_INI_ALL | Ajouté en 1.2.10, avant 1.3.0, la valeur par défaut était de 60.
mongo.long_as_object | 0 | PHP_INI_ALL |
mongo.native_long | 1 | PHP_INI_ALL | Avant la version 1.5.0, la valeur par défaut était 0.
mongo.ping_interval | 5 | PHP_INI_ALL | Ajouté en 1.2.10
mongo.utf8 | 1 | PHP_INI_ALL |
mysql.allow_local_infile | "1" | PHP_INI_SYSTEM |
mysql.allow_persistent | "1" | PHP_INI_SYSTEM |
mysql.max_persistent | "-1" | PHP_INI_SYSTEM |
mysql.max_links | "-1" | PHP_INI_SYSTEM |
mysql.trace_mode | "Off" | PHP_INI_ALL |
mysql.default_port | NULL | PHP_INI_ALL |
mysql.default_socket | NULL | PHP_INI_ALL |
mysql.default_host | NULL | PHP_INI_ALL |
mysql.default_user | NULL | PHP_INI_ALL |
mysql.default_password | NULL | PHP_INI_ALL |
mysql.connect_timeout | "60" | PHP_INI_ALL |
mysqli.allow_local_infile | "0" | PHP_INI_SYSTEM | Antérieur à PHP 7.2.16 et 7.3.3 la valeur par défaut était "1".
mysqli.local_infile_directory |  | PHP_INI_SYSTEM |
mysqli.allow_persistent | "1" | PHP_INI_SYSTEM |
mysqli.max_persistent | "-1" | PHP_INI_SYSTEM |
mysqli.max_links | "-1" | PHP_INI_SYSTEM |
mysqli.default_port | "3306" | PHP_INI_ALL |
mysqli.default_socket | NULL | PHP_INI_ALL |
mysqli.default_host | NULL | PHP_INI_ALL |
mysqli.default_user | NULL | PHP_INI_ALL |
mysqli.default_pw | NULL | PHP_INI_ALL |
mysqli.reconnect | "0" | PHP_INI_SYSTEM |
mysqli.rollback_on_cached_plink | TRUE | PHP_INI_SYSTEM |
mysqlnd.collect_statistics | "1" | PHP_INI_SYSTEM |
mysqlnd.collect_memory_statistics | "0" | PHP_INI_SYSTEM |
mysqlnd.debug | "" | PHP_INI_SYSTEM |
mysqlnd.log_mask | 0 | PHP_INI_ALL |
mysqlnd.mempool_default_size | 16000 | PHP_INI_ALL |
mysqlnd.net_read_timeout | "86400" | PHP_INI_ALL | Avant PHP 7.2.0 la valeur par défaut était "31536000" et la variabilité était PHP_INI_SYSTEM
mysqlnd.net_cmd_buffer_size | "4096" | PHP_INI_SYSTEM |
mysqlnd.net_read_buffer_size | "32768" | PHP_INI_SYSTEM |
mysqlnd.sha256_server_public_key | "" | PHP_INI_PERDIR |
mysqlnd.trace_alloc | "" | PHP_INI_SYSTEM |
mysqlnd.fetch_data_copy | 0 | PHP_INI_ALL |
mysqlnd_memcache.enable | 1 | PHP_INI_SYSTEM | Disponible depuis la version 1.0.0
mysqlnd_ms.enable | 0 | PHP_INI_SYSTEM |
mysqlnd_ms.force_config_usage | 0 | PHP_INI_SYSTEM |
mysqlnd_ms.ini_file | "" | PHP_INI_SYSTEM |
mysqlnd_ms.config_file | "" | PHP_INI_SYSTEM |
mysqlnd_ms.collect_statistics | 0 | PHP_INI_SYSTEM |
mysqlnd_ms.multi_master | 0 | PHP_INI_SYSTEM |
mysqlnd_ms.disable_rw_split | 0 | PHP_INI_SYSTEM |
mysqlnd_mux.enable | 0 | PHP_INI_SYSTEM |
mysqlnd_qc.enable_qc | 1 | PHP_INI_SYSTEM |
mysqlnd_qc.ttl | 30 | PHP_INI_ALL |
mysqlnd_qc.cache_by_default | 0 | PHP_INI_ALL |
mysqlnd_qc.cache_no_table | 0 | PHP_INI_ALL |
mysqlnd_qc.use_request_time | 0 | PHP_INI_ALL |
mysqlnd_qc.time_statistics | 1 | PHP_INI_ALL |
mysqlnd_qc.collect_statistics | 0 | PHP_INI_ALL |
mysqlnd_qc.collect_statistics_log_file | /tmp/mysqlnd_qc.stats | PHP_INI_SYSTEM |
mysqlnd_qc.collect_query_trace | 0 | PHP_INI_SYSTEM |
mysqlnd_qc.query_trace_bt_depth | 3 | PHP_INI_SYSTEM |
mysqlnd_qc.collect_normalized_query_trace | 0 | PHP_INI_SYSTEM |
mysqlnd_qc.ignore_sql_comments | 1 | PHP_INI_ALL |
mysqlnd_qc.slam_defense | 0 | PHP_INI_SYSTEM |
mysqlnd_qc.slam_defense_ttl | 30 | PHP_INI_SYSTEM |
mysqlnd_qc.std_data_copy | 0 | PHP_INI_SYSTEM |
mysqlnd_qc.apc_prefix | qc_ | PHP_INI_ALL |
mysqlnd_qc.memc_server | 127.0.0.1 | PHP_INI_ALL |
mysqlnd_qc.memc_port | 11211 | PHP_INI_ALL |
mysqlnd_qc.sqlite_data_file | :memory: | PHP_INI_ALL |
mysqlnd_uh.enable | 1 | PHP_INI_SYSTEM |
mysqlnd_uh.report_wrong_types | 1 | PHP_INI_ALL |
oci8.connection_class | "" | PHP_INI_ALL | Disponible depuis PHP 5.3 (PECL OCI8 1.3).
oci8.default_prefetch | "100" | PHP_INI_SYSTEM | Disponible depuis PHP 5.1.2 (PECL OCI8 1.1).
oci8.events | Off | PHP_INI_SYSTEM | Disponible depuis PHP 5.3 (PECL OCI8 1.3).
oci8.max_persistent | "-1" | PHP_INI_SYSTEM | Disponible depuis PHP 5.1.2 (PECL OCI8 1.1).
oci8.old_oci_close_semantics | Off | PHP_INI_SYSTEM | Disponible depuis PHP 5.1.2 (PECL OCI8 1.1).
oci8.persistent_timeout | "-1" | PHP_INI_SYSTEM | Disponible depuis PHP 5.1.2 (PECL OCI8 1.1).
oci8.ping_interval | "60" | PHP_INI_SYSTEM | Disponible depuis PHP 5.1.2 (PECL OCI8 1.1).
oci8.privileged_connect | Off | PHP_INI_SYSTEM | Disponible depuis PHP 5.1.2 (PECL OCI8 1.1).
oci8.statement_cache_size | "20" | PHP_INI_SYSTEM | Disponible depuis PHP 5.1.2 (PECL OCI8 1.1).
odbc.default_db * | NULL | PHP_INI_ALL |
odbc.default_user * | NULL | PHP_INI_ALL |
odbc.default_pw * | NULL | PHP_INI_ALL |
odbc.allow_persistent | "1" | PHP_INI_SYSTEM |
odbc.check_persistent | "1" | PHP_INI_SYSTEM |
odbc.max_persistent | "-1" | PHP_INI_SYSTEM |
odbc.max_links | "-1" | PHP_INI_SYSTEM |
odbc.defaultlrl | "4096" | PHP_INI_ALL |
odbc.defaultbinmode | "1" | PHP_INI_ALL |
odbc.default_cursortype | "3" | PHP_INI_ALL | Disponible à partir de PHP 5.3.0
opcache.enable | "1" | PHP_INI_ALL |
opcache.enable_cli | "0" | PHP_INI_SYSTEM | Entre PHP 7.1.2 et 7.1.6 inclusivement, la valeur par défaut était de "1"
opcache.memory_consumption | "128" | PHP_INI_SYSTEM |
opcache.interned_strings_buffer | "8" | PHP_INI_SYSTEM |
opcache.max_accelerated_files | "10000" | PHP_INI_SYSTEM |
opcache.max_wasted_percentage | "5" | PHP_INI_SYSTEM |
opcache.use_cwd | "1" | PHP_INI_SYSTEM |
opcache.validate_timestamps | "1" | PHP_INI_ALL |
opcache.revalidate_freq | "2" | PHP_INI_ALL |
opcache.revalidate_path | "0" | PHP_INI_ALL |
opcache.save_comments | "1" | PHP_INI_SYSTEM |
opcache.fast_shutdown | "0" | PHP_INI_SYSTEM | Supprimé en PHP 7.2.0.
opcache.enable_file_override | "0" | PHP_INI_SYSTEM |
opcache.optimization_level | "0x7FFEBFFF" | PHP_INI_SYSTEM | Modifié depuis 0x7FFFBFFF en PHP 7.3.0
opcache.inherited_hack | "1" | PHP_INI_SYSTEM | Supprimé en PHP 7.3.0
opcache.dups_fix | "0" | PHP_INI_ALL |
opcache.blacklist_filename | "" | PHP_INI_SYSTEM |
opcache.max_file_size | "0" | PHP_INI_SYSTEM |
opcache.consistency_checks | "0" | PHP_INI_ALL |
opcache.force_restart_timeout | "180" | PHP_INI_SYSTEM |
opcache.error_log | "" | PHP_INI_SYSTEM |
opcache.log_verbosity_level | "1" | PHP_INI_SYSTEM |
opcache.preferred_memory_model | "" | PHP_INI_SYSTEM |
opcache.protect_memory | "0" | PHP_INI_SYSTEM |
opcache.mmap_base | null | PHP_INI_SYSTEM |
opcache.restrict_api | "" | PHP_INI_SYSTEM |
opcache.file_update_protection | "2" | PHP_INI_ALL |
opcache.huge_code_pages | "0" | PHP_INI_SYSTEM |
opcache.lockfile_path | "/tmp" | PHP_INI_SYSTEM |
opcache.opt_debug_level | "0" | PHP_INI_SYSTEM | Disponible à partir de PHP 7.1.0
opcache.file_cache | NULL | PHP_INI_SYSTEM |
opcache.file_cache_only | "0" | PHP_INI_SYSTEM |
opcache.file_cache_consistency_checks | "1" | PHP_INI_SYSTEM |
opcache.file_cache_fallback | "1" | PHP_INI_SYSTEM | Windows uniquement.
opcache.validate_permission | "0" | PHP_INI_SYSTEM | Disponible à partir de PHP 7.0.14
opcache.validate_root | "0" | PHP_INI_SYSTEM | Disponible à partir de PHP 7.0.14
opcache.preload | "" | PHP_INI_SYSTEM | Disponible à partir de PHP 7.4.0
opcache.preload_user | "" | PHP_INI_SYSTEM | Disponible à partir de PHP 7.4.0
opcache.cache_id | "" | PHP_INI_SYSTEM | Windows uniquement. Disponible à partir de PHP 7.4.0
opcache.jit | "tracing" | PHP_INI_ALL | Disponible à partir de PHP 8.0.0
opcache.jit_buffer_size | "0" | PHP_INI_SYSTEM | Disponible à partir de PHP 8.0.0
opcache.jit_debug | "0" | PHP_INI_ALL | Disponible à partir de PHP 8.0.0
opcache.jit_bisect_limit | "0" | PHP_INI_ALL | Disponible à partir de PHP 8.0.0
opcache.jit_prof_threshold | "0.005" | PHP_INI_ALL | Disponible à partir de PHP 8.0.0
opcache.jit_max_root_traces | "1024" | PHP_INI_SYSTEM | Disponible à partir de PHP 8.0.0
opcache.jit_max_side_traces | "128" | PHP_INI_SYSTEM | Disponible à partir de PHP 8.0.0
opcache.jit_max_exit_counters | "8192" | PHP_INI_SYSTEM | Disponible à partir de PHP 8.0.0
opcache.jit_hot_loop | "64" | PHP_INI_SYSTEM | Disponible à partir de PHP 8.0.0
opcache.jit_hot_func | "127" | PHP_INI_SYSTEM | Disponible à partir de PHP 8.0.0
opcache.jit_hot_return | "8" | PHP_INI_SYSTEM | Disponible à partir de PHP 8.0.0
opcache.jit_hot_side_exit | "8" | PHP_INI_SYSTEM | Disponible à partir de PHP 8.0.0
opcache.jit_blacklist_root_trace | "16" | PHP_INI_ALL | Disponible à partir de PHP 8.0.0
opcache.jit_blacklist_side_trace | "8" | PHP_INI_ALL | Disponible à partir de PHP 8.0.0
opcache.jit_max_loop_unrolls | "8" | PHP_INI_ALL | Disponible à partir de PHP 8.0.0
opcache.jit_max_recursive_calls | "2" | PHP_INI_ALL | Disponible à partir de PHP 8.0.0
opcache.jit_max_recursive_returns | "2" | PHP_INI_ALL | Disponible à partir de PHP 8.0.0
opcache.jit_max_polymorphic_calls | "2" | PHP_INI_ALL | Disponible à partir de PHP 8.0.0
open_basedir | NULL | PHP_INI_ALL |
output_buffering | "0" | PHP_INI_PERDIR |
output_handler | NULL | PHP_INI_PERDIR |
pcre.backtrack_limit | "1000000" | PHP_INI_ALL | Disponible depuis PHP 5.2.0.
pcre.recursion_limit | "100000" | PHP_INI_ALL | Disponible depuis PHP 5.2.0.
pcre.jit | "1" | PHP_INI_ALL | Disponible depuis PHP 7.0.0.
pdo.dsn.* |  | php.ini seulement |
pdo_odbc.connection_pooling | "strict" | PHP_INI_ALL | Disponible depuis PHP 5.1.0.
pdo_odbc.db2_instance_name | null | PHP_INI_SYSTEM | Disponible depuis PHP 5.1.1. Cette fonctionnalité obsolète sera certainement supprimée dans le futur.
pgsql.allow_persistent | "1" | PHP_INI_SYSTEM |
pgsql.max_persistent | "-1" | PHP_INI_SYSTEM |
pgsql.max_links | "-1" | PHP_INI_SYSTEM |
pgsql.auto_reset_persistent | "0" | PHP_INI_SYSTEM | Disponible depuis PHP 4.2.0.
pgsql.ignore_notice | "0" | PHP_INI_ALL | Disponible depuis PHP 4.3.0.
pgsql.log_notice | "0" | PHP_INI_ALL | Disponible depuis PHP 4.3.0.
phar.readonly | "1" | PHP_INI_ALL |
phar.require_hash | "1" | PHP_INI_ALL |
phar.cache_list | "" | PHP_INI_SYSTEM |
post_max_size | "8M" | PHP_INI_PERDIR |
precision | "14" | PHP_INI_ALL |
realpath_cache_size | "16K" | PHP_INI_SYSTEM |
realpath_cache_ttl | "120" | PHP_INI_SYSTEM |
register_argc_argv | "1" | PHP_INI_PERDIR |
report_memleaks | "1" | PHP_INI_ALL |
report_zend_debug | "1" | PHP_INI_ALL |
request_order | "" | PHP_INI_PERDIR |
runkit.superglobal | "" | PHP_INI_PERDIR |
runkit.internal_override | "0" | PHP_INI_SYSTEM |
sendmail_from | NULL | PHP_INI_ALL |
sendmail_path | "/usr/sbin/sendmail -t -i" | PHP_INI_SYSTEM |
serialize_precision | "-1" | PHP_INI_ALL | Antérieur à PHP 7.1.0, la valeur par défaut était 17.
session.save_path | "" | PHP_INI_ALL |
session.name | "PHPSESSID" | PHP_INI_ALL |
session.save_handler | "files" | PHP_INI_ALL |
session.auto_start | "0" | PHP_INI_PERDIR |
session.gc_probability | "1" | PHP_INI_ALL |
session.gc_divisor | "100" | PHP_INI_ALL |
session.gc_maxlifetime | "1440" | PHP_INI_ALL |
session.serialize_handler | "php" | PHP_INI_ALL |
session.cookie_lifetime | "0" | PHP_INI_ALL |
session.cookie_path | "/" | PHP_INI_ALL |
session.cookie_domain | "" | PHP_INI_ALL |
session.cookie_secure | "" | PHP_INI_ALL |
session.cookie_httponly | "" | PHP_INI_ALL |
session.cookie_samesite | "" | PHP_INI_ALL | Disponible à partir de PHP 7.3.0.
session.use_strict_mode | "0" | PHP_INI_ALL |
session.use_cookies | "1" | PHP_INI_ALL |
session.use_only_cookies | "1" | PHP_INI_ALL |
session.referer_check | "" | PHP_INI_ALL |
session.cache_limiter | "nocache" | PHP_INI_ALL |
session.cache_expire | "180" | PHP_INI_ALL |
session.use_trans_sid | "0" | PHP_INI_ALL |
session.trans_sid_tags | "a=href,area=href,frame=src,form=" | PHP_INI_ALL | Disponible à partir de PHP 7.1.0.
session.trans_sid_hosts | $_SERVER['HTTP_HOST'] | PHP_INI_ALL | Disponible à partir de PHP 7.1.0.
session.sid_length | "32" | PHP_INI_ALL | Disponible à partir de PHP 7.1.0.
session.sid_bits_per_character | "4" | PHP_INI_ALL | Disponible à partir de PHP 7.1.0.
session.upload_progress.enabled | "1" | PHP_INI_PERDIR |
session.upload_progress.cleanup | "1" | PHP_INI_PERDIR |
session.upload_progress.prefix | "upload_progress_" | PHP_INI_PERDIR |
session.upload_progress.name | "PHP_SESSION_UPLOAD_PROGRESS" | PHP_INI_PERDIR |
session.upload_progress.freq | "1%" | PHP_INI_PERDIR |
session.upload_progress.min_freq | "1" | PHP_INI_PERDIR |
session.lazy_write | "1" | PHP_INI_ALL |
session.hash_function | "0" | PHP_INI_ALL | Supprimé à partir de PHP 7.1.0
session.hash_bits_per_character | "4" | PHP_INI_ALL | Supprimé à partir de PHP 7.1.0
session.entropy_file | "" | PHP_INI_ALL | Supprimé à partir de PHP 7.1.0.
session.entropy_length | "0" | PHP_INI_ALL | Supprimé à partir de PHP 7.1.0.
short_open_tag | "1" | PHP_INI_PERDIR |
SMTP | "localhost" | PHP_INI_ALL |
smtp_port | "25" | PHP_INI_ALL |
soap.wsdl_cache_enabled | 1 | PHP_INI_ALL |
soap.wsdl_cache_dir | /tmp | PHP_INI_ALL |
soap.wsdl_cache_ttl | 86400 | PHP_INI_ALL |
soap.wsdl_cache | 1 | PHP_INI_ALL |
soap.wsdl_cache_limit | 5 | PHP_INI_ALL |
sql.safe_mode | "0" | PHP_INI_SYSTEM |
sqlite3.extension_dir | "" | PHP_INI_SYSTEM | Disponible à partir de PHP 5.3.11.
sqlite3.defensive | 1 | PHP_INI_SYSTEM | Disponible à partir de PHP 7.2.17 et 7.3.4 pour libsqlite = 3.26.0.
syslog.facility | "LOG_USER" | PHP_INI_SYSTEM | Disponible à partir de PHP 7.3.0.
syslog.filter | "no-ctrl" | PHP_INI_ALL | Disponible à partir de PHP 7.3.0.
syslog.ident | "php" | PHP_INI_SYSTEM | Disponible à partir de PHP 7.3.0.
sys_temp_dir | "" | PHP_INI_SYSTEM |
sysvshm.init_mem | 10000 | PHP_INI_SYSTEM |
tidy.default_config | "" | PHP_INI_SYSTEM |
tidy.clean_output | "0" | PHP_INI_USER | PHP_INI_PERDIR avant PHP 5.4.0.
track_errors | "0" | PHP_INI_ALL | Obsolète à partir de PHP 7.2.0.
unserialize_callback_func | NULL | PHP_INI_ALL |
uploadprogress.file.filename_template | "/tmp/upt_%s.txt" | PHP_INI_ALL |
upload_max_filesize | "2M" | PHP_INI_PERDIR |
max_file_uploads | 20 | PHP_INI_SYSTEM |
upload_tmp_dir | NULL | PHP_INI_SYSTEM |
url_rewriter.tags | "a=href,area=href,frame=src,form=,fieldset=" | PHP_INI_ALL |
user_agent | NULL | PHP_INI_ALL |
user_dir | NULL | PHP_INI_SYSTEM |
user_ini.cache_ttl | "300" | PHP_INI_SYSTEM |
user_ini.filename | ".user.ini" | PHP_INI_SYSTEM |
uopz.disable | "0" | PHP_INI_SYSTEM | Disponible à partir de uopz 5.0.2
uopz.exit | "0" | PHP_INI_SYSTEM | Disponible à partir de uopz 6.0.1
uopz.overloads | "1" | PHP_INI_SYSTEM | Disponible à partir de uopz 2.0.2. Supprimé à partir de uopz 5.0.0.
variables_order | "EGPCS" | PHP_INI_PERDIR |
vld.active | "0" | PHP_INI_SYSTEM |
vld.execute | "1" | PHP_INI_SYSTEM | Disponible depuis vld 0.8.0.
vld.skip_append | "0" | PHP_INI_SYSTEM | Disponible depuis vld 0.8.0.
vld.skip_prepend | "0" | PHP_INI_SYSTEM | Disponible depuis vld 0.8.0.
windows.show_crt_warning | "0" | PHP_INI_ALL |
xbithack | "0" | PHP_INI_ALL |
xmlrpc_errors | "0" | PHP_INI_SYSTEM |
xmlrpc_error_number | "0" | PHP_INI_ALL |
yaz.keepalive | "120" | PHP_INI_ALL |
yaz.log_mask | NULL | PHP_INI_ALL | Disponible depuis yaz 1.0.3.
zend.assertions | "1" | PHP_INI_ALL |
zend.detect_unicode | "1" | PHP_INI_ALL |
zend.enable_gc | "1" | PHP_INI_ALL |
zend.multibyte | "0" | PHP_INI_PERDIR |
zend.script_encoding | NULL | PHP_INI_ALL |
zend.signal_check | "0" | PHP_INI_SYSTEM |
zend_extension | NULL | php.ini only |
zlib.output_compression | "0" | PHP_INI_ALL |
zlib.output_compression_level | "-1" | PHP_INI_ALL |
zlib.output_handler | "" | PHP_INI_ALL |

User Contributed Notes

There are no user contributed notes for this page.


Liste des sections du fichier php.ini

Cette liste inclut les sections du php.ini que vous pouvez ajuster pour configurer votre PHP selon l'hôte virtuel ou le chemin. Ces sections sont optionnelles.

Ces sections n'affectent pas directement PHP. Elles sont utilisées pour grouper les autres directives de configuration du php.ini et pour les appliquer à un hôte ou à un chemin particulier.

Ces sections ne sont utilisées qu'en mode CGI/FastCGI et elles ne peuvent définir des extensions et des directives zend_extension.

Sections
Nom | Modifiable | Historique
[HOST=] | PHP_INI_SYSTEM | Disponible à partir de PHP 5.3.0.
[PATH=] | PHP_INI_SYSTEM | Disponible à partir de PHP 5.3.0.

Voici un éclaircissement sur l'utilisation des directives de configuration.

[HOST=<host>]

Cette section vous permet de définir un jeu de directives du php.ini qui prendront effet sur l'hôte spécifié.

Exemple #1 Active la sortie d'erreur à l'écran pour dev.site.com

[HOST=dev.site.com]
error_reporting = E_ALL
display_errors = On

[PATH=<path>]

Cette section vous permet de définir un jeu de directives du php.ini qui prendront effet quand un script sera lancé depuis le chemin spécifié.

Exemple #2 Ajoute un script de sécurité pour les zones protégées

[PATH=/home/site/public/secure]
auto_prepend_file=security.php

User Contributed Notes

dasloch at absatzen dot de 12-Feb-2020 12:47
Note that you cannot usefully set syslog.* in [PATH=] (and probably [HOST=]) sections, since the syslogger is initialized only once per php-fpm worker process, and not per request.
robinhook at mail dot com 22-Apr-2018 07:14
Sorry for the note. I've read some bad tutorials.
The correct syntax is : directive = 'value'
not a thing like : php_value[directive] = "somevalue"
robinhook at mail dot com 22-Apr-2018 06:59
this HOST and PATH sections doesn't seems to work in php.ini under apache 2.4 with php-fpm 7.1.16 for directive php_value or php_admin_value open_basedir or include_path.
phpinfo() says "none" in master and local values.
z dot himdi at bita dot nl 04-Aug-2011 07:53
On Windows IIS 7 server I noticed that [PATH=] was not listened to. [HOST=] however worked.
leo 06-May-2011 03:21
Just developed the probably first php.ini hack to add commands which will only be parsed before PHP 5.3 when using mod_php.

<?php

# Disable eAccelerator by default
eaccelerator.enable = 0

# Now, to prevent incompatibilities with Zend Optimizer+, we
# want to enable eAccelerator only in PHP 5.2 or lower.
[HOST=*]
eaccelerator.enable = 1

?>

What is happening here? In PHP 5.3, php.ini sections to set up PHP on a per host basis have been introduced:

http://www.php.net/manual/en/ini.sections.php

These sections only work in CGI/FastCGI mode, however there still seems to be a difference in how the php.ini file is parsed in PHP 5.2 and PHP 5.3 when using mod_php: PHP 5.3 ignores everything below the line [HOST=*], whereas PHP 5.2 does not.

In the above example, PHP 5.3 only reads "eaccelerator.enable = 0" and then stops at the invalid command [HOST=*]. However, PHP 5.2 seems to ignore the invalid command and parses the whole configuration file, ending up with "eaccelerator.enable = 1".
crash at lubyte dot de 06-Sep-2010 05:45
If you have a system which uses separated PHP inis for loading extensions (Debian, Fedora and most other distributions do so), [PATH=] or [HOST=] will prevent loading extensions defined in those ini files (extension= and zend_extension=).

I had some headache, when I added a hosts.ini to /etc/php5/cgi/conf.d (Debians default), where I wanted to define some defaults for a host name. The manual says extension= and zend_extension= aren't allowed in [HOST=] and [PATH=] (see above). I figured out that you can easily fix that with adding [PHP] after your definitions.

For example hosts.ini:
[HOST=dev.example.com]
display_errors = on

[PHP]

this will change the section back to [PHP] where extension= and zend_extension= is allowed.
robert dot johnson at icap dot com 12-Apr-2010 10:26
Adding PATH= applies only to the named path and does not include sub-directories, you have to add a PATH= value for each sub-directory.

Also some settings have no effect even though phpinfo recognises and displays the per-folder value as the 'local' value, and the default as the 'master' value.

'fastcgi.impersonate' always uses the master setting.
public at grik dot net 24-Sep-2009 03:00
In [HOST=...] one should use only the 1st server name from the list of server names.

I.E. if you have
server_name example.com, example2.com;
and will use www.example.com in a browser,
use [HOST=example.com] in php.ini for both addresses.

PHP looks not at the HOST request header (as I expected), but at the SERVER_NAME parameter (which by default is the 1st from the list of names, no matter what the HOST is).


Description des directives internes du php.ini

Cette liste inclut les directives internes du php.ini que vous pouvez définir pour personnaliser votre configuration de PHP. Les directives gérées par les extensions sont listées et détaillées dans les pages de documentation respectives des extensions ; les informations concernant les directives sur les sessions, par exemple, peuvent être trouvées sur la page de documentation des sessions.

Note:

Les valeurs par défaut listées ici seront utilisées lorsque php.ini n'est pas chargé ; les valeurs des fichiers php.ini en environnement de production et en environnement de développement peuvent varier.

Options du langage

Options de configuration
Nom | Défaut | Modifiable | Historique
short_open_tag | "1" | PHP_INI_ALL |
precision | "14" | PHP_INI_ALL |
serialize_precision | "-1" | PHP_INI_ALL | Antérieur à PHP 7.1.0, la valeur par défaut était 17.
disable_functions | "" | PHP_INI_SYSTEM uniquement |
disable_classes | "" | php.ini only |
exit_on_timeout | "" | PHP_INI_ALL |
expose_php | "1" | php.ini uniquement |
hard_timeout | "2" | PHP_INI_SYSTEM | Disponible à partir de PHP 7.1.0.
zend.exception_ignore_args | "0" | PHP_INI_ALL | Disponible à partir de PHP 7.4.0
zend.multibyte | "0" | PHP_INI_ALL |
zend.script_encoding | NULL | PHP_INI_ALL |
zend.detect-unicode | NULL | PHP_INI_ALL |
zend.signal_check | "0" | PHP_INI_SYSTEM |
zend.assertions | "1" | PHP_INI_ALL avec des restrictions |

Voici un éclaircissement sur l'utilisation des directives de configuration.

short_open_tag bool

Définit si les balises courtes d'ouverture de PHP (<? ?>) sont autorisées ou non. Si vous voulez utiliser PHP avec XML, vous devez désactiver cette option de configuration pour pouvoir utiliser <?xml ?>. Sinon, vous pouvez l'écrire à l'aide de PHP, par exemple : <?php echo '<?xml version="1.0">'; ?>. Si cette option est désactivée, vous devez utiliser la version longue d'ouverture de balises PHP (<?php ?>).

Note:

Cette directive n'affecte pas l'utilisation de <?=, qui est toujours disponible.

precision int
Le nombre de décimales significatif à afficher dans les nombres à virgule flottante. -1 signifie que le meilleur algorithme pour arrondir ce nombre sera utilisé.
serialize_precision int
Le nombre de chiffres significatifs conservés lors de la linéarisation des nombres à virgule flottante. -1 signifie que le meilleur algorithme pour arrondir ce nombre sera utilisé.
expose_php bool

Expose à tous les clients le fait que PHP est installé sur le serveur. Ceci inclut la version de PHP dans les en-têtes HTTP de la réponse (X-Powered-By : PHP/5.3.7).

disable_functions string

Cette directive vous permet de désactiver certaines fonctions. Elle prend une liste de noms de fonction délimités par une virgule.

Seules les fonctions internes peuvent être désactivées en utilisant cette directive. Les fonctions définies par l'utilisateur ne sont pas affectées.

Cette directive doit être définie dans le php.ini. Par exemple, vous ne pouvez pas le définir dans le fichier httpd.conf.

disable_classes string
Cette directive vous permet de désactiver certaines classes. Elle prend une liste de noms de classes délimités par une virgule. Cette directive doit être définie dans le php.ini. Par exemple, vous ne pouvez pas le définir dans le fichier httpd.conf.
zend.assertions int
Lorsque défini à 1, le code d'assertion sera généré (en mode développement). Lorsque défini à 0, le code d'assertion sera généré mais sera ignoré (il ne sera pas exécuté) pendant l'exécution. Lorsque défini à -1, le code d'assertion ne sera pas généré, rendant ainsi les assertions totalement neutres (en mode production).

Note:

Si un processus est démarré en mode production, zend.assertions ne peut être changé en cours d'exécution, sachant que le code pour les assertions n'a pas été généré.

Si un processus est démarré en mode développement, zend.assertions ne peut être défini à -1 en cours d'exécution.

hard_timeout int

zend.exception_ignore_args bool

Exclus les arguments dans les stack traces généré depuis les exceptions.

zend.multibyte bool

Active l'analyse lexicale des fichiers PHP dans des encodages multi-octets. L'activation de zend.multibyte est nécessaire pour utiliser certains encodages de caractères comme SJIS, BIG5, etc. qui contiennent des caractères spéciaux en encodage multi-octets. Les encodages compatible avec ISO-8859-1 comme UTF-8, EUC, etc. ne nécessitent pas cette option.

Activer zend.multibyte requiert l'extension mbstring.

zend.script_encoding string

Cette valeur sera utilisée à moins qu'une directive declare(encoding=...) n'apparaisse en haut du script. Lorsqu'un encodage incompatible ISO-8859-1 est utilisé, les options zend.multibyte et zend.script_encoding doivent être utilisées.

Les chaines de caractères seront converties depuis zend.script_enconding vers mbstring.internal_encoding, comme si mb_convert_encoding() avait été appelé.

zend.detect_unicode bool

Vérifie le BOM (Byte Order Mark) et regarde si le fichier contient des caractères multi-octets valides. Cette détection est effectuée avant le lancement de la fonction __halt_compiler(). Disponible uniquement en mode Zend multi-octets.

zend.signal_check bool

Vérifie si un gestionnaire de signaux de remplacement est utilisé lors de l'arrêt.

exit_on_timeout bool

Ceci est une directive Apache1 mod_php uniquement, qui force les fils Apache à sortir si une expiration de délai d'exécution PHP survient. Une telle expiration de délai produit en interne un appel à longjmp() en Apache1 qui peut quitter certaines extensions dans un statut non consistent. En terminant le processus, tous les verrous et la mémoire seront nettoyés.

Limite des ressources

Options de configuration
Nom | Défaut | Modifiable | Historique
memory_limit | "128M" | PHP_INI_ALL |

Voici un éclaircissement sur l'utilisation des directives de configuration.

memory_limit int

Cette option détermine la mémoire limite, en octets, qu'un script est autorisé à allouer. Cela permet de prévenir l'utilisation de toute la mémoire par un script mal codé. Notez que pour n'avoir aucune limite, vous devez définir cette directive à -1.

Lorsqu'un entier est utilisé, sa valeur est mesurée en octets. Vous pouvez également utiliser la notation sténographique comme décrit dans cette entrée de la FAQ..

Voir aussi : max_execution_time.

Réglage de Performance

Réglage de Performance
Nom | Défaut | Modifiable | Historique
realpath_cache_size | "4M" | PHP_INI_SYSTEM | Antérieur à PHP 7.0.16 et 7.1.2, la valeur par défaut était "16K"
realpath_cache_ttl | "120" | PHP_INI_SYSTEM |

Note:

Utiliser open_basedir désactivera le cache realpath.

Voici un éclaircissement sur l'utilisation des directives de configuration.

realpath_cache_size entier

Détermine la taille du cache de realpath qui sera utilisée par PHP. Cette valeur devrait être augmentée sur les systèmes où PHP ouvre plusieurs fichiers, pour refléter la quantité d'opérations exécutées sur les fichiers.

La taille représente le nombre total d'octets dans la chaîne stockée du chemin, plus la taille des données associées avec l'entrée du cache. Cela signifie que pour stocker de grands chemins dans le cache, la taille du cache doit être suffisamment grand. Cette valeur ne contrôle pas directement le nombre de chemins distincts qui peuvent être mis en cache.

La taille nécessaire pour les données de l'entrée du cache est dépendant du système.

realpath_cache_ttl entier

Temps (en seconde) pour lequel persiste l'information du cache de realpath pour un fichier ou un répertoire donné. Pour des systèmes avec des fichiers qui changent peu souvent, pensez à augmenter cette valeur.

Gestion des données

Options de configuration
Nom | Défaut | Modifiable | Historique
arg_separator.output | "&" | PHP_INI_ALL |
arg_separator.input | "&" | PHP_INI_PERDIR |
variables_order | "EGPCS" | PHP_INI_PERDIR |
request_order | "" | PHP_INI_SYSTEM|PHP_INI_PERDIR |
auto_globals_jit | "1" | PHP_INI_PERDIR |
register_argc_argv | "1" | PHP_INI_PERDIR |
enable_post_data_reading | "1" | PHP_INI_PERDIR | Disponible à partir de PHP 5.4.0
post_max_size | "8M" | PHP_INI_PERDIR |
auto_prepend_file | NULL | PHP_INI_PERDIR |
auto_append_file | NULL | PHP_INI_PERDIR |
default_mimetype | "text/html" | PHP_INI_ALL |
default_charset | "UTF-8" | PHP_INI_ALL |
input_encoding | "" | PHP_INI_ALL |
output_encoding | "" | PHP_INI_ALL |
internal_encoding | "" | PHP_INI_ALL |

Voici un éclaircissement sur l'utilisation des directives de configuration.

arg_separator.output string

Le séparateur utilisé lorsque PHP génère les URL pour séparer les arguments.

arg_separator.input string

Liste des séparateur(s) utilisé(s) par PHP pour analyser les URL entrantes et en déduire les valeurs.

Note:

Chaque caractère de cette directive est considéré comme étant un séparateur !

variables_order string

Définit l'ordre d'analyse des variables EGPCS (Environment, Get, Post, Cookie, et Server). Par exemple, si variables_order est défini à "SP" alors PHP créera superglobals $_SERVER et $_POST, maisne créera pas $_ENV, $_GET, et $_COOKIE. Le fait de définir cet ordre à "" signifie qu'aucune superglobals ne sera définie.

Avertissement

En SAPIs CGI et FastCGI, $_SERVER est également peuplé de valeur de l'environnement ; S est toujours équivalent à ES au regard de la position de E autre part dans cette directive.

Note:

Le contenu et l'ordre de $_REQUEST sont également affectés par cette directive.

request_order string

Cette directive décrit l'ordre dans lequel PHP place les variables GET, POST et Cookie dans le tableau _REQUEST. Le placement s'effectue de la gauche vers la droite, les valeurs les plus récentes écrasant les valeurs plus anciennes.

Si cette directive n'est pas définie, variables_order est utilisé pour le contenu de $_REQUEST.

Notez que les fichiers php.ini de la distribution par défaut ne contiennent pas 'C' pour les cookies, ceci pour des raisons de sécurité.

auto_globals_jit bool

Quand cette directive est activée, les variables SERVER , REQUEST et ENV sont créées lorsqu'elles sont utilisées : seulement si nécessaire. Si ces variables ne sont pas utilisées dans un script, le script verra un gain de performances.

Avertissement

L'utilisation des variables SERVER, REQUEST et ENV est vérifiée lors de la compilation. Ainsi, les utiliser avec, par exemple, des variables dynamiques ne provoquera pas leur initialisation.

register_argc_argv bool
Dit à PHP s'il doit déclarer ou non les variables argv et argc (qui contiendront les informations GET). Voir aussi les lignes de commande.
enable_post_data_reading bool
Le fait de désactiver cette option fera que les variables $_POST et $_FILES ne seront pas peuplées. La seule façon de lire les données transmises sera alors d'utiliser le gestionnaire de flux php://input. Ceci peut être intéressant pour les requêtes via un proxy ou pour analyser les données transmises directement en mémoire.
post_max_size int
Définit la taille maximale des données reçues par la méthode POST. Cette option affecte également les fichiers chargés. Pour charger de gros fichiers, cette valeur doit être plus grande que la valeur de upload_max_filesize. De façon générale, memory_limit doit être plus grand que post_max_size. Lorsqu'un entier est utilisé, sa valeur est mesurée en octets. Vous pouvez également utiliser la notation sténographique comme décrit dans cette entrée de la FAQ.. Dans le cas où la taille des données reçues par la méthode POST est plus grande que post_max_size, les superglobales $_POST et $_FILES seront vides. Ceci peut être surveillé de différentes façons, e.g. en passant une variable $_GET au script qui traite les données, i.e. <form action="edit.php?processed=1">, et ainsi vérifier si $_GET['processed'] est défini.

Note:

PHP autorise des mots-clés pour les octets, incluant K (kilo), M (méga) et G (giga). PHP effectue la conversion automatiquement si vous les utilisez. Soyez attentif de ne pas dépasser la limite d'un entier signé sur 32 bits (si vous utilisez les versions 32 bits), auquel cas votre script échouera.

Historique pour post_max_size
Version | Description
5.3.4 | post_max_size = 0 ne va pas désactiver la limite lorsque le type de contenu est application/x-www-form-urlencoded ou s'il n'est pas enregistré avec PHP.
5.3.2 , 5.2.12 | Permet une taille d'envoi illimitée en définissant post_max_size à 0.

auto_prepend_file string

Spécifie le nom d'un fichier qui sera automatiquement parcouru avant le fichier principal. Ce fichier est inclus comme s'il l'avait été avec la fonction require, donc include_path est utilisé.

La valeur spéciale none désactive l'ajout automatique.

auto_append_file string

Spécifie le nom du fichier qui sera automatiquement parcouru après le fichier principal. Ce fichier est inclus comme s'il l'avait été avec la fonction require, donc include_path est utilisé.

La valeur spéciale none désactive l'ajout automatique.

Note: Si le script se termine par la fonction exit(), l'ajout automatique ne se fera pas.

default_mimetype string

Par défaut, PHP va envoyer le type de média en utilisant l'entête Content-Type. Pour désactiver ceci, laissez vide cette valeur.

Le type de média défini par défaut dans PHP est text/html.

default_charset string

"UTF-8" est la valeur par défaut et celle ci est utilisé comme jeu de caractères par défaut pour les fonctions et modules. PHP enverra toujours un jeu de caractères par défaut pour htmlentities(), html_entity_decode() et htmlspecialchars() si le paramètre encoding est omis. La valeur de default_charset sera également utilisée pour définir le jeu de caractères par défaut pour les fonctions iconv si les options de configuration iconv.input_encoding, iconv.output_encoding et iconv.internal_encoding ne sont pas définies, et pour les fonctions mbstring si les options de configuration mbstring.http_input, mbstring.http_output et mbstring.internal_encoding ne sont pas définies.

Toutes les versions de PHP vont utiliser cette valeur comme jeu de caractères par défaut dans l'en-tête par défaut Content-Type envoyé par PHP si l'en-tête n'est pas écrasé via un appel à la fonction header().

Définir un default_charset à une valeur vide n'est pas recommandé.

input_encoding string

Ce paramètre est utilisé pour les modules multibytes tels que mbstring et iconv. Vide par défaut.

output_encoding string

Ce paramètre est utilisé pour les modules multibytes tels que mbstring et iconv. Vide par défaut.

internal_encoding string

Ce paramètre est utilisé pour les modules multibytes tels que mbstring et iconv. Vide par défaut. Si vide alors, default_charset est utilisé.

Voir aussi : magic_quotes_gpc, magic_quotes_runtime et magic_quotes_sybase.

Chemins et répertoires

Options de configuration
Nom | Défaut | Modifiable | Historique
include_path | ".;/chemin/vers/php/pear" | PHP_INI_ALL |
open_basedir | NULL | PHP_INI_ALL |
doc_root | NULL | PHP_INI_SYSTEM |
user_dir | NULL | PHP_INI_SYSTEM |
user_ini.cache_ttl | "300" | PHP_INI_SYSTEM |
user_ini.filename | ".user.ini" | PHP_INI_SYSTEM |
extension_dir | "/chemin/vers/php" | PHP_INI_SYSTEM |
extension | NULL | php.ini uniquement |
zend_extension | NULL | php.ini uniquement |
cgi.check_shebang_line | "1" | PHP_INI_SYSTEM |
cgi.discard_path | "0" | PHP_INI_SYSTEM |
cgi.fix_pathinfo | "1" | PHP_INI_SYSTEM |
cgi.force_redirect | "1" | PHP_INI_SYSTEM |
cgi.nph | "0" | PHP_INI_SYSTEM | Disponible à partir de PHP 5.3.0.
cgi.redirect_status_env | NULL | PHP_INI_SYSTEM |
cgi.rfc2616_headers | "0" | PHP_INI_ALL |
fastcgi.impersonate | "0" | PHP_INI_SYSTEM |
fastcgi.logging | "1" | PHP_INI_SYSTEM |

Voici un éclaircissement sur l'utilisation des directives de configuration.

include_path string

Spécifie une liste de répertoires où les fonctions require, include, fopen(), file(), readfile() et file_get_contents() chercheront les fichiers. Le format est identique à la variable d'environnement système PATH : une liste de répertoires séparés par deux points (:) sous Unix ou par un point-virgule (;) sous Windows.

PHP considère chaque entrée du chemin d'inclusion séparément lors de la recherche des fichiers à inclure. Il va vérifier le premier chemin, et s'il ne trouve pas le fichier, il va vérifier le chemin suivant, jusqu'à ce qu'il trouve le fichier à inclure ou bien retourner une alerte de type E_WARNING ou de type E_ERROR. utilisant la fonction set_include_path().

Exemple #1 include_path sous Unix

include_path=".:/php/includes"

Exemple #2 include_path sous Windows

include_path=".;c:\php\includes"

L'utilisation d'un point (.) dans le chemin d'inclusion vous permet de faire des inclusions relatives au répertoire courant. Cependant, il est plus efficace d'inclure explicitement un fichier avec include './file', que de demander à PHP de vérifier le dossier courant à chaque inclusion.

Note:

Les variables ENV sont aussi disponibles dans les fichiers .ini. Aussi, il est possible de faire référence au dossier home en utilisant la syntaxe ${LOGIN} et ${USER}.

Les variables d'environnement peuvent varier suivant les APIs Serveur, tout comme elles peuvent varier suivant les environnements.

Exemple #3 include_path sous Unix en utilisant la variable d'environnement ${USER}

include_path = ".:${USER}/pear/php"

open_basedir string

Limite les fichiers pouvant être accédés par PHP à une architecture de dossiers spécifique, incluant le fichier lui-même. Cette directive n'est PAS affectée par le Safe Mode.

Lorsqu'un script tente d'accéder à un fichier avec, par exemple, la fonction include ou la fonction fopen(), le chemin vers le fichier est analysé. Lorsque le fichier se trouve à l'extérieur de l'architecture de dossiers spécifié, PHP refusera d'y accéder. Tous les liens symboliques sont résolus, aussi, il n'est pas possible d'outre-passer cette restriction avec un lien symbolique. Si le fichier n'existe pas, alors le lien symbolique ne pourra être résolu et le nom du fichier est comparé avec l'open_basedir.

L'option open_basedir peut affecter plus que les fonctions du système de fichiers ; par exemple, si MySQL est configuré pour utiliser le driver mysqlnd, LOAD DATA INFILE sera affecté par l'option open_basedir. Le plupart des extensions de PHP utilise l'option open_basedir de cette façon.

La valeur spéciale . indique que le dossier courant du script sera utilisé comme dossier de base.Ceci est cependant légèrement dangereux dans le sens où le dossier courant peut être facilement changé grâce à la fonction chdir().

Dans le fichier httpd.conf, open_basedir peut être désactivée (i.e. pour certains hôtes virtuels) de la même façon que n'importe quelle directive de configuration avec "php_admin_value open_basedir none".

Sous Windows, séparez les dossiers avec un point-virgule. Sous tous les autres systèmes, séparez les dossiers avec des deux-points. Lors de l'utilisation d'Apache en module, les chemins de l'open_basedir depuis les dossiers parents sont maintenant automatiquement hérités.

La restriction spécifié avec l'open_basedir est un nom de dossier, et non pas un préfixe.

Par défaut, tous les fichiers peuvent être ouverts.

Note:

open_basedir peut être affinée au moment de l'exécution. Ceci signifie que si open_basedir est définie à /www/ dans le fichier php.ini, un script peut affiner la configuration en /www/tmp/ au moment de l'exécution en utilisant la fonction ini_set(). Lors d'un parcours de plusieurs dossiers, vous pouvez utiliser la constante PATH_SEPARATOR suivant le système d'exploitation.

Note:

Utiliser open_basedir définira realpath_cache_size à 0 et ainsi désactive le cache realpath.

doc_root string

Le dossier racine de PHP sur le serveur. Uniquement utilisé si non vide. Si PHP n'a pas été compilé avec FORCE_REDIRECT, vous devez définir le doc_root si vous utilisez PHP en tant que CGI sous n'importe quel serveur web (autre que IIS). Alternativement, vous pouvez utiliser la configuration cgi.force_redirect.

user_ini.cache_ttl int

user_ini.filename string

user_dir string

Le nom de base du répertoire utilisé dans un répertoire utilisateur pour les fichiers PHP, par exemple, public_html.

extension_dir string

Spécifie le répertoire dans lequel PHP doit chercher des extensions externes à charger. Voir aussi enable_dl et dl().

extension chaîne de caractères

Quelles extensions doivent être chargées dynamiquement lors du démarrage de PHP.

zend_extension string

Nom de l'extension Zend chargeable dynamiquement (par exemple XDebug) à charger lors du démarrage de PHP.

cgi.check_shebang_line booléen

Contrôle si PHP CGI vérifie la ligne commençant par #! (shebang) en haut du script exécuté. Cette ligne est nécessaire si le script est destiné à être exécuté en mode autonome et via un PHP CGI. PHP en mode CGI ne lit pas cette ligne et ignore son contenu si cette directive est active.

cgi.discard_path bool

Si activé, le binaire PHP CGI peut être placé en dehors de l'arbre web en toute sécurité et les personnes ne seront pas capable contourner la sécurité .htaccess.

cgi.fix_pathinfo booléen

Fournit un réel PATH_INFO/ PATH_TRANSLATED pour CGI. Le comportement précédent de PHP était de définir PATH_TRANSLATED en SCRIPT_FILENAME et de ne pas remplir PATH_INFO. Pour plus d'informations sur PATH_INFO, lisez les spécificités CGI. Si définie à 1, PHP CGI fixera ce chemin suivant les spécifications. Si définie à 0, PHP appliquera l'ancien comportement. Par défaut, cette directive est activée. Vous devriez modifier vos scripts pour utiliser SCRIPT_FILENAME à la place de PATH_TRANSLATED.

cgi.force_redirect bool

cgi.force_redirect est nécessaire pour des raisons de sécurité lors de l'utilisation de PHP en mode CGI sous la plupart des serveurs web. Si vous ne la définissez pas, PHP l'activera automatiquement par défaut. Vous pouvez la désactiver à vos risques et périls.

Note:

Utilisateurs de Windows : Lors de l'utilisation de IIS, cette option doit est désactivée ; pareil pour OmniHTTPD et Xitami.

cgi.nph bool

Si cgi.nph est activé, il forcera CGI à toujours envoyer le Status: 200 avec chaque requête.

cgi.redirect_status_env string

Si cgi.force_redirect est activé et que vous ne tournez pas sous un serveur web Apache ou Netscape (iPlanet), vous devriez avoir besoin de définir un nom de variable d'environnement que PHP utilisera pour voir si tout est correct pour continuer l'exécution.

Note:

La définition de cette variable peut avoir des conséquences sur la sécurité. Sachez ce que vous faites avant de faire cela.

cgi.rfc2616_headers int

Dit à PHP quel type d'en-tête doit être utilisé lors de l'envoi du code réponse HTTP. Si définie à 0, PHP enverra un en-tête "Status:" (» RFC 3875) qui est supporté par Apache et les autres serveurs web. Lorsque définie à -1, PHP enverra un en-tête répondant à la spécification de la » RFC 2616.

Si cette option est activée, et que vous exécutez PHP en environnement CGI (e.g. PHP-FPM), vous ne devriez pas utiliser les en-têtes de réponse HTTP "status" RFC 2616, mais plutôt utiliser l'équivalent RFC 3875, i.e. au lieu de l'en-tête ("HTTP/1.0 404 Not found"), utilisez ("Status: 404 Not Found").

Laissez ce paramètre à 0 à moins que vous savez parfaitement ce que vous faîtes.

fastcgi.impersonate string

FastCGI sous IIS (sur les systèmes d'exploitation basés sur WINNT) supporte la possibilité de déterminer la marque de sécurité du client appelant. Cela permet à IIS de définir le contexte de sécurité sur lequel la requête est exécuté. mod_fastcgi sous Apache ne supporte actuellement pas cette fonctionnalité (03/17/2002). Définie à 1 si vous utilisez IIS. Par défaut, vaut 0.

fastcgi.logging bool

Active la journalisation SAPI avec FastCGI. Activé par défaut.

Chargement de fichiers

Options de configuration
Nom | Défaut | Modifiable | Historique
file_uploads | "1" | PHP_INI_SYSTEM |
upload_tmp_dir | NULL | PHP_INI_SYSTEM |
max_input_nesting_level | 64 | PHP_INI_PERDIR |
max_input_vars | 1000 | PHP_INI_PERDIR |
upload_max_filesize | "2M" | PHP_INI_PERDIR |
max_file_uploads | 20 | PHP_INI_SYSTEM |

Voici un éclaircissement sur l'utilisation des directives de configuration.

file_uploads bool

Autorise ou non le chargement de fichiers par HTTP. Voir aussi les directives upload_max_filesize, upload_tmp_dir et post_max_size.

upload_tmp_dir string

Le répertoire temporaire utilisé pour stocker les fichiers lors du chargement. L'utilisateur sous lequel fonctionne PHP doit avoir les droits en écriture sur ce répertoire. Si non spécifié, PHP utilisera celui par défaut du système.

Si le dossier renseigné ici n'est pas accessible en écriture, PHP se rabat alors sur le dossier temporaire par défaut du système. Si open_basedir est activé, alors le dossier temporaire par défaut du système doit être autorisé pour que le chargement des fichiers puisse fonctionner.

upload_max_filesize int

La taille maximale en octets d'un fichier à charger.

Lorsqu'un entier est utilisé, sa valeur est mesurée en octets. Vous pouvez également utiliser la notation sténographique comme décrit dans cette entrée de la FAQ..
max_file_uploads entier

Le nombre maximum de fichiers pouvant être envoyés simultanément. Depuis PHP 5.3.4, les champs de téléchargement laissés vides lors de la soumission ne comptent plus dans le calcul de cette limite.

SQL général

Options de configuration
Nom | Défaut | Modifiable | Historique
sql.safe_mode | "0" | PHP_INI_SYSTEM | Supprimé à partir de PHP 7.2.0

Voici un éclaircissement sur l'utilisation des directives de configuration.

sql.safe_mode bool

Si activé, les fonctions de connexion à la base de données qui spécifient des valeurs par défaut utiliseront ces valeurs au lieu des arguments fournis. Pour les valeurs par défaut, reportez-vous à la documentation des fonctions de connexion pour la base de données concernée.

Avertissement

Cette fonctionnalité a été SUPPRIMÉE à partir de PHP 7.2.0.

Spécifique à Windows

Options de configuration spécifiques à Windows
Nom | Défaut | Modifiable | Historique
windows.show_crt_warning | "0" | PHP_INI_ALL |

Voici un éclaircissement sur l'utilisation des directives de configuration.

windows.show_crt_warning bool

This directive shows the Windows CRT warnings when enabled.

User Contributed Notes

Simone Pellegatta 19-Jan-2021 12:08
Be careful while using auto_prepend_file.

When the custom exception handler, set by set_exception_handler(), handles an uncaught exception, it interrupts the execution of every script.

If the script with the unhandled exception has been automatically prepended or included by an automatically prepended script, however, the main script will continue running anyway.

This could cause several issues: when we think that throwing an exception would automatically interrupt the current application, a whole chunk of code is going to run anyway.
Anton Bannikov 22-Apr-2020 02:40
I had a problem with 'open_basedir =' string in php.ini. This string was writtren in VirtualHost Directory directive of Apache2 and successfully rewrote the same php.ini setting! It happened with VestaCP, but I think, it's a common way. Goog luck!
luisdev 03-Mar-2020 02:59
https://haydenjames.io/understanding-php-memory_limit/ explains the memory_limit setting nicely.
diamondeagle at webmail dot co dot za 15-Aug-2019 11:14
Note regarding the upload_tmp_dir setting and UNC Paths:

When using PHP on Windows OS and IIS FastCGI, if you need to use a UNC path to a folder on a network drive for the upload_tmp_dir setting then you must use three \ characters at the front of the UNC path.

Windows and PHP use the first slash as an escape character, so if you only use two slashes then it passes a UNC path with just one backslash. That is not valid for UNC paths and you many experience problems when uploading files, such as errors saying that "PHP is missing a temporary folder".

Correct:
upload_tmp_dir = "\\\path\to\your\folder"

Incorrect:
upload_tmp_dir = "\\path\to\your\folder"
alaa morad 09-Jan-2019 08:16
add enctype="multipart/form-data" to your <form> tag or it will not upload any file even if file_uploads=on
ex:
<form method="POST" action="upload. php" enctype="multipart/form-data">
// form contents
</form>
abc500x500 at gmail dot com 26-Aug-2017 08:10
Please illuminate this:
memory_limit=128mb meaning which?

1-per script only then if in a moment 1000 user request php script maximum only 128mb of server ram use6 by script.
2-per script + per user if in a moment 1000 user request a php script about 1000*128mb=128gb ram use by script.
Thanks
Adam 27-Jan-2017 02:51
Remember that `open_basedir` restriction does not affect exec functions. As long as you do not disable exec functions (see `disable_functions`, users will be able to use `exec("/bin/cat [...]")` to access sensitive world readable files.
fernandobasso dot br at gmail dot com 17-Oct-2016 08:06
This might help in case someone happens to maintain old applications with a charset other than utf-8.

According to the docs, you can override the default charset if you use `header()`.

Suppose php.ini sets the default_charset to "UTF-8", but you need a legacy charset, like ISO-8859-1.

Still,

<?php header('Content-Type: text/html; Charset=ISO-8859-1'); ?>

would not override the charset, just add it as well and the result
was a response header like (note the two charsets):

    Content-Type:"text/html; Charset=ISO-8859-1;CHARSET=Windows-1252"

I found it strange the default one as `charset` with a lowercase `c`
as opposed to my custom charset with an uppercase `C`.

What solved was to _override_ the charset using all lowercase letters
as well for the word “charset”:

<?php header('content-type: text/html; charset=ISO-8859-1'); ?>

Then, the double charset from the response headers disappeared, and only the single, custom charset remained.
dougal at gunters dot org 03-Mar-2016 05:11
It appears that if you use both the 'include_path' directives and 'open_basedir', that file searches will hit the include path *first*, before local files. But if 'open_basedir' is not in use, then local files are found first. For example, suppose you have code in '/var/www/myfile.php' which does:

<?php
  require_once('config.php');
?>

Further, assume that there is a local file '/var/www/config.php', and there is also a file '/var/local/php/config.php'.

Next, if your php.ini has:

  include_path = /var/local/php/

Normally, this would look for '/var/www/config.php' first, and if not found, then it would try '/var/local/php/config.php'.

But if you also have this in php.ini:

  open_basedir = /var/www/:/var/local/php/

Then the require would reverse the order of the search, and load '/var/local/php/config.php', even when the local 'config.php' file exists.

Furthermore, if include_path contains directories not in open_basedir, you can end up with a fatal error. For example, change the directive to:

  open_basedir = /var/www/:/var/local/includes/php/

Now the require will first find '/var/local/php/config.php' from the include_path, try to include it, but be unable to because of the open_basedir restrictions.
txyoji at yahoo dot com 21-Nov-2013 08:24
If you enable "open_basedir" option, it will disable the realpath_cache. This can be a significant performance hit.

https://bugs.php.net/bug.php?id=53263
michael dot buergi at gmx dot net 08-May-2013 06:18
the ini-setting "detect_unicode" is indeed "zend.detect_unicode" (according to the phpinfo of my 5.4.4)
iko at vision dot sk 01-May-2012 08:49
auto_globals_jit setting is also affecting $_REQUEST superglobal in 5.3 It is not explicitly stated in documentation.
kghbln 17-Nov-2011 03:09
Adding multiple directories to open_basedir:

open_basedir = "/var/www/htdocs/:/var/www/tmp/" adds both paths /var/www/htdocs/ and /var/www/tmp/. Do not forget the trailing slash, otherwise the last directory will be considered as a prefix (< 5.3.4).

On Windows you use ; as the seperator.
AntonioK 10-Mar-2011 05:29
Note that there is no way to disable eval() work by using disable_functions directive, because eval() is a language construct and not a function.

Many people advise to disable such potentially-insecure functions like system(), exec(), passthru(), eval() and so on in php.ini when not running in safe mode, but eval() would still work even it listed in disable_functions.
rlammers at linuxmail dot org 09-Jan-2011 04:23
This is a possible solution for a problem which seems to be a php-ini-problem but is not.

If a $_POST is used with large fields e.g. textarea's with more than 120kb characters php returns a blank screen, even if the max_post_size is 8M.

This problem may be caused by an apache-module SecFilter.

Adding the following lines to the .htaccess solves the problem.
SecFilterEngine Off
SecFilterScanPOST Off

I know this is not a php-issue, but i'm still posting it here since it looks like it is a php-problem and I did not find any sites or forums offering this solution.
amolitor at molitor-design dot com 10-Feb-2010 03:23
Amusingly, the include_path logically includes the current directory of the running file as the last entry all the time anyways, so part of the business about shoving "." into the include_path is spurious -- it's "there" on the end all the time, at least in the 5.2.12 source (see main/fopen_wrappers.c around line 503).

This one had me goin' for a while.
mrok at mrok dot com 22-Mar-2009 08:29
Note that on some Unix systems (i.e. PHP 5.1.6 on Centos 5.2) include_path in php.ini should NOT be quoted.

For example, instead of

 include_path='.:/usr/share/php'

use

 include_path=.:/usr/share/php

Using quotes does not cause any error message, but all of your require_once() directives will fail (indicating that file could not be opened) - unless full path to target file is provided.
leo at korfu dot cz 29-May-2006 03:45
"If the size of post data is greater than post_max_size..."

It seems that a more elegant way is comparison between post_max_size and $_SERVER['CONTENT_LENGTH']. Please note that the latter includes not only size of uploaded file plus post data but also multipart sequences. Leo
csg at DEL_THISdiatom dot de 02-Sep-2005 02:55
Starting with PHP 4.4.0 (at least PHP version 4.3.10 did have old, documented behaviour) interpretation of value of "session.save_path" did change in conjunction with "save_mode" and "open_basedir" enabled.

Documented ( http://de.php.net/manual/en/ref.session.php#ini.session.save-path ):
  Values of "session.save_path" should or may be  **without**  ending slash.
  For instance:
<?php
  // Valid only  *before* PHP 4.4.0:
  ini_set( "session.save_path", "/var/httpd/kunde/phptmp" );
?> will mean:
  The directory "/var/httpd/kunde/phptmp/" will be used to write data and therefore must be writable by the web server.

Starting with PHP 4.4.0 the server complains that "/var/httpd/kunde/" is not writable.
Solution: Add an ending slash in call of ini_set (or probably whereever you set "session.save_path"), e.g.:
<?php
  // Note the slash on ".....phptmp/":
  ini_set( "session.save_path", "/var/httpd/kunde/phptmp/" );
?>

Hope, that does help someone.


Catégorie/Liste des extensions

Sommaire

  • Par ordre alphabétique
  • Adhésion
  • État

Cette annexe classe par catégorie plus de 150 extensions documentées dans le manuel PHP suivant différents critères.

User Contributed Notes

There are no user contributed notes for this page.


Par ordre alphabétique

  • Apache
  • APCu
  • Les tableaux
  • BC Math
  • Bzip2
  • Calendar
  • Classkit
  • Classes/Objets
  • COM
  • CSPRNG
  • ctype
  • CUBRID
  • cURL
  • Date/Heure
  • DBA
  • dBase
  • DB++
  • Direct IO
  • Les dossiers
  • DOM
  • Data Structures
  • Eio
  • Enchant
  • Gestion des erreurs
  • Ev
  • Event
  • Exécution de programme
  • Exif
  • Expect
  • FANN
  • FANN
  • FrontBase
  • FDF
  • Fileinfo
  • filePro
  • Système de fichiers
  • Filter
  • Gestionnaire de processus FastCGI
  • FTP
  • Gestion des fonctions
  • Gearman
  • Gender
  • GeoIP
  • Gettext
  • Gmagick
  • GMP
  • GnuPG
  • Hash
  • HRTime
  • Firebird/InterBase
  • IBM DB2
  • iconv
  • GD
  • ImageMagick
  • IMAP
  • Options PHP et informations PHP
  • Ingres
  • Inotify
  • intl
  • JSON
  • LDAP
  • libxml
  • Lua
  • LZF
  • Mail
  • Mailparse
  • Math
  • Chaînes de caractères multi-octets
  • Mcrypt
  • Memcache
  • Memcached
  • Memtrack
  • Mhash
  • Misc.
  • Mongo
  • MongoDB\BSON
  • MongoDB\Driver
  • mqseries
  • MySQL (Original)
  • MySQLi
  • Mysqlnd
  • mysqlnd_memcache
  • mysqlnd_ms
  • mysqlnd_mux
  • mysqlnd_qc
  • mysqlnd_uh
  • Ncurses
  • Réseau
  • OAuth
  • OCI8
  • OPcache
  • OpenAL
  • OpenSSL
  • Contrôle de l'affichage
  • Paradox
  • Parle
  • Table de hachage de mot de passe
  • PCNTL
  • PCRE
  • PDO
  • CUBRID (PDO)
  • MS SQL Server (PDO)
  • Firebird (PDO)
  • IBM (PDO)
  • Informix (PDO)
  • MySQL (PDO)
  • Oracle (PDO)
  • ODBC et DB2 (PDO)
  • PostgreSQL (PDO)
  • SQLite (PDO)
  • MS SQL Server (PDO)
  • PostgreSQL
  • Phar
  • POSIX
  • Proctitle
  • PS
  • Pspell
  • pthreads
  • Quickhash
  • Radius
  • Rar
  • Readline
  • Recode
  • Réflection
  • Regex POSIX
  • RRD
  • ScoutAPM
  • Seaslog
  • Semaphore
  • Sessions
  • Mémoire partagée
  • SimpleXML
  • SNMP
  • SOAP
  • Sockets
  • Sodium
  • Solr
  • Sphinx
  • SPL
  • SQLite3
  • SQLSRV
  • ssdeep
  • SSH2
  • Statistics
  • Stomp
  • Flux
  • Chaîne de caractères
  • SVM
  • SVN
  • Swoole
  • Sync
  • Taint
  • TCP
  • Tidy
  • Tokenizer
  • tokyo_tyrant
  • Trader
  • UI
  • ODBC
  • uopz
  • URLs
  • V8js
  • Gestion des variables
  • Varnish
  • WDDX
  • Weakref
  • win32service
  • WinCache
  • wkhtmltox
  • xattr
  • xdiff
  • Xhprof
  • Analyseur syntaxique XML
  • XMLDiff
  • XMLReader
  • XML-RPC
  • XMLWriter
  • XSL
  • Yaconf
  • Yaf
  • Yaml
  • Yar
  • YAZ
  • Zip
  • Zlib
  • 0MQ messaging
  • ZooKeeper

User Contributed Notes

There are no user contributed notes for this page.


Adhésion

Extensions internes

Elles ne sont actuellement pas des extensions. Elles font partie intégrante de PHP et ne peuvent pas être enlevées des binaires PHP avec des options de compilation.

  • Les tableaux

  • Classes/Objets

  • CSPRNG

  • Date/Heure

  • Les dossiers

  • Gestion des erreurs

  • Exécution de programme

  • Système de fichiers

  • Filter

  • Gestion des fonctions

  • Hash

  • Options PHP et informations PHP

  • Mail

  • Math

  • Misc.

  • Réseau

  • Contrôle de l'affichage

  • Table de hachage de mot de passe

  • Phar

  • Réflection

  • Regex POSIX

  • Sessions

  • SPL

  • Flux

  • Chaîne de caractères

  • Tokenizer

  • URLs

  • Gestion des variables

Extensions embarquées

Ces extensions sont embarquées avec PHP.

  • Apache

  • BC Math

  • Calendar

  • COM

  • ctype

  • DBA

  • Exif

  • Fileinfo

  • FTP

  • iconv

  • GD

  • intl

  • JSON

  • Chaînes de caractères multi-octets

  • OPcache

  • PCNTL

  • PCRE

  • PDO

  • POSIX

  • Semaphore

  • Mémoire partagée

  • Sockets

  • SQLite3

  • XML-RPC

  • Zlib

Extensions externes

Ces extensions sont fournies avec PHP mais pour pouvoir les compiler, des bibliothèques externes peuvent être nécessaires.

  • Bzip2

  • cURL

  • dBase

  • DOM

  • Enchant

  • FrontBase

  • Gettext

  • GMP

  • Firebird/InterBase

  • IMAP

  • LDAP

  • libxml

  • Mcrypt

  • Mhash

  • MySQL (Original)

  • MySQLi

  • Mysqlnd

  • OCI8

  • OpenSSL

  • MS SQL Server (PDO)

  • Firebird (PDO)

  • MySQL (PDO)

  • Oracle (PDO)

  • ODBC et DB2 (PDO)

  • PostgreSQL (PDO)

  • SQLite (PDO)

  • PostgreSQL

  • Pspell

  • Readline

  • Recode

  • SimpleXML

  • SNMP

  • SOAP

  • Sodium

  • Tidy

  • ODBC

  • WDDX

  • Analyseur syntaxique XML

  • XMLReader

  • XMLWriter

  • XSL

  • Zip

Extensions PECL

Ces extensions sont disponibles depuis » PECL. Elles peuvent nécessiter des bibliothèques externes. Plus d'extensions PECL existent mais elles ne sont pas encore documentées dans le manuel de PHP.

  • Classkit

  • CUBRID

  • DB++

  • Direct IO

  • Eio

  • Ev

  • Event

  • Expect

  • FDF

  • filePro

  • Gearman

  • Gender

  • GeoIP

  • Gmagick

  • GnuPG

  • IBM DB2

  • ImageMagick

  • Ingres

  • Inotify

  • Lua

  • LuaSandbox

  • LZF

  • Mailparse

  • Memcache

  • Memcached

  • Memtrack

  • Mongo

  • mqseries

  • mysqlnd_memcache

  • mysqlnd_ms

  • mysqlnd_mux

  • mysqlnd_qc

  • mysqlnd_uh

  • Ncurses

  • OAuth

  • OpenAL

  • Paradox

  • CUBRID (PDO)

  • IBM (PDO)

  • Informix (PDO)

  • MS SQL Server (PDO)

  • Proctitle

  • PS

  • pthreads

  • Quickhash

  • Radius

  • Rar

  • RRD

  • runkit7

  • ScoutAPM

  • Seaslog

  • Solr

  • Sphinx

  • SQLSRV

  • ssdeep

  • SSH2

  • Statistics

  • Stomp

  • Swoole

  • SVM

  • SVN

  • Taint

  • TCP

  • tokyo_tyrant

  • Trader

  • V8js

  • Varnish

  • Weakref

  • win32service

  • WinCache

  • xattr

  • xdiff

  • Xhprof

  • Yaf

  • Yaml

  • YAZ

  • ZooKeeper

User Contributed Notes

There are no user contributed notes for this page.


État

Cette partie liste les extensions non prévues pour un environnement de production - elles sont soit trop "vieilles" (obsolètes), soit trop "nouvelles" (expérimentales).

Extensions obsolètes

Ces extensions ont été dépréciées habituellement en faveur d'autres extensions.

  • Memtrack

Extensions expérimentales

Le comportement de ces extensions - incluant le nom de ses fonctions et tout ce qui est documenté à propos de ces extensions - peut être modifié sans aucun avertissement dans les prochaines versions de PHP. Utilisez ces extensions à vos risques et périls.

  • DB++

  • Hash

  • ImageMagick

  • Ncurses

  • Paradox

  • MS SQL Server (PDO)

  • Firebird (PDO)

  • Oracle (PDO)

  • PS

  • XML-RPC

User Contributed Notes

There are no user contributed notes for this page.


Liste des alias

Il y a beaucoup de fonctions en PHP qui peuvent être appelées sous différents noms. Dans la plupart des cas, il n'y pas de nom préféré par rapport à un autre, is_int() et is_integer() sont exactement identiques, par exemple. Ces modifications de noms ont été réalisées en général à cause d'un changement dans l'API d'origine ou pour d'autres raisons et les anciens noms sont conservés uniquement pour des raisons de compatiblité ascendante. C'est une très mauvaise habitude d'utiliser ces alias, car ils risquent à tous moment de disparaître, rendus obsolète sans préavis, ou bien par un simple changement de nom, ce qui rend votre script inutilisable avec des versions plus récentes de PHP. Préférez toujours les versions officielles. En fait, cette liste est surtout destinée à ceux qui doivent mettre à jour leurs scripts avec les syntaxes plus récentes.

Aliases
Alias | Fonction principale | Extension mère
_ | gettext() | Gettext
chop | rtrim() | Base syntax
close | closedir() | Base syntax
com_get | com_propget() | COM
com_propset | com_propput() | COM
com_set | com_propput() | COM
die | exit() | Miscellaneous functions
diskfreespace | disk_free_space() | Filesystem
doubleval | floatval() | Base syntax
fbsql | fbsql_db_query() | FrontBase
fputs | fwrite() | Base syntax
gzputs | gzwrite() | Zlib
i18n_convert | mb_convert_encoding() | Multi-bytes Strings
i18n_discover_encoding | mb_detect_encoding() | Multi-bytes Strings
i18n_http_input | mb_http_input() | Multi-bytes Strings
i18n_http_output | mb_http_output() | Multi-bytes Strings
i18n_internal_encoding | mb_internal_encoding() | Multi-bytes Strings
i18n_ja_jp_hantozen | mb_convert_kana() | Multi-bytes Strings
i18n_mime_header_decode | mb_decode_mimeheader() | Multi-bytes Strings
i18n_mime_header_encode | mb_encode_mimeheader() | Multi-bytes Strings
imap_create | imap_createmailbox() | IMAP
imap_fetchtext | imap_body() | IMAP
imap_getmailboxes | imap_list_full() | IMAP
imap_getsubscribed | imap_lsub_full() | IMAP
imap_header | imap_headerinfo() | IMAP
imap_listmailbox | imap_list() | IMAP
imap_listsubscribed | imap_lsub() | IMAP
imap_rename | imap_renamemailbox() | IMAP
imap_scan | imap_listscan() | IMAP
imap_scanmailbox | imap_listscan() | IMAP
ini_alter | ini_set() | Base syntax
is_double | is_float() | Base syntax
is_integer | is_int() | Base syntax
is_long | is_int() | Base syntax
is_real | is_float() | Base syntax
is_writeable | is_writable() | Base syntax
join | implode() | Base syntax
key_exists | array_key_exists() | Base syntax
ldap_close | ldap_unbind() | LDAP
magic_quotes_runtime | set_magic_quotes_runtime() | Base syntax
mbstrcut | mb_strcut() | Multi-bytes Strings
mbstrlen | mb_strlen() | Multi-bytes Strings
mbstrpos | mb_strpos() | Multi-bytes Strings
mbstrrpos | mb_strrpos() | Multi-bytes Strings
mbsubstr | mb_substr() | Multi-bytes Strings
mysql | mysql_db_query() | MySQL
mysql_createdb | mysql_create_db() | MySQL
mysql_db_name | mysql_result() | MySQL
mysql_dbname | mysql_result() | MySQL
mysql_dropdb | mysql_drop_db() | MySQL
mysql_fieldflags | mysql_field_flags() | MySQL
mysql_fieldlen | mysql_field_len() | MySQL
mysql_fieldname | mysql_field_name() | MySQL
mysql_fieldtable | mysql_field_table() | MySQL
mysql_fieldtype | mysql_field_type() | MySQL
mysql_freeresult | mysql_free_result() | MySQL
mysql_listdbs | mysql_list_dbs() | MySQL
mysql_listfields | mysql_list_fields() | MySQL
mysql_listtables | mysql_list_tables() | MySQL
mysql_numfields | mysql_num_fields() | MySQL
mysql_numrows | mysql_num_rows() | MySQL
mysql_selectdb | mysql_select_db() | MySQL
mysql_tablename | mysql_result() | MySQL
ociassignelem | OCICollection::assignElem | OCI8
ocibindbyname | oci_bind_by_name() | OCI8
ocicancel | oci_cancel() | OCI8
ocicloselob | OCILob::close | OCI8
ocicollappend | OCICollection::append | OCI8
ocicollassign | OCICollection::assign | OCI8
ocicollmax | OCICollection::max | OCI8
ocicollsize | OCICollection::size | OCI8
ocicolltrim | OCICollection::trim | OCI8
ocicolumnisnull | oci_field_is_null() | OCI8
ocicolumnname | oci_field_name() | OCI8
ocicolumnprecision | oci_field_precision() | OCI8
ocicolumnscale | oci_field_scale() | OCI8
ocicolumnsize | oci_field_size() | OCI8
ocicolumntype | oci_field_type() | OCI8
ocicolumntyperaw | oci_field_type_raw() | OCI8
ocicommit | oci_commit() | OCI8
ocidefinebyname | oci_define_by_name() | OCI8
ocierror | oci_error() | OCI8
ociexecute | oci_execute() | OCI8
ocifetch | oci_fetch() | OCI8
ocifetchinto | oci_fetch_array(), oci_fetch_row(), oci_fetch_assoc(), oci_fetch_object() | OCI8
ocifetchstatement | oci_fetch_all() | OCI8
ocifreecollection | OCICollection::free | OCI8
ocifreecursor | oci_free_statement() | OCI8
ocifreedesc | oci_free_descriptor() | OCI8
ocifreestatement | oci_free_statement() | OCI8
ocigetelem | OCICollection::getElem | OCI8
ociinternaldebug | oci_internal_debug() | OCI8
ociloadlob | OCILob::load | OCI8
ocilogon | oci_connect() | OCI8
ocinewcollection | oci_new_collection() | OCI8
ocinewcursor | oci_new_cursor() | OCI8
ocinewdescriptor | oci_new_descriptor() | OCI8
ocinlogon | oci_new_connect() | OCI8
ocinumcols | oci_num_fields() | OCI8
ociparse | oci_parse() | OCI8
ocipasswordchange | oci_password_change() | OCI8
ociplogon | oci_pconnect() | OCI8
ociresult | oci_result() | OCI8
ocirollback | oci_rollback() | OCI8
ocisavelob | OCILob::save | OCI8
ocisavelobfile | OCILob::import | OCI8
ociserverversion | oci_server_version() | OCI8
ocisetprefetch | oci_set_prefetch() | OCI8
ocistatementtype | oci_statement_type() | OCI8
ociwritelobtofile | OCILob::export | OCI8
ociwritetemporarylob | OCILob::writeTemporary | OCI8
odbc_do | odbc_exec() | ODBC
odbc_field_precision | odbc_field_len() | ODBC
pg_clientencoding | pg_client_encoding() | PostgreSQL
pg_setclientencoding | pg_set_client_encoding() | PostgreSQL
pos | current() | Base syntax
recode | recode_string() | Recode
show_source | highlight_file() | Base syntax
sizeof | count() | Base syntax
snmpwalkoid | snmprealwalk() | SNMP
strchr | strstr() | Base syntax
xptr_new_context | xpath_new_context() |

User Contributed Notes

There are no user contributed notes for this page.


Mots réservés en PHP

Sommaire

  • Liste de mots-clés
  • Classes prédéfinies
  • Constantes pré-définies
  • Autre liste de mots réservés

Cette annexe est une liste d'identifiants prédéfinis en PHP. Aucun des identifiants utilisés ici ne doit être repris comme nom de variable ou de fonction dans vos scripts, sauf s'il est noté explicitement le contraire. Ces identifiants incluent des mots-clés, des constantes, des classes, et des variables prédéfinies. Ces listes ne sont pas complètes ni exhaustives.

User Contributed Notes

There are no user contributed notes for this page.


Liste de mots-clés

Ces mots ont un sens spécial en PHP. Certains représentent des objets qui ressemblent à des fonctions, d'autres à des constantes, et ainsi de suite, mais ils n'en sont pas vraiment : ce sont des structures de langage. Vous ne pourrez pas les utiliser comme constante, nom de classes, nom de fonctions ou nom de méthodes. Vous pouvez les utiliser comme nom de variables, mais cela risque d'entraîner des confusions.

Depuis PHP 7.0.0, ces mots clés sont autorisés comme propriété, constante et noms de méthodes dans les classes, interfaces, traits, sauf le mot clé class qui ne doit pas être utilisé comme nom de constante.

Mots réservés en PHP
__halt_compiler() | abstract | and | array() | as
break | callable (à partir de PHP 5.4) | case | catch | class
clone | const | continue | declare | default
die() | do | echo | else | elseif
empty() | enddeclare | endfor | endforeach | endif
endswitch | endwhile | eval() | exit() | extends | final | finally (à partir de PHP 5.5) | fn (à partir de PHP 7.4) | for | foreach
function | global | goto (à partir de PHP 5.3) | if | implements
include
include_once | instanceof | insteadof (à partir de PHP 5.4) | interface
isset() | list() | match (à partir de PHP 8.0) | namespace (à partir de PHP 5.3) | new
or | print | private | protected | public
require | require_once | return | static | switch
throw | trait (à partir de PHP 5.4) | try | unset() | use
var | while | xor | yield (à partir de PHP 5.5) | yield from (à partir de PHP 7.0)
Constantes utilisées lors de la compilation
__CLASS__ | __DIR__ (à partir de PHP 5.3) | __FILE__ | __FUNCTION__ | __LINE__ | __METHOD__
__NAMESPACE__ (à partir de PHP 5.3) | __TRAIT__ (à partir de PHP 5.4) |  |  |  |

User Contributed Notes

Johnny D. 22-May-2020 06:37
const FORBIDDEN_TYPES = [
    'null',

    'bool',
    'false',
    'true',

    'int',
    'float',

    'string',
];
bla at taxistop dot be 19-Jul-2018 09:50
This list doesn't include 'self' and 'parent', which I take are indeed keywords.
Thomas Hansen 15-Aug-2016 10:08
Please note that reserved words are still not allowed to be used as namespace or as part of it:

<?php
namespace MyNameSpace\List;

class Test
{
}
?>

This will fail with a Parse error:  syntax error, unexpected 'List' (T_LIST), expecting identifier (T_STRING)
martindilling at gmail dot com 15-Apr-2013 10:20
RegEx to find all the keywords:

\b(
(a(bstract|nd|rray|s))|
(c(a(llable|se|tch)|l(ass|one)|on(st|tinue)))|
(d(e(clare|fault)|ie|o))|
(e(cho|lse(if)?|mpty|nd(declare|for(each)?|if|switch|while)|val|x(it|tends)))|
(f(inal|or(each)?|unction))|
(g(lobal|oto))|
(i(f|mplements|n(clude(_once)?|st(anceof|eadof)|terface)|sset))|
(n(amespace|ew))|
(p(r(i(nt|vate)|otected)|ublic))|
(re(quire(_once)?|turn))|
(s(tatic|witch))|
(t(hrow|r(ait|y)))|
(u(nset|se))|
(__halt_compiler|break|list|(x)?or|var|while)
)\b
Chris 04-Oct-2012 04:33
Here they are as arrays:

<?php
$keywords = array('__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor');

$predefined_constants = array('__CLASS__', '__DIR__', '__FILE__', '__FUNCTION__', '__LINE__', '__METHOD__', '__NAMESPACE__', '__TRAIT__');
?>

Along with get_defined_functions() and get_defined_constants(), this can be useful for checking eval() statements.


Classes prédéfinies

Cette section liste les classes standards prédéfinies. Les autres extensions qui définissent d'autres classes sont décrites dans leur référence.

Classes standards

Ces classes sont définies dans le jeu de classes standards de PHP, inclus dans toutes les versions de PHP.

Directory
Créé par la fonction dir().
stdClass
Créé par la conversion en objet.
__PHP_Incomplete_Class
Peut être créé par la fonction unserialize().

Classes prédéfinies en PHP 5

Ces classes ont été ajoutées en PHP 5.0.0.

Exception
ErrorException
Disponible depuis PHP 5.1.0.
php_user_filter

Closure

La classe prédéfinie finale Closure a été introduite en PHP 5.3.0. Elle est utilisée pour représenter les fonctions anonymes.

Pour plus d'informations, reportez-vous à cette page.

Générateur

La classe finale prédéfinie Generator a été introduite en PHP 5.5.0. Elle est utilisée pour représenter les générateurs.

Pour plus d'informations, voir la page relative à la classe.

Les classes et les interfaces prédéfinies depuis PHP 7

Les classes et les interfaces prédéfinies suivantes ont été introduites en PHP 7.0.0.

ArithmeticError
AssertionError
DivisionByZeroError
Error
Throwable
ParseError
TypeError

Classes spéciales

Les identifiants suivants ne devraient pas être utilisés en tant que nom de classe à cause de leur rôle particulier.

self
Classe courante.
static
Classe courante au moment de l'exécution.
parent
Classe parent.

User Contributed Notes

xzero at elite7hackers dot net 08-Sep-2017 08:37
There comes improved version of amazing snippet posted by (spark at limao dot com dot br)  which allows dynamic methods generations and works as versatile extension of StdClass:

This one is faster, optimised for closures, and will work only with closures. Compatible: >= PHP 5.6
<?php

class Dynamic extends \stdClass
{
    public function __call($key, $params)
    {
        if ( ! isset($this->{$key})) {
            throw new Exception("Call to undefined method " . __CLASS__ . "::" . $key . "()");
        }

        return $this->{$key}->__invoke(... $params);
    }
}

?>

Usage examples:

<?php
$dynamic                = new Dynamic();
$dynamic->anotherMethod = function () {
    echo "Hey there";
};
$dynamic->randomInt     = function ($min, $max) {
    return mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
    $dynamic->randomInt(1, 11),
    $dynamic->anotherMethod()
);
?>

This will accept arrays, strings and Closures but is a bit slower due to call_user_func_array
<?php

class Dynamic extends \stdClass
{
    public function __call($key, $params)
    {
        if ( ! isset($this->{$key})) {
            throw new Exception("Call to undefined method " . __CLASS__ . "::" . $key . "()");
        }

        return call_user_func_array($this->{$key}, $params);
    }
}

?>

Usage examples:
<?php
$dynamic                = new Dynamic();
$dynamic->myMethod      = "thatFunction";
$dynamic->hisMethod     = array($dynamic, "randomInt");
$dynamic->newMethod     = array(SomeClass, "staticMethod");
$dynamic->anotherMethod = function () {
    echo "Hey there";
};
$dynamic->randomInt     = function ($min, $max) {
    return mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
    $dynamic->randomInt(1, 11),
    $dynamic->anotherMethod(),
    $dynamic->hisMethod()
);

?>
xzero at elite7hackers dot net 08-Sep-2017 08:32
There comes improved version of amazing snippet posted by which allows dynamic methods generations and works as versatile extension of StdClass:

This one is faster, optimised for closures, and will work only with closures. Compatible: >= PHP 5.6
<?php

class Dynamic extends \stdClass
{
    public function __call($key, $params)
    {
        if ( ! isset($this->{$key})) {
            throw new Exception("Call to undefined method " . __CLASS__ . "::" . $key . "()");
        }

        return $this->{$key}->__invoke(... $params);
    }
}

?>

Usage examples:

<?php
$dynamic                = new Dynamic();
$dynamic->anotherMethod = function () {
    echo "Hey there";
};
$dynamic->randomInt     = function ($min, $max) {
    return mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
    $dynamic->randomInt(1, 11),
    $dynamic->anotherMethod()
);
?>

This will accept arrays, strings and Closures but is a bit slower due to call_user_func_array
<?php

class Dynamic extends \stdClass
{
    public function __call($key, $params)
    {
        if ( ! isset($this->{$key})) {
            throw new Exception("Call to undefined method " . __CLASS__ . "::" . $key . "()");
        }

        return call_user_func_array($this->{$key}, $params);
    }
}

?>

Usage examples:
<?php
$dynamic                = new Dynamic();
$dynamic->myMethod      = "thatFunction";
$dynamic->hisMethod     = array($dynamic, "randomInt");
$dynamic->newMethod     = array(SomeClass, "staticMethod");
$dynamic->anotherMethod = function () {
    echo "Hey there";
};
$dynamic->randomInt     = function ($min, $max) {
    return mt_rand($min, $max); // random_int($min, $max); // <-- PHP7+
};

var_dump(
    $dynamic->randomInt(1, 11),
    $dynamic->anotherMethod(),
    $dynamic->hisMethod()
);

?>
Ashley Dambra 19-Feb-2014 06:43
Here a simple class that allow to set anonymous function. It's an optimised class of stdClass.

<?php
class stdObject {
    public function __construct(array $arguments = array()) {
        if (!empty($arguments)) {
            foreach ($arguments as $property => $argument) {
                if ($argument instanceOf Closure) {
                    $this->{$property} = $argument;
                } else {
                    $this->{$property} = $argument;
                }
            }
        }
    }

    public function __call($method, $arguments) {
        if (isset($this->{$method}) && is_callable($this->{$method})) {
            return call_user_func_array($this->{$method}, $arguments);
        } else {
            throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
        }
    }
}

$person = new stdObject(array(
    "name" => "nick",
    "age" => 23,
    "friends" => array("frank", "sally", "aaron"),
    "sayHi" => function() {
        return "Hello there";
    }
));

$person->sayHi2 = function() {
    return "Hello there 2";
};

$person->test = function() {
    return "test";
};

var_dump($person->name, $person->test(), $person->sayHi2());
?>
wyattstorch42 at outlook dot com 24-Dec-2013 01:15
If you call var_export() on an instance of stdClass, it attempts to export it using ::__set_state(), which, for some reason, is not implemented in stdClass.

However, casting an associative array to an object usually produces the same effect (at least, it does in my case). So I wrote an improved_var_export() function to convert instances of stdClass to (object) array () calls. If you choose to export objects of any other class, I'd advise you to implement ::__set_state().

<?php
/**
 * An implementation of var_export() that is compatible with instances
 * of stdClass.
 * @param mixed $variable The variable you want to export
 * @param bool $return If used and set to true, improved_var_export()
 *     will return the variable representation instead of outputting it.
 * @return mixed|null Returns the variable representation when the
 *     return parameter is used and evaluates to TRUE. Otherwise, this
 *     function will return NULL.
 */
function improved_var_export ($variable, $return = false) {
    if ($variable instanceof stdClass) {
        $result = '(object) '.improved_var_export(get_object_vars($variable), true);
    } else if (is_array($variable)) {
        $array = array ();
        foreach ($variable as $key => $value) {
            $array[] = var_export($key, true).' => '.improved_var_export($value, true);
        }
        $result = 'array ('.implode(', ', $array).')';
    } else {
        $result = var_export($variable, true);
    }

    if (!$return) {
        print $result;
        return null;
    } else {
        return $result;
    }
}

// Example usage:
$obj = new stdClass;
$obj->test = 'abc';
$obj->other = 6.2;
$obj->arr = array (1, 2, 3);

improved_var_export((object) array (
    'prop1' => true,
    'prop2' => $obj,
    'assocArray' => array (
        'apple' => 'good',
        'orange' => 'great'
    )
));

/* Output:
(object) array ('prop1' => true, 'prop2' => (object) array ('test' => 'abc', 'other' => 6.2, 'arr' => array (0 => 1, 1 => 2, 2 => 3)), 'assocArray' => array ('apple' => 'good', 'orange' => 'great'))
*/
?>

Note: This function spits out a single line of code, which is useful to save in a cache file to include/eval. It isn't formatted for readability. If you want to print a readable version for debugging purposes, then I would suggest print_r() or var_dump().
spark at limao dot com dot br 15-Aug-2011 02:21
if you want a Dynamic class you can extend from, add atributes AND methods on the fly you can use this:
<?php
    class Dynamic extends stdClass{
        public function __call($key,$params){
            if(!isset($this->{$key})) throw new Exception("Call to undefined method ".get_class($this)."::".$key."()");
            $subject = $this->{$key};
            call_user_func_array($subject,$params);
        }
    }
?>

this will accept both arrays, strings and Closures:
<?php
    $dynamic->myMethod = "thatFunction";
    $dynamic->hisMethod = array($instance,"aMethod");
    $dynamic->newMethod = array(SomeClass,"staticMethod");
    $dynamic->anotherMethod = function(){
        echo "Hey there";
    };
?>

then call them away =D
Typer85 at gmail dot com 17-Feb-2007 08:58
In response to the note below mine,

This list is not incomplete. Read the Manual folks, its listed there plain and simple:

"This section lists standard predefined classes. Miscellaneous extensions define other classes which are described in their reference."

Depending on what extensions you have, they might define their own classes. This list is just the standard classes as defined by PHP with no regards to extensions.
unknown 23-Jul-2002 10:29
It's handy to have a array of the reserved classes.....
var_dump (get_declared_classes ());


Constantes pré-définies

Constantes prédéfinies

Ces constantes sont définies par le coeur de PHP. Cela inclut notamment PHP, le moteur Zend et les modules SAPI.

PHP_VERSION (string)
La version courante de PHP sous la forme d'une chaîne de caractères dans la notation "major.minor.release[extra]".
PHP_MAJOR_VERSION (int)
La version majeure courante de PHP sous la forme d'une chaîne de caractères (i.e., int(5) depuis la version "5.2.7-extra"). Disponible à partir de PHP 5.2.7.
PHP_MINOR_VERSION (int)
La version mineure courante de PHP sous la forme d'une chaîne de caractères (i.e., int(5) depuis la version "5.2.7-extra"). Disponible à partir de PHP 5.2.7.
PHP_RELEASE_VERSION (int)
La version stable courante de PHP sous la forme d'une chaîne de caractères (i.e., int(5) depuis la version "5.2.7-extra"). Disponible à partir de PHP 5.2.7.
PHP_VERSION_ID (int)
La version courante de PHP sous la forme d'un entier, utile pour la comparaison de versions (i.e., int(50207) depuis la version "5.2.7-extra"). Disponible à partir de PHP 5.2.7.
PHP_EXTRA_VERSION (string)
La version "extra" courante de PHP sous la forme d'une chaîne de caractères(i.e., '-extra' depuis la version "5.2.7-extra"). Habituellement utilisée par les packagers des distributions pour indiquer une version de paquet. Disponible à partir de PHP 5.2.7.
PHP_ZTS (int)
Disponible à partir de PHP 5.2.7.
PHP_DEBUG (int)
Disponible à partir de PHP 5.2.7.
PHP_MAXPATHLEN (int)
La longueur maximale des noms de fichiers (y compris le chemin) supportée par ce binaire PHP. Disponible à partir de PHP 5.3.0.
PHP_OS (string)
PHP_OS_FAMILY (string)
Le système d'exploitation pour lequel PHP a été compilé. Un de 'Windows', 'BSD', 'Darwin', 'Solaris', 'Linux' ou 'Unknown'. Disponible à partir de PHP 7.2.0.
PHP_SAPI (string)
L'API du serveur pour ce binaire PHP. Voir aussi php_sapi_name().
PHP_EOL (string)
Le bon symbole de fin de ligne pour cette plateforme. Disponible à partir de PHP 5.0.2
PHP_INT_MAX (int)
Le plus grand entier supporté par ce binaire de PHP. Habituellement, int(2147483647) sur les systèmes 32 bit et int(9223372036854775807) sur les systèmes 64 bit. Disponible à partir de PHP 5.0.5
PHP_INT_MIN (int)
Le plus petit entier supporté dans cette version de PHP. Habituellement, int(-2147483648) sur les systèmes 32 bit et int(-9223372036854775808) sur les systèmes 64 bit. Disponible à partir de PHP 7.0.0. Habituellement, PHP_INT_MIN === ~PHP_INT_MAX.
PHP_INT_SIZE (int)
La taille d'un entier, en octets, dans cette version de PHP. Disponible à partir de PHP 5.0.5
PHP_FLOAT_DIG (int)
Nombre de décimales pouvant être arrondies dans un nombre à virgule flottante et retourné sans perte de précision. Disponible depuis PHP 7.2.0.
PHP_FLOAT_EPSILON (float)
Le plus petit nombre à virgule flottante positif supporté, de sorte que x + 1.0 != 1.0. Disponible à partir de PHP 7.2.0.
PHP_FLOAT_MIN (float)
Le plus petit nombre à virgule flottante positif supporté. Si vous avez besoin de la plus petite représentation négative de nombre flottant, utiliser - PHP_FLOAT_MAX. Disponible à partir de PHP 7.2.0.
PHP_FLOAT_MAX (float)
Le plus grand nombre à virgule flottante supporté. Disponible à partir de PHP 7.2.0.
DEFAULT_INCLUDE_PATH (string)
PEAR_INSTALL_DIR (string)
PEAR_EXTENSION_DIR (string)
PHP_EXTENSION_DIR (string)
PHP_PREFIX (string)
La valeur de --prefix qui a été définie lors de la configuration. Sur Windows, c'est la valeur de --with-prefix qui a été définie lors de la configuration.
PHP_BINDIR (string)
Spécifie l'endroit où ont été installé les binaires. La valeur de --bindir qui a été définie lors de la configuration. Sur Windows, c'est la valeur de --with-prefix qui a été définie lors de la configuration.
PHP_BINARY (string)
Spécifie le chemin vers le binaire PHP lors de l'exécution du script.
PHP_MANDIR (string)
Spécifie le chemin d'installation des pages man. Disponible à partir de PHP 5.3.7.
PHP_LIBDIR (string)
PHP_DATADIR (string)
PHP_SYSCONFDIR (string)
PHP_LOCALSTATEDIR (string)
PHP_CONFIG_FILE_PATH (string)
PHP_CONFIG_FILE_SCAN_DIR (string)
PHP_SHLIB_SUFFIX (string)
Le suffixe de la plate-forme de compilation pour les bibliothèques partagées, comme "so" (sous la plupart des Unix) ou "dll" (Windows).
PHP_FD_SETSIZE (string)
Nombre maximal de descripteurs de fichiers pour les appels système sélectionnés. Disponible à partir de PHP 7.1.0.
E_ERROR (int)
Constante de rapport d'erreur
E_WARNING (int)
Constante de rapport d'erreur
E_PARSE (int)
Constante de rapport d'erreur
E_NOTICE (int)
Constante de rapport d'erreur
E_CORE_ERROR (int)
Constante de rapport d'erreur
E_CORE_WARNING (int)
Constante de rapport d'erreur
E_COMPILE_ERROR (int)
Constante de rapport d'erreur
E_COMPILE_WARNING (int)
Constante de rapport d'erreur
E_USER_ERROR (int)
Constante de rapport d'erreur
E_USER_WARNING (int)
Constante de rapport d'erreur
E_USER_NOTICE (int)
Constante de rapport d'erreur
E_RECOVERABLE_ERROR (int)
Constante de rapport d'erreur. Disponible à partir de PHP 5.2.0.
E_DEPRECATED (int)
Constante de rapport d'erreur. Disponible à partir de PHP 5.3.0
E_USER_DEPRECATED (int)
Constante de rapport d'erreur. Disponible à partir de PHP 5.3.0.
E_ALL (int)
Constante de rapport d'erreur
E_STRICT (int)
Constante de rapport d'erreur.
__COMPILER_HALT_OFFSET__ (int)
Disponible à partir de PHP 5.1.0.
true (bool)
Voir Booleans.
false (bool)
Voir Booleans.
null (null)
Voir Null.
PHP_WINDOWS_EVENT_CTRL_C (int)
Évènement Windows CTRL+C. Disponible à partir de PHP 7.4.0 (Windows uniquement).
PHP_WINDOWS_EVENT_CTRL_BREAK (int)
Évènement Windows CTRL+BREAK. Disponible à partir de PHP 7.4.0 (Windows uniquement).

Voir aussi les constantes magiques.

Constantes standards prédéfinies

Toutes les constantes des extensions coeur sont définies en PHP par défaut.

User Contributed Notes

nabikaz at gmail dot com 10-Nov-2016 10:18
Don't use `PHP_EOL` for textarea of form to array, use it:

array_values(array_filter(explode("\n", str_replace("\r", '', $_POST['data']))))
Anonymous 27-Jan-2015 03:25
PHP_EOL can be used like that:

<?php

$data = 'some data'.PHP_EOL;
$fp = fopen('somefile', 'a');
fwrite($fp, $data);

?>

Which is the same of \r\n or \n depending on the OS.
You can put those lines in a while for example, and create a log file.
rdcapasso 08-Sep-2013 09:16
Volker's getOS() function needs to have the order of cases changed in the switch statement since "darwin" contains "win", which means that both "windows" and "darwin" will return self::OS_WIN. I've moved the 'dar' case above the 'win' case:

<?php
class System {

    const OS_UNKNOWN = 1;
    const OS_WIN = 2;
    const OS_LINUX = 3;
    const OS_OSX = 4;

    /**
     * @return int
     */
    static public function getOS() {
        switch (true) {
            case stristr(PHP_OS, 'DAR'): return self::OS_OSX;
            case stristr(PHP_OS, 'WIN'): return self::OS_WIN;
            case stristr(PHP_OS, 'LINUX'): return self::OS_LINUX;
            default : return self::OS_UNKNOWN;
        }
    }

}
?>


Autre liste de mots réservés

Les mots suivants ne peuvent pas être utilisés comme nom de classe, d'interface ou de trait, et il est également interdit de les utiliser dans les espaces de noms.

Mots réservés
int (à partir de PHP 7) | float (à partir de PHP 7) | bool (à partir de PHP 7) | string (à partir de PHP 7)
true (à partir de PHP 7) | false (à partir de PHP 7) | null (à partir de PHP 7) | void (à partir de PHP 7.1)
iterable (à partir de PHP 7.1) | object (à partir de PHP 7.2)

La liste des mots suivants ont une particularité. Bien qu'ils puissent être utilisés dans les noms de classe, d'interface, et de trait (mais aussi dans les espaces de noms), il convient d'éviter de les utiliser sachant qu'ils peuvent être utilisés dans les futures versions de PHP.

Soft reserved words
resource (à partir de PHP 7) mixed (à partir de PHP 7) numeric (à partir de PHP 7)

User Contributed Notes

There are no user contributed notes for this page.


Types des ressources PHP

Voici la liste des fonctions qui créent, utilisent ou détruisent les ressources PHP. Vous pouvez déterminer si une variable contient une ressource avec la fonction is_resource(), et le type d'une ressource que vous utilisez avec la fonction get_resource_type().

Types de ressource
Ressource | Construite par | Utilisée par | Détruite par | Définition
AddressInfo | socket_addrinfo_lookup() | socket_addrinfo_bind(), socket_addrinfo_connect(), socket_addrinfo_explain(), | None | AddressInfo (sockets extension)
bzip2 | bzopen() | bzerrno(), bzerror(), bzerrstr(), bzflush(), bzread(), bzwrite() | bzclose() | Fichier bzip2
Connexion cubrid | cubrid_connect() cubrid_connect_with_url() | cubrid_col_get() cubrid_col_size() cubrid_commit() cubrid_drop() cubrid_execute() cubrid_get_autocommit() cubrid_get_charset() cubrid_get_class_name() cubrid_get_db_parameter() cubrid_get_server_info() cubrid_get() cubrid_insert_id() cubrid_is_instance() cubrid_lob_export() cubrid_lob_get() cubrid_lob_send() cubrid_lock_read() cubrid_lock_write() cubrid_prepare() cubrid_put() cubrid_rollback() cubrid_schema() cubrid_seq_drop() cubrid_seq_insert() cubrid_seq_put() cubrid_set_add() cubrid_set_autocommit() cubrid_set_db_parameter() cubrid_set_drop() cubrid_affected_rows() cubrid_client_encoding() cubrid_errno() cubrid_error() cubrid_list_dbs() cubrid_ping() cubrid_query() cubrid_real_escape_string() | cubrid_close() cubrid_disconnect() | Connexion à une base de données CUBRID
Connexion cubrid persistante | cubrid_pconnect() cubrid_pconnect_with_url() | cubrid_col_get() cubrid_col_size() cubrid_commit() cubrid_drop() cubrid_execute() cubrid_get_autocommit() cubrid_get_charset() cubrid_get_class_name() cubrid_get_db_parameter() cubrid_get_server_info() cubrid_get() cubrid_insert_id() cubrid_is_instance() cubrid_lob_export() cubrid_lob_get() cubrid_lob_send() cubrid_lock_read() cubrid_lock_write() cubrid_prepare() cubrid_put() cubrid_rollback() cubrid_schema() cubrid_seq_drop() cubrid_seq_insert() cubrid_seq_put() cubrid_set_add() cubrid_set_autocommit() cubrid_set_db_parameter() cubrid_set_drop() cubrid_affected_rows() cubrid_client_encoding() cubrid_errno() cubrid_error() cubrid_list_dbs() cubrid_ping() cubrid_query() cubrid_real_escape_string() cubrid_lob2_new() | Connexion persistante à une base de données CUBRID
Requête cubrid | cubrid_prepare() cubrid_execute() cubrid_query() cubrid_unbuffered_query() | cubrid_bind() cubrid_column_names() cubrid_column_types() cubrid_current_oid() cubrid_execute() cubrid_free_result() cubrid_get_query_timeout() cubrid_move_cursor() cubrid_next_result() cubrid_num_cols() cubrid_num_rows() cubrid_set_query_timeout() cubrid_data_seek() cubrid_fetch_array() cubrid_fetch_assoc() cubrid_fetch_field() cubrid_fetch_lengths() cubrid_fetch_object() cubrid_fetch_row() cubrid_field_flags() cubrid_field_len() cubrid_field_name() cubrid_field_seek() cubrid_field_table() cubrid_field_type() cubrid_num_fields() cubrid_result() cubrid_lob2_bind() | cubrid_close_prepare() cubrid_close_request() | Requête CUBRID
cubrid lob | cubrid_lob_get() | cubrid_lob_export() cubrid_lob_send() cubrid_lob_size() | cubrid_lob_close() | Aucun
cubrid lob2 | cubrid_lob2_new() cubrid_fetch() cubrid_fetch_row() cubrid_fetch_array() cubrid_fetch_assoc() cubrid_fetch_object() | cubrid_lob2_export() cubrid_lob2_import() cubrid_lob2_read() cubrid_lob2_write() cubrid_lob2_tell() cubrid_lob2_tell64() cubrid_lob2_seek() cubrid_lob2_seek64() cubrid_lob2_size() cubrid_lob2_size64() | cubrid_lob2_close() | Aucun
curl | curl_copy_handle(), curl_init() | curl_copy_handle(), curl_errno(), curl_error(), curl_exec(), curl_getinfo(), curl_setopt() | curl_close() | cURL handle
curl_multi | curl_multi_init() | curl_multi_errno(), curl_multi_exec(), curl_multi_info_read(), curl_multi_remove_handle(), curl_multi_select(), curl_multi_setopt() | curl_multi_close() | cURL multi handle
curl_share | curl_share_init() | curl_share_errno(), curl_share_setopt() | curl_share_close() | cURL share handle
dba | dba_open() | dba_delete(), dba_exists(), dba_fetch(), dba_firstkey(), dba_insert(), dba_nextkey(), dba_optimize(), dba_replace(), dba_sync() | dba_close() | Lien vers une base de données DBA
dba persistent | dba_popen() | dba_delete(), dba_exists(), dba_fetch(), dba_firstkey(), dba_insert(), dba_nextkey(), dba_optimize(), dba_replace(), dba_sync() | Aucun | Lien persistant vers une base de données DBA
dbase | dbase_open() | dbase_pack(), dbase_add_record(), dbase_replace_record(), dbase_delete_record(), dbase_get_record(), dbase_get_record_with_names(), dbase_numfields(), dbase_numrecords() | dbase_close() | Lien vers une base de données dbase
dbx_link_object | dbx_connect() | dbx_query() | dbx_close() | Connexion dbx
dbx_result_object | dbx_query() | Aucun | Résultat dbx
fbsql link | fbsql_change_user(), fbsql_connect() | fbsql_autocommit(), fbsql_blob_size(), fbsql_clob_size(), fbsql_commit(), fbsql_change_user(), fbsql_create_blob(), fbsql_create_db(), fbsql_create_clob(), fbsql_data_seek(), fbsql_database_password(), fbsql_database(), fbsql_db_query(), fbsql_db_status(), fbsql_drop_db(), fbsql_errno(), fbsql_error(), fbsql_get_autostart_info(), fbsql_hostname(), fbsql_insert_id(), fbsql_list_dbs(), fbsql_password(), fbsql_read_blob(), fbsql_read_clob(), fbsql_rollback(), fbsql_select_db(), fbsql_set_password(), fbsql_set_transaction(), fbsql_start_db(), fbsql_stop_db(), fbsql_username() | fbsql_close() | Lien vers une base de données fbsql
fbsql plink | fbsql_change_user(), fbsql_pconnect() | fbsql_autocommit(), fbsql_change_user(), fbsql_create_db(), fbsql_data_seek(), fbsql_db_query(), fbsql_drop_db(), fbsql_select_db(), fbsql_errno(), fbsql_error(), fbsql_insert_id(), fbsql_list_dbs() | Aucun | Lien persistant vers une base de données fbsql
fbsql result | fbsql_db_query(), fbsql_list_dbs(), fbsql_query(), fbsql_list_fields(), fbsql_list_tables(), fbsql_tablename() | fbsql_affected_rows(), fbsql_fetch_array(), fbsql_fetch_assoc(), fbsql_fetch_field(), fbsql_fetch_lengths(), fbsql_fetch_object(), fbsql_fetch_row(), fbsql_field_flags(), fbsql_field_name(), fbsql_field_len(), fbsql_field_seek(), fbsql_field_table(), fbsql_field_type(), fbsql_next_result(), fbsql_num_fields(), fbsql_num_rows(), fbsql_result(), fbsql_num_rows() | fbsql_free_result() | Résultat fbsql
fdf | fdf_open() | fdf_create(), fdf_save(), fdf_get_value(), fdf_set_value(), fdf_next_field_name(), fdf_set_ap(), fdf_set_status(), fdf_get_status(), fdf_set_file(), fdf_get_file(), fdf_set_flags(), fdf_set_opt(), fdf_set_submit_form_action(), fdf_set_javascript_action() | fdf_close() | Fichier FDF
ftp | ftp_connect(), ftp_ssl_connect() | ftp_login(), ftp_pwd(), ftp_cdup(), ftp_chdir(), ftp_mkdir(), ftp_rmdir(), ftp_nlist(), ftp_rawlist(), ftp_systype(), ftp_pasv(), ftp_get(), ftp_fget(), ftp_put(), ftp_fput(), ftp_size(), ftp_mdtm(), ftp_rename(), ftp_delete(), ftp_site(), ftp_alloc(), ftp_chmod(), ftp_exec(), ftp_get_option(), ftp_nb_continue(), ftp_nb_fget(), ftp_nb_fput(), ftp_nb_get(), ftp_nb_put(), ftp_raw(), ftp_set_option() | ftp_close() | Flux FTP
gd | imagecreate(), imagecreatefromgd(), imagecreatefromgd2(), imagecreatefromgd2part(), imagecreatefromgif(), imagecreatefromjpeg(), imagecreatefrompng(), imagecreatefromwbmp(), imagecreatefromstring(), imagecreatefromxbm(), imagecreatefromxpm(), imagecreatetruecolor(), imagerotate() | imagearc(), imagechar(), imagecharup(), imagecolorallocate(), imagecolorat(), imagecolorclosest(), imagecolorexact(), imagecolorresolve(), imagegammacorrect(), imagegammacorrect(), imagecolorset(), imagecolorsforindex(), imagecolorstotal(), imagecolortransparent(), imagecopy(), imagecopyresized(), imagedashedline(), imagefill(), imagefilledpolygon(), imagefilledrectangle(), imagefilltoborder(), imagegif(), imagepng(), imagejpeg(), imagewbmp(), imageinterlace(), imageline(), imagepolygon(), imagepstext(), imagerectangle(), imagerotate(), imagesetpixel(), imagestring(), imagestringup(), imagesx(), imagesy(), imagettftext(), imagefilledarc(), imageellipse(), imagefilledellipse(), imagecolorclosestalpha(), imagecolorexactalpha(), imagecolorresolvealpha(), imagecopymerge(), imagecopymergegray(), imagecopyresampled(), imagetruecolortopalette(), imagesetbrush(), imagesettile(), imagesetthickness(), image2wbmp(), imagealphablending(), imageantialias(), imagecolorallocatealpha(), imagecolorclosesthwb(), imagecolordeallocate(), imagecolormatch(), imagefilter(), imagefttext(), imagegd(), imagegd2(), imageistruecolor(), imagelayereffect(), imagepalettecopy(), imagesavealpha(), imagesetstyle(), imagexbm() | imagedestroy() | Image GD
gd font | imageloadfont() | imagechar(), imagecharup(), imagefontheight() | Aucun | Police pour GD
GMP integer | gmp_init() | gmp_intval(), gmp_strval(), gmp_add(), gmp_sub(), gmp_mul(), gmp_div_q(), gmp_div_r(), gmp_div_qr(), gmp_div(), gmp_mod(), gmp_divexact(), gmp_cmp(), gmp_neg(), gmp_abs(), gmp_sign(), gmp_fact(), gmp_sqrt(), gmp_sqrtrm(), gmp_perfect_square(), gmp_pow(), gmp_powm(), gmp_prob_prime(), gmp_gcd(), gmp_gcdext(), gmp_invert(), gmp_legendre(), gmp_jacobi(), gmp_random(), gmp_and(), gmp_or(), gmp_xor(), gmp_setbit(), gmp_clrbit(), gmp_scan0(), gmp_scan1(), gmp_popcount(), gmp_hamdist() | Aucun | Nombre GMP
imap | imap_open() | imap_append(), imap_body(), imap_check(), imap_createmailbox(), imap_delete(), imap_deletemailbox(), imap_expunge(), imap_fetchbody(), imap_fetchstructure(), imap_headerinfo(), imap_header(), imap_headers(), imap_listmailbox(), imap_getmailboxes(), imap_get_quota(), imap_status(), imap_listsubscribed(), imap_set_quota(), imap_set_quota(), imap_getsubscribed(), imap_mail_copy(), imap_mail_move(), imap_num_msg(), imap_num_recent(), imap_ping(), imap_renamemailbox(), imap_reopen(), imap_subscribe(), imap_undelete(), imap_unsubscribe(), imap_scanmailbox(), imap_mailboxmsginfo(), imap_fetchheader(), imap_uid(), imap_msgno(), imap_search(), imap_fetch_overview() | imap_close() | Lien vers un serveur mail (IMAP, POP3)
ingres | ingres_connect() | ingres_query(), ingres_num_rows(), ingres_num_fields(), ingres_field_name(), ingres_field_type(), ingres_field_nullable(), ingres_field_length(), ingres_field_precision(), ingres_field_scale(), ingres_fetch_array(), ingres_fetch_row(), ingres_fetch_object(), ingres_rollback(), ingres_commit(), ingres_autocommit() | ingres_close() | Lien vers une base de données ingresII
ingres persistent | ingres_pconnect() | ingres_query(), ingres_num_rows(), ingres_num_fields(), ingres_field_name(), ingres_field_type(), ingres_field_nullable(), ingres_field_length(), ingres_field_precision(), ingres_field_scale(), ingres_fetch_array(), ingres_fetch_row(), ingres_fetch_object(), ingres_rollback(), ingres_commit(), ingres_autocommit() | Aucun | Lien persistant vers une base de données ingresII
interbase blob | ibase_blob_create(), ibase_blob_import(), ibase_blob_open() | ibase_blob_add(), ibase_blob_cancel(), ibase_blob_echo(), ibase_blob_get(), ibase_blob_info() | ibase_blob_close()
interbase link | ibase_connect() | ibase_query(), ibase_prepare(), ibase_trans() | ibase_close() | Lien vers une base de données Interbase
interbase link persistent | ibase_pconnect() | ibase_query(), ibase_prepare(), ibase_trans() | Aucun | Lien persistant vers une base de données Interbase
interbase query | ibase_prepare() | ibase_execute() | ibase_free_query() | Requête Interbase
interbase result | ibase_query() | ibase_fetch_row(), ibase_fetch_object(), ibase_field_info(), ibase_num_fields() | ibase_free_result() | Résultat Interbase
interbase transaction | ibase_trans() | ibase_commit() | ibase_rollback() | Transaction Interbase
ldap link | ldap_connect(), ldap_search() | ldap_count_entries(), ldap_first_attribute(), ldap_first_entry(), ldap_get_attributes(), ldap_get_dn(), ldap_get_entries(), ldap_get_values(), ldap_get_values_len(), ldap_next_attribute(), ldap_next_entry() | ldap_close() | Lien vers un serveur LDAP
ldap result | ldap_read() | ldap_add(), ldap_compare(), ldap_bind(), ldap_count_entries(), ldap_delete(), ldap_errno(), ldap_error(), ldap_first_attribute(), ldap_first_entry(), ldap_get_attributes(), ldap_get_dn(), ldap_get_entries(), ldap_get_values(), ldap_get_values_len(), ldap_get_option(), ldap_list(), ldap_modify(), ldap_mod_add(), ldap_mod_replace(), ldap_next_attribute(), ldap_next_entry(), ldap_mod_del(), ldap_set_option(), ldap_unbind() | ldap_free_result() | Résultat de recherche LDAP
ldap result entry
mysql link | mysql_connect() | mysql_affected_rows(), mysql_change_user(), mysql_create_db(), mysql_data_seek(), mysql_db_name(), mysql_db_query(), mysql_drop_db(), mysql_errno(), mysql_error(), mysql_insert_id(), mysql_list_dbs(), mysql_list_fields(), mysql_list_tables(), mysql_query(), mysql_result(), mysql_select_db(), mysql_tablename(), mysql_get_host_info(), mysql_get_proto_info(), mysql_get_server_info() | mysql_close() | Lien vers une base de données MySQL
mysql link persistent | mysql_pconnect() | mysql_affected_rows(), mysql_change_user(), mysql_create_db(), mysql_data_seek(), mysql_db_name(), mysql_db_query(), mysql_drop_db(), mysql_errno(), mysql_error(), mysql_insert_id(), mysql_list_dbs(), mysql_list_fields(), mysql_list_tables(), mysql_query(), mysql_result(), mysql_select_db(), mysql_tablename(), mysql_get_host_info(), mysql_get_proto_info(), mysql_get_server_info() | Aucun | Lien persistant vers une base de données MySQL
mysql result | mysql_db_query(), mysql_list_dbs(), mysql_list_fields(), mysql_list_processes(), mysql_list_tables(), mysql_query(), mysql_unbuffered_query() | mysql_data_seek(), mysql_db_name(), mysql_fetch_array(), mysql_fetch_assoc(), mysql_fetch_field(), mysql_fetch_lengths(), mysql_fetch_object(), mysql_fetch_row(), mysql_fetch_row(), mysql_field_flags(), mysql_field_name(), mysql_field_len(), mysql_field_seek(), mysql_field_table(), mysql_field_type(), mysql_num_fields(), mysql_num_rows(), mysql_result(), mysql_tablename() | mysql_free_result() | Résultat MySQL
Collection oci8 | oci_new_collection() | OCICollection::append(), OCICollection::assign(), OCICollection::assignElem(), OCICollection::getElem(), OCICollection::max(), OCICollection::size(), OCICollection::trim() | OCICollection::free() | Oracle Collection
Connexion oci8 | oci_connect(), oci_pconnect(), oci_new_connect() | oci_commit(), oci_error(), oci_new_cursor(), oci_parse(), oci_password_change(), oci_rollback(), oci_server_version(), oci_set_action(), oci_set_client_identifier(), oci_set_client_info(), oci_set_module_name() | oci_close() | Connexion sur une base de données Oracle
oci8 lob | oci_new_descriptor() | OCILob::append(), OCILob::close(), OCILob::eof(), OCILob::erase(), OCILob::export(), OCILob::flush(), OCILob::getBuffering(), OCILob::import(), OCILob::load(), OCILob::read(), OCILob::rewind(), OCILob::save(), OCILob::saveFile(), OCILob::seek(), OCILob::setBuffering(), OCILob::size(), OCILob::tell(), OCILob::truncate(), OCILob::write(), OCILob::writeTemporary(), OCILob::writeToFile(), oci_lob_copy(), oci_lob_is_equal() | OCILob::free() | Objets large Oracle
Requête oci8 | oci_parse(), oci_new_cursor() | oci_bind_array_by_name(), oci_bind_by_name(), oci_cancel(), oci_define_by_name(), oci_error() oci_execute(), oci_fetch_all(), oci_fetch_array(), oci_fetch_assoc(), oci_fetch_object(), oci_fetch_row(), oci_fetch(), oci_field_is_null(), oci_field_name(), oci_field_precision(), oci_field_scale(), oci_field_size(), oci_field_type_raw(), oci_field_type(), oci_num_fields(), oci_num_rows(), oci_result(), oci_set_prefetch(), oci_statement_type() | oci_free_statement() | Curseur Oracle
odbc link | odbc_connect() | odbc_autocommit(), odbc_commit(), odbc_error(), odbc_errormsg(), odbc_exec(), odbc_tables(), odbc_tableprivileges(), odbc_do(), odbc_prepare(), odbc_columns(), odbc_columnprivileges(), odbc_procedurecolumns(), odbc_specialcolumns(), odbc_rollback(), odbc_setoption(), odbc_gettypeinfo(), odbc_primarykeys(), odbc_foreignkeys(), odbc_procedures(), odbc_statistics() | odbc_close() | Lien vers une base de données ODBC
Lien persistent odbc | odbc_pconnect() | odbc_autocommit(), odbc_commit(), odbc_error(), odbc_errormsg(), odbc_exec(), odbc_tables(), odbc_tableprivileges(), odbc_do(), odbc_prepare(), odbc_columns(), odbc_columnprivileges(), odbc_procedurecolumns(), odbc_specialcolumns(), odbc_rollback(), odbc_setoption(), odbc_gettypeinfo(), odbc_primarykeys(), odbc_foreignkeys(), odbc_procedures(), odbc_statistics() | Aucun | Lien persistant vers une base de données ODBC
odbc result | odbc_prepare() | odbc_binmode(), odbc_cursor(), odbc_execute(), odbc_fetch_into(), odbc_fetch_row(), odbc_field_name(), odbc_field_num(), odbc_field_type(), odbc_field_len(), odbc_field_precision(), odbc_field_scale(), odbc_longreadlen(), odbc_num_fields(), odbc_num_rows(), odbc_result(), odbc_result_all(), odbc_setoption() | odbc_free_result() | Résultat ODBC
birdstep link | Link to Birdstep database (antérieur à PHP 7.3.0)
birdstep result | Link to Birdstep database (antérieur à PHP 7.3.0)
OpenSSL key | openssl_get_privatekey(), openssl_get_publickey() | openssl_sign(), openssl_seal(), openssl_open(), openssl_verify() | openssl_free_key() | Clé de cryptage OpenSSL
OpenSSL X.509 | openssl_x509_read() | openssl_x509_parse(), openssl_x509_checkpurpose() | openssl_x509_free() | Clé publique
Objet de grande taille pgsql | pg_lo_open() | pg_lo_open(), pg_lo_create(), pg_lo_read(), pg_lo_read_all(), pg_lo_seek(), pg_lo_tell(), pg_lo_unlink(), pg_lo_write() | pg_lo_close() | Objet de grande taille PostGreSQL
pgsql link | pg_connect() | pg_affected_rows(), pg_query(), pg_send_query(), pg_get_result(), pg_connection_busy(), pg_connection_reset(), pg_connection_status(), pg_last_error(), pg_last_notice(), pg_lo_create(), pg_lo_export(), pg_lo_import(), pg_lo_open(), pg_lo_unlink(), pg_host(), pg_port(), pg_dbname(), pg_options(), pg_copy_from(), pg_copy_to(), pg_end_copy(), pg_put_line(), pg_tty(), pg_trace(), pg_untrace(), pg_set_client_encoding(), pg_client_encoding(), pg_metadata(), pg_convert(), pg_insert(), pg_select(), pg_delete(), pg_update() | pg_close() | Lien vers une base de données PostGreSQL
pgsql link persistent | pg_pconnect() | pg_affected_rows(), pg_query(), pg_send_query(), pg_get_result(), pg_connection_busy(), pg_connection_reset(), pg_connection_status(), pg_last_error(), pg_last_notice(), pg_lo_create(), pg_lo_export(), pg_lo_import(), pg_lo_open(), pg_lo_unlink(), pg_host(), pg_port(), pg_dbname(), pg_options(), pg_copy_from(), pg_copy_to(), pg_end_copy(), pg_put_line(), pg_tty(), pg_trace(), pg_untrace(), pg_set_client_encoding(), pg_client_encoding(), pg_metadata(), pg_convert(), pg_insert(), pg_select(), pg_delete(), pg_update() | Aucun | Lien persistant vers une base de données PostGreSQL
pgsql result | pg_execute(), pg_query(), pg_query_params(), pg_get_result() | pg_fetch_array(), pg_fetch_object(), pg_fetch_result(), pg_fetch_row(), pg_field_is_null(), pg_field_name(), pg_field_num(), pg_field_prtlen(), pg_field_size(), pg_field_type(), pg_last_oid(), pg_num_fields(), pg_num_rows(), pg_result_error(), pg_result_status() | pg_free_result() | Résultat PostGreSQL
pgsql string
pspell | pspell_new(), pspell_new_config(), pspell_new_personal() | pspell_add_to_personal(), pspell_add_to_session(), pspell_check(), pspell_clear_session(), pspell_config_ignore(), pspell_config_mode(), pspell_config_personal(), pspell_config_repl(), pspell_config_runtogether(), pspell_config_save_repl(), pspell_save_wordlist(), pspell_store_replacement(), pspell_suggest() | Aucun | Dictionnaire Pspell
pspell config | pspell_config_create() | pspell_new_config() | Aucun | Configuration Pspell
shmop | shmop_open() | shmop_read(), shmop_write(), shmop_size(), shmop_delete() | shmop_close() | Handle d'un bloc de mémoire partagée (antérieur à PHP 8.0.0)
Socket | socket_accept(), socket_addrinfo_bind(), socket_addrinfo_connect(), socket_create(), socket_create_listen(), socket_import_stream(), socket_wsaprotocol_info_import() | socket_accept(), socket_bind(), socket_clear_error(), socket_connect(), socket_get_option(), socket_getpeername(), socket_getsockname(), socket_last_error(), socket_listen(), socket_read(), socket_recv(), socket_recvfrom(), socket_recvmsg(), socket_select(), socket_send(), socket_sendmsg(), socket_sendto(), socket_set_block(), socket_set_nonblock(), socket_set_option(), socket_shutdown(), socket_write(), socket_wsaprotocol_info_export(), socket_wsaprotocol_info_release() | socket_close() | Socket (sockets extension)
Flux | opendir() | readdir(), rewinddir() | closedir() | Dossier
Flux | fopen(), tmpfile() | feof(), fflush(), fgetc(), fgetcsv(), fgets(), fgetss(), flock(), fpassthru(), fputs(), fwrite(), fread(), fseek(), ftell(), fstat(), ftruncate(), set_file_buffer(), rewind() | fclose() | Fichier
Flux | popen(), fsockopen(), pfsockopen() | feof(), fflush(), fgetc(), fgetcsv(), fgets(), fgetss(), fpassthru(), fputs(), fwrite(), fread() | pclose() | Processus
socket | fflush(), fgetc(), fgetcsv(), fgets(), fgetss(), fpassthru(), fputs(), fwrite(), fread() | fclose() | Socket Handle
SSH2 Session | ssh2_connect() | ssh2_disconnect()
SSH2 Listener | ssh2_forward_listen()
SSH2 SFTP | ssh2_sftp()
SSH2 Publickey Subsystem | ssh2_publickey_init()
sysvmsg queue | msg_get_queue() | msg_queue_exists(), msg_receive(), msg_send(), msg_set_queue(), msg_stat_queue() | msg_remove_queue() | System V Message Queue
sysvsem | sem_get() | sem_acquire() | sem_release() | Sémaphore Système V
sysvshm | shm_attach() | shm_remove(), shm_put_var(), shm_get_var(), shm_remove_var() | shm_detach() | Mémoire partagée Système V
wddx | wddx_packet_start() | wddx_add_vars() | wddx_packet_end() | Paquet wddx
xml | xml_parser_create(), xml_parser_create_ns() | xml_set_object(), xml_set_element_handler(), xml_set_character_data_handler(), xml_set_processing_instruction_handler(), xml_set_default_handler(), xml_set_unparsed_entity_decl_handler(), xml_set_notation_decl_handler(), xml_set_external_entity_ref_handler(), xml_parse(), xml_get_error_code(), xml_error_string(), xml_get_current_line_number(), xml_get_current_column_number(), xml_get_current_byte_index(), xml_parse_into_struct(), xml_parser_set_option(), xml_parser_get_option() | xml_parser_free() | Analyseur syntaxique XML (antérieur à PHP 8.0.0)
zlib | gzopen() | gzeof(), gzgetc(), gzgets(), gzgetss(), gzpassthru(), gzputs(), gzread(), gzrewind(), gzseek(), gztell(), gzwrite() | gzclose() | Fichier compressé Gzip
zlib.deflate | deflate_init() | deflate_add() | None | Context de décompression incrémentale (antérieur à PHP 8.0.0)
enchant_broker | enchant_broker_init() | enchant_broker_describe(), enchant_broker_dict_exists(), enchant_broker_get_dict_path(), enchant_broker_get_error(), enchant_broker_list_dicts(), enchant_broker_set_dict_path(), enchant_broker_set_ordering() | enchant_broker_free() | Enchant broker (antérieur à PHP 8.0.0)
enchant_dict | enchant_broker_request_dict() enchant_broker_request_pwl_dict() | enchant_dict_add_to_personal(), enchant_dict_add_to_session(), enchant_dict_check(), enchant_dict_describe(), enchant_dict_get_error(), enchant_dict_is_in_session(), enchant_dict_store_replacement(), enchant_dict_suggest() | enchant_broker_free_dict() | Enchant dictionary (antérieur à PHP 8.0.0)
zlib.inflate | inflate_init() | inflate_add(), inflate_get_read_len(), inflate_get_status() | None | Contexte de compression incrémentale (antérieur à PHP 8.0.0)

User Contributed Notes

csaba at alum dot mit dot edu 06-Nov-2009 10:25
On my PHP 5.2 under Windows Vista, the resource type listed as interbase link is actually Firebird/InterBase link


Liste des filtres standards

Sommaire

  • Filtres de chaînes de caractères
  • Filtres de conversion
  • Filtres de compression
  • Filtres de chiffrement

Cette section contient la liste des filtres de flux, à utiliser avec stream_filter_append(). Votre version de PHP peut avoir des filtres supplémentaires, ou manquants par rapport à cette liste.

Il est bon de noter une légère différence entre stream_filter_append() et stream_filter_prepend(). Tous les flux PHP disposent d'un petit buffer de lecture, où ils stockent des blocs de données lues dans le système de fichiers, ou dans d'autres sources, afin de les traiter plus efficacement. Aussitôt que les données sont lues depuis la ressource dans le buffer interne, les données sont immédiatement passées au filtre, même si l'application PHP n'est pas prête pour lire ces données. Si des données sont déjà en attente dans le buffer lorsqu'un filtre est ajouté au flux (appended), ces données seront immédiatement passées au filtre, pour que la modification soit transparente. Mais si vous ajoutez un filtre avec prepended, les données NE seront PAS filtrées. Elles attendront que le prochain bloc arrive de la ressource.

Pour avoir la liste complète des filtres de votre version de PHP, utilisez la fonction stream_get_filters().

User Contributed Notes

There are no user contributed notes for this page.


Filtres de chaînes de caractères

Chaque filtre fait ce que son nom implique, et se réfère au comportement de la fonction PHP correspondante. Pour plus de détails sur un filtre, reportez-vous au manuel de la fonction de référence.

string.rot13

L'utilisation de ce filtre est équivalent à traiter toutes les données du flux à travers la fonction str_rot13().

Exemple #1 string.rot13

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'string.rot13');
fwrite($fp, "Ceci est un test.\n");
/* affiche :  Prpv rfg ha grfg.   */
?>

string.toupper

L'utilisation de ce filtre est équivalent à traiter toutes les données du flux à travers la fonction strtoupper().

Exemple #2 string.toupper

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'string.toupper');
fwrite($fp, "Ceci est un test.\n");
/* affiche :  CECI EST UN TEST.   */
?>

string.tolower

L'utilisation de ce filtre est équivalent à traiter toutes les données du flux à travers la fonction strtolower().

Exemple #3 string.tolower

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'string.tolower');
fwrite($fp, "Ceci est un test.\n");
/* affiche :  ceci est un test.   */
?>

string.strip_tags

L'utilisation de ce filtre est équivalent à traiter toutes les données du flux à travers la fonction strip_tags(). Le filtre accepte des paramètres sous deux formats : Soit comme une chaîne de caractères contenant une liste de balises, similaire au second paramètre de la fonction strip_tags(), soit en tant qu'un tableau de noms de balises.

Avertissement

Cette fonctionnalité est OBSOLÈTE à partir de PHP 7.3.0. Dépendre de cette fonctionnalité est fortement déconseillé.

Exemple #4 string.strip_tags

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'string.strip_tags', STREAM_FILTER_WRITE, "<strong><em><span>");
fwrite($fp, "<strong>Ce texte en gras</strong> finit par être aggrandi <h1>en un titre 1</h1>\n");
fclose($fp);
/* affiche :  <strong>Ce texte en gras</strong> finit par être aggrandi en un titre 1   */

$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'string.strip_tags', STREAM_FILTER_WRITE, array('strong','em','span'));
fwrite($fp, "<strong>Ce texte en gras</strong> finit par être aggrandi <h1>en un titre 1</h1>\n");
fclose($fp);
/* affiche :  <strong>Ce texte en gras</strong> finit par être aggrandi en un titre 1   */
?>

User Contributed Notes

There are no user contributed notes for this page.


Filtres de conversion

Comme pour les filtres de chaîne de caractères, les filtres de conversion font ce que leur nom indique. Pour plus d'informations sur un filtre donné, se référer à la page du manuel de la fonction correspondante.

convert.base64-encode et convert.base64-decode

L'utilisation de ce filtre est équivalent à traiter toutes les données du flux à travers les fonctions base64_encode() et base64_decode() respectivement. convert.base64-encode supporte les paramètres sous forme de tableau associatif. Si line-length est fourni, la sortie base64 sera séparé en lignes de line-length caractères. Si line-break-chars est founi, chaque bloc de caractères sera délimité par le caractère fourni. Ces paramètres donnent le même effet que la fonction base64_encode() utilisée conjointement avec chunk_split().

Exemple #1 convert.base64-encode & convert.base64-decode

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'convert.base64-encode');
fwrite($fp, "This is a test.\n");
fclose($fp);
/* affiche :  VGhpcyBpcyBhIHRlc3QuCg==  */

$param = array('line-length' => 8, 'line-break-chars' => "\r\n");
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'convert.base64-encode', STREAM_FILTER_WRITE, $param);
fwrite($fp, "This is a test.\n");
fclose($fp);
/* affiche :  VGhpcyBp
           :  cyBhIHRl
           :  c3QuCg==  */

$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'convert.base64-decode');
fwrite($fp, "VGhpcyBpcyBhIHRlc3QuCg==");
fclose($fp);
/* affiche :  This is a test.  */
?>

convert.quoted-printable-encode et convert.quoted-printable-decode

L'utilisation de la version decode ce filtre est équivalent à traiter toutes les données du flux à travers la fonction quoted_printable_decode(). Il n'y a pas d'équivalent fonctionnel à convert.quoted-printable-encode. convert.quoted-printable-encode supporte les paramètres sous forme de tableau associatif. En plus des paramètres supportés par convert.base64-encode, convert.quoted-printable-encode accepte aussi les arguments booléen binary et force-encode-first. convert.base64-decode supporte uniquement le paramètre line-break-chars en tant qu'indicateur de type pour l'extraction de la charge codée.

Exemple #2 convert.quoted-printable-encode & convert.quoted-printable-decode

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'convert.quoted-printable-encode');
fwrite($fp, "This is a test.\n");
/* affiche :  =This is a test.=0A  */
?>

convert.iconv.*

Les filtres convert.iconv.* sont disponible, si le support de iconv est activé, et leurs usages est équivalent à traiter toutes les données du flux avec iconv(). Ces filtres ne supportent pas de paramètres, mais s'attendent à la place que le nom du filtre contienne l'encodage des données en saisie et de sortie, c.à.d. convert.iconv.<input-encoding>.<output-encoding> ou convert.iconv.<input-encoding>/<output-encoding> (les deux notations sont sémentiquement équivalente).

Exemple #3 convert.iconv.*

<?php
$fp = fopen('php://output', 'w');
stream_filter_append($fp, 'convert.iconv.utf-16le.utf-8');
fwrite($fp, "T\0h\0i\0s\0 \0i\0s\0 \0a\0 \0t\0e\0s\0t\0.\0\n\0");
fclose($fp);
/* Outputs: This is a test. */
?>

User Contributed Notes

There are no user contributed notes for this page.


Filtres de compression

Alors que les enveloppes de compression fournissent un moyen pour générer des fichiers aux formats gzip et bz2, ils ne permettent pas de gérer les protocoles réseaux compressés, ni de commencer avec un flux non compressé pour le transformer en flux compressé. Pour cela, un filtre de compression peut être appliqué à tout moment sur n'importe quelle ressource de flux.

Note: Les filtres de compression ne génèrent pas les en-têtes et fins de fichiers, comme le fait l'utilitaire gzip. Ils ne font que compresser et décompresser des portions de flux de données.

zlib.deflate and zlib.inflate

zlib.deflate (compression) et zlib.inflate (décompression) sont les implémentations des méthodes de compression présentées dans la » RFC 1951. Le filtre deflate prend jusqu'à trois paramètres, passés sous la forme de tableau associatif. level spécifie le niveau de compression souhaité, de 1 à 9. Plus le niveau est haut, meilleure est la compression, et plus cher est le coût de compression. Deux niveaux de compression spéciaux existent : 0, qui représente l'absence de compression, et -1, qui représente le niveau par défaut de zlib : actuellement, 6. window est la taille du tampon mémoire, en base 2. Les valeurs supérieures, jusqu'à 15, soit 32768 octets, donnent de meilleures compressions, et les valeurs inférieures, jusqu'à 9, soit 512 octets, occupent le moins d'espace en mémoire. Par défaut, window vaut actuellement 15. memory est une indication du niveau de mémoire nécessaire. Les valeurs valides vont de 1, pour l'allocation minimale, à 9, pour une allocation maximale. L'allocation de mémoire affecte la vitesse d'exécution, et non pas le coût global.

Note: Comme le niveau de compression est le paramètre le plus courant, il peut aussi être fourni en tant que valeur entier, au lieu d'un tableau.

Les filtres de compression zlib.* sont disponibles si le support de zlib est activé.

Exemple #1 zlib.deflate and zlib.inflate

<?php
$params = array('level' => 6, 'window' => 15, 'memory' => 9);

$original_text = "This is a test.\nThis is only a test.\nThis is not an important string.\n";
echo "Le texte original est long de " . strlen($original_text) . " octets.\n";

$fp = fopen('test.deflated', 'w');
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, $params);
fwrite($fp, $original_text);
fclose($fp);

echo "Le fichier compressé fait " . filesize('test.deflated') . " octets de long.\n";
echo "Le texte original était :\n";
/* Utilise readfile et zlib.inflate pour décompresser à la volée */
readfile('php://filter/zlib.inflate/resource=test.deflated');

/* Affiche :

Le texte original est long de 70 octets
Le fichier compressé fait 56 octets de long.
Le texte original était :
This is a test.
This is only a test.
This is not an important string.

 */
?>

Exemple #2 zlib.deflate simple

<?php
$original_text = "This is a test.\nThis is only a test.\nThis is not an important string.\n";
echo "Le texte original est long de " . strlen($original_text) . " octets.\n";

$fp = fopen('test.deflated', 'w');
/* Ici, "6" indique le niveau de compression de 6 */
stream_filter_append($fp, 'zlib.deflate', STREAM_FILTER_WRITE, 6);
fwrite($fp, $original_text);
fclose($fp);

echo "Le fichier compressé fait " . filesize('test.deflated') . " octets de long.\n";

/* Affiche :

Le texte original est long de 70 octets
Le fichier compressé fait 56 octets de long.

 */
?>

bzip2.compress and bzip2.decompress

bzip2.compress et bzip2.decompress fonctionnent de la même manière que les filtres zlib décrit ci-dessus. Le filtre bzip2.compress accepte jusqu'à 2 paramètres, sous la forme d'un tableau associatif : blocks est une valeur entier, de 1 à 9, spécifiant le nombre de blocs de 100 kb de mémoire à allouer à l'espace de travail. work est aussi un entier dont la valeur va de 0 à 250, et qui indique le niveau d'efforts fournis avec une méthode de compression avant de passer à une autre méthode, plus lente. Modifier ce paramètre n'a qu'un effet sur la vitesse de compression. Le gain d'espace ou la mémoire utilisée restent les mêmes. Un niveau de 0 indique que la bibliothèque doit utiliser sa configuration par défaut. Le filtre bzip2.decompress accepte uniquement un paramètre, qui peut être passé sous la forme d'un booléen, ou en tant que l'élément small d'un tableau associatif. small, lorsque définit à true, indique à la bibliothèque bzip qu'elle doit faire une décompression en utilisant le moins de mémoire possible, aux dépends de la vitesse.

Les filtres bzip2.* sont disponibles si le support de bz2 est activé.

Exemple #3 bzip2.compress et bzip2.decompress

<?php
$param = array('blocks' => 9, 'work' => 0);

echo "Le texte original est long de " . strlen(LICENSE) . " octets.\n";

$fp = fopen('LICENSE.compressed', 'w');
stream_filter_append($fp, 'bzip2.compress', STREAM_FILTER_WRITE, $param);
fwrite($fp, file_get_contents('LICENSE'));
fclose($fp);

echo "Le fichier compressé fait " . filesize('LICENSE.compressed') . " octets de long.\n";

/* Affiche :

Le texte original est long de 3288 octets.
Le fichier compressé fait 1488 octets de long.

 */
?>

User Contributed Notes

Anonymous 10-Feb-2021 06:37
To use the zlib.inflate filter with data originally written using gzcompress() or zlib.deflate, set the window option to 15 as outlined here: https://bugs.php.net/bug.php?id=68556

<?php
$fh = fopen(file_name, 'rb');
stream_filter_append($fh, 'zlib.inflate', STREAM_FILTER_READ, ['window' => 15]);
$contents = stream_get_contents($fh);
fclose($fh);
bohwaz 08-Jul-2018 01:39
Please note that there is currently a bug in this feature. ftell(), fseek() and fstat() functions cannot be used. Writing to a stream after using this function will not change the stream position as it should.

See bug: https://bugs.php.net/bug.php?id=49874

Also the zlib filters don't work with php://temp, php://memory and php://input streams, nothing is outputted to those streams.
Anonymous 21-Aug-2015 06:12
To read a gzip encoded stream from http
<?php
$opts = [
    "http" => [
        "method" => "GET",
        "header" => [ "Accept-Encoding: gzip" ],
    ]
];
$ctx = stream_context_create($opts);
$f = fopen("http://php.net", "r", false, $ctx);
// check  stream_get_meta_data($f)["wrapper_data"] has "Content-Encoding: gzip"
stream_filter_append($f, "zlib.inflate", STREAM_FILTER_READ, ["window" => 30]);
echo stream_get_contents($f); // any stream processing
fclose($f);


Filtres de chiffrement

Les filtres de chiffrement sont particulièrement utiles pour le chiffrement des fichiers/flux.

mcrypt.* and mdecrypt.*

Avertissement

Cette fonctionnalité est OBSOLÈTE à partir de PHP 7.1.0. Dépendre de cette fonctionnalité est fortement déconseillé.

mcrypt.* et mdecrypt.* fournissent un système de chiffrement symétrique utilisant libmcrypt. Les deux jeux de filtres supportent les mêmes algorithmes disponibles à l'extension mcrypt sous la forme mcrypt.ciphername où ciphername est le nom du chiffrement qui sera transmit à mcrypt_module_open(). Les cinq paramètres suivants sont aussi disponibles :

Paramètres des filtres mcrypt
Paramètre | Obligatoire ? | Par défaut | Valeurs possibles
mode | Optionnel | cbc | cbc, cfb, ecb, nofb, ofb, stream
algorithms_dir | Optionnel | ini_get('mcrypt.algorithms_dir') | Chemin vers les algorithmes de modules
modes_dir | Optionnel | ini_get('mcrypt.modes_dir') | Chemin vers les modes de modules
iv | Obligatoire | N/A | Généralement 8, 16 ou 32 octets de données binaires. Dépend du chiffrement
key | Obligatoire | N/A | Généralement 8, 16 ou 32 octets de données binaires. Dépend du chiffrement

Exemple #1 Chiffrement / Déchiffrement avec with Blowfish

<?php
//$key supposé être précédemment généré
$iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM);
$fp = fopen('encrypted-file.enc', 'wb');
fwrite($fp, $iv);
$opts = array('mode'=>'cbc','iv'=>$iv, 'key'=>$key);
stream_filter_append($fp, 'mcrypt.blowfish', STREAM_FILTER_WRITE, $opts);
fwrite($fp, 'message to encrypt');
fclose($fp);

//déchiffrement...
$fp = fopen('encrypted-file.enc', 'rb');
$iv = fread($fp, $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC));
$opts = array('mode'=>'cbc','iv'=>$iv, 'key'=>$key)
stream_filter_append($fp, 'mdecrypt.blowfish', STREAM_FILTER_READ, $opts);
$data = rtrim(stream_get_contents($fp));//trims off null padding
fclose($fp);
echo $data;
?>

Exemple #2 Chiffrer un fichier en utilisant AES-128 CBC avec SHA256 HMAC

<?php
AES_CBC::encryptFile($password, "plaintext.txt", "encrypted.enc");
AES_CBC::decryptFile($password, "encrypted.enc", "decrypted.txt");

class AES_CBC
{
   protected static $KEY_SIZES = array('AES-128'=>16,'AES-192'=>24,'AES-256'=>32);
   protected static function key_size() { return self::$KEY_SIZES['AES-128']; } //default AES-128
   public static function encryptFile($password, $input_stream, $aes_filename){
      $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
      $fin = fopen($input_stream, "rb");
      $fc = fopen($aes_filename, "wb+");
      if (!empty($fin) && !empty($fc)) {
         fwrite($fc, str_repeat("_", 32) );//placeholder, SHA256 HMAC will go here later
         fwrite($fc, $hmac_salt = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM));
         fwrite($fc, $esalt = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM));
         fwrite($fc, $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM));
         $ekey = hash_pbkdf2("sha256", $password, $esalt, $it=1000, self::key_size(), $raw=true);
         $opts = array('mode'=>'cbc', 'iv'=>$iv, 'key'=>$ekey);
         stream_filter_append($fc, 'mcrypt.rijndael-128', STREAM_FILTER_WRITE, $opts);
         $infilesize = 0;
         while (!feof($fin)) {
            $block = fread($fin, 8192);
            $infilesize+=strlen($block);
            fwrite($fc, $block);
         }
         $block_size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
         $padding = $block_size - ($infilesize % $block_size);//$padding is a number from 1-16
         fwrite($fc, str_repeat(chr($padding), $padding) );//perform PKCS7 padding
         fclose($fin);
         fclose($fc);
         $hmac_raw = self::calculate_hmac_after_32bytes($password, $hmac_salt, $aes_filename);
         $fc = fopen($aes_filename, "rb+");
         fwrite($fc, $hmac_raw);//overwrite placeholder
         fclose($fc);
      }
   }
   public static function decryptFile($password, $aes_filename, $out_stream) {
      $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
      $hmac_raw = file_get_contents($aes_filename, false, NULL,  0, 32);
      $hmac_salt = file_get_contents($aes_filename, false, NULL, 32, $iv_size);
      $hmac_calc = self::calculate_hmac_after_32bytes($password, $hmac_salt, $aes_filename);
      $fc = fopen($aes_filename, "rb");
      $fout = fopen($out_stream, 'wb');
      if (!empty($fout) && !empty($fc) && self::hash_equals($hmac_raw,$hmac_calc)) {
         fread($fc, 32+$iv_size);//skip sha256 hmac and salt
         $esalt = fread($fc, $iv_size);
         $iv    = fread($fc, $iv_size);
         $ekey = hash_pbkdf2("sha256", $password, $esalt, $it=1000, self::key_size(), $raw=true);
         $opts = array('mode'=>'cbc', 'iv'=>$iv, 'key'=>$ekey);
         stream_filter_append($fc, 'mdecrypt.rijndael-128', STREAM_FILTER_READ, $opts);
         while (!feof($fc)) {
            $block = fread($fc, 8192);
            if (feof($fc)) {
               $padding = ord($block[strlen($block) - 1]);//assume PKCS7 padding
               $block = substr($block, 0, 0-$padding);
            }
            fwrite($fout, $block);
         }
         fclose($fout);
         fclose($fc);
      }
   }
   private static function hash_equals($str1, $str2) {
      if(strlen($str1) == strlen($str2)) {
         $res = $str1 ^ $str2;
         for($ret=0,$i = strlen($res) - 1; $i >= 0; $i--) $ret |= ord($res[$i]);
         return !$ret;
      }
      return false;
   }
   private static function calculate_hmac_after_32bytes($password, $hsalt, $filename) {
      static $init=0;
      $init or $init = stream_filter_register("user-filter.skipfirst32bytes", "FileSkip32Bytes");
      $stream = 'php://filter/read=user-filter.skipfirst32bytes/resource=' . $filename;
      $hkey = hash_pbkdf2("sha256", $password, $hsalt, $iterations=1000, 24, $raw=true);
      return hash_hmac_file('sha256', $stream, $hkey, $raw=true);
   }
}
class FileSkip32Bytes extends php_user_filter
{
   private $skipped=0;
   function filter($in, $out, &$consumed, $closing)  {
      while ($bucket = stream_bucket_make_writeable($in)) {
         $outlen = $bucket->datalen;
         if ($this->skipped<32){
            $outlen = min($bucket->datalen,32-$this->skipped);
            $bucket->data = substr($bucket->data, $outlen);
            $bucket->datalen = $bucket->datalen-$outlen;
            $this->skipped+=$outlen;
         }
         $consumed += $outlen;
         stream_bucket_append($out, $bucket);
      }
      return PSFS_PASS_ON;
   }
}
class AES_128_CBC extends AES_CBC {
   protected static function key_size() { return self::$KEY_SIZES['AES-128']; }
}
class AES_192_CBC extends AES_CBC {
   protected static function key_size() { return self::$KEY_SIZES['AES-192']; }
}
class AES_256_CBC extends AES_CBC {
   protected static function key_size() { return self::$KEY_SIZES['AES-256']; }
}

User Contributed Notes

Maarten Bodewes 06-Aug-2017 12:21
The examples on this page should be destroyed with utmost urgency.

Strangely most people will fall over the use of generating the IV and 3DES key using MD5, a weak hash function, e.g. the previous note and CryptoFails blog.

http://www.cryptofails.com/post/70059608390/php-documentation-woes

A password based key derivation function should be used (bcrypt, PBKDF2).

However the use of MD-5 for key derivation however isn't that bad and if the password is strong enough (it usually isn't) then the generated DES ABC key is strong enough even now.

Using an identical IV for each password means that this function directly leaks information about the encrypted file. If the start of two encrypted files is identical then this function will directly leak information. For instance, if the routine encrypts multiple images then the JPEG header would be easily distinguished.

All in all these examples use deprecated routines (mcrypt), deprecated cryptographic functions (MD5 / DES) and then incorrectly perform the actual encryption. Enough reason to destroy them in the first place.
Uwe Ohse 22-Feb-2017 04:17
1) The mcrypt module has been deprecated with PHP 7.1.
What does that mean for the encryption filters?

2) deriving the IV from the secret passphrase seems wrong. This leaks information about the passphrase without need.

3) using md5() for this? Really? hash() has been available since PHP 5.1.2.

4) hashing the passphrase twice does not add any security.

5) using substr() on binary data (why, oh why, is true passed to md5()?) might lead to headaches if mbstring.func_overload is used.


Liste des modes de transport de sockets disponibles

Sommaire

  • Domaines Internet : TCP, UDP, SSL et TLS
  • Domaine Unix : UNIX et UDG

Voici la liste des différents modes de transport, format URL, dont PHP dispose en interne pour les flux qui exploitent les sockets, tels que fsockopen() et stream_socket_client(). Ces modes de transport ne s'appliquent pas à l'extension sockets.

Pour connaître la liste des modes de transport installés sur votre version de PHP, utilisez stream_get_transports().

User Contributed Notes

There are no user contributed notes for this page.


Domaines Internet : TCP, UDP, SSL et TLS

ssl://, tls://, sslv2:// & sslv3://.

Note: Si aucun transport n'est spécifié, tcp:// est utilisé.

  • 127.0.0.1
  • fe80::1
  • www.example.com
  • tcp://127.0.0.1
  • tcp://fe80::1
  • tcp://www.example.com
  • udp://www.example.com
  • ssl://www.example.com
  • sslv2://www.example.com
  • sslv3://www.example.com
  • tls://www.example.com

Les sockets du domaine Internet utilisent un numéro de port en plus de l'adresse de l'hôte. Dans le cas de fsockopen(), il est spécifié en deuxième paramètre et, donc, n'a pas d'impact sur le format du mode de transport. Avec stream_socket_client() et les autres fonctions de la même famille, le numéro de port est spécifié comme un suffixe dans l'URL de transport, identifié par le signe deux-points.

  • tcp://127.0.0.1:80
  • tcp://[fe80::1]:80
  • tcp://www.example.com:80

Note: Adresse IPv6 et numéro de port
Dans le second exemple ci-dessus, les exemples en IPv4 et les noms d'hôtes sont identiques, mais les IPv6 sont placées entre crochets, en plus d'avoir les deux-points et le numéro de port : [fe80::1]. Cela permet de distinguer les deux-points utilisés en IPv6 et le deux-points utilisés pour délimiter le numéro de port.

Les modes ssl:// et tls:// (disponibles uniquement lorsque le support OpenSSl est compilé avec PHP) sont des extensions de tcp:// qui incluent le chiffrement SSL.

ssl:// va tenter de négocier une connexion SSL V2 ou SSL V3, suivant les capacités et les références de l'hôte distant. sslv2:// et sslv3:// sélectionnent explicitement le protocole.

User Contributed Notes

christian at lantian dot eu 17-Sep-2013 12:46
@pablo dot livardo  :  I think that the problem you found is caused by the difference between the client/server encryption methods used.

The 465 port is used for SMTPS, and the server starts the encryption immediately it receives your connection. So, your code will work.

The 587 port is used for Submission (MSA or Mail Submission Agent) which works like the port 25. The server accepts your connection and doesn't activate the encryption. If you want an encrypted connection on the port 587, you must connect on it without encryption, you must start to dialog with the server (with EHLO) and after that you must ask the server to start the encrypted connection using the STARTTLS command. The server starts the encryption and now you can start as well the encryption on your client.

So, in few words, you can not use :

<?php $fp = fsockopen("tls://mail.example.com", 587, $errno, $errstr);  ?>

but you can use:

 <?php $fp = stream_socket_client("mail.example.com:587", $errno, $errstr); ?>

and after you send the STARTTLS command, you can enable the crypto:

<?php stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT); ?>

P.S. My previous note on this page was totally wrong, so I ask the php.net admin to remove it.

:)
christian at lantian dot eu 16-Sep-2013 08:17
@pablo dot livardo  :  I think that the problem you found is caused by the difference between the client/server encryption methods used.

You tried to access the port 587 using TLS encryption, but the server uses the SSLv3 encryption on this port.

You can communicate with the Google server on port 465 because on this port the communication is encrypted using TLS and your client is configured to recognize the TLS.

So, if you want to connect on the Google server over the port 587, you simply must write:

<?php
$fp = fsockopen("ssl://mail.example.com", 587, $errno, $errstr);
?>

instead of:

<?php
$fp = fsockopen("tls://mail.example.com", 587, $errno, $errstr);
?>

:)
stefan at example dot com 20-Aug-2010 05:42
Actually, PHP is very able to start with an unencrypted connection and then switch to an encrypted one - refer to http://php.net/stream_socket_enable_crypto .
pablo dot livardo at gmail dot com 09-Dec-2009 09:56
I've been having a problem with a TLS connection.

<?php
$fp = fsockopen("tls://mail.example.com", 587, $errno, $errstr);
?>

Which gives me an error of:

SSL operation failed with code 1. OpenSSL Error messages: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number

I believe this is caused by PHP not being able to start with an unencrypted connection and then switch to encryption even though the functionality is built into OpenSSL.

For Google Mail users you can avoid this by using port 465 instead of 587.


Domaine Unix : UNIX et UDG

unix:// et udg:// (udg:// depuis PHP 5).

  • unix:///tmp/mysock
  • udg:///tmp/mysock

unix:// fournit l'accès à un flux de type socket, sur un domaine Unix. udg:// fournit un mode de transport alternatif, avec un protocole de datagrammes utilisateurs.

Les sockets du domaine Unix, contrairement à celles du domaine Internet, n'utilisent pas de numéro de port. Dans ce cas, le paramètre portno de fsockopen() doit valoir 0.

Note: Les sockets du domaine Unix ne sont pas supporté sur Windows.

User Contributed Notes

Matthew Fortune 16-Feb-2007 03:03
It appears that fsockopen prior to php5 did not need the unix:// qualifier when opening a unix domain socket:

php4: fsockopen("/tmp/mysocket"......);

php5: fsockopen("unix:///tmp/mysocket"......);

This caught me out when upgrading.


Comparaison de types en PHP

La table suivante résume les différents comportements de PHP avec les types et opérateurs de comparaison, strictes ou larges. Cette table est aussi reliée au transtypage. Elle a été inspirée par différents commentaires d'utilisateurs, et par le travail fait chez » BlueShoes.

Avant d'utiliser ces tables, il est important de comprendre les types et leur signification. Par exemple, "42" est une chaîne de caractères, alors que 42 est un entier. false est bool alors que "false" est une chaîne de caractères.

Note:

Les formulaires HTML ne connaissent pas les entiers, nombres à virgules et autres booléens. Pour savoir si une structure est un entier, utilisez is_numeric().

Note:

La ligne if ($x) génère une erreur de niveau E_NOTICE lorsque $x est indéfini. Alternativement, utilisez plutôt les fonctions empty() ou isset(), ou encore, initialisez toutes vos variables.

Note:

Des opérations numériques peuvent donner une valeur représentée par la constante NAN. Toutes les comparaisons de cette valeur avec une autre valeur, y compris cette même valeur, à l'exception de true aura comme résultat false (i.e. NAN != NAN et NAN !== NAN). Exemples d'opérations qui produisent la valeur NAN : sqrt(-1), asin(2), et acosh(0).

Comparaisons de $x avec des fonctions PHP
Expression | gettype() | empty() | is_null() | isset() | bool : if($x)
$x = ""; | chaîne de caractères | true | false | true | false
$x = null; | NULL | true | true | false | false
var $x; | NULL | true | true | false | false
$x est indéfini | NULL | true | true | false | false
$x = array(); | array | true | false | true | false
$x = array('a', 'b'); | array | false | false | true | true
$x = false; | bool | true | false | true | false
$x = true; | bool | false | false | true | true
$x = 1; | entier | false | false | true | true
$x = 42; | entier | false | false | true | true
$x = 0; | entier | true | false | true | false
$x = -1; | entier | false | false | true | true
$x = "1"; | chaîne de caractères | false | false | true | true
$x = "0"; | chaîne de caractères | true | false | true | false
$x = "-1"; | chaîne de caractères | false | false | true | true
$x = "php"; | chaîne de caractères | false | false | true | true
$x = "true"; | chaîne de caractères | false | false | true | true
$x = "false"; | string | false | false | true | true

Comparaison large avec ==
 | true | false | 1 | 0 | -1 | "1" | "0" | "-1" | null | array() | "php" | ""
true | true | false | true | false | true | true | false | true | false | false | true | false
false | false | true | false | true | false | false | true | false | true | true | false | true
1 | true | false | true | false | false | true | false | false | false | false | false | false
0 | false | true | false | true | false | false | true | false | true | false | true | true
-1 | true | false | false | false | true | false | false | true | false | false | false | false
"1" | true | false | true | false | false | true | false | false | false | false | false | false
"0" | false | true | false | true | false | false | true | false | false | false | false | false
"-1" | true | false | false | false | true | false | false | true | false | false | false | false
null | false | true | false | true | false | false | false | false | true | true | false | true
array() | false | true | false | false | false | false | false | false | true | true | false | false
"php" | true | false | false | true | false | false | false | false | false | false | true | false
"" | false | true | false | true | false | false | false | false | true | false | false | true

Comparaison stricte avec ===
 | true | false | 1 | 0 | -1 | "1" | "0" | "-1" | null | array() | "php" | ""
true | true | false | false | false | false | false | false | false | false | false | false | false
false | false | true | false | false | false | false | false | false | false | false | false | false
1 | false | false | true | false | false | false | false | false | false | false | false | false
0 | false | false | false | true | false | false | false | false | false | false | false | false
-1 | false | false | false | false | true | false | false | false | false | false | false | false
"1" | false | false | false | false | false | true | false | false | false | false | false | false
"0" | false | false | false | false | false | false | true | false | false | false | false | false
"-1" | false | false | false | false | false | false | false | true | false | false | false | false
null | false | false | false | false | false | false | false | false | true | false | false | false
array() | false | false | false | false | false | false | false | false | false | true | false | false
"php" | false | false | false | false | false | false | false | false | false | false | true | false
"" | false | false | false | false | false | false | false | false | false | false | false | true

User Contributed Notes

Anonymous 17-Nov-2020 02:24
I noticed that some "magic" also happens when comparing strings with leading zeros with only two equal signs:

<?php
var_dump('1' == '01');
var_dump('01' == '000001');
?>

Output:
bool(true)
bool(true)

If the string contains only numbers all leading zeroes seem to be ignored.
TrickyFoxy 02-Jan-2020 08:25
<?php
echo md5('240610708') == md5('QNKCDZO') ? "equal" : "not equal"; // prints equal!!!
php at ckls dot net 20-Aug-2018 02:50
regarding the editors note in php at richardneill dot org note:
[Editor's note: As of PHP 5.4.4 this is no longer true. Integral strings that overflow into floating point numbers will no longer be considered equal.]

While this is true, there is still the following behaviour:
<?php
$x = "1";
$y = "+1";
var_dump($x == $x);
?>
outputs "bool(true)".
So still be wary of string-comparison where both strings might be interpreted as numbers.
mark at theanti dot social 29-Mar-2018 08:59
There is also 0.0 which is not identical to 0.

  $x = 0.0;
  gettype($x); // double
  empty($x); // true
  is_null($x); //false
  isset($x); // true
  is_numeric($x); // true
  $x ? true : false; // false
  $x == 0; // true
  $x == "0"; // true
  $x == "0.0"; // true
  $x == false; // true
  $x == null; // true
  $x === 0; // false
  $x === false; // false
  $x === null; // false
  $x === "0"; // false
  $x === "0.0"; // false
alt dot jl-3gi8b7l at binich dot com 10-Mar-2018 03:41
Here's how PHP handles loose and strict comparisons of default parameters in functions:

Very unintuitive:

<?php
function f($x='surprise')
    {
    if ($x == 'surprise')
        return $x; // returns 0 !!
    }

echo f(0);
?>

Here some further tests:

<?php
function f($x='surprise')
    {
    if ($x == 'surprise')
        return 'A:'.$x;
    if ($x === 'surprise')
        return 'B:'.$x;
    return 'C:'.$x;
    }

echo "\n".f(0); // A:0 !!
echo "\n".f(0.0); // A:0 !!
echo "\n".f(NULL); // C: !!
echo "\n".f(FALSE); // C:
echo "\n".f(); // A:surprise
echo "\n".f(''); // C:
echo "\n".f((integer)0); // A:0
echo "\n".f((string)0); // C:0
echo "\n".f('0'); // C:0
echo "\n".f(0.1); // C:0.1
echo "\n".f(array()); // C:Array
echo "\n".f('surprise'); // A:surprise
?>
biziclop at vipmail dot hu 12-Aug-2017 08:57
Want to strictly compare integers that may or may not be converted to floats (via PHPExcel import/export, etc.)? You are out of luck:

var_dump(   (int)1 ===   (int)1 ); // bool(true)
var_dump( (float)1 === (float)1 ); // bool(true)
var_dump( (float)1 ===   (int)1 ); // bool(false)
var_dump(   (int)1 === (float)1 ); // bool(false)

This slightly complicated function might help you:

function equal_numbers( $a, $b ){
  if( $a === $b )  return true;
  if(   is_int( $a ) && is_float( $b ))  return (float)$a === $b && $a ===   (int)$b;
  if( is_float( $a ) &&   is_int( $b ))  return   (int)$a === $b && $a === (float)$b;
  return false;
}

Here are some tests:

test(100, 100.0 ); // int(100) float(100) bool(true)
test(  0,  -0   ); // int(0)   int(0)     bool(true)
test( -0,  -0.0 ); // int(0)   float(-0)  bool(true)
test(  0, 1/0   ); // int(0)   float(INF) bool(false)
test(  0, acos(2));// int(0)   float(NAN) bool(false)
test(       PHP_INT_MAX * 10, 0 );             //float(92233720368547758080) int(0) bool(false)
test((float)PHP_INT_MAX,     PHP_INT_MAX     );//float(9223372036854775808)  int(9223372036854775807) bool(false)
test((float)PHP_INT_MAX / 2, PHP_INT_MAX / 2 );//float(4611686018427387904)  float(4611686018427387904) bool(true)

function test( $a, $b ){
  var_dump( $a, $b, equal_numbers( $a, $b ));
}
engineer dot morozov at gmail dot com 07-Feb-2016 03:23
If you want to calculate how much more/less items by the criterion

Example:

in loop:
$counter += intval($item->isValid()) <=> 0.5;

if $counter >= 0 - valid items are more then invalid on $counter
if $counter  < 0 - valid items are less then invalid on $counter
trexx68 25-Apr-2015 05:11
If you want to view the truth tables colorized, just:

1. Save a local copy of this page as an .html file,
2. View the page source with any text editor.
3. Replace the opening <head> tag so it will include this:

<head>
  <script src="https://code.jquery.com/jquery-1.10.2.js"></script>

4. Replace the closing </body> tag with this:

  <script>
    $( "td:contains('FALSE')" ).css("color", "red");
    $( "td:contains('TRUE')" ).css("color", "green");
  </script>
</body>

5. Save the file, and view it on your browser.  Enjoy.
aravind dot a dot padmanabhan at gmail dot com 22-Apr-2015 02:31
please note that

$x = 0.0 ;
print empty($x); // returns 1 (true)

$x = "0.0";
print empty($x); // returns blank (false);
Anonymous 16-Oct-2014 06:19
The loose comparison chart is missing a few things.

array(1)==true returns true.

also:

(int)array(1) === 1 returns true

This is symmetric:

array(1) === (array)1 returns true

but the loose comparison

array(1)==1 still returns false.
blue dot hirano at gmail dot com 07-Sep-2014 02:29
The truth tables really ought to be colorized; they're very hard to read as they are right now (just big arrays of TRUE and FALSE).

Also, something to consider: clustering the values which compare similarly (like is done on qntm.org/equality) would make the table easier to read as well. (This can be done simply by hand by rearranging the order of headings to bring related values closer together).
Anonymous 21-Nov-2013 01:43
I'm running PHP 5.5.3.

This is a correction to one of the previous posts.

<?php
$o = new stdClass();
$o->we = 12;

$o2 = new stdClass();
$o2->we = 12;

$o3 = clone $o2;
var_dump($o == $o2); //true
var_dump($o === $o2); //false
var_dump($o3 === $o2); //false
?>

Output is:

true, false, false
crazy888s at hotmail dot com 14-Dec-2012 06:14
PHP's loose comparisons can be a huge convenience when used properly! It's extremely helpful to just remember the following are always FALSE:

null, false, "", 0, "0", array()

If your application never depends on a particular "empty/false/null/0/not set" value type, you won't have to worry about 99% of the other weird cases listed here. You won't need empty() or isset(). And ALL variable types will always work as expected for statements like:

if(boolean && !string){...}
if(array){...}
if(!null || int){...}

Consider the same when working with your database values.
php at richardneill dot org 12-Apr-2012 07:45
[Editor's note: As of PHP 5.4.4 this is no longer true. Integral strings that overflow into floating point numbers will no longer be considered equal.]

Be wary of string-comparison where both strings might be interpreted as numbers.  Eg:

$x="123456789012345678901234567890"; $y="123456789012345678900000000000";
echo  ($x==$y)?"equal":"not_equal";   #Prints equal !!

Both strings are getting converted to floats, then losing precision, then becoming equal :-(

Using "===" or making either of the strings non-numeric will prevent this.
[This is on a 32-bit machine, on a 64-bit, you will have to make the strings longer to see the effect]
Jouriy LYSENKO 17-Jun-2011 02:18
If $var not declared.

In php 5.2 :
<?php if($var) ?> - work

in php 5.3 :
<?php if($var) ?> - dont work and generate error E_NOTICE
php at benizi dot com 15-Feb-2010 10:31
It's interesting to note that 'empty()' and 'boolean : if($x)'
are paired as logical opposites, as are 'is_null()' and 'isset()'.
edgar at goodforall dot eu 15-Dec-2009 06:55
Some function to write out your own comparisson table in tsv format. Can be easily modified to add more testcases and/or binary functions. It will test all comparables against each other with all functions.

<?php
$funcs = array(
        /* Testing equality */
        'eq' => '==',
        'ne' => '!=',
        'gt' => '>',
        'lt' => '<',
        'ne2' => '<>',
        'lte' => '<=',
        'gte' => '>=',
        /* Testing identity */
        'id' => '===',
        'nid' => '!=='
);
class Test {
        protected $a;
        public $b;
        public function __construct($a,$b){
                $this->a = $a;
                $this->b = $b;
        }
        public function getab(){
                return $this->a.",". $this->b;
        }

}
$tst1 = new Test(1,2);
$tst2 = new Test(1,2);
$tst3 = new Test(2,2);
$tst4 = new Test(1,1);

$arr1 = array(1,2,3);
$arr2 = array(2,3,4);
$arr3 = array('a','b','c','d');
$arr4 = array('a','b','c');
$arr5 = array();

$comp1 = array(
        'ints' => array(-1,0,1,2),
        'floats' => array(-1.1,0.0,1.1,2.0),
        'string' => array('str', 'str1', '', '1'),
        'bools' => array(true, false),
        'null' => array(null),
        'objects' => array($tst1,$tst2,$tst3,$tst4),
        'arrays' => array($arr1, $arr2, $arr3, $arr4, $arr5)
);
$fbody = array();

foreach($funcs as $name => $op){
        $fbody[$name] = create_function('$a,$b', 'return $a ' . $op . ' $b;');
}

$table = array(array('function', 'comp1', 'comp2', 'f comp1 comp2', 'type'));
/* Do comparisons */
$comp2  = array();
foreach($comp1 as $type => $val){
        $comp2[$type] = $val;
}

foreach($comp1 as $key1 => $val1){
        foreach($comp2 as $key2 => $val2){
                addTableEntry($key1, $key2, $val1, $val2);
        }
}
$out = '';
foreach($table as $row){
        $out .= sprintf("%-20s\t%-20s\t%-20s\t%-20s\t%-20s\n", $row[0], $row[1], $row[2], $row[3], $row[4]);
}

print $out;
exit;

function addTableEntry($n1, $n2, $comp1, $comp2){
        global $table, $fbody;
        foreach($fbody as $fname => $func){
                        foreach($comp1 as $val1){
  foreach($comp2 as $val2){
                                        $val = $func($val1,$val2);
                                                $table[] = array($fname, gettype($val1) . ' => ' . sprintval($val1), gettype($val2) .' => ' . sprintval($val2), gettype($val) . ' => ' . sprintval($val), gettype($val1) . "-" . gettype($val2) . '-' . $fname);
                                        }
                        }
        }
}

function sprintval($val){
        if(is_object($val)){
                return 'object-' . $val->getab();
        }
        if(is_array($val)){
                return implode(',', $val);
        }
        if(is_bool($val)){
                if($val){
                        return 'true';
                }
                return 'false';
        }
        return strval($val);
}

?>
info at shaelf dot ru 06-Jan-2008 01:51
Compare object
<?php
$o = new stdClass();
$o->we = 12;

$o2 = new stdClass();
$o2->we = 12;

$o3 = clone $o2;
var_dump($o == $o2); //true
var_dump($o === $o2); //false
var_dump($o3 === $o2); //true
?>
frank 14-Aug-2007 03:06
A comparison table for <=,<,=>,> would be nice...
Following are TRUE (tested PHP4&5):
NULL <= -1
NULL <= 0
NULL <= 1
!(NULL >= -1)
NULL >= 0
!(NULL >= 1)
That was a surprise for me (and it is not like SQL, I would like to have the option to have SQL semantics with NULL...).
Jan 29-Dec-2005 11:23
Note that php comparison is not transitive:

"php" == 0 => true
0 == null => true
null == "php" => false
jerryschwartz at comfortable dot com 26-Jul-2005 01:04
In some languages, a boolean is promoted to an integer (with a value of 1 or -1, typically) if used in an expression with an integer. I found that PHP has it both ways:

If you add a boolean with a value of true to an integer with a value of 3, the result will be 4 (because the boolean is cast as an integer).

On the other hand, if you test a boolean with a value of true for equality with an integer with a value of three, the result will be true (because the integer is cast as a boolean).

Surprisingly, at first glance, if you use either < or > as the comparison operator the result is always false (again, because the integer as cast as a boolean, and true is neither greater nor less than true).
tom 17-Jun-2005 02:27
<?php
if (strlen($_POST['var']) > 0) {
    // form value is ok
}
?>

When working with HTML forms this a good way to:

(A) let "0" post values through like select or radio values that correspond to array keys or checkbox booleans that would return FALSE with empty(), and;
(B) screen out $x = "" values, that would return TRUE with isset()!

Because HTML forms post values as strings, this is a good way to test variables!

[[Editor Note: This will create a PHP Error of level E_NOTICE if the checked variable (in this case $_POST['var']) is undefined. It may be used after (in conjuection with) isset() to prevent this.]]
aidan at php dot net 24-Jan-2005 07:00
The way PHP handles comparisons when multiple types are concerned is quite confusing.

For example:
"php" == 0

This is true, because the string is casted interally to an integer. Any string (that does not start with a number), when casted to an integer, will be 0.


Liste des tokens de l'analyseur

De nombreuses parties du langage PHP sont représentées en interne par des tokens. Littéralement, ce sont des trucs, ou jetons. Ici, des briques de base, comme T_SR. PHP affiche des identifiants comme celui-ci dans les erreurs d'analyse, par exemple : unexpected T_SR, expecting ',' or ';' in script.php on line 10..

Vous êtes suppposé savoir ce que T_SR signifie. Pour ceux qui ne le savent pas, voici une liste de ces identifiants, la syntaxe PHP correspondante, et les références appropriées au manuel.

Note: Utilisation des constantes T_*

Tous les tokens listés ci-dessous sont également définis comme constantes PHP. Leurs valeurs sont automatiquement générées suivant l'infrastructure sous jacente de PHP. Ceci signifie que la valeur concrète d'un token peut changer entre deux versions de PHP. Par exemple, la constante T_FILE vaut 365 en PHP 5.3, alors que la même valeur se réfère maintenant à la constante T_TRAIT en PHP 5.4 et la valeur de la constante T_FILE est de 369. Ceci signifie que votre code ne doit jamais utiliser la valeur littérale des constantes T_* depuis une version PHP X.Y.Z et ce, afin d'assurer une meilleure portabilité entre plusieurs versions de PHP. À la place, votre code doit utiliser les valeurs (utilisation de très grand nombre comme 10000) ainsi qu'une stratégie appropriée qui fonctionnera à la fois avec les versions de PHP et les valeurs T_*.

Tokens
Token | Syntaxe | Référence
T_ABSTRACT | abstract | Abstraction de classes
T_AND_EQUAL | &= | opérateurs d'assignation
T_ARRAY | array() | array(), syntaxe de tableau
T_ARRAY_CAST | (array) | transtypage
T_AS | as | foreach
T_BAD_CHARACTER |  | Tous les caractères en dessous de ASCII 32 excepté \t (0x09), \n (0x0a) et \r (0x0d) (disponible à partir de PHP 7.4.0)
T_BOOLEAN_AND | && | opérateurs logiques
T_BOOLEAN_OR | || | opérateurs logiques
T_BOOL_CAST | (bool) ou (boolean) | transtypage
T_BREAK | break; | break
T_CALLABLE | callable | callable
T_CASE | case | switch
T_CATCH | catch | Les exceptions
T_CLASS | class | classes et objets
T_CLASS_C | __CLASS__ | constantes magiques
T_CLONE | clone | classes et objets
T_CLOSE_TAG | ?> or %> | échapper depuis le HTML
T_COALESCE | ?? | opérateurs de comparaison
T_COALESCE_EQUAL | ??= | opérateurs d'assignation (disponible depuis PHP 7.4.0)
T_COMMENT | // ou #, et /* */ | commentaires
T_CONCAT_EQUAL | .= | opérateurs d'assignation
T_CONST | const | constantes de classe
T_CONSTANT_ENCAPSED_STRING | "foo" ou 'bar' | syntaxe chaîne de caractères
T_CONTINUE | continue | continue
T_CURLY_OPEN | {$ | syntaxe d'analyse de variable complexe
T_DEC | -- | opérateurs d'incrémention/décrémention
T_DECLARE | declare | declare
T_DEFAULT | default | switch
T_DIR | __DIR__ | constantes magiques
T_DIV_EQUAL | /= | opérateurs d'assignation
T_DNUMBER | 0.12, etc. | nombres à virgule flottante
T_DO | do | do..while
T_DOC_COMMENT | /** */ | style de commentaire dans la PHPDoc
T_DOLLAR_OPEN_CURLY_BRACES | ${ | syntaxe de variable complexe analysée
T_DOUBLE_ARROW | => | syntaxe de tableau
T_DOUBLE_CAST | (real), (double) ou (float) | transtypage
T_DOUBLE_COLON | :: | Voyez T_PAAMAYIM_NEKUDOTAYIM plus bas
T_ECHO | echo | echo
T_ELLIPSIS | ... | les arguments de fonction
T_ELSE | else | else
T_ELSEIF | elseif | elseif
T_EMPTY | empty | empty()
T_ENCAPSED_AND_WHITESPACE | " $a" | partie des constantes d'une chaîne de caractères contenant des variables
T_ENDDECLARE | enddeclare | declare, syntaxe alternative
T_ENDFOR | endfor | for, syntaxe alternative
T_ENDFOREACH | endforeach | foreach, syntaxe alternative
T_ENDIF | endif | if, syntaxe alternative
T_ENDSWITCH | endswitch | switch, syntaxe alternative
T_ENDWHILE | endwhile | while, syntaxe alternative
T_END_HEREDOC |  | syntaxe heredoc
T_EVAL | eval() | eval()
T_EXIT | exit ou die | exit(), die()
T_EXTENDS | extends | extends, classes et objets
T_FILE | __FILE__ | constantes magiques
T_FINAL | final | Mot-clé "final"
T_FINALLY | finally | Les exceptions
T_FN | fn | fonctions fléchées (disponible depuis PHP 7.4.0)
T_FOR | for | for
T_FOREACH | foreach | foreach
T_FUNCTION | function | fonctions
T_FUNC_C | __FUNCTION__ | constantes magiques
T_GLOBAL | global | scope de variable
T_GOTO | goto | goto
T_HALT_COMPILER | __halt_compiler() | __halt_compiler
T_IF | if | if
T_IMPLEMENTS | implements | Interfaces
T_INC | ++ | opérateurs d'incrémention/décrémention
T_INCLUDE | include() | include
T_INCLUDE_ONCE | include_once() | include_once
T_INLINE_HTML |  | texte en dehors de PHP
T_INSTANCEOF | instanceof | opérateurs de type
T_INSTEADOF | insteadof | Traits
T_INTERFACE | interface | Interfaces
T_INT_CAST | (int) ou (integer) | transtypage
T_ISSET | isset() | isset()
T_IS_EQUAL | == | opérateurs de comparaison
T_IS_GREATER_OR_EQUAL | >= | opérateurs de comparaison
T_IS_IDENTICAL | === | opérateurs de comparaison
T_IS_NOT_EQUAL | != ou <> | opérateurs de comparaison
T_IS_NOT_IDENTICAL | !== | opérateurs de comparaison
T_IS_SMALLER_OR_EQUAL | <= | opérateurs de comparaison
T_LINE | __LINE__ | constantes magiques
T_LIST | list() | list()
T_LNUMBER | 123, 012, 0x1ac, etc. | entiers
T_LOGICAL_AND | and | opérateurs logiques
T_LOGICAL_OR | or | opérateurs logiques
T_LOGICAL_XOR | xor | opérateurs logiques
T_METHOD_C | __METHOD__ | constantes magiques
T_MINUS_EQUAL | -= | opérateurs d'assignation
T_MOD_EQUAL | %= | opérateurs d'assignation
T_MUL_EQUAL | *= | opérateurs d'assignation
T_NAMESPACE | namespace | espaces de noms
T_NEW | new | classes et objets
T_NS_C | __NAMESPACE__ | espaces de noms
T_NS_SEPARATOR | \ | espaces de noms
T_NUM_STRING | "$a[0]" | index d'un tableau numérique se trouvant dans une chaîne de caractères
T_OBJECT_CAST | (object) | transtypage
T_OBJECT_OPERATOR | -> | classes et objets
T_NULLSAFE_OBJECT_OPERATOR | ?-> | classes et objets
T_OPEN_TAG | <?php, <? or <% | sortie du mode HTML
T_OPEN_TAG_WITH_ECHO | <?= ou <%= | sortie du mode HTML
T_OR_EQUAL | |= | opérateurs d'assignation
T_PAAMAYIM_NEKUDOTAYIM | :: | ::. Définie également en tant que T_DOUBLE_COLON.
T_PLUS_EQUAL | += | opérateurs d'assignation
T_POW | ** | les opérateurs arithmétiques
T_POW_EQUAL | **= | les opérateurs d'affectation
T_PRINT | print() | print
T_PRIVATE | private | classes et objets
T_PROTECTED | protected | classes et objets
T_PUBLIC | public | classes et objets
T_REQUIRE | require() | require
T_REQUIRE_ONCE | require_once() | require_once
T_RETURN | return | valeurs retournées
T_SL | << | opérateurs sur les bits
T_SL_EQUAL | <<= | opérateurs d'assignation
T_SPACESHIP | <=> | opérateurs de comparaisons
T_SR | >> | opérateurs sur les bits
T_SR_EQUAL | >>= | opérateurs d'assignation
T_START_HEREDOC | <<< | syntaxe heredoc
T_STATIC | static | scope de variable
T_STRING | parent, self, etc. | identifiants, e.g. mots-clés comme parent et self, noms de fonctions, classes et autres, correspondent. Voir aussi T_CONSTANT_ENCAPSED_STRING.
T_STRING_CAST | (string) | transtypage
T_STRING_VARNAME | "${a | syntaxe d'analyse d'une variable complexe
T_SWITCH | switch | switch
T_THROW | throw | Les exceptions
T_TRAIT | trait | Traits
T_TRAIT_C | __TRAIT__ | __TRAIT__
T_TRY | try | Les exceptions
T_UNSET | unset() | unset()
T_UNSET_CAST | (unset) | type-casting
T_USE | use | namespaces
T_VAR | var | classes et objets
T_VARIABLE | $foo | variables
T_WHILE | while | while, do...while
T_WHITESPACE | \t \r\n |
T_XOR_EQUAL | ^= | opérateurs d'assignation
T_YIELD | yield | générateurs
T_YIELD_FROM | yield from | générateurs

Voir aussi token_name().

User Contributed Notes

fgm at osinet dot fr 22-Sep-2008 01:08
T_ENCAPSED_AND_WHITESPACED is returned when parsing strings with evaluated content, like "some $value" or this example from the Strings reference page:

<?php
echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

This last example is tokenized as:
T_ECHO
  echo
T_WHITESPACE
  %20 (a space character)
T_START_HEREDOC
  <<
T_ENCAPSED_AND_WHITESPACE
  My name is "
T_VARIABLE
  $name
T_ENCAPSED_AND_WHITESPACE
  ". I am printing some
T_VARIABLE
  $foo
T_OBJECT_OPERATOR
  ->
T_STRING
  foo
T_ENCAPSED_AND_WHITESPACE
  . Now, I am printing some
T_CURLY_OPEN
  {
T_VARIABLE
  $foo
T_OBJECT_OPERATOR
  ->
T_STRING
  bar
(terminal)
  [
T_LNUMBER
  1
(terminal)
  ]
(terminal)
  }
T_ENCAPSED_AND_WHITESPACE
  . This should print a capital 'A': \x41
T_END_HEREDOC
  EOT
(terminal)
  ;
nathan at unfinitydesign dot com 22-Sep-2008 05:52
T_ENCAPSED_AND_WHITESPACE is whitespace which intersects a group of tokens. For example, an "unexpected T_ENCAPSED_AND_WHITESPACE" error is produced by the following code:

<?php
$main_output_world = 'snakes!';
echo('There are' 10 $main_output_world);
?>

Note the missing concatenation operator between the two strings leads to the whitespace error that is so named above. The concatenation operator instructs PHP to ignore the whitespace between the two code tokens (the so named "encapsed" data"), rather than parse it as a token itself.

The correct code would be:

<?php
$main_output_world = 'snakes!';
echo('There are' . 10 . $main_output_world);
?>

Note the addition of the concatenation operator between each token.


Guide de nommage de l'espace utilisateur

Sommaire

  • Espace de noms global
  • Règles
  • Astuces

Ce guide permet de choisir de la meilleure façon possible les noms pour les identifiants dans le code PHP de l'espace utilisateur. Lors du choix des noms pour n'importe quel code qui crée des symboles dans l'espace de noms global, il est important de prendre en compte ce guide afin d'éviter d'éventuels problèmes avec les futures versions de PHP et vos symboles.

User Contributed Notes

There are no user contributed notes for this page.


Espace de noms global

Ceci est une vue de la construction du code qui ira dans l'espace de noms global :

  • fonctions

  • classes

  • interfaces

  • constantes (et non les constantes de classe)

  • variables définies à l'extérieur des fonctions/méthodes

User Contributed Notes

There are no user contributed notes for this page.


Règles

La liste suivante fournit un aperçu global des règles réservées au projet PHP lors du choix des noms pour les nouveaux identifiants internes. Le guide définitif est l'officiel » CODING STANDARDS :

  • PHP possède l'espace de noms de haut niveau mais tente de trouver des noms descriptifs cohérents.

  • Les noms des fonctions utilisent un underscore entre les mots, tandis que les noms des classes utilisent les notations CamelCase et PascalCase.

  • PHP préfixe tous les symboles globaux d'une extension avec le nom de l'extension. (Dans le passé, il y avait quelques exceptions à cette règle) Exemples :

    • curl_close()

    • mysql_query()

    • PREG_SPLIT_DELIM_CAPTURE

    • new DOMDocument()

    • strpos() (exemple d'une erreur du passé)

    • new SplFileObject()

  • Les itérateurs et les exceptions sont cependant simplement suffixés par respectivement, "Iterator" et "Exception." Exemples :

    • ArrayIterator

    • LogicException

  • PHP réserve tous les symboles commençant par un __ comme étant magique. Il est recommandé de ne pas créer de symboles commençant par un __ en PHP sauf si vous voulez utiliser les fonctionnalités magiques documentées. Exemple :

    • __get()

    • __autoload()

User Contributed Notes

There are no user contributed notes for this page.


Astuces

Si vous voulez écrire du code portable, il est recommandé de ne pas placer de nombreuses variables, fonctions ou classes dans l'espace de noms global. Cela empêchera les conflits de nommage avec le code tiers ainsi que des ajouts possibles au langage.

Une façon commune de prévenir les conflits de noms de fonctions et de classes est de les ajouter à leur propre namespace.

<?php

namespace MyProject;

function my_function() {
    return true;
}

\MyProject\my_function();

Cela a encore besoin de vous pour garder une trace des espaces de noms déjà utilisés, mais une fois que vous avez décidé sur un espace de noms que vous allez utiliser, vous pouvez ajouter toutes les fonctions et les classes à elle sans avoir à penser à nouveau les conflits.

Il est considéré comme la meilleure pratique pour limiter le nombre de variables ajoutées à la portée globale afin d'éviter les conflits de nommage avec le code tiers.

Note: Portée des variables

En raison des règles de portée de PHP, les variables définies à l'intérieur des fonctions et des méthodes ne sont pas dans la portée globale et, en tant que telles, ne peuvent pas entrer en conflit avec d'autres variables définies dans la portée globale.

User Contributed Notes

There are no user contributed notes for this page.


À propos du manuel

Sommaire

  • Formats
  • À propos des notes utilisateurs
  • Comment lire la définition d'une fonction (prototype)
  • Versions de PHP documentées dans ce manuel
  • Où trouver plus d'informations sur PHP ?
  • Comment aider à l'amélioration de la documentation ?
  • Comment sont générées les documentations
  • Traductions

User Contributed Notes

There are no user contributed notes for this page.


Formats

Le manuel PHP est fourni en différents formats. Ces formats sont divisés en deux groupes : ceux qui sont disponibles en ligne, et les téléchargeables.

Note:

Certains éditeurs ont fournis des versions imprimées de ce manuel. Nous n'en recommandons aucune, car elles sont rapidement obsolètes.

Le manuel peut être lu en ligne sur le site » php.net. La version en ligne du manuel PHP a actuellement deux rendus CSS : un rendu agréable à l'œil et un pratique pour l'impression.

Deux avantages du manuel en ligne sur la plupart des formats téléchargeables, sont l'intégration des notes des utilisateurs et les » URL de raccourci que vous pouvez utiliser pour accéder rapidement à une partie du manuel. Un inconvénient évident est que vous devez être en ligne pour profiter de ce format.

Il y a de nombreux formats de manuel pour la consultation hors ligne, et le format le plus approprié dépend de votre OS et de vos goûts personnels. Pour savoir comment le manuel est généré, lisez la section 'Comment le manuel est généré' de cet appendice.

Le format le plus portable est le HTML. Le manuel est fourni dans un format en une seule page HTML, ou comme un ensemble de fichiers de tailles réduites (mais un bon millier de fichiers tout de même). Nous fournissons ce format sous une forme compressée, vous aurez donc besoin d'un utilitaire de décompression pour extraire les fichiers de l'archive.

Pour les plates-formes Windows, le format Windows HTML Help fournit une version HTML du manuel à utiliser avec l'application Windows HTML Help : il intègre un moteur de recherche complet, un index et des signets. De nombreux IDE sous Windows fournissent des liens avec ce format pour une meilleure intégration. Il existe aussi des visualiseurs de CHM pour Linux. Visitez » xCHM ou » GnoCHM.

Il existe aussi une » version CHM étendue, qui est mise à jour moins souvent mais qui fournit plus de fonctionnalités. Elle ne fonctionnera que sur Microsoft Windows à cause des technologies utilisées pour construire ces pages.

User Contributed Notes

There are no user contributed notes for this page.


À propos des notes utilisateurs

Les notes des utilisateurs jouent un rôle très important dans le développement de ce manuel. En permettant aux lecteurs de contribuer par des exemples, des remarques et critiques, ou encore des clarifications, nous intégrons des aspects très importants du langage dans le manuel. Jusqu'à ce que les notes les plus importantes soient intégrées dans la documentation, elles sont disponibles sur le site lui-même, et dans certains formats hors ligne.

Note:

Les notes des utilisateurs ne sont pas modérées avant d'apparaître sur le site, et même si elles le sont, leur véracité ne peut être garantie, pas plus qu'il n'existe de garantie quand à l'exactitude du manuel lui-même.

Note:

Pour des questions de portée de licence, les notes utilisateurs sont considérées comme faisant partie du manuel PHP, et sont donc couvertes par la même licence qui couvre cette documentation (Creative Commons Attribution à ce jour). Pour plus de détails, lisez la page Manual's Copyright.

User Contributed Notes

There are no user contributed notes for this page.


Comment lire la définition d'une fonction (prototype)

Chaque fonction dans le manuel est documentée pour permettre une compréhension rapide. Savoir décoder le texte rendra votre apprentissage plus facile. Plutôt que de dépendre d'exemples prêts en copier/coller, il est plus utile de savoir lire la définition d'une fonction (prototype). Voici comment :

Note: Pré-requis : Connaissances de base des types.

Bien que PHP soit un langage sans typage fort, une connaissance de base des types est essentielle, car ils ont quand même des sens importants.

Les définitions de fonctions vous indiquent quel type de données est retourné. Examinons la fonction strlen() comme exemple :

strlen

(PHP 4, PHP 5, PHP 7)
strlen -- Retourne la taille de la chaîne

Description
strlen ( string $string ) : int

Retourne la taille de la chaîne $string.

Explications de la définition de la fonction
Partie | Description
strlen | Le nom de la fonction.
(PHP 4, PHP 5, PHP 7) | strlen() est présente dans toutes les versions de PHP 4, 5 et 7.
( string $string ) | Le premier (et ici le seul) paramètre à fournir à cette fonction est le paramètre string, qui doit être du type chaîne de caractères.
int | Type de valeur retournée par cette fonction, qui est, en l'occurrence, un entier (i.e. la taille d'une chaîne est mesurée par un nombre).

Nous pourrions réécrire ce prototype avec une version plus générique :

      nom de la fonction    ( type du paramètre   nom du paramètre ) : type de retour

Plusieurs fonctions ont besoin de plusieurs paramètres, comme in_array(). Son prototype est le suivant :

      in_array ( mixed $needle, array $haystack , bool $strict = false ) : bool

Qu'est ce que cela signifie ? in_array() retourne un booléen true en cas de réussite (le paramètre needle a été trouvé dans le tableau haystack) ou false si une erreur survient (le paramètre needle n'a pas été trouvé dans le tableau haystack). Le premier paramètre s'appelle needle et il peut être de différents types : il porte donc la mention mixed. Le paramètre needle (ce que nous recherchons) peut être une valeur scalaire ( chaîne de caractères, entier, ou float), ou encore un array. haystack (le array, dans lequel nous recherchons) est le second paramètre. Le troisième paramètre, optionnel, strict, est optionnel. Tous les paramètres optionnels ont une valeur par défaut ; si la valeur par défaut est inconnue, elle est affiché en tant que ?. La manuel indique que le paramètre strict vaut par défaut false. Reportez-vous au manuel de chaque fonction pour savoir comment elle fonctionne.

De plus, le signe & (é commercial) ajouté au début du paramètre d'une fonction permet de passer ce paramètre par référence, comme ceci :

       preg_match ( string $pattern , string $subject , array &$matches = null,
       int $flags = 0 , int $offset = 0 ) : int|false

Dans cet exemple, nous pouvons voir que le troisième paramètre optionnel &$matches va être passé par référence.

Il y a aussi des fonctions avec des informations plus complexes concernant les versions de PHP. Prenons html_entity_decode() comme exemple :

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

Cela signifie que cette fonction n'est disponible que depuis PHP 4.3.0.

User Contributed Notes

There are no user contributed notes for this page.


Versions de PHP documentées dans ce manuel

Ce manuel contient des informations sur les anciennes, actuelles et futures versions de PHP. Les modifications de comportement sont documentées sous la forme de notes, d'historiques de version mais aussi dans les pages du manuel. La version documentée la plus ancienne est la version 7.0.0.

Lorsque la documentation existe pour les dernières versions de développement (non publiées) de PHP, elle sera intitulée "disponible dans Git" ou "version de development." Ces changements sont prévus mais peuvent encore évoluer dans de rares cas.

Tous les développements sont versionnés dans le dépot Git et peuvent être récupérés comme décrit dans » accès anonyme Git.

Et par souci de clarté, le manuel fera référence aux versions majeures, mineures et révisions de PHP. Par exemple PHP 7.3.1, le 7 est la version majeure, 3 la mineure, et 1 la révision. Typiquement PHP n'ajoute de nouvelles fonctionnalités que dans les majeures ou mineures, et corrige des bugs dans les révisions. Cependant, cette convention n'est pas toujours vérifiée.

Notez aussi que la manuel concerne PHP présent et non futur, même pour les fonctionnalités documentées et qui ne sont pas encore disponibles. Ainsi le manuel peut perdurer dans le temps et ne requiert pas de mises à jour importantes à chaque sortie de PHP.

À plusieurs reprises, le manuel de PHP liste les valeurs par défaut des directives PHP. Ces valeurs sont basées sur le comportement de PHP sans fichier de configuration php.ini, ainsi ceci peut changer des valeurs trouvées dans les fichiers distribués php.ini-development et php.ini-production . Les valeurs indiquées sont aussi celles de la dernière version de PHP, un changelog indique les valeurs précédemment employées. Voyez l'appendice sur les directives PHP pour plus de détails sur ces valeurs et leurs évolutions.

User Contributed Notes

There are no user contributed notes for this page.


Où trouver plus d'informations sur PHP ?

Ce manuel n'a pas pour objectif de fournir des présentations sur les pratiques de programmation. Si vous êtes un néophyte total, ou même un programmeur débutant, vous pouvez trouver difficile d'apprendre la programmation PHP avec uniquement ce manuel : il serait mieux de trouver des ressources plus orientées vers l'apprentissage.

Il y a un bon nombre de listes de diffusion actives, traitant de tous les aspects du langage et de la programmation PHP. Si vous êtes bloqué par un problème, vous pourrez sûrement trouver de l'aide auprès de ces listes. Il existe un recensement des listes de diffusion sur » la page de support de php.net.

User Contributed Notes

There are no user contributed notes for this page.


Comment aider à l'amélioration de la documentation ?

Il y a plusieurs façons de participer à l'amélioration de la documentation.

Si vous trouvez des erreurs, dans n'importe quelle traduction de la documentation, utilisez le système de rapport de bogues : » https://bugs.php.net/. Classez le rapport sous la catégorie "Documentation Problem". Vous pouvez aussi poster les problèmes liés aux différents formats du manuel à cet endroit.

Note:

N'abusez pas du système de bogues pour envoyer des demandes d'aide. Utilisez plutôt une des options proposées par le » support.

En contribuant aux notes, vous pouvez fournir de nouveaux exemples, mettre en lumière des effets de bords et apporter des clarifications pour les autres lecteurs. Mais ne prenez pas le système d'annotation pour un système de soumission de bogues. Vous pouvez en savoir plus sur les annotations dans la section 'À propos des notes utilisateurs'

Il est aussi possible de soumettre des pull requests au » miroir Github du repository de la documentation.

Le manuel PHP est traduit en de nombreux langages. La connaissance de l'anglais ainsi que d'une autre langue peut vous permettre d'aider la documentation de PHP en travaillant avec une équipe de traduction. Pour plus d'informations sur le commencement d'une traduction, ou sur l'aide d'une version déjà traduite, commencez par lire » http://doc.php.net/tutorial/.

Le projet de documentation de PHP a un canal IRC où vous pouvez venir et parler avec les auteurs du manuel ou trouver un certain aspect du manuel avec lequel vous pourriez aider. Les coordonnées : #php.doc sur irc.efnet.org.

User Contributed Notes

There are no user contributed notes for this page.


Comment sont générées les documentations

Ce manuel est écrit en XML, en utilisant la » DTD de DocBook XML, et » PhD (Le moteur [PH]P d'affichage [D]ocBook) pour la maintenance et le formatage.

Grâce au format XML comme source, nous avons la possibilité de générer de nombreux formats tout en ayant une seule source pour tous les formats. L'outil utilisé pour formater le manuel en ligne est » PhD. Nous utilisons » Microsoft HTML Help Workshop pour générer le format Windows HTML Help du manuel, et, bien sûr, PHP lui-même pour effectuer des conversions et du formatage.

Le manuel PHP est généré en de nombreux langages et formats, lisez » https://www.php.net/docs.php pour plus d'informations. Le code source XML peut être téléchargé depuis git et visualisé sur » https://github.com/php/doc-en".

User Contributed Notes

There are no user contributed notes for this page.


Traductions

La manuel PHP est disponible non seulement en anglais, mais aussi dans différentes langues. Le texte du manuel est écrit d'abord en anglais, puis des équipes à travers le monde assurent la traduction du manuel dans leur langue natale. Si la traduction d'une section n'est pas encore disponible, le système de création de la documentation présentera alors la version anglaise.

Les contributeurs aux documentations partent des codes sources XML disponibles à partir de » https://github.com/php/doc-en" puis traduisent dans leur langue. Ils n'utilisent pas les versions générées (comme le HTML ou le texte plein) car c'est le système d'édition qui se charge de faire les conversions du format XML vers un format lisible.

Note:

Si vous voulez aider à la traduction de la documentation, entrez en contact avec l'équipe de documentation en vous inscrivant à la liste de diffusion : » phpdoc-subscribe@lists.php.net. L'adresse de la liste de diffusion est phpdoc@lists.php.net. Indiquez dans le message que vous êtes intéressé par la traduction de la documentation dans une nouvelle langue, et quelqu'un viendra vous aider à démarrer une nouvelle traduction, ou rejoindre l'équipe qui a pris en charge cette traduction.

Actuellement, le manuel est disponible, partiellement ou en totalité, dans plus de 10 langues.

Ils peuvent tous être téléchargés ici : » https://www.php.net/docs.php.

User Contributed Notes

There are no user contributed notes for this page.


Creative Commons Attribution 3.0

THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.

1. Definitions

  1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License.
  2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License.
  3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership.
  4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License.
  5. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work.
  6. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
  7. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images.
  8. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium.

2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws.

3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:

  1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections;
  2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";
  3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and,
  4. to Distribute and Publicly Perform Adaptations.

  5. For the avoidance of doubt:

    1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License;
    2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and,
    3. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License.

The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved.

4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:

  1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested.
  2. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.
  3. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise.

5. Representations, Warranties and Disclaimer

UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.

6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. Termination.

  1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
  2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.

8. Miscellaneous

  1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
  2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
  3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
  4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent
  5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
  6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law.

User Contributed Notes

There are no user contributed notes for this page.


Liste de l'index

Sommaire

  • Liste des fonctions et des méthodes
  • Liste d'examples

User Contributed Notes

There are no user contributed notes for this page.


Liste des fonctions et des méthodes

Liste de toutes les fonctions et méthodes du manuel

a b c d e f g h i j k l m n o p q r s t u v w x y z _

  • a
    • abs - Valeur absolue
    • acos - Arc cosinus
    • acosh - Arc cosinus hyperbolique
    • addcslashes - Ajoute des slash dans une chaîne, à la mode du langage C
    • addslashes - Ajoute des antislashs dans une chaîne
    • apache_child_terminate - Termine le processus Apache après cette requête
    • apache_getenv - Lit une variable de processus Apache
    • apache_get_modules - Retourne la liste des modules Apache chargés
    • apache_get_version - Récupère la version d'Apache
    • apache_lookup_uri - Effectue une requête partielle pour l'URI spécifiée et renvoie toutes les informations la concernant
    • apache_note - Affiche ou affecte la table des notes d'Apache
    • apache_request_headers - Récupère tous les en-têtes HTTP de la requête
    • apache_response_headers - Récupère tous les en-têtes de réponse HTTP
    • apache_setenv - Modifie une variable de processus Apache
    • APCUIterator::current - Get current item
    • APCUIterator::getTotalCount - Get total count
    • APCUIterator::getTotalHits - Get total cache hits
    • APCUIterator::getTotalSize - Get total cache size
    • APCUIterator::key - Get iterator key
    • APCUIterator::next - Move pointer to next item
    • APCUIterator::rewind - Rewinds iterator
    • APCUIterator::valid - Checks if current position is valid
    • APCUIterator::__construct - Constructs an APCUIterator iterator object
    • apcu_add - Cache a new variable in the data store
    • apcu_cache_info - Retrieves cached information from APCu's data store
    • apcu_cas - Updates an old value with a new value
    • apcu_clear_cache - Clears the APCu cache
    • apcu_dec - Decrease a stored number
    • apcu_delete - Removes a stored variable from the cache
    • apcu_enabled - Whether APCu is usable in the current environment
    • apcu_entry - Atomically fetch or generate a cache entry
    • apcu_exists - Checks if entry exists
    • apcu_fetch - Fetch a stored variable from the cache
    • apcu_inc - Increase a stored number
    • apcu_key_info - Get detailed information about the cache key
    • apcu_sma_info - Retrieves APCu Shared Memory Allocation information
    • apcu_store - Cache a variable in the data store
    • AppendIterator::append - Ajoute un itérateur à la fin
    • AppendIterator::current - Lit la valeur courante
    • AppendIterator::getArrayIterator - Récupère le ArrayIterator
    • AppendIterator::getInnerIterator - Lit l'itérateur interne
    • AppendIterator::getIteratorIndex - Lit l'index d'un itérateur
    • AppendIterator::key - Lit la clé courante
    • AppendIterator::next - Passe à l'élément suivant
    • AppendIterator::rewind - Remet l'itérateur au début
    • AppendIterator::valid - Vérifie la validité de l'élément courant
    • AppendIterator::__construct - Construit un objet AppendIterator
    • array - Crée un tableau
    • ArrayAccess::offsetExists - Indique si une position existe dans un tableau
    • ArrayAccess::offsetGet - Position à lire
    • ArrayAccess::offsetSet - Assigne une valeur à une position donnée
    • ArrayAccess::offsetUnset - Supprime un élément à une position donnée
    • ArrayIterator::append - Ajoute un élément
    • ArrayIterator::asort - Trie un tableau par les valeurs
    • ArrayIterator::count - Compte les éléments
    • ArrayIterator::current - Retourne l'entrée courante du tableau
    • ArrayIterator::getArrayCopy - Récupère la copie d'un tableau
    • ArrayIterator::getFlags - Récupère les drapaux de comportement
    • ArrayIterator::key - Retourne la clé courante du tableau
    • ArrayIterator::ksort - Trie un tableau par les clés
    • ArrayIterator::natcasesort - Trie naturellement un tableau, en ne tenant pas compte de la casse
    • ArrayIterator::natsort - Trie naturellement un tableau
    • ArrayIterator::next - Se déplace vers la prochaine entrée
    • ArrayIterator::offsetExists - Vérifie si une position existe
    • ArrayIterator::offsetGet - Récupère la valeur pour une position
    • ArrayIterator::offsetSet - Définit la valeur d'une position
    • ArrayIterator::offsetUnset - Efface la valeur d'une position
    • ArrayIterator::rewind - Revient à la position initiale
    • ArrayIterator::seek - Avance à une position donnée
    • ArrayIterator::serialize - Linéarisation
    • ArrayIterator::setFlags - Définie les drapeaux de comportements
    • ArrayIterator::uasort - Trier avec une fonction de comparaison définie par l'utilisateur et maintient l'association de l'index
    • ArrayIterator::uksort - Trier par clés à l'aide d'une fonction de comparaison définie par l'utilisateur
    • ArrayIterator::unserialize - Délinéarisation
    • ArrayIterator::valid - Vérifie si un tableau contient d'autres entrées
    • ArrayIterator::__construct - Construit un ArrayIterator
    • ArrayObject::append - Ajoute la valeur à la fin d'un tableau
    • ArrayObject::asort - Trie les éléments par valeur
    • ArrayObject::count - Retourne le nombre de propriétés publiques dans l'objet ArrayObject
    • ArrayObject::exchangeArray - Remplace un tableau par un autre
    • ArrayObject::getArrayCopy - Crée une copie de l'objet ArrayObject
    • ArrayObject::getFlags - Lit les options de comportement
    • ArrayObject::getIterator - Crée un nouvel itérateur à partir d'un objet ArrayObject
    • ArrayObject::getIteratorClass - Lit le nom de la classe de ArrayObject
    • ArrayObject::ksort - Trie un tableau par clé
    • ArrayObject::natcasesort - Trie un tableau en utilisant le tri naturel sans la casse
    • ArrayObject::natsort - Trie les éléments avec un tri naturel
    • ArrayObject::offsetExists - Vérifie si un index existe
    • ArrayObject::offsetGet - Retourne la valeur de l'index spécifié
    • ArrayObject::offsetSet - Définie $newval comme valeur à l'$index spécifié
    • ArrayObject::offsetUnset - Efface la valeur à l'$index spécifié
    • ArrayObject::serialize - Linéarise un ArrayObject
    • ArrayObject::setFlags - Configure les options de comportement
    • ArrayObject::setIteratorClass - Définit le nom de la classe de l'itérateur pour l'objet ArrayObject
    • ArrayObject::uasort - Trie les éléments avec une fonction utilisateur
    • ArrayObject::uksort - Trie les éléments par clé avec une fonction utilisateur
    • ArrayObject::unserialize - Délinéarisation d'un ArrayObject
    • ArrayObject::__construct - Construit un nouvel objet tableau
    • array_change_key_case - Change la casse de toutes les clés d'un tableau
    • array_chunk - Sépare un tableau en tableaux de taille inférieure
    • array_column - Retourne les valeurs d'une colonne d'un tableau d'entrée
    • array_combine - Crée un tableau à partir de deux autres tableaux
    • array_count_values - Compte le nombre de valeurs d'un tableau
    • array_diff - Calcule la différence entre des tableaux
    • array_diff_assoc - Calcule la différence de deux tableaux, en prenant aussi en compte les clés
    • array_diff_key - Calcule la différence de deux tableaux en utilisant les clés pour comparaison
    • array_diff_uassoc - Calcule la différence entre deux tableaux associatifs, à l'aide d'une fonction de rappel
    • array_diff_ukey - Calcule la différence entre deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison
    • array_fill - Remplit un tableau avec une même valeur
    • array_fill_keys - Remplit un tableau avec des valeurs, en spécifiant les clés
    • array_filter - Filtre les éléments d'un tableau grâce à une fonction de rappel
    • array_flip - Remplace les clés par les valeurs, et les valeurs par les clés
    • array_intersect - Calcule l'intersection de tableaux
    • array_intersect_assoc - Calcule l'intersection de deux tableaux avec des tests sur les index
    • array_intersect_key - Calcule l'intersection de deux tableaux en utilisant les clés pour comparaison
    • array_intersect_uassoc - Calcule l'intersection de deux tableaux avec des tests sur les index, compare les index en utilisant une fonction de rappel
    • array_intersect_ukey - Calcule l'intersection de deux tableaux en utilisant une fonction de rappel sur les clés pour comparaison
    • array_keys - Retourne toutes les clés ou un ensemble des clés d'un tableau
    • array_key_exists - Vérifie si une clé existe dans un tableau
    • array_key_first - Récupère la première clé d'un tableau
    • array_key_last - Récupère la dernière clé d'un tableau
    • array_map - Applique une fonction sur les éléments d'un tableau
    • array_merge - Fusionne plusieurs tableaux en un seul
    • array_merge_recursive - Combine un ou plusieurs tableaux ensemble, récursivement
    • array_multisort - Trie les tableaux multidimensionnels
    • array_pad - Complète un tableau avec une valeur jusqu'à la longueur spécifiée
    • array_pop - Dépile un élément de la fin d'un tableau
    • array_product - Calcule le produit des valeurs du tableau
    • array_push - Empile un ou plusieurs éléments à la fin d'un tableau
    • array_rand - Prend une ou plusieurs clés, au hasard dans un tableau
    • array_reduce - Réduit itérativement un tableau
    • array_replace - Remplace les éléments d'un tableau par ceux d'autres tableaux
    • array_replace_recursive - Remplace récursivement dans le premier tableau les éléments des autres tableaux fournis
    • array_reverse - Inverse l'ordre des éléments d'un tableau
    • array_search - Recherche dans un tableau la clé associée à la première valeur
    • array_shift - Dépile un élément au début d'un tableau
    • array_slice - Extrait une portion de tableau
    • array_splice - Efface et remplace une portion de tableau
    • array_sum - Calcule la somme des valeurs du tableau
    • array_udiff - Calcule la différence entre deux tableaux en utilisant une fonction rappel
    • array_udiff_assoc - Calcule la différence entre des tableaux avec vérification des index, compare les données avec une fonction de rappel
    • array_udiff_uassoc - Calcule la différence de deux tableaux associatifs, compare les données et les index avec une fonction de rappel
    • array_uintersect - Calcule l'intersection de deux tableaux, compare les données en utilisant une fonction de rappel
    • array_uintersect_assoc - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données en utilisant une fonction de rappel
    • array_uintersect_uassoc - Calcule l'intersection de deux tableaux avec des tests sur l'index, compare les données et les index des deux tableaux en utilisant une fonction de rappel séparée
    • array_unique - Dédoublonne un tableau
    • array_unshift - Empile un ou plusieurs éléments au début d'un tableau
    • array_values - Retourne toutes les valeurs d'un tableau
    • array_walk - Exécute une fonction fournie par l'utilisateur sur chacun des éléments d'un tableau
    • array_walk_recursive - Applique une fonction de rappel récursivement à chaque membre d'un tableau
    • arsort - Trie un tableau en ordre inverse et conserve l'association des index
    • asin - Arc sinus
    • asinh - Arc sinus hyperbolique
    • asort - Trie un tableau et conserve l'association des index
    • assert - Vérifie si une assertion est fausse
    • assert_options - Définit/récupère différentes options d'assertions
    • atan - Arc tangente
    • atan2 - Arc tangent de deux variables
    • atanh - Arc tangente hyperbolique
  • b
    • base64_decode - Décode une chaîne en MIME base64
    • base64_encode - Encode une chaîne en MIME base64
    • basename - Retourne le nom de la composante finale d'un chemin
    • BaseResult::getWarnings - Fetch warnings from last operation
    • BaseResult::getWarningsCount - Fetch warning count from last operation
    • base_convert - Convertit un nombre entre des bases arbitraires
    • bcadd - Additionne deux nombres de grande taille
    • bccomp - Compare deux nombres de grande taille
    • bcdiv - Divise deux nombres de grande taille
    • bcmod - Retourne le reste d'une division entre nombres de grande taille
    • bcmul - Multiplie deux nombres de grande taille
    • bcpow - Élève un nombre à une puissance donnée
    • bcpowmod - Calcule le reste modulo d'un nombre élevé à une puissance
    • bcscale - Définit ou récupère la précision par défaut pour toutes les fonctions bc math
    • bcsqrt - Récupère la racine carrée d'un nombre de grande taille
    • bcsub - Soustrait un nombre de grande taille d'un autre
    • bin2hex - Convertit des données binaires en représentation hexadécimale
    • bindec - Convertit de binaire en décimal
    • bindtextdomain - Spécifie ou récupère le chemin d'un domaine
    • bind_textdomain_codeset - Spécifie ou récupère le jeu de caractères utilisé pour les messages du domaine DOMAIN
    • boolval - Récupère la valeur booléenne d'une variable
    • bson_decode - Délinéarise un objet BSON en un tableau PHP
    • bson_encode - Linéarise une variable PHP en une chaîne BSON
    • bzclose - Ferme un fichier bzip2
    • bzcompress - Compresse une chaîne avec bzip2
    • bzdecompress - Décompresse une chaîne bzip2
    • bzerrno - Retourne le code d'erreur bzip2
    • bzerror - Retourne le numéro et le message d'erreur bzip2 dans un tableau
    • bzerrstr - Retourne le message d'erreur bzip2
    • bzflush - Ne fait rien
    • bzopen - Ouvre un fichier compressé avec bzip2
    • bzread - Lecture binaire d'un fichier bzip2
    • bzwrite - Écriture binaire dans un fichier bzip2
  • c
    • CachingIterator::count - Le nombre d'éléments de l'itérateur
    • CachingIterator::current - Retourne l'élément courant
    • CachingIterator::getCache - Lit le contenu du cache
    • CachingIterator::getFlags - Lit les options utilisées
    • CachingIterator::getInnerIterator - Retourne l'itérateur sous-jacent
    • CachingIterator::hasNext - Vérifie si l'itérateur interne a un élément suivant valide
    • CachingIterator::key - Retourne l'index de l'élément courant
    • CachingIterator::next - Déplace l'itérateur à la position suivante
    • CachingIterator::offsetExists - Vérifie l'existence d'un offset
    • CachingIterator::offsetGet - L'élément à lire à la position donnée
    • CachingIterator::offsetSet - Affecte un nouvel élément à la position donnée
    • CachingIterator::offsetUnset - Détruit un élément à l'offset indiqué
    • CachingIterator::rewind - Replace l'itérateur au début
    • CachingIterator::setFlags - Modifie les options du CachingIterator
    • CachingIterator::valid - Vérifie si l'élément courant est valide
    • CachingIterator::__construct - Construit un nouvel objet CachingIterator pour l'itérateur
    • CachingIterator::__toString - Retourne la représentation de l'élément courant sous forme de chaîne
    • CallbackFilterIterator::accept - Appel la fonction de rappel avec la valeur courante, la clé courante, et l'itérateur interne comme arguments
    • CallbackFilterIterator::__construct - Crée un itérateur filtré depuis un autre itérateur
    • call_user_func - Appelle une fonction de rappel fournie par le premier argument
    • call_user_func_array - Appelle une fonction de rappel avec les paramètres rassemblés en tableau
    • cal_days_in_month - Retourne le nombre de jours dans un mois, pour une année et un calendrier donné
    • cal_from_jd - Convertit le nombre de jours Julien en un calendrier spécifique
    • cal_info - Retourne des détails sur un calendrier
    • cal_to_jd - Convertit un calendrier en nombre de jours Julien
    • ceil - Arrondit au nombre supérieur
    • chdir - Change de dossier
    • checkdate - Valide une date grégorienne
    • checkdnsrr - Résolution DNS d'une adresse IP
    • chgrp - Change le groupe d'un fichier
    • chmod - Change le mode du fichier
    • chop - Alias de rtrim
    • chown - Change le propriétaire du fichier
    • chr - Générer une chaîne d'un octet à partir d'un nombre
    • chroot - Change le dossier racine
    • chunk_split - Scinde une chaîne
    • classkit_import - Importe de nouvelles définitions de méthodes de classes depuis un fichier
    • classkit_method_add - Ajoute dynamiquement une nouvelle méthode à une classe donnée
    • classkit_method_copy - Copie une méthode d'une classe vers une autre classe
    • classkit_method_redefine - Change dynamiquement le code de la méthode donnée
    • classkit_method_remove - Efface dynamiquement une méthode donnée
    • classkit_method_rename - Change dynamiquement le nom d'une méthode donnée
    • class_alias - Crée un alias de classe
    • class_exists - Vérifie si une classe a été définie
    • class_implements - Retourne les interfaces implémentées par une classe ou une interface donnée
    • class_parents - Retourne les classes parentes d'une classe
    • class_uses - Retourne les traits utilisé par une classe donnée.
    • clearstatcache - Efface le cache de stat
    • Client::getClient - Get client session
    • Client::__construct - Client constructor
    • cli_get_process_title - Retourne le titre du processus courant
    • cli_set_process_title - Définit le titre du processus
    • closedir - Ferme le pointeur sur le dossier
    • closelog - Ferme la connexion à l'historique système
    • Closure::bind - Duplique une fermeture avec un nouvel objet lié et un nouveau contexte de classe.
    • Closure::bindTo - Duplique la fermeture avec un nouvel objet lié et un nouveau contexte de classe.
    • Closure::call - Lie et appelle la fermeture
    • Closure::fromCallable - Convertis un callable en une fermeture
    • Closure::__construct - Constructeur empêchant l'instanciation
    • Collator::asort - Tri un tableau en conservant les clés, avec une collation
    • Collator::compare - Compare deux chaînes Unicode
    • Collator::create - Création d'un collator
    • Collator::getAttribute - Lit un attribut de collation
    • Collator::getErrorCode - Lit la dernière erreur du collator
    • Collator::getErrorMessage - Lit le dernier message d'erreur du collator
    • Collator::getLocale - Lit le nom de la locale d'un collator
    • Collator::getSortKey - Récupère la clé de tri pour une chaine
    • Collator::getStrength - Récupère la dureté de classement utilisé
    • Collator::setAttribute - Configure l'attribut de collation
    • Collator::setStrength - Set collation strength
    • Collator::sort - Trie un tableau avec une collation
    • Collator::sortWithSortKeys - Tri un tableau et ses clés avec une collation
    • Collator::__construct - Création d'un collator
    • Collectable::isGarbage - Détermine si un objet a été marqué comme obsolète
    • Collectable::setGarbage - Marque un objet comme obsolète
    • Collection::add - Add collection document
    • Collection::addOrReplaceOne - Add or replace collection document
    • Collection::count - Get document count
    • Collection::createIndex - Create collection index
    • Collection::dropIndex - Drop collection index
    • Collection::existsInDatabase - Check if collection exists in database
    • Collection::find - Search for document
    • Collection::getName - Get collection name
    • Collection::getOne - Get one document
    • Collection::getSchema - Get schema object
    • Collection::getSession - Get session object
    • Collection::modify - Modify collection documents
    • Collection::remove - Remove collection documents
    • Collection::removeOne - Remove one collection document
    • Collection::replaceOne - Replace one collection document
    • Collection::__construct - Collection constructor
    • CollectionAdd::execute - Execute the statement
    • CollectionAdd::__construct - CollectionAdd constructor
    • CollectionFind::bind - Bind value to query placeholder
    • CollectionFind::execute - Execute the statement
    • CollectionFind::fields - Set document field filter
    • CollectionFind::groupBy - Set grouping criteria
    • CollectionFind::having - Set condition for aggregate functions
    • CollectionFind::limit - Limit number of returned documents
    • CollectionFind::lockExclusive - Execute operation with EXCLUSIVE LOCK
    • CollectionFind::lockShared - Execute operation with SHARED LOCK
    • CollectionFind::offset - Skip given number of elements to be returned
    • CollectionFind::sort - Set the sorting criteria
    • CollectionFind::__construct - CollectionFind constructor
    • CollectionModify::arrayAppend - Append element to an array field
    • CollectionModify::arrayInsert - Insert element into an array field
    • CollectionModify::bind - Bind value to query placeholder
    • CollectionModify::execute - Execute modify operation
    • CollectionModify::limit - Limit number of modified documents
    • CollectionModify::patch - Patch document
    • CollectionModify::replace - Replace document field
    • CollectionModify::set - Set document attribute
    • CollectionModify::skip - Skip elements
    • CollectionModify::sort - Set the sorting criteria
    • CollectionModify::unset - Unset the value of document fields
    • CollectionModify::__construct - CollectionModify constructor
    • CollectionRemove::bind - Bind value to placeholder
    • CollectionRemove::execute - Execute remove operation
    • CollectionRemove::limit - Limit number of documents to remove
    • CollectionRemove::sort - Set the sorting criteria
    • CollectionRemove::__construct - CollectionRemove constructor
    • ColumnResult::getCharacterSetName - Get character set
    • ColumnResult::getCollationName - Get collation name
    • ColumnResult::getColumnLabel - Get column label
    • ColumnResult::getColumnName - Get column name
    • ColumnResult::getFractionalDigits - Get fractional digit length
    • ColumnResult::getLength - Get column field length
    • ColumnResult::getSchemaName - Get schema name
    • ColumnResult::getTableLabel - Get table label
    • ColumnResult::getTableName - Get table name
    • ColumnResult::getType - Get column type
    • ColumnResult::isNumberSigned - Check if signed type
    • ColumnResult::isPadded - Check if padded
    • ColumnResult::__construct - ColumnResult constructor
    • com::__construct - Constructeur de la classe com
    • CommonMark\CQL::__construct - CQL Construction
    • CommonMark\CQL::__invoke - CQL Execution
    • CommonMark\Interfaces\IVisitable::accept - Visitation
    • CommonMark\Interfaces\IVisitor::enter - Visitation
    • CommonMark\Interfaces\IVisitor::leave - Visitation
    • CommonMark\Node::accept - Visitation
    • CommonMark\Node::appendChild - AST Manipulation
    • CommonMark\Node::insertAfter - AST Manipulation
    • CommonMark\Node::insertBefore - AST Manipulation
    • CommonMark\Node::prependChild - AST Manipulation
    • CommonMark\Node::replace - AST Manipulation
    • CommonMark\Node::unlink - AST Manipulation
    • CommonMark\Node\BulletList::__construct - BulletList Construction
    • CommonMark\Node\CodeBlock::__construct - CodeBlock Construction
    • CommonMark\Node\Heading::__construct - Heading Construction
    • CommonMark\Node\Image::__construct - Image Construction
    • CommonMark\Node\Link::__construct - Link Construction
    • CommonMark\Node\OrderedList::__construct - OrderedList Construction
    • CommonMark\Node\Text::__construct - Text Construction
    • CommonMark\Parse - Parsing
    • CommonMark\Parser::finish - Parsing
    • CommonMark\Parser::parse - Parsing
    • CommonMark\Parser::__construct - Parsing
    • CommonMark\Render - Rendering
    • CommonMark\Render\HTML - Rendering
    • CommonMark\Render\Latex - Rendering
    • CommonMark\Render\Man - Rendering
    • CommonMark\Render\XML - Rendering
    • compact - Crée un tableau à partir de variables et de leur valeur
    • COMPersistHelper::GetCurFileName - Get current filename
    • COMPersistHelper::GetMaxStreamSize - Get maximum stream size
    • COMPersistHelper::InitNew - Initialize object to default state
    • COMPersistHelper::LoadFromFile - Load object from file
    • COMPersistHelper::LoadFromStream - Load object from stream
    • COMPersistHelper::SaveToFile - Save object to file
    • COMPersistHelper::SaveToStream - Save object to stream
    • COMPersistHelper::__construct - Construct a COMPersistHelper object
    • Componere\Abstract\Definition::addInterface - Add Interface
    • Componere\Abstract\Definition::addMethod - Add Method
    • Componere\Abstract\Definition::addTrait - Add Trait
    • Componere\Abstract\Definition::getReflector - Reflection
    • Componere\cast - Casting
    • Componere\cast_by_ref - Casting
    • Componere\Definition::addConstant - Add Constant
    • Componere\Definition::addProperty - Add Property
    • Componere\Definition::getClosure - Get Closure
    • Componere\Definition::getClosures - Get Closures
    • Componere\Definition::isRegistered - State Detection
    • Componere\Definition::register - Registration
    • Componere\Definition::__construct - Definition Construction
    • Componere\Method::getReflector - Reflection
    • Componere\Method::setPrivate - Accessibility Modification
    • Componere\Method::setProtected - Accessibility Modification
    • Componere\Method::setStatic - Accessibility Modification
    • Componere\Method::__construct - Method Construction
    • Componere\Patch::apply - Application
    • Componere\Patch::derive - Patch Derivation
    • Componere\Patch::getClosure - Get Closure
    • Componere\Patch::getClosures - Get Closures
    • Componere\Patch::isApplied - State Detection
    • Componere\Patch::revert - Reversal
    • Componere\Patch::__construct - Patch Construction
    • Componere\Value::hasDefault - Value Interaction
    • Componere\Value::isPrivate - Accessibility Detection
    • Componere\Value::isProtected - Accessibility Detection
    • Componere\Value::isStatic - Accessibility Detection
    • Componere\Value::setPrivate - Accessibility Modification
    • Componere\Value::setProtected - Accessibility Modification
    • Componere\Value::setStatic - Accessibility Modification
    • Componere\Value::__construct - Value Construction
    • com_create_guid - Génère un identifiant unique global (GUID)
    • com_event_sink - Connecte des événements d'un objet COM sur un objet PHP
    • com_get_active_object - Retourne un objet représentant l'instance actuelle d'un objet COM
    • com_load_typelib - Charge un Typelib
    • com_message_pump - Traite un message COM dans un délai donné
    • com_print_typeinfo - Affiche une définition de classe PHP pour une interface répartissable
    • Cond::broadcast - Diffuse une condition
    • Cond::create - Crée une condition
    • Cond::destroy - Détruit une condition
    • Cond::signal - Signale une condition
    • Cond::wait - Attente d'une condition
    • connection_aborted - Indique si l'internaute a abandonné la connexion HTTP
    • connection_status - Retourne les bits de statut de la connexion HTTP
    • constant - Retourne la valeur d'une constante
    • convert_cyr_string - Convertit une chaîne d'un jeu de caractères cyrillique à l'autre
    • convert_uudecode - Décode une chaîne au format uuencode
    • convert_uuencode - Encode une chaîne de caractères en utilisant l'algorithme uuencode
    • copy - Copie un fichier
    • cos - Cosinus
    • cosh - Cosinus hyperbolique
    • count - Compte tous les éléments d'un tableau ou quelque chose d'un objet
    • Countable::count - Compte le nombre d'éléments d'un objet
    • count_chars - Retourne des statistiques sur les caractères utilisés dans une chaîne
    • crc32 - Calcule la somme de contrôle CRC32
    • create_function - Crée une fonction anonyme
    • CrudOperationBindable::bind - Bind value to placeholder
    • CrudOperationLimitable::limit - Set result limit
    • CrudOperationSkippable::skip - Number of operations to skip
    • CrudOperationSortable::sort - Sort results
    • crypt - Hachage à sens unique (indéchiffrable)
    • ctype_alnum - Vérifie qu'une chaîne est alphanumérique
    • ctype_alpha - Vérifie qu'une chaîne est alphabétique
    • ctype_cntrl - Vérifie qu'un caractère est un caractère de contrôle
    • ctype_digit - Vérifie qu'une chaîne est un entier
    • ctype_graph - Vérifie qu'une chaîne est imprimable
    • ctype_lower - Vérifie qu'une chaîne est en minuscules
    • ctype_print - Vérifie qu'une chaîne est imprimable
    • ctype_punct - Vérifie qu'une chaîne contient de la ponctuation
    • ctype_space - Vérifie qu'une chaîne n'est faite que de caractères blancs
    • ctype_upper - Vérifie qu'une chaîne est en majuscules
    • ctype_xdigit - Vérifie qu'un caractère représente un nombre hexadécimal
    • cubrid_affected_rows - Récupère le nombre de lignes affectées par la dernière requête SQL
    • cubrid_bind - Lie des valeurs à une requête préparée
    • cubrid_client_encoding - Retourne le jeu de caractères utilisé sur la connexion CUBRID courante
    • cubrid_close - Ferme une connexion CUBRID
    • cubrid_close_prepare - Ferme le gestionnaire de requête
    • cubrid_close_request - Ferme le gestionnaire de requête
    • cubrid_column_names - Récupère les noms de colonnes du résultat
    • cubrid_column_types - Récupère les types de colonnes du résultat
    • cubrid_col_get - Récupère le contenu des éléments d'un type de collection en utilisant l'OID
    • cubrid_col_size - Récupère le nombre d'éléments dans un type de colonne d'une collection en utilisant l'OID
    • cubrid_commit - Commit une transaction
    • cubrid_connect - Ouvre une connexion au serveur CUBRID
    • cubrid_connect_with_url - Établit l'environnement pour une connexion au serveur CUBRID
    • cubrid_current_oid - Récupère l'OID de la localisation du curseur courant
    • cubrid_data_seek - Déplace le pointeur de lignes interne du résultat CUBRID
    • cubrid_db_name - Récupère le nom de la base de données depuis les résultats de cubrid_list_dbs
    • cubrid_disconnect - Ferme la connexion à la base de données
    • cubrid_drop - Supprime une instance en utilisant son OID
    • cubrid_errno - Retourne la valeur numérique d'un message d'erreur
    • cubrid_error - Récupère le message de l'erreur
    • cubrid_error_code - Récupère le code erreur de la dernière erreur survenue
    • cubrid_error_code_facility - Récupère le niveau du code erreur
    • cubrid_error_msg - Récupère le message d'erreur de la dernière erreur survenue
    • cubrid_execute - Exécute une requête SQL préparée
    • cubrid_fetch - Récupère la prochaine ligne du jeu de résultats
    • cubrid_fetch_array - Récupère une ligne de résultat sous forme de tableau associatif, de tableau numérique, ou les deux
    • cubrid_fetch_assoc - Retourne un tableau associatif correspondant à la ligne récupérée
    • cubrid_fetch_field - Récupère des informations sur une colonne et les retourne sous la forme d'un objet
    • cubrid_fetch_lengths - Retourne un tableau contenant les longueurs des valeurs de chaque champ de la ligne courante
    • cubrid_fetch_object - Récupère la prochaine ligne et la retourne sous la forme d'un objet
    • cubrid_fetch_row - Retourne un tableau numérique avec les valeurs de la ligne courante
    • cubrid_field_flags - Retourne une chaîne avec les drapeaux de la position du champ fourni
    • cubrid_field_len - Récupère la longueur maximale du champ spécifié
    • cubrid_field_name - Retourne le nom du champ spécifié
    • cubrid_field_seek - Déplace le curseur du jeu de résultats à une position spécifiée
    • cubrid_field_table - Retourne le nom de la table d'un champ spécifié
    • cubrid_field_type - Retourne le type de la colonne correspondant à la position du champ fourni
    • cubrid_free_result - Libère la mémoire occupée par les données de résultat
    • cubrid_get - Récupère une colonne en utilisant son OID
    • cubrid_get_autocommit - Récupère le mode auto-commit de la connexion
    • cubrid_get_charset - Retourne le jeu de caractères utilisé sur la connexion CUBRID courante
    • cubrid_get_class_name - Récupère le nom de la classe en utilisant son OID
    • cubrid_get_client_info - Retourne la version de la bibliothèque cliente
    • cubrid_get_db_parameter - Retourne les paramètres de la base de données CUBRID
    • cubrid_get_query_timeout - Récupère la valeur du délai d'attente maximal d'une requête
    • cubrid_get_server_info - Retourne la version du serveur CUBRID
    • cubrid_insert_id - Retourne l'identifiant généré pour la dernière mise à jour de la colonne AUTO_INCREMENT
    • cubrid_is_instance - Vérifie si une instance existe
    • cubrid_list_dbs - Retourne un tableau contenant la liste de toutes les bases de données CUBRID existantes
    • cubrid_load_from_glo - Lie une donnée
    • cubrid_lob2_bind - Lie un objet LOB ou une chaîne de caractères à un objet LOB comme paramètre d'une requête préparée
    • cubrid_lob2_close - Ferme un objet LOB
    • cubrid_lob2_export - Exporte un objet LOB vers un fichier
    • cubrid_lob2_import - Importe des données BLOB/CLOB depuis un fichier
    • cubrid_lob2_new - Crée un nouvel objet LOB
    • cubrid_lob2_read - Lit des données BLOB/CLOB
    • cubrid_lob2_seek - Déplace le curseur d'un objet LOB
    • cubrid_lob2_seek64 - Déplace le curseur d'un objet LOB
    • cubrid_lob2_size - Récupère la taille d'un objet LOB
    • cubrid_lob2_size64 - Récupère la taille d'un objet LOB
    • cubrid_lob2_tell - Récupère la position du curseur dans un objet LOB
    • cubrid_lob2_tell64 - Récupère la position du curseur dans l'objet LOB
    • cubrid_lob2_write - Ecrit dans un objet LOB
    • cubrid_lob_close - Ferme un BLOB/CLOB
    • cubrid_lob_export - Exporte des données BLOB/CLOB vers un fichier
    • cubrid_lob_get - Récupère les données BLOB/CLOB
    • cubrid_lob_send - Lit les données BLOB/CLOB et les envoye au navigateur
    • cubrid_lob_size - Récupère la taille des données BLOB/CLOB
    • cubrid_lock_read - Place un verrou de lecture sur l'OID fourni
    • cubrid_lock_write - Place un verrou d'écriture sur l'OID fourni
    • cubrid_move_cursor - Déplace le curseur dans le résultat
    • cubrid_new_glo - Crée une instance glo
    • cubrid_next_result - Récupère le résultat de la prochaine requête lors de l'exécution de requêtes SQL multiples
    • cubrid_num_cols - Récupère le nombre de colonnes du jeu de résultats
    • cubrid_num_fields - Retourne le nombre de colonnes dans le jeu de résultats
    • cubrid_num_rows - Récupère le nombre de lignes d'un jeu de résultats
    • cubrid_pconnect - Ouvre une connexion persistante vers un serveur CUBRID
    • cubrid_pconnect_with_url - Ouvre une connexion persistante vers un serveur CUBRID
    • cubrid_ping - Ping une connexion au serveur ou se reconnecte s'il n'y a plus de connexion active
    • cubrid_prepare - Prépare une requête SQL pour son exécution
    • cubrid_put - Met à jour une colonne suivant son OID
    • cubrid_query - Envoi une requête CUBRID
    • cubrid_real_escape_string - Échappe les caractères spéciaux d'une chaîne pour l'utiliser dans une requête SQL
    • cubrid_result - Retourne la valeur d'un champ d'une ligne spécifique
    • cubrid_rollback - Annule une transaction
    • cubrid_save_to_glo - Sauvegarde un fichier dans une instance glo
    • cubrid_schema - Récupère des informations sur un schéma
    • cubrid_send_glo - Lit les données depuis une instance glo
    • cubrid_seq_drop - Supprime un élément d'une séquence
    • cubrid_seq_insert - Insère un élément dans une séquence
    • cubrid_seq_put - Met à jour la valeur d'un élément d'une séquence
    • cubrid_set_add - Insère un seul élément pour définir le type d'une colonne
    • cubrid_set_autocommit - Définit le mode auto-commit pour la connexion
    • cubrid_set_db_parameter - Définit les paramètres de base de données CUBRID
    • cubrid_set_drop - Supprime un élément
    • cubrid_set_query_timeout - Définit le délai maximal d'exécution d'une requête
    • cubrid_unbuffered_query - Exécute une requête sans placer les résultats en mémoire vive
    • cubrid_version - Récupère la version du module PHP CUBRID
    • CURLFile::getFilename - Récupère le nom du fichier
    • CURLFile::getMimeType - Récupère le type MIME
    • CURLFile::getPostFilename - Récupère le nom de fichier pour POST
    • CURLFile::setMimeType - Définit le type MIME
    • CURLFile::setPostFilename - Définit le nom du fichier pour POST
    • CURLFile::__construct - Crée un objet CURLFile
    • curl_close - Ferme une session CURL
    • curl_copy_handle - Copie une ressource cURL avec toutes ses préférences
    • curl_errno - Retourne le dernier message d'erreur cURL
    • curl_error - Retourne une chaîne contenant le dernier message d'erreur cURL
    • curl_escape - Encode URL la chaîne fournie
    • curl_exec - Exécute une session cURL
    • curl_getinfo - Lit les informations détaillant un transfert cURL
    • curl_init - Initialise une session cURL
    • curl_multi_add_handle - Ajoute une ressource cURL à un cURL multiple
    • curl_multi_close - Termine un jeu de sessions cURL
    • curl_multi_errno - Retourne le dernier numéro d'erreur multiple cURL
    • curl_multi_exec - Exécute les sous-requêtes de la session cURL
    • curl_multi_getcontent - Retourne le contenu obtenu avec l'option CURLOPT_RETURNTRANSFER
    • curl_multi_info_read - Lit les informations sur les transferts actuels
    • curl_multi_init - Retourne un nouveau cURL multiple
    • curl_multi_remove_handle - Retire une ressource cURL d'un cURL multiple
    • curl_multi_select - Attend une activité sur n'importe quelle connexion curl_multi
    • curl_multi_setopt - Définit une option pour le gestionnaire multiple cURL
    • curl_multi_strerror - Retourne la description d'un code erreur
    • curl_pause - Met en pause, ou sort de la pause une connexion
    • curl_reset - Ré-initialise toutes les options d'un gestionnaire de session libcurl
    • curl_setopt - Définit une option de transmission cURL
    • curl_setopt_array - Fixe plusieurs options pour un transfert cURL
    • curl_share_close - Ferme un gestionnaire partagé cURL
    • curl_share_errno - Retourne le dernier numéro d'erreur du gestionnaire partagé cURL
    • curl_share_init - Initialise un gestionnaire partagé cURL
    • curl_share_setopt - Définit une option du gestionnaire partagé cURL
    • curl_share_strerror - Retourne une chaîne qui décrit le code d'erreur fournit
    • curl_strerror - Retourne la chaîne descriptive du code erreur fourni
    • curl_unescape - Décode l'URL fourni
    • curl_version - Retourne la version courante de cURL
    • current - Retourne l'élément courant du tableau
  • d
    • data:// - Données (RFC 2397)
    • DatabaseObject::existsInDatabase - Check if object exists in database
    • DatabaseObject::getName - Get object name
    • DatabaseObject::getSession - Get session name
    • date - Formate une date/heure locale
    • DateInterval::createFromDateString - Configure un objet DateInterval à partir des parties d'une chaîne
    • DateInterval::format - Formate l'intervalle
    • DateInterval::__construct - Crée un nouvel objet DateInterval
    • DatePeriod::getDateInterval - Retourne l'intervalle
    • DatePeriod::getEndDate - Retourne la date de fin
    • DatePeriod::getRecurrences - Récupère le nombre de récurrences
    • DatePeriod::getStartDate - Obtient la date de début
    • DatePeriod::__construct - Crée un nouvel objet DatePeriod
    • DateTime::add - Ajoute une durée à un objet DateTime
    • DateTime::createFromFormat - Analyse une heure au format texte selon le format spécifié.
    • DateTime::createFromImmutable - Retourne un nouvel objet DateTime encapsulant l'objet DateTimeImmutable fourni
    • DateTime::createFromInterface - Returns new DateTime object encapsulating the given DateTimeInterface object
    • DateTime::diff - Retourne la différence entre deux objets DateTime
    • DateTime::format - Retourne une date formatée suivant le format fourni
    • DateTime::getLastErrors - Retourne les dernières erreurs et alertes
    • DateTime::getOffset - Retourne le décalage horaire
    • DateTime::getTimestamp - Récupère le timestamp Unix
    • DateTime::getTimezone - Retourne le fuseau horaire relatif au DateTime fourni
    • DateTime::modify - Modifie le timestamp
    • DateTime::setDate - Assigne la date
    • DateTime::setISODate - Configure une date ISO
    • DateTime::setTime - Assigne l'heure
    • DateTime::setTimestamp - Assigne la date et l'heure à l'aide d'un timestamp Unix
    • DateTime::setTimezone - Configure le fuseau horaire de l'objet DateTime
    • DateTime::sub - Soustrait une durée à un objet DateTime
    • DateTime::__construct - Retourne un nouvel objet DateTime
    • DateTime::__set_state - Le gestionnaire __set_state
    • DateTime::__wakeup - Le gestionnaire __wakeup
    • DateTimeImmutable::add - Ajoute un nombre de jours, mois, années, heures, minutes et secondes
    • DateTimeImmutable::createFromFormat - Analyse une heure au format texte selon le format spécifié.
    • DateTimeImmutable::createFromInterface - Returns new DateTimeImmutable object encapsulating the given DateTimeInterface object
    • DateTimeImmutable::createFromMutable - Retourne le nouvel objet DateTimeImmutable qui contient l'objet DateTime fourni
    • DateTimeImmutable::getLastErrors - Retourne les alertes et erreurs
    • DateTimeImmutable::modify - Créé un nouvel objet dont le timestamp a été modifié
    • DateTimeImmutable::setDate - Définit la date
    • DateTimeImmutable::setISODate - Définit la date ISO
    • DateTimeImmutable::setTime - Définit le temps
    • DateTimeImmutable::setTimestamp - Définit la date et l'heure basé sur un timestamp Unix
    • DateTimeImmutable::setTimezone - Définit le décalage horaire
    • DateTimeImmutable::sub - Soustrait un nombre de jours, mois, années, heures et secondes
    • DateTimeImmutable::__construct - Retourne un nouvel objet DateTimeImmutable
    • DateTimeImmutable::__set_state - Le gestionnaire __set_state
    • DateTimeZone::getLocation - Retourne les informations géographiques d'un fuseau horaire
    • DateTimeZone::getName - Retourne le nom du fuseau horaire
    • DateTimeZone::getOffset - Retourne le décalage GMT d'un fuseau horaire
    • DateTimeZone::getTransitions - Retourne toutes les transitions d'un fuseau horaire
    • DateTimeZone::listAbbreviations - Retourne un tableau associatif, décrivant un fuseau horaire
    • DateTimeZone::listIdentifiers - Retourne un tableau numérique contenant tous les identifiants de fuseaux horaires définis
    • DateTimeZone::__construct - Crée un nouvel objet DateTimeZone
    • date_add - Alias de DateTime::add
    • date_create - Alias de DateTime::__construct
    • date_create_from_format - Alias de DateTime::createFromFormat
    • date_create_immutable - Alias de DateTimeImmutable::__construct
    • date_create_immutable_from_format - Alias de DateTimeImmutable::createFromFormat
    • date_date_set - Alias de DateTime::setDate
    • date_default_timezone_get - Récupère le décalage horaire par défaut utilisé par toutes les fonctions date/heure d'un script
    • date_default_timezone_set - Définit le décalage horaire par défaut de toutes les fonctions date/heure
    • date_diff - Alias de DateTime::diff
    • date_format - Alias de DateTime::format
    • date_get_last_errors - Alias de DateTime::getLastErrors
    • date_interval_create_from_date_string - Alias de DateInterval::createFromDateString
    • date_interval_format - Alias de DateInterval::format
    • date_isodate_set - Alias de DateTime::setISODate
    • date_modify - Alias de DateTime::modify
    • date_offset_get - Alias de DateTime::getOffset
    • date_parse - Retourne un tableau associatif avec des informations détaillées sur une date/moment donnée
    • date_parse_from_format - Récupère les informations d'une date donnée suivant un format spécifique
    • date_sub - Alias de DateTime::sub
    • date_sunrise - Retourne l'heure de lever du soleil pour un jour et un endroit donnés
    • date_sunset - Retourne l'heure de coucher du soleil pour un jour et un endroit donnés
    • date_sun_info - Retourne un tableau avec les informations sur le lever/coucher du soleil ainsi que le début et la fin de l'aube
    • date_timestamp_get - Alias de DateTime::getTimestamp
    • date_timestamp_set - Alias de DateTime::setTimestamp
    • date_timezone_get - Alias de DateTime::getTimezone
    • date_timezone_set - Alias de DateTime::setTimezone
    • date_time_set - Alias de DateTime::setTime
    • db2_autocommit - Retourne ou modifie l'état AUTOCOMMIT de la connexion à la base de données
    • db2_bind_param - Associe une variable PHP à un paramètre d'une requête SQL
    • db2_client_info - Retourne un objet avec des propriétés qui décrivent le client de base de données DB2
    • db2_close - Ferme une connexion de base de données
    • db2_columns - Retourne un jeu de résultats listant les colonnes et ses métadonnées d'une table
    • db2_column_privileges - Retourne un jeu de résultats listant les colonnes et ses privilèges d'une table
    • db2_commit - Valide la transaction
    • db2_connect - Retourne une connexion à une base de données
    • db2_conn_error - Retourne une chaîne contenant la valeur de SQLSTATE retournée par la dernière tentative de connexion
    • db2_conn_errormsg - Retourne le dernier message d'erreur de connexion ainsi que la valeur de SQLCODE
    • db2_cursor_type - Retourne le type de curseur utilisé par une ressource
    • db2_escape_string - Utilisé pour échapper certains caractères
    • db2_exec - Exécute une requête SQL directement
    • db2_execute - Exécute une requête SQL préparée
    • db2_fetch_array - Retourne un tableau, indexé par la position des colonnes, représentant une ligne du jeu de résultats
    • db2_fetch_assoc - Retourne un tableau, indexé par nom de colonne, représentant une ligne du jeu de résultats
    • db2_fetch_both - Retourne un tableau, indexé par nom de colonne et position, représentant une ligne du jeu de résultats
    • db2_fetch_object - Retourne un objet avec les propriétés représentant des colonnes dans la ligne extraite
    • db2_fetch_row - Modifie le pointeur du jeu de résultat à la prochaine ligne ou à la ligne demandée
    • db2_field_display_size - Retourne le maximum d'octets requis pour afficher une colonne
    • db2_field_name - Retourne le nom de la colonne du jeu de résultats
    • db2_field_num - Retourne la position du nom de la colonne du jeu de résultats
    • db2_field_precision - Retourne la précision de la colonne indiquée du jeu de résultats
    • db2_field_scale - Retourne l'échelle de la colonne indiquée du jeu de résultats
    • db2_field_type - Retourne le type de donnée de la colonne indiquée du jeu de résultats
    • db2_field_width - Retourne la largeur de la valeur courante de la colonne indiquée du jeu de résultats
    • db2_foreign_keys - Retourne un jeu de résultats listant les clés étrangères d'une table
    • db2_free_result - Libère la mémoire associée à un jeu de résultats
    • db2_free_stmt - Libère la mémoire associée à la ressource indiquée
    • db2_get_option - Récupère la valeur d'une option pour une requête ou une connexion
    • db2_last_insert_id - Retourne le dernier ID généré par la dernière requête d'insertion
    • db2_lob_read - Récupère de grands objets binaires de tailles prédéfinies à chaque invocation
    • db2_next_result - Demande le prochain jeu de résultats de la ressource indiquée
    • db2_num_fields - Retourne le nombre de champs contenu du jeu de résultats
    • db2_num_rows - Retourne le nombre de lignes affectées par une requête SQL
    • db2_pclose - Ferme une connexion persistante à la base de données
    • db2_pconnect - Retourne une connexion persistante à une base de données
    • db2_prepare - Prépare une requête SQL à être exécutée
    • db2_primary_keys - Retourne un jeu de résultats listant les clés d'une table
    • db2_procedures - Retourne un jeu de résultats listant les procédures d'enregistrement enregistrées dans la base de données
    • db2_procedure_columns - Retourne un jeu de résultats listant les paramètres de procédure d'enregistrement
    • db2_result - Retourne une colonne d'une ligne d'un jeu de résultats
    • db2_rollback - Annule une transaction
    • db2_server_info - Retourne un objet avec des propriétés qui décrivent le serveur de base de données DB2
    • db2_set_option - Fixe des options pour une connexion ou des ressources
    • db2_special_columns - Retourne un jeu de résultats listant les identifiants uniques des lignes d'une table
    • db2_statistics - Retourne un jeu de résultats listant les index et statistiques d'une table
    • db2_stmt_error - Retourne une chaîne contenant la valeur de SQLSTATE retournée par une requête SQL
    • db2_stmt_errormsg - Retourne le dernier message d'erreur d'une requête SQL
    • db2_tables - Retourne la liste des tables et leurs métadonnées
    • db2_table_privileges - Retourne un jeu de résultats listant les tables et leurs privilèges qui leur sont associées d'une base de données
    • dbase_add_record - Ajoute un enregistrement dans une base de données dBase
    • dbase_close - Ferme une base dBase
    • dbase_create - Crée une base de données dBase
    • dbase_delete_record - Efface un enregistrement dans une base dBase
    • dbase_get_header_info - Récupère des informations d'en-tête d'une base de données dBase
    • dbase_get_record - Lit un enregistrement dans une base dBase
    • dbase_get_record_with_names - Lit un enregistrement dans une base dBase, sous la forme d'un tableau associatif
    • dbase_numfields - Compte le nombre de champs d'une base dBase
    • dbase_numrecords - Compte le nombre d'enregistrements dans une base dBase
    • dbase_open - Ouvre une base dBase
    • dbase_pack - Compacte une base dBase
    • dbase_replace_record - Remplace un enregistrement dans une base dBase
    • dba_close - Ferme une base DBA
    • dba_delete - Efface une ligne dans une base DBA
    • dba_exists - Vérifie qu'une clé DBA existe
    • dba_fetch - Lit les données liées à une clé DBA
    • dba_firstkey - Lit la première clé DBA
    • dba_handlers - Liste les gestionnaires DBA disponibles
    • dba_insert - Insère une entrée DBA
    • dba_key_split - Transforme une représentation de clé DBA par chaîne en une représentation par tableau
    • dba_list - Liste tous les fichiers de bases de données DBA ouverts
    • dba_nextkey - Lit la clé DBA suivante
    • dba_open - Ouvre une base de données DBA
    • dba_optimize - Optimise une base DBA
    • dba_popen - Ouvre une connexion persistante à une base de données DBA
    • dba_replace - Remplace ou insère une ligne DBA
    • dba_sync - Synchronise une base de données DBA
    • dbplus_add - Ajoute une ligne à une relation
    • dbplus_aql - Exécute une requête AQL
    • dbplus_chdir - Lit/Modifie le chemin du dossier virtuel courant vers la base de données
    • dbplus_close - Ferme une relation
    • dbplus_curr - Lit la ligne courante depuis une relation
    • dbplus_errcode - Récupère le message d'erreur pour le code erreur fourni ou pour la dernière erreur survenue
    • dbplus_errno - Lit le code d'erreur généré par la dernière opération
    • dbplus_find - Ajoute une contrainte sur une relation
    • dbplus_first - Lit la première ligne d'une relation
    • dbplus_flush - Écrit toutes les modifications apportées à une relation
    • dbplus_freealllocks - Libère tous les verrous posés par le client
    • dbplus_freelock - Lève un verrou en écriture sur une ligne
    • dbplus_freerlocks - Lève tous les verrous sur les lignes d'une relation
    • dbplus_getlock - Pose un verrou sur une ligne
    • dbplus_getunique - Retourne un identifiant unique pour une relation
    • dbplus_info - Récupère les informations sur une relation
    • dbplus_last - Lit la dernière ligne d'une relation
    • dbplus_lockrel - Pose un verrou en écriture sur une relation
    • dbplus_next - Lit la ligne suivante dans la relation
    • dbplus_open - Ouvre un fichier de relation
    • dbplus_prev - Lit la ligne précédente dans la relation
    • dbplus_rchperm - Modifie les droits sur la relation
    • dbplus_rcreate - Crée une nouvelle relation DB++
    • dbplus_rcrtexact - Crée une copie exacte mais vide d'une relation
    • dbplus_rcrtlike - Crée une copie vide d'une relation avec les index
    • dbplus_resolve - Résout les informations d'hôte pour une relation
    • dbplus_restorepos - Restaure la position
    • dbplus_rkeys - Spécifie la nouvelle clé primaire d'une relation
    • dbplus_ropen - Ouvre un fichier de relation local
    • dbplus_rquery - Accomplit une requête AQL locale
    • dbplus_rrename - Renomme une relation
    • dbplus_rsecindex - Crée un nouvel index secondaire pour une relation
    • dbplus_runlink - Détruit une relation
    • dbplus_rzap - Supprime toutes les lignes d'une relation
    • dbplus_savepos - Sauvegarde la position
    • dbplus_setindex - Définie l'index
    • dbplus_setindexbynumber - Définie l'index par un nombre
    • dbplus_sql - Exécute une requête SQL
    • dbplus_tcl - Exécute du code TCL côté serveur
    • dbplus_tremove - Supprime la ligne courante et retourne la nouvelle ligne courante
    • dbplus_undo - Annule
    • dbplus_undoprepare - Prépare l'annulation
    • dbplus_unlockrel - Libère un verrou en écriture posé sur une relation
    • dbplus_unselect - Retire une contrainte d'une relation
    • dbplus_update - Modifie une ligne dans une relation
    • dbplus_xlockrel - Pose un verrou exclusif sur une relation
    • dbplus_xunlockrel - Lève un verrou exclusif posé sur une relation
    • dcgettext - Remplace le domaine lors d'une recherche
    • dcngettext - Version plurielle de dcgettext
    • debug_backtrace - Génère le contexte de débogage
    • debug_print_backtrace - Affiche la pile d'exécution PHP
    • debug_zval_dump - Extrait une représentation sous forme de chaîne de la structure interne d'une zval pour affichage
    • decbin - Convertit de décimal en binaire
    • dechex - Convertit de décimal en hexadécimal
    • decoct - Convertit de décimal en octal
    • define - Définit une constante
    • defined - Vérifie l'existence d'une constante
    • deflate_add - Incrementally deflate data
    • deflate_init - Initialize an incremental deflate context
    • deg2rad - Convertit un nombre de degrés en radians
    • delete - Voir unlink ou unset
    • dgettext - Remplace le domaine courant
    • die - Alias de la fonction exit
    • dio_close - Ferme l'accès au fichier
    • dio_fcntl - Exécute une fonction fichier de langage C
    • dio_open - Ouvre un nouveau fichier avec les permissions spécifiées
    • dio_read - Lit les octets dans un fichier
    • dio_seek - Déplace le pointeur interne de fichier
    • dio_stat - Lit des informations sur le fichier
    • dio_tcsetattr - Modifie les attributs du terminal et le taux de baud du port série
    • dio_truncate - Tronque un fichier
    • dio_write - Écrit des données dans le fichier avec la possibilité de tronquer sa longueur
    • dir - Retourne une instance de la classe Directory
    • Directory::close - Ferme le gestionnaire de dossier
    • Directory::read - Lit une entrée depuis le gestionnaire de dossier
    • Directory::rewind - Réinitialise le gestionnaire de dossier
    • DirectoryIterator::current - Retourne l'élément courant du DirectoryIterator
    • DirectoryIterator::getATime - Lit la date et l'heure du dernier accès à un fichier
    • DirectoryIterator::getBasename - Lit le nom de dossier de l'élément DirectoryIterator
    • DirectoryIterator::getCTime - Récupère l'heure de création de l'inode d'un fichier
    • DirectoryIterator::getExtension - Récupère l'extension du fichier
    • DirectoryIterator::getFilename - Retourne le nom de l'entrée courante du dossier
    • DirectoryIterator::getGroup - Récupère le groupe d'un fichier
    • DirectoryIterator::getInode - Récupère l'inode d'un fichier
    • DirectoryIterator::getMTime - Récupère l'heure de la dernière modification d'un fichier
    • DirectoryIterator::getOwner - Récupère le propriétaire d'un fichier
    • DirectoryIterator::getPath - Retourne le chemin du dossier
    • DirectoryIterator::getPathname - Retourne le chemin et le nom de l'entrée courante du dossier
    • DirectoryIterator::getPerms - Récupère les permissions d'un fichier
    • DirectoryIterator::getSize - Récupère la taille d'un fichier
    • DirectoryIterator::getType - Récupère le type d'un fichier
    • DirectoryIterator::isDir - Vérifie si un fichier est un dossier
    • DirectoryIterator::isDot - Retourne true si l'entrée courante est '.' ou '..'
    • DirectoryIterator::isExecutable - Vérifie si le fichier est exécutable
    • DirectoryIterator::isFile - Vérifie si l'entrée est un fichier normal
    • DirectoryIterator::isLink - Vérifie si le fichier est un lien symbolique
    • DirectoryIterator::isReadable - Vérifie si le fichier est accessible en lecture
    • DirectoryIterator::isWritable - Vérifie si le fichier peut être modifié
    • DirectoryIterator::key - Retourne l'entrée courante du dossier
    • DirectoryIterator::next - Se déplace vers la prochaine entrée
    • DirectoryIterator::rewind - Revient au début du dossier
    • DirectoryIterator::seek - Déplace le pointeur dans un itérateur DirectoryIterator
    • DirectoryIterator::valid - Vérifie si le répertoire contient encore des entrées
    • DirectoryIterator::__construct - Construit un nouvel itérateur de dossier à partir d'un chemin
    • DirectoryIterator::__toString - Lit le nom du fichier
    • dirname - Renvoie le chemin du dossier parent
    • diskfreespace - Alias de disk_free_space
    • disk_free_space - Renvoie l'espace disque disponible sur le système de fichiers ou la partition
    • disk_total_space - Retourne la taille d'un dossier ou d'une partition
    • dl - Charge une extension PHP à la volée
    • dngettext - Version plurielle de dgettext
    • dns_check_record - Alias de checkdnsrr
    • dns_get_mx - Alias de getmxrr
    • dns_get_record - Lit les données DNS associées à un hôte
    • DocResult::fetchAll - Get all rows
    • DocResult::fetchOne - Get one row
    • DocResult::getWarnings - Get warnings from last operation
    • DocResult::getWarningsCount - Get warning count from last operation
    • DocResult::__construct - DocResult constructor
    • DOMAttr::isId - Vérifie si l'attribut est un identifiant défini
    • DOMAttr::__construct - Crée un nouvel objet DOMAttr
    • DOMCdataSection::__construct - Construit un nouvel objet DOMCdataSection
    • DOMCharacterData::appendData - Ajoute la chaîne à la fin des données dans le nœud
    • DOMCharacterData::deleteData - Supprime une sous-chaîne dans le nœud
    • DOMCharacterData::insertData - Insère une chaîne à la position spécifiée d'unité 16-bit
    • DOMCharacterData::replaceData - Remplace une sous-chaîne dans le nœud DOMCharacterData
    • DOMCharacterData::substringData - Extrait un morceau de données dans le nœud
    • DOMComment::__construct - Crée un nouvel objet DOMComment
    • DOMDocument::createAttribute - Crée un nouvel attribut
    • DOMDocument::createAttributeNS - Crée un nouvel attribut avec un espace de noms associé
    • DOMDocument::createCDATASection - Crée un nouveau nœud cdata
    • DOMDocument::createComment - Crée un nouveau nœud de commentaire
    • DOMDocument::createDocumentFragment - Crée un nouveau fragment de document
    • DOMDocument::createElement - Crée un nouveau nœud
    • DOMDocument::createElementNS - Crée un nouveau nœud avec un espace de noms associé
    • DOMDocument::createEntityReference - Crée un nouveau nœud de référence d'entité
    • DOMDocument::createProcessingInstruction - Crée un nouveau nœud PI
    • DOMDocument::createTextNode - Crée un nouveau nœud de texte
    • DOMDocument::getElementById - Cherche un élément avec un certain identifiant
    • DOMDocument::getElementsByTagName - Cherche tous les éléments qui ont le nom de la balise locale donné
    • DOMDocument::getElementsByTagNameNS - Recherche tous les éléments avec un nom de balise donné dans un espace de noms spécifié
    • DOMDocument::importNode - Importe un nœud dans le document courant
    • DOMDocument::load - Charge du XML depuis un fichier
    • DOMDocument::loadHTML - Charge du code HTML à partir d'une chaîne de caractères
    • DOMDocument::loadHTMLFile - Charge du HTML à partir d'un fichier
    • DOMDocument::loadXML - Charge du XML depuis une chaîne de caractères
    • DOMDocument::normalizeDocument - Normalise le document
    • DOMDocument::registerNodeClass - Enregistre la classe étendue utilisée pour créer un type de base de nœud
    • DOMDocument::relaxNGValidate - Effectue une validation relaxNG sur le document
    • DOMDocument::relaxNGValidateSource - Effectue une validation relaxNG sur le document
    • DOMDocument::save - Sauvegarde l'arbre interne XML dans un fichier
    • DOMDocument::saveHTML - Sauvegarde le document interne dans une chaîne en utilisant un formatage HTML
    • DOMDocument::saveHTMLFile - Sauvegarde un document interne dans un fichier en utilisant un formatage HTML
    • DOMDocument::saveXML - Sauvegarde l'arbre interne XML dans une chaîne de caractères
    • DOMDocument::schemaValidate - Valide un document selon un schéma. Seuls les schémas XML 1.0 sont supportés.
    • DOMDocument::schemaValidateSource - Valide un document selon un schéma
    • DOMDocument::validate - Valide un document en se basant sur sa DTD
    • DOMDocument::xinclude - Remplace les XIncludes dans un objet DOMDocument
    • DOMDocument::__construct - Crée un nouvel objet DOMDocument
    • DOMDocumentFragment::appendXML - Ajoute des données XML
    • DOMElement::getAttribute - Retourne la valeur d'un attribut
    • DOMElement::getAttributeNode - Retourne le nœud d'attribut
    • DOMElement::getAttributeNodeNS - Retourne le nœud d'attribut
    • DOMElement::getAttributeNS - Retourne la valeur de l'attribut
    • DOMElement::getElementsByTagName - Retourne les éléments par leur nom de balise
    • DOMElement::getElementsByTagNameNS - Récupère les éléments par leur espace de noms et leur localName
    • DOMElement::hasAttribute - Vérifie si un attribut existe
    • DOMElement::hasAttributeNS - Vérifie si un attribut existe
    • DOMElement::removeAttribute - Efface un attribut
    • DOMElement::removeAttributeNode - Efface un attribut
    • DOMElement::removeAttributeNS - Efface un attribut
    • DOMElement::setAttribute - Ajoute un nouvel attribut
    • DOMElement::setAttributeNode - Ajoute un nouvel attribut à l'élément
    • DOMElement::setAttributeNodeNS - Ajoute un nouvel attribut à l'élément
    • DOMElement::setAttributeNS - Ajoute un nouvel attribut
    • DOMElement::setIdAttribute - Déclare l'attribut spécifié par son nom à être de type ID
    • DOMElement::setIdAttributeNode - Déclare l'attribut spécifié par le nœud à être de type ID
    • DOMElement::setIdAttributeNS - Déclare l'attribut spécifié par son nom local et son espace de nom URI à être de type ID
    • DOMElement::__construct - Crée un nouvel objet DOMElement
    • DOMEntityReference::__construct - Crée un nouvel objet DOMEntityReference
    • DOMImplementation::createDocument - Crée un objet DOM Document du type spécifié avec ses éléments
    • DOMImplementation::createDocumentType - Crée un objet DOMDocumentType vide
    • DOMImplementation::hasFeature - Teste si l'implémentation DOM implémente une fonctionnalité spécifique
    • DOMImplementation::__construct - Crée un nouvel objet DOMImplementation
    • DOMNamedNodeMap::count - Récupère le nombre de nœuds dans la collection non triée (map)
    • DOMNamedNodeMap::getNamedItem - Retourne un nœud spécifié par son nom
    • DOMNamedNodeMap::getNamedItemNS - Retourne un nœud spécifié par son nom local et son espace de noms
    • DOMNamedNodeMap::item - Retourne un nœud selon son index
    • DOMNode::appendChild - Ajoute un nouveau fils à la fin des fils
    • DOMNode::C14N - Canonise des nœuds en une chaîne
    • DOMNode::C14NFile - Canonise des nœuds en fichier
    • DOMNode::cloneNode - Clone un nœud
    • DOMNode::getLineNo - Lit le numéro de ligne d'un noeud
    • DOMNode::getNodePath - Récupère un XPath pour un nœud
    • DOMNode::hasAttributes - Vérifie si le noeud possède un attribut
    • DOMNode::hasChildNodes - Vérifie si le noeud possède des enfants
    • DOMNode::insertBefore - Ajoute un nouveau fils avant le nœud référencé
    • DOMNode::isDefaultNamespace - Vérifie si l'espace de nom spécifié est l'espace de noms par défaut ou non
    • DOMNode::isSameNode - Indique si deux nœuds sont identiques
    • DOMNode::isSupported - Vérifie si la fonctionnalité est disponible pour la version spécifiée
    • DOMNode::lookupNamespaceUri - Retourne l'URI de l'espace de noms selon le préfixe
    • DOMNode::lookupPrefix - Retourne le préfixe de l'espace de noms selon l'URI de l'espace de noms
    • DOMNode::normalize - Normalise le noeud
    • DOMNode::removeChild - Supprime un fils de la liste des enfants
    • DOMNode::replaceChild - Remplace un fils
    • DOMNodeList::count - Récupère le nombre de nœuds dans la collection triée (list)
    • DOMNodeList::item - Retourne un nœud spécifié par son index
    • DOMProcessingInstruction::__construct - Crée un nouvel objet DOMProcessingInstruction
    • DOMText::isElementContentWhitespace - Rapporte si le nœud textuel contient des caractères d'espacement blanc
    • DOMText::isWhitespaceInElementContent - Indique si ce noeud de texte contient des espaces blancs
    • DOMText::splitText - Coupe le nœud en deux nœuds à l'endroit spécifié
    • DOMText::__construct - Crée un nouvel objet DOMText
    • DOMXPath::evaluate - Évalue une expression XPath donnée et retourne un résultat typé si possible
    • DOMXPath::query - Évalue l'expression XPath donnée
    • DOMXPath::registerNamespace - Enregistre l'espace de noms avec l'objet DOMXPath
    • DOMXPath::registerPhpFunctions - Enregistre une fonction PHP comme fonction XPath
    • DOMXPath::__construct - Crée un nouvel objet DOMXPath
    • dom_import_simplexml - Transforme un objet SimpleXMLElement en un objet DOMElement
    • dotnet::__construct - Constructeur de la classe dotnet
    • doubleval - Alias de floatval
    • DSN PDO_CUBRID - Connexion aux bases de données CUBRID
    • Ds\Collection::clear - Supprimer toutes les valeurs
    • Ds\Collection::copy - Retourne une copie superficielle de la collection
    • Ds\Collection::isEmpty - Indique si la collection est vide
    • Ds\Collection::toArray - Convertit la collection en un tableau
    • Ds\Deque::allocate - Allocates enough memory for a required capacity
    • Ds\Deque::apply - Updates all values by applying a callback function to each value
    • Ds\Deque::capacity - Returns the current capacity
    • Ds\Deque::clear - Removes all values from the deque
    • Ds\Deque::contains - Determines if the deque contains given values
    • Ds\Deque::copy - Returns a shallow copy of the deque
    • Ds\Deque::count - Returns the number of values in the collection
    • Ds\Deque::filter - Creates a new deque using a callable to determine which values to include
    • Ds\Deque::find - Attempts to find a value's index
    • Ds\Deque::first - Returns the first value in the deque
    • Ds\Deque::get - Returns the value at a given index
    • Ds\Deque::insert - Inserts values at a given index
    • Ds\Deque::isEmpty - Returns whether the deque is empty
    • Ds\Deque::join - Joins all values together as a string
    • Ds\Deque::jsonSerialize - Returns a representation that can be converted to JSON
    • Ds\Deque::last - Returns the last value
    • Ds\Deque::map - Returns the result of applying a callback to each value
    • Ds\Deque::merge - Returns the result of adding all given values to the deque
    • Ds\Deque::pop - Removes and returns the last value
    • Ds\Deque::push - Adds values to the end of the deque
    • Ds\Deque::reduce - Reduces the deque to a single value using a callback function
    • Ds\Deque::remove - Removes and returns a value by index
    • Ds\Deque::reverse - Reverses the deque in-place
    • Ds\Deque::reversed - Returns a reversed copy
    • Ds\Deque::rotate - Rotates the deque by a given number of rotations
    • Ds\Deque::set - Updates a value at a given index
    • Ds\Deque::shift - Removes and returns the first value
    • Ds\Deque::slice - Returns a sub-deque of a given range
    • Ds\Deque::sort - Sorts the deque in-place
    • Ds\Deque::sorted - Returns a sorted copy
    • Ds\Deque::sum - Returns the sum of all values in the deque
    • Ds\Deque::toArray - Converts the deque to an tableau
    • Ds\Deque::unshift - Adds values to the front of the deque
    • Ds\Deque::__construct - Creates a new instance
    • Ds\Hashable::equals - Determines whether an object is equal to the current instance
    • Ds\Hashable::hash - Returns a scalar value to be used as a hash value
    • Ds\Map::allocate - Allocates enough memory for a required capacity
    • Ds\Map::apply - Updates all values by applying a callback function to each value
    • Ds\Map::capacity - Returns the current capacity
    • Ds\Map::clear - Removes all values
    • Ds\Map::copy - Returns a shallow copy of the map
    • Ds\Map::count - Returns the number of values in the map
    • Ds\Map::diff - Creates a new map using keys that aren't in another map
    • Ds\Map::filter - Creates a new map using a callable to determine which pairs to include
    • Ds\Map::first - Returns the first pair in the map
    • Ds\Map::get - Returns the value for a given key
    • Ds\Map::hasKey - Determines whether the map contains a given key
    • Ds\Map::hasValue - Determines whether the map contains a given value
    • Ds\Map::intersect - Creates a new map by intersecting keys with another map
    • Ds\Map::isEmpty - Returns whether the map is empty
    • Ds\Map::jsonSerialize - Returns a representation that can be converted to JSON
    • Ds\Map::keys - Returns a set of the map's keys
    • Ds\Map::ksort - Sorts the map in-place by key
    • Ds\Map::ksorted - Returns a copy, sorted by key
    • Ds\Map::last - Returns the last pair of the map
    • Ds\Map::map - Returns the result of applying a callback to each value
    • Ds\Map::merge - Returns the result of adding all given associations
    • Ds\Map::pairs - Returns a sequence containing all the pairs of the map
    • Ds\Map::put - Associates a key with a value
    • Ds\Map::putAll - Associates all key-value pairs of a traversable object or array
    • Ds\Map::reduce - Reduces the map to a single value using a callback function
    • Ds\Map::remove - Removes and returns a value by key
    • Ds\Map::reverse - Reverses the map in-place
    • Ds\Map::reversed - Returns a reversed copy
    • Ds\Map::skip - Returns the pair at a given positional index
    • Ds\Map::slice - Returns a subset of the map defined by a starting index and length
    • Ds\Map::sort - Sorts the map in-place by value
    • Ds\Map::sorted - Returns a copy, sorted by value
    • Ds\Map::sum - Returns the sum of all values in the map
    • Ds\Map::toArray - Converts the map to an tableau
    • Ds\Map::union - Creates a new map using values from the current instance and another map
    • Ds\Map::values - Returns a sequence of the map's values
    • Ds\Map::xor - Creates a new map using keys of either the current instance or of another map, but not of both
    • Ds\Map::__construct - Creates a new instance
    • Ds\Pair::clear - Removes all values
    • Ds\Pair::copy - Returns a shallow copy of the pair
    • Ds\Pair::isEmpty - Returns whether the pair is empty
    • Ds\Pair::jsonSerialize - Returns a representation that can be converted to JSON
    • Ds\Pair::toArray - Converts the pair to an tableau
    • Ds\Pair::__construct - Creates a new instance
    • Ds\PriorityQueue::allocate - Allocates enough memory for a required capacity
    • Ds\PriorityQueue::capacity - Returns the current capacity
    • Ds\PriorityQueue::clear - Removes all values
    • Ds\PriorityQueue::copy - Returns a shallow copy of the queue
    • Ds\PriorityQueue::count - Returns the number of values in the queue
    • Ds\PriorityQueue::isEmpty - Returns whether the queue is empty
    • Ds\PriorityQueue::jsonSerialize - Returns a representation that can be converted to JSON
    • Ds\PriorityQueue::peek - Returns the value at the front of the queue
    • Ds\PriorityQueue::pop - Removes and returns the value with the highest priority
    • Ds\PriorityQueue::push - Pushes values into the queue
    • Ds\PriorityQueue::toArray - Converts the queue to an tableau
    • Ds\PriorityQueue::__construct - Creates a new instance
    • Ds\Queue::allocate - Allocates enough memory for a required capacity
    • Ds\Queue::capacity - Returns the current capacity
    • Ds\Queue::clear - Removes all values
    • Ds\Queue::copy - Returns a shallow copy of the queue
    • Ds\Queue::count - Returns the number of values in the queue
    • Ds\Queue::isEmpty - Returns whether the queue is empty
    • Ds\Queue::jsonSerialize - Returns a representation that can be converted to JSON
    • Ds\Queue::peek - Returns the value at the front of the queue
    • Ds\Queue::pop - Removes and returns the value at the front of the queue
    • Ds\Queue::push - Pushes values into the queue
    • Ds\Queue::toArray - Converts the queue to an tableau
    • Ds\Queue::__construct - Creates a new instance
    • Ds\Sequence::allocate - Allocates enough memory for a required capacity
    • Ds\Sequence::apply - Updates all values by applying a callback function to each value
    • Ds\Sequence::capacity - Returns the current capacity
    • Ds\Sequence::contains - Determines if the sequence contains given values
    • Ds\Sequence::filter - Creates a new sequence using a callable to determine which values to include
    • Ds\Sequence::find - Attempts to find a value's index
    • Ds\Sequence::first - Returns the first value in the sequence
    • Ds\Sequence::get - Returns the value at a given index
    • Ds\Sequence::insert - Inserts values at a given index
    • Ds\Sequence::join - Joins all values together as a string
    • Ds\Sequence::last - Returns the last value
    • Ds\Sequence::map - Returns the result of applying a callback to each value
    • Ds\Sequence::merge - Returns the result of adding all given values to the sequence
    • Ds\Sequence::pop - Removes and returns the last value
    • Ds\Sequence::push - Adds values to the end of the sequence
    • Ds\Sequence::reduce - Reduces the sequence to a single value using a callback function
    • Ds\Sequence::remove - Removes and returns a value by index
    • Ds\Sequence::reverse - Reverses the sequence in-place
    • Ds\Sequence::reversed - Returns a reversed copy
    • Ds\Sequence::rotate - Rotates the sequence by a given number of rotations
    • Ds\Sequence::set - Updates a value at a given index
    • Ds\Sequence::shift - Removes and returns the first value
    • Ds\Sequence::slice - Returns a sub-sequence of a given range
    • Ds\Sequence::sort - Sorts the sequence in-place
    • Ds\Sequence::sorted - Returns a sorted copy
    • Ds\Sequence::sum - Returns the sum of all values in the sequence
    • Ds\Sequence::unshift - Adds values to the front of the sequence
    • Ds\Set::add - Adds values to the set
    • Ds\Set::allocate - Allocates enough memory for a required capacity
    • Ds\Set::capacity - Returns the current capacity
    • Ds\Set::clear - Removes all values
    • Ds\Set::contains - Determines if the set contains all values
    • Ds\Set::copy - Returns a shallow copy of the set
    • Ds\Set::count - Returns the number of values in the set
    • Ds\Set::diff - Creates a new set using values that aren't in another set
    • Ds\Set::filter - Creates a new set using a callable to determine which values to include
    • Ds\Set::first - Returns the first value in the set
    • Ds\Set::get - Returns the value at a given index
    • Ds\Set::intersect - Creates a new set by intersecting values with another set
    • Ds\Set::isEmpty - Returns whether the set is empty
    • Ds\Set::join - Joins all values together as a string
    • Ds\Set::jsonSerialize - Returns a representation that can be converted to JSON
    • Ds\Set::last - Returns the last value in the set
    • Ds\Set::merge - Returns the result of adding all given values to the set
    • Ds\Set::reduce - Reduces the set to a single value using a callback function
    • Ds\Set::remove - Removes all given values from the set
    • Ds\Set::reverse - Reverses the set in-place
    • Ds\Set::reversed - Returns a reversed copy
    • Ds\Set::slice - Returns a sub-set of a given range
    • Ds\Set::sort - Sorts the set in-place
    • Ds\Set::sorted - Returns a sorted copy
    • Ds\Set::sum - Returns the sum of all values in the set
    • Ds\Set::toArray - Converts the set to an tableau
    • Ds\Set::union - Creates a new set using values from the current instance and another set
    • Ds\Set::xor - Creates a new set using values in either the current instance or in another set, but not in both
    • Ds\Set::__construct - Creates a new instance
    • Ds\Stack::allocate - Allocates enough memory for a required capacity
    • Ds\Stack::capacity - Returns the current capacity
    • Ds\Stack::clear - Removes all values
    • Ds\Stack::copy - Returns a shallow copy of the stack
    • Ds\Stack::count - Returns the number of values in the stack
    • Ds\Stack::isEmpty - Returns whether the stack is empty
    • Ds\Stack::jsonSerialize - Returns a representation that can be converted to JSON
    • Ds\Stack::peek - Returns the value at the top of the stack
    • Ds\Stack::pop - Removes and returns the value at the top of the stack
    • Ds\Stack::push - Pushes values onto the stack
    • Ds\Stack::toArray - Converts the stack to an tableau
    • Ds\Stack::__construct - Creates a new instance
    • Ds\Vector::allocate - Allocates enough memory for a required capacity
    • Ds\Vector::apply - Updates all values by applying a callback function to each value
    • Ds\Vector::capacity - Returns the current capacity
    • Ds\Vector::clear - Removes all values
    • Ds\Vector::contains - Determines if the vector contains given values
    • Ds\Vector::copy - Returns a shallow copy of the vector
    • Ds\Vector::count - Returns the number of values in the collection
    • Ds\Vector::filter - Creates a new vector using a callable to determine which values to include
    • Ds\Vector::find - Attempts to find a value's index
    • Ds\Vector::first - Returns the first value in the vector
    • Ds\Vector::get - Returns the value at a given index
    • Ds\Vector::insert - Inserts values at a given index
    • Ds\Vector::isEmpty - Returns whether the vector is empty
    • Ds\Vector::join - Joins all values together as a string
    • Ds\Vector::jsonSerialize - Returns a representation that can be converted to JSON
    • Ds\Vector::last - Returns the last value
    • Ds\Vector::map - Returns the result of applying a callback to each value
    • Ds\Vector::merge - Returns the result of adding all given values to the vector
    • Ds\Vector::pop - Removes and returns the last value
    • Ds\Vector::push - Adds values to the end of the vector
    • Ds\Vector::reduce - Reduces the vector to a single value using a callback function
    • Ds\Vector::remove - Removes and returns a value by index
    • Ds\Vector::reverse - Reverses the vector in-place
    • Ds\Vector::reversed - Returns a reversed copy
    • Ds\Vector::rotate - Rotates the vector by a given number of rotations
    • Ds\Vector::set - Updates a value at a given index
    • Ds\Vector::shift - Removes and returns the first value
    • Ds\Vector::slice - Returns a sub-vector of a given range
    • Ds\Vector::sort - Sorts the vector in-place
    • Ds\Vector::sorted - Returns a sorted copy
    • Ds\Vector::sum - Returns the sum of all values in the vector
    • Ds\Vector::toArray - Converts the vector to an tableau
    • Ds\Vector::unshift - Adds values to the front of the vector
    • Ds\Vector::__construct - Creates a new instance
  • e
    • each - Retourne chaque paire clé/valeur d'un tableau
    • easter_date - Retourne un timestamp UNIX pour Pâques, à minuit pour une année donnée
    • easter_days - Retourne le nombre de jours entre le 21 Mars et Pâques, pour une année donnée
    • echo - Affiche une chaîne de caractères
    • eio_busy - Augmente artificiellement la charge. Utile dans le cadre de tests
    • eio_cancel - Annule une requête
    • eio_chmod - Modifie les permissions d'un fichier/dossier
    • eio_chown - Modifie les permissions d'un fichier/dossier
    • eio_close - Ferme un fichier
    • eio_custom - Exécute une demande personnalisée comme l'appel à une des fonctions eio_*
    • eio_dup2 - Duplique un descripteur de fichier
    • eio_event_loop - Boucle libeio tant que les requêtes s'exécutent
    • eio_fallocate - Autorise l'appelant à manipuler directement l'espace disque alloué pour un fichier
    • eio_fchmod - Modifie les permissions sur un fichier
    • eio_fchown - Modifie le propriétaire du fichier
    • eio_fdatasync - Synchronise le statut interne d'un fichier avec le périphérique de stockage
    • eio_fstat - Récupère le statut d'un fichier
    • eio_fstatvfs - Récupère des statistiques sur le système de fichiers
    • eio_fsync - Synchronise le statut interne d'un fichier avec le périphérique de stockage
    • eio_ftruncate - Tronque un fichier
    • eio_futime - Modifie l'heure du dernier accès et de la dernière modification d'un fichier
    • eio_get_event_stream - Récupère le flux représentant une variable utilisée dans les communications internes avec libeio
    • eio_get_last_error - Retourne une chaîne décrivant la dernière erreur associée avec la ressource demandée
    • eio_grp - Crée un groupe de requêtes
    • eio_grp_add - Ajoute une requête au groupe de requêtes
    • eio_grp_cancel - Annule un groupe de requêtes
    • eio_grp_limit - Définit la limite d'un groupe
    • eio_init - (Re-)initialise Eio
    • eio_link - Crée un lien fort sur un fichier
    • eio_lstat - Récupère le statut d'un fichier
    • eio_mkdir - Crée un dossier
    • eio_mknod - Crée un fichier spécial ou ordinaire
    • eio_nop - Ne fait rien, mis à part le fait de parcourir l'ensemble du cycle des requêtes
    • eio_npending - Retourne le nombre de requêtes terminées
    • eio_nready - Retourne le nombre de requêtes pas encore gérées
    • eio_nreqs - Retourne le nombre de requêtes restant à exécuter
    • eio_nthreads - Retourne le nombre de threads actuellement utilisés
    • eio_open - Ouvre un fichier
    • eio_poll - Vérifie s'il reste des requêtes en cours d'exécution
    • eio_read - Lit un descripteur de fichier à une position donnée
    • eio_readahead - Effectue un readahead sur le fichier dans le cache d'une page
    • eio_readdir - Lit le contenu d'un dossier
    • eio_readlink - Lit la valeur d'un lien symbolique
    • eio_realpath - Récupère le nom du chemin absolu canonisé
    • eio_rename - Modifie le nom ou le chemin d'un fichier
    • eio_rmdir - Supprime un dossier
    • eio_seek - Repositionne le curseur d'un fichier ouvert
    • eio_sendfile - Transfère des données entre des descripteurs de fichiers
    • eio_set_max_idle - Définit le nombre maximal de threads inactifs
    • eio_set_max_parallel - Définit le nombre maximal de threads en parallèle
    • eio_set_max_poll_reqs - Définit le nombre maximal de requêtes à exécuter dans une file d'attente
    • eio_set_max_poll_time - Définit la durée maximale de la file d'attente
    • eio_set_min_parallel - Définit le nombre minimum de threads parallèles
    • eio_stat - Récupère le statut d'un fichier
    • eio_statvfs - Récupère les statistiques du système de fichiers
    • eio_symlink - Crée un lien symbolique
    • eio_sync - Valide le cache du buffer sur le disque
    • eio_syncfs - Appel la fonction système Linux syncfs, si disponible
    • eio_sync_file_range - Synchronise un segment de fichier avec le disque
    • eio_truncate - Tronque un fichier
    • eio_unlink - Supprime un nom et éventuellement, le fichier qui s'y réfère
    • eio_utime - Modifie l'heure du dernier accès et de la dernière modification d'un fichier
    • eio_write - Ecrit dans un fichier
    • empty - Détermine si une variable est vide
    • EmptyIterator::current - La méthode EmptyIterator::current
    • EmptyIterator::key - The key() method
    • EmptyIterator::next - La méthode EmptyIterator::next
    • EmptyIterator::rewind - La méthode EmptyIterator::rewind
    • EmptyIterator::valid - La méthode EmptyIterator::valid
    • enchant_broker_describe - Énumère les fournisseurs Enchant
    • enchant_broker_dict_exists - Vérifie si un dictionnaire existe
    • enchant_broker_free - Libère la ressource de sponsor ainsi que ses dictionnaires
    • enchant_broker_free_dict - Libère une ressource de dictionnaire
    • enchant_broker_get_dict_path - Récupère le chemin du dossier pour un backend fournit
    • enchant_broker_get_error - Retourne la dernière erreur d'un sponsor
    • enchant_broker_init - Crée un nouvel objet sponsor
    • enchant_broker_list_dicts - Retourne une liste de tous les dictionnaires disponibles
    • enchant_broker_request_dict - Crée un nouveau dictionnaire
    • enchant_broker_request_pwl_dict - Crée un dictionnaire en utilisant un fichier PWL
    • enchant_broker_set_dict_path - Définit le chemin du dossier pour un backend fournit
    • enchant_broker_set_ordering - Déclare une préférence pour un dictionnaire d'une langue
    • enchant_dict_add - Ajoute un mot à une liste de mot personnelle
    • enchant_dict_add_to_personal - Alias de enchant_dict_add
    • enchant_dict_add_to_session - Ajoute un mot à la session courante
    • enchant_dict_check - Vérifie si un mot est correctement orthographié
    • enchant_dict_describe - Décrit un dictionnaire
    • enchant_dict_get_error - Retourne la dernière erreur de la session courante
    • enchant_dict_is_added - Que le 'mot' existe ou non dans cette session d'orthographe
    • enchant_dict_is_in_session - Alias de enchant_dict_is_added
    • enchant_dict_quick_check - Vérifie si le mot est correctement orthographié et fournit des suggestions
    • enchant_dict_store_replacement - Ajoute une orthographe pour un mot
    • enchant_dict_suggest - Retourne une liste de valeurs si aucunes des conditions ne sont réunies
    • end - Positionne le pointeur de tableau en fin de tableau
    • ereg - Recherche par expression rationnelle standard
    • eregi - Recherche par expression rationnelle insensible à la casse
    • eregi_replace - Remplacement par expression rationnelle insensible à la casse
    • ereg_replace - >Remplacement par expression rationnelle
    • Error::getCode - Récupère le code d'erreur
    • Error::getFile - Récupère le fichier où l'erreur s'est produite
    • Error::getLine - Récupère le numéro de ligne où l'erreur s'est produite
    • Error::getMessage - Récupère le message d'erreur
    • Error::getPrevious - Retourne Throwable précédent
    • Error::getTrace - Récupère la trace d'appels
    • Error::getTraceAsString - Récupère la trace d'appels en tant que chaîne de caractères
    • Error::__clone - Cloner l'erreur
    • Error::__construct - Constructeur de l'objet Error
    • Error::__toString - Représentation sous forme de chaîne de caractère de l'erreur
    • ErrorException::getSeverity - Récupère la sévérité de l'exception
    • ErrorException::__construct - Construit l'exception
    • error_clear_last - Enlève l'erreur la plus récente
    • error_get_last - Récupère la dernière erreur survenue
    • error_log - Envoi un message d'erreur vers le gestionnaire d'erreurs défini
    • error_reporting - Fixe le niveau de rapport d'erreurs PHP
    • escapeshellarg - Protège une chaîne de caractères pour utilisation en ligne de commande
    • escapeshellcmd - Protège les caractères spéciaux du Shell
    • Ev::backend - Retourne un entier décrivant le backend utilisé par libev
    • Ev::depth - Retourne la profondeur de récursion
    • Ev::embeddableBackends - Retourne le jeu de backends qui sont encapsulés dans les autres boucles d'événements
    • Ev::feedSignal - Simule la réception d'un signal
    • Ev::feedSignalEvent - Simule un événement de signal dans la boucle par défaut
    • Ev::iteration - Retourne le nombre de fois que la boucle d'événement par défaut a été sollicitée pour un nouvel événement
    • Ev::now - Retourne le temps de démarrage de la dernière itération de la boucle d'événement par défaut
    • Ev::nowUpdate - Etablit le temps courant en demandant au kernel ; met à jour le temps retourné par Ev::now pendant l'exécution
    • Ev::recommendedBackends - Retourne un masque d'octets de backends recommandés pour la plateforme courante
    • Ev::resume - Reprend la boucle d'événement par défaut précédemment stoppée
    • Ev::run - Commence la vérification des événements et appelle les fonctions de rappels pour la boucle par défaut
    • Ev::sleep - Bloque le processus pendant un nombre de secondes fourni
    • Ev::stop - Arrête la boucle d'événements par défaut
    • Ev::supportedBackends - Retourne le jeu de backends supportés par la configuration courant de libev
    • Ev::suspend - Suspend la boucle par défaut d'événements
    • Ev::time - Retourne le temps courant depuis l'époque Unix
    • Ev::verify - Effectue des vérifications internes de consistence (pour le débogage)
    • eval - Exécute une chaîne comme un script PHP
    • EvCheck::createStopped - Crée une instance d'un observateur stoppé EvCheck
    • EvCheck::__construct - Construit l'objet d'observation EvCheck
    • EvChild::createStopped - Crée une instance de l'observateur stoppé EvCheck
    • EvChild::set - Configure l'observateur
    • EvChild::__construct - Construit l'objet d'observation EvChild
    • EvEmbed::createStopped - Crée un objet EvEmbed watcher stoppé
    • EvEmbed::set - Configure le watcher
    • EvEmbed::sweep - Balaye, une seule fois, et de façon non bloquante la boucle interne
    • EvEmbed::__construct - Construit un objet EvEmbed
    • Event::add - Bascule un évènement en attente
    • Event::addSignal - Alias de la méthode Event::add
    • Event::addTimer - Alias de Event::add
    • Event::del - Supprime un événement de la liste des événements surveillés
    • Event::delSignal - Alias de Event::del
    • Event::delTimer - Alias de Event::del
    • Event::free - Supprime une événement de la liste des événements surveillés et libère les ressources associées
    • Event::getSupportedMethods - Retourne un tableau contenant les noms des méthodes supportées par cette version de Libevent
    • Event::pending - Détecte si l'événement est en attente ou programmé
    • Event::set - Re-configure l'événement
    • Event::setPriority - Défini la priorité de l'événement
    • Event::setTimer - Re-configure un événement timer
    • Event::signal - Construit un objet d'événement signal
    • Event::timer - Construit un objet d'événement timer
    • Event::__construct - Construit un objet Event
    • EventBase::dispatch - Distribut les événements en attente
    • EventBase::exit - Stoppe la distribution des événements
    • EventBase::free - Libère les ressources allouées pour l'événement de base
    • EventBase::getFeatures - Retourne un masque des fonctionnalités supportées
    • EventBase::getMethod - Retourne la méthode d'événement utilisée
    • EventBase::getTimeOfDayCached - Retourne le temps de l'événement courant
    • EventBase::gotExit - Vérifie s'il a été demandé à la boucle d'événements de sortir
    • EventBase::gotStop - Vérifie s'il a été demandé à la boucle d'événements de s'arrêter
    • EventBase::loop - Distribue les événements en attente
    • EventBase::priorityInit - Défini le nombre de propriétés par événement de base
    • EventBase::reInit - Re-initialise l'événement de base (après un fork)
    • EventBase::stop - Demande à event_base de stopper la distribution d'événements
    • EventBase::__construct - Construit un objet EventBase
    • EventBuffer::add - Ajoute des données à la fin du tampon d'événement
    • EventBuffer::addBuffer - Déplace toutes les données du tampon fourni dans l'instance courante EventBuffer
    • EventBuffer::appendFrom - Déplace le nombre d'octets fourni depuis un tampon source vers la fin du tampon courant
    • EventBuffer::copyout - Copie le nombre d'octets spécifié depuis le début du tampon
    • EventBuffer::drain - Supprime un nombre spécifié d'octets depuis le début du tampon sans copier les données
    • EventBuffer::enableLocking - Description
    • EventBuffer::expand - Réserve de l'espace dans le tampon
    • EventBuffer::freeze - Permet d'empécher les appels qui tentent de modifier un tampon d'événements de réussir
    • EventBuffer::lock - Acquière un verrou sur le buffer
    • EventBuffer::prepend - Ajoute des données au début du buffer
    • EventBuffer::prependBuffer - Déplace toutes les données depuis le buffer source vers le début du buffer courant
    • EventBuffer::pullup - Linéarise les données du buffer et retourne le contenu du buffer sous la forme d'une chaîne
    • EventBuffer::read - Lit les données d'un evbuffer, et vide les octets lus
    • EventBuffer::readFrom - Lit des données depuis un fichier et les place à la fin du tampon
    • EventBuffer::readLine - Extrait une ligne depuis le début du tampon
    • EventBuffer::search - Recherche dans le tampon une occurrence d'une chaîne
    • EventBuffer::searchEol - Cherche dans le tampon une occurrence de fin de ligne
    • EventBuffer::substr - Soustrait une portion des données du tampon
    • EventBuffer::unfreeze - Ré-active les appels qui permettent de modifier un buffer d'événements
    • EventBuffer::unlock - Libère un verrou acquis avec EventBuffer::lock
    • EventBuffer::write - Ecrit le contenu du buffer dans un fichier ou dans un socket
    • EventBuffer::__construct - Construit un objet EventBuffer
    • EventBufferEvent::close - Ferme le descripteur de fichier associé avec le buffer d'événements courant
    • EventBufferEvent::connect - Connecte le descripteur de fichier du tampon d'événement à l'adresse fournie, ou au socket UNIX
    • EventBufferEvent::connectHost - Connexion à un hôte
    • EventBufferEvent::createPair - Crée deux événements de tampon connectés l'un à l'autre
    • EventBufferEvent::disable - Désactive les événements de lecture, d'écriture ou des deux sur un événement de tampon
    • EventBufferEvent::enable - Active les événements de lecture, d'écriture, ou des deux, sur un événement de tampon
    • EventBufferEvent::free - Libère un événement de tampon
    • EventBufferEvent::getDnsErrorString - Retourne une chaîne décrivant la dernière erreur DNS
    • EventBufferEvent::getEnabled - Retourne un masque d'événements actuellement actifs sur le tampon d'événements
    • EventBufferEvent::getInput - Retourne le tampon d'entrée associé avec le tampon d'événements courant
    • EventBufferEvent::getOutput - Retourne le tampon de sortie associé avec le tampon d'événement courant
    • EventBufferEvent::read - Lit les données du tampon
    • EventBufferEvent::readBuffer - Vide le contenu entier du tampon d'entrée et le place dans le tampon
    • EventBufferEvent::setCallbacks - Assigne les fonctions de rappel pour la lecture, l'écriture, et les statuts d'événements
    • EventBufferEvent::setPriority - Assigne une priorité pour un tampon d'événements
    • EventBufferEvent::setTimeouts - Défini le mode lecture et écriture pour le délai d'attente maximal d'un tampon d'événement
    • EventBufferEvent::setWatermark - Active la lecture, et/ou l'écriture des filigranes
    • EventBufferEvent::sslError - Retourne l'erreur OpenSSL la plus récente rapportée par le tampon d'événement
    • EventBufferEvent::sslFilter - Crée un nouveau tampon d'événement SSL, dont les données seront envoyées via un autre tampon d'événement
    • EventBufferEvent::sslGetCipherInfo - Retourne une description textuelle d'un cipher
    • EventBufferEvent::sslGetCipherName - Retourne le nom du cipher courant pour la connexion SSL
    • EventBufferEvent::sslGetCipherVersion - Retourne la version du cipher utilisé pour la connexion SSL courante
    • EventBufferEvent::sslGetProtocol - Retourne le nom du protocole utilisé pour la connexion SSL courante
    • EventBufferEvent::sslRenegotiate - Demande au tampon d'événement de commencer une renégociation SSL
    • EventBufferEvent::sslSocket - Crée un nouveau tampon SSL dont ces données seront envoyées via un socket SSL
    • EventBufferEvent::write - Ajoute des données dans un tampon d'événement de sortie
    • EventBufferEvent::writeBuffer - Ajoute le contenu entier d'un tampon dans un tampon d'événement de sortie
    • EventBufferEvent::__construct - Construit un objet EventBufferEvent
    • EventConfig::avoidMethod - Demande à libevent d'ignorer une méthode d'événement spécifique
    • EventConfig::requireFeatures - Entre dans une fonctionnalité de méthode d'événement demandée par l'application
    • EventConfig::setMaxDispatchInterval - Evite l'inversion des priorités
    • EventConfig::__construct - Construit un objet EventConfig
    • EventDnsBase::addNameserverIp - Ajoute un serveur de noms à la base DNS
    • EventDnsBase::addSearch - Ajoute un domaine à la liste des domaines utilisés pour la recherche
    • EventDnsBase::clearSearch - Supprime tous les suffixes courants de recherche
    • EventDnsBase::countNameservers - Récupère le nombre de serveurs de noms configurés
    • EventDnsBase::loadHosts - Charge un fichier hosts (au même format que /etc/hosts)
    • EventDnsBase::parseResolvConf - Analyse le fichier resolv.conf
    • EventDnsBase::setOption - Définit la valeur d'une option de configuration
    • EventDnsBase::setSearchNdots - Définit le paramètre 'ndots' pour les recherches
    • EventDnsBase::__construct - Construit un objet EventDnsBase
    • EventHttp::accept - Autorise un serveur HTTP à accepter les connexions sur le socket ou la ressource spécifiée
    • EventHttp::addServerAlias - Ajoute un alias du serveur pour l'objet serveur HTTP
    • EventHttp::bind - Lie un serveur HTTP sur une adresse et un port spécifiés
    • EventHttp::removeServerAlias - Supprime un alias sur le serveur
    • EventHttp::setAllowedMethods - Définit les méthodes HTTP supportées et acceptées dans les requêtes sur ce serveur, et passées aux fonctions de rappel utilisateurs
    • EventHttp::setCallback - Définit une fonction de rapppel pour une URI spécifique
    • EventHttp::setDefaultCallback - Définit la fonction de rappel par défaut pour gérer les requêtes qui ne sont pas attrappées par des fonctions de rappel spécifiques
    • EventHttp::setMaxBodySize - Définit la taille maximale du corps de la demande
    • EventHttp::setMaxHeadersSize - Définit la taille maximale des en-têtes HTTP
    • EventHttp::setTimeout - Définit le délai d'attente maximal pour une requête HTTP
    • EventHttp::__construct - Construit un objet EventHttp (le serveur HTTP)
    • EventHttpConnection::getBase - Retourne la base d'événement associée avec la connexion
    • EventHttpConnection::getPeer - Récupère l'adresse et le port distant associés avec la connexion
    • EventHttpConnection::makeRequest - Effectue une requête HTTP sur la connexion spécifiée
    • EventHttpConnection::setCloseCallback - Défini une fonction de rappel lors de la fermeture de la connexion
    • EventHttpConnection::setLocalAddress - Définit l'adresse IP depuis laquelle les connexions HTTP sont effectuées
    • EventHttpConnection::setLocalPort - Définit le port local depuis lequel les connexions sont effectuées
    • EventHttpConnection::setMaxBodySize - Définit la taille maximale du corps pour la connexion
    • EventHttpConnection::setMaxHeadersSize - Définit la taille maximale des en-têtes
    • EventHttpConnection::setRetries - Définit le nombre de tentatives pour la connexion
    • EventHttpConnection::setTimeout - Définit le délai d'attente maximal pour la connexion
    • EventHttpConnection::__construct - Construit un objet EventHttpConnection
    • EventHttpRequest::addHeader - Ajoute un en-tête HTTP aux en-têtes de la requête
    • EventHttpRequest::cancel - Annule une requête HTTP en attente
    • EventHttpRequest::clearHeaders - Supprime tous les en-têtes depuis la liste des en-têtes de la requête
    • EventHttpRequest::closeConnection - Ferme les connexions HTTP associées
    • EventHttpRequest::findHeader - Cherche la valeur d'un en-tête
    • EventHttpRequest::free - Libère l'objet et supprime les événements associés
    • EventHttpRequest::getBufferEvent - Retourne l'objet EventBufferEvent
    • EventHttpRequest::getCommand - Retourne la commande de la requête (méthode)
    • EventHttpRequest::getConnection - Retourne un objet EventHttpConnection
    • EventHttpRequest::getHost - Retourne l'hôte demandé
    • EventHttpRequest::getInputBuffer - Retourne le buffer d'entrée
    • EventHttpRequest::getInputHeaders - Retourne le tableau associatif contenant les en-têtes d'entrée
    • EventHttpRequest::getOutputBuffer - Retourne le buffer de sortie de la requête
    • EventHttpRequest::getOutputHeaders - Retourne un tableau associatif contenant les en-têtes de sortie
    • EventHttpRequest::getResponseCode - Retourne le code de la réponse
    • EventHttpRequest::getUri - Retourne l'URI de la requête
    • EventHttpRequest::removeHeader - Supprime un en-tête HTTP depuis les en-têtes de la requête
    • EventHttpRequest::sendError - Envoi un message d'erreur HTML au client
    • EventHttpRequest::sendReply - Envoi une réponse HTML au client
    • EventHttpRequest::sendReplyChunk - Envoi un autre bloc de données comme partie d'un bloc de réponse entrant
    • EventHttpRequest::sendReplyEnd - Complète un bloc de réponse, en libérant la requête
    • EventHttpRequest::sendReplyStart - Initialise un bloc de réponse
    • EventHttpRequest::__construct - Construit un objet EventHttpRequest
    • EventListener::disable - Désactive un objet d'écoute d'événement de connexion
    • EventListener::enable - Active un objet d'écoute d'événement de connexion
    • EventListener::getBase - Retourne la base d'événement associée avec l'écouteur d'événements
    • EventListener::getSocketName - Récupère l'adresse courant pour laquelle le socket d'écoute est lié
    • EventListener::setCallback - Le but de setCallback
    • EventListener::setErrorCallback - Définit la fonction de rappel sur l'évènement d'erreur
    • EventListener::__construct - Crée un nouvel écouteur de connexion associé avec la base d'événement
    • EventSslContext::__construct - Construit un contexte OpenSSL à utiliser avec les classes Event
    • EventUtil::getLastSocketErrno - Retourne le numéro d'erreur le plus récemment survenu sur le socket
    • EventUtil::getLastSocketError - Retourne l'erreur la plus récemment survenue sur le socket
    • EventUtil::getSocketFd - Retourne le descripteur de fichier d'un socket ou d'un flux
    • EventUtil::getSocketName - Récupère l'adresse courant liée au socket
    • EventUtil::setSocketOption - Définit les options du socket
    • EventUtil::sslRandPoll - Génère l'entropie via OpenSSL RAND_poll()
    • EventUtil::__construct - Le constructeur
    • EvFork::createStopped - Crée un instance arrêté de la classe de l'observateur EvFork
    • EvFork::__construct - Construit l'objet observateur EvFork
    • EvIdle::createStopped - Crée une instance d'un objet observateur EvIdle
    • EvIdle::__construct - Construit l'objet observateur EvIdle
    • EvIo::createStopped - Crée un objet d'observateur EvIo arrêté
    • EvIo::set - Configure l'observateur
    • EvIo::__construct - Construit un nouvel objet EvIo
    • EvLoop::backend - Retourne un entier décrivant le backend utilisé par libev
    • EvLoop::check - Crée un objet EvCheck associé avec l'instance de la boucle d'événements courante
    • EvLoop::child - Crée un objet EvChild associé avec la boucle d'événements courante
    • EvLoop::defaultLoop - Retourne ou crée la boucle d'événements par défaut
    • EvLoop::embed - Crée une instance de l'observateur EvEmbed associé avec l'objet de l'EvLoop courant
    • EvLoop::fork - Crée un objet EvFork watcher associé avec l'instance de la boucle de l'événement courant
    • EvLoop::idle - Crée un objet EvIdle watcher associé avec l'instance de la boucle de l'événement courant
    • EvLoop::invokePending - Invoque tous les watchers en attente pendant que leurs statuts de file d'attente ne soient réinitialisés
    • EvLoop::io - Crée un objet EvIo watcher associé avec l'instance de la boucle de l'événement courant
    • EvLoop::loopFork - Doit être appelé après un fork
    • EvLoop::now - Retourne le "event loop time" courant
    • EvLoop::nowUpdate - Etablit le temps courant en demandant au kernel, et mise à jour du temps retourné par EvLoop::now pendant l'exécution
    • EvLoop::periodic - Crée un objet EvPeriodic watcher associé avec l'instance de la boucle d'événement courant
    • EvLoop::prepare - Crée un objet EvPrepare watcher associé avec l'instance de la boucle d'événement courant
    • EvLoop::resume - Reprend une boucle d'évément précédemment stoppée
    • EvLoop::run - Commence à vérifier les événements et à appeler les fonctions de rappel de la boucle
    • EvLoop::signal - Crée un objet EvSignal watcher associé avec l'instance de la boucle d'événement courant
    • EvLoop::stat - Crée un objet EvStat watcher associé avec l'instance de la boucle d'événement courant
    • EvLoop::stop - Stoppe la boucle d'événement
    • EvLoop::suspend - Suspend la boucle
    • EvLoop::timer - Crée un objet EvTimer watcher associé avec l'instance de la boucle d'événement courant
    • EvLoop::verify - Effectue des vérifications de consistence interne (pour le débogage)
    • EvLoop::__construct - Construit un objet de boucle d'événements
    • EvPeriodic::again - Arrête et re-démarre le watcher périodique
    • EvPeriodic::at - Retourne le temps absolu auquel ce watcher sera appelé la prochaine fois
    • EvPeriodic::createStopped - Crée un watcher EvPeriodic stoppé
    • EvPeriodic::set - Configure le watcher
    • EvPeriodic::__construct - Construit un objet watcher EvPeriodic
    • EvPrepare::createStopped - Crée une instance stoppée du watcher EvPrepare
    • EvPrepare::__construct - Construit un objet de watcher EvPrepare
    • EvSignal::createStopped - Crée un objet watcher EvSignal stoppé
    • EvSignal::set - Configure le watcher
    • EvSignal::__construct - Construit un objet watcher EvSignal
    • EvStat::attr - Retourne la valeur la plus récente détectée par Ev
    • EvStat::createStopped - Crée un objet EvStat watcher stoppé
    • EvStat::prev - Retourne le jeu précédent retourné par EvStat::attr
    • EvStat::set - Configure le watcher
    • EvStat::stat - Initialise l'appel à stat
    • EvStat::__construct - Construit un objet EvStat watcher
    • EvTimer::again - Re-démarre le watcher Timer
    • EvTimer::createStopped - Crée un objet EvTimer watcher stoppé
    • EvTimer::set - Configure le watcher
    • EvTimer::__construct - Construit un objet EvTimer watcher
    • EvWatcher::clear - Efface le statut d'attente de l'observateur
    • EvWatcher::feed - Alimente les revents fournis dans la boucle d'événements
    • EvWatcher::getLoop - Retourne la boucle responsable de l'observateur
    • EvWatcher::invoke - Invoque la fonction de rappel de l'observateur avec le masque de bits des événements reçus fournis
    • EvWatcher::keepalive - Garde la boucle active
    • EvWatcher::setCallback - Définit une nouvelle fonction de rappel pour le watcher
    • EvWatcher::start - Démarre le Watcher
    • EvWatcher::stop - Arrête le Watcher
    • EvWatcher::__construct - Constructeur d'objet observateur
    • Exception::getCode - Récupère le code de l'exception
    • Exception::getFile - Récupère le fichier dans lequel l'exception a été créée
    • Exception::getLine - Récupère la ligne dans laquelle l'exception a été créée
    • Exception::getMessage - Récupère le message de l'exception
    • Exception::getPrevious - Retourne l'exception précédente
    • Exception::getTrace - Récupère la trace de la pile
    • Exception::getTraceAsString - Récupère la trace de la pile en tant que chaîne
    • Exception::__clone - Clone l'exception
    • Exception::__construct - Construit l'exception
    • Exception::__toString - Représente l'exception sous la forme d'une chaîne
    • exec - Exécute un programme externe
    • Executable::execute - Execute statement
    • ExecutionStatus::__construct - ExecutionStatus constructor
    • exif_imagetype - Détermine le type d'une image
    • exif_read_data - Lit les en-têtes EXIF dans les images
    • exif_tagname - Lit le nom d'en-tête EXIF d'un index
    • exif_thumbnail - Récupère la miniature d'une image
    • exit - Affiche un message et termine le script courant
    • exp - Calcul l'exponentielle de e
    • expect:// - Flux d'interactions de processus
    • expect_expectl - Attend jusqu'à ce que la sortie d'un processus corresponde à un des motifs, un période de temps spécifique est passée ou un EOF est vu
    • expect_popen - Exécute une commande via le shell Bourne, et ouvre le flux PTY au processus
    • explode - Scinde une chaîne de caractères en segments
    • expm1 - Calcule précisément exponentiel moins un
    • expression - Bind prepared statement variables as parameters
    • Expression::__construct - Expression constructor
    • extension_loaded - Détermine si une extension est chargée ou non
    • extract - Importe les variables dans la table des symboles
    • ezmlm_hash - Calcule le hachage demandé par EZMLM
  • f
    • FANNConnection::getFromNeuron - Retourne la position du neurone de départ
    • FANNConnection::getToNeuron - Retourne la position du neurone de fin
    • FANNConnection::getWeight - Retourne le poids de la connexion
    • FANNConnection::setWeight - Défini le poids de la connexion
    • FANNConnection::__construct - Le constructeur de connexion
    • fann_cascadetrain_on_data - Trains on an entire dataset, for a period of time using the Cascade2 training algorithm
    • fann_cascadetrain_on_file - Trains on an entire dataset read from file, for a period of time using the Cascade2 training algorithm
    • fann_clear_scaling_params - Clears scaling parameters
    • fann_copy - Crée une copie d'une structure fann
    • fann_create_from_file - Consruit une propagation de retour du réseau neuronal depuis un fichier de configuration
    • fann_create_shortcut - Creates a standard backpropagation neural network which is not fully connectected and has shortcut connections
    • fann_create_shortcut_array - Crée une propagation de retour standart de réseau neuronal qui n'est pas totalement connecté, et a des connexions raccourcies
    • fann_create_sparse - Creates a standard backpropagation neural network, which is not fully connected
    • fann_create_sparse_array - Creates a standard backpropagation neural network, which is not fully connected using an array of layer sizes
    • fann_create_standard - Creates a standard fully connected backpropagation neural network
    • fann_create_standard_array - Creates a standard fully connected backpropagation neural network using an array of layer sizes
    • fann_create_train - Crée une structure vide de données d'entrainement
    • fann_create_train_from_callback - Crée la structure de données d'entrainement depuis une fonction fournie par l'utilisateur
    • fann_descale_input - Scale data in input vector after get it from ann based on previously calculated parameters
    • fann_descale_output - Scale data in output vector after get it from ann based on previously calculated parameters
    • fann_descale_train - Descale input and output data based on previously calculated parameters
    • fann_destroy - Détruit le réseau en entier, et libère proprement toute la mémoire associée
    • fann_destroy_train - Détruit les données d'entrainement
    • fann_duplicate_train_data - Retourne une copie exact des données d'entrainement fann
    • fann_get_activation_function - Returns the activation function
    • fann_get_activation_steepness - Returns the activation steepness for supplied neuron and layer number
    • fann_get_bias_array - Get the number of bias in each layer in the network
    • fann_get_bit_fail - The number of fail bits
    • fann_get_bit_fail_limit - Returns the bit fail limit used during training
    • fann_get_cascade_activation_functions - Returns the cascade activation functions
    • fann_get_cascade_activation_functions_count - Returns the number of cascade activation functions
    • fann_get_cascade_activation_steepnesses - Returns the cascade activation steepnesses
    • fann_get_cascade_activation_steepnesses_count - The number of activation steepnesses
    • fann_get_cascade_candidate_change_fraction - Returns the cascade candidate change fraction
    • fann_get_cascade_candidate_limit - Return the candidate limit
    • fann_get_cascade_candidate_stagnation_epochs - Returns the number of cascade candidate stagnation epochs
    • fann_get_cascade_max_cand_epochs - Returns the maximum candidate epochs
    • fann_get_cascade_max_out_epochs - Returns the maximum out epochs
    • fann_get_cascade_min_cand_epochs - Returns the minimum candidate epochs
    • fann_get_cascade_min_out_epochs - Returns the minimum out epochs
    • fann_get_cascade_num_candidates - Returns the number of candidates used during training
    • fann_get_cascade_num_candidate_groups - Returns the number of candidate groups
    • fann_get_cascade_output_change_fraction - Returns the cascade output change fraction
    • fann_get_cascade_output_stagnation_epochs - Returns the number of cascade output stagnation epochs
    • fann_get_cascade_weight_multiplier - Returns the weight multiplier
    • fann_get_connection_array - Récupère les connexions dans le réseau
    • fann_get_connection_rate - Récupère le taux de connexion lorsque le réseau a été créé
    • fann_get_errno - Retourne le numéro de la dernière erreur
    • fann_get_errstr - Retourne le dernier message d'erreur
    • fann_get_layer_array - Get the number of neurons in each layer in the network
    • fann_get_learning_momentum - Returns the learning momentum
    • fann_get_learning_rate - Returns the learning rate
    • fann_get_MSE - Reads the mean square error from the network
    • fann_get_network_type - Get the type of neural network it was created as
    • fann_get_num_input - Récupère le nombre de neurones entrants
    • fann_get_num_layers - Récupère le nombre de couches du réseau neuronal
    • fann_get_num_output - Récupère le nombre de neurones sortants
    • fann_get_quickprop_decay - Returns the decay which is a factor that weights should decrease in each iteration during quickprop training
    • fann_get_quickprop_mu - Retourne le facteur mu
    • fann_get_rprop_decrease_factor - Retourne le facteur d'accroissement utilisé pendant l'entrainement RPROP
    • fann_get_rprop_delta_max - Retourne la taille maximale de l'étape
    • fann_get_rprop_delta_min - Retourne la taille minimale de l'étape
    • fann_get_rprop_delta_zero - Retourne la taille initiale de l'étape
    • fann_get_rprop_increase_factor - Retourne le facteur croissant utilisé pendant l'entrainement RPROP
    • fann_get_sarprop_step_error_shift - Retourne le décalage de l'erreur lors de l'étape sarprop
    • fann_get_sarprop_step_error_threshold_factor - Retourne le facteur de seuil d'erreur lors de l'étape sarprop
    • fann_get_sarprop_temperature - Retourne la température sarprop
    • fann_get_sarprop_weight_decay_shift - Retourne le changement décroissant du poids sarprop
    • fann_get_total_connections - Récupère le nombre total de connexions dans la totalité du réseau
    • fann_get_total_neurons - Récupère le nombre total de neurones dans la totalité du réseau
    • fann_get_training_algorithm - Retourne l'algorithme d'entrainement
    • fann_get_train_error_function - Retourne la fonction d'erreur utilisée pendant l'entrainement
    • fann_get_train_stop_function - Retourne la fonction d'arrêt utilisée pendant l'entrainement
    • fann_init_weights - Initialise les poids en utilisant les algorythme Widrow et Nguyen
    • fann_length_train_data - Retourne le nombre de masques d'entrainement dans les données d'entrainement
    • fann_merge_train_data - Fusionne les données d'entrainement
    • fann_num_input_train_data - Retourne le nombre d'entrées dans chaque masque d'entrainement dans les données d'entrainement
    • fann_num_output_train_data - Retourne le nombre de sortie dans chaque masque d'entrainement dans les données d'entrainement
    • fann_print_error - Affiche le message d'erreur
    • fann_randomize_weights - Donne à chaque connexion un poids aléatoire compris entre min_weight et max_weight
    • fann_read_train_from_file - Lit un fichier contenant les données d'entrainement
    • fann_reset_errno - Réinitialise le numéro de la dernière erreur
    • fann_reset_errstr - Réinitialise le message de la dernière erreur
    • fann_reset_MSE - Réinitialise l'erreur quadratique moyenne du réseau
    • fann_run - Exécute les entrées via le réseau neuronal
    • fann_save - Sauvegarde le réseau complet dans un fichier de configuration
    • fann_save_train - Sauvegarde la structure d'entrainement dans un fichier
    • fann_scale_input - Met à l'échelle les données dans le vecteur d'entrée avant de les donner à ANN, en se basant sur les paramètres précédemment calculés
    • fann_scale_input_train_data - Met à l'échelle les entrées dans les données d'entrainement à l'intervalle spécifié
    • fann_scale_output - Met à l'échelle les données dans le vecteur de sortie avant de les passer à ANN, en se basant sur les paramètres précédemment calculés
    • fann_scale_output_train_data - Met à l'échelle les sorties dans les données d'entrainement à l'intervalle spécifié
    • fann_scale_train - Met à l'échelle les données d'entrée et de sortie en se basant sur les paramètres précédemment calculés
    • fann_scale_train_data - Met à l'échelle les entrées et les sorties dans les données d'entrainement à l'intervalle spécifié
    • fann_set_activation_function - Défini la fonction d'activation pour le neurone et la couche spécifiés
    • fann_set_activation_function_hidden - Défini la fonction d'activation pour toutes les couches cachées
    • fann_set_activation_function_layer - Défini la fonction d'activation pour tous les neurones de la couche spécifiée
    • fann_set_activation_function_output - Défini la fonction d'activation pour la couche d'entrée
    • fann_set_activation_steepness - Défini la pente d'activation pour le neurone et le numéro de couche donnés
    • fann_set_activation_steepness_hidden - Défini la raideur de la pente d'activation pour tous les neurones des couches cachées
    • fann_set_activation_steepness_layer - Défini la pente d'activation pour tous les neurones dans la couche dont le numéro est fourni
    • fann_set_activation_steepness_output - Défini la raideur de la pente d'activation dans la couche de sortie
    • fann_set_bit_fail_limit - Défini le bit sûr limite, utilisé pendant l'entrainement
    • fann_set_callback - Défini la fonction de rappel à utiliser pendant l'entrainement
    • fann_set_cascade_activation_functions - Défini le tableau des fonctions d'activation candidate en cascade
    • fann_set_cascade_activation_steepnesses - Défini le tableaux des raideurs d'activation candidate en cascade
    • fann_set_cascade_candidate_change_fraction - Défini la fraction de modification candidate en cascade
    • fann_set_cascade_candidate_limit - Défini la limite candidate
    • fann_set_cascade_candidate_stagnation_epochs - Défini le nombre d'époques de stagnation candidates en cascade
    • fann_set_cascade_max_cand_epochs - Défini l'époque maximale candidate
    • fann_set_cascade_max_out_epochs - Défini l'époque maximale de sortie
    • fann_set_cascade_min_cand_epochs - Défini l'époque minimale candidate
    • fann_set_cascade_min_out_epochs - Défini l'époque minimale de sortie
    • fann_set_cascade_num_candidate_groups - Défini le nombre de groupes candidats
    • fann_set_cascade_output_change_fraction - Défini la fraction de modification de sortie en cascade
    • fann_set_cascade_output_stagnation_epochs - Défini le nombre d'époques de stagnation en cascade de sortie
    • fann_set_cascade_weight_multiplier - Défini le multiplicateur de poids
    • fann_set_error_log - Défini l'endroit où les erreurs seront historisées
    • fann_set_input_scaling_params - Calcule les paramètres d'échelle d'entrée pour une utilisation future, en se basant sur les données d'entrainement
    • fann_set_learning_momentum - Défini la dynamique d'apprentissage
    • fann_set_learning_rate - Défini le taux d'apprentissage
    • fann_set_output_scaling_params - Calcule les paramètres d'échelle de sortie pour une utilisation future, en se basant sur les données d'entrainement
    • fann_set_quickprop_decay - Défini le facteur décroissant quickprop
    • fann_set_quickprop_mu - Défini le facteur quickprop mu
    • fann_set_rprop_decrease_factor - Défini le facteur de diminution utilisé pendant l'entrainement RPROP
    • fann_set_rprop_delta_max - Défini la taille maximale de l'étape
    • fann_set_rprop_delta_min - Défini la taille minimale de l'étape
    • fann_set_rprop_delta_zero - Défini la taille de l'étape initiale
    • fann_set_rprop_increase_factor - Défini le facteur d'augmentation utilisé pendant l'entrainement RPROP
    • fann_set_sarprop_step_error_shift - Défini le changement de l'étape d'erreur sarprop
    • fann_set_sarprop_step_error_threshold_factor - Défini le facteur de seuil de l'étape d'erreur sarprop
    • fann_set_sarprop_temperature - Défini la températeur sarprop
    • fann_set_sarprop_weight_decay_shift - Défini le changement décroissant du poids de sarprop
    • fann_set_scaling_params - Calcule les paramètres d'échelles d'entrée et de sortie utilisés en se basant sur les données d'entrainement
    • fann_set_training_algorithm - Défini l'algorithme d'entrainement
    • fann_set_train_error_function - Défini la fonction d'erreur utilisée pendant l'entrainement
    • fann_set_train_stop_function - Défini la fonction d'arrêt à utiliser durant l'entrainement
    • fann_set_weight - Défini une connexion dans le réseau
    • fann_set_weight_array - Défini les connexions dans le réseau
    • fann_shuffle_train_data - Mélange les données d'entrainement, et rend aléaloire leurs ordres
    • fann_subset_train_data - Retourne une copie d'un sous-jeu de données d'entrainement
    • fann_test - Effectue un test avec un jeu d'entrées et un jeu de sorties désirées
    • fann_test_data - Effectue un test sur un jeu de données d'entrainement et calcule le MSE pour ces données
    • fann_train - Effectue un entrainement sur une itération avec un jeu d'entrées, et un jeu de sorties désirées
    • fann_train_epoch - Effectue un entrainement avec un jeu de données d'entrainement
    • fann_train_on_data - Effectue un entrainement sur un jeu de données complet pour une période de temps
    • fann_train_on_file - Effectue un entrainement sur un jeu complet de données, qui peut être lu depuis un fichier, pour une période de temps
    • fastcgi_finish_request - Affiche toutes les données de la réponse au client
    • fbird_add_user - Alias de ibase_add_user
    • fbird_affected_rows - Alias de ibase_affected_rows
    • fbird_backup - Alias de ibase_backup
    • fbird_blob_add - Alias de ibase_blob_add
    • fbird_blob_cancel - Annule la création d'un blob
    • fbird_blob_close - Alias de ibase_blob_close
    • fbird_blob_create - Alias de ibase_blob_create
    • fbird_blob_echo - Alias de ibase_blob_echo
    • fbird_blob_get - Alias de ibase_blob_get
    • fbird_blob_import - Alias de ibase_blob_import
    • fbird_blob_info - Alias de ibase_blob_info
    • fbird_blob_open - Alias de ibase_blob_open
    • fbird_close - Alias de ibase_close
    • fbird_commit - Alias de ibase_commit
    • fbird_commit_ret - Alias de ibase_commit_ret
    • fbird_connect - Alias de ibase_connect
    • fbird_db_info - Alias de ibase_db_info
    • fbird_delete_user - Alias de ibase_delete_user
    • fbird_drop_db - Alias de ibase_drop_db
    • fbird_errcode - Alias de ibase_errcode
    • fbird_errmsg - Alias de ibase_errmsg
    • fbird_execute - Alias de ibase_execute
    • fbird_fetch_assoc - Alias de ibase_fetch_assoc
    • fbird_fetch_object - Alias de ibase_fetch_object
    • fbird_fetch_row - Alias de ibase_fetch_row
    • fbird_field_info - Alias de ibase_field_info
    • fbird_free_event_handler - Alias de ibase_free_event_handler
    • fbird_free_query - Alias de ibase_free_query
    • fbird_free_result - Alias de ibase_free_result
    • fbird_gen_id - Alias de ibase_gen_id
    • fbird_maintain_db - Alias de ibase_maintain_db
    • fbird_modify_user - Alias de ibase_modify_user
    • fbird_name_result - Alias de ibase_name_result
    • fbird_num_fields - Alias de ibase_num_fields
    • fbird_num_params - Alias de ibase_num_params
    • fbird_param_info - Alias de ibase_param_info
    • fbird_pconnect - Alias de ibase_pconnect
    • fbird_prepare - Alias de ibase_prepare
    • fbird_query - Alias de ibase_query
    • fbird_restore - Alias de ibase_restore
    • fbird_rollback - Alias de ibase_rollback
    • fbird_rollback_ret - Alias de ibase_rollback_ret
    • fbird_server_info - Alias de ibase_server_info
    • fbird_service_attach - Alias de ibase_service_attach
    • fbird_service_detach - Alias de ibase_service_detach
    • fbird_set_event_handler - Alias de ibase_set_event_handler
    • fbird_trans - Alias de ibase_trans
    • fbird_wait_event - Alias de ibase_wait_event
    • fbsql_affected_rows - Lit le nombre de lignes affectées par la dernière requête
    • fbsql_autocommit - Active ou désactive la validation automatique
    • fbsql_blob_size - Retourne la taille d'un BLOB
    • fbsql_change_user - Change le nom d'utilisateur de la session active
    • fbsql_clob_size - Retourne la taille d'un CLOB
    • fbsql_close - Ferme la connexion FrontBase
    • fbsql_commit - Valide une transaction
    • fbsql_connect - Ouvre une connexion à un serveur FrontBase
    • fbsql_create_blob - Crée un BLOB
    • fbsql_create_clob - Crée un CLOB
    • fbsql_create_db - Crée une base de données
    • fbsql_database - Lit ou définit le nom de la base de données utilisée avec une connexion
    • fbsql_database_password - Modifie/lit le mot de passe dans une base FBSQL
    • fbsql_data_seek - Déplace le pointeur interne de résultat FBSQL
    • fbsql_db_query - Envoie une requête à la base FrontBase
    • fbsql_db_status - Lit le statut courant d'une base de données
    • fbsql_drop_db - Supprime une base de données FrontBase
    • fbsql_errno - Retourne le code d'erreur FrontBase
    • fbsql_error - Retourne le message d'erreur FrontBase
    • fbsql_fetch_array - Lit toute une ligne de résultat dans un tableau
    • fbsql_fetch_assoc - Lit toute une ligne de résultat dans un tableau associatif
    • fbsql_fetch_field - Lit des informations sur une colonne dans un résultat, et retourne un objet
    • fbsql_fetch_lengths - Lit la taille de chaque colonne d'un résultat
    • fbsql_fetch_object - Lit une ligne de résultat sous forme d'objet
    • fbsql_fetch_row - Lit une ligne de résultat sous forme de tableau numérique
    • fbsql_field_flags - Lit les options associées à une colonne de résultat
    • fbsql_field_len - Retourne la taille d'un champ
    • fbsql_field_name - Lit le nom d'un champ
    • fbsql_field_seek - Déplace le pointeur de résultat
    • fbsql_field_table - Lit le nom de la table d'origine d'un champ
    • fbsql_field_type - Lit le type d'une colonne
    • fbsql_free_result - Libère le résultat de la mémoire
    • fbsql_get_autostart_info - Description
    • fbsql_hostname - Lit ou définit le nom de l'hôte à utiliser avec une connexion
    • fbsql_insert_id - Lit le dernier identifiant généré par une requête INSERT
    • fbsql_list_dbs - Liste les bases de données FBSQL
    • fbsql_list_fields - Liste les champs d'une table FrontBase
    • fbsql_list_tables - Liste les tables dans une base de données FrontBase
    • fbsql_next_result - Déplace le pointeur interne vers le résultat suivant
    • fbsql_num_fields - Lit le nombre de champs dans un résultat
    • fbsql_num_rows - Lit le nombre de lignes dans un résultat
    • fbsql_password - Lit ou définit le mot de passe à utiliser avec une connexion
    • fbsql_pconnect - Ouvre une connexion persistante sur un serveur FrontBase
    • fbsql_query - Exécute une requête sur un serveur FrontBase
    • fbsql_read_blob - Lit un BLOB dans une base de données
    • fbsql_read_clob - Lit un CLOB dans une base de données
    • fbsql_result - Lit des données dans un résultat
    • fbsql_rollback - Annule une transaction FBSQL
    • fbsql_rows_fetched - Récupère le nombre de lignes affectées par la dernière requête
    • fbsql_select_db - Sélectionne une base de données FrontBase
    • fbsql_set_characterset - Modifie le jeu de caractères pour l'entrée / sortie
    • fbsql_set_lob_mode - Modifie le mode de lecture des LOB
    • fbsql_set_password - Change le mot de passe de l'utilisateur spécifié
    • fbsql_set_transaction - Configure le verrouillage et l'isolation de transactions
    • fbsql_start_db - Démarre une base de données FBSQL
    • fbsql_stop_db - Stoppe une base de données FBSQL
    • fbsql_tablename - Alias de fbsql_table_name
    • fbsql_table_name - Récupère le nom de la table d'un champ
    • fbsql_username - Lit ou définit le nom de login à utiliser avec une connexion
    • fbsql_warnings - Active ou désactive les alertes FrontBase
    • fclose - Ferme un fichier
    • fdf_add_doc_javascript - Ajoute du code javascript dans un document FDF
    • fdf_add_template - Ajoute un template dans le document FDF
    • fdf_close - Ferme un document FDF
    • fdf_create - Crée un nouveau document FDF
    • fdf_enum_values - Appelle une fonction utilisateur à chaque valeur FDF
    • fdf_errno - Retourne le code d'erreur de la dernière opération FDF
    • fdf_error - Retourne le message d'erreur FDF
    • fdf_get_ap - Lit l'apparence d'un champ
    • fdf_get_attachment - Extrait un fichier intégré dans un document FDF
    • fdf_get_encoding - Lit la valeur de la clé /Encoding
    • fdf_get_file - Lit la valeur de la clé /F
    • fdf_get_flags - Lit les attributs d'un champ FDF
    • fdf_get_opt - Lit une valeur dans un tableau de valeur d'un champ FDF
    • fdf_get_status - Lit la valeur de la clé /STATUS
    • fdf_get_value - Retourne la valeur d'un champ FDF
    • fdf_get_version - Lit le numéro de version de l'API FDF
    • fdf_header - Émet les en-têtes HTTP spécifiques à FDF
    • fdf_next_field_name - Lit le nom du champ FDF suivant
    • fdf_open - Ouvre un document FDF
    • fdf_open_string - Lit un document FDF à partir d'une chaîne de caractères
    • fdf_remove_item - Configure le cadre FDF de destination pour le formulaire
    • fdf_save - Sauvegarde un document FDF
    • fdf_save_string - Retourne un document FDF sous forme d'une chaîne de caractères
    • fdf_set_ap - Fixe l'apparence d'un champ FDF
    • fdf_set_encoding - Modifie l'encodage des caractères
    • fdf_set_file - Crée un document PDF pour y afficher des données FDF
    • fdf_set_flags - Modifie une option d'un champ
    • fdf_set_javascript_action - Modifie l'action javascript d'un champ
    • fdf_set_on_import_javascript - Ajoute du code Javascript à être exécuté lorsque Acrobat ouvre un FDF
    • fdf_set_opt - Modifie une option d'un champ
    • fdf_set_status - Fixe la valeur de la clé /STATUS
    • fdf_set_submit_form_action - Modifie l'action d'un formulaire
    • fdf_set_target_frame - Configure le cadre de destination pour l'affichage du formulaire
    • fdf_set_value - Modifie la valeur d'un champ FDF
    • fdf_set_version - Modifie le numéro de version du fichier FDF
    • fdiv - Divides two numbers, according to IEEE 754
    • feof - Teste la fin du fichier
    • FFI::addr - Creates an unmanaged pointer to C data
    • FFI::alignof - Gets the alignment
    • FFI::arrayType - Dynamically constructs a new C array type
    • FFI::cast - Performs a C type cast
    • FFI::cdef - Creates a new FFI object
    • FFI::free - Releases an unmanaged data structure
    • FFI::isNull - Checks whether a FFI\CData is a null pointer
    • FFI::load - Loads C declarations from a C header file
    • FFI::memcmp - Compares memory areas
    • FFI::memcpy - Copies one memory area to another
    • FFI::memset - Fills a memory area
    • FFI::new - Creates a C data structure
    • FFI::scope - Instantiates an FFI object with C declarations parsed during preloading
    • FFI::sizeof - Gets the size of C data or types
    • FFI::string - Creates a PHP string from a memory area
    • FFI::type - Creates an FFI\CType object from a C declaration
    • FFI::typeof - Gets the FFI\CType of FFI\CData
    • fflush - Envoie tout le contenu généré dans un fichier
    • fgetc - Lit un caractère dans un fichier
    • fgetcsv - Obtient une ligne depuis un pointeur de fichier et l'analyse pour des champs CSV
    • fgets - Récupère la ligne courante à partir de l'emplacement du pointeur sur fichier
    • fgetss - Renvoie la ligne courante du fichier et élimine les balises HTML
    • file - Lit le fichier et renvoie le résultat dans un tableau
    • file:// - Accès au système de fichiers local
    • fileatime - Renvoie la date à laquelle le fichier a été accédé pour la dernière fois
    • filectime - Renvoie la date de dernière modification de l'inode d'un fichier
    • filegroup - Lire le nom du groupe
    • fileinode - Lit le numéro d'inode du fichier
    • filemtime - Lit la date de dernière modification du fichier
    • fileowner - Lit l'identifiant du propriétaire d'un fichier
    • fileperms - Lit les droits d'un fichier
    • filepro - Lit et vérifie un fichier
    • filepro_fieldcount - Retourne le nombre de champs dans une base filePro
    • filepro_fieldname - Retourne le nom d'un champ filePro
    • filepro_fieldtype - Retourne le type d'un champ filePro
    • filepro_fieldwidth - Retourne la taille d'un champ filePro
    • filepro_retrieve - Retourne la valeur d'un champ filePro
    • filepro_rowcount - Retourne le nombre de lignes dans une base filePro
    • filesize - Lit la taille d'un fichier
    • FilesystemIterator::current - Lit le fichier courant
    • FilesystemIterator::getFlags - Lit les options activées
    • FilesystemIterator::key - Lit le nom du fichier
    • FilesystemIterator::next - Passe au fichier suivant
    • FilesystemIterator::rewind - Recommence à lire le dossier
    • FilesystemIterator::setFlags - Configure les options
    • FilesystemIterator::__construct - Construit un objet FilesystemIterator
    • filetype - Retourne le type de fichier
    • file_exists - Vérifie si un fichier ou un dossier existe
    • file_get_contents - Lit tout un fichier dans une chaîne
    • file_put_contents - Écrit des données dans un fichier
    • FilterIterator::accept - Vérifie si l'élément courant de l'itérateur est acceptable
    • FilterIterator::current - Récupère la valeur de l'élément courant
    • FilterIterator::getInnerIterator - Récupère l'itérateur interne
    • FilterIterator::key - Récupère la clé courante
    • FilterIterator::next - Déplace l'itérateur à la position suivante
    • FilterIterator::rewind - Replace l'itérateur au début
    • FilterIterator::valid - Vérifie si l'élément courant est valide
    • FilterIterator::__construct - Construit un filterIterator
    • filter_has_var - Vérifie si une variable d'un type spécifique existe
    • filter_id - Retourne l'identifiant d'un filtre nommé
    • filter_input - Récupère une variable externe et la filtre
    • filter_input_array - Récupère plusieurs valeurs externes et les filtre
    • filter_list - Retourne une liste de tous les filtres supportés
    • filter_var - Filtre une variable avec un filtre spécifique
    • filter_var_array - Récupère plusieurs variables et les filtre
    • finfo::buffer - Alias de finfo_buffer()
    • finfo::file - Alias de finfo_file()
    • finfo::set_flags - Alias de finfo_set_flags()
    • finfo::__construct - Alias de finfo_open
    • finfo_close - Ferme une ressource fileinfo
    • finfo_open - Crée une nouvelle ressource fileinfo
    • floatval - Convertit une chaîne en nombre à virgule flottante
    • flock - Verrouille le fichier
    • floor - Arrondit à l'entier inférieur
    • flush - Vide les tampons de sortie du système
    • fmod - Retourne le reste de la division
    • fnmatch - Teste un nom de fichier au moyen d'un masque de recherche
    • fopen - Ouvre un fichier ou une URL
    • forward_static_call - Appelle une méthode statique
    • forward_static_call_array - Appelle une méthode statique et passe les arguments en tableau
    • fpassthru - Affiche le reste du fichier
    • fprintf - Écrit une chaîne formatée dans un flux
    • fputcsv - Formate une ligne en CSV et l'écrit dans un fichier
    • fputs - Alias de fwrite
    • fread - Lecture du fichier en mode binaire
    • frenchtojd - Convertit une date du calendrier français républicain en nombre de jours du calendrier Julien
    • fscanf - Analyse un fichier en fonction d'un format
    • fseek - Modifie la position du pointeur de fichier
    • fsockopen - Ouvre un socket de connexion Internet ou Unix
    • fstat - Lit les informations sur un fichier à partir d'un pointeur de fichier
    • ftell - Renvoie la position courante du pointeur de fichier
    • ftok - Convertit un chemin et un identifiant de projet en une clé System V IPC
    • ftp:// - Accès aux URLs FTP(s)
    • ftp_alloc - Alloue de l'espace pour un téléchargement de fichier
    • ftp_append - Ajoute le contenu d'un fichier à un autre fichier sur le serveur FTP
    • ftp_cdup - Change de dossier et passe au dossier parent
    • ftp_chdir - Modifie le dossier FTP courant
    • ftp_chmod - Modifie les droits d'un fichier via FTP
    • ftp_close - Ferme une connexion FTP
    • ftp_connect - Ouvre une connexion FTP
    • ftp_delete - Efface un fichier sur un serveur FTP
    • ftp_exec - Exécute une commande sur un serveur FTP
    • ftp_fget - Télécharge un fichier via FTP dans un fichier local
    • ftp_fput - Téléverse un fichier sur un serveur FTP
    • ftp_get - Télécharge un fichier depuis un serveur FTP
    • ftp_get_option - Lit différentes options pour la connexion FTP courante
    • ftp_login - Identification sur un serveur FTP
    • ftp_mdtm - Retourne la date de dernière modification d'un fichier sur un serveur FTP
    • ftp_mkdir - Crée un dossier sur un serveur FTP
    • ftp_mlsd - Retourne la liste des fichiers d'un dossier donné
    • ftp_nb_continue - Reprend le téléchargement d'un fichier (non bloquant)
    • ftp_nb_fget - Lit un fichier sur un serveur FTP, et l'écrit dans un fichier (non bloquant)
    • ftp_nb_fput - Écrit un fichier sur un serveur FTP, et le lit depuis un fichier (non bloquant)
    • ftp_nb_get - Lit un fichier sur un serveur FTP, et l'écrit dans un fichier (non bloquant)
    • ftp_nb_put - Envoie un fichier sur un serveur FTP (non-bloquant)
    • ftp_nlist - Retourne la liste des fichiers d'un dossier
    • ftp_pasv - Active ou désactive le mode passif
    • ftp_put - Charge un fichier sur un serveur FTP
    • ftp_pwd - Retourne le nom du dossier courant
    • ftp_quit - Alias de ftp_close
    • ftp_raw - Envoie une commande FTP brute
    • ftp_rawlist - Fait une liste détaillée des fichiers d'un dossier
    • ftp_rename - Renomme un fichier sur un serveur FTP
    • ftp_rmdir - Efface un dossier FTP
    • ftp_set_option - Modifie les options de la connexion FTP
    • ftp_site - Exécute la commande SITE sur un serveur FTP
    • ftp_size - Retourne la taille d'un fichier
    • ftp_ssl_connect - Ouvre une connexion FTP sécurisée avec SSL
    • ftp_systype - Retourne un identifiant de type de serveur FTP
    • ftruncate - Tronque un fichier
    • function_exists - Indique si une fonction est définie
    • func_get_arg - Retourne un élément de la liste des arguments
    • func_get_args - Retourne les arguments d'une fonction sous la forme d'un tableau
    • func_num_args - Retourne le nombre d'arguments passés à la fonction
    • fwrite - Écrit un fichier en mode binaire
  • g
    • gc_collect_cycles - Force le passage du collecteur de mémoire
    • gc_disable - Désactive le collecteur de références circulaires
    • gc_enable - Active le collecteur de références circulaires
    • gc_enabled - Retourne le statut du collecteur de références circulaires
    • gc_mem_caches - Récupère de la mémoire utilisé par le gestionaire de mémoire de Zend Engine
    • gc_status - Récupère les informations à propos du ramasse-miettes
    • gd_info - Retourne des informations à propos de la bibliothèque GD installée
    • GearmanClient::addOptions - Ajoute des options au client
    • GearmanClient::addServer - Ajoute un serveur de tâches au client
    • GearmanClient::addServers - Ajoute une liste de serveurs de tâches au client
    • GearmanClient::addTask - Ajoute une tâche à exécuter en parallèle
    • GearmanClient::addTaskBackground - Ajoute une tâche d'arrière-plan pour une exécution en parallèle
    • GearmanClient::addTaskHigh - Ajoute une tâche de forte priorité à effectuer en parallèle
    • GearmanClient::addTaskHighBackground - Ajoute une tâche de fond de forte priorité à effectuer en parallèle
    • GearmanClient::addTaskLow - Ajoute une tâche de faible priorité à effectuer en parallèle
    • GearmanClient::addTaskLowBackground - Ajoute une tâche de fond de faible priorité à effectuer en parallèle
    • GearmanClient::addTaskStatus - Ajoute une tâche pour obtenir le statut
    • GearmanClient::clearCallbacks - Efface toutes les fonctions de rappel des tâches
    • GearmanClient::clone - Crée une copie de l'objet GearmanClient
    • GearmanClient::context - Récupère le contexte de l'application
    • GearmanClient::data - Récupère les données de l'application (obsolète)
    • GearmanClient::do - Exécute une seule tâche et retourne le résultat (obsolète)
    • GearmanClient::doBackground - Exécute une tâche en arrière-plan
    • GearmanClient::doHigh - Exécute une seule tâche en priorité haute
    • GearmanClient::doHighBackground - Exécute une tâche en priorité haute en arrière plan
    • GearmanClient::doJobHandle - Récupère le gestionnaire de travaux pour la tâche en cours
    • GearmanClient::doLow - Exécute une seule tâche en priorité basse
    • GearmanClient::doLowBackground - Exécute une tâche en priorité basse en arrière-plan
    • GearmanClient::doNormal - Exécute une tâche et retourne le résultat
    • GearmanClient::doStatus - Récupère le statut de la tâche en cours
    • GearmanClient::echo - Envoi des données à tous les serveurs de travaux afin de vérifier qu'ils les affichent en retour (obsolète)
    • GearmanClient::error - Retourne la dernière erreur rencontrée sous forme de chaîne de caractères
    • GearmanClient::getErrno - Récupère la valeur d'errno
    • GearmanClient::jobStatus - Récupère le statut d'un travail en arrière-plan
    • GearmanClient::ping - Envoi des données à tous les serveurs de tâches pour s'assurer qu'ils sont toujours en fonctionnement
    • GearmanClient::removeOptions - Supprime les options du client
    • GearmanClient::returnCode - Récupère le dernier code Gearman retourné
    • GearmanClient::runTasks - Exécute une liste de tâches en parallèle
    • GearmanClient::setClientCallback - Définit une fonction de rappel lorsqu'un paquet de données est reçu pour une tâche (obsolète)
    • GearmanClient::setCompleteCallback - Définit une fonction à appeler une fois la tâche terminée
    • GearmanClient::setContext - Définit le contexte d'une application
    • GearmanClient::setCreatedCallback - Définit une fonction de rappel à appeler lorsqu'une tâche est placée dans la file d'attente
    • GearmanClient::setData - Définit les données de l'application (obsolète)
    • GearmanClient::setDataCallback - Définit une fonction de rappel à appeler lorsqu'un paquet de données est reçu pour une tâche
    • GearmanClient::setExceptionCallback - Définit une fonction de rappel pour les exceptions émises par l'agent
    • GearmanClient::setFailCallback - Définit une fonction de rappel à appeler lorsqu'un travail échoue
    • GearmanClient::setOptions - Définit les options du client
    • GearmanClient::setStatusCallback - Définit une fonction de rappel pour collecter les statuts d'une tâche
    • GearmanClient::setTimeout - Définit le délai d'attente d'une activité du socket I/O
    • GearmanClient::setWarningCallback - Définit une fonction de rappel lors de l'émission d'alerte depuis l'agent
    • GearmanClient::setWorkloadCallback - Définit une fonction de rappel lors de la réception de mises à jour de données incrémentales
    • GearmanClient::timeout - Récupère la valeur du délai d'activité du socket I/O
    • GearmanClient::wait - Wait for I/O activity on all connections in a client
    • GearmanClient::__construct - Crée une instance GearmanClient
    • GearmanJob::complete - Envoie les résultats ainsi que le statut complet (obsolète)
    • GearmanJob::data - Envoie des données pour un travail en cours d'exécution (obsolète)
    • GearmanJob::exception - Envoie une exception pour un travail en cours d'exécution (obsolète)
    • GearmanJob::fail - Envoie un statut d'échec (obsolète)
    • GearmanJob::functionName - Récupère le nom de la fonction
    • GearmanJob::handle - Récupère le gestionnaire de travaux
    • GearmanJob::returnCode - Récupère le dernier code retourné
    • GearmanJob::sendComplete - Envoie le résultat ainsi que le statut complet
    • GearmanJob::sendData - Envoie les données pour un travail en cours d'exécution
    • GearmanJob::sendException - Envoie une exception pour un travail en cours d'exécution
    • GearmanJob::sendFail - Envoie un statut d'échec
    • GearmanJob::sendStatus - Envoie un statut
    • GearmanJob::sendWarning - Envoie une alerte
    • GearmanJob::setReturn - Définit une valeur de retour
    • GearmanJob::status - Envoie un statut (obsolète)
    • GearmanJob::unique - Récupère l'identifiant unique
    • GearmanJob::warning - Envoie une alerte (obsolète)
    • GearmanJob::workload - Récupère la charge de travail
    • GearmanJob::workloadSize - Récupère la taille de la charge de travail
    • GearmanJob::__construct - Crée une nouvelle instance GearmanJob
    • GearmanTask::create - Crée une tâche (obsolète)
    • GearmanTask::data - Récupère les données retournées par une tâche
    • GearmanTask::dataSize - Récupère la taille des données retournées
    • GearmanTask::function - Récupère le nom de la fonction associée (obsolète)
    • GearmanTask::functionName - Récupère le nom de la fonction associée
    • GearmanTask::isKnown - Vérifie si une tâche est connue
    • GearmanTask::isRunning - Vérifie si la tâche est actuellement en fonctionnement
    • GearmanTask::jobHandle - Récupère le gestionnaire de travaux
    • GearmanTask::recvData - Lit le travail ou les données retournées par une tâche dans un buffer
    • GearmanTask::returnCode - Récupère le dernier code retourné
    • GearmanTask::sendData - Envoie des données pour une tâche (obsolète)
    • GearmanTask::sendWorkload - Envoie les données pour une tâche
    • GearmanTask::taskDenominator - Récupère le dénominateur du taux de réalisation
    • GearmanTask::taskNumerator - Récupère le numérateur du taux de réalisation
    • GearmanTask::unique - Récupère l'identifiant unique de la tâche
    • GearmanTask::uuid - Récupère l'identifiant unique pour une tâche (obsolète)
    • GearmanTask::__construct - Crée une instance GearmanTask
    • GearmanWorker::addFunction - Enregistre et ajoute une fonction de rappel
    • GearmanWorker::addOptions - Ajout des options à l'agent
    • GearmanWorker::addServer - Ajoute un serveur de travaux
    • GearmanWorker::addServers - Ajoute plusieurs serveurs de travaux
    • GearmanWorker::clone - Crée une copie d'un agent
    • GearmanWorker::echo - Test la réponse d'un serveur de travaux
    • GearmanWorker::error - Récupère la dernière erreur survenue
    • GearmanWorker::getErrno - Récupère la errno
    • GearmanWorker::options - Récupère les options de l'agent
    • GearmanWorker::register - Enregistre une fonction sur un serveur de travaux
    • GearmanWorker::removeOptions - Supprime des options de l'agent
    • GearmanWorker::returnCode - Récupère le dernier code Gearman retourné
    • GearmanWorker::setId - Définit un identifiant au worker
    • GearmanWorker::setOptions - Définit les options de l'agent
    • GearmanWorker::setTimeout - Définit le délai d'attente maximal d'activité du socket I/O
    • GearmanWorker::timeout - Récupère le délai d'attente de l'activité du socket I/O
    • GearmanWorker::unregister - Supprime une fonction des serveurs de travaux
    • GearmanWorker::unregisterAll - Supprime toutes les fonctions des serveurs de travaux
    • GearmanWorker::wait - Attente une activité d'un ou plusieurs serveurs de travaux
    • GearmanWorker::work - Attend et exécute un travail
    • GearmanWorker::__construct - Crée une instance GearmanWorker
    • Gender\Gender::connect - Connexion à un dictionnaire externe
    • Gender\Gender::country - Récupère la représentation textuelle d'un pays
    • Gender\Gender::get - Récupère le sexe d'un prénom
    • Gender\Gender::isNick - Vérifie si name0 est un alias de name1
    • Gender\Gender::similarNames - Récupère des noms similaires
    • Gender\Gender::__construct - Construit un objet Gender
    • Generator::current - Récupère la valeur cédée
    • Generator::getReturn - Obtenir la valeur de retour d'un générateur
    • Generator::key - Récupère la clé cédée
    • Generator::next - Reprend l'exécution du générateur
    • Generator::rewind - Ré-initialise l'itérateur
    • Generator::send - Envoi une valeur au générateur
    • Generator::throw - Lance une exception dans le générateur
    • Generator::valid - Vérifie si l'itérateur a été fermé
    • Generator::__wakeup - Fonction de rappel de linéarisation
    • geoip_asnum_by_name - Récupère l'ASN (Autonomous System Numbers)
    • geoip_continent_code_by_name - Lit de code de continent d'une IP
    • geoip_country_code3_by_name - Récupère les trois lettres du code pays
    • geoip_country_code_by_name - Récupère les deux lettres du code pays
    • geoip_country_name_by_name - Récupère le nom complet du pays
    • geoip_database_info - Récupère les informations de la base de données GeoIP
    • geoip_db_avail - Vérifie si la base de données GeoIP est disponible
    • geoip_db_filename - Retourne le nom du fichier contenant la base de données GeoIP spécifiée
    • geoip_db_get_all_info - Retourne des informations détaillées sur tous les types de bases de données GeoIP
    • geoip_domain_by_name - Récupère le second niveau du nom de domaine
    • geoip_id_by_name - Récupère le type de la connexion Internet
    • geoip_isp_by_name - Récupère le nom du fournisseur d'accès
    • geoip_netspeedcell_by_name - Récupère la vitesse de la connexion Internet
    • geoip_org_by_name - Récupère le nom de l'organisation
    • geoip_record_by_name - Récupère les informations enregistrées correspondant au nom de l'hôte ou à l'adresse IP, trouvées dans la base de données GeoIP
    • geoip_region_by_name - Récupère le code pays et la région
    • geoip_region_name_by_code - Retourne le nom de la région pour un pays et un code de région
    • geoip_setup_custom_directory - Défini un dossier personnalisé pour la base de données GeoIP
    • geoip_time_zone_by_country_and_region - Retourne le fuseau horaire de certains pays et région du globe
    • getallheaders - Récupère tous les en-têtes de la requête HTTP
    • getcwd - Retourne le dossier de travail courant
    • getdate - Retourne la date/heure
    • getenv - Retourne la valeur d'une variable d'environnement
    • gethostbyaddr - Retourne le nom d'hôte correspondant à une IP
    • gethostbyname - Retourne l'adresse IPv4 correspondant à un hôte
    • gethostbynamel - Retourne la liste d'IPv4 correspondante à un hôte
    • gethostname - Lit le nom de l'hôte
    • getimagesize - Retourne la taille d'une image
    • getimagesizefromstring - Récupère la taille d'une image depuis une chaîne
    • getlastmod - Retourne la date de dernière modification de la page
    • getmxrr - Retourne les enregistrements MX d'un hôte
    • getmygid - Retourne le GID du propriétaire du script
    • getmyinode - Retourne l'inode du script
    • getmypid - Retourne le numéro de processus courant de PHP
    • getmyuid - Retourne l'UID du propriétaire du script actuel
    • getopt - Lit des options passées dans la ligne de commande
    • getprotobyname - Retourne le numéro de protocole associé à un nom de protocole
    • getprotobynumber - Retourne le nom de protocole associé à un numéro de protocole
    • getrandmax - Plus grande valeur aléatoire possible
    • getrusage - Retourne le niveau d'utilisation des ressources
    • getservbyname - Retourne le numéro de port associé à un service Internet et un protocole
    • getservbyport - Retourne le service Internet qui correspond au port et protocole
    • getSession - Connect to a MySQL server
    • gettext - Recherche un message dans le domaine courant
    • gettimeofday - Retourne l'heure actuelle
    • gettype - Retourne le type de la variable
    • get_browser - Indique les capacités du navigateur client
    • get_called_class - Le nom de la classe en "Late Static Binding"
    • get_cfg_var - Retourne la valeur d'une option de PHP
    • get_class - Retourne le nom de la classe d'un objet
    • get_class_methods - Retourne les noms des méthodes d'une classe
    • get_class_vars - Retourne les valeurs par défaut des propriétés d'une classe
    • get_current_user - Retourne le nom du possesseur du script courant
    • get_declared_classes - Liste toutes les classes définies dans PHP
    • get_declared_interfaces - Retourne un tableau avec toutes les interfaces déclarées
    • get_declared_traits - Retourne un tableau contenant tous les traits déclarés
    • get_defined_constants - Retourne la liste des constantes et leurs valeurs
    • get_defined_functions - Liste toutes les fonctions définies
    • get_defined_vars - Liste toutes les variables définies
    • get_extension_funcs - Liste les fonctions d'une extension
    • get_headers - Retourne tous les en-têtes envoyés par le serveur en réponse à une requête HTTP
    • get_html_translation_table - Retourne la table de traduction des entités utilisée par htmlspecialchars et htmlentities
    • get_included_files - Retourne un tableau avec les noms des fichiers qui sont inclus dans un script
    • get_include_path - Lit la valeur de la directive de configuration include_path
    • get_loaded_extensions - Retourne la liste de tous les modules compilés et chargés
    • get_magic_quotes_gpc - Retourne la configuration actuelle de l'option magic_quotes_gpc
    • get_magic_quotes_runtime - Retourne la configuration actuelle de l'option magic_quotes_runtime
    • get_meta_tags - Extrait toutes les balises méta d'un fichier HTML
    • get_object_vars - Retourne les propriétés d'un objet
    • get_parent_class - Retourne le nom de la classe parente d'un objet
    • get_required_files - Alias de get_included_files
    • get_resources - Retourne les ressources active
    • get_resource_id - Retourne un entier identifiant une ressource
    • get_resource_type - Retourne le type de ressource
    • glob - Recherche des chemins qui vérifient un masque
    • glob:// - Trouve des noms de fichiers correspondant à un masque donné
    • GlobIterator::count - Lit le nombre de dossiers et fichiers
    • GlobIterator::__construct - Construit un itérateur de type glob
    • Gmagick::addimage - Ajoute une nouvelle image à la liste des images de l'objet Gmagick
    • Gmagick::addnoiseimage - Ajoute du bruit aléatoirement dans l'image
    • Gmagick::annotateimage - Annote une image avec du texte
    • Gmagick::blurimage - Ajoute un filtre flou à l'image
    • Gmagick::borderimage - Ajoute une bordure à l'image
    • Gmagick::charcoalimage - Simule un dessin au fusain
    • Gmagick::chopimage - Supprime une région de l'image
    • Gmagick::clear - Efface toutes les ressources associées à l'objet Gmagick
    • Gmagick::commentimage - Ajoute un commentaire à l'image
    • Gmagick::compositeimage - Assemble 2 images
    • Gmagick::cropimage - Extrait une portion d'une image
    • Gmagick::cropthumbnailimage - Crée une miniature recadrée
    • Gmagick::current - Le contexte courante
    • Gmagick::cyclecolormapimage - Déplace la carte des couleurs d'une image
    • Gmagick::deconstructimages - Retourne les pixels différents entre des images
    • Gmagick::despeckleimage - Le but de despeckleimage
    • Gmagick::destroy - Le but de la méthode destroy
    • Gmagick::drawimage - Envoi l'objet GmagickDraw dans l'image courante
    • Gmagick::edgeimage - Améliore les bords intérieurs de l'image
    • Gmagick::embossimage - Retourne une image en niveau de gris avec un effet à 3 dimensions
    • Gmagick::enhanceimage - Améliore la qualité d'une image contenant du bruit
    • Gmagick::equalizeimage - Égalise l'histogramme de l'image
    • Gmagick::flipimage - Crée une image miroir verticale
    • Gmagick::flopimage - Le but de la méthode flopimage
    • Gmagick::frameimage - Ajoute une bordure afin de simuler un effet 3D
    • Gmagick::gammaimage - Corrige le gamma d'une image
    • Gmagick::getcopyright - Retourne le copyright de l'API GraphicsMagick
    • Gmagick::getfilename - Retourne le nom du fichier associé avec une séquence d'image
    • Gmagick::getimagebackgroundcolor - Retourne la couleur d'arrière plan de l'image
    • Gmagick::getimageblueprimary - Retourne le point bleu primaire chromatique
    • Gmagick::getimagebordercolor - Retourne la couleur du bord de l'image
    • Gmagick::getimagechanneldepth - Récupère la profondeur d'un canal particulier de l'image
    • Gmagick::getimagecolors - Retourne la couleur de l'indice de la carte des couleurs spécifiée
    • Gmagick::getimagecolorspace - Récupère l'espace colorimétrique de l'image
    • Gmagick::getimagecompose - Retourne l'opérateur de composition associé avec l'image
    • Gmagick::getimagedelay - Récupère le délai de l'image
    • Gmagick::getimagedepth - Récupère la profondeur de l'image
    • Gmagick::getimagedispose - Récupère la méthode de disposition de l'image
    • Gmagick::getimageextrema - Récupère les extrémités de l'image
    • Gmagick::getimagefilename - Récupère le nom du fichier d'une image particulière dans une séquence
    • Gmagick::getimageformat - Récupère le format d'une image particulière dans une séquence
    • Gmagick::getimagegamma - Récupère le gamma de l'image
    • Gmagick::getimagegreenprimary - Récupère le point chromatique primaire vert
    • Gmagick::getimageheight - Récupère la hauteur de l'image
    • Gmagick::getimagehistogram - Récupère l'histogramme de l'image
    • Gmagick::getimageindex - Récupère l'indice de l'image active courante
    • Gmagick::getimageinterlacescheme - Récupère le schéma d'entrelacement de l'image
    • Gmagick::getimageiterations - Récupère les itérations de l'image
    • Gmagick::getimagematte - Vérifie si l'image a un canal mate
    • Gmagick::getimagemattecolor - Récupère la couleur mate de l'image
    • Gmagick::getimageprofile - Récupère le nom du profile de l'image
    • Gmagick::getimageredprimary - Récupère le point chromatique primaire rouge
    • Gmagick::getimagerenderingintent - Récupère l'image de rendu
    • Gmagick::getimageresolution - Récupère la résolution de l'image
    • Gmagick::getimagescene - Récupère la scène de l'image
    • Gmagick::getimagesignature - Génère la signature SHA-256 de l'image
    • Gmagick::getimagetype - Récupère le type potentiel d'une image
    • Gmagick::getimageunits - Récupère les unités utilisées pour la résolution de l'image
    • Gmagick::getimagewhitepoint - Récupère le point chromatique blanc
    • Gmagick::getimagewidth - Récupère la largeur de l'image
    • Gmagick::getpackagename - Récupère le nom du paquet GraphicsMagick
    • Gmagick::getquantumdepth - Récupère la profondeur du quantum Gmagick
    • Gmagick::getreleasedate - Récupère la date de sortie de la version courante de GraphicsMagick
    • Gmagick::getsamplingfactors - Récupère le facteur d'échantillonnage horizontal et vertical
    • Gmagick::getsize - Récupère la taille associée avec l'objet Gmagick
    • Gmagick::getversion - Récupère la version de l'API GraphicsMagick
    • Gmagick::hasnextimage - Vérifie si l'objet contient au moins une autre image
    • Gmagick::haspreviousimage - Vérifie si l'objet contient une image précédente
    • Gmagick::implodeimage - Crée une image à partir d'une copie
    • Gmagick::labelimage - Ajoute un libellé à une image
    • Gmagick::levelimage - Ajuste les niveaux d'une image
    • Gmagick::magnifyimage - Retaille par 2 une image en conservant les proportions
    • Gmagick::mapimage - Remplace les couleurs d'une image avec les couleurs les plus proches d'une image de référence
    • Gmagick::medianfilterimage - Applique un filtre digital
    • Gmagick::minifyimage - Réduit une image de moitié en gardant les proportions
    • Gmagick::modulateimage - Contrôle la luminosité, la saturation et la teinte
    • Gmagick::motionblurimage - Simule un flou cinétique
    • Gmagick::newimage - Crée une nouvelle image
    • Gmagick::nextimage - Se déplace sur l'image suivante
    • Gmagick::normalizeimage - Améliore le contraste de la couleur de l'image
    • Gmagick::oilpaintimage - Simule une peinture à l'huile
    • Gmagick::previousimage - Se déplace vers l'image précédente de l'objet
    • Gmagick::profileimage - Ajoute ou supprime un profile d'une image
    • Gmagick::quantizeimage - Analyse les couleurs d'une image de référence
    • Gmagick::quantizeimages - Le but de quantizeimages
    • Gmagick::queryfontmetrics - Retourne un tableau représentant la métrique pour la police de caractères
    • Gmagick::queryfonts - Retourne les polices de caractères configurées
    • Gmagick::queryformats - Retourne les formats supportés par Gmagick
    • Gmagick::radialblurimage - Brouille une image suivant un rayon
    • Gmagick::raiseimage - Crée un un bouton avec un effet 3D
    • Gmagick::read - Lit une image depuis un fichier
    • Gmagick::readimage - Lit une image depuis un fichier
    • Gmagick::readimageblob - Lit une image depuis une chaîne binaire
    • Gmagick::readimagefile - Le but de readimagefile
    • Gmagick::reducenoiseimage - Lisse les contours de l'image
    • Gmagick::removeimage - Supprime une image depuis la liste des images
    • Gmagick::removeimageprofile - Supprime un profil nommé de l'image
    • Gmagick::resampleimage - Échantillonne l'image à la résolution désirée
    • Gmagick::resizeimage - Redimensionne une image
    • Gmagick::rollimage - Repositionne une image
    • Gmagick::rotateimage - Effectue une rotation de l'image
    • Gmagick::scaleimage - Met à l'échelle une image
    • Gmagick::separateimagechannel - Sépare un canal depuis une image
    • Gmagick::setCompressionQuality - Définit la qualité de compression par défaut de l'objet
    • Gmagick::setfilename - Définit le nom de fichier avant la lecture ou l'écriture d'une image
    • Gmagick::setimagebackgroundcolor - Définit la couleur d'arrière-plan de l'image
    • Gmagick::setimageblueprimary - Définit le point bleu primaire de l'image chromatique
    • Gmagick::setimagebordercolor - Définit la couleur de la bordure de l'image
    • Gmagick::setimagechanneldepth - Définit la profondeur d'un canal particulier de l'image
    • Gmagick::setimagecolorspace - Définit l'espace de couleurs de l'image
    • Gmagick::setimagecompose - Définit l'opérateur de composition de l'image
    • Gmagick::setimagedelay - Définit le délai de l'image
    • Gmagick::setimagedepth - Définit la profondeur de l'image
    • Gmagick::setimagedispose - Définit la méthode de disposition de l'image
    • Gmagick::setimagefilename - Définit le nom du fichier pour une image particulière d'une séquence
    • Gmagick::setimageformat - Définit le format d'une image
    • Gmagick::setimagegamma - Définit le gamma de l'image
    • Gmagick::setimagegreenprimary - Définit le point vert sur l'image chromatique primaire
    • Gmagick::setimageindex - Définit l'itérateur à la position spécifiée dans l'image de la liste pointée par son index
    • Gmagick::setimageinterlacescheme - Définit le schéma d'entrelacement de l'image
    • Gmagick::setimageiterations - Définit les itérations de l'image
    • Gmagick::setimageprofile - Ajoute un profile nommé à l'objet Gmagick
    • Gmagick::setimageredprimary - Définit le point rouge sur l'image chromatique primaire
    • Gmagick::setimagerenderingintent - Définit l'image de rendu
    • Gmagick::setimageresolution - Définit la résolution de l'image
    • Gmagick::setimagescene - Définit l'image de scène
    • Gmagick::setimagetype - Définit le type de l'image
    • Gmagick::setimageunits - Définit les unités à utiliser pour la résolution de l'image
    • Gmagick::setimagewhitepoint - Définit le point blanc sur l'image chromatique primaire
    • Gmagick::setsamplingfactors - Définit les facteurs d'échantillonnage de l'image
    • Gmagick::setsize - Définit la taille de l'objet Gmagick
    • Gmagick::shearimage - Crée un parallélogramme
    • Gmagick::solarizeimage - Applique un effet de solarisation à l'image
    • Gmagick::spreadimage - Déplace aléatoirement chaque pixel d'un bloc
    • Gmagick::stripimage - Supprime d'une image tous les profiles et tous les commentaires
    • Gmagick::swirlimage - Remous les pixels du centre de l'image
    • Gmagick::thumbnailimage - Modifie la taille d'une image
    • Gmagick::trimimage - Supprime les coins de l'image
    • Gmagick::write - Alias de Gmagick::writeimage
    • Gmagick::writeimage - Écrit une image dans un fichier
    • Gmagick::__construct - Le constructeur Gmagick
    • GmagickDraw::annotate - Dessine un texte sur l'image
    • GmagickDraw::arc - Dessine un arc
    • GmagickDraw::bezier - Dessine une courbe de Bézier
    • GmagickDraw::ellipse - Dessine une ellipse sur l'image
    • GmagickDraw::getfillcolor - Retourne la couleur de remplissage
    • GmagickDraw::getfillopacity - Retourne l'opacité utilisée lors d'un dessin
    • GmagickDraw::getfont - Retourne la police de caractères
    • GmagickDraw::getfontsize - Retourne la taille du point d'une police de caractères
    • GmagickDraw::getfontstyle - Retourne le style de la police de caractères
    • GmagickDraw::getfontweight - Retourne le poids de la police de caractères
    • GmagickDraw::getstrokecolor - Retourne la couleur utilisée pour tracer les contours de l'objet
    • GmagickDraw::getstrokeopacity - Retourne l'opacité du tracé des contours de l'objet
    • GmagickDraw::getstrokewidth - Retourne la largeur utilisée pour les contours de l'objet
    • GmagickDraw::gettextdecoration - Retourne la décoration du texte
    • GmagickDraw::gettextencoding - Retourne le code du jeu de caractères à utiliser pour les annotations
    • GmagickDraw::line - Le but de la méthode line
    • GmagickDraw::point - Dessine un point
    • GmagickDraw::polygon - Dessine un polygone
    • GmagickDraw::polyline - Dessine une polyligne
    • GmagickDraw::rectangle - Dessine un rectangle
    • GmagickDraw::rotate - Applique une rotation
    • GmagickDraw::roundrectangle - Dessine un rectangle arrondi
    • GmagickDraw::scale - Ajuste le facteur d'échelle
    • GmagickDraw::setfillcolor - Définit la couleur de remplissage à utiliser pour dessiner des objets pleins
    • GmagickDraw::setfillopacity - Le but de la méthode setfillopacity
    • GmagickDraw::setfont - Définit la police de caractère à utiliser lors d'une annotation
    • GmagickDraw::setfontsize - Définit la taille, en points, de la police de caractère utilisée lors d'une annotation
    • GmagickDraw::setfontstyle - Définit le style de police de caractères à utiliser lors d'une annotation
    • GmagickDraw::setfontweight - Définit le poids de la police de caractères
    • GmagickDraw::setstrokecolor - Définit la couleur à utiliser pour tracer les contours de l'objet
    • GmagickDraw::setstrokeopacity - Spécifie l'opacité pour les contours de l'objet
    • GmagickDraw::setstrokewidth - Définit la largeur des contours de l'objet
    • GmagickDraw::settextdecoration - Spécifie une décoration
    • GmagickDraw::settextencoding - Spécifie le code du jeu de caractères à utiliser
    • GmagickPixel::getcolor - Retourne la couleur
    • GmagickPixel::getcolorcount - Retourne le nombre de couleurs associées avec cette couleur
    • GmagickPixel::getcolorvalue - Récupère la valeur normalisée du canal de la couleur fournie
    • GmagickPixel::setcolor - Définit la couleur
    • GmagickPixel::setcolorvalue - Définit la valeur normalisée d'un des canaux
    • GmagickPixel::__construct - Le constructeur GmagickPixel
    • gmdate - Formate une date/heure GMT/CUT
    • gmmktime - Retourne le timestamp UNIX d'une date GMT
    • gmp_abs - Valeur absolue GMP
    • gmp_add - Addition de 2 nombres GMP
    • gmp_and - ET logique
    • gmp_binomial - Calcul le coefficient binomial
    • gmp_clrbit - Annule un octet
    • gmp_cmp - Compare des nombres GMP
    • gmp_com - Calcule le complémentaire d'un nombre
    • gmp_div - Alias de gmp_div_q
    • gmp_divexact - Division exacte de nombres GMP
    • gmp_div_q - Divisions de 2 nombres GMP
    • gmp_div_qr - Divise deux nombres GMP
    • gmp_div_r - Reste de la division de deux nombres GMP
    • gmp_export - Exportation vers une chaîne binaire
    • gmp_fact - Factorielle GMP
    • gmp_gcd - Calcule le PGCD
    • gmp_gcdext - PGCD étendu
    • gmp_hamdist - Distance de Hamming
    • gmp_import - Importation depuis une chaîne binaire
    • gmp_init - Crée un nombre GMP
    • gmp_intval - Convertit un nombre GMP en entier
    • gmp_invert - Modulo inversé
    • gmp_jacobi - Symbole de Jacobi
    • gmp_kronecker - Symbole Kronecker
    • gmp_lcm - Calcul le PPCM
    • gmp_legendre - Symbole de Legendre
    • gmp_mod - Modulo GMP
    • gmp_mul - Multiplication de 2 nombres GMP
    • gmp_neg - Opposé de nombre GMP
    • gmp_nextprime - Trouve le prochain nombre premier
    • gmp_or - OU logique
    • gmp_perfect_power - Vérifie si un nombre est une puissance parfaite
    • gmp_perfect_square - Carré parfait GMP
    • gmp_popcount - Comptage de population
    • gmp_pow - Puissance
    • gmp_powm - Puissance et modulo
    • gmp_prob_prime - Nombre GMP probablement premier
    • gmp_random - Nombre GMP aléatoire
    • gmp_random_bits - Génère un nombre aléatoire
    • gmp_random_range - Génère un nombre aléatoire
    • gmp_random_seed - Définit la graine RNG (Générateur de Nombres Aléatoire)
    • gmp_root - Récupère la partie entière de la n-ème racine
    • gmp_rootrem - Récupère la partie entière et le reste de la n-ème racine
    • gmp_scan0 - Recherche 0
    • gmp_scan1 - Recherche 1
    • gmp_setbit - Modifie un bit
    • gmp_sign - Signe du nombre GMP
    • gmp_sqrt - Racine carrée GMP
    • gmp_sqrtrem - Racine carrée avec reste GMP
    • gmp_strval - Convertit un nombre GMP en chaîne
    • gmp_sub - Soustraction de 2 nombres GMP
    • gmp_testbit - Teste si un octet est défini
    • gmp_xor - OU exclusif logique
    • gmstrftime - Formate une date/heure GMT/CUT en fonction de la configuration locale
    • gnupg_adddecryptkey - Ajoute une clé pour déchiffrement
    • gnupg_addencryptkey - Ajoute une clé pour chiffrement
    • gnupg_addsignkey - Ajoute une clé pour signer
    • gnupg_cleardecryptkeys - Supprime toutes les clés qui étaient fixées pour déchiffrement auparavant
    • gnupg_clearencryptkeys - Supprime toutes les clés qui étaient fixées pour chiffrement auparavant
    • gnupg_clearsignkeys - Supprime toutes les clés qui étaient fixées pour signature auparavant
    • gnupg_decrypt - Déchiffre un texte donné
    • gnupg_decryptverify - Déchiffre et vérifie un texte donné
    • gnupg_encrypt - Chiffre un texte donné
    • gnupg_encryptsign - Chiffre et signe un texte donné
    • gnupg_export - Exporte une clé
    • gnupg_geterror - Retourne le texte d'erreur, si une fonction échoue
    • gnupg_getprotocol - Retourne le protocole actif courant pour toutes les opérations
    • gnupg_import - Importe une clé
    • gnupg_init - Initialise une connexion
    • gnupg_keyinfo - Retourne un tableau avec les informations à propos de toutes les clés qui correspondent au motif donné
    • gnupg_setarmor - Change la sortie blindée
    • gnupg_seterrormode - Fixe le mode pour error_reporting
    • gnupg_setsignmode - Fixe le mode pour signer
    • gnupg_sign - Signe un texte donné
    • gnupg_verify - Vérifie un texte signé
    • grapheme_extract - Extrait un groupe de graphème d'une chaîne UTF-8
    • grapheme_stripos - Trouve la position en graphème de la première occurrence dans une chaîne, insensible à la casse
    • grapheme_stristr - Retourne la partie d'une chaîne à partir d'une occurrence
    • grapheme_strlen - Lit la taille d'une chaîne en nombre de graphème
    • grapheme_strpos - Trouve la position du premier graphème
    • grapheme_strripos - Trouve la position du dernier graphème, insensible à la casse
    • grapheme_strrpos - Trouve la position du dernier graphème
    • grapheme_strstr - Retourne la partie d'une chaîne à partir d'une occurrence, insensible à la casse
    • grapheme_substr - Retourne une partie d'une chaîne
    • gregoriantojd - Convertit une date grégorienne en nombre de jours du calendrier Julien
    • gzclose - Ferme un pointeur sur un fichier gz ouvert
    • gzcompress - Compresse une chaîne
    • gzdecode - Décode une chaîne de caractères compressée gzip
    • gzdeflate - Compresse une chaîne
    • gzencode - Crée une chaîne compressée gzip
    • gzeof - Indique si la fin d'un fichier (EOF) compressé est atteinte
    • gzfile - Lit la totalité d'un fichier compressé
    • gzgetc - Lit un caractère dans un fichier compressé
    • gzgets - Lit une ligne dans un fichier compressé
    • gzgetss - Lit une ligne dans un fichier compressé, et supprime les balises HTML
    • gzinflate - Décompresse une chaîne
    • gzopen - Ouvre un fichier compressé avec gzip
    • gzpassthru - Affiche toutes les données qui restent dans un pointeur gz
    • gzputs - Alias de gzwrite
    • gzread - Lecture de fichier compressé binaire
    • gzrewind - Replace le pointeur au début du fichier
    • gzseek - Déplace le pointeur de lecture
    • gztell - Lit la position courante du pointeur de lecture
    • gzuncompress - Décompresse une chaîne compressée
    • gzwrite - Écrit dans un fichier compressé gzip
  • h
    • hash - Génère une valeur de hachage (empreinte numérique)
    • HashContext::__construct - Constructeur privée pour interdire l'instanciation directe
    • hash_algos - Retourne une liste des algorithmes de hachage enregistrés
    • hash_copy - Copie un contexte de hachage
    • hash_equals - Comparaison de chaînes résistante aux attaques temporelles
    • hash_file - Génère une valeur de hachage en utilisant le contenu d'un fichier donné
    • hash_final - Finalise un hachage incrémental et retourne le résultat de l'empreinte numérique
    • hash_hkdf - Génère une dérivation de clé HKDF depuis une clé fournie
    • hash_hmac - Génère une valeur de clé de hachage en utilisant la méthode HMAC
    • hash_hmac_algos - Return a list of registered hashing algorithms suitable for hash_hmac
    • hash_hmac_file - Génère une valeur de clé de hachage en utilisant la méthode HMAC et le contenu d'un fichier donné
    • hash_init - Initialise un contexte de hachage incrémental
    • hash_pbkdf2 - Génère une clé PBKDF2 dérivée du mot de passe fourni
    • hash_update - Ajoute des données dans le contexte de hachage actif
    • hash_update_file - Ajoute des données dans un contexte de hachage actif provenant d'un fichier
    • hash_update_stream - Ajoute des données dans un contexte de hachage actif d'un flux ouvert
    • header - Envoie un en-tête HTTP brut
    • headers_list - Retourne la liste des en-têtes de réponse du script courant
    • headers_sent - Indique si les en-têtes HTTP ont déjà été envoyés
    • header_register_callback - Enregistre une fonction de rappel pour l'envoi des en-têtes
    • header_remove - Supprime un en-tête HTTP
    • hebrev - Convertit un texte logique hébreux en texte visuel
    • hebrevc - Convertit un texte logique hébreux en texte visuel, avec retours à la ligne
    • hex2bin - Convertit une chaîne binaire encodée en hexadécimal
    • hexdec - Convertit de hexadécimal en décimal
    • highlight_file - Colorisation syntaxique d'un fichier
    • highlight_string - Applique la syntaxe colorisée à du code PHP
    • hrtime - Get the system's high resolution time
    • HRTime\PerformanceCounter::getFrequency - Fréquence du timer en ticks par seconde
    • HRTime\PerformanceCounter::getTicks - Ticks courrant depuis le système
    • HRTime\PerformanceCounter::getTicksSince - Ticks écoulés depuis la valeur fournie
    • HRTime\StopWatch::getElapsedTicks - Récupère les ticks écoulés pour toutes les intervalles
    • HRTime\StopWatch::getElapsedTime - Récupère le temps écoulé pour tous les intervalles
    • HRTime\StopWatch::getLastElapsedTicks - Récupère les ticks écoulés pour la dernière intervalle
    • HRTime\StopWatch::getLastElapsedTime - Récupère le temps écoulé pour la dernière intervalle
    • HRTime\StopWatch::isRunning - Vérifie si la mesure du temps est en cours
    • HRTime\StopWatch::start - Démarre la mesure du temps
    • HRTime\StopWatch::stop - Arrête la mesure du temps
    • htmlentities - Convertit tous les caractères éligibles en entités HTML
    • htmlspecialchars - Convertit les caractères spéciaux en entités HTML
    • htmlspecialchars_decode - Convertit les entités HTML spéciales en caractères
    • html_entity_decode - Convertit les entités HTML à leurs caractères correspondant
    • http:// - Accès aux URLs HTTP(s)
    • http_build_query - Génère une chaîne de requête en encodage URL
    • http_response_code - Récupère ou définit le code de réponse HTTP
    • hypot - Calcul la longueur de l'hypoténuse d'un triangle à angle droit
  • i
    • ibase_add_user - Ajoute un utilisateur à une base de données de sécurité
    • ibase_affected_rows - Retourne le nombre de lignes affectées par la dernière requête iBase
    • ibase_backup - Lance une tâche de sauvegarde dans le gestionnaire de services et retourne immédiatement
    • ibase_blob_add - Ajoute des données dans un BLOB iBase fraîchement créé
    • ibase_blob_cancel - Annule la création d'un BLOB iBase
    • ibase_blob_close - Ferme un BLOB iBase
    • ibase_blob_create - Crée un BLOB iBase pour ajouter des données
    • ibase_blob_echo - Affiche le contenu d'un BLOB iBase au navigateur
    • ibase_blob_get - Lit len octets de données dans un BLOB iBase ouvert
    • ibase_blob_import - Crée un BLOB iBase, y copie un fichier et le referme
    • ibase_blob_info - Retourne la taille d'un BLOB iBase et d'autres informations utiles
    • ibase_blob_open - Ouvre un BLOB iBase pour récupérer des parties de données
    • ibase_close - Ferme une connexion à une base de données Interbase
    • ibase_commit - Valide une transaction iBase
    • ibase_commit_ret - Valide une transaction iBase sans la refermer
    • ibase_connect - Ouvre une connexion à une base de données
    • ibase_db_info - Demande des statistiques sur une base de données Interbase
    • ibase_delete_user - Efface un utilisateur d'une base de données de sécurité
    • ibase_drop_db - Supprime une base de données iBase
    • ibase_errcode - Retourne le code d'erreur iBase
    • ibase_errmsg - Retourne un message d'erreur
    • ibase_execute - Exécute une requête iBase préparée
    • ibase_fetch_assoc - Récupère une ligne du résultat d'une requête dans un tableau associatif
    • ibase_fetch_object - Lit une ligne dans une base Interbase dans un objet
    • ibase_fetch_row - Lit une ligne d'une base Interbase
    • ibase_field_info - Lit les informations sur un champ iBase
    • ibase_free_event_handler - Libère un gestionnaire d'événements iBase
    • ibase_free_query - Libère la mémoire réservée par une requête préparée
    • ibase_free_result - Libère un résultat iBase
    • ibase_gen_id - Incrémente le générateur donné et retourne sa nouvelle valeur
    • ibase_maintain_db - Exécute une commande de maintenance sur une base de données Interbase
    • ibase_modify_user - Modifie un utilisateur dans une base de données de sécurité
    • ibase_name_result - Assigne un nom à un jeu de résultats iBase
    • ibase_num_fields - Retourne le nombre de colonnes dans un résultat iBase
    • ibase_num_params - Retourne le nombre de paramètres dans une requête préparée iBase
    • ibase_param_info - Retourne des informations à propos d'un paramètre dans une requête préparée iBase
    • ibase_pconnect - Ouvre une connexion persistante à une base de données InterBase
    • ibase_prepare - Prépare une requête iBase pour lier les paramètres et l'exécuter ultérieurement
    • ibase_query - Exécute une requête sur une base iBase
    • ibase_restore - Lance une tâche de restauration dans le gestionnaire de services et retourne immédiatement
    • ibase_rollback - Annule une transaction interBase
    • ibase_rollback_ret - Annule une transaction sans la fermer
    • ibase_server_info - Sollicite des informations à propos d'un serveur de base de donnée
    • ibase_service_attach - Connexion au gestionnaire de service
    • ibase_service_detach - Déconnexion du gestionnaire de service
    • ibase_set_event_handler - Enregistre une fonction de rappel sur un événement interBase
    • ibase_trans - Prépare une transaction interBase
    • ibase_wait_event - Attend un événement interBase
    • iconv - Convertit une chaîne dans un jeu de caractères
    • iconv_get_encoding - Lit le jeu de caractères courant
    • iconv_mime_decode - Décode un champ d’en-tête MIME
    • iconv_mime_decode_headers - Décode des en-têtes MIME multiples
    • iconv_mime_encode - Construit un en-tête MIME avec les champs field_name et field_value
    • iconv_set_encoding - Modifie le jeu courant de caractères d'encodage
    • iconv_strlen - Retourne le nombre de caractères d'une chaîne
    • iconv_strpos - Trouve la position de la première occurrence d'une chaîne dans une autre
    • iconv_strrpos - Trouve la position de la dernière occurrence d'un élément dans une chaîne
    • iconv_substr - Coupe une partie de chaîne
    • idate - Formate une date/heure locale en tant qu'entier
    • idn_to_ascii - Convertit un nom de domaine au format IDNA ASCII
    • idn_to_utf8 - Convertit le nom de domaine IDNA ASCII en Unicode
    • ignore_user_abort - Active l'interruption de script sur déconnexion du visiteur
    • image2wbmp - Affichage de l'image vers le navigateur ou dans un fichier
    • imageaffine - Retourne une image contenant l'image source transformée, en utilisant optionnellement une zone de découpe
    • imageaffinematrixconcat - Concatène deux matrices de transformation affine
    • imageaffinematrixget - Obtenir une matrice de transformation affine
    • imagealphablending - Modifie le mode de blending d'une image
    • imageantialias - Utiliser ou non les fonctions d'antialias
    • imagearc - Dessine une ellipse partielle
    • imagebmp - Affiche ou enregistre une image BMP au navigateur ou dans un fichier
    • imagechar - Dessine un caractère horizontalement
    • imagecharup - Dessine un caractère verticalement
    • imagecolorallocate - Alloue une couleur pour une image
    • imagecolorallocatealpha - Alloue une couleur à une image
    • imagecolorat - Retourne l'index de la couleur d'un pixel donné
    • imagecolorclosest - Retourne l'index de la couleur la plus proche d'une couleur donnée
    • imagecolorclosestalpha - Retourne la couleur la plus proche, en tenant compte du canal alpha
    • imagecolorclosesthwb - Lit l'index de la couleur spécifiée avec sa teinte, blanc et noir
    • imagecolordeallocate - Supprime une couleur d'une image
    • imagecolorexact - Retourne l'index de la couleur donnée
    • imagecolorexactalpha - Retourne l'index d'une couleur avec son canal alpha
    • imagecolormatch - Fait correspondre un peu plus les couleurs de la version palette d'une image aux couleurs de sa version truecolor
    • imagecolorresolve - Retourne l'index de la couleur donnée, ou la plus proche possible
    • imagecolorresolvealpha - Retourne un index de couleur ou son alternative la plus proche, y compris le canal alpha
    • imagecolorset - Change la couleur dans une palette à l'index donné
    • imagecolorsforindex - Retourne la couleur associée à un index
    • imagecolorstotal - Calcule le nombre de couleurs d'une palette
    • imagecolortransparent - Définit la couleur transparente
    • imageconvolution - Applique une matrice de la convolution 3x3, en utilisant le coefficient et l'excentrage
    • imagecopy - Copie une partie d'une image
    • imagecopymerge - Copie et fusionne une partie d'une image
    • imagecopymergegray - Copie et fusionne une partie d'une image en niveaux de gris
    • imagecopyresampled - Copie, redimensionne, rééchantillonne une image
    • imagecopyresized - Copie et redimensionne une partie d'une image
    • imagecreate - Crée une nouvelle image à palette
    • imagecreatefrombmp - Crée une nouvelle image depuis un fichier ou une URL
    • imagecreatefromgd - Crée une nouvelle image à partir d'un fichier GD ou d'une URL
    • imagecreatefromgd2 - Crée une nouvelle image à partir d'un fichier GD2 ou d'une URL
    • imagecreatefromgd2part - Crée une nouvelle image à partir d'une partie de fichier GD2 ou d'une URL
    • imagecreatefromgif - Crée une nouvelle image depuis un fichier ou une URL
    • imagecreatefromjpeg - Crée une nouvelle image depuis un fichier ou une URL
    • imagecreatefrompng - Crée une nouvelle image depuis un fichier ou une URL
    • imagecreatefromstring - Crée une image à partir d'une chaîne
    • imagecreatefromwbmp - Crée une nouvelle image depuis un fichier ou une URL
    • imagecreatefromwebp - Crée une nouvelle image depuis un fichier ou une URL
    • imagecreatefromxbm - Crée une nouvelle image depuis un fichier ou une URL
    • imagecreatefromxpm - Crée une nouvelle image depuis un fichier ou une URL
    • imagecreatetruecolor - Crée une nouvelle image en couleurs vraies
    • imagecrop - Recadre une image sur le rectangle donné
    • imagecropauto - Recadre une image automatiquement en utilisant un des modes disponibles
    • imagedashedline - Dessine une ligne pointillée
    • imagedestroy - Détruit une image
    • imageellipse - Dessine une ellipse
    • imagefill - Remplissage
    • imagefilledarc - Dessine un arc partiel et le remplit
    • imagefilledellipse - Dessine une ellipse pleine
    • imagefilledpolygon - Dessine un polygone rempli
    • imagefilledrectangle - Dessine un rectangle rempli
    • imagefilltoborder - Remplit une région avec une couleur spécifique
    • imagefilter - Applique un filtre à une image
    • imageflip - Retourne une image en utilisant le mode fourni
    • imagefontheight - Retourne la hauteur de la police
    • imagefontwidth - Retourne la largeur de la police
    • imageftbbox - Calcule le rectangle d'encadrement pour un texte, en utilisant la police courante et freetype2
    • imagefttext - Écrit du texte dans une image avec la police courante FreeType 2
    • imagegammacorrect - Applique une correction gamma à l'image GD
    • imagegd - Génère une image au format GD, vers le navigateur ou un fichier
    • imagegd2 - Génère une image au format GD2, vers le navigateur ou un fichier
    • imagegetclip - Récupère le rectangle de coupure
    • imagegetinterpolation - Get the interpolation method
    • imagegif - Affichage de l'image vers le navigateur ou dans un fichier
    • imagegrabscreen - Capture l'écran complet
    • imagegrabwindow - Capture une fenêtre
    • imageinterlace - Active ou désactive l'entrelacement
    • imageistruecolor - Détermine si une image est une image truecolor
    • imagejpeg - Affichage de l'image vers le navigateur ou dans un fichier
    • imagelayereffect - Active l'option d'alpha blending, pour utiliser les effets de libgd
    • imageline - Dessine une ligne
    • imageloadfont - Charge une nouvelle police
    • imageopenpolygon - Dessine un polygone ouvert
    • imagepalettecopy - Copie la palette d'une image à l'autre
    • imagepalettetotruecolor - Convertit une image basée sur une palette en couleur vraie
    • imagepng - Envoie une image PNG vers un navigateur ou un fichier
    • imagepolygon - Dessine un polygone
    • imagerectangle - Dessine un rectangle
    • imageresolution - Récupère ou définit la résoltion de l'image
    • imagerotate - Fait tourner une image d'un angle
    • imagesavealpha - Détermine si les informations complètes du canal alpha doivent être conservées lors de la sauvegardes d'images PNG
    • imagescale - Met à l'échelle une image en utilisant une hauteur et une largeur fournies
    • imagesetbrush - Modifie la brosse pour le dessin des lignes
    • imagesetclip - Définit le rectangle de coupure
    • imagesetinterpolation - Défini la méthode d'interpolation
    • imagesetpixel - Dessine un pixel
    • imagesetstyle - Configure le style pour le dessin des lignes
    • imagesetthickness - Modifie l'épaisseur d'un trait
    • imagesettile - Modifie l'image utilisée pour le carrelage
    • imagestring - Dessine une chaîne horizontale
    • imagestringup - Dessine une chaîne verticale
    • imagesx - Retourne la largeur d'une image
    • imagesy - Retourne la hauteur de l'image
    • imagetruecolortopalette - Convertit une image en couleurs vraies en image à palette
    • imagettfbbox - Retourne le rectangle entourant un texte et dessiné avec une police TrueType
    • imagettftext - Dessine un texte avec une police TrueType
    • imagetypes - Retourne les types d'images supportés par la version courante de PHP
    • imagewbmp - Affichage de l'image vers le navigateur ou dans un fichier
    • imagewebp - Affiche une image WebP vers un navigateur ou un fichier
    • imagexbm - Génère une image au format XBM
    • image_type_to_extension - Retourne l'extension du fichier pour le type d'image
    • image_type_to_mime_type - Lit le Mime-Type d'un type d'image
    • Imagick::adaptiveBlurImage - Ajout un flou adaptatif à l'image
    • Imagick::adaptiveResizeImage - Redimensionne adaptativement une image par triangulation
    • Imagick::adaptiveSharpenImage - Augmente le contraste de l'image
    • Imagick::adaptiveThresholdImage - Sélectionne le niveau de chaque pixel, à partir d'un intervalle d'intensité
    • Imagick::addImage - Ajoute une nouvelle image à la liste d'image Imagick
    • Imagick::addNoiseImage - Ajoute un bruit blanc à une image
    • Imagick::affineTransformImage - Transforme une image
    • Imagick::animateImages - Anime une ou plusieurs images
    • Imagick::annotateImage - Annote une image avec un texte
    • Imagick::appendImages - Ajoute un jeu d'images
    • Imagick::autoLevelImage - Description
    • Imagick::averageImages - Moyenne d'un jeu d'images
    • Imagick::blackThresholdImage - Force tous les pixels au-delà d'un seuil à noir
    • Imagick::blueShiftImage - Description
    • Imagick::blurImage - Ajoute un filtre de flou à une image
    • Imagick::borderImage - Encadre une image avec un bord
    • Imagick::brightnessContrastImage - Description
    • Imagick::charcoalImage - Simule un dessin au fusain
    • Imagick::chopImage - Supprime une région d'une image et retaille
    • Imagick::clampImage - Description
    • Imagick::clear - Libère toutes les ressources associées à un objet Imagick
    • Imagick::clipImage - S'aligne sur le premier chemin d'un profil 8BIM
    • Imagick::clipImagePath - Description
    • Imagick::clipPathImage - Suit le chemin d'un profil 8BIM
    • Imagick::clone - Fait une copie exacte d'un objet Imagick
    • Imagick::clutImage - Remplace les couleurs d'une image
    • Imagick::coalesceImages - Compose un jeu d'images
    • Imagick::colorFloodfillImage - Change les pixels qui sont d'une couleur
    • Imagick::colorizeImage - Mélange la couleur de remplissage avec l'image
    • Imagick::colorMatrixImage - Description
    • Imagick::combineImages - Combine plusieurs images en une seule
    • Imagick::commentImage - Ajoute un commentaire à une image
    • Imagick::compareImageChannels - Retourne la différence entre plusieurs images
    • Imagick::compareImageLayers - Retourne la région d'encadrement maximale entre deux images
    • Imagick::compareImages - Compare une image avec une image reconstituée
    • Imagick::compositeImage - Compose une image avec une autre
    • Imagick::contrastImage - Change le contraste de l'image
    • Imagick::contrastStretchImage - Améliore le contraste d'une image
    • Imagick::convolveImage - Applique un noyau de convolution à une image
    • Imagick::count - Get the number of images
    • Imagick::cropImage - Extrait une région d'une image
    • Imagick::cropThumbnailImage - Crée une miniature par retaillage
    • Imagick::current - Retourne une référence sur l'objet imagick courant
    • Imagick::cycleColormapImage - Déplace la carte des couleurs d'une image
    • Imagick::decipherImage - Déchiffre une image
    • Imagick::deconstructImages - Retourne les différences de certains pixels entre deux images
    • Imagick::deleteImageArtifact - Supprime l'artefact d'une image
    • Imagick::deleteImageProperty - Description
    • Imagick::deskewImage - Supprime le biais de l'image
    • Imagick::despeckleImage - Réduit le bruit speckle d'une image
    • Imagick::destroy - Détruit un objet Imagick
    • Imagick::displayImage - Affiche une image
    • Imagick::displayImages - Affiche une image ou une séquence
    • Imagick::distortImage - Déforme une image avec différentes méthodes
    • Imagick::drawImage - Affiche un objet ImagickDraw dans l'image courante
    • Imagick::edgeImage - Renforce les bords dans l'image
    • Imagick::embossImage - Retourne une image en niveau de gris, avec un effet 3D
    • Imagick::encipherImage - Chiffre une image
    • Imagick::enhanceImage - Améliore la qualité d'une image bruitée
    • Imagick::equalizeImage - Égalise l'histogramme d'une image
    • Imagick::evaluateImage - Applique une expression à une image
    • Imagick::exportImagePixels - Exporte les pixels bruts de l'image
    • Imagick::extentImage - Définit la taille de l'image
    • Imagick::filter - Description
    • Imagick::flattenImages - Fusionne une séquence d'images
    • Imagick::flipImage - Crée une image par miroir vertical
    • Imagick::floodFillPaintImage - Modifie la valeur de la couleur de chaque pixel correspondant à la cible
    • Imagick::flopImage - Crée une image par miroir vertical
    • Imagick::forwardFourierTransformImage - Description
    • Imagick::frameImage - Ajoute un bord 3D
    • Imagick::functionImage - Applique une fonction sur l'image
    • Imagick::fxImage - Évalue une expression pour chaque pixel d'une image
    • Imagick::gammaImage - Applique une correction gamma à l'image
    • Imagick::gaussianBlurImage - Ajoute du flou à image
    • Imagick::getColorspace - Récupère l'espace de couleurs
    • Imagick::getCompression - Lit le type de compression
    • Imagick::getCompressionQuality - Lit la qualité de la compression
    • Imagick::getCopyright - Retourne le copyright de l'API ImageMagick API
    • Imagick::getFilename - Lit le nom du fichier associé à une séquence
    • Imagick::getFont - Récupère la police de caractères
    • Imagick::getFormat - Retourne le format de l'image Imagick
    • Imagick::getGravity - Récupère la gravité
    • Imagick::getHomeURL - Retourne l'URL de ImageMagick
    • Imagick::getImage - Retourne un nouvel objet Imagick
    • Imagick::getImageAlphaChannel - Récupère le canal alpha de l'image
    • Imagick::getImageArtifact - Récupère l'artefact de l'image
    • Imagick::getImageAttribute - Description
    • Imagick::getImageBackgroundColor - Retourne la couleur de fond
    • Imagick::getImageBlob - Retourne la séquence d'images comme un blob
    • Imagick::getImageBluePrimary - Retourne la chromacité de la couleur bleue
    • Imagick::getImageBorderColor - Retourne la couleur de bordure de l'image
    • Imagick::getImageChannelDepth - Lit la profondeur d'un des canaux de l'image
    • Imagick::getImageChannelDistortion - Compare les canaux d'une image reconstituée
    • Imagick::getImageChannelDistortions - Récupère les distorsions d'un canal
    • Imagick::getImageChannelExtrema - Lit les extrêmes pour les canaux de l'image
    • Imagick::getImageChannelKurtosis - Le but de getImageChannelKurtosis
    • Imagick::getImageChannelMean - Lit la moyenne et la déviation standard
    • Imagick::getImageChannelRange - Récupère l'intervalle du canal
    • Imagick::getImageChannelStatistics - Retourne des statistiques sur chaque canal de l'image
    • Imagick::getImageClipMask - Récupère le masque du clip de l'image
    • Imagick::getImageColormapColor - Retourne la couleur à l'index de la carte de couleurs
    • Imagick::getImageColors - Lit le nombre de couleurs uniques de l'image
    • Imagick::getImageColorspace - Lit l'espace de couleurs de l'image
    • Imagick::getImageCompose - Retourne l'opérateur de composition associé à une image
    • Imagick::getImageCompression - Lit le type de compression de l'image
    • Imagick::getImageCompressionQuality - Lit la qualité de compression de l'image
    • Imagick::getImageDelay - Lit le délai de l'image
    • Imagick::getImageDepth - Lit la profondeur de l'image
    • Imagick::getImageDispose - Lit la méthode de récupération
    • Imagick::getImageDistortion - Compare une image à une image reconstituée
    • Imagick::getImageExtrema - Lit les extrêmes d'une image
    • Imagick::getImageFilename - Retourne le nom d'un fichier pour une image dans une séquence
    • Imagick::getImageFormat - Retourne le format d'une image dans une séquence
    • Imagick::getImageGamma - Lit le gamma de l'image
    • Imagick::getImageGeometry - Lit les dimensions de l'image dans un tableau
    • Imagick::getImageGravity - Récupère la gravité de l'image
    • Imagick::getImageGreenPrimary - Retourne la chromacité de la couleur verte
    • Imagick::getImageHeight - Retourne la hauteur de l'image
    • Imagick::getImageHistogram - Retourne l'histogramme de l'image
    • Imagick::getImageIndex - Lit l'index de l'image courante
    • Imagick::getImageInterlaceScheme - Lit le schéma d'entrelacement de l'image
    • Imagick::getImageInterpolateMethod - Retourne la méthode d'interpolation
    • Imagick::getImageIterations - Lit les itérations de l'image
    • Imagick::getImageLength - Retourne la taille de l'image en octets
    • Imagick::getImageMatte - Indique si l'image a un canal mat
    • Imagick::getImageMatteColor - Retourne la couleur mate de l'image
    • Imagick::getImageMimeType - Description
    • Imagick::getImageOrientation - Lit l'orientation de l'image
    • Imagick::getImagePage - Retourne la géométrie de la page
    • Imagick::getImagePixelColor - Retourne la couleur d'un pixel
    • Imagick::getImageProfile - Retourne un profil d'une image
    • Imagick::getImageProfiles - Retourne les profils de l'image
    • Imagick::getImageProperties - Retourne les propriétés EXIF de l'image
    • Imagick::getImageProperty - Retourne une propriété d'une image
    • Imagick::getImageRedPrimary - Retourne la chromacité du point rouge
    • Imagick::getImageRegion - Extrait une région d'une image
    • Imagick::getImageRenderingIntent - Lit la méthode de rendu de l'image
    • Imagick::getImageResolution - Lit les résolutions en X et Y d'une image
    • Imagick::getImagesBlob - Retourne toutes les images de la séquence en un BLOB
    • Imagick::getImageScene - Retourne la scène de l'image
    • Imagick::getImageSignature - Génère une signature SHA-256
    • Imagick::getImageSize - Retourne la taille de l'image en octets
    • Imagick::getImageTicksPerSecond - Lit les ticks-par-seconde de l'image
    • Imagick::getImageTotalInkDensity - Lit la densité totale d'encre de l'image
    • Imagick::getImageType - Lit le type possible d'image
    • Imagick::getImageUnits - Retourne les unités de résolution de l'image
    • Imagick::getImageVirtualPixelMethod - Retourne la méthode du pixel virtuel
    • Imagick::getImageWhitePoint - Retourne la chromacité du point blanc
    • Imagick::getImageWidth - Retourne la largeur de l'image
    • Imagick::getInterlaceScheme - Lit le schéma d'entrelacement de l'objet
    • Imagick::getIteratorIndex - Lit l'index de l'image active courante
    • Imagick::getNumberImages - Retourne le nombre d'images d'un objet
    • Imagick::getOption - Retourne la valeur d'une option
    • Imagick::getPackageName - Retourne le nom du paquet ImageMagick
    • Imagick::getPage - Retourne la géométrie de la page
    • Imagick::getPixelIterator - Retourne un MagickPixelIterator
    • Imagick::getPixelRegionIterator - Lit un objet ImagickPixelIterator pour une section d'image
    • Imagick::getPointSize - Récupère la taille du point
    • Imagick::getQuantum - Description
    • Imagick::getQuantumDepth - Lit la profondeur quantique
    • Imagick::getQuantumRange - Retourne l'intervalle quantique de Imagick
    • Imagick::getRegistry - Description
    • Imagick::getReleaseDate - Retourne la date de publication de ImageMagick
    • Imagick::getResource - Retourne la consommation de mémoire de la ressource
    • Imagick::getResourceLimit - Retourne la limite de la ressource
    • Imagick::getSamplingFactors - Lit le facteur d'échantillonnage horizontal et vertical
    • Imagick::getSize - Retourne la taille associée avec un objet Imagick
    • Imagick::getSizeOffset - Retourne la taille de la position
    • Imagick::getVersion - Retourne l'API de ImageMagick API
    • Imagick::haldClutImage - Remplace les couleurs de l'image
    • Imagick::hasNextImage - Vérifie si un objet a une image suivante
    • Imagick::hasPreviousImage - Vérifie si un objet a une image précédente
    • Imagick::identifyFormat - Description
    • Imagick::identifyImage - Identifie une image et lit ses attributs
    • Imagick::implodeImage - Crée une nouvelle copie d'image
    • Imagick::importImagePixels - Importe des pixels dans une image
    • Imagick::inverseFourierTransformImage - Description
    • Imagick::labelImage - Ajoute un libelle à une image
    • Imagick::levelImage - Ajuste les niveaux de l'image
    • Imagick::linearStretchImage - Étire la saturation de l'intensité de l'image
    • Imagick::liquidRescaleImage - Anime une ou plusieurs images
    • Imagick::listRegistry - Description
    • Imagick::magnifyImage - Double la taille d'une image, proportionnellement
    • Imagick::mapImage - Remplace la couleur d'une image par celle d'une image de référence
    • Imagick::matteFloodfillImage - Change la transparence d'une couleur
    • Imagick::medianFilterImage - Applique un filtre numérique
    • Imagick::mergeImageLayers - Fusionne les calques de l'image
    • Imagick::minifyImage - Met à l'échelle une image proportionnellement pour la réduire de moitié de taille
    • Imagick::modulateImage - Contrôle la saturation, l'intensité et la teinte
    • Imagick::montageImage - Crée une image composite
    • Imagick::morphImages - Réalise un morphing entre deux images
    • Imagick::morphology - Description
    • Imagick::mosaicImages - Forme une mosaïque d'images
    • Imagick::motionBlurImage - Ajout un flou de déplacement
    • Imagick::negateImage - Effectue la négation des couleurs d'une image de référence
    • Imagick::newImage - Crée une nouvelle image
    • Imagick::newPseudoImage - Crée une nouvelle image
    • Imagick::nextImage - Passe à la prochaine image
    • Imagick::normalizeImage - Améliore le contraste de l'image
    • Imagick::oilPaintImage - Simule une peinture à l'huile
    • Imagick::opaquePaintImage - Modifie la valeur de la couleur de tous les pixels correspondant à la cible
    • Imagick::optimizeImageLayers - Supprime les portions récurrents d'images à optimiser
    • Imagick::orderedPosterizeImage - Effectue un dither ordonné
    • Imagick::paintOpaqueImage - Change les pixels qui sont d'une couleur
    • Imagick::paintTransparentImage - Remplit les pixels avec une couleur
    • Imagick::pingImage - Lit des attributs simples sans ouvrir une image
    • Imagick::pingImageBlob - Lit rapidement les attributs
    • Imagick::pingImageFile - Lit les attributs simples d'une image
    • Imagick::polaroidImage - Simule une photo Polaroid
    • Imagick::posterizeImage - Réduit une image à un nombre limité de couleurs
    • Imagick::previewImages - Teste rapidement différents paramètres pour un traitement d'images
    • Imagick::previousImage - Passe à l'image précédente dans une séquence d'images
    • Imagick::profileImage - Ajoute ou retire un profil d'une image
    • Imagick::quantizeImage - Analyse les couleurs dans une référence d'image
    • Imagick::quantizeImages - Analyse les couleurs d'une séquence d'images
    • Imagick::queryFontMetrics - Retourne un tableau représentant les dimensions de la police
    • Imagick::queryFonts - Retourne la liste de polices configurés
    • Imagick::queryFormats - Retourne les formats supportés par Imagick
    • Imagick::radialBlurImage - Flou radial d'une image
    • Imagick::raiseImage - Crée un effet 3D de bouton
    • Imagick::randomThresholdImage - Crée une image en deux couleurs, à haut contraste
    • Imagick::readImage - Lit une image depuis un fichier
    • Imagick::readImageBlob - Lit une image depuis une chaîne binaire
    • Imagick::readImageFile - Lit une image à partir d'une ressource fichier
    • Imagick::readimages - Description
    • Imagick::recolorImage - Recolore l'image
    • Imagick::reduceNoiseImage - Adoucit les contours d'une image
    • Imagick::remapImage - Reconfigure les couleurs de l'image
    • Imagick::removeImage - Retire une image de la liste
    • Imagick::removeImageProfile - Supprime le profil de l'image et le retourne
    • Imagick::render - Affiche toute les commandes de dessins précédentes
    • Imagick::resampleImage - Rééchantillonne l'image
    • Imagick::resetImagePage - Réinitialise la page de l'image
    • Imagick::resizeImage - Redimensionne une image
    • Imagick::rollImage - Décale une image
    • Imagick::rotateImage - Tourne une image
    • Imagick::rotationalBlurImage - Description
    • Imagick::roundCorners - Arrondit les coins d'un image
    • Imagick::sampleImage - Met à l'échelle une image avec échantillonnage de pixels
    • Imagick::scaleImage - Met à l'échelle la taille de l'image
    • Imagick::segmentImage - Segmente une image
    • Imagick::selectiveBlurImage - Description
    • Imagick::separateImageChannel - Sépare un canal d'une image
    • Imagick::sepiaToneImage - Passe une image en tons sépia
    • Imagick::setBackgroundColor - Configure la couleur de fond par défaut
    • Imagick::setColorspace - Définit l'espace de couleurs
    • Imagick::setCompression - Configure le type de compression de l'objet
    • Imagick::setCompressionQuality - Configure la compression par défaut de l'objet
    • Imagick::setFilename - Configure le nom du fichier d'image avant d'y accéder
    • Imagick::setFirstIterator - Place l'itérateur de Imagick sur la première image
    • Imagick::setFont - Configure la police
    • Imagick::setFormat - Configure le format de l'objet Imagick
    • Imagick::setGravity - Définit la gravité
    • Imagick::setImage - Remplace l'image dans l'objet
    • Imagick::setImageAlphaChannel - Définit le canal alpha de l'image
    • Imagick::setImageArtifact - Définit l'artefact de l'image
    • Imagick::setImageAttribute - Description
    • Imagick::setImageBackgroundColor - Configure la couleur de fond d'image
    • Imagick::setImageBias - Configure le biais pour les convolutions
    • Imagick::setImageBiasQuantum - Description
    • Imagick::setImageBluePrimary - Configure la chromacité du point bleu
    • Imagick::setImageBorderColor - Configure la couleur de bordure
    • Imagick::setImageChannelDepth - Configure la profondeur d'un canal
    • Imagick::setImageClipMask - Définit le masque du clip de l'image
    • Imagick::setImageColormapColor - Configure une couleur de la carte
    • Imagick::setImageColorspace - Configure l'espace de couleurs de l'image
    • Imagick::setImageCompose - Configure l'opérateur de composition de l'image
    • Imagick::setImageCompression - Configure la compression de l'image
    • Imagick::setImageCompressionQuality - Spécifie la qualité de compression de l'image
    • Imagick::setImageDelay - Configure le délai de l'image
    • Imagick::setImageDepth - Configure la profondeur de l'image
    • Imagick::setImageDispose - Configure la méthode de récupération
    • Imagick::setImageExtent - Configure la taille d'une image
    • Imagick::setImageFilename - Configure le nom de fichier d'une image dans une séquence
    • Imagick::setImageFormat - Configure le format d'une image dans une séquence
    • Imagick::setImageGamma - Configure la correction gamma
    • Imagick::setImageGravity - Définit la gravité de l'image
    • Imagick::setImageGreenPrimary - Configure la chromacité du point vert
    • Imagick::setImageIndex - Modifie la position de l'itérateur
    • Imagick::setImageInterlaceScheme - Configure la méthode d'entrelacement de l'image
    • Imagick::setImageInterpolateMethod - Configure la méthode d'interpolation de l'image
    • Imagick::setImageIterations - Configure les itérations de l'image
    • Imagick::setImageMatte - Configure le canal mate de l'image
    • Imagick::setImageMatteColor - Configure la couleur mate
    • Imagick::setImageOpacity - Configure le niveau d'opacité de l'image
    • Imagick::setImageOrientation - Configure l'orientation de l'image
    • Imagick::setImagePage - Configure la géométrie de la page de l'image
    • Imagick::setImageProfile - Ajoute un profil à un objet Imagick
    • Imagick::setImageProperty - Configure une propriété d'image
    • Imagick::setImageRedPrimary - Configure la chromacité du point rouge
    • Imagick::setImageRenderingIntent - Configure le type de rendu de l'image
    • Imagick::setImageResolution - Configure la résolution de l'image
    • Imagick::setImageScene - Configure la scène de l'image
    • Imagick::setImageTicksPerSecond - Configure le nombre e tick par seconde de l'image
    • Imagick::setImageType - Configure le type d'image
    • Imagick::setImageUnits - Configure les unités de résolutions de l'image
    • Imagick::setImageVirtualPixelMethod - Configure la méthode du point virtuel de l'image
    • Imagick::setImageWhitePoint - Configure la chromacité du point blanc
    • Imagick::setInterlaceScheme - Configure la compression de l'image
    • Imagick::setIteratorIndex - Déplace l'itérateur
    • Imagick::setLastIterator - Positionne l'itérateur Imagick à la dernière image
    • Imagick::setOption - Configure une option d'un objet Imagick
    • Imagick::setPage - Configure la géométrie de la page de l'objet Imagick
    • Imagick::setPointSize - Définit la taille du point
    • Imagick::setProgressMonitor - Description
    • Imagick::setRegistry - Description
    • Imagick::setResolution - Configure la résolution de l'image
    • Imagick::setResourceLimit - Définit la limite pour une ressource particulière
    • Imagick::setSamplingFactors - Configure les facteurs d'échantillonnage de l'image
    • Imagick::setSize - Configure la taille de l'objet Imagick
    • Imagick::setSizeOffset - Configure la taille et la position de l'objet Imagick
    • Imagick::setType - Configure l'attribut de l'image
    • Imagick::shadeImage - Crée un effet 3D
    • Imagick::shadowImage - Simule une ombre sur l'image
    • Imagick::sharpenImage - Aiguise une image
    • Imagick::shaveImage - Supprime les pixels du bord de l'image
    • Imagick::shearImage - Crée un parallélogramme
    • Imagick::sigmoidalContrastImage - Ajuste le contraste de l'image
    • Imagick::sketchImage - Simule un crayon à main levée
    • Imagick::smushImages - Description
    • Imagick::solarizeImage - Applique un effet de solarisation à l'image
    • Imagick::sparseColorImage - Interpole les couleurs
    • Imagick::spliceImage - Joint une couleur solide dans l'image
    • Imagick::spreadImage - Bouge aléatoirement chaque pixel d'un bloc
    • Imagick::statisticImage - Description
    • Imagick::steganoImage - Cache un filigrane digital dans l'image
    • Imagick::stereoImage - Fusionne 2 images
    • Imagick::stripImage - Supprime d'une image tous les profiles et les commentaires
    • Imagick::subImageMatch - Description
    • Imagick::swirlImage - Tourbillonne les pixels du centre de l'image
    • Imagick::textureImage - Répète les carreaux de la texture d'une image
    • Imagick::thresholdImage - Modifie la valeur des pixels individuels, basée sur un seuil
    • Imagick::thumbnailImage - Modifie la taille d'une image
    • Imagick::tintImage - Applique un vecteur de couleur à chaque pixel de l'image
    • Imagick::transformImage - Méthode de convenance pour définir la taille de rognage et la géométrie de l'image
    • Imagick::transformImageColorspace - Transforms an image to a new colorspace
    • Imagick::transparentPaintImage - Colorise les pixels transparents
    • Imagick::transposeImage - Applique une symétrie verticale
    • Imagick::transverseImage - Crée un miroir horizontal de l'image
    • Imagick::trimImage - Supprime les bords de l'image
    • Imagick::uniqueImageColors - Ne conserve qu'une couleur de pixel
    • Imagick::unsharpMaskImage - Rend une image plus nette
    • Imagick::valid - Vérifie si l'élément courant est valide
    • Imagick::vignetteImage - Ajout un filtre vignette à l'image
    • Imagick::waveImage - Ajoute un filtre de vagues à l'image
    • Imagick::whiteThresholdImage - Force tous les pixels en dessous du seuil en blanc
    • Imagick::writeImage - Écrit une image dans le fichier spécifié
    • Imagick::writeImageFile - Écrit une image dans un descripteur de fichier
    • Imagick::writeImages - Écrit une image ou une séquence d'images
    • Imagick::writeImagesFile - Écrits des frames dans un descripteur de fichiers
    • Imagick::__construct - Le constructeur Imagick
    • Imagick::__toString - Returns the image as a string
    • ImagickDraw::affine - Ajuste la matrice de transformation affine courante
    • ImagickDraw::annotation - Dessine un texte sur une image
    • ImagickDraw::arc - Dessine un arc
    • ImagickDraw::bezier - Dessine une courbe de Bézier
    • ImagickDraw::circle - Dessine un cercle
    • ImagickDraw::clear - Efface tout l'objet ImagickDraw
    • ImagickDraw::clone - Fait une copie exacte de l'objet ImagickDraw
    • ImagickDraw::color - Dessine une couleur sur une image
    • ImagickDraw::comment - Ajoute un commentaire
    • ImagickDraw::composite - Compose une image avec une autre
    • ImagickDraw::destroy - Libère toutes les ressources associées à un objet ImageDraw
    • ImagickDraw::ellipse - Dessine une ellipse sur une image
    • ImagickDraw::getClipPath - Retourne l'identifiant du chemin courant
    • ImagickDraw::getClipRule - Retourne la règle de remplissage courante pour les polygones
    • ImagickDraw::getClipUnits - Retourne l'unité d'interprétation des chemins
    • ImagickDraw::getFillColor - Retourne la couleur de remplissage
    • ImagickDraw::getFillOpacity - Retourne l'opacité de dessin
    • ImagickDraw::getFillRule - Retourne la règle de remplissage
    • ImagickDraw::getFont - Retourne la police
    • ImagickDraw::getFontFamily - Retourne la famille de police
    • ImagickDraw::getFontSize - Retourne la taille de la police
    • ImagickDraw::getFontStretch - Description
    • ImagickDraw::getFontStyle - Retourne le style de la police
    • ImagickDraw::getFontWeight - Retourne le poids de la police
    • ImagickDraw::getGravity - Retourne la gravité de placement de texte
    • ImagickDraw::getStrokeAntialias - Retourne la configuration d'anti-aliasing de trait
    • ImagickDraw::getStrokeColor - Retourne la couleur des contours d'objets
    • ImagickDraw::getStrokeDashArray - Retourne un tableau représentant le motif de pointillés
    • ImagickDraw::getStrokeDashOffset - Retourne l'offset du pointillé dans le motif
    • ImagickDraw::getStrokeLineCap - Retourne la forme à utiliser pour dessiner les bouts de sous-chemins
    • ImagickDraw::getStrokeLineJoin - Retourne la forme à utiliser pour dessiner les coins d'un chemin
    • ImagickDraw::getStrokeMiterLimit - Retourne la 'miterLimit'
    • ImagickDraw::getStrokeOpacity - Retourne l'opacité des contours d'un objet
    • ImagickDraw::getStrokeWidth - Retourne la largeur du trait utilisé
    • ImagickDraw::getTextAlignment - Retourne l'alignement du texte
    • ImagickDraw::getTextAntialias - Retourne la configuration de l'anti-aliasing de texte
    • ImagickDraw::getTextDecoration - Retourne la décoration du texte
    • ImagickDraw::getTextEncoding - Retourne le jeu de caractères utilisé pour les annotations de texte
    • ImagickDraw::getTextInterlineSpacing - Description
    • ImagickDraw::getTextInterwordSpacing - Description
    • ImagickDraw::getTextKerning - Description
    • ImagickDraw::getTextUnderColor - Retourne la couleur sous le texte
    • ImagickDraw::getVectorGraphics - Retourne une chaîne contenant le vecteur graphique
    • ImagickDraw::line - Dessine une ligne
    • ImagickDraw::matte - Dessine sur le canal d'opacité de l'image
    • ImagickDraw::pathClose - Ajoute un élément de chemin au chemin courant
    • ImagickDraw::pathCurveToAbsolute - Dessine une courbe de Bézier cubique, en coordonnées absolues
    • ImagickDraw::pathCurveToQuadraticBezierAbsolute - Dessine une courbe de Bézier quadratique, en coordonnées absolues
    • ImagickDraw::pathCurveToQuadraticBezierRelative - Dessine une courbe de Bézier quadratique, en coordonnées relatives
    • ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute - Dessine une courbe de Bézier de puissance 4, en coordonnées absolues
    • ImagickDraw::pathCurveToQuadraticBezierSmoothRelative - Dessine une courbe de Bézier de puissance 4, en coordonnées relatives
    • ImagickDraw::pathCurveToRelative - Dessine une courbe de Bézier cubique, en coordonnées relatives
    • ImagickDraw::pathCurveToSmoothAbsolute - Dessine une courbe de Bézier, en coordonnées absolues
    • ImagickDraw::pathCurveToSmoothRelative - Dessine une courbe de Bézier, en coordonnées relatives
    • ImagickDraw::pathEllipticArcAbsolute - Dessine un arc d'ellipse, en coordonnées absolues
    • ImagickDraw::pathEllipticArcRelative - Dessine un arc d'ellipse, en coordonnées relatives
    • ImagickDraw::pathFinish - Termine le chemin courant
    • ImagickDraw::pathLineToAbsolute - Dessine une ligne de chemin, en coordonnées absolues
    • ImagickDraw::pathLineToHorizontalAbsolute - Dessine une ligne de chemin horizontale, en coordonnées absolues
    • ImagickDraw::pathLineToHorizontalRelative - Dessine une ligne de chemin horizontale, en coordonnées relatives
    • ImagickDraw::pathLineToRelative - Dessine une ligne de chemin, en coordonnées relatives
    • ImagickDraw::pathLineToVerticalAbsolute - Dessine une ligne de chemin verticale, en coordonnées absolues
    • ImagickDraw::pathLineToVerticalRelative - Dessine une ligne de chemin verticale, en coordonnées relatives
    • ImagickDraw::pathMoveToAbsolute - Commence un nouveau sous-chemin, en coordonnées absolues
    • ImagickDraw::pathMoveToRelative - Commence un nouveau sous-chemin, en coordonnées relatives
    • ImagickDraw::pathStart - Déclare le début d'une chemin de dessin
    • ImagickDraw::point - Dessine un point
    • ImagickDraw::polygon - Dessine un polygone
    • ImagickDraw::polyline - Dessine une ligne brisée
    • ImagickDraw::pop - Détruit l'objet ImagickDraw courant dans la pile, et retourne son précédent
    • ImagickDraw::popClipPath - Termine la définition d'un chemin
    • ImagickDraw::popDefs - Termine une définition de liste
    • ImagickDraw::popPattern - Termine une définition de motif
    • ImagickDraw::push - Clone l'objet ImagickDraw courant et le pousse dans la pile
    • ImagickDraw::pushClipPath - Commence la définition d'un chemin
    • ImagickDraw::pushDefs - Indique que la commande suivante créée des éléments nommés pour pré-traitement
    • ImagickDraw::pushPattern - Configure un espace de dessin
    • ImagickDraw::rectangle - Dessine un rectangle
    • ImagickDraw::render - Effectue le rendu de tous les dessins à l'image
    • ImagickDraw::resetVectorGraphics - Description
    • ImagickDraw::rotate - Applique une rotation
    • ImagickDraw::roundRectangle - Dessine un rectangle aux coins arrondis
    • ImagickDraw::scale - Ajuste le facteur de mise à l'échelle
    • ImagickDraw::setClipPath - Associe un chemin avec une image
    • ImagickDraw::setClipRule - Configure la règle de remplissage du polygone à utiliser avec les chemins
    • ImagickDraw::setClipUnits - Configure le mode d'interprétation des unités de chemin
    • ImagickDraw::setFillAlpha - Configure l'opacité de la couleur de remplissage
    • ImagickDraw::setFillColor - Configure la couleur de dessin des objets remplis
    • ImagickDraw::setFillOpacity - Configure l'opacité à utiliser pour le remplissage
    • ImagickDraw::setFillPatternURL - Configure l'URL du motif de remplissage des surfaces
    • ImagickDraw::setFillRule - Configure la règle de remplissage des polygones
    • ImagickDraw::setFont - Configure la police complète pour les textes
    • ImagickDraw::setFontFamily - Configure la famille de police pour les textes
    • ImagickDraw::setFontSize - Configure la taille de point pour les textes
    • ImagickDraw::setFontStretch - Configure l'étirement du texte
    • ImagickDraw::setFontStyle - Configure le style de police
    • ImagickDraw::setFontWeight - Configure le poids de la police
    • ImagickDraw::setGravity - Configure la gravité de placement de texte
    • ImagickDraw::setResolution - Description
    • ImagickDraw::setStrokeAlpha - Spécifie l'opacité des contours d'objets
    • ImagickDraw::setStrokeAntialias - Contrôle l'anti-aliasing des pointillés
    • ImagickDraw::setStrokeColor - Configure la couleur utilisée pour dessiner les objets
    • ImagickDraw::setStrokeDashArray - Spécifie le motif de pointillé
    • ImagickDraw::setStrokeDashOffset - Spécifie la position dans le motif pour commencer le pointillé
    • ImagickDraw::setStrokeLineCap - Spécifie la forme à utiliser à la fin des sous-chemins
    • ImagickDraw::setStrokeLineJoin - Spécifie la forme à utiliser pour dessiner les fins de lignes
    • ImagickDraw::setStrokeMiterLimit - Spécifie la limiter miter
    • ImagickDraw::setStrokeOpacity - Spécifie l'opacité pour dessiner les contours
    • ImagickDraw::setStrokePatternURL - Configure le motif utilisé pour dessiner les contours
    • ImagickDraw::setStrokeWidth - Configure la largeur du trait pour dessiner les contours
    • ImagickDraw::setTextAlignment - Spécifie l'alignement du texte
    • ImagickDraw::setTextAntialias - Contrôle l'anti-alisasing du texte
    • ImagickDraw::setTextDecoration - Spécifie les ornements de texte
    • ImagickDraw::setTextEncoding - Spécifie le jeu de caractères
    • ImagickDraw::setTextInterlineSpacing - Description
    • ImagickDraw::setTextInterwordSpacing - Description
    • ImagickDraw::setTextKerning - Description
    • ImagickDraw::setTextUnderColor - Spécifie la couleur de fond d'une rectangle
    • ImagickDraw::setVectorGraphics - Configure le vecteur graphique
    • ImagickDraw::setViewbox - Configure la taille du canevas
    • ImagickDraw::skewX - Biaise les coordonnées dans la direction horizontale
    • ImagickDraw::skewY - Incline les coordonnées dans la direction verticale
    • ImagickDraw::translate - Applique une translation
    • ImagickDraw::__construct - Le constructeur ImagickDraw
    • ImagickKernel::addKernel - Description
    • ImagickKernel::addUnityKernel - Description
    • ImagickKernel::fromBuiltIn - Description
    • ImagickKernel::fromMatrix - Description
    • ImagickKernel::getMatrix - Description
    • ImagickKernel::scale - Description
    • ImagickKernel::separate - Description
    • ImagickPixel::clear - Supprime toutes les ressources associées avec l'objet
    • ImagickPixel::destroy - Libère les ressources associées avec l'objet
    • ImagickPixel::getColor - Retourne la couleur
    • ImagickPixel::getColorAsString - Retourne une couleur
    • ImagickPixel::getColorCount - Retourne le nombre de couleurs associé avec une couleur
    • ImagickPixel::getColorQuantum - Description
    • ImagickPixel::getColorValue - Récupère la valeur normalisée du canal de la couleur fournie
    • ImagickPixel::getColorValueQuantum - Description
    • ImagickPixel::getHSL - Retourne la couleur HSL normalisée de l'objet ImagickPixel
    • ImagickPixel::getIndex - Description
    • ImagickPixel::isPixelSimilar - Vérifie la distance entre cette couleur et une autre
    • ImagickPixel::isPixelSimilarQuantum - Description
    • ImagickPixel::isSimilar - Vérifie la distance entre 2 couleurs
    • ImagickPixel::setColor - Définit la couleur
    • ImagickPixel::setColorCount - Description
    • ImagickPixel::setColorValue - Définit la valeur normalisée d'un des canaux
    • ImagickPixel::setColorValueQuantum - Description
    • ImagickPixel::setHSL - Définit la couleur HSL normalisée
    • ImagickPixel::setIndex - Description
    • ImagickPixel::__construct - Le constructeur ImagickPixel
    • ImagickPixelIterator::clear - Efface toutes les ressources associées à PixelIterator
    • ImagickPixelIterator::destroy - Libère les ressources associées à PixelIterator
    • ImagickPixelIterator::getCurrentIteratorRow - Retourne la ligne courante des objets ImagickPixel
    • ImagickPixelIterator::getIteratorRow - Retourne la ligne courante de l'itérateur de pixel
    • ImagickPixelIterator::getNextIteratorRow - Retourne la prochaine ligne de l'itérateur de pixel
    • ImagickPixelIterator::getPreviousIteratorRow - Retourne la ligne précédente
    • ImagickPixelIterator::newPixelIterator - Retourne un nouveau pixel de l'itérateur
    • ImagickPixelIterator::newPixelRegionIterator - Retourne un nouveau pixel de l'itérateur
    • ImagickPixelIterator::resetIterator - Réinitialise l'itérateur de pixel
    • ImagickPixelIterator::setIteratorFirstRow - Définit l'itérateur de pixel sur la première ligne de pixels
    • ImagickPixelIterator::setIteratorLastRow - Définit l'itérateur de pixel sur la dernière ligne de pixels
    • ImagickPixelIterator::setIteratorRow - Définit la ligne de l'itérateur de pixel
    • ImagickPixelIterator::syncIterator - Synchronise l'itérateur de pixel
    • ImagickPixelIterator::__construct - Le constructeur ImagickPixelIterator
    • imap_8bit - Convertit une chaîne à 8 bits en une chaîne encodée en Quoted-Printable
    • imap_alerts - Retourne toutes les alertes
    • imap_append - Ajoute un message dans une boîte aux lettres
    • imap_base64 - Décode un texte encodé en BASE64
    • imap_binary - Convertit une chaîne à 8 bits en une chaîne à base64
    • imap_body - Lit le corps d'un message
    • imap_bodystruct - Lit la structure d'une section du corps d'un mail
    • imap_check - Vérifie la boîte aux lettres courante
    • imap_clearflag_full - Supprime un flag (drapeau) sur un message
    • imap_close - Termine un flux IMAP
    • imap_create - Alias de imap_createmailbox
    • imap_createmailbox - Crée une nouvelle boîte aux lettres
    • imap_delete - Marque le fichier pour l'effacement, dans la boîte aux lettres courante
    • imap_deletemailbox - Efface une boîte aux lettres
    • imap_errors - Retourne toutes les erreurs IMAP survenues
    • imap_expunge - Efface tous les messages marqués pour l'effacement
    • imap_fetchbody - Retourne une section extraite du corps d'un message
    • imap_fetchheader - Retourne l'en-tête d'un message
    • imap_fetchmime - Récupère les en-têtes MIME pour une section particulière du message
    • imap_fetchstructure - Lit la structure d'un message
    • imap_fetchtext - Alias de imap_body
    • imap_fetch_overview - Lit le sommaire des en-têtes de messages
    • imap_gc - Efface le cache IMAP
    • imap_getacl - Retourne le ACL pour la boîte aux lettres
    • imap_getmailboxes - Liste les boîtes aux lettres, et retourne les détails de chacune
    • imap_getsubscribed - Liste toutes les boîtes aux lettres souscrites
    • imap_get_quota - Lit les quotas des boîtes aux lettres ainsi que des statistiques sur chacune d'elles
    • imap_get_quotaroot - Lit les quotas de chaque utilisateur
    • imap_header - Alias de imap_headerinfo
    • imap_headerinfo - Lit l'en-tête du message
    • imap_headers - Retourne les en-têtes de tous les messages d'une boîte aux lettres
    • imap_last_error - Retourne la dernière erreur survenue
    • imap_list - Lit la liste des boîtes aux lettres
    • imap_listmailbox - Alias de imap_list
    • imap_listscan - Lit la liste des boîtes aux lettres, et y recherche une chaîne
    • imap_listsubscribed - Alias de imap_lsub
    • imap_lsub - Liste toutes les boîtes aux lettres enregistrées
    • imap_mail - Envoie un message mail
    • imap_mailboxmsginfo - Lit les informations à propos de la boîte aux lettres courante
    • imap_mail_compose - Crée un message MIME
    • imap_mail_copy - Copie les messages spécifiés dans une boîte aux lettres
    • imap_mail_move - Déplace des messages dans une boîte aux lettres
    • imap_mime_header_decode - Décode les éléments MIME d'un en-tête
    • imap_msgno - Retourne le numéro de séquence du message pour un UID donné
    • imap_mutf7_to_utf8 - Décode une chaîne de caractère UTF-7 modifié en UTF-8
    • imap_num_msg - Retourne le nombre de messages dans la boîte aux lettres courante
    • imap_num_recent - Retourne le nombre de messages récents dans la boîte aux lettres courante
    • imap_open - Ouvre un flux IMAP vers une boîte aux lettres
    • imap_ping - Vérifie que le flux IMAP est toujours actif
    • imap_qprint - Convertit une chaîne à guillemets en une chaîne à 8 bits
    • imap_rename - Alias de imap_renamemailbox
    • imap_renamemailbox - Renomme une boîte aux lettres
    • imap_reopen - Réouvre un flux IMAP vers une nouvelle boîte aux lettres
    • imap_rfc822_parse_adrlist - Analyse une adresse email
    • imap_rfc822_parse_headers - Analyse un en-tête mail
    • imap_rfc822_write_address - Retourne une adresse email formatée correctement
    • imap_savebody - Sauvegarde une partie spécifique du corps dans un fichier
    • imap_scan - Alias de imap_listscan
    • imap_scanmailbox - Alias de imap_listscan
    • imap_search - Retourne un tableau de messages après recherche
    • imap_setacl - Modifie le ACL de la boîte aux lettres
    • imap_setflag_full - Positionne un drapeau sur un message
    • imap_set_quota - Modifie le quota d'une boîte aux lettres
    • imap_sort - Trie des messages
    • imap_status - Retourne les informations de statut sur une boîte aux lettres
    • imap_subscribe - Souscrit à une boîte aux lettres
    • imap_thread - Retourne l'arbre des messages organisés par thread
    • imap_timeout - Configure ou retourne le timeout
    • imap_uid - Retourne l'UID d'un message
    • imap_undelete - Enlève la marque d'effacement d'un message
    • imap_unsubscribe - Termine la souscription à une boîte aux lettres
    • imap_utf7_decode - Décode une chaîne encodée en UTF-7 modifié
    • imap_utf7_encode - Convertit une chaîne ISO-8859-1 en texte UTF-7 modifié
    • imap_utf8 - Convertit du texte au format MIME en UTF-8
    • imap_utf8_to_mutf7 - Encode une chaîne de caractère UTF-8 en UTF-7 modifié
    • implode - Rassemble les éléments d'un tableau en une chaîne
    • inet_ntop - Convertit un paquet d'adresses internet en une représentation humainement lisible
    • inet_pton - Convertit une adresse IP lisible en sa représentation in_addr
    • InfiniteIterator::next - Avance l'itérateur ou le replace au début
    • InfiniteIterator::__construct - Construit un InfiniteIterator
    • inflate_add - Incrementally inflate encoded data
    • inflate_get_read_len - Get number of bytes read so far
    • inflate_get_status - Get decompression status
    • inflate_init - Initialize an incremental inflate context
    • ingres_autocommit - Active ou désactive le mode autocommit
    • ingres_autocommit_state - Vérifie si la connexion utilise l'autocommit
    • ingres_charset - Retourne le jeu de caractères utilisé par Ingres
    • ingres_close - Ferme une connexion à un serveur Ingres
    • ingres_commit - Valide une transaction
    • ingres_connect - Ouvre une connexion sur un serveur Ingres
    • ingres_cursor - Récupère le nom du curseur pour une ressource de résultats donnée
    • ingres_errno - Récupère le dernier numéro d'erreur d'Ingres généré
    • ingres_error - Lit le dernier message d'erreur Ingres
    • ingres_errsqlstate - Récupère le dernier code SQLSTATE généré
    • ingres_escape_string - Protège les caractères spéciaux de Ingres
    • ingres_execute - Exécute une commande préparée Ingres
    • ingres_fetch_array - Récupère une ligne de résultat Ingres dans un tableau
    • ingres_fetch_assoc - Récupère une ligne de résultat dans un tableau associatif
    • ingres_fetch_object - Récupère une ligne de résultat dans un objet
    • ingres_fetch_proc_return - Lit le résultat d'un appel à une procédure stockée
    • ingres_fetch_row - Récupère une ligne de résultat dans un tableau énuméré
    • ingres_field_length - Retourne la taille d'un champ
    • ingres_field_name - Retourne le nom d'un champ dans le résultat d'une requête Ingres
    • ingres_field_nullable - Teste si un champ est annulable
    • ingres_field_precision - Retourne la précision d'un champ Ingres
    • ingres_field_scale - Retourne l'échelle d'un champ
    • ingres_field_type - Retourne le type d'un champ dans le résultat d'une requête Ingres
    • ingres_free_result - Libère les ressources d'un résultat Ingres
    • ingres_next_error - Lit l'erreur Ingres suivante
    • ingres_num_fields - Retourne le nombre de champs renvoyés par la dernière requête Ingres
    • ingres_num_rows - Retourne le nombre de lignes affectées ou renvoyées par une requête Ingres
    • ingres_pconnect - Ouvre une connexion persistante à un serveur Ingres
    • ingres_prepare - Prépare une requête pour l'exécution
    • ingres_query - Envoie une requête SQL à Ingres
    • ingres_result_seek - Change la position de lecture des données
    • ingres_rollback - Annule une transaction Ingres
    • ingres_set_environment - Configure les directives contrôlant les résultats Ingres
    • ingres_unbuffered_query - Envoie une requête sans buffer à Ingres
    • ini_alter - Alias de ini_set
    • ini_get - Lit la valeur d'une option de configuration
    • ini_get_all - Lit toutes les valeurs de configuration
    • ini_restore - Restaure la valeur de l'option de configuration
    • ini_set - Modifie la valeur d'une option de configuration
    • inotify_add_watch - Ajoute un point de surveillance à une instance inotify
    • inotify_init - Initialise une instance inotify
    • inotify_queue_len - Retourne le nombre d'événements qui sont survenus
    • inotify_read - Lit les événements dans une instance inotify
    • inotify_rm_watch - Supprime un point de surveillance d'une instance inotify
    • intdiv - Division d'Entier
    • interface_exists - Vérifie si une interface a été définie
    • IntlBreakIterator::createCharacterInstance - Crée un itérateur pour les limites des séquences de caractères combinés
    • IntlBreakIterator::createCodePointInstance - Crée un itérateur pour les limites de points de code
    • IntlBreakIterator::createLineInstance - Crée un itérateur pour les coupures de lignes
    • IntlBreakIterator::createSentenceInstance - Crée un itérateur pour les coupures de phrase
    • IntlBreakIterator::createTitleInstance - Crée un itérateur
    • IntlBreakIterator::createWordInstance - Crée un itérateur pour les coupures de mot
    • IntlBreakIterator::current - Récupère l'index de la position courante
    • IntlBreakIterator::first - Définit la position au premier caractère du texte
    • IntlBreakIterator::following - Avance l'itérateur à la première limite suivant la position spécifiée
    • IntlBreakIterator::getErrorCode - Récupère le code de la dernière erreur survenue sur l'objet
    • IntlBreakIterator::getErrorMessage - Récupère le message de la dernière erreur survenue sur l'objet
    • IntlBreakIterator::getLocale - Récupère la locale associée avec l'objet
    • IntlBreakIterator::getPartsIterator - Crée un itérateur pour naviguer dans les fragments entre les limites
    • IntlBreakIterator::getText - Récupère le texte analysé
    • IntlBreakIterator::isBoundary - Indique si une position est une position limite
    • IntlBreakIterator::last - Définit la position de l'itérateur à l'index après le dernier caractère
    • IntlBreakIterator::next - Avance l'itérateur à la prochaine limite
    • IntlBreakIterator::preceding - Définit la position de l'itérateur à la première limite avant la position
    • IntlBreakIterator::previous - Définit la position de l'itérateur à la limite immédiate avant la courante
    • IntlBreakIterator::setText - Définit le texte à analyser
    • IntlBreakIterator::__construct - Constructeur privé pour désactiver l'instantiation
    • IntlCalendar::add - Ajoute une durée (signée) à un champ
    • IntlCalendar::after - Vérifie si l'objet temps courant est dans le futur par rapport à l'objet temps passé
    • IntlCalendar::before - Vérifie si l'objet temps est dans le passé par rapport à l'objet fourni
    • IntlCalendar::clear - Vide un ou tous les champs
    • IntlCalendar::createInstance - Crée un nouvel objet IntlCalendar
    • IntlCalendar::equals - Vérifie si deux objets IntlCalendar sont égaux
    • IntlCalendar::fieldDifference - Calcule la différence entre le temps donné et le temps de l'objet
    • IntlCalendar::fromDateTime - Create an IntlCalendar from a DateTime object or string
    • IntlCalendar::get - Récupère la valeur d'une propriété
    • IntlCalendar::getActualMaximum - The maximum value for a field, considering the object's current time
    • IntlCalendar::getActualMinimum - The minimum value for a field, considering the object's current time
    • IntlCalendar::getAvailableLocales - Get array of locales for which there is data
    • IntlCalendar::getDayOfWeekType - Tell whether a day is a weekday, weekend or a day that has a transition between the two
    • IntlCalendar::getErrorCode - Get last error code on the object
    • IntlCalendar::getErrorMessage - Get last error message on the object
    • IntlCalendar::getFirstDayOfWeek - Get the first day of the week for the calendar's locale
    • IntlCalendar::getGreatestMinimum - Get the largest local minimum value for a field
    • IntlCalendar::getKeywordValuesForLocale - Get set of locale keyword values
    • IntlCalendar::getLeastMaximum - Get the smallest local maximum for a field
    • IntlCalendar::getLocale - Get the locale associated with the object
    • IntlCalendar::getMaximum - Get the global maximum value for a field
    • IntlCalendar::getMinimalDaysInFirstWeek - Get minimal number of days the first week in a year or month can have
    • IntlCalendar::getMinimum - Get the global minimum value for a field
    • IntlCalendar::getNow - Récupère le nombre représentant la date courante
    • IntlCalendar::getRepeatedWallTimeOption - Get behavior for handling repeating wall time
    • IntlCalendar::getSkippedWallTimeOption - Get behavior for handling skipped wall time
    • IntlCalendar::getTime - Get time currently represented by the object
    • IntlCalendar::getTimeZone - Récupère le fuseau horaire de l'objet
    • IntlCalendar::getType - Récupère le type de calendrier
    • IntlCalendar::getWeekendTransition - Get time of the day at which weekend begins or ends
    • IntlCalendar::inDaylightTime - Whether the object's time is in Daylight Savings Time
    • IntlCalendar::isEquivalentTo - Whether another calendar is equal but for a different time
    • IntlCalendar::isLenient - Whether date/time interpretation is in lenient mode
    • IntlCalendar::isSet - Whether a field is set
    • IntlCalendar::isWeekend - Whether a certain date/time is in the weekend
    • IntlCalendar::roll - Add value to field without carrying into more significant fields
    • IntlCalendar::set - Set a time field or several common fields at once
    • IntlCalendar::setFirstDayOfWeek - Défini le jour de début de la semaine
    • IntlCalendar::setLenient - Set whether date/time interpretation is to be lenient
    • IntlCalendar::setMinimalDaysInFirstWeek - Set minimal number of days the first week in a year or month can have
    • IntlCalendar::setRepeatedWallTimeOption - Set behavior for handling repeating wall times at negative timezone offset transitions
    • IntlCalendar::setSkippedWallTimeOption - Set behavior for handling skipped wall times at positive timezone offset transitions
    • IntlCalendar::setTime - Défini le temps du calendrier en milliseconde depuis l'époque
    • IntlCalendar::setTimeZone - Défini le fuseau horaire utilisé par ce calendrier
    • IntlCalendar::toDateTime - Converti un objet IntlCalendar en un objet DateTime
    • IntlCalendar::__construct - Constructeur privé pour la désactivation de l'instanciation
    • IntlChar::charAge - Get the "age" of the code point
    • IntlChar::charDigitValue - Get the decimal digit value of a decimal digit character
    • IntlChar::charDirection - Get bidirectional category value for a code point
    • IntlChar::charFromName - Find Unicode character by name and return its code point value
    • IntlChar::charMirror - Get the "mirror-image" character for a code point
    • IntlChar::charName - Retrieve the name of a Unicode character
    • IntlChar::charType - Get the general category value for a code point
    • IntlChar::chr - Return Unicode character by code point value
    • IntlChar::digit - Get the decimal digit value of a code point for a given radix
    • IntlChar::enumCharNames - Enumerate all assigned Unicode characters within a range
    • IntlChar::enumCharTypes - Enumerate all code points with their Unicode general categories
    • IntlChar::foldCase - Perform case folding on a code point
    • IntlChar::forDigit - Get character representation for a given digit and radix
    • IntlChar::getBidiPairedBracket - Get the paired bracket character for a code point
    • IntlChar::getBlockCode - Get the Unicode allocation block containing a code point
    • IntlChar::getCombiningClass - Get the combining class of a code point
    • IntlChar::getFC_NFKC_Closure - Get the FC_NFKC_Closure property for a code point
    • IntlChar::getIntPropertyMaxValue - Get the max value for a Unicode property
    • IntlChar::getIntPropertyMinValue - Get the min value for a Unicode property
    • IntlChar::getIntPropertyValue - Get the value for a Unicode property for a code point
    • IntlChar::getNumericValue - Get the numeric value for a Unicode code point
    • IntlChar::getPropertyEnum - Get the property constant value for a given property name
    • IntlChar::getPropertyName - Get the Unicode name for a property
    • IntlChar::getPropertyValueEnum - Get the property value for a given value name
    • IntlChar::getPropertyValueName - Get the Unicode name for a property value
    • IntlChar::getUnicodeVersion - Get the Unicode version
    • IntlChar::hasBinaryProperty - Check a binary Unicode property for a code point
    • IntlChar::isalnum - Check if code point is an alphanumeric character
    • IntlChar::isalpha - Check if code point is a letter character
    • IntlChar::isbase - Check if code point is a base character
    • IntlChar::isblank - Check if code point is a "blank" or "horizontal space" character
    • IntlChar::iscntrl - Check if code point is a control character
    • IntlChar::isdefined - Check whether the code point is defined
    • IntlChar::isdigit - Check if code point is a digit character
    • IntlChar::isgraph - Check if code point is a graphic character
    • IntlChar::isIDIgnorable - Check if code point is an ignorable character
    • IntlChar::isIDPart - Check if code point is permissible in an identifier
    • IntlChar::isIDStart - Check if code point is permissible as the first character in an identifier
    • IntlChar::isISOControl - Check if code point is an ISO control code
    • IntlChar::isJavaIDPart - Check if code point is permissible in a Java identifier
    • IntlChar::isJavaIDStart - Check if code point is permissible as the first character in a Java identifier
    • IntlChar::isJavaSpaceChar - Check if code point is a space character according to Java
    • IntlChar::islower - Check if code point is a lowercase letter
    • IntlChar::isMirrored - Check if code point has the Bidi_Mirrored property
    • IntlChar::isprint - Check if code point is a printable character
    • IntlChar::ispunct - Check if code point is punctuation character
    • IntlChar::isspace - Check if code point is a space character
    • IntlChar::istitle - Check if code point is a titlecase letter
    • IntlChar::isUAlphabetic - Check if code point has the Alphabetic Unicode property
    • IntlChar::isULowercase - Check if code point has the Lowercase Unicode property
    • IntlChar::isupper - Check if code point has the general category "Lu" (uppercase letter)
    • IntlChar::isUUppercase - Check if code point has the Uppercase Unicode property
    • IntlChar::isUWhiteSpace - Check if code point has the White_Space Unicode property
    • IntlChar::isWhitespace - Check if code point is a whitespace character according to ICU
    • IntlChar::isxdigit - Check if code point is a hexadecimal digit
    • IntlChar::ord - Return Unicode code point value of character
    • IntlChar::tolower - Make Unicode character lowercase
    • IntlChar::totitle - Make Unicode character titlecase
    • IntlChar::toupper - Make Unicode character uppercase
    • IntlCodePointBreakIterator::getLastCodePoint - Récupère le dernier point de code après avoir avancé ou reculé dans l'itérateur
    • IntlDateFormatter::create - Crée un formateur de date
    • IntlDateFormatter::format - Formate la date et l'heure sous forme de chaîne
    • IntlDateFormatter::formatObject - Formate un objet
    • IntlDateFormatter::getCalendar - Lit le calendrier utilisé par l'objet IntlDateFormatter
    • IntlDateFormatter::getCalendarObject - Récupère une copie de l'objet formateur du calendrier
    • IntlDateFormatter::getDateType - Lit le type de date utilisé par IntlDateFormatter
    • IntlDateFormatter::getErrorCode - Lit le code d'erreur de la dernière opération
    • IntlDateFormatter::getErrorMessage - Lit le dernier message d'erreur
    • IntlDateFormatter::getLocale - Lit la locale utilisée par le formateur
    • IntlDateFormatter::getPattern - Lit le modèle utilisé par IntlDateFormatter
    • IntlDateFormatter::getTimeType - Lit le type de temps pour IntlDateFormatter
    • IntlDateFormatter::getTimeZone - Récupère le formateur du décalage horaire
    • IntlDateFormatter::getTimeZoneId - Lit le fuseau horaire de IntlDateFormatter
    • IntlDateFormatter::isLenient - Retourne la sévérité utilisée pour IntlDateFormatter
    • IntlDateFormatter::localtime - Analyse une chaîne et la converti en temps
    • IntlDateFormatter::parse - Analyse une chaîne vers un timestamp
    • IntlDateFormatter::setCalendar - Définit le type de calendrier utilisé par le formateur
    • IntlDateFormatter::setLenient - Configure la souplesse de l'analyseur
    • IntlDateFormatter::setPattern - Configure le modèle utilisé par le IntlDateFormatter
    • IntlDateFormatter::setTimeZone - Définit le formateur pour le décalage horaire
    • IntlGregorianCalendar::getGregorianChange - Get the Gregorian Calendar change date
    • IntlGregorianCalendar::isLeapYear - Determine if the given year is a leap year
    • IntlGregorianCalendar::setGregorianChange - Set the Gregorian Calendar the change date
    • IntlGregorianCalendar::__construct - Create the Gregorian Calendar class
    • IntlIterator::current - Récupère l'élément courant
    • IntlIterator::key - Récupère la clé courante
    • IntlIterator::next - Se déplace sur l'élément suivant
    • IntlIterator::rewind - Re-positionne l'itérateur au premier élément
    • IntlIterator::valid - Vérifie si la position courant est valide
    • IntlPartsIterator::getBreakIterator - Récupère IntlBreakIterator, sauvegardant ainsi cette partie de l'itérateur
    • IntlRuleBasedBreakIterator::getBinaryRules - Récupère la forme binaire des règles compilées
    • IntlRuleBasedBreakIterator::getRules - Récupère le jeu de règles utilisé pour créer cet objet
    • IntlRuleBasedBreakIterator::getRuleStatus - Récupère la valeur de statut la plus grande depuis les règles qui déterminent la position courante d'arrêt
    • IntlRuleBasedBreakIterator::getRuleStatusVec - Récupère les valeurs de statut depuis les règles d'arrêt qui déterminent la position d'arrêt courante
    • IntlRuleBasedBreakIterator::__construct - Crée un itérateur depuis un jeu de règles
    • IntlTimeZone::countEquivalentIDs - Récupère le nombre d'IDs dans le groupe d'équivalence qui inclut l'ID fourni
    • IntlTimeZone::createDefault - Crée une nouvelle copie du fuseau horaire par défaut pour cet hôte
    • IntlTimeZone::createEnumeration - Récupère une énumération d'IDs de fuseau horaire associés avec le pays fourni
    • IntlTimeZone::createTimeZone - Crée un objet de fuseau horaire pour l'ID fourni
    • IntlTimeZone::createTimeZoneIDEnumeration - Get an enumeration over system time zone IDs with the given filter conditions
    • IntlTimeZone::fromDateTimeZone - Crée un objet fuseau horaire depuis DateTimeZone
    • IntlTimeZone::getCanonicalID - Récupère l'identifiant du fuseau horaire système ou l'identifiant normalisé du fuseau horaire personnalisé pour l'ID du fuseau horaire fourni
    • IntlTimeZone::getDisplayName - Récupère un nom du fuseau horaire aux fins de présentation à l'utilisateur
    • IntlTimeZone::getDSTSavings - Récupère la durée à ajouter à l'heure locale pour récupérer l'heure murale locale
    • IntlTimeZone::getEquivalentID - Récupère un identifiant d'un groupe d'équivalence qui inclut l'identifiant fourni
    • IntlTimeZone::getErrorCode - Récupère le code de la dernière erreur survenue sur l'objet
    • IntlTimeZone::getErrorMessage - Récupère le message de la dernière erreur survenue sur l'objet
    • IntlTimeZone::getGMT - Crée un fuseau horaire GMT (UTC)
    • IntlTimeZone::getID - Récupère l'ID d'un fuseau horaire
    • IntlTimeZone::getIDForWindowsID - Translate a Windows timezone into a system timezone
    • IntlTimeZone::getOffset - Récupère le fuseau horaire brute, et la position GMT pour un moment dans le temps donné
    • IntlTimeZone::getRawOffset - Récupère la position brute GMT (avant de prendre en compte l'heure d'été)
    • IntlTimeZone::getRegion - Get the region code associated with the given system time zone ID
    • IntlTimeZone::getTZDataVersion - Récupère la version du fuseau horaire actuellement utilisé par ICU
    • IntlTimeZone::getUnknown - Get the "unknown" time zone
    • IntlTimeZone::getWindowsID - Translate a system timezone into a Windows timezone
    • IntlTimeZone::hasSameRules - Vérifie si cette zone a les mêmes règles qu'une autre
    • IntlTimeZone::toDateTimeZone - Convertit un objet DateTimeZone
    • IntlTimeZone::useDaylightTime - Vérifie si ce fuseau horaire utilise l'heure d'étét
    • intl_error_name - Lit le nom symbolique d'un code d'erreur donné
    • intl_get_error_code - Lit le dernier code d'erreur
    • intl_get_error_message - Lit la description de la dernière erreur
    • intl_is_failure - Vérifie si un code d'erreur indique un échec
    • intval - Retourne la valeur numérique entière équivalente d'une variable
    • in_array - Indique si une valeur appartient à un tableau
    • ip2long - Convertit une chaîne contenant une adresse (IPv4) en notation décimale à point en une adresse entier long
    • iptcembed - Intègre des données binaires IPTC dans une image JPEG
    • iptcparse - Analyse un bloc binaire IPTC et recherche les balises simples
    • isset - Détermine si une variable est déclarée et est différente de null
    • is_a - Vérifie si l'objet est une instance d'une classe donnée ou a cette classe parmi ses parents
    • is_array - Détermine si une variable est un tableau
    • is_bool - Détermine si une variable est un booléen
    • is_callable - Détermine si l'argument peut être appelé comme fonction
    • is_countable - Vérifie si le contenu de la variable est une valeur dénombrable
    • is_dir - Indique si le fichier est un dossier
    • is_double - Alias de is_float
    • is_executable - Indique si le fichier est exécutable
    • is_file - Indique si le fichier est un véritable fichier
    • is_finite - Indique si un nombre est fini
    • is_float - Détermine si une variable est de type nombre décimal
    • is_infinite - Indique si un nombre est infini
    • is_int - Détermine si une variable est de type nombre entier
    • is_integer - Alias de is_int
    • is_iterable - Détermine si le contenu de la variable est itérable.
    • is_link - Indique si le fichier est un lien symbolique
    • is_long - Alias de is_int
    • is_nan - Indique si une valeur n'est pas un nombre
    • is_null - Indique si une variable vaut null
    • is_numeric - Détermine si une variable est un nombre ou une chaîne numérique
    • is_object - Détermine si une variable est de type objet
    • is_readable - Indique si un fichier existe et est accessible en lecture
    • is_real - Alias de is_float
    • is_resource - Détermine si une variable est une ressource
    • is_scalar - Indique si une variable est un scalaire
    • is_soap_fault - Vérifie si SOAP retourne une erreur
    • is_string - Détermine si une variable est de type chaîne de caractères
    • is_subclass_of - Détermine si un objet est une sous-classe d'une classe donnée ou l'implémente
    • is_tainted - Vérifie si une chaîne est nettoyée
    • is_uploaded_file - Indique si le fichier a été téléchargé par HTTP POST
    • is_writable - Indique si un fichier est accessible en écriture
    • is_writeable - Alias de is_writable
    • Iterator::current - Retourne l'élément courant
    • Iterator::key - Retourne la clé de l'élément courant
    • Iterator::next - Se déplace sur l'élément suivant
    • Iterator::rewind - Replace l'itérateur sur le premier élément
    • Iterator::valid - Vérifie si la position courante est valide
    • IteratorAggregate::getIterator - Retourne un itérateur externe
    • IteratorIterator::current - Lit la valeur courante
    • IteratorIterator::getInnerIterator - Retourne l'itérateur interne
    • IteratorIterator::key - Lit la clé de l'élément courant
    • IteratorIterator::next - Avance au prochain élément
    • IteratorIterator::rewind - Retourne au premier élément
    • IteratorIterator::valid - Vérifie si un itérateur est valide
    • IteratorIterator::__construct - Crée un itérateur à partir d'un objet traversable
    • iterator_apply - Appelle une fonction pour tous les éléments d'un itérateur
    • iterator_count - Compte de nombre d'éléments dans un itérateur
    • iterator_to_array - Copie un itérateur dans un tableau
  • j
    • jddayofweek - Retourne le numéro du jour de la semaine
    • jdmonthname - Retourne le nom du mois
    • jdtofrench - Convertit le nombre de jours du calendrier Julien en date du calendrier français républicain
    • jdtogregorian - Convertit le nombre de jours du calendrier Julien en date grégorienne
    • jdtojewish - Convertit le nombre de jours du calendrier Julien en date du calendrier juif
    • jdtojulian - Convertit le nombre de jours du calendrier Julien en date du calendrier Julien
    • jdtounix - Convertit un jour Julien en timestamp UNIX
    • jewishtojd - Convertit une date du calendrier Juif en nombre de jours du calendrier Julien
    • join - Alias de implode
    • jpeg2wbmp - Convertit une image JPEG en image WBMP
    • JsonSerializable::jsonSerialize - Spécifie les données qui doivent être linéarisées en JSON
    • json_decode - Décode une chaîne JSON
    • json_encode - Retourne la représentation JSON d'une valeur
    • json_last_error - Retourne la dernière erreur JSON
    • json_last_error_msg - Retourne le message de la dernière erreur survenue lors de l'appel à la fonction json_encode() ou json_decode()
    • juliantojd - Convertit un jours du calendrier Julien en un nombre de jours du calendrier Julien
  • k
    • key - Retourne une clé d'un tableau associatif
    • key_exists - Alias de array_key_exists
    • krsort - Trie un tableau en sens inverse et suivant les clés
    • ksort - Trie un tableau suivant les clés
  • l
    • lcfirst - Met le premier caractère en minuscule
    • lcg_value - Générateur de congruence combinée linéaire
    • lchgrp - Change l'appartenance du groupe d'un lien symbolique
    • lchown - Change le propriétaire d'un lien symbolique
    • ldap_8859_to_t61 - Convertit les caractères 8859 en caractères t61
    • ldap_add - Ajoute une entrée dans un dossier LDAP
    • ldap_add_ext - Ajoute une entrée dans un dossier LDAP
    • ldap_bind - Authentification au serveur LDAP
    • ldap_bind_ext - Lie un dossier LDAP
    • ldap_close - Alias de ldap_unbind
    • ldap_compare - Compare une entrée avec des valeurs d'attributs
    • ldap_connect - Connexion à un serveur LDAP
    • ldap_control_paged_result - Envoi un contrôle de pagination LDAP
    • ldap_control_paged_result_response - Récupère le cookie de pagination LDAP
    • ldap_count_entries - Compte le nombre d'entrées après une recherche
    • ldap_delete - Efface une entrée dans un dossier
    • ldap_delete_ext - Supprime une entrée d'un dossier
    • ldap_dn2ufn - Convertit un DN en format UFN (User Friendly Naming)
    • ldap_err2str - Convertit un numéro d'erreur LDAP en message d'erreur
    • ldap_errno - Retourne le numéro d'erreur LDAP de la dernière commande exécutée
    • ldap_error - Retourne le message LDAP de la dernière commande LDAP
    • ldap_escape - Échappe une chaîne pour l'utiliser dans un filtre LDAP ou un DN
    • ldap_exop - Performs an extended operation
    • ldap_exop_passwd - PASSWD extended operation helper
    • ldap_exop_refresh - Refresh extended operation helper
    • ldap_exop_whoami - WHOAMI extended operation helper
    • ldap_explode_dn - Sépare les différents composants d'un DN
    • ldap_first_attribute - Retourne le premier attribut
    • ldap_first_entry - Retourne la première entrée
    • ldap_first_reference - Retourne la première référence
    • ldap_free_result - Libère la mémoire du résultat
    • ldap_get_attributes - Lit les attributs d'une entrée
    • ldap_get_dn - Lit le DN d'une entrée
    • ldap_get_entries - Lit toutes les entrées du résultat
    • ldap_get_option - Lit/écrit la valeur courante d'une option
    • ldap_get_values - Lit toutes les valeurs d'une entrée LDAP
    • ldap_get_values_len - Lit toutes les valeurs binaires d'une entrée
    • ldap_list - Recherche dans un niveau
    • ldap_modify - Alias de ldap_mod_replace
    • ldap_modify_batch - Mets en lot des modifications et les exécute sur une entrée LDAP
    • ldap_mod_add - Ajoute un attribut à l'entrée courante
    • ldap_mod_add_ext - Add attribute values to current attributes
    • ldap_mod_del - Efface un attribut à l'entrée courante
    • ldap_mod_del_ext - Delete attribute values from current attributes
    • ldap_mod_replace - Remplace un attribut dans l'entrée courante
    • ldap_mod_replace_ext - Replace attribute values with new ones
    • ldap_next_attribute - Lit l'attribut suivant
    • ldap_next_entry - Lit la prochaine entrée
    • ldap_next_reference - Lit la référence suivante
    • ldap_parse_exop - Parse result object from an LDAP extended operation
    • ldap_parse_reference - Extrait les informations d'une référence d'entrée
    • ldap_parse_result - Extrait des informations d'un résultat
    • ldap_read - Lit une entrée
    • ldap_rename - Modifie le nom d'une entrée
    • ldap_rename_ext - Modify the name of an entry
    • ldap_sasl_bind - Authentification au serveur LDAP en utilisant SASL
    • ldap_search - Recherche sur le serveur LDAP
    • ldap_set_option - Modifie la valeur d'une option LDAP
    • ldap_set_rebind_proc - Configure une fonction de retour pour refaire des liaisons lors de recherche de référants
    • ldap_sort - Trie les entrées d'un résultat LDAP côté client
    • ldap_start_tls - Démarre TLS
    • ldap_t61_to_8859 - Convertit les caractères t61 en caractères 8859
    • ldap_unbind - Déconnecte d'un serveur LDAP
    • Les options du contexte Phar - Liste des options du contexte Phar
    • levenshtein - Calcule la distance Levenshtein entre deux chaînes
    • libxml_clear_errors - Vide le buffer d'erreur libxml
    • libxml_disable_entity_loader - Désactive le chargement des entités externes
    • libxml_get_errors - Lit le tableau d'erreurs
    • libxml_get_last_error - Lit la dernière erreur libxml
    • libxml_set_external_entity_loader - Change le chargeur d'entités externes par défaut
    • libxml_set_streams_context - Configure le contexte de flux pour la prochaine opération libxml
    • libxml_use_internal_errors - Désactive le rapport d'erreur libxml et les stocke pour lecture ultérieure
    • LimitIterator::current - Récupère l'élément courant
    • LimitIterator::getInnerIterator - Récupère l'itérateur interne
    • LimitIterator::getPosition - Retourne la position courante
    • LimitIterator::key - Récupère la clé courante
    • LimitIterator::next - Déplace l'itérateur à la position suivante
    • LimitIterator::rewind - Replace l'itérateur au début
    • LimitIterator::seek - Place l'itérateur à une position donnée
    • LimitIterator::valid - Vérifie si l'élément courant est valide
    • LimitIterator::__construct - Construit un nouvel objet LimitIterator
    • link - Crée un lien
    • linkinfo - Renvoie les informations d'un lien
    • list - Assigne des variables comme si elles étaient un tableau
    • Locale::acceptFromHttp - Devine la meilleure locale à partir de l'en-tête HTTP "Accept-Language"
    • Locale::canonicalize - Canonise la chaîne représentant la locale
    • Locale::composeLocale - Retourne un identifiant de locale correct
    • Locale::filterMatches - Vérifie si le tag de langue correspond à une locale
    • Locale::getAllVariants - Liste toutes les variantes d'une locale
    • Locale::getDefault - Lit la valeur par défaut d'une locale pour la variable globale 'default_locale'
    • Locale::getDisplayLanguage - Retourne un nom approprié pour l'affichage d'un nom de langue
    • Locale::getDisplayName - Retourne un nom d'affichage correct pour une locale
    • Locale::getDisplayRegion - Retourne un nom pour la région de la locale
    • Locale::getDisplayScript - Retourne le nom du script de la locale
    • Locale::getDisplayVariant - Retourne un nom pour la variante de la locale
    • Locale::getKeywords - Lit les mots-clé de la locale
    • Locale::getPrimaryLanguage - Lit la langue principale de la locale
    • Locale::getRegion - Retourne un code pour la région de la locale
    • Locale::getScript - Retourne un code pour le script de la locale
    • Locale::lookup - Recherche dans la liste la meilleure langue
    • Locale::parseLocale - Retourne les sous-éléments de la locale
    • Locale::setDefault - Configure la locale par défaut
    • localeconv - Lit la configuration locale
    • localtime - Récupère l'heure locale
    • log - Logarithme naturel (népérien)
    • log1p - Calcule précisément log(1 + nombre)
    • log10 - Logarithme en base 10
    • log_cmd_delete - Fonction de rappel lors de la suppression des documents
    • log_cmd_insert - Fonction de rappel lors de l'insertion de documents
    • log_cmd_update - Fonction de rappel lors de la mise à jour de documents
    • log_getmore - Fonction de rappel lors de la récupération du prochain curseur du lot
    • log_killcursor - Fonction de rappel lors de l'exécution des opération KILLCURSOR
    • log_reply - Fonction de rappel lors de la lecture d'une réponse MongoDB
    • log_write_batch - Fonction de rappel pour écrire les lots
    • long2ip - Convertit une adresse entier long (IPv4) en sa notation décimale à point
    • lstat - Retourne les informations sur un fichier ou un lien symbolique
    • ltrim - Supprime les espaces (ou d'autres caractères) de début de chaîne
    • Lua::assign - Assigne une variable PHP à Lua
    • Lua::call - Appelle les fonctions Lua
    • Lua::eval - Évalue une chaîne comme du code Lua
    • Lua::getVersion - Le but de getversion
    • Lua::include - Analyse un fichier de script Lua
    • Lua::registerCallback - Enregistre une fonction PHP en Lua
    • Lua::__construct - Constructeur Lua
    • LuaClosure::__invoke - Appelle luaclosure
    • LuaSandbox::callFunction - Call a function in a Lua global variable
    • LuaSandbox::disableProfiler - Disable the profiler
    • LuaSandbox::enableProfiler - Enable the profiler.
    • LuaSandbox::getCPUUsage - Fetch the current CPU time usage of the Lua environment
    • LuaSandbox::getMemoryUsage - Fetch the current memory usage of the Lua environment
    • LuaSandbox::getPeakMemoryUsage - Fetch the peak memory usage of the Lua environment
    • LuaSandbox::getProfilerFunctionReport - Fetch profiler data
    • LuaSandbox::getVersionInfo - Return the versions of LuaSandbox and Lua
    • LuaSandbox::loadBinary - Load a precompiled binary chunk into the Lua environment
    • LuaSandbox::loadString - Load Lua code into the Lua environment
    • LuaSandbox::pauseUsageTimer - Pause the CPU usage timer
    • LuaSandbox::registerLibrary - Register a set of PHP functions as a Lua library
    • LuaSandbox::setCPULimit - Set the CPU time limit for the Lua environment
    • LuaSandbox::setMemoryLimit - Set the memory limit for the Lua environment
    • LuaSandbox::unpauseUsageTimer - Unpause the timer paused by LuaSandbox::pauseUsageTimer
    • LuaSandbox::wrapPhpFunction - Wrap a PHP callable in a LuaSandboxFunction
    • LuaSandboxFunction::call - Call a Lua function
    • LuaSandboxFunction::dump - Dump the function as a binary blob
    • LuaSandboxFunction::__construct - Unused
    • lzf_compress - Compression LZF
    • lzf_decompress - Décompression LZF
    • lzf_optimized_for - Détermine le mode d'optimisation de l'extension LZF
  • m
    • mail - Envoi de mail
    • mailparse_determine_best_xfer_encoding - Détermine le meilleur encodage pour un fichier
    • mailparse_msg_create - Crée une ressource email mime
    • mailparse_msg_extract_part - Extrait et décode une section de message
    • mailparse_msg_extract_part_file - Extrait et décode une section de message
    • mailparse_msg_extract_whole_part_file - Extrait une section de message incluant les en-têtes sans décoder l'encodage de transfert
    • mailparse_msg_free - Libère une ressource MIME
    • mailparse_msg_get_part - Retourne une ressource sur une section d'un message MIME
    • mailparse_msg_get_part_data - Retourne un tableau associatif avec des informations sur le message
    • mailparse_msg_get_structure - Retourne un tableau avec les différentes sections MIME du message
    • mailparse_msg_parse - Analyse incrémentalement des données dans un buffer
    • mailparse_msg_parse_file - Analyse un fichier
    • mailparse_rfc822_parse_addresses - Analyse des adresses
    • mailparse_stream_encode - Lit les données dans un fichier, applique l'encodage et envoie le résultat à destfp
    • mailparse_uudecode_all - Scanne les données du fichier et extrait tous les fichiers encodés qui s'y trouvent
    • main - Fausse documentation pour main
    • max - La plus grande valeur
    • mb_check_encoding - Vérifie si les chaînes sont valide pour l'encodage spécifié
    • mb_chr - Récupère un caractère spécifique
    • mb_convert_case - Modifie la casse d'une chaîne
    • mb_convert_encoding - Conversion d'encodage
    • mb_convert_kana - Convertit un "kana" en un autre ("zen-kaku", "han-kaku" et plus)
    • mb_convert_variables - Convertit l'encodage de variables
    • mb_decode_mimeheader - Décode un en-tête MIME
    • mb_decode_numericentity - Décode les entités HTML en caractères
    • mb_detect_encoding - Détecte un encodage
    • mb_detect_order - Lit/modifie l'ordre de détection des encodages
    • mb_encode_mimeheader - Encode une chaîne pour un en-tête MIME
    • mb_encode_numericentity - Encode les caractères en référence numérique HTML
    • mb_encoding_aliases - Récupère les aliases d'un type d'encodage connu
    • mb_ereg - Recherche par expression rationnelle avec support des caractères multi-octets
    • mb_eregi - Expression rationnelle insensible à la casse avec le support des caractères multi-octets
    • mb_eregi_replace - Expression rationnelle avec support des caractères multi-octets, sans tenir compte de la casse
    • mb_ereg_match - Expression rationnelle POSIX pour les chaînes multi-octets
    • mb_ereg_replace - Remplace des segments de chaîne à l'aide des expressions rationnelles
    • mb_ereg_replace_callback - Rechercher et remplacer par expression régulière avec support multi octets utilisant une fonction de callback
    • mb_ereg_search - Recherche par expression rationnelle multi-octets
    • mb_ereg_search_getpos - Retourne la position du début du prochain segment repéré par une expression rationnelle
    • mb_ereg_search_getregs - Lit le dernier segment de chaîne multi-octets qui correspond au masque
    • mb_ereg_search_init - Configure les chaînes et les expressions rationnelles pour le support des caractères multi-octets
    • mb_ereg_search_pos - Retourne la position et la longueur du segment de chaîne qui vérifie le masque de l'expression rationnelle
    • mb_ereg_search_regs - Retourne le segment de chaîne trouvé par une expression rationnelle multi-octets
    • mb_ereg_search_setpos - Choisit le point de départ de la recherche par expression rationnelle
    • mb_get_info - Lit la configuration interne de l'extension mbstring
    • mb_http_input - Détecte le type d'encodage d'un caractère HTTP
    • mb_http_output - Lit/modifie l'encodage d'affichage
    • mb_internal_encoding - Lit/modifie l'encodage interne
    • mb_language - Définit/Récupère le langage courant
    • mb_list_encodings - Retourne un tableau contenant tous les encodages supportés
    • mb_ord - Récupère le point de code d'un caractère
    • mb_output_handler - Fonction de traitement des affichages
    • mb_parse_str - Analyse les données HTTP GET/POST/COOKIE et assigne les variables globales
    • mb_preferred_mime_name - Détecte l'encodage MIME
    • mb_regex_encoding - Définit/Récupère l'encodage des caractères pour les expressions rationnelles multi-octets
    • mb_regex_set_options - Lit et modifie les options des fonctions d'expression rationnelle à support de caractères multi-octets
    • mb_scrub - Description
    • mb_send_mail - Envoie un mail encodé
    • mb_split - Scinde une chaîne en tableau avec une expression rationnelle multi-octets
    • mb_strcut - Coupe une partie de chaîne
    • mb_strimwidth - Tronque une chaîne
    • mb_stripos - Trouve la première occurrence d'une chaîne dans une autre, sans tenir compte de la casse
    • mb_stristr - Trouve la première occurrence d'une chaîne dans une autre, sans tenir compte de la casse
    • mb_strlen - Retourne la taille d'une chaîne
    • mb_strpos - Repère la première occurrence d'un caractère dans une chaîne
    • mb_strrchr - Trouve la dernière occurrence d'un caractère d'une chaîne dans une autre
    • mb_strrichr - Trouve la dernière occurrence d'un caractère d'une chaîne dans une autre, insensible à la casse
    • mb_strripos - Trouve la position de la dernière occurrence d'une chaîne dans une autre, en ne tenant pas compte de la casse
    • mb_strrpos - Repère la dernière occurrence d'un caractère dans une chaîne
    • mb_strstr - Trouve la première occurrence d'une chaîne dans une autre
    • mb_strtolower - Met tous les caractères en minuscules
    • mb_strtoupper - Met tous les caractères en majuscules
    • mb_strwidth - Retourne la taille d'une chaîne
    • mb_str_split - Given a multibyte string, return an array of its characters
    • mb_substitute_character - Définit/Récupère les caractères de substitution
    • mb_substr - Lit une sous-chaîne
    • mb_substr_count - Compte le nombre d'occurrences d'une sous-chaîne
    • mcrypt_cbc - Chiffre/déchiffre des données en mode CBC
    • mcrypt_cfb - Chiffre/déchiffre des données en mode CFB
    • mcrypt_create_iv - Crée un vecteur d'initialisation (IV) à partir d'une source aléatoire
    • mcrypt_decrypt - Déchiffre un texte avec les paramètres donnés
    • mcrypt_ecb - Obsolète : Chiffre/déchiffre des données en mode ECB
    • mcrypt_encrypt - Chiffre un texte
    • mcrypt_enc_get_algorithms_name - Retourne le nom de l'algorithme de chiffrement
    • mcrypt_enc_get_block_size - Retourne la taille du bloc d'un algorithme
    • mcrypt_enc_get_iv_size - Retourne la taille du VI d'un algorithme
    • mcrypt_enc_get_key_size - Retourne la taille maximale de la clé pour un mode
    • mcrypt_enc_get_modes_name - Retourne le nom du mode
    • mcrypt_enc_get_supported_key_sizes - Retourne un tableau contenant les tailles de clés acceptées par un algorithme
    • mcrypt_enc_is_block_algorithm - Teste le chiffrement par blocs d'un algorithme
    • mcrypt_enc_is_block_algorithm_mode - Teste le chiffrement par blocs d'un mode
    • mcrypt_enc_is_block_mode - Teste si le mode retourne les données par blocs
    • mcrypt_enc_self_test - Teste un module ouvert
    • mcrypt_generic - Chiffre les données
    • mcrypt_generic_deinit - Prépare le module pour le déchargement
    • mcrypt_generic_end - Termine un chiffrement
    • mcrypt_generic_init - Initialise tous les buffers nécessaires
    • mcrypt_get_block_size - Retourne la taille de blocs d'un chiffrement
    • mcrypt_get_cipher_name - Lit le nom du chiffrement utilisé
    • mcrypt_get_iv_size - Retourne la taille du VI utilisé par un couple chiffrement/mode
    • mcrypt_get_key_size - Retourne la taille de la clé de chiffrement
    • mcrypt_list_algorithms - Liste tous les algorithmes de chiffrement supportés
    • mcrypt_list_modes - Liste tous les modes de chiffrement supportés
    • mcrypt_module_close - Décharge le module de chiffrement
    • mcrypt_module_get_algo_block_size - Retourne la taille de blocs d'un algorithme
    • mcrypt_module_get_algo_key_size - Retourne la taille maximale de clé
    • mcrypt_module_get_supported_key_sizes - Retourne un tableau contenant les tailles de clés supportées par l'algorithme ouvert
    • mcrypt_module_is_block_algorithm - Indique si un algorithme fonctionne par blocs
    • mcrypt_module_is_block_algorithm_mode - Indique si un mode fonctionne par blocs
    • mcrypt_module_is_block_mode - Indique si un mode travaille par blocs
    • mcrypt_module_open - Ouvre le module de l'algorithme et du mode à utiliser
    • mcrypt_module_self_test - Teste un mode
    • mcrypt_ofb - Chiffre/déchiffre des données en mode OFB
    • md5 - Calcule le md5 d'une chaîne
    • md5_file - Calcule le md5 d'un fichier
    • mdecrypt_generic - Déchiffre les données
    • Memcache::add - Ajoute un élément dans le server
    • Memcache::addServer - Ajoute un serveur memcache à la liste de connexion
    • Memcache::close - Ferme la connexion avec le serveur Memcache
    • Memcache::connect - Ouvre une connexion avec le serveur Memcache
    • Memcache::decrement - Décrémente la valeur d'un élément
    • Memcache::delete - Efface un élément du serveur de cache
    • Memcache::flush - Efface tous les éléments existant sur le serveur de cache
    • Memcache::get - Récupère un élément du serveur de cache
    • Memcache::getExtendedStats - Récupère des statistiques de tous les serveurs dans la liste
    • Memcache::getServerStatus - Retourne le statut du serveur
    • Memcache::getStats - Lit les statistiques du serveur
    • Memcache::getVersion - Retourne le numéro de version du serveur
    • Memcache::increment - Incrément la valeur d'un élément
    • Memcache::pconnect - Ouvre un connexion persistante à un serveur de cache
    • Memcache::replace - Remplace une valeur d'un élément existant
    • Memcache::set - Stocke des données dans le serveur de cache
    • Memcache::setCompressThreshold - Active la compression automatique des valeurs larges
    • Memcache::setServerParams - Modifit les paramètres et les statuts du serveur pendant l'exécution
    • Memcached::add - Ajoute un nouvel élément sous une nouvelle clé
    • Memcached::addByKey - Ajoute un élément sur un serveur désigné
    • Memcached::addServer - Ajoute un serveur au pool
    • Memcached::addServers - Ajoute plusieurs serveurs au pool
    • Memcached::append - Ajoute des données à un élément
    • Memcached::appendByKey - Ajoute des données à un élément
    • Memcached::cas - Compare et échange un élément
    • Memcached::casByKey - Compare et échange un élément sur un serveur
    • Memcached::decrement - Décrémente une valeur numérique
    • Memcached::decrementByKey - Décrémente une valeur numérique d'un élément, stocké sur un serveur spécifique
    • Memcached::delete - Efface un élément
    • Memcached::deleteByKey - Supprime un élément d'un serveur spécifique
    • Memcached::deleteMulti - Supprime plusieurs éléments
    • Memcached::deleteMultiByKey - Supprime plusieurs éléments depuis un serveur spécifique
    • Memcached::fetch - Lit le prochain résultat
    • Memcached::fetchAll - Lit tous les autres éléments
    • Memcached::flush - Invalide tous les éléments du cache
    • Memcached::get - Lit un élément
    • Memcached::getAllKeys - Récupère toutes les clés stockés sur tous les serveurs
    • Memcached::getByKey - Lit un élément sur un serveur spécifique
    • Memcached::getDelayed - Lit plusieurs éléments
    • Memcached::getDelayedByKey - Lit plusieurs éléments sur un serveur
    • Memcached::getMulti - Lit plusieurs éléments
    • Memcached::getMultiByKey - Lit plusieurs éléments d'un serveur spécifique
    • Memcached::getOption - Lit une option Memcached
    • Memcached::getResultCode - Retourne le code de résultat de la dernière opération
    • Memcached::getResultMessage - Retourne un message décrivant le résultat de la dernière opération
    • Memcached::getServerByKey - Dirige une clé sur un serveur
    • Memcached::getServerList - Liste les serveurs du pool memcached
    • Memcached::getStats - Lit des statistiques du pool de serveurs
    • Memcached::getVersion - Lit les informations de version du pool serveur
    • Memcached::increment - Incrémente numériquement un élément
    • Memcached::incrementByKey - Incrémente une valeur numérique d'un élément, stocké sur un serveur spécifique
    • Memcached::isPersistent - Vérifie si une connexion persistente vers memcache est en cours d'utilisation
    • Memcached::isPristine - Vérifie si l'instance a été créée récemment
    • Memcached::prepend - Préfixe des données à un élément existant
    • Memcached::prependByKey - Préfixe un élément existant
    • Memcached::quit - Ferme toutes les connexions ouvertes
    • Memcached::replace - Remplace un élément sous une clé
    • Memcached::replaceByKey - Remplace un élément spécifique sur un serveur désigné
    • Memcached::resetServerList - Supprime tous les serveurs depuis la liste des serveurs
    • Memcached::set - Stocke un élément
    • Memcached::setByKey - Stocke un élément sur un serveur spécifique
    • Memcached::setMulti - Stocke plusieurs éléments
    • Memcached::setMultiByKey - Stocke plusieurs éléments sur un serveur
    • Memcached::setOption - Configure une option Memcached
    • Memcached::setOptions - Définit des options Memcache
    • Memcached::setSaslAuthData - Définit les informations à utiliser pour l'authentification
    • Memcached::touch - Définit une nouvelle expiration sur un élément
    • Memcached::touchByKey - Définit une nouvelle expiration sur un élément d'un serveur spécifique
    • Memcached::__construct - Crée un objet Memcached
    • memcache_debug - Active ou non l'affichage des informations de déboguage
    • memory_get_peak_usage - Retourne la quantité de mémoire maximale allouée par PHP
    • memory_get_usage - Indique la quantité de mémoire utilisée par PHP
    • MessageFormatter::create - Construit un nouveau formateur de messages
    • MessageFormatter::format - Formate un message
    • MessageFormatter::formatMessage - Formate rapidement un message
    • MessageFormatter::getErrorCode - Lit le dernier code d'erreur de la dernière opération
    • MessageFormatter::getErrorMessage - Lit le message d'erreur de la dernière opération
    • MessageFormatter::getLocale - Lit la locale avec la quelle le formateur a été créé
    • MessageFormatter::getPattern - Lit le modèle utilisé par le formateur de messages
    • MessageFormatter::parse - Analyse une chaîne en fonction du modèle
    • MessageFormatter::parseMessage - Analyse rapidement une chaîne
    • MessageFormatter::setPattern - Configure le modèle utilisé par le formateur
    • metaphone - Calcule la clé metaphone
    • method_exists - Vérifie si la méthode existe pour une classe
    • mhash - Calcule un hash
    • mhash_count - Récupère l'identifiant maximal de hash
    • mhash_get_block_size - Retourne la taille de bloc du hash
    • mhash_get_hash_name - Retourne le nom du hash
    • mhash_keygen_s2k - Génère une clé
    • microtime - Retourne le timestamp UNIX actuel avec les microsecondes
    • mime_content_type - Détecte le type de contenu d'un fichier
    • min - La plus petite valeur
    • mkdir - Crée un dossier
    • mktime - Retourne le timestamp UNIX d'une date
    • money_format - Met un nombre au format monétaire
    • Mongo::connectUtil - Se connecte à un serveur Mongo
    • Mongo::getPoolSize - Récupère la taille de la file d'attente pour les connexions
    • Mongo::getSlave - Retourne l'adresse à utiliser pour les lectures slaveOkay
    • Mongo::getSlaveOkay - Récupère la configuration de slaveOkay pour cette collection
    • Mongo::poolDebug - Retourne des informations sur les pools de connexion
    • Mongo::setPoolSize - Affecte la taille des futurs pools de connexion
    • Mongo::setSlaveOkay - Modifie la configuration de slaveOkay pour cette collection
    • Mongo::switchSlave - Choisit un nouvel secondaire pour les lectures slaveOkay
    • Mongo::__construct - Le but de __construct
    • MongoBinData::__construct - Crée un nouvel objet de données binaires
    • MongoBinData::__toString - La représentation en chaîne de l'objet binaire
    • MongoClient::close - Ferme la connexion
    • MongoClient::connect - Ouvre une connexion au serveur de base de données
    • MongoClient::dropDB - Supprime une base de données [obsolète]
    • MongoClient::getConnections - Retourne des informations sur toutes les connexions ouvertes
    • MongoClient::getHosts - Met à jour les statuts de tous les hôtes associés
    • MongoClient::getReadPreference - Récupère les préférences de lecture pour cette connexion
    • MongoClient::getWriteConcern - Récupère la préoccupation d'écriture pour cette connexion
    • MongoClient::killCursor - Supprime un curseur spécifique du serveur
    • MongoClient::listDBs - Liste toutes les bases de données disponibles
    • MongoClient::selectCollection - Lit une collection de base de données
    • MongoClient::selectDB - Récupère une base de données
    • MongoClient::setReadPreference - Définit les préférences de lecture pour cette connexion
    • MongoClient::setWriteConcern - Défini la préoccupation d'écriture pour cette connexion
    • MongoClient::__construct - Crée un nouvel objet de connexion à une base de données
    • MongoClient::__get - Récupère une base de données
    • MongoClient::__toString - Produit une représentation sous forme de chaîne de la connexion
    • MongoCode::__construct - Crée un nouvel objet de code
    • MongoCode::__toString - Retourne le code sous forme de chaîne
    • MongoCollection::aggregate - Effectue une agrégation en utilisant le framework dédié
    • MongoCollection::aggregateCursor - Exécute une commande d'agrégation, et récupère les résultats via un curseur
    • MongoCollection::batchInsert - Insère plusieurs documents dans la collection
    • MongoCollection::count - Compte le nombre de documents de cette collection
    • MongoCollection::createDBRef - Crée une référence de base de données
    • MongoCollection::createIndex - Crée un index sur le ou les champs spécifiés s'il n'existe pas déjà
    • MongoCollection::deleteIndex - Supprime un index de la collection
    • MongoCollection::deleteIndexes - Supprime tous les index de cette collection
    • MongoCollection::distinct - Retourne une liste de valeurs distinctes d'une collection pour la clé donnée
    • MongoCollection::drop - Supprime cette collection
    • MongoCollection::ensureIndex - Crée un index sur le ou les champs spécifiés s'il n'existe pas déjà
    • MongoCollection::find - Interroge une collection, et retourne comme jeu de résultats un objet MongoCursor
    • MongoCollection::findAndModify - Met à jour un document et le retourne
    • MongoCollection::findOne - Interroge cette collection, retourne un seul élément
    • MongoCollection::getDBRef - Lit une référence de base de données
    • MongoCollection::getIndexInfo - Retourne des informations sur les indexes de cette collection
    • MongoCollection::getName - Retourne le nom de cette collection
    • MongoCollection::getReadPreference - Récupère les préférences de lecture pour cette collection
    • MongoCollection::getSlaveOkay - Récupère la configuration slaveOkay pour cette collection
    • MongoCollection::getWriteConcern - Récupère la préoccupation d'écriture de cette collection
    • MongoCollection::group - Effecture une opération de regroupement
    • MongoCollection::insert - Insère un document dans la collection
    • MongoCollection::parallelCollectionScan - Retourne un tableau de curseurs pour parcourir une collection complète en parallèle
    • MongoCollection::remove - Supprime un enregistrement d'une collection
    • MongoCollection::save - Sauvegarde un document dans une collection
    • MongoCollection::setReadPreference - Définit les préférences de lecture pour cette collection
    • MongoCollection::setSlaveOkay - Modifie la configuration de slaveOkay pour cette collection
    • MongoCollection::setWriteConcern - Défini la préoccupation d'écriture pour cette base de données
    • MongoCollection::toIndexString - Convertit les clés spécifiant un index en une chaîne de caractères
    • MongoCollection::update - Modifie les enregistrements
    • MongoCollection::validate - Valide la collection
    • MongoCollection::__construct - Crée une nouvelle collection
    • MongoCollection::__get - Récupère une collection
    • MongoCollection::__toString - Retourne la répresentation en chaîne de cette collection
    • MongoCommandCursor::batchSize - Limite le nombre d'éléments retournés dans un lot
    • MongoCommandCursor::createFromDocument - Crée un nouveau curseur de commande depuis un document de commande existant
    • MongoCommandCursor::current - Retourne l'élément courant
    • MongoCommandCursor::dead - Vérifie s'il y a des documents qui n'ont pas encore été envoyés depuis la base de données
    • MongoCommandCursor::getReadPreference - Récupère les préférences de lecture pour cette commande
    • MongoCommandCursor::info - Récupère des informations sur la création du curseur et son itération
    • MongoCommandCursor::key - Retourne l'index du résultat courant du jeu de résultats
    • MongoCommandCursor::next - Avance le curseur au prochain résultat
    • MongoCommandCursor::rewind - Exécute la commande, et replace le curseur au début du jeu de résultats
    • MongoCommandCursor::setReadPreference - Défini les préférences de lecture pour cette commande
    • MongoCommandCursor::timeout - Défini le délai d'attente maximal côté client pour cette commande
    • MongoCommandCursor::valid - Vérifie si le curseur lit un résultat valide
    • MongoCommandCursor::__construct - Crée un nouveau curseur de commande
    • MongoCursor::addOption - Ajoute une paire clé/valeur de haut niveau à la requête
    • MongoCursor::awaitData - Définit si le curseur doit attendre un curseur tailable pour retourner plus de données
    • MongoCursor::batchSize - Limite le nombre de résultats retourné pour un lot
    • MongoCursor::count - Compte le nombre de résultats pour cette requête
    • MongoCursor::current - Retourne l'élément courant
    • MongoCursor::dead - Vérifie s'il reste des résultats non envoyés depuis la base de données
    • MongoCursor::doQuery - Exécute la requête Mongo
    • MongoCursor::explain - Retourne une explication de la requête, souvent utile pour le déboguage et l'optimisation
    • MongoCursor::fields - Définit les champs d'une requête
    • MongoCursor::getNext - Avance le curseur au prochain résultat, et le retourne
    • MongoCursor::getReadPreference - Récupère les préférences de lecture pour cette requête
    • MongoCursor::hasNext - Vérifie s'il y a encore des éléments pour ce curseur
    • MongoCursor::hint - Donne des indications à la base de données pour la requête
    • MongoCursor::immortal - Définit si le curseur doit s'interrompre après un certain délai
    • MongoCursor::info - Récupère les informations sur la création du curseur et son itération
    • MongoCursor::key - Retourne l'identifiant du résultat courant ou son index dans le jeu de résultats
    • MongoCursor::limit - Limite le nombre de résultats retournés
    • MongoCursor::maxTimeMS - Défini le délai d'attente maximal côté serveur pour la requête
    • MongoCursor::next - Avance le curseur au prochain résultat et le retourne
    • MongoCursor::partial - Si la requête doit récupérer des résultats partiels depuis mongos si un partage est inaccessible
    • MongoCursor::reset - Efface le curseur
    • MongoCursor::rewind - Retourne le curseur au début du jeu de résultats
    • MongoCursor::setFlag - Définit des drapeaux dans le cas où aucune méthode dédiée n'est disponible
    • MongoCursor::setReadPreference - Définit les préférences de lecture pour cette requête
    • MongoCursor::skip - Omet les premiers résultats
    • MongoCursor::slaveOkay - Définit si la requête peut être effectuée sur un serveur secondaire (obsolète)
    • MongoCursor::snapshot - Utilise le mode de capture pour la requête
    • MongoCursor::sort - Trie les résultats par ordre de champs
    • MongoCursor::tailable - Définit si le curseur doit être conservé ouvert après la récupération du dernier résultat
    • MongoCursor::timeout - Défini un délai maximum d'attente côté client pour cette requête
    • MongoCursor::valid - Vérifie si le curseur lit un résultat valide
    • MongoCursor::__construct - Crée un nouveau curseur
    • MongoCursorException::getHost - Récupère le nom de l'hôte sur lequel une erreur est survenue
    • MongoCursorInterface::batchSize - Limite le nombre d'éléments retourné dans un lot
    • MongoCursorInterface::dead - Vérifie s'il y a des résultats qui n'ont pas encore été envoyés depuis la base de données
    • MongoCursorInterface::getReadPreference - Récupère les préférence de lecture pour cette requête
    • MongoCursorInterface::info - Récupère des informations sur la création du curseur et son itération
    • MongoCursorInterface::setReadPreference - Définit les préférences de lecture pour cette requête
    • MongoCursorInterface::timeout - Définit un délai maximal d'attente côté client pour cette requête
    • MongoDate::toDateTime - Retourne un objet DateTime représentant cette date
    • MongoDate::__construct - Crée une nouvelle date
    • MongoDate::__toString - Retourne la date sous forme de chaîne
    • MongoDB::authenticate - Identification à une base de données
    • MongoDB::command - Exécute une commande de base de données
    • MongoDB::createCollection - Crée une collection
    • MongoDB::createDBRef - Crée une référence de base de données
    • MongoDB::drop - Supprime cette base de données
    • MongoDB::dropCollection - Supprime une collection [obsolète]
    • MongoDB::execute - Exécute le code JavaScript sur la base de données [Obsolète]
    • MongoDB::forceError - Crée une erreur de base de données
    • MongoDB::getCollectionInfo - Retourne des informations sur les collections de cette base de données
    • MongoDB::getCollectionNames - Récupère un tableau de noms pour toutes les collections de cette base de données
    • MongoDB::getDBRef - Lit le contenu d'une référence de base de données
    • MongoDB::getGridFS - Manipulations des fichiers dans la base
    • MongoDB::getProfilingLevel - Lit le niveau de profilage de la base de données
    • MongoDB::getReadPreference - Récupère les préférences de lecture pour cette base de données
    • MongoDB::getSlaveOkay - Récupère la configuration de slaveOkay pour cette base de données
    • MongoDB::getWriteConcern - Récupère la préoccupation d'écriture pour cette base de données
    • MongoDB::lastError - Vérifie s'il y a une erreur sur la dernière opération relative à la base de données
    • MongoDB::listCollections - Récupère un tableau des objets MongoCollections pour toutes les collections de cette base de données
    • MongoDB::prevError - Vérifie la dernière erreur émise lors d'une opération relative à la base de données
    • MongoDB::repair - Répare et compacte une base de données
    • MongoDB::resetError - Efface toutes les erreurs d'une base de données
    • MongoDB::selectCollection - Lit une collection
    • MongoDB::setProfilingLevel - Configure le niveau de profilage de la base de données
    • MongoDB::setReadPreference - Définit les préférences de lecture pour cette base de données
    • MongoDB::setSlaveOkay - Modifie la configuration de slaveOkay pour cette base de données
    • MongoDB::setWriteConcern - Défini la préoccupation d'écriture pour cette base de données
    • MongoDB::__construct - Crée une nouvelle base de données Mongo
    • MongoDB::__get - Récupère une collection
    • MongoDB::__toString - Le nom de cette base de données Mongo
    • MongoDBRef::create - Crée un nouvelle référence de base de données
    • MongoDBRef::get - Lit l'objet identifié par la référence
    • MongoDBRef::isRef - Vérifie si un tableau est une référence de base de données
    • MongoDB\BSON\Binary::getData - Retourne les données de Binary
    • MongoDB\BSON\Binary::getType - Retourne le type de Binary
    • MongoDB\BSON\Binary::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\Binary::serialize - Sérialise un Binary
    • MongoDB\BSON\Binary::unserialize - Désérialise un Binary
    • MongoDB\BSON\Binary::__construct - Construit un nouveau binaire
    • MongoDB\BSON\Binary::__toString - Retourne les données de Binary
    • MongoDB\BSON\BinaryInterface::getData - Retourne les données de BinaryInterface
    • MongoDB\BSON\BinaryInterface::getType - Retourne le type de BinaryInterface
    • MongoDB\BSON\BinaryInterface::__toString - Retourne les données de BinaryInterface
    • MongoDB\BSON\DBPointer::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\DBPointer::serialize - Sérialise un DBPointer
    • MongoDB\BSON\DBPointer::unserialize - Désérialisé un DBPointer
    • MongoDB\BSON\DBPointer::__construct - Construit un nouveau DBPointer (inutilisé)
    • MongoDB\BSON\DBPointer::__toString - Retourne une chaîne vide
    • MongoDB\BSON\Decimal128::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\Decimal128::serialize - Sérialise un Decimal128
    • MongoDB\BSON\Decimal128::unserialize - Désérialisé un Decimal128
    • MongoDB\BSON\Decimal128::__construct - Construit un nouveau Decimal128
    • MongoDB\BSON\Decimal128::__toString - Retourne la représentation sous forme de chaîne de caractère de Decimal128
    • MongoDB\BSON\Decimal128Interface::__toString - Retourne une représentation sous chaîne de caractères de Decimal128Interface
    • MongoDB\BSON\fromJSON - Retourne la représentation BSON d'une valeur JSON
    • MongoDB\BSON\fromPHP - Retourne la représentation BSON d'une valeur PHP
    • MongoDB\BSON\Int64::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\Int64::serialize - Sérialise un Int64
    • MongoDB\BSON\Int64::unserialize - Désérialisé un Int64
    • MongoDB\BSON\Int64::__construct - Construit un nouveau Int64 (inutilisé)
    • MongoDB\BSON\Int64::__toString - Retourne la représentation sous forme de chaîne de caractère de Int64
    • MongoDB\BSON\Javascript::getCode - Retourne le code Javascript
    • MongoDB\BSON\Javascript::getScope - Retourne le document de portée de Javascript
    • MongoDB\BSON\Javascript::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\Javascript::serialize - Sérialise un Javascript
    • MongoDB\BSON\Javascript::unserialize - Désérialisé un Javascript
    • MongoDB\BSON\Javascript::__construct - Construit un nouvel objet Javascript
    • MongoDB\BSON\Javascript::__toString - Retourne le code Javascript
    • MongoDB\BSON\JavascriptInterface::getCode - Retourne le code de JavascriptInterface
    • MongoDB\BSON\JavascriptInterface::getScope - Retourne le document de portée de JavascriptInterface
    • MongoDB\BSON\JavascriptInterface::__toString - Retourne le code de JavascriptInterface
    • MongoDB\BSON\MaxKey::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\MaxKey::serialize - Sérialise un MaxKey
    • MongoDB\BSON\MaxKey::unserialize - Désérialisé un MaxKey
    • MongoDB\BSON\MaxKey::__construct - Construit un nouveau MaxKey
    • MongoDB\BSON\MinKey::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\MinKey::serialize - Sérialise un MinKey
    • MongoDB\BSON\MinKey::unserialize - Désérialisé un MinKey
    • MongoDB\BSON\MinKey::__construct - Construit un nouveau MinKey
    • MongoDB\BSON\ObjectId::getTimestamp - Retourne le composant d'horodatage de ObjectId
    • MongoDB\BSON\ObjectId::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\ObjectId::serialize - Sérialise un ObjectId
    • MongoDB\BSON\ObjectId::unserialize - Désérialisé un ObjectId
    • MongoDB\BSON\ObjectId::__construct - Construit un nouvel ObjectId
    • MongoDB\BSON\ObjectId::__toString - Retourne la représentation hexadécimale de cet ObjectId
    • MongoDB\BSON\ObjectIdInterface::getTimestamp - Retourne le composant d'horodatage de ObjectIdInterface
    • MongoDB\BSON\ObjectIdInterface::__toString - Retourne la représentation hexadécimale de ObjectIdInterface
    • MongoDB\BSON\Regex::getFlags - Retourne les drapeux de la REGEX
    • MongoDB\BSON\Regex::getPattern - Retourne le masque du REGEX
    • MongoDB\BSON\Regex::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\Regex::serialize - Sérialise un Regex
    • MongoDB\BSON\Regex::unserialize - Désérialisé un Regex
    • MongoDB\BSON\Regex::__construct - Construit une nouvelle REGEX
    • MongoDB\BSON\Regex::__toString - Retourne la chaîne représentant cette REGEX
    • MongoDB\BSON\RegexInterface::getFlags - Retourne les drapeaux de RegexInterface
    • MongoDB\BSON\RegexInterface::getPattern - Retourne le masque de RegexInterface
    • MongoDB\BSON\RegexInterface::__toString - Retourne la représentation sous forme de chaîne de caractère de cette RegexInterface
    • MongoDB\BSON\Serializable::bsonSerialize - Fournit un tableau ou un document à sérialiser en tant que BSON
    • MongoDB\BSON\Symbol::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\Symbol::serialize - Sérialise un Symbol
    • MongoDB\BSON\Symbol::unserialize - Désérialisé un Symbol
    • MongoDB\BSON\Symbol::__construct - Construit un nouveau Symbol (inutilisé)
    • MongoDB\BSON\Symbol::__toString - Retourne la représentation sous forme de chaîne de caractère de Symbol
    • MongoDB\BSON\Timestamp::getIncrement - Retourne le composant d'incrémentation de ce Timestamp
    • MongoDB\BSON\Timestamp::getTimestamp - Retourne le composant d'horodatage de Timestamp
    • MongoDB\BSON\Timestamp::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\Timestamp::serialize - Sérialise un Timestamp
    • MongoDB\BSON\Timestamp::unserialize - Désérialisé un Timestamp
    • MongoDB\BSON\Timestamp::__construct - Contruit un nouveau Timestamp
    • MongoDB\BSON\Timestamp::__toString - Retourne la représentation sous forme de chaîne de cet horodatage
    • MongoDB\BSON\TimestampInterface::getIncrement - Retourne le composant d'incrémentation de ce TimestampInterface
    • MongoDB\BSON\TimestampInterface::getTimestamp - Retourne le composant d'horodatage de TimestampInterface
    • MongoDB\BSON\TimestampInterface::__toString - Retourne la représentation sous forme de chaîne de caractère de TimestampInterface
    • MongoDB\BSON\toCanonicalExtendedJSON - Returns the Canonical Extended JSON representation of a BSON value
    • MongoDB\BSON\toJSON - Retourne la représentation JSON étendue héritée d'une valeur BSON
    • MongoDB\BSON\toPHP - Returns the PHP representation of a BSON value
    • MongoDB\BSON\toRelaxedExtendedJSON - Returns the Relaxed Extended JSON representation of a BSON value
    • MongoDB\BSON\Undefined::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\Undefined::serialize - Sérialise un Undefined
    • MongoDB\BSON\Undefined::unserialize - Désérialisé un Undefined
    • MongoDB\BSON\Undefined::__construct - Construit un nouveau Undefined (inutilisé)
    • MongoDB\BSON\Undefined::__toString - Retourne une chaîne vide
    • MongoDB\BSON\Unserializable::bsonUnserialize - Construit l'objet à partir d'un tableau ou d'un document BSON
    • MongoDB\BSON\UTCDateTime::jsonSerialize - Retourne une représentation qui peut être convertie en JSON
    • MongoDB\BSON\UTCDateTime::serialize - Sérialise un UTCDateTime
    • MongoDB\BSON\UTCDateTime::toDateTime - Retourne la représentation DateTime de ce UTCDateTime
    • MongoDB\BSON\UTCDateTime::unserialize - Désérialisé un UTCDateTime
    • MongoDB\BSON\UTCDateTime::__construct - Construit un nouveau UTCDateTime
    • MongoDB\BSON\UTCDateTime::__toString - Retourne la représentation sous forme de chaîne de ce UTCDateTime
    • MongoDB\BSON\UTCDateTimeInterface::toDateTime - Retourne la représentation DateTime de UTCDateTimeInterface
    • MongoDB\BSON\UTCDateTimeInterface::__toString - Retourne la représentation sous forme de chaîne de caractère de UTCDateTimeInterface
    • MongoDB\Driver\BulkWrite::count - Count number of write operations in the bulk
    • MongoDB\Driver\BulkWrite::delete - Add a delete operation to the bulk
    • MongoDB\Driver\BulkWrite::insert - Add an insert operation to the bulk
    • MongoDB\Driver\BulkWrite::update - Add an update operation to the bulk
    • MongoDB\Driver\BulkWrite::__construct - Create a new BulkWrite
    • MongoDB\Driver\ClientEncryption::createDataKey - Create a new encryption data key
    • MongoDB\Driver\ClientEncryption::decrypt - Decrypt a value
    • MongoDB\Driver\ClientEncryption::encrypt - Encrypt a value
    • MongoDB\Driver\Command::__construct - Crée une nouvelle commande
    • MongoDB\Driver\Cursor::current - Returns the current element
    • MongoDB\Driver\Cursor::getId - Retourne l'ID de ce curseur
    • MongoDB\Driver\Cursor::getServer - Retourne le serveur associé à ce curseur
    • MongoDB\Driver\Cursor::isDead - Vérifie si le curseur est épuisé ou peut avoir des résultats supplémentaires
    • MongoDB\Driver\Cursor::key - Returns the current result's index within the cursor
    • MongoDB\Driver\Cursor::next - Advances the cursor to the next result
    • MongoDB\Driver\Cursor::rewind - Rewind the cursor to the first result
    • MongoDB\Driver\Cursor::setTypeMap - Défini un type de carte à utiliser pour la délinéarisation BSON
    • MongoDB\Driver\Cursor::toArray - Retourne un tableau contenant tous les résultats pour ce curseur
    • MongoDB\Driver\Cursor::valid - Checks if the current position in the cursor is valid
    • MongoDB\Driver\Cursor::__construct - Créer un nouveau curseur (non utilisé)
    • MongoDB\Driver\CursorId::serialize - Serialize a CursorId
    • MongoDB\Driver\CursorId::unserialize - Unserialize a CursorId
    • MongoDB\Driver\CursorId::__construct - Créer un nouveau CursorId (non utilisé)
    • MongoDB\Driver\CursorId::__toString - Représentation sous forme de chaîne de l'ID de curseur
    • MongoDB\Driver\CursorInterface::getId - Returns the ID for this cursor
    • MongoDB\Driver\CursorInterface::getServer - Returns the server associated with this cursor
    • MongoDB\Driver\CursorInterface::isDead - Checks if the cursor may have additional results
    • MongoDB\Driver\CursorInterface::setTypeMap - Sets a type map to use for BSON unserialization
    • MongoDB\Driver\CursorInterface::toArray - Returns an array containing all results for this cursor
    • MongoDB\Driver\Exception\CommandException::getResultDocument - Retourne le document résultant pour la commande échoué
    • MongoDB\Driver\Exception\RuntimeException::hasErrorLabel - Retourne si un label d'erreur est associé avec une exception
    • MongoDB\Driver\Exception\WriteException::getWriteResult - Retourne le WriteResult pour l'opération d'écriture qui a échoué
    • MongoDB\Driver\Manager::createClientEncryption - Create a new ClientEncryption object
    • MongoDB\Driver\Manager::executeBulkWrite - Execute one or more write operations
    • MongoDB\Driver\Manager::executeCommand - Execute a database command
    • MongoDB\Driver\Manager::executeQuery - Execute a database query
    • MongoDB\Driver\Manager::executeReadCommand - Execute a database command that reads
    • MongoDB\Driver\Manager::executeReadWriteCommand - Execute a database command that reads and writes
    • MongoDB\Driver\Manager::executeWriteCommand - Execute a database command that writes
    • MongoDB\Driver\Manager::getReadConcern - Return the ReadConcern for the Manager
    • MongoDB\Driver\Manager::getReadPreference - Return the ReadPreference for the Manager
    • MongoDB\Driver\Manager::getServers - Retourner les serveurs auxquels ce gestionnaire est connecté
    • MongoDB\Driver\Manager::getWriteConcern - Return the WriteConcern for the Manager
    • MongoDB\Driver\Manager::selectServer - Select a server matching a read preference
    • MongoDB\Driver\Manager::startSession - Start a new client session for use with this client
    • MongoDB\Driver\Manager::__construct - Create new MongoDB Manager
    • MongoDB\Driver\Monitoring\addSubscriber - Enregistre un nouveau abonnement de surveillance d'événement
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getCommandName - Returns the command name
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getDurationMicros - Returns the command's duration in microseconds
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getError - Returns the Exception associated with the failed command
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getOperationId - Returns the command's operation ID
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getReply - Returns the command reply document
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId - Returns the command's request ID
    • MongoDB\Driver\Monitoring\CommandFailedEvent::getServer - Returns the Server on which the command was executed
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getCommand - Returns the command document
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getCommandName - Returns the command name
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getDatabaseName - Returns the database on which the command was executed
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getOperationId - Returns the command's operation ID
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId - Returns the command's request ID
    • MongoDB\Driver\Monitoring\CommandStartedEvent::getServer - Returns the Server on which the command was executed
    • MongoDB\Driver\Monitoring\CommandSubscriber::commandFailed - Notification method for a failed command
    • MongoDB\Driver\Monitoring\CommandSubscriber::commandStarted - Notification method for a started command
    • MongoDB\Driver\Monitoring\CommandSubscriber::commandSucceeded - Notification method for a successful command
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getCommandName - Returns the command name
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getDurationMicros - Returns the command's duration in microseconds
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getOperationId - Returns the command's operation ID
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getReply - Returns the command reply document
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId - Returns the command's request ID
    • MongoDB\Driver\Monitoring\CommandSucceededEvent::getServer - Returns the Server on which the command was executed
    • MongoDB\Driver\Monitoring\removeSubscriber - Retire un abonnement de surveillance d'événement existant
    • MongoDB\Driver\Query::__construct - Create a new Query
    • MongoDB\Driver\ReadConcern::bsonSerialize - Returns an object for BSON serialization
    • MongoDB\Driver\ReadConcern::getLevel - Returns the ReadConcern's "level" option
    • MongoDB\Driver\ReadConcern::isDefault - Checks if this is the default read concern
    • MongoDB\Driver\ReadConcern::serialize - Serialize a ReadConcern
    • MongoDB\Driver\ReadConcern::unserialize - Unserialize a ReadConcern
    • MongoDB\Driver\ReadConcern::__construct - Create a new ReadConcern
    • MongoDB\Driver\ReadPreference::bsonSerialize - Returns an object for BSON serialization
    • MongoDB\Driver\ReadPreference::getHedge - Returns the ReadPreference's "hedge" option
    • MongoDB\Driver\ReadPreference::getMaxStalenessSeconds - Returns the ReadPreference's "maxStalenessSeconds" option
    • MongoDB\Driver\ReadPreference::getMode - Returns the ReadPreference's "mode" option
    • MongoDB\Driver\ReadPreference::getModeString - Returns the ReadPreference's "mode" option as a string
    • MongoDB\Driver\ReadPreference::getTagSets - Returns the ReadPreference's "tagSets" option
    • MongoDB\Driver\ReadPreference::serialize - Serialize a ReadPreference
    • MongoDB\Driver\ReadPreference::unserialize - Unserialize a ReadPreference
    • MongoDB\Driver\ReadPreference::__construct - Créer un nouveau ReadPreference
    • MongoDB\Driver\Server::executeBulkWrite - Exécute une ou plusieurs opérations d'écriture sur ce serveur
    • MongoDB\Driver\Server::executeCommand - Exécute une commande de base de données sur ce serveur
    • MongoDB\Driver\Server::executeQuery - Exécute une requête de base de données sur ce serveur
    • MongoDB\Driver\Server::executeReadCommand - Execute a database command that reads on this server
    • MongoDB\Driver\Server::executeReadWriteCommand - Execute a database command that reads and writes on this server
    • MongoDB\Driver\Server::executeWriteCommand - Execute a database command that writes on this server
    • MongoDB\Driver\Server::getHost - Retourne le nom d'hôte du serveur
    • MongoDB\Driver\Server::getInfo - Retourne un tableau d'informations sur ce serveur
    • MongoDB\Driver\Server::getLatency - Retourne la latence de ce serveur
    • MongoDB\Driver\Server::getPort - Retourne le port sur lequel le serveur écoute
    • MongoDB\Driver\Server::getTags - Returns an array of tags describing this server in a replica set
    • MongoDB\Driver\Server::getType - Retourne un entier représentant le type du serveur
    • MongoDB\Driver\Server::isArbiter - Checks if this server is an arbiter member of a replica set
    • MongoDB\Driver\Server::isHidden - Checks if this server is a hidden member of a replica set
    • MongoDB\Driver\Server::isPassive - Vérifie si le serveur est un membre passif du jeu de réplication
    • MongoDB\Driver\Server::isPrimary - Checks if this server is a primary member of a replica set
    • MongoDB\Driver\Server::isSecondary - Checks if this server is a secondary member of a replica set
    • MongoDB\Driver\Server::__construct - Créer un nouveau serveur (non utilisé)
    • MongoDB\Driver\Session::abortTransaction - Aborts a transaction
    • MongoDB\Driver\Session::advanceClusterTime - Advances the cluster time for this session
    • MongoDB\Driver\Session::advanceOperationTime - Advances the operation time for this session
    • MongoDB\Driver\Session::commitTransaction - Commits a transaction
    • MongoDB\Driver\Session::endSession - Terminates a session
    • MongoDB\Driver\Session::getClusterTime - Returns the cluster time for this session
    • MongoDB\Driver\Session::getLogicalSessionId - Returns the logical session ID for this session
    • MongoDB\Driver\Session::getOperationTime - Returns the operation time for this session
    • MongoDB\Driver\Session::getServer - Returns the server to which this session is pinned
    • MongoDB\Driver\Session::getTransactionOptions - Returns options for the currently running transaction
    • MongoDB\Driver\Session::getTransactionState - Returns the current transaction state for this session
    • MongoDB\Driver\Session::isInTransaction - Returns whether a multi-document transaction is in progress
    • MongoDB\Driver\Session::startTransaction - Starts a transaction
    • MongoDB\Driver\Session::__construct - Create a new Session (not used)
    • MongoDB\Driver\WriteConcern::bsonSerialize - Returns an object for BSON serialization
    • MongoDB\Driver\WriteConcern::getJournal - Returns the WriteConcern's "journal" option
    • MongoDB\Driver\WriteConcern::getW - Returns the WriteConcern's "w" option
    • MongoDB\Driver\WriteConcern::getWtimeout - Returns the WriteConcern's "wtimeout" option
    • MongoDB\Driver\WriteConcern::isDefault - Checks if this is the default write concern
    • MongoDB\Driver\WriteConcern::serialize - Serialize a WriteConcern
    • MongoDB\Driver\WriteConcern::unserialize - Unserialize a WriteConcern
    • MongoDB\Driver\WriteConcern::__construct - Construit un WriteConcern
    • MongoDB\Driver\WriteConcernError::getCode - Retourne le code d'erreur de WriteConcernError
    • MongoDB\Driver\WriteConcernError::getInfo - Retourne le document de métadonnées pour WriteConcernError
    • MongoDB\Driver\WriteConcernError::getMessage - Renvoie le message d'erreur du WriteConcernError
    • MongoDB\Driver\WriteError::getCode - Retourne le code d'erreur de WriteError
    • MongoDB\Driver\WriteError::getIndex - Retourne l'index de l'opération d'écriture correspondant à ce WriteError
    • MongoDB\Driver\WriteError::getInfo - Retourne le document de métadonnées pour WriteError
    • MongoDB\Driver\WriteError::getMessage - Renvoie le message d'erreur du WriteError
    • MongoDB\Driver\WriteResult::getDeletedCount - Renvoie le nombre de documents supprimés
    • MongoDB\Driver\WriteResult::getInsertedCount - Renvoie le nombre de documents insérés (à l'exception de Upserts)
    • MongoDB\Driver\WriteResult::getMatchedCount - Renvoie le nombre de documents sélectionnés pour la mise à jour
    • MongoDB\Driver\WriteResult::getModifiedCount - Renvoie le nombre de documents existants mis à jour
    • MongoDB\Driver\WriteResult::getServer - Retourne le serveur associé à ce résultat d'écriture
    • MongoDB\Driver\WriteResult::getUpsertedCount - Renvoie le nombre de documents insérés par un upsert
    • MongoDB\Driver\WriteResult::getUpsertedIds - Retourne un tableau d'identificateurs pour les documents upserted
    • MongoDB\Driver\WriteResult::getWriteConcernError - Retourne toute erreur de WriteConcern qui s'est produite
    • MongoDB\Driver\WriteResult::getWriteErrors - Retourne toutes les erreurs d'écriture qui se sont produites
    • MongoDB\Driver\WriteResult::isAcknowledged - Retourne si l'écriture a été reconnue
    • MongoDeleteBatch::__construct - Description
    • MongoGridFS::delete - Efface un fichier et ces morceaux depuis la base de données
    • MongoGridFS::drop - Efface les collections de fichiers
    • MongoGridFS::find - Interroge un fichier
    • MongoGridFS::findOne - Lit un fichier unique satisfaisant les critères
    • MongoGridFS::get - Récupère un fichier depuis la base de données
    • MongoGridFS::put - Stocke un fichier dans la base de données
    • MongoGridFS::remove - Efface des fichiers et leurs morceaux de la base de données
    • MongoGridFS::storeBytes - Stocke une chaîne d'octets dans la base de données
    • MongoGridFS::storeFile - Stocke un fichier dans la base de données
    • MongoGridFS::storeUpload - Stocke un fichier téléchargé dans la base de données
    • MongoGridFS::__construct - Crée une nouvelle collection de fichiers
    • MongoGridFSCursor::current - Retourne le fichier courant
    • MongoGridFSCursor::getNext - Retourne le prochain fichier vers lequel pointe le curseur, puis avance le curseur
    • MongoGridFSCursor::key - Retourne l'identifiant courant
    • MongoGridFSCursor::__construct - Crée un nouveau curseur
    • MongoGridFSFile::getBytes - Retourne le contenu du fichier
    • MongoGridFSFile::getFilename - Retourne le nom du fichier
    • MongoGridFSFile::getResource - Retourne une ressource qui peut être utilisée pour lire le fichier stocké
    • MongoGridFSFile::getSize - Retourne la taille du fichier
    • MongoGridFSFile::write - Ecrit un fichier dans le système de fichiers
    • MongoGridfsFile::__construct - Crée un nouveau fichier GridFS
    • MongoId::getHostname - Récupère le nom d'hôte utilisé pour les identifiants de cette machine
    • MongoId::getInc - Récupère la valeur incrémentée pour créer cet identifiant
    • MongoId::getPID - Récupère l'identifiant du processus
    • MongoId::getTimestamp - Retourne le timestamp depuis la création de l'id
    • MongoId::isValid - Vérifie si une valeur est un ObjectId valide
    • MongoId::__construct - Crée un nouvel identifiant
    • MongoId::__set_state - Crée un MongoId
    • MongoId::__toString - Retourne une représentation hexadécimale de cet identifiant
    • MongoInsertBatch::__construct - Description
    • MongoInt32::__construct - Crée un nouvel entier 32-bit
    • MongoInt32::__toString - Retourne la représentation sous forme de chaîne de caractères d'un entier 32-bit
    • MongoInt64::__construct - Crée un nouvel entier 64-bit
    • MongoInt64::__toString - Retourne la représentation sous forme de chaîne de caractères d'un entier 64-bit
    • MongoLog::getCallback - Récupère la précédente fonction de rappel définie
    • MongoLog::getLevel - Récupère le(s) niveau(x) actuellement loggué(s)
    • MongoLog::getModule - Récupère le(s) module(s) actuellement surveillé(s)
    • MongoLog::setCallback - Définit une fonction de rappel à utiliser lors d'événements
    • MongoLog::setLevel - Définit le(s) niveau(x) des logs
    • MongoLog::setModule - Définit le(s) module(s) à surveiller avec les logs
    • MongoPool::getSize - Récupère la taille de la file d'attente des connexions
    • MongoPool::info - Retourne des informations sur toutes les files d'attente de connexions
    • MongoPool::setSize - Définit la taille de la future file d'attente de connexions
    • MongoRegex::__construct - Crée une nouvelle expression rationnelle
    • MongoRegex::__toString - Retourne une expression rationnelle sous forme de chaîne
    • MongoResultException::getDocument - Récupère le document résultant complet
    • MongoTimestamp::__construct - Crée un nouveau timestamp
    • MongoTimestamp::__toString - Retourne une représentation sous la forme d'une chaîne de caractères d'un timestamp
    • MongoUpdateBatch::__construct - Description
    • MongoWriteBatch::add - Ajoute une opération d'écriture dans un lot
    • MongoWriteBatch::execute - Exécute un lot d'opérations d'écriture
    • MongoWriteBatch::__construct - Crée un nouveau lot d'opérations d'écriture
    • MongoWriteConcernException::getDocument - Récupère le document d'erreur
    • move_uploaded_file - Déplace un fichier téléchargé
    • mqseries_back - MQSeries MQBACK
    • mqseries_begin - MQseries MQBEGIN
    • mqseries_close - MQSeries MQCLOSE
    • mqseries_cmit - MQSeries MQCMIT
    • mqseries_conn - MQSeries MQCONN
    • mqseries_connx - MQSeries MQCONNX
    • mqseries_disc - MQSeries MQDISC
    • mqseries_get - MQSeries MQGET
    • mqseries_inq - MQSeries MQINQ
    • mqseries_open - MQSeries MQOPEN
    • mqseries_put - MQSeries MQPUT
    • mqseries_put1 - MQSeries MQPUT1
    • mqseries_set - MQSeries MQSET
    • mqseries_strerror - Retourne le message d'erreur correspondant au code de résultat
    • msg_get_queue - Crée ou s'attache à une file de messages
    • msg_queue_exists - Vérifie si une file de messages existe
    • msg_receive - Reçoit un message depuis une file de messages
    • msg_remove_queue - Détruit une file de messages
    • msg_send - Envoie un message dans une file
    • msg_set_queue - Modifie des informations dans la file de messages
    • msg_stat_queue - Retourne des informations sur la file de messages
    • mt_getrandmax - La plus grande valeur aléatoire possible
    • mt_rand - Génère une valeur aléatoire via le générateur de nombre aléatoire Mersenne Twister
    • mt_srand - Initialise le générateur de nombres aléatoires Mersenne Twister
    • MultipleIterator::attachIterator - Attache un itérateur
    • MultipleIterator::containsIterator - Vérifie si un itérateur est attaché
    • MultipleIterator::countIterators - Récupère le nombre d'instances d'itérateurs attachés
    • MultipleIterator::current - Récupère les instantes des itérateurs attachés
    • MultipleIterator::detachIterator - Détache un itérateur
    • MultipleIterator::getFlags - Récupère les informations d'un drapeau
    • MultipleIterator::key - Récupère les instances des itérateurs enregistrés
    • MultipleIterator::next - Déplace vers l'avant toutes les instances des itérateurs attachés
    • MultipleIterator::rewind - Réinitialise toutes les instances d'itérateurs attachés
    • MultipleIterator::setFlags - Définit des drapeaux
    • MultipleIterator::valid - Vérifie la validité d'un sous-itérateur
    • MultipleIterator::__construct - Construit un nouvel objet MultipleIterator
    • Mutex::create - Crée un Mutex
    • Mutex::destroy - Détruit un Mutex
    • Mutex::lock - Acquière un Mutex
    • Mutex::trylock - Tente d'acquérir un Mutex
    • Mutex::unlock - Libère un Mutex
    • mysqli::$affected_rows - Retourne le nombre de lignes affectées par la dernière opération MySQL
    • mysqli::$client_info - Récupère des informations sur le client MySQL
    • mysqli::$client_version - Retourne la version du client MySQL sous forme d'un entier
    • mysqli::$connect_errno - Retourne le code d'erreur de la connexion MySQL
    • mysqli::$connect_error - Retourne le message d'erreur de connexion MySQL
    • mysqli::$errno - Retourne le dernier code d'erreur produit
    • mysqli::$error - Retourne une chaîne décrivant la dernière erreur
    • mysqli::$error_list - Retourne une liste d'erreur depuis la dernière commande exécutée
    • mysqli::$field_count - Retourne le nombre de colonnes pour la dernière requête
    • mysqli::$host_info - Retourne une chaîne contenant le type de connexion utilisée
    • mysqli::$info - Retourne des informations à propos de la dernière requête exécutée
    • mysqli::$insert_id - Retourne l'identifiant automatiquement généré utilisé par la dernière requête
    • mysqli::$protocol_version - Retourne la version du protocole MySQL utilisé
    • mysqli::$server_info - Retourne la version du serveur MySQL
    • mysqli::$server_version - Retourne un entier représentant la version du serveur MySQL
    • mysqli::$sqlstate - Retourne l'erreur SQLSTATE de la dernière opération MySQL
    • mysqli::$thread_id - Retourne l'identifiant du thread pour la connexion courante
    • mysqli::$warning_count - Retourne le nombre d'avertissements générés par la dernière requête
    • mysqli::autocommit - Active ou désactive le mode auto-commit
    • mysqli::begin_transaction - Démarre une transaction
    • mysqli::change_user - Change l'utilisateur de la connexion spécifiée
    • mysqli::character_set_name - Retourne le jeu de caractères courant pour la connexion
    • mysqli::close - Ferme une connexion
    • mysqli::commit - Valide la transaction courante
    • mysqli::debug - Effectue des actions de déboguage
    • mysqli::dump_debug_info - Écrit les informations de déboguage dans les logs
    • mysqli::get_charset - Retourne un objet représentant le jeu de caractères
    • mysqli::get_connection_stats - Retourne des statistiques sur la connexion
    • mysqli::get_warnings - Lit le résultat de SHOW WARNINGS
    • mysqli::init - Initialise MySQLi et retourne un objet à utiliser avec mysqli_real_connect()
    • mysqli::kill - Demande au serveur de terminer un thread MySQL
    • mysqli::more_results - Vérifie s'il y a d'autres jeux de résultats MySQL disponibles
    • mysqli::multi_query - Exécute une requête MySQL multiple
    • mysqli::next_result - Prépare le prochain résultat d'une requête multiple
    • mysqli::options - Définit les options
    • mysqli::ping - Ping la connexion au serveur et reconnecte si elle n'existe plus
    • mysqli::poll - Vérifie l'état de la connexion
    • mysqli::prepare - Prépare une requête SQL pour l'exécution
    • mysqli::query - Exécute une requête sur la base de données
    • mysqli::real_connect - Ouvre une connexion à un serveur MySQL
    • mysqli::real_escape_string - Protège les caractères spéciaux d'une chaîne pour l'utiliser dans une requête SQL, en prenant en compte le jeu de caractères courant de la connexion
    • mysqli::real_query - Exécute une requête SQL
    • mysqli::reap_async_query - Lit un résultat pour une requête asynchrone
    • mysqli::refresh - Rafraîchie
    • mysqli::release_savepoint - Supprime le point de sauvegardé nommé du jeu des points de sauvegarde de la transaction courante
    • mysqli::rollback - Annule la transaction courante
    • mysqli::savepoint - Définit un point de sauvegarde nommé de la transaction
    • mysqli::select_db - Sélectionne une base de données par défaut pour les requêtes
    • mysqli::set_charset - Définit le jeu de caractères par défaut du client
    • mysqli::set_opt - Alias de mysqli_options
    • mysqli::ssl_set - Utilisée pour établir une connexion sécurisée avec SSL
    • mysqli::stat - Obtient le statut courant du système
    • mysqli::stmt_init - Initialise une commande MySQL
    • mysqli::store_result - Transfère un jeu de résultats à partir de la dernière requête
    • mysqli::thread_safe - Indique si le support des threads est activé ou pas
    • mysqli::use_result - Initialise la récupération d'un jeu de résultats
    • mysqli::__construct - Ouvre une connexion à un serveur MySQL
    • mysqli_connect - Alias de mysqli::__construct
    • mysqli_driver::$report_mode - Définit le mode du rapport d'erreur mysqli
    • mysqli_driver::embedded_server_end - Arrête le serveur embarqué
    • mysqli_driver::embedded_server_start - Initialise et démarre le serveur embarqué
    • mysqli_escape_string - Alias de mysqli_real_escape_string
    • mysqli_execute - Alias de mysqli_stmt_execute
    • mysqli_get_client_stats - Retourne les statistiques client par processus
    • mysqli_get_links_stats - Retourne des informations sur les liens ouverts et mis en cache
    • mysqli_report - Alias de mysqli_driver->report_mode
    • mysqli_result::$current_field - Récupère la position courante d'un champ dans un pointeur de résultat
    • mysqli_result::$field_count - Récupère le nombre de champs dans un résultat
    • mysqli_result::$lengths - Retourne la longueur des colonnes de la ligne courante du jeu de résultats
    • mysqli_result::$num_rows - Retourne le nombre de lignes dans un résultat
    • mysqli_result::data_seek - Déplace le pointeur interne de résultat
    • mysqli_result::fetch_all - Lit toutes les lignes de résultats dans un tableau
    • mysqli_result::fetch_array - Retourne une ligne de résultat sous la forme d'un tableau associatif, d'un tableau indexé, ou les deux
    • mysqli_result::fetch_assoc - Récupère une ligne de résultat sous forme de tableau associatif
    • mysqli_result::fetch_field - Retourne le prochain champs dans le jeu de résultats
    • mysqli_result::fetch_fields - Retourne un tableau d'objets représentant les champs dans le résultat
    • mysqli_result::fetch_field_direct - Récupère les métadonnées d'un champ unique
    • mysqli_result::fetch_object - Retourne la ligne courante d'un jeu de résultat sous forme d'objet
    • mysqli_result::fetch_row - Récupère une ligne de résultat sous forme de tableau indexé
    • mysqli_result::field_seek - Déplace le pointeur de résultat sur le champ spécifié
    • mysqli_result::free - Libère la mémoire associée à un résultat
    • mysqli_stmt::$affected_rows - Retourne le nombre total de lignes modifiées, effacées ou insérées par la dernière requête
    • mysqli_stmt::$errno - Retourne un code erreur pour la dernière requête
    • mysqli_stmt::$error - Retourne une description de la dernière erreur de traitement
    • mysqli_stmt::$error_list - Retourne une liste d'erreurs pour la dernière requête exécutée
    • mysqli_stmt::$field_count - Retourne le nombre de colonnes dans la requête donnée
    • mysqli_stmt::$insert_id - Récupère l'ID généré par la dernière requête INSERT
    • mysqli_stmt::$num_rows - Retourne le nombre de lignes d'un résultat MySQL
    • mysqli_stmt::$param_count - Retourne le nombre de paramètres d'une commande SQL
    • mysqli_stmt::$sqlstate - Retourne le code SQLSTATE de la dernière opération MySQL
    • mysqli_stmt::attr_get - Récupère la valeur courante d'un attribut de requête
    • mysqli_stmt::attr_set - Modifie le comportement d'une requête préparée
    • mysqli_stmt::bind_param - Lie des variables à une requête MySQL
    • mysqli_stmt::bind_result - Lie des variables à un jeu de résultats
    • mysqli_stmt::close - Termine une requête préparée
    • mysqli_stmt::data_seek - Déplace le pointeur de résultat
    • mysqli_stmt::execute - Exécute une requête préparée
    • mysqli_stmt::fetch - Lit des résultats depuis une requête MySQL préparée dans des variables liées
    • mysqli_stmt::free_result - Libère le résultat MySQL de la mémoire
    • mysqli_stmt::get_result - Récupère un jeu de résultats depuis une requête préparée
    • mysqli_stmt::get_warnings - Récupère le résultat de SHOW WARNINGS
    • mysqli_stmt::more_results - Vérifie s'il y a encore des résultats depuis une requête multiple
    • mysqli_stmt::next_result - Lit le résultat suivant depuis une requête multiple
    • mysqli_stmt::prepare - Prépare une requête SQL pour l'exécution
    • mysqli_stmt::reset - Annule une requête préparée
    • mysqli_stmt::result_metadata - Retourne les métadonnées de préparation de requête MySQL
    • mysqli_stmt::send_long_data - Envoie des données MySQL par paquets
    • mysqli_stmt::store_result - Stocke un jeu de résultats depuis une requête préparée
    • mysqli_stmt::__construct - Construit un nouvel objet mysqli_stmt
    • mysqli_warning::next - Récupère le prochain avertissement
    • MysqlndUhConnection::changeUser - Change l'utilisateur de la connexion à la base de données mysqlnd spécifié
    • MysqlndUhConnection::charsetName - Récupère le jeu de caractères par défaut pour la connexion à la base de données
    • MysqlndUhConnection::close - Ferme une connexion existante à la base de données
    • MysqlndUhConnection::connect - Ouvre une nouvelle connexion vers le serveur MySQL
    • MysqlndUhConnection::endPSession - Ferme une connexion persistante
    • MysqlndUhConnection::escapeString - Échappe les caractères spéciaux d'une chaîne dans le but d'être utilisée dans une requête SQL, en prenant en compte le jeu de caractères courant de la connexion
    • MysqlndUhConnection::getAffectedRows - Récupère le nombre de lignes affectées par la précédente opération MySQL
    • MysqlndUhConnection::getErrorNumber - Retourne le code erreur du plus récent appel à une fonction
    • MysqlndUhConnection::getErrorString - Retourne une description textuelle de la dernière erreur
    • MysqlndUhConnection::getFieldCount - Retourne le nombre de colonnes contenu dans la dernière requête
    • MysqlndUhConnection::getHostInformation - Retourne une chaîne représentant le type de connexion utilisé
    • MysqlndUhConnection::getLastInsertId - Retourne l'identifiant auto-généré utilisé dans la dernière requête
    • MysqlndUhConnection::getLastMessage - Récupère les informations concernant la dernière requête exécutée
    • MysqlndUhConnection::getProtocolInformation - Retourne la version du protocole MySQL utilisé
    • MysqlndUhConnection::getServerInformation - Retourne la version du serveur MySQL
    • MysqlndUhConnection::getServerStatistics - Récupère le statut du système courant
    • MysqlndUhConnection::getServerVersion - Retourne la version du serveur MySQL sous la forme d'un entier
    • MysqlndUhConnection::getSqlstate - Retourne l'erreur SQLSTATE depuis la dernière opération MySQL
    • MysqlndUhConnection::getStatistics - Retourne les statistiques sur la connexion cliente
    • MysqlndUhConnection::getThreadId - Retourne l'identifiant du thread pour la connexion courante
    • MysqlndUhConnection::getWarningCount - Retourne le nombre d'alertes depuis la dernière requête
    • MysqlndUhConnection::init - Initialise une connexion Mysqlnd
    • MysqlndUhConnection::killConnection - Demande au serveur de tuer un thread MySQL
    • MysqlndUhConnection::listFields - Liste les champs d'une table MySQL
    • MysqlndUhConnection::listMethod - Gestionnaire pour des commandes
    • MysqlndUhConnection::moreResults - Vérifie s'il y a encore des résultats depuis une requête multiple
    • MysqlndUhConnection::nextResult - Prépare le prochain résultat depuis multi_query
    • MysqlndUhConnection::ping - Ping une connexion de serveur ou tente de se reconnecter si la connexion n'est plus disponible
    • MysqlndUhConnection::query - Exécute une requête sur la base de données
    • MysqlndUhConnection::queryReadResultsetHeader - Lit un en-tête de jeu de résultats
    • MysqlndUhConnection::reapQuery - Récupère le résultat depuis une requête asynchrone
    • MysqlndUhConnection::refreshServer - Rafraîchie ou réinitialise les tables et les caches
    • MysqlndUhConnection::restartPSession - Redémarre une connexion mysqlnd persistante
    • MysqlndUhConnection::selectDb - Sélectionne la base de données par défaut pour l'exécution des requêtes
    • MysqlndUhConnection::sendClose - Envoi une commande de fermeture à MySQL
    • MysqlndUhConnection::sendQuery - Envoi une requête à MySQL
    • MysqlndUhConnection::serverDumpDebugInformation - Extrait les informations de débogage dans les logs pour le serveur MySQL
    • MysqlndUhConnection::setAutocommit - Active ou désactive l'auto-commit de la base de données
    • MysqlndUhConnection::setCharset - Définit le jeu de caractères par défaut du client
    • MysqlndUhConnection::setClientOption - Définit une option du client
    • MysqlndUhConnection::setServerOption - Définit une option serveur
    • MysqlndUhConnection::shutdownServer - Le but de shutdownServer
    • MysqlndUhConnection::simpleCommand - Envoi une commande COM_*
    • MysqlndUhConnection::simpleCommandHandleResponse - Analyse une réponse d'une commande COM_* envoyée au client
    • MysqlndUhConnection::sslSet - Utilisé pour établir des connexions sécurisées utilisant SSL
    • MysqlndUhConnection::stmtInit - Initialise une requête et retourne une ressource à utiliser avec mysqli_statement::prepare
    • MysqlndUhConnection::storeResult - Transfère un jeu de résultats depuis la dernière requête
    • MysqlndUhConnection::txCommit - Valide la transaction courante
    • MysqlndUhConnection::txRollback - Annule la transaction courante
    • MysqlndUhConnection::useResult - Initialise un jeu de résultats récupéré
    • MysqlndUhConnection::__construct - Le but de __construct
    • MysqlndUhPreparedStatement::execute - Exécute une requête préparée
    • MysqlndUhPreparedStatement::prepare - Prépare une requête SQL pour exécution
    • MysqlndUhPreparedStatement::__construct - Le but de __construct
    • mysqlnd_memcache_get_config - Retourne les informations concernant la configuration du plugin
    • mysqlnd_memcache_set - Associe une connexion MySQL avec une connexion Memcache
    • mysqlnd_ms_dump_servers - Retourne une liste des serveurs actuellement configurés
    • mysqlnd_ms_fabric_select_global - Passe en serveur globale partagé pour une table donnée
    • mysqlnd_ms_fabric_select_shard - Passe en mode partagé
    • mysqlnd_ms_get_last_gtid - Retourne le dernier identifiant de transaction globale
    • mysqlnd_ms_get_last_used_connection - Retourne un tableau qui récrit la dernière connexion utilisée
    • mysqlnd_ms_get_stats - Retourne des statistiques quant à la distribution et la connexion de requêtes
    • mysqlnd_ms_match_wild - Cherche si un nom de table correspond ou non à un joker d'un masque
    • mysqlnd_ms_query_is_select - Vérifie quel serveur est sélectionné pour l'envoi de la requête
    • mysqlnd_ms_set_qos - Définit la qualité de service désirée pour le cluster
    • mysqlnd_ms_set_user_pick_server - Définit une fonction de rappel utilisateur pour la séparation lecture/écriture
    • mysqlnd_ms_xa_begin - Démarre une transaction distribuée/XA sur les serveurs MySQL particpants
    • mysqlnd_ms_xa_commit - Valide une transaction distribuée/XA sur les serveurs MySQL participants
    • mysqlnd_ms_xa_gc - Collecte les données incorrectes issues des transactions XA non terminées en raison d'erreurs sévères
    • mysqlnd_ms_xa_rollback - Annule une transaction distribuée/XA sur les serveurs MySQL
    • mysqlnd_qc_clear_cache - Force l'affichage complet du contenu du cache
    • mysqlnd_qc_get_available_handlers - Retourne la liste des gestionnaires de stockage disponibles
    • mysqlnd_qc_get_cache_info - Retourne des informations sur le gestionnaire courant
    • mysqlnd_qc_get_core_stats - Statistiques collectées par le cœur du cache des requêtes
    • mysqlnd_qc_get_normalized_query_trace_log - Retourne une trace dans les logs d'une requête normalisée pour chaque requête inspectée par le cache de requêtes
    • mysqlnd_qc_get_query_trace_log - Retourne une trace pour chaque requête inspectée par la mise en cache de requêtes
    • mysqlnd_qc_set_cache_condition - Définit les conditions pour une mise en cache automatique
    • mysqlnd_qc_set_is_select - Installe une fonction de rappel qui décide si une requête doit être mise en cache
    • mysqlnd_qc_set_storage_handler - Modifie le gestionnaire de stockage courante
    • mysqlnd_qc_set_user_handlers - Définit les fonctions de rappel pour un gestionnaire de stockage procédural défini par l'utilisateur
    • mysqlnd_uh_convert_to_mysqlnd - Convertit un gestionnaire de connexion MySQL en un gestionnaire de connexion mysqlnd
    • mysqlnd_uh_set_connection_proxy - Installe un proxy pour les connexions mysqlnd
    • mysqlnd_uh_set_statement_proxy - Installe un proxy pour les requêtes mysqlnd
    • mysql_affected_rows - Retourne le nombre de lignes affectées lors de la dernière opération MySQL
    • mysql_client_encoding - Retourne le nom du jeu de caractères utilisé par le client MySQL
    • mysql_close - Ferme la connexion MySQL
    • mysql_connect - Ouvre une connexion à un serveur MySQL
    • mysql_create_db - Crée une base de données MySQL
    • mysql_data_seek - Déplace le pointeur interne de résultat MySQL
    • mysql_db_name - Récupère le nom de base de données à l'appel de mysql_list_dbs
    • mysql_db_query - Sélectionne une base de données et y exécute une requête
    • mysql_drop_db - Efface une base de données MySQL
    • mysql_errno - Retourne le numéro d'erreur de la dernière commande MySQL
    • mysql_error - Retourne le texte associé avec l'erreur générée lors de la dernière requête
    • mysql_escape_string - Protège les caractères spéciaux SQL
    • mysql_fetch_array - Retourne une ligne de résultat MySQL sous la forme d'un tableau associatif, d'un tableau indexé, ou les deux
    • mysql_fetch_assoc - Lit une ligne de résultat MySQL dans un tableau associatif
    • mysql_fetch_field - Retourne les données enregistrées dans une colonne MySQL sous forme d'objet
    • mysql_fetch_lengths - Retourne la taille de chaque colonne d'une ligne de résultat MySQL
    • mysql_fetch_object - Retourne une ligne de résultat MySQL sous la forme d'un objet
    • mysql_fetch_row - Retourne une ligne de résultat MySQL sous la forme d'un tableau
    • mysql_field_flags - Retourne des détails sur une colonne MySQL
    • mysql_field_len - Retourne la taille d'un champ de résultat MySQL
    • mysql_field_name - Retourne le nom d'une colonne dans un résultat MySQL
    • mysql_field_seek - Déplace le pointeur de résultat vers une position donnée
    • mysql_field_table - Retourne le nom de la table MySQL où se trouve une colonne
    • mysql_field_type - Retourne le type d'une colonne MySQL spécifique
    • mysql_free_result - Libère le résultat de la mémoire
    • mysql_get_client_info - Lit les informations sur le client MySQL
    • mysql_get_host_info - Lit les informations sur l'hôte MySQL
    • mysql_get_proto_info - Lit les informations sur le protocole MySQL
    • mysql_get_server_info - Lit les informations sur le serveur MySQL
    • mysql_info - Lit des informations à propos de la dernière requête MySQL
    • mysql_insert_id - Retourne l'identifiant généré par la dernière requête
    • mysql_list_dbs - Liste les bases de données disponibles sur le serveur MySQL
    • mysql_list_fields - Liste les champs d'une table MySQL
    • mysql_list_processes - Liste les processus MySQL
    • mysql_list_tables - Liste les tables d'une base de données MySQL
    • mysql_num_fields - Retourne le nombre de champs d'un résultat MySQL
    • mysql_num_rows - Retourne le nombre de lignes d'un résultat MySQL
    • mysql_pconnect - Ouvre une connexion persistante à un serveur MySQL
    • mysql_ping - Vérifie la connexion au serveur MySQL, et s'y reconnecte au besoin
    • mysql_query - Envoie une requête à un serveur MySQL
    • mysql_real_escape_string - Protège une commande SQL de la présence de caractères spéciaux
    • mysql_result - Retourne un champ d'un résultat MySQL
    • mysql_select_db - Sélectionne une base de données MySQL
    • mysql_set_charset - Définit le jeu de caractères du client MySQL
    • mysql_stat - Retourne le statut courant du serveur MySQL
    • mysql_tablename - Lit le nom de la table qui contient un champ
    • mysql_thread_id - Retourne l'identifiant du thread MySQL courant
    • mysql_unbuffered_query - Exécute une requête SQL sans mobiliser les résultats MySQL
    • mysql_xdevapi\Client::close - Close client
  • n
    • natcasesort - Trie un tableau avec l'algorithme à "ordre naturel" insensible à la casse
    • natsort - Trie un tableau avec l'algorithme à "ordre naturel"
    • ncurses_addch - Ajoute un caractère à la position courante et avance le curseur
    • ncurses_addchnstr - Ajoute une chaîne de taille donnée à la position courante
    • ncurses_addchstr - Ajoute une chaîne à la position courante
    • ncurses_addnstr - Ajoute une chaîne à la position courante
    • ncurses_addstr - Affiche du texte à la position courante
    • ncurses_assume_default_colors - Définit la couleur 0
    • ncurses_attroff - Désactive les attributs donnés
    • ncurses_attron - Active les attributs fournis
    • ncurses_attrset - Modifie les attributs donnés
    • ncurses_baudrate - Retourne le baudrate du terminal
    • ncurses_beep - Fait beeper le terminal
    • ncurses_bkgd - Définit les propriétés de fond d'écran pour le terminal
    • ncurses_bkgdset - Définit le fond d'écran
    • ncurses_border - Dessine un bord autour de l'écran avec les caractères données
    • ncurses_bottom_panel - Place un conteneur visible en bas de la pile
    • ncurses_can_change_color - Vérifie si le terminal peut changer de couleur
    • ncurses_cbreak - Désactive la bufferisation d'entrée
    • ncurses_clear - Efface l'écran
    • ncurses_clrtobot - Efface l'écran depuis la position courante jusqu'au bas de l'écran
    • ncurses_clrtoeol - Efface l'écran depuis la position courante jusqu'à la fin de la ligne
    • ncurses_color_content - Lit la valeur RGB d'une couleur
    • ncurses_color_set - Modifie la couleur de fond et de devant
    • ncurses_curs_set - Modifie l'état du curseur
    • ncurses_define_key - Définit un code de clé (keycode)
    • ncurses_def_prog_mode - Sauve le mode du terminal
    • ncurses_def_shell_mode - Sauve le mode de terminal (shell)
    • ncurses_delay_output - Retarde l'affichage sur les terminaux utilisant des caractères de remplissage
    • ncurses_delch - Efface le caractère courant et décale le reste de la ligne vers la gauche
    • ncurses_deleteln - Efface la ligne courante, et monte l'écran d'une ligne
    • ncurses_delwin - Efface une fenêtre ncurses
    • ncurses_del_panel - Retire un conteneur de la pile et l'efface (mais pas la fenêtre associée)
    • ncurses_doupdate - Affiche tout ce qui est prêt, et rafraîchit l'écran
    • ncurses_echo - Active l'écho d'entrée clavier
    • ncurses_echochar - Affiche un caractère et rafraîchit l'écran
    • ncurses_end - Cesse l'utilisation de ncurses et efface l'écran
    • ncurses_erase - Efface l'écran du terminal
    • ncurses_erasechar - Lit le caractère qui se fait effacer
    • ncurses_filter - Définit LINES pour iniscr() et newterm() à 1
    • ncurses_flash - Fait flasher le terminal (visual bell)
    • ncurses_flushinp - Vide le buffer d'entrée du clavier
    • ncurses_getch - Lit un caractère sur le clavier
    • ncurses_getmaxyx - Retourne la taille d'une fenêtre
    • ncurses_getmouse - Lit les événements souris
    • ncurses_getyx - Retourne la position courante du curseur pour une fenêtre
    • ncurses_halfdelay - Met le terminal en mode semi-retardé
    • ncurses_has_colors - Vérifie que le terminal supporte les couleurs
    • ncurses_has_ic - Vérifie les capacités d'insertion et d'effacement
    • ncurses_has_il - Vérifie les capacités d'insertion et d'effacement
    • ncurses_has_key - Vérifie la présence des touches de fonctions sur le clavier
    • ncurses_hide_panel - Retire un conteneur de la pile, pour le rendre invisible
    • ncurses_hline - Dessine une ligne horizontale à la position courante, en utilisant un caractère et une taille maximale
    • ncurses_inch - Lit le caractère et ses attributs à la position courante
    • ncurses_init - Initialise ncurses
    • ncurses_init_color - Configure une nouvelle valeur RGB pour une couleur
    • ncurses_init_pair - Alloue une paire de couleur
    • ncurses_insch - Insère un caractère et décale le reste de la ligne vers la droite, y compris le caractère courant
    • ncurses_insdelln - Insère des lignes devant la ligne courante en scrollant vers le bas (des nombres négatifs donneront un scroll vers le haut)
    • ncurses_insertln - Insère une ligne et décale le reste de l'écran vers le bas
    • ncurses_insstr - Insère une chaîne à la position courante, et décale le reste de la chaîne à droite
    • ncurses_instr - Lit une chaîne depuis le terminal
    • ncurses_isendwin - Vérifie si ncurses est en mode endwin
    • ncurses_keyok - Active ou désactive un code de clé (keycode)
    • ncurses_keypad - Active ou désactive le keypad
    • ncurses_killchar - Retourne la ligne du caractère actuellement supprimé
    • ncurses_longname - Retourne la description du terminal
    • ncurses_meta - Active/désactive les informations de méta clé 8-bits
    • ncurses_mouseinterval - Configure les délais entre les clics de souris
    • ncurses_mousemask - Configure les événements de souris à surveiller
    • ncurses_mouse_trafo - Transforme les coordonnées
    • ncurses_move - Déplace la position d'affichage
    • ncurses_move_panel - Déplace un conteneur pour que son coin supérieur gauche soit aux coordonnées [startx, starty]
    • ncurses_mvaddch - Déplace la position courante et ajoute un caractère
    • ncurses_mvaddchnstr - Déplace la position et ajoute la chaîne attribuée avec la taille donnée
    • ncurses_mvaddchstr - Déplace la position et ajoute une chaîne attribuée
    • ncurses_mvaddnstr - Déplace la position et ajoute une chaîne de taille donnée
    • ncurses_mvaddstr - Déplace la position et ajoute une chaîne
    • ncurses_mvcur - Déplace immédiatement le curseur
    • ncurses_mvdelch - Déplace la position et efface le caractère, puis décale le reste de la ligne à gauche
    • ncurses_mvgetch - Déplace la position et lit le caractère à la nouvelle position
    • ncurses_mvhline - Choisi une nouvelle position et dessine une ligne horizontale avec le caractère donné, et de taille maximale donnée
    • ncurses_mvinch - Déplace la position et lit le caractère à la nouvelle position
    • ncurses_mvvline - Modifie la position et dessine une ligne verticale avec le caractère donné, de taille maximale donnée
    • ncurses_mvwaddstr - Ajoute une chaîne à une nouvelle position dans la fenêtre
    • ncurses_napms - Fait une pause
    • ncurses_newpad - Crée un nouveau pad (fenêtre)
    • ncurses_newwin - Crée une nouvelle fenêtre
    • ncurses_new_panel - Crée un nouveau conteneur et l'associe à une fenêtre
    • ncurses_nl - Convertit les nouvelles lignes et retours chariot en sauts de ligne
    • ncurses_nocbreak - Passe le terminal en mode cooked
    • ncurses_noecho - Désactive l'écho clavier
    • ncurses_nonl - Ne convertit par les nouvelles lignes et retours chariot en sauts de ligne
    • ncurses_noqiflush - Ne vide pas les buffers sur réception des caractères de signaux
    • ncurses_noraw - Déconfigure le mode brut du terminal
    • ncurses_pair_content - Retourne les couleurs de fond et d'affichage d'une paire
    • ncurses_panel_above - Retourne le conteneur au-dessus du conteneur
    • ncurses_panel_below - Retourne le conteneur sous le conteneur
    • ncurses_panel_window - Retourne la fenêtre associée avec un conteneur
    • ncurses_pnoutrefresh - Copie une région depuis un pad dans un écran virtuel
    • ncurses_prefresh - Copie une région depuis un pad dans l'écran virtuel
    • ncurses_putp - Applique l'information d'espacement à la chaîne et l'affiche
    • ncurses_qiflush - Vide les buffers après détection d'un caractère de signal
    • ncurses_raw - Passe le terminal en mode brut (raw)
    • ncurses_refresh - Rafraîchit l'écran
    • ncurses_replace_panel - Remplace la fenêtre associée à un conteneur
    • ncurses_resetty - Rétablit le terminal sauvé
    • ncurses_reset_prog_mode - Restaure le mode prog sauvé par def_prog_mode
    • ncurses_reset_shell_mode - Restaure le mode shell, mode sauvé par def_shell_mode
    • ncurses_savetty - Sauve l'état du terminal
    • ncurses_scrl - Scrolle le contenu de la fenêtre vers le haut ou le bas, sans changer la position courante
    • ncurses_scr_dump - Sauve un écran dans un fichier
    • ncurses_scr_init - Initialise un écran depuis un fichier de sauvegarde
    • ncurses_scr_restore - Rétablit un écran depuis un fichier de sauvegarde
    • ncurses_scr_set - Configure un écran depuis un fichier de sauvegarde
    • ncurses_show_panel - Place un conteneur invisible en haut de la pile, pour le rendre visible
    • ncurses_slk_attr - Retourne l'attribut de la clé soft label courante
    • ncurses_slk_attroff - Désactive l'attribut donné pour les étiquettes des function-key (fonctions clés)
    • ncurses_slk_attron - Active l'attribut donné pour les étiquettes des function-key (fonctions clés)
    • ncurses_slk_attrset - Définit les attributs donnés à une étiquette function-key
    • ncurses_slk_clear - Efface les soft labels de l'écran
    • ncurses_slk_color - Configure la couleur des clés soft label
    • ncurses_slk_init - Initialise les fonctions de clés soft label
    • ncurses_slk_noutrefresh - Copie toutes les clés soft label à l'écran virtuel
    • ncurses_slk_refresh - Copie les clés soft label à l'écran
    • ncurses_slk_restore - Rétablit les clés soft label
    • ncurses_slk_set - Modifie les étiquettes de clé de fonction (function key labels)
    • ncurses_slk_touch - Force l'affichage lorsque ncurses_slk_noutrefresh est utilisé
    • ncurses_standend - Cesse l'utilisation de l'attribut 'standout'
    • ncurses_standout - Commence l'utilisation de l'attribut 'standout'
    • ncurses_start_color - Active les couleurs
    • ncurses_termattrs - Retourne toutes les options supportées par le terminal, combinées ensemble par l'opérateur OR
    • ncurses_termname - Retourne le nom court du terminal
    • ncurses_timeout - Configure le temps d'expiration des séquences clavier spéciales
    • ncurses_top_panel - Place un conteneur visible sur le haut de la pile
    • ncurses_typeahead - Spécifie un autre descripteur de fichier pour la vérification à la volée des données saisies
    • ncurses_ungetch - Replace un caractère dans la queue d'entrée
    • ncurses_ungetmouse - Ajoute un événement souris dans la queue
    • ncurses_update_panels - Rafraîchit l'écran virtuel pour prendre en compte les relations entre les conteneurs de la pile
    • ncurses_use_default_colors - Assigne la couleur de terminal pour l'index -1
    • ncurses_use_env - Contrôle l'utilisation des informations d'environnement concernant la taille du terminal
    • ncurses_use_extended_names - Contrôle l'utilisation des noms étendus dans les descriptions terminfo
    • ncurses_vidattr - Affiche la chaîne sur un terminal dans le mode d'attribut vidéo
    • ncurses_vline - Dessine une ligne verticale à la position courante en utilisant un caractère donné, pour une taille donnée
    • ncurses_waddch - Ajoute un caractère à la position courante, dans une fenêtre, et avance le curseur
    • ncurses_waddstr - Affiche le texte à la position courante dans la fenêtre
    • ncurses_wattroff - Désactive les attributs d'une fenêtre
    • ncurses_wattron - Efface les attributs de la fenêtre
    • ncurses_wattrset - Modifie les attributs d'une fenêtre
    • ncurses_wborder - Dessine le bord d'une fenêtre avec un caractère qualifié
    • ncurses_wclear - Efface la fenêtre
    • ncurses_wcolor_set - Modifie les paires de couleurs de la fenêtre
    • ncurses_werase - Efface le contenu de la fenêtre
    • ncurses_wgetch - Lit un caractère depuis le clavier (fenêtre)
    • ncurses_whline - Dessine une ligne horizontale à partir de la position courante, avec un caractère qualifié, et d'une taille maximale
    • ncurses_wmouse_trafo - Transforme les coordonnées d'une fenêtre
    • ncurses_wmove - Déplace la position d'affichage de la fenêtre
    • ncurses_wnoutrefresh - Copie la fenêtre dans l'écran virtuel
    • ncurses_wrefresh - Rafraîchit la fenêtre sur l'écran du terminal
    • ncurses_wstandend - Termine le mode standout de la fenêtre
    • ncurses_wstandout - Passe une fenêtre en mode standout
    • ncurses_wvline - Dessine une ligne verticale dans une fenêtre, à la position courante, en utilisant un caractère qualifié, avec une taille maximale
    • next - Avance le pointeur interne d'un tableau
    • ngettext - Version plurielle de gettext
    • nl2br - Insère un retour à la ligne HTML à chaque nouvelle ligne
    • nl_langinfo - Rassemble des informations sur la langue et la configuration locale
    • NoRewindIterator::current - Récupère la valeur courante
    • NoRewindIterator::getInnerIterator - Récupère l'itérateur interne
    • NoRewindIterator::key - Récupère la clé courante
    • NoRewindIterator::next - Se déplace vers le prochain élément
    • NoRewindIterator::rewind - Réinitialise l'itérateur interne
    • NoRewindIterator::valid - Valide un itérateur
    • NoRewindIterator::__construct - Construit un nouvel objet NoRewindIterator
    • Normalizer::getRawDecomposition - Gets the Decomposition_Mapping property for the given UTF-8 encoded code point
    • Normalizer::isNormalized - Vérifie si une chaîne est normalisée
    • Normalizer::normalize - Normalise une chaîne en entrée
    • NumberFormatter::create - Crée un formateur de nombre
    • NumberFormatter::format - Formate un nombre
    • NumberFormatter::formatCurrency - Formate une valeur monétaire
    • NumberFormatter::getAttribute - Lit un attribut
    • NumberFormatter::getErrorCode - Lit le dernier code d'erreur du formateur
    • NumberFormatter::getErrorMessage - Lit le dernier message d'erreur du formateur
    • NumberFormatter::getLocale - Lit la locale du formateur
    • NumberFormatter::getPattern - Lit le modèle du formateur
    • NumberFormatter::getSymbol - Lit la valeur du symbole
    • NumberFormatter::getTextAttribute - Lit un attribut textuel
    • NumberFormatter::parse - Analyse un nombre
    • NumberFormatter::parseCurrency - Analyse un nombre monétaire
    • NumberFormatter::setAttribute - Affecte un attribut du formateur
    • NumberFormatter::setPattern - Configure le modèle du formateur
    • NumberFormatter::setSymbol - Configure le symbole du formateur
    • NumberFormatter::setTextAttribute - Modifie un attribut texte
    • number_format - Formate un nombre pour l'affichage
  • o
    • OAuth::disableDebug - Désactive les messages de déboguage
    • OAuth::disableRedirects - Désactive les redirections
    • OAuth::disableSSLChecks - Désactive la vérification SSL
    • OAuth::enableDebug - Active les messages de débogage
    • OAuth::enableRedirects - Active les redirections
    • OAuth::enableSSLChecks - Active la vérification SSL
    • OAuth::fetch - Lit une ressource protégée par OAuth
    • OAuth::generateSignature - Génère une signature
    • OAuth::getAccessToken - Récupère un token d'accès
    • OAuth::getCAPath - Récupère l'information CA
    • OAuth::getLastResponse - Lit la dernière réponse
    • OAuth::getLastResponseHeaders - Récupère les en-têtes de la dernière réponse
    • OAuth::getLastResponseInfo - Lit les informations HTTP de la dernière réponse
    • OAuth::getRequestHeader - Génère une signature d'en-tête OAuth
    • OAuth::getRequestToken - Lit le token de requête
    • OAuth::setAuthType - Définit le type d'autorisation
    • OAuth::setCAPath - Définit le chemin et les informations du CA
    • OAuth::setNonce - Configure le nonce OAuth
    • OAuth::setRequestEngine - Le but de setRequestEngine
    • OAuth::setRSACertificate - Définit le certificat RSA
    • OAuth::setSSLChecks - Définit des vérifications spécifiques à SSL pour les requêtes
    • OAuth::setTimestamp - Définit le timestamp
    • OAuth::setToken - Configure le token et le secret
    • OAuth::setVersion - Configure la version OAuth
    • OAuth::__construct - Crée un nouvel objet OAuth
    • OAuth::__destruct - Le destructeur
    • OAuthProvider::addRequiredParameter - Ajoute des paramètres requis
    • OAuthProvider::callconsumerHandler - Appelle la fonction de rappel consumerNonceHandler
    • OAuthProvider::callTimestampNonceHandler - Appelle la fonction de rappel timestampNonceHandler
    • OAuthProvider::calltokenHandler - Appelle la fonction de rappel tokenNonceHandler
    • OAuthProvider::checkOAuthRequest - Vérifie une requête OAuth
    • OAuthProvider::consumerHandler - Définit la fonction de rappel consumerHandler
    • OAuthProvider::generateToken - Génère un jeton aléatoire
    • OAuthProvider::is2LeggedEndpoint - is2LeggedEndpoint
    • OAuthProvider::isRequestTokenEndpoint - Définit isRequestTokenEndpoint
    • OAuthProvider::removeRequiredParameter - Supprime un paramètre
    • OAuthProvider::reportProblem - Rapporte un problème
    • OAuthProvider::setParam - Définit un paramètre
    • OAuthProvider::setRequestTokenPath - Définit le chemin du jeton demandé
    • OAuthProvider::timestampNonceHandler - Définit le gestionnaire de rappel timestampNonceHandler
    • OAuthProvider::tokenHandler - Définit le gestionnaire de rappel tokenHandler
    • OAuthProvider::__construct - Construit un nouvel objet OAuthProvider
    • oauth_get_sbs - Génère une chaîne de base de signature
    • oauth_urlencode - Encode une URI conformément à RFC 3986
    • ob_clean - Efface le tampon de sortie
    • ob_end_clean - Détruit les données du tampon de sortie et éteint la temporisation de sortie
    • ob_end_flush - Envoie les données du tampon de sortie et éteint la temporisation de sortie
    • ob_flush - Envoie le tampon de sortie
    • ob_get_clean - Lit le contenu courant du tampon de sortie puis l'efface
    • ob_get_contents - Retourne le contenu du tampon de sortie
    • ob_get_flush - Vide le tampon, le retourne en tant que chaîne et stoppe la temporisation
    • ob_get_length - Retourne la longueur du contenu du tampon de sortie
    • ob_get_level - Retourne le nombre de niveaux d'imbrications du système de temporisation de sortie
    • ob_get_status - Lit le statut du tampon de sortie
    • ob_gzhandler - Fonction de rappel pour la compression automatique des tampons
    • ob_iconv_handler - Gestionnaire de sortie pour maîtriser le jeu de caractères de sortie
    • ob_implicit_flush - Active/désactive l'envoi implicite
    • ob_list_handlers - Liste les gestionnaires d'affichage utilisés
    • ob_start - Enclenche la temporisation de sortie
    • ob_tidyhandler - Fonction de rappel ob_start pour réparer le buffer
    • ocibindbyname - Alias de oci_bind_by_name
    • ocicancel - Alias de oci_cancel
    • ocicloselob - Alias de OCI-Lob::close
    • ocicollappend - Alias de OCICollection::append
    • ocicollassign - Alias de OCICollection::assign
    • ocicollassignelem - Alias de OCICollection::assignElem
    • OCICollection::append - Ajoute un élément à une collection Oracle
    • OCICollection::assign - Assigne une valeur à une collection depuis une autre collection Oracle
    • OCICollection::assignElem - Assigne une valeur à un élément d'une collection Oracle
    • OCICollection::free - Libère les ressources associées avec un objet de collection
    • OCICollection::getElem - Retourne la valeur d'un élément d'une collection Oracle
    • OCICollection::max - Retourne le nombre maximal de valeurs d'une collection Oracle
    • OCICollection::size - Retourne la taille d'une collection Oracle
    • OCICollection::trim - Supprime les derniers éléments d'une collection Oracle
    • ocicollgetelem - Alias de OCICollection::getElem
    • ocicollmax - Alias de OCICollection::max
    • ocicollsize - Alias de OCICollection::size
    • ocicolltrim - Alias de OCICollection::trim
    • ocicolumnisnull - Alias de oci_field_is_null
    • ocicolumnname - Alias de oci_field_name
    • ocicolumnprecision - Alias de oci_field_precision
    • ocicolumnscale - Alias de oci_field_scale
    • ocicolumnsize - Alias de oci_field_size
    • ocicolumntype - Alias de oci_field_type
    • ocicolumntyperaw - Alias de oci_field_type_raw
    • ocicommit - Alias de oci_commit
    • ocidefinebyname - Alias de oci_define_by_name
    • ocierror - Alias de oci_error
    • ociexecute - Alias de oci_execute
    • ocifetch - Alias de oci_fetch
    • ocifetchinto - Variante obsolète de la fonction oci_fetch_array, oci_fetch_object, oci_fetch_assoc and oci_fetch_row
    • ocifetchstatement - Alias de oci_fetch_all
    • ocifreecollection - Alias de OCICollection::free
    • ocifreecursor - Alias de oci_free_statement
    • ocifreedesc - Alias de OCI-Lob::free
    • ocifreestatement - Alias de oci_free_statement
    • ociinternaldebug - Alias de oci_internal_debug
    • ociloadlob - Alias de OCI-Lob::load
    • OCILob::append - Ajoute des données à un LOB Oracle
    • OCILob::close - Ferme un LOB Oracle
    • OCILob::eof - Test la fin du LOB Oracle
    • OCILob::erase - Écrase une partie d'un LOB Oracle
    • OCILob::export - Exporte un LOB Oracle dans un fichier
    • OCILob::flush - Écrit les LOB Oracle sur le disque
    • OCILob::free - Détruit un pointeur de LOB Oracle
    • OCILob::getBuffering - Retourne l'état de bufferisation LOB d'Oracle
    • OCILob::import - Importe un fichier dans LOB Oracle
    • OCILob::load - Retourne le contenu d'un LOB
    • OCILob::read - Lit une partie d'un LOB Oracle
    • OCILob::rewind - Ramène le pointeur interne d'un LOB Oracle au début
    • OCILob::save - Sauvegarde des données dans un LOB Oracle
    • OCILob::saveFile - Alias de OCILob::import
    • OCILob::seek - Déplace le pointeur interne d'un LOB Oracle
    • OCILob::setBuffering - Active/désactive la bufferisation des LOB Oracle
    • OCILob::size - Retourne la taille d'un LOB Oracle
    • OCILob::tell - Retourne la position courante du pointeur de LOB
    • OCILob::truncate - Tronque un LOB Oracle
    • OCILob::write - Écrit des données dans un LOB Oracle
    • OCILob::writeTemporary - Écrit un LOB Oracle temporaire
    • OCILob::writeToFile - Alias de OCILob::export
    • ocilogoff - Alias de oci_close
    • ocilogon - Alias de oci_connect
    • ocinewcollection - Alias de oci_new_collection
    • ocinewcursor - Alias de oci_new_cursor
    • ocinewdescriptor - Alias de oci_new_descriptor
    • ocinlogon - Alias de oci_new_connect
    • ocinumcols - Alias de oci_num_fields
    • ociparse - Alias de oci_parse
    • ociplogon - Alias de oci_pconnect
    • ociresult - Alias de oci_result
    • ocirollback - Alias de oci_rollback
    • ocirowcount - Alias de oci_num_rows
    • ocisavelob - Alias de OCI-Lob::save
    • ocisavelobfile - Alias de OCI-Lob::import
    • ociserverversion - Alias de oci_server_version
    • ocisetprefetch - Alias de oci_set_prefetch
    • ocistatementtype - Alias de oci_statement_type
    • ociwritelobtofile - Alias de OCI-Lob::export
    • ociwritetemporarylob - Alias de OCI-Lob::writeTemporary
    • oci_bind_array_by_name - Lie un tableau PHP à un paramètre de tableau Oracle PL/SQL
    • oci_bind_by_name - Associe une variable PHP à un marqueur Oracle
    • oci_cancel - Termine la lecture de curseurs Oracle
    • oci_client_version - Retourne la version de la bibliothèque cliente Oracle
    • oci_close - Ferme une connexion Oracle
    • oci_commit - Valide les transactions Oracle en cours
    • oci_connect - Établit une connexion avec un serveur Oracle
    • oci_define_by_name - Associe une variable PHP avec une colonne pour une requête de récupération de données
    • oci_error - Retourne la dernière erreur Oracle
    • oci_execute - Exécute une commande SQL Oracle
    • oci_fetch - Lit la prochaine ligne d'un résultat Oracle dans un buffer interne
    • oci_fetch_all - Lit plusieurs lignes d'un résultat dans un tableau multi-dimensionnel
    • oci_fetch_array - Lit une ligne d'un résultat sous forme de tableau associatif ou numérique
    • oci_fetch_assoc - Lit une ligne d'un résultat sous forme de tableau associatif
    • oci_fetch_object - Lit une ligne d'un résultat sous forme d'objet
    • oci_fetch_row - Lit la prochaine ligne d'une requête sous forme de tableau numérique
    • oci_field_is_null - Test si un champ de la ligne récupérée vaut null
    • oci_field_name - Retourne le nom d'un champ Oracle
    • oci_field_precision - Lit la précision d'un champ Oracle
    • oci_field_scale - Lit l'échelle d'une colonne Oracle
    • oci_field_size - Retourne la taille d'un champ Oracle
    • oci_field_type - Retourne le type de données d'un champ Oracle
    • oci_field_type_raw - Lit les données brutes du type d'un champ
    • oci_free_descriptor - Libère un descripteur
    • oci_free_statement - Libère toutes les ressources réservées par un résultat Oracle
    • oci_get_implicit_resultset - Retourne le fils suivant d'une ressource de requête depuis une ressource de requête parent qui a un jeu de résultat implicite Oracle Database
    • oci_internal_debug - Enables or disables internal debug output
    • oci_lob_copy - Copie un LOB Oracle
    • oci_lob_is_equal - Compare deux LOB/FILE Oracle
    • oci_new_collection - Initialise une nouvelle collection Oracle
    • oci_new_connect - Connexion au serveur Oracle en utilisant une seule connexion
    • oci_new_cursor - Alloue et retourne un nouveau curseur Oracle
    • oci_new_descriptor - Initialise un nouveau pointeur vide de LOB/FILE Oracle
    • oci_num_fields - Retourne le nombre de colonnes dans un résultat Oracle
    • oci_num_rows - Retourne le nombre de lignes affectées durant la dernière commande Oracle
    • oci_parse - Prépare une requête SQL avec Oracle
    • oci_password_change - Modifie le mot de passe d'un utilisateur Oracle
    • oci_pconnect - Ouvre une connexion persistante à un serveur Oracle
    • oci_register_taf_callback - Register a user-defined callback function for Oracle Database TAF
    • oci_result - Retourne la valeur d'une colonne dans un résultat Oracle
    • oci_rollback - Annule les transactions Oracle en cours
    • oci_server_version - Retourne la version du serveur Oracle
    • oci_set_action - Définit le nom de l'action
    • oci_set_call_timeout - Sets a millisecond timeout for database calls
    • oci_set_client_identifier - Définit l'identifiant du client
    • oci_set_client_info - Définit l'information concernant le client
    • oci_set_db_operation - Sets the database operation
    • oci_set_edition - Définit l'édition de la base de données
    • oci_set_module_name - Définit le nom du module
    • oci_set_prefetch - Indique le nombre de lignes qui doivent être lues à l'avance par Oracle
    • oci_statement_type - Retourne le type de la requête Oracle
    • oci_unregister_taf_callback - Unregister a user-defined callback function for Oracle Database TAF
    • octdec - Conversion d'octal en décimal
    • odbc_autocommit - Active le mode d'autovalidation
    • odbc_binmode - Modifie la gestion des colonnes de données binaires
    • odbc_close - Ferme une connexion ODBC
    • odbc_close_all - Ferme toutes les connexions ODBC
    • odbc_columnprivileges - Liste les colonnes et leurs droits associés
    • odbc_columns - Liste les colonnes d'une table
    • odbc_commit - Valide une transaction ODBC
    • odbc_connect - Connexion à une source
    • odbc_cursor - Lit le nom du pointeur de résultat courant
    • odbc_data_source - Retourne des informations sur les DSNs disponibles
    • odbc_do - Alias de odbc_exec
    • odbc_error - Lit le dernier code d'erreur
    • odbc_errormsg - Lit le dernier message d'erreur
    • odbc_exec - Exécute directement une requête SQL
    • odbc_execute - Exécute une requête SQL préparée
    • odbc_fetch_array - Lit une ligne de résultat dans un tableau associatif
    • odbc_fetch_into - Lit une ligne de résultat, et la place dans un tableau
    • odbc_fetch_object - Lit une ligne de résultat dans un objet
    • odbc_fetch_row - Lit une ligne de résultat
    • odbc_field_len - Lit la longueur d'un champ
    • odbc_field_name - Lit le nom de la colonne
    • odbc_field_num - Numéro de colonne
    • odbc_field_precision - Alias de odbc_field_len
    • odbc_field_scale - Lit l'échelle d'un champ
    • odbc_field_type - Type de données d'un champ
    • odbc_foreignkeys - Liste les clés étrangères
    • odbc_free_result - Libère les ressources associées à un résultat
    • odbc_gettypeinfo - Liste les types de données supportés par une source
    • odbc_longreadlen - Gestion des colonnes de type LONG
    • odbc_next_result - Vérifie si plusieurs résultats sont disponibles
    • odbc_num_fields - Nombre de colonnes dans un résultat
    • odbc_num_rows - Nombre de lignes dans un résultat
    • odbc_pconnect - Ouvre une connexion persistante à une source de données
    • odbc_prepare - Prépare une commande pour l'exécution
    • odbc_primarykeys - Liste les colonnes utilisées dans une clé primaire
    • odbc_procedurecolumns - Liste les paramètres des procédures
    • odbc_procedures - Liste les procédures stockées
    • odbc_result - Lit un champ de résultat UODBC
    • odbc_result_all - Affiche le résultat sous la forme d'une table HTML
    • odbc_rollback - Annule une transaction
    • odbc_setoption - Modifie les paramètres ODBC
    • odbc_specialcolumns - Retourne l'ensemble optimal de colonnes
    • odbc_statistics - Calcul des statistiques sur une table
    • odbc_tableprivileges - Liste les tables et leurs privilèges
    • odbc_tables - Liste les tables d'une source
    • ogg:// - Flux Audio
    • opcache_compile_file - Compile et met en cache un script PHP sans l'exécuter
    • opcache_get_configuration - Récupère les informations de configuration du cache
    • opcache_get_status - Récupère les informations de statut du cache
    • opcache_invalidate - Invalide un script mis en cache
    • opcache_is_script_cached - Indique si un script est dans le cache d'OPCache
    • opcache_reset - Ré-initialise le contenu du cache opcode
    • openal_buffer_create - Génère un buffer OpenAL
    • openal_buffer_data - Charge un buffer avec des données
    • openal_buffer_destroy - Détruit un buffer OpenAL
    • openal_buffer_get - Récupère les propriétés du buffer OpenAL
    • openal_buffer_loadwav - Charge un fichier .wav dans le buffer
    • openal_context_create - Crée un contexte de traitement audio
    • openal_context_current - Rend courant le contexte spécifié
    • openal_context_destroy - Détruit un contexte
    • openal_context_process - Traite le contexte spécifié
    • openal_context_suspend - Suspend le contexte spécifié
    • openal_device_close - Ferme un périphérique OpenAL
    • openal_device_open - Initialise une interface audio OpenAL
    • openal_listener_get - Récupère une propriété d'auditeur
    • openal_listener_set - Définie une propriété d'auditeur
    • openal_source_create - Génère une ressource de source
    • openal_source_destroy - Détruit une ressource de source
    • openal_source_get - Récupère une propriété de source OpenAL
    • openal_source_pause - Marque une pause dans la source
    • openal_source_play - Démarre la lecture de la source
    • openal_source_rewind - Revient en arrière dans la source
    • openal_source_set - Définie une propriété de la source
    • openal_source_stop - Arrête la lecture de la source
    • openal_stream - Démarre le streaming d'une source
    • opendir - Ouvre un dossier, et récupère un pointeur dessus
    • openlog - Ouvre la connexion à l'historique système
    • openssl_cipher_iv_length - Récupère la longueur cipher iv
    • openssl_cms_decrypt - Decrypt a CMS message
    • openssl_cms_encrypt - Encrypt a CMS message
    • openssl_cms_read - Export the CMS file to an array of PEM certificates
    • openssl_cms_sign - Sign a file
    • openssl_cms_verify - Verify a CMS signature
    • openssl_csr_export - Exporte un CSR vers un fichier ou une variable
    • openssl_csr_export_to_file - Exporte une CSR vers un fichier
    • openssl_csr_get_public_key - Retourne la clé publique d'un CSR
    • openssl_csr_get_subject - Retourne le sujet d'une CSR
    • openssl_csr_new - Génère une CSR
    • openssl_csr_sign - Signe un CSR avec un autre certificat (ou lui-même) et génère un certificat
    • openssl_decrypt - Déchiffrer les données
    • openssl_dh_compute_key - Calcule un secret partagé pour une valeur publique de la clé DH publique distante et la clé DH locale
    • openssl_digest - Calcule un digest
    • openssl_encrypt - Chiffre les données
    • openssl_error_string - Retourne le message d'erreur OpenSSL
    • openssl_free_key - Libère les ressources
    • openssl_get_cert_locations - Récupère les chemins vers les certificats disponibles
    • openssl_get_cipher_methods - Récupère la liste des méthodes de chiffrements disponibles
    • openssl_get_curve_names - Récupère la liste des noms de courbes disponibles pour ECC
    • openssl_get_md_methods - Récupère la liste des méthodes digest disponibles
    • openssl_get_privatekey - Alias de openssl_pkey_get_private
    • openssl_get_publickey - Alias de openssl_pkey_get_public
    • openssl_open - Ouvre des données scellées
    • openssl_pbkdf2 - Génère une chaîne PKCS5 v2 PBKDF2
    • openssl_pkcs7_decrypt - Déchiffre un message S/MIME
    • openssl_pkcs7_encrypt - Chiffre un message S/MIME
    • openssl_pkcs7_read - Exporte le fichier PKCS7 vers un tableau de certificats PEM
    • openssl_pkcs7_sign - Signe un message S/MIME
    • openssl_pkcs7_verify - Vérifie la signature d'un message S/MIME
    • openssl_pkcs12_export - Exporte un certificat compatible PKCS#12 dans une variable
    • openssl_pkcs12_export_to_file - Exporte un certificat compatible PKCS#12
    • openssl_pkcs12_read - Lit un certificat PKCS#12 dans un tableau
    • openssl_pkey_derive - Computes shared secret for public value of remote and local DH or ECDH key
    • openssl_pkey_export - Stocke une représentation exportable de la clé dans une chaîne de caractères
    • openssl_pkey_export_to_file - Sauve une clé au format ASCII dans un fichier
    • openssl_pkey_free - Libère une clé privée
    • openssl_pkey_get_details - Retourne un tableau contenant les détails de la clé
    • openssl_pkey_get_private - Lit une clé privée
    • openssl_pkey_get_public - Extrait une clé publique d'un certificat, et la prépare
    • openssl_pkey_new - Génère une nouvelle clé privée
    • openssl_private_decrypt - Déchiffre des données avec une clé privée
    • openssl_private_encrypt - Chiffre des données avec une clé privée
    • openssl_public_decrypt - Déchiffre des données avec une clé publique
    • openssl_public_encrypt - Chiffre des données avec une clé publique
    • openssl_random_pseudo_bytes - Génère une chaine pseudo-aléatoire d'octets
    • openssl_seal - Scelle des données
    • openssl_sign - Signe les données
    • openssl_spki_export - Exporte un PEM valide formaté comme une clé publique signée
    • openssl_spki_export_challenge - Exporte le challenge associé avec la clé publique signée
    • openssl_spki_new - Génère une clé publique signée et effectue un challenge
    • openssl_spki_verify - Vérifie une clé publique signée, et effectue un challenge
    • openssl_verify - Vérifie une signature
    • openssl_x509_checkpurpose - Vérifie l'usage d'un certificat
    • openssl_x509_check_private_key - Vérifie si une clé privée correspond à un certificat
    • openssl_x509_export - Exporte un certificat vers une chaîne de caractères
    • openssl_x509_export_to_file - Exporte un certificat vers un fichier
    • openssl_x509_fingerprint - Calcule l'empreinte, ou le digest d'un certificat X.509 donné
    • openssl_x509_free - Libère les ressources prises par un certificat
    • openssl_x509_parse - Analyse un certificat X509
    • openssl_x509_read - Analyse un certificat X.509 et retourne un objet
    • openssl_x509_verify - Vérifie la signature digitale d'un certificat x509 par rapport à une clé publique
    • Options de contexte CURL - Liste des options de contexte CURL
    • Options de contexte des sockets - Liste des options de contexte des sockets
    • Options de contexte FTP - Liste des options de contexte FTP
    • Options de contexte HTTP - Liste des options de contexte HTTP
    • Options de contexte MongoDB - Liste des options de contexte MongoDB
    • Options de contexte SSL - Liste des options de contexte SSL
    • Options de contexte Zip - Zip context option listing
    • ord - Convertit le premier octet d'une chaîne en une valeur entre 0 et 255
    • OuterIterator::getInnerIterator - Retourne l'itérateur interne pour l'entrée courante
    • output_add_rewrite_var - Ajoute une règle de réécriture d'URL
    • output_reset_rewrite_vars - Annule la réécriture d'URL
  • p
    • pack - Compacte des données dans une chaîne binaire
    • parallel\bootstrap - Bootstrapping
    • parallel\Channel::close - Closing
    • parallel\Channel::make - Access
    • parallel\Channel::open - Access
    • parallel\Channel::recv - Sharing
    • parallel\Channel::send - Sharing
    • parallel\Channel::__construct - Channel Construction
    • parallel\Events::addChannel - Targets
    • parallel\Events::addFuture - Targets
    • parallel\Events::poll - Polling
    • parallel\Events::remove - Targets
    • parallel\Events::setBlocking - Behaviour
    • parallel\Events::setInput - Input
    • parallel\Events::setTimeout - Behaviour
    • parallel\Events\Input::add - Inputs
    • parallel\Events\Input::clear - Inputs
    • parallel\Events\Input::remove - Inputs
    • parallel\Future::cancel - Cancellation
    • parallel\Future::cancelled - State Detection
    • parallel\Future::done - State Detection
    • parallel\Future::value - Resolution
    • parallel\run - Execution
    • parallel\Runtime::close - Runtime Graceful Join
    • parallel\Runtime::kill - Runtime Join
    • parallel\Runtime::run - Execution
    • parallel\Runtime::__construct - Runtime Construction
    • parallel\Sync::get - Access
    • parallel\Sync::notify - Synchronization
    • parallel\Sync::set - Access
    • parallel\Sync::wait - Synchronization
    • parallel\Sync::__construct - Construction
    • parallel\Sync::__invoke - Synchronization
    • Paramètres de contexte - Liste des paramètres de contexte
    • ParentIterator::accept - Détermine si l'élément courant a des fils
    • ParentIterator::getChildren - Retourne le fils de l'itérateur interne contenu dans ParentIterator
    • ParentIterator::hasChildren - Vérifie si l'élément courant de l'itérateur interne a un fils
    • ParentIterator::next - Déplace l'itérateur à la position suivante
    • ParentIterator::rewind - Replace l'itérateur au début
    • ParentIterator::__construct - Construit un nouvel objet ParentIterator
    • Parle\Lexer::advance - Process next lexer rule
    • Parle\Lexer::build - Finalize the lexer rule set
    • Parle\Lexer::callout - Define token callback
    • Parle\Lexer::consume - Pass the data for processing
    • Parle\Lexer::dump - Dump the state machine
    • Parle\Lexer::getToken - Retrieve the current token
    • Parle\Lexer::insertMacro - Insert regex macro
    • Parle\Lexer::push - Add a lexer rule
    • Parle\Lexer::reset - Reset lexer
    • Parle\Parser::advance - Process next parser rule
    • Parle\Parser::build - Finalize the grammar rules
    • Parle\Parser::consume - Consume the data for processing
    • Parle\Parser::dump - Dump the grammar
    • Parle\Parser::errorInfo - Retrieve the error information
    • Parle\Parser::left - Declare a token with left-associativity
    • Parle\Parser::nonassoc - Declare a token with no associativity
    • Parle\Parser::precedence - Declare a precedence rule
    • Parle\Parser::push - Add a grammar rule
    • Parle\Parser::reset - Reset parser state
    • Parle\Parser::right - Declare a token with right-associativity
    • Parle\Parser::sigil - Retrieve a matching part of a rule
    • Parle\Parser::token - Declare a token
    • Parle\Parser::tokenId - Get token id
    • Parle\Parser::trace - Trace the parser operation
    • Parle\Parser::validate - Validate input
    • Parle\RLexer::advance - Process next lexer rule
    • Parle\RLexer::build - Finalize the lexer rule set
    • Parle\RLexer::callout - Define token callback
    • Parle\RLexer::consume - Pass the data for processing
    • Parle\RLexer::dump - Dump the state machine
    • Parle\RLexer::getToken - Retrieve the current token
    • Parle\RLexer::insertMacro - Insert regex macro
    • Parle\RLexer::push - Add a lexer rule
    • Parle\RLexer::pushState - Push a new start state
    • Parle\RLexer::reset - Reset lexer
    • Parle\RParser::advance - Process next parser rule
    • Parle\RParser::build - Finalize the grammar rules
    • Parle\RParser::consume - Consume the data for processing
    • Parle\RParser::dump - Dump the grammar
    • Parle\RParser::errorInfo - Retrieve the error information
    • Parle\RParser::left - Declare a token with left-associativity
    • Parle\RParser::nonassoc - Declare a token with no associativity
    • Parle\RParser::precedence - Declare a precedence rule
    • Parle\RParser::push - Add a grammar rule
    • Parle\RParser::reset - Reset parser state
    • Parle\RParser::right - Declare a token with right-associativity
    • Parle\RParser::sigil - Retrieve a matching part of a rule
    • Parle\RParser::token - Declare a token
    • Parle\RParser::tokenId - Get token id
    • Parle\RParser::trace - Trace the parser operation
    • Parle\RParser::validate - Validate input
    • Parle\Stack::pop - Pop an item from the stack
    • Parle\Stack::push - Push an item into the stack
    • parse_ini_file - Analyse un fichier de configuration
    • parse_ini_string - Analyse une chaîne de configuration
    • parse_str - Analyse une chaîne de caractères d'une variable
    • parse_url - Analyse une URL et retourne ses composants
    • passthru - Exécute un programme externe et affiche le résultat brut
    • password_algos - Récupère tous les identifiants des algorithmes de hachage de mots de passe disponibles
    • password_get_info - Retourne des informations à propos du hachage fourni
    • password_hash - Crée une clé de hachage pour un mot de passe
    • password_needs_rehash - Vérifie que le hachage fourni est conforme à l'algorithme et aux options spécifiées
    • password_verify - Vérifie qu'un mot de passe correspond à un hachage
    • pathinfo - Retourne des informations sur un chemin système
    • pclose - Ferme un processus de pointeur de fichier
    • pcntl_alarm - Planifie une alarme pour délivrer un signal
    • pcntl_async_signals - Enable/disable asynchronous signal handling or return the old setting
    • pcntl_errno - Alias de pcntl_get_last_error
    • pcntl_exec - Exécute le programme indiqué dans l'espace courant de processus
    • pcntl_fork - Duplique le process courant
    • pcntl_getpriority - Retourne la priorité d'un processus
    • pcntl_get_last_error - Récupère le numéro de l'erreur générée par la dernière fonction pcntl utilisée
    • pcntl_setpriority - Change la priorité d'un processus
    • pcntl_signal - Installe un gestionnaire de signaux
    • pcntl_signal_dispatch - Appelle les gestionnaires de signaux pour chaque signal en attente
    • pcntl_signal_get_handler - Récupère le gestionnaire courant pour le signal spécifié
    • pcntl_sigprocmask - Liste et configure les signaux bloqués
    • pcntl_sigtimedwait - Attend un signal dans un délai donné
    • pcntl_sigwaitinfo - Attend un signal
    • pcntl_strerror - Récupère le message d'erreur système associé avec l'errno fourni
    • pcntl_wait - Attend ou retourne le statut d'un processus fils
    • pcntl_waitpid - Attend la fin de l'exécution d'un processus fils
    • pcntl_wexitstatus - Retourne le code d'un processus fils terminé
    • pcntl_wifexited - Vérifie si le code de retour représente une fin normale
    • pcntl_wifsignaled - Retourne true si le code statut représente une fin due à un signal
    • pcntl_wifstopped - Retourne true si le processus fils est stoppé
    • pcntl_wstopsig - Retourne le signal qui a causé l'arrêt du processus fils
    • pcntl_wtermsig - Retourne le signal qui a provoqué la fin du processus fils
    • PDO::beginTransaction - Démarre une transaction
    • PDO::commit - Valide une transaction
    • PDO::cubrid_schema - Récupère le schéma d'informations demandé
    • PDO::errorCode - Retourne le SQLSTATE associé avec la dernière opération sur la base de données
    • PDO::errorInfo - Retourne les informations associées à l'erreur lors de la dernière opération sur la base de données
    • PDO::exec - Exécute une requête SQL et retourne le nombre de lignes affectées
    • PDO::getAttribute - Récupère un attribut d'une connexion à une base de données
    • PDO::getAvailableDrivers - Retourne la liste des pilotes PDO disponibles
    • PDO::inTransaction - Vérifie si nous sommes dans une transaction
    • PDO::lastInsertId - Retourne l'identifiant de la dernière ligne insérée ou la valeur d'une séquence
    • PDO::pgsqlCopyFromArray - Copie des données d'un tableau PHP dans une table
    • PDO::pgsqlCopyFromFile - Copie des données d'un fichier dans une table
    • PDO::pgsqlCopyToArray - Copie des données d'une table de base de donnée dans un tableau PHP
    • PDO::pgsqlCopyToFile - Copie des données d'une table dans un fichier
    • PDO::pgsqlGetNotify - Récupère une notification asynchrone
    • PDO::pgsqlGetPid - Récupère le PID du serveur
    • PDO::pgsqlLOBCreate - Crée un nouvel objet large
    • PDO::pgsqlLOBOpen - Ouvre un flux existant de large objet
    • PDO::pgsqlLOBUnlink - Supprime un objet large
    • PDO::prepare - Prépare une requête à l'exécution et retourne un objet
    • PDO::query - Exécute une requête SQL, retourne un jeu de résultats en tant qu'objet PDOStatement
    • PDO::quote - Protège une chaîne pour l'utiliser dans une requête SQL PDO
    • PDO::rollBack - Annule une transaction
    • PDO::setAttribute - Configure un attribut PDO
    • PDO::sqliteCreateAggregate - Référence une fonction agrégative définie par l'utilisateur pour une utilisation dans les requêtes SQL
    • PDO::sqliteCreateCollation - Enregistre une fonction PHP ou définie par l'utilisateur pour l'utiliser comme une fonction de collecte dans les requêtes SQL.
    • PDO::sqliteCreateFunction - Référence une fonction définie par l'utilisateur pour une utilisation dans les requêtes SQL
    • PDO::__construct - Crée une instance PDO qui représente une connexion à la base
    • PDOStatement::bindColumn - Lie une colonne à une variable PHP
    • PDOStatement::bindParam - Lie un paramètre à un nom de variable spécifique
    • PDOStatement::bindValue - Associe une valeur à un paramètre
    • PDOStatement::closeCursor - Ferme le curseur, permettant à la requête d'être de nouveau exécutée
    • PDOStatement::columnCount - Retourne le nombre de colonnes dans le jeu de résultats
    • PDOStatement::debugDumpParams - Détaille une commande préparée SQL
    • PDOStatement::errorCode - Récupère les informations sur l'erreur associée lors de la dernière opération sur la requête
    • PDOStatement::errorInfo - Récupère les informations sur l'erreur associée lors de la dernière opération sur la requête
    • PDOStatement::execute - Exécute une requête préparée
    • PDOStatement::fetch - Récupère la ligne suivante d'un jeu de résultats PDO
    • PDOStatement::fetchAll - Retourne un tableau contenant toutes les lignes du jeu d'enregistrements
    • PDOStatement::fetchColumn - Retourne une colonne depuis la ligne suivante d'un jeu de résultats
    • PDOStatement::fetchObject - Récupère la prochaine ligne et la retourne en tant qu'objet
    • PDOStatement::getAttribute - Récupère un attribut de requête
    • PDOStatement::getColumnMeta - Retourne les métadonnées pour une colonne d'un jeu de résultats
    • PDOStatement::nextRowset - Avance à la prochaine ligne de résultats d'un gestionnaire de lignes de résultats multiples
    • PDOStatement::rowCount - Retourne le nombre de lignes affectées par le dernier appel à la fonction PDOStatement::execute()
    • PDOStatement::setAttribute - Définit un attribut de requête
    • PDOStatement::setFetchMode - Définit le mode de récupération par défaut pour cette requête
    • PDO_DBLIB DSN - Connexion au Serveur Microsoft SQL et bases de données Sybase
    • PDO_FIREBIRD DSN - Connexion aux bases de données Firebird
    • PDO_IBM DSN - Connexion aux bases de données IBM
    • PDO_INFORMIX DSN - Connexion aux bases de données Informix
    • PDO_MYSQL DSN - Connexion aux bases de données MySQL
    • PDO_OCI DSN - Connexion aux bases de données Oracle
    • PDO_ODBC DSN - Connexion aux bases de données ODBC ou DB2
    • PDO_PGSQL DSN - Connexion aux bases de données PostgreSQL
    • PDO_SQLITE DSN - Connexion aux bases de données SQLite
    • PDO_SQLSRV DSN - Connexion à des bases de données MS SQL Server et SQL Azure
    • pfsockopen - Ouvre un socket de connexion Internet ou Unix persistante
    • pg_affected_rows - Retourne le nombre de lignes affectées
    • pg_cancel_query - Annule une requête asynchrone
    • pg_client_encoding - Lit l'encodage du client
    • pg_close - Termine une connexion PostgreSQL
    • pg_connect - Établit une connexion PostgreSQL
    • pg_connection_busy - Vérifie si la connexion PostgreSQL est occupée
    • pg_connection_reset - Relance la connexion au serveur PostgreSQL
    • pg_connection_status - Lit le statut de la connexion PostgreSQL
    • pg_connect_poll - Test le statut d'une tentative de connexion asynchrone PostgreSQL en cours
    • pg_consume_input - Lit l'entrée de la connexion
    • pg_convert - Convertit des valeurs d'un tableaux associatifs en une forme convenable pour des requêtes SQL
    • pg_copy_from - Insère des lignes dans une table à partir d'un tableau
    • pg_copy_to - Copie une table dans un tableau
    • pg_dbname - Retourne le nom de la base de données PostgreSQL
    • pg_delete - Efface des lignes PostgreSQL
    • pg_end_copy - Synchronise avec le serveur PostgreSQL
    • pg_escape_bytea - Protège une chaîne pour insertion dans un champ bytea
    • pg_escape_identifier - Protège un identifiant pour l'insertion dans un champ texte.
    • pg_escape_literal - Protège une requête SQL littérale à insérer dans un champ texte
    • pg_escape_string - Protège une chaîne de caractères pour une requête SQL
    • pg_execute - Exécute une requête préparée PostGreSQL
    • pg_fetch_all - Lit toutes les lignes d'un résultat
    • pg_fetch_all_columns - Récupère toutes les lignes d'une colonne de résultats particulière en tant que tableau
    • pg_fetch_array - Lit une ligne de résultat PostgreSQL dans un tableau
    • pg_fetch_assoc - Lit une ligne de résultat PostgreSQL sous forme de tableau associatif
    • pg_fetch_object - Lit une ligne de résultat PostgreSQL dans un objet
    • pg_fetch_result - Retourne les valeurs d'un résultat
    • pg_fetch_row - Lit une ligne dans un tableau
    • pg_field_is_null - Teste si un champ PostgreSQL est à null
    • pg_field_name - Retourne le nom d'un champ PostgreSQL
    • pg_field_num - Retourne le numéro d'une colonne
    • pg_field_prtlen - Retourne la taille imprimée
    • pg_field_size - Retourne la taille interne de stockage d'un champ donné
    • pg_field_table - Retourne le nom ou l'oid d'une table
    • pg_field_type - Retourne le type d'un champ PostgreSQL donné par index
    • pg_field_type_oid - Retourne le type ID (OID) pour le numéro du champ correspondant
    • pg_flush - Envoi les données de requête sortante sur la connexion
    • pg_free_result - Libère la mémoire
    • pg_get_notify - Lit le message SQL NOTIFY
    • pg_get_pid - Lit l'identifiant de processus du serveur PostgreSQL
    • pg_get_result - Lit un résultat PostgreSQL asynchrone
    • pg_host - Retourne le nom d'hôte
    • pg_insert - Insère un tableau dans une table
    • pg_last_error - Lit le dernier message d'erreur sur la connexion
    • pg_last_notice - Retourne la dernière note du serveur PostgreSQL
    • pg_last_oid - Retourne l'identifiant de la dernière ligne
    • pg_lo_close - Ferme un objet de grande taille PostgreSQL
    • pg_lo_create - Crée un objet de grande taille PostgreSQL
    • pg_lo_export - Exporte un objet de grande taille vers un fichier
    • pg_lo_import - Importe un objet de grande taille depuis un fichier
    • pg_lo_open - Ouvre un objet de grande taille PostgreSQL
    • pg_lo_read - Lit un objet de grande taille
    • pg_lo_read_all - Lit un objet de grande taille en totalité
    • pg_lo_seek - Modifie la position dans un objet de grande taille
    • pg_lo_tell - Retourne la position courante dans un objet de grande taille PostgreSQL
    • pg_lo_truncate - Tronque un objet large
    • pg_lo_unlink - Efface un objet de grande taille PostgreSQL
    • pg_lo_write - Écrit un objet de grande taille PostgreSQL
    • pg_meta_data - Lit les métadonnées de la table PostgreSQL
    • pg_num_fields - Retourne le nombre de champ
    • pg_num_rows - Retourne le nombre de lignes PostgreSQL
    • pg_options - Retourne les options PostgreSQL
    • pg_parameter_status - Consulte un paramètre de configuration courant du serveur
    • pg_pconnect - Établit une connexion PostgreSQL persistante
    • pg_ping - Ping la connexion à la base
    • pg_port - Retourne le numéro de port
    • pg_prepare - Envoie une requête pour créer une requête préparée avec les paramètres donnés et attend l'exécution
    • pg_put_line - Envoie une chaîne au serveur PostgreSQL
    • pg_query - Exécute une requête PostgreSQL
    • pg_query_params - Envoie une commande au serveur et attend le résultat, avec les capacités de passer des paramètres séparément de la commande texte SQL
    • pg_result_error - Lit le message d'erreur associé à un résultat
    • pg_result_error_field - Retourne un champ individuel d'un rapport d'erreur
    • pg_result_seek - Modifie la ligne courant dans un résultat
    • pg_result_status - Lit le statut du résultat
    • pg_select - Effectue une sélection PostgreSQL
    • pg_send_execute - Envoie une requête pour exécuter une requête préparée avec des paramètres donnés, sans attendre le(s) résultat(s)
    • pg_send_prepare - Envoie une requête pour créer une requête préparée avec les paramètres donnés, sans attendre la fin de son exécution
    • pg_send_query - Exécute une requête PostgreSQL asynchrone
    • pg_send_query_params - Envoie une commande et sépare les paramètres au serveur sans attendre le(s) résultat(s)
    • pg_set_client_encoding - Choisit l'encodage du client PostgreSQL
    • pg_set_error_verbosity - Détermine la le degré des messages retournés par pg_last_error et pg_result_error
    • pg_socket - Récupère un gestionnaire de lecture seul sur le socket sous-jacent d'une connexion PostgreSQL
    • pg_trace - Active le suivi d'une connexion PostgreSQL
    • pg_transaction_status - Retourne le statut de la transaction en cours du serveur
    • pg_tty - Retourne le nom de TTY associé à la connexion
    • pg_unescape_bytea - Supprime la protection d'une chaîne de type bytea
    • pg_untrace - Termine le suivi d'une connexion PostgreSQL
    • pg_update - Modifie les lignes d'une table
    • pg_version - Retourne un tableau avec les versions du client, du protocole et du serveur (si disponible)
    • phar:// - Archive PHP
    • Phar::addEmptyDir - Ajoute un répertoire vide à l'archive phar
    • Phar::addFile - Ajoute un fichier du système de fichiers à l'archive phar
    • Phar::addFromString - Ajoute un fichier depuis une chaîne de caractère à l'archive phar
    • Phar::apiVersion - Retourne la version de l'API
    • Phar::buildFromDirectory - Construit une archive phar à partir des fichiers d'un répertoire
    • Phar::buildFromIterator - Construit une archive phar à partir d'un itérateur
    • Phar::canCompress - Détermine si l'extension phar supporte une la compression en utilisant soit zip soit bzip2
    • Phar::canWrite - Détermine si l'extension phar supporte la création et l'écriture des phars
    • Phar::compress - Compresse l'archive Phar complète en utilisant la compression Gzip ou Bzip2
    • Phar::compressFiles - Compresse tous les fichiers de l'archive Phar courante'
    • Phar::convertToData - Convertit une archive phar en un fichier non-exécutable
    • Phar::convertToExecutable - Convertit une archive phar vers un autre format de fichier d'archive phar exécutable
    • Phar::copy - Copie un fichier appartenant à une archive vers un autre fichier de la même archive
    • Phar::count - Retourne le nombre d'entrées (fichiers) dans l'archive Phar
    • Phar::createDefaultStub - Crée un conteneur de chargement d'une archive Phar
    • Phar::decompress - Décompresse l'archive tar complète
    • Phar::decompressFiles - Décompresse tous les fichiers de l'archive Phar courante
    • Phar::delete - Efface un fichier au sein d'une archive phar
    • Phar::delMetadata - Efface les méta-données globales du phar
    • Phar::extractTo - Extrait le contenu d'une archive phar vers un répertoire
    • Phar::getAlias - Récupère l'alias pour Phar
    • Phar::getMetadata - Retourne les méta-données de l'archive phar
    • Phar::getModified - Indique si le fichier phar a été modifié
    • Phar::getPath - Récupère le chemin absolue de l'archive Phar sur le disque
    • Phar::getSignature - Retourne la signature MD5/SHA1/SHA256/SHA512 d'une archive Phar
    • Phar::getStub - Retourne le chargeur PHP ou le conteneur de chargement d'une archive Phar
    • Phar::getSupportedCompression - Retourne un tableau des algorithmes de compression supportés
    • Phar::getSupportedSignatures - Retourne un tableau des types de signature supportés
    • Phar::getVersion - Retourne les informations de version de l'archive Phar
    • Phar::hasMetadata - Détermine si le phar a ou non des méta-données
    • Phar::interceptFileFuncs - Informe phar qu'il doit intercepter les fonctions de fichiers
    • Phar::isBuffering - Détermine si les opérations d'écriture du Phar sont mises en tampons ou sont directement inscrites sur le disque
    • Phar::isCompressed - Retourne Phar::GZ ou PHAR::BZ2 si l'archive entière est compressée (.tar.gz/tar.bz, etc)
    • Phar::isFileFormat - Retourne true si l'archive phar est basée sur le formats de fichier tar/phar/zip selon le paramètre
    • Phar::isValidPharFilename - Détermine si le nom de fichier spécifié est un nom de fichier valide pour une archive phar
    • Phar::isWritable - Retourne true si l'archive phar peut être modifiée
    • Phar::loadPhar - Charge n'importe quelle archive phar avec un alias
    • Phar::mapPhar - Lit le phar exécuté et charge son manifeste
    • Phar::mount - Monte un chemin ou un fichier externe à un emplacement virtuel au sein de l'archive phar
    • Phar::mungServer - Définit une liste de maximum 4 variables $_SERVER qui doivent être modifiées lors de l'exécution
    • Phar::offsetExists - Détermine si un fichier existe dans le phar
    • Phar::offsetGet - Obtient un objet PharFileInfo à partir d'un fichier
    • Phar::offsetSet - Met le contenu d'un fichier interne à l'archive à l'identique du contenu d'un fichier externe
    • Phar::offsetUnset - Efface un fichier d'un phar
    • Phar::running - Retourne le chemin complet sur le disque ou l'URL phar complète de l'archive phar couramment exécutée
    • Phar::setAlias - Fixe l'alias de l'archive Phar
    • Phar::setDefaultStub - Utilisé pour fixer le chargeur PHP ou le conteneur de chargement d'une archive Phar en tant que chargeur par défaut
    • Phar::setMetadata - Fixe les métadonnées de l'archive phar
    • Phar::setSignatureAlgorithm - Fixe et applique l'algorithme de signature d'un phar
    • Phar::setStub - Utilisé pour spécifier le chargeur PHP ou le conteneur de chargement d'une archive Phar
    • Phar::startBuffering - Démarre la mise en tampon de écritures Phar, ne modifie pas l'objet Phar sur le disque
    • Phar::stopBuffering - Arrête la mise en tampon des écritures Phar et provoque l'écriture que le disque
    • Phar::unlinkArchive - Efface complètement une archive phar du disque et de la mémoire
    • Phar::webPhar - mapPhar pour les phars orientés web. Contrôleur pour les applications web
    • Phar::__construct - Construit un objet d'archive Phar
    • PharData::addEmptyDir - Ajoute un répertoire vide à l'archive tar/zip
    • PharData::addFile - Ajoute un fichier du système de fichiers à l'archive tar/zip
    • PharData::addFromString - Ajoute un fichier du système de fichiers à l'archive tar/zip
    • PharData::buildFromDirectory - Construit une archive tar/zip à partir des fichiers d'un répertoire
    • PharData::buildFromIterator - Construit une archive tar ou zip à partir d'un itérateur
    • PharData::compress - Compresse l'archive tar/zip complète en utilisant la compression Gzip ou Bzip2
    • PharData::compressFiles - Compresse tous les fichiers de l'archive tar/zip courante
    • PharData::convertToData - Convertit une archive phar en une archive tar ou zip non-exécutable
    • PharData::convertToExecutable - Convertit une archive tar/zip non-exécutable en une archive phar exécutable
    • PharData::copy - Copie un fichier un fichier interne à l'archive phar vers un autre fichier au sein de la même archive
    • PharData::decompress - Décompresse l'archive Phar entière
    • PharData::decompressFiles - Décompresse tous les fichiers de l'archive zip courante
    • PharData::delete - Efface un fichier au sein de l'archive tar/zip
    • PharData::delMetadata - Efface les méta-données globales d'une archive zip
    • PharData::extractTo - Extrait le contenu d'une archive tar/zip vers un répertoire
    • PharData::isWritable - Vérifie si l'archive tar/zip peut être modifiée
    • PharData::offsetSet - Remplit un fichier au sein de l'archive tar/zip avec le contenu d'un fichier externe ou d'une chaîne de caractères
    • PharData::offsetUnset - Efface un fichier d'une archive tar/zip
    • PharData::setAlias - Fonction inutile (Phar::setAlias n'est pas valide pour PharData)
    • PharData::setDefaultStub - Fonction inutile (Phar::setDefaultStub n'est pas valide pour PharData)
    • PharData::setMetadata - Fixe les méta-données de l'archive
    • PharData::setSignatureAlgorithm - Assigne l'algorithme de signature d'un phar et l'applique
    • PharData::setStub - Fonction inutile (Phar::setStub n'est pas valide pour PharData)
    • PharData::__construct - Construit un objet d'archive tar ou zip non-exécutable
    • PharFileInfo::chmod - Fixe les bits de permission spécifiques aux fichiers
    • PharFileInfo::compress - Compresse l'entrée Phar courante avec une des compressions zlib ou bzip2
    • PharFileInfo::decompress - Décompresse l'entrée Phar courante au sein du phar
    • PharFileInfo::delMetadata - Efface les métadonnées de l'entrée
    • PharFileInfo::getCompressedSize - Retourne la taille actuelle (avec compression) du fichier au sein de l'archive Phar
    • PharFileInfo::getContent - Récupère le contenu entier du fichier de l'entrée
    • PharFileInfo::getCRC32 - Retourne le code CRC32 ou soulève une exception si le CRC n'a pas été vérifié
    • PharFileInfo::getMetadata - Retourne les méta-données spécifiques attachées à un fichier
    • PharFileInfo::getPharFlags - Retourne les drapeaux du fichier Phar
    • PharFileInfo::hasMetadata - Retourne les méta-données de l'entrée
    • PharFileInfo::isCompressed - Retourne si l'entrée est compressée
    • PharFileInfo::isCRCChecked - Détermine si le fichier a un CRC vérifié
    • PharFileInfo::setMetadata - Fixe les métadonnées spécifiques à un fichier
    • PharFileInfo::__construct - Construit un objet d'entrée Phar
    • php:// - Accès aux divers flux I/O
    • phpcredits - Affiche les crédits de PHP
    • phpdbg_break_file - Insère un point d'arrêt dans une ligne d'un fichier
    • phpdbg_break_function - Insère un point d'arrêt à l'entrée d'une fonction
    • phpdbg_break_method - Insère un point d'arrêt à l'entrée d'une méthode
    • phpdbg_break_next - Insère un point d'arrêt au prochain opcode
    • phpdbg_clear - Supprime tous les points d'arrêt
    • phpdbg_color - Définie la couleur de certaines éléments
    • phpdbg_end_oplog - Description
    • phpdbg_exec - Tente de définir le contexte d'exécution
    • phpdbg_get_executable - Description
    • phpdbg_prompt - Définie l'invite de commande
    • phpdbg_start_oplog - Description
    • phpinfo - Affiche de nombreuses informations sur la configuration de PHP
    • PhpToken::getTokenName - Returns the name of the token.
    • PhpToken::is - Tells whether the token is of given kind.
    • PhpToken::isIgnorable - Tells whether the token would be ignored by the PHP parser.
    • PhpToken::tokenize - Splits given source into PHP tokens, represented by PhpToken objects.
    • PhpToken::__construct - Returns a new PhpToken object
    • PhpToken::__toString - Returns the textual content of the token.
    • phpversion - Retourne le numéro de la version courante de PHP
    • php_ini_loaded_file - Récupère le chemin d'un fichier php.ini chargé
    • php_ini_scanned_files - Retourne la liste des fichiers .ini analysés dans les dossiers de configuration supplémentaires
    • php_sapi_name - Retourne le type d'interface utilisée entre le serveur web et PHP
    • php_strip_whitespace - Retourne la source sans commentaires, ni espaces blancs
    • php_uname - Retourne les informations sur le système d'exploitation
    • php_user_filter::filter - Appelé lors de l'application d'un filtre
    • php_user_filter::onClose - Appelé lors de la fermeture du filtre
    • php_user_filter::onCreate - Appelé lors de la création du filtre
    • pht\AtomicInteger::dec - Decrements the atomic integer's value by one
    • pht\AtomicInteger::get - Gets the atomic integer's value
    • pht\AtomicInteger::inc - Increments the atomic integer's value by one
    • pht\AtomicInteger::lock - Acquires the atomic integer's mutex lock
    • pht\AtomicInteger::set - Sets the atomic integer's value
    • pht\AtomicInteger::unlock - Releases the atomic integer's mutex lock
    • pht\AtomicInteger::__construct - AtomicInteger creation
    • pht\HashTable::lock - Acquires the hash table's mutex lock
    • pht\HashTable::size - Gets the size of the hash table
    • pht\HashTable::unlock - Releases the hash table's mutex lock
    • pht\Queue::front - Returns the first value from a queue
    • pht\Queue::lock - Acquires the queue's mutex lock
    • pht\Queue::pop - Pops a value off of the front of a queue
    • pht\Queue::push - Pushes a value to the end of a queue
    • pht\Queue::size - Gets the size of the queue
    • pht\Queue::unlock - Releases the queue's mutex lock
    • pht\Runnable::run - Point d'entrée d'une classe threadée
    • pht\Thread::addClassTask - Class threading
    • pht\Thread::addFileTask - File threading
    • pht\Thread::addFunctionTask - Function threading
    • pht\Thread::join - Joins a thread
    • pht\Thread::start - Starts the new thread
    • pht\Thread::taskCount - Gets a thread's task count
    • pht\Threaded::lock - Acquires the mutex lock
    • pht\Threaded::unlock - Releases the mutex lock
    • pht\Vector::deleteAt - Deletes a value in the vector
    • pht\Vector::insertAt - Inserts a value into the vector
    • pht\Vector::lock - Acquires the vector's mutex lock
    • pht\Vector::pop - Pops a value to the vector
    • pht\Vector::push - Pushes a value to the vector
    • pht\Vector::resize - Resizes a vector
    • pht\Vector::shift - Shifts a value from the vector
    • pht\Vector::size - Gets the size of the vector
    • pht\Vector::unlock - Releases the vector's mutex lock
    • pht\Vector::unshift - Unshifts a value to the vector front
    • pht\Vector::updateAt - Updates a value in the vector
    • pht\Vector::__construct - Vector creation
    • pi - Retourne la valeur de pi
    • png2wbmp - Convertit une image PNG en image WBMP
    • Pool::collect - Collecte les références des tâches achevées
    • Pool::resize - Redimensionne le Pool
    • Pool::shutdown - Arrête tous les workers
    • Pool::submit - Soumet un objet pour exécution
    • Pool::submitTo - Soumet une tâche à un worker spécifique pour exécution
    • Pool::__construct - Crée un nouveau Pool de Workers
    • popen - Crée un processus de pointeur de fichier
    • pos - Alias de current
    • posix_access - Détermine l'accessibilité d'un fichier
    • posix_ctermid - Retourne le chemin du terminal
    • posix_errno - Alias de posix_get_last_error
    • posix_getcwd - Chemin du dossier de travail courant
    • posix_getegid - Retourne l'ID effectif du groupe du processus courant
    • posix_geteuid - Retourne l'UID effectif de l'utilisateur du processus courant
    • posix_getgid - Retourne l'UID du groupe du processus courant
    • posix_getgrgid - Retourne des informations sur un groupe
    • posix_getgrnam - Retourne des informations sur un groupe
    • posix_getgroups - Retourne les identifiants du groupe du processus courant
    • posix_getlogin - Retourne le login
    • posix_getpgid - Retourne l'id du groupe de processus
    • posix_getpgrp - Retourne l'identifiant du groupe de processus
    • posix_getpid - Retourne l'identifiant du processus courant
    • posix_getppid - Retourne l'identifiant du processus parent
    • posix_getpwnam - Retourne des informations sur un utilisateur
    • posix_getpwuid - Retourne des informations sur un utilisateur
    • posix_getrlimit - Retourne des informations concernant les limites des ressources système
    • posix_getsid - Retourne le sid du processus
    • posix_getuid - Retourne l'ID de l'utilisateur du processus courant
    • posix_get_last_error - Lit le dernier numéro d'erreur généré par la dernière fonction POSIX qui a échoué
    • posix_initgroups - Calcule la liste des accès de groupe
    • posix_isatty - Détermine si un pointeur de fichier est un terminal interactif
    • posix_kill - Envoie un signal à un processus
    • posix_mkfifo - Crée un fichier FIFO (first in, first out) (un pipe nommé)
    • posix_mknod - Crée un fichier spécial ou ordinaire (POSIX.1)
    • posix_setegid - Modifie le GID réel du processus courant
    • posix_seteuid - Modifie l'identifiant d'utilisateur réel (UID) du processus courant
    • posix_setgid - Fixe le GID effectif du processus courant
    • posix_setpgid - Fixe l'identifiant de groupe de processus
    • posix_setrlimit - Définit les limites pour une ressource système
    • posix_setsid - Fait du processus courant un chef de session
    • posix_setuid - Fixe l'UID effective du processus courant
    • posix_strerror - Lit le message d'erreur associé à un numéro d'erreur POSIX
    • posix_times - Utilisation des ressources
    • posix_ttyname - Retourne le nom de device du terminal
    • posix_uname - Retourne le nom du système
    • pow - Expression exponentielle
    • preg_filter - Recherche et remplace avec une expression rationnelle
    • preg_grep - Retourne un tableau avec les résultats de la recherche
    • preg_last_error - Retourne le code erreur de la dernière expression PCRE exécutée
    • preg_last_error_msg - Returns the error message of the last PCRE regex execution
    • preg_match - Effectue une recherche de correspondance avec une expression rationnelle standard
    • preg_match_all - Expression rationnelle globale
    • preg_quote - Protection des caractères spéciaux des expressions rationnelles
    • preg_replace - Rechercher et remplacer par expression rationnelle standard
    • preg_replace_callback - Rechercher et remplacer par expression rationnelle standard en utilisant une fonction de callback
    • preg_replace_callback_array - Éffectue une recherche de correspondance avec une expression régulière et remplace grâce à une fonction de rappel
    • preg_split - Éclate une chaîne par expression rationnelle
    • prev - Recule le pointeur courant de tableau
    • print - Affiche une chaîne de caractères
    • printf - Affiche une chaîne de caractères formatée
    • print_r - Affiche des informations lisibles pour une variable
    • proc_close - Ferme un processus ouvert par proc_open
    • proc_get_status - Lit les informations concernant un processus ouvert par proc_open
    • proc_nice - Change la priorité d'exécution du processus courant
    • proc_open - Exécute une commande et ouvre les pointeurs de fichiers pour les entrées / sorties
    • proc_terminate - Termine un processus ouvert par proc_open
    • property_exists - Vérifie si un objet ou une classe possède une propriété
    • pspell_add_to_personal - Ajoute le mot au dictionnaire personnel
    • pspell_add_to_session - Ajoute le mot au dictionnaire personnel de la session courante
    • pspell_check - Vérifie un mot
    • pspell_clear_session - Remet à zéro la session courante
    • pspell_config_create - Crée une configuration utilisée pour ouvrir un dictionnaire
    • pspell_config_data_dir - Dossier qui contient les fichiers de données linguistiques
    • pspell_config_dict_dir - Endroit où se trouve le fichier global des mots
    • pspell_config_ignore - Ignore les mots de moins de N caractères
    • pspell_config_mode - Change le mode de suggestion
    • pspell_config_personal - Choisit le fichier qui contient le dictionnaire personnel
    • pspell_config_repl - Choisit le fichier qui contient les paires de remplacement
    • pspell_config_runtogether - Considère deux mots accolés comme un composé
    • pspell_config_save_repl - Détermine s'il faut sauver les paires de remplacement avec le dictionnaire
    • pspell_new - Charge un nouveau dictionnaire
    • pspell_new_config - Charge un nouveau dictionnaire avec les paramètres spécifiés dans une configuration
    • pspell_new_personal - Charge un nouveau dictionnaire avec un dictionnaire personnel
    • pspell_save_wordlist - Sauve le dictionnaire personnel dans un fichier
    • pspell_store_replacement - Enregistre une paire de remplacement pour un mot
    • pspell_suggest - Suggère l'orthographe d'un mot
    • ps_add_bookmark - Ajoute un signet à la page courante
    • ps_add_launchlink - Ajoute un lien qui démarre un fichier
    • ps_add_locallink - Ajoute un lien à une page dans le même document
    • ps_add_note - Ajoute une note à la page courante
    • ps_add_pdflink - Ajoute un lien à une page à un second document PDF
    • ps_add_weblink - Ajoute un lien à un emplacement web
    • ps_arc - Dessine un arc dans le sens contraire des aiguilles d'une montre
    • ps_arcn - Dessine un arc dans le sens des aiguilles d'une montre
    • ps_begin_page - Démarre une nouvelle page
    • ps_begin_pattern - Démarre un nouveau motif
    • ps_begin_template - Démarre un nouveau modèle
    • ps_circle - Dessine un cercle
    • ps_clip - Attache le dessin au chemin courant
    • ps_close - Ferme le document PostScript
    • ps_closepath - Ferme un chemin
    • ps_closepath_stroke - Ferme et trace un chemin
    • ps_close_image - Ferme l'image et libère la mémoire
    • ps_continue_text - Continue un texte à la ligne suivante
    • ps_curveto - Dessine une courbe
    • ps_delete - Supprime toutes les ressources d'un document PostScript
    • ps_end_page - Termine une page
    • ps_end_pattern - Termine un motif
    • ps_end_template - Termine un modèle
    • ps_fill - Remplit le chemin courant
    • ps_fill_stroke - Remplit et trace le chemin courant
    • ps_findfont - Charge une police
    • ps_get_buffer - Récupère le tampon complet contenant les données PS générées
    • ps_get_parameter - Récupère certains paramètres
    • ps_get_value - Récupère certaines valeurs
    • ps_hyphenate - Relie un mot
    • ps_include_file - Lit un fichier externe avec du code PostScript brut
    • ps_lineto - Dessine une ligne
    • ps_makespotcolor - Crée une tache de couleur
    • ps_moveto - Fixe le point courant
    • ps_new - Crée un nouvel objet document PostScript
    • ps_open_file - Ouvre un fichier pour écriture
    • ps_open_image - Lit une image pour placement futur
    • ps_open_image_file - Ouvre une image à partir d'un fichier
    • ps_open_memory_image - Prend une image GD et retourne une image à placer dans un document PS
    • ps_place_image - Place une image sur la page
    • ps_rect - Dessine un rectangle
    • ps_restore - Restaure un contexte précédemment sauvegardé
    • ps_rotate - Fixe le facteur de rotation
    • ps_save - Sauvegarde le contexte courant
    • ps_scale - Fixe le facteur de redimensionnement
    • ps_setcolor - Fixe la couleur courante
    • ps_setdash - Fixe l'apparence d'une ligne pointillée
    • ps_setflat - Fixe la position à plat
    • ps_setfont - Fixe la police à utiliser pour la prochaine écriture
    • ps_setgray - Fixe la valeur de gris
    • ps_setlinecap - Fixe l'apparence des fins de ligne
    • ps_setlinejoin - Fixe comment les lignes connectés sont jointes
    • ps_setlinewidth - Fixe la largeur d'une ligne
    • ps_setmiterlimit - Fixe les limites de l'anglet
    • ps_setoverprintmode - Définit le mode "overprint"
    • ps_setpolydash - Fixe l'apparence d'une ligne pointillée
    • ps_set_border_color - Fixe la couleur des bordures pour les commentaires
    • ps_set_border_dash - Fixe la grandeur des tirets pour les bordures des commentaires
    • ps_set_border_style - Fixe le style de bordure des commentaires
    • ps_set_info - Assigne les champs d'informations d'un document
    • ps_set_parameter - Fixe certains paramètres
    • ps_set_text_pos - Fixe la position l'écriture du texte
    • ps_set_value - Fixe certaines valeurs
    • ps_shading - Crée un ton pour usage futur
    • ps_shading_pattern - Crée un motif basé sur le ton
    • ps_shfill - Remplit un espace avec un ton
    • ps_show - Écrit du texte
    • ps_show2 - Affiche un texte à la position courante
    • ps_show_boxed - Écriture de texte dans une boîte
    • ps_show_xy - Écrit du texte à la position donnée
    • ps_show_xy2 - Affiche un texte à la position
    • ps_stringwidth - Récupère la largeur d'une chaîne de caractères
    • ps_string_geometry - Récupère les géométries d'une chaîne de caractères
    • ps_stroke - Dessine le chemin courant
    • ps_symbol - Écrit un glyphe
    • ps_symbol_name - Récupère le nom d'un glyphe
    • ps_symbol_width - Récupère la largeur d'un glyphe
    • ps_translate - Fixe une translation
    • putenv - Fixe la valeur d'une variable d'environnement
    • px_close - Ferme une base de données Paradox
    • px_create_fp - Crée une nouvelle base de données Paradox
    • px_date2string - Convertit une date en une chaîne de caractères
    • px_delete - Efface la ressource d'une base de données Paradox
    • px_delete_record - Efface une enregistrement depuis une base de données Paradox
    • px_get_field - Retourne les spécifications d'un champ
    • px_get_info - Retourne des informations sur un fichier Paradox
    • px_get_parameter - Récupère un paramètre
    • px_get_record - Retourne un enregistrement d'une base de données Paradox
    • px_get_schema - Retourne le schéma de la base de données
    • px_get_value - Récupère une valeur
    • px_insert_record - Insère un enregistrement dans une base de données Paradox
    • px_new - Crée un nouvel objet Paradox
    • px_numfields - Retourne le nombre de champs d'une base de données Paradox
    • px_numrecords - Retourne le nombre d'enregistrements d'une base de données Paradox
    • px_open_fp - Ouvre une base de données Paradox
    • px_put_record - Stocke un enregistrement dans une base de données Paradox
    • px_retrieve_record - Retourne un enregistrement depuis une base de données Paradox
    • px_set_blob_file - Définit le fichier depuis lequel les blobs seront lus
    • px_set_parameter - Définit un paramètre
    • px_set_tablename - Définit le nom de la table (obsolète)
    • px_set_targetencoding - Définit l'encodage pour les caractères des champs (obsolète)
    • px_set_value - Définit une valeur
    • px_timestamp2string - Convertit un timestamp en une chaîne de caractères
    • px_update_record - Met à jour les enregistrements dans une base de données Paradox
  • q
    • QuickHashIntHash::add - Ajoute une nouvelle entrée au hash
    • QuickHashIntHash::delete - Supprime une entrée du hash
    • QuickHashIntHash::exists - Vérifie qu'une clé existe dans le hash
    • QuickHashIntHash::get - Récupère la valeur correspondant à une clé dans le hash
    • QuickHashIntHash::getSize - Retourne le nombre d'éléments dans le hash
    • QuickHashIntHash::loadFromFile - Créer un hash depuis un fichier
    • QuickHashIntHash::loadFromString - Créer un hash depuis une chaine
    • QuickHashIntHash::saveToFile - Stocke un hash sur le disque
    • QuickHashIntHash::saveToString - Retourne une version sérialisée du hash
    • QuickHashIntHash::set - Met à jour une entrée dans le hash ou l'ajoute si elle n'existait pas
    • QuickHashIntHash::update - Met à jour une entrée dans le hash
    • QuickHashIntHash::__construct - Créer un nouvel objet QuickHashIntHash
    • QuickHashIntSet::add - Ajoute une nouvelle entrée à l'ensemble
    • QuickHashIntSet::delete - Supprime une entrée de l'ensemble
    • QuickHashIntSet::exists - Vérifie qu'une clé existe dans l'ensemble
    • QuickHashIntSet::getSize - Retourne le nombre d'éléments dans l'ensemble
    • QuickHashIntSet::loadFromFile - Créer un ensemble depuis un fichier
    • QuickHashIntSet::loadFromString - Créer un nouvel ensemble depuis une chaine
    • QuickHashIntSet::saveToFile - Stocke un ensemble sur le disque
    • QuickHashIntSet::saveToString - Retourne une version sérialisée de l'ensemble
    • QuickHashIntSet::__construct - Créer un nouvel objet QuickHashIntSet
    • QuickHashIntStringHash::add - Cette méthode ajoute une nouvelle entrée à la table de hachage
    • QuickHashIntStringHash::delete - Supprime une entrée de la table de hachage
    • QuickHashIntStringHash::exists - Vérifie si une clé existe dans la table de hachage
    • QuickHashIntStringHash::get - Récupère une valeur depuis la table de hachage par sa clé
    • QuickHashIntStringHash::getSize - Retourne le nombre d'éléments de la table de hachage
    • QuickHashIntStringHash::loadFromFile - Crée une table de hachage depuis un fichier
    • QuickHashIntStringHash::loadFromString - Crée une table de hachage depuis une chaîne
    • QuickHashIntStringHash::saveToFile - Stocke une table de hachage en mémoire sur le disque
    • QuickHashIntStringHash::saveToString - Retourne une version linéarisée de la table de hachage
    • QuickHashIntStringHash::set - Met à jour une entrée depuis la table de hachage avec une nouvelle valeur, ou l'ajoute si l'entrée n'existe pas
    • QuickHashIntStringHash::update - Met à jour une entrée de la table de hachage avec une nouvelle valeur
    • QuickHashIntStringHash::__construct - Crée un nouvel objet QuickHashIntStringHash
    • QuickHashStringIntHash::add - Ajoute une nouvelle entrée dans la table de hachage
    • QuickHashStringIntHash::delete - Supprime une entrée de la table de hachage
    • QuickHashStringIntHash::exists - Vérifie si une clé fait partie de la table de hachage
    • QuickHashStringIntHash::get - Récupère une valeur depuis la table de hachage par sa clé
    • QuickHashStringIntHash::getSize - Retourne le nombre d'éléments dans la table de hachage
    • QuickHashStringIntHash::loadFromFile - Crée une table de hachage depuis un fichier
    • QuickHashStringIntHash::loadFromString - Crée une table de hachage depuis une chaîne
    • QuickHashStringIntHash::saveToFile - Sauvegarde une table de hachage en mémoire sur le disque
    • QuickHashStringIntHash::saveToString - Retourne une version linéarisée de la table de hachage
    • QuickHashStringIntHash::set - Met à jour une entrée de la table de hachage avec une nouvelle valeur ou l'ajout si elle n'existe pas
    • QuickHashStringIntHash::update - Mets à jour une entrée de la table de hachage avec une nouvelle valeur
    • QuickHashStringIntHash::__construct - Crée un nouvel objet QuickHashStringIntHash
    • quoted_printable_decode - Convertit une chaîne quoted-printable en chaîne 8 bits
    • quoted_printable_encode - Convertit une chaîne 8 bits en une chaîne quoted-printable
    • quotemeta - Protège les métacaractères
  • r
    • rad2deg - Conversion de radians en degrés
    • radius_acct_open - Crée une ressource Radius pour les comptes
    • radius_add_server - Ajoute un serveur
    • radius_auth_open - Crée une ressource Radius pour l'identification
    • radius_close - Libère toutes les ressources Radius
    • radius_config - Demande à la bibliothèque de lire un fichier de configuration donné
    • radius_create_request - Crée une demande de compte ou d'identification
    • radius_cvt_addr - Convertit des données brutes en adresse IP
    • radius_cvt_int - Convertit des données brutes en entier
    • radius_cvt_string - Convertit des données brutes en chaîne de caractères
    • radius_demangle - Assèche des données
    • radius_demangle_mppe_key - Dérive les clés mppe depuis des données
    • radius_get_attr - Extrait un attribut
    • radius_get_tagged_attr_data - Extrait les données d'un attribut
    • radius_get_tagged_attr_tag - Extrait le tag depuis un attribut
    • radius_get_vendor_attr - Extrait un attribut spécifique au vendeur
    • radius_put_addr - Attache une adresse IP en tant qu'attribut
    • radius_put_attr - Attache un attribut binaire
    • radius_put_int - Attache un attribut entier
    • radius_put_string - Attache un attribut chaîne de caractères
    • radius_put_vendor_addr - Attache une adresse IP spécifique à un vendeur
    • radius_put_vendor_attr - Attache un attribut binaire à un vendeur spécifique
    • radius_put_vendor_int - Attache un attribut entier à un vendeur spécifique
    • radius_put_vendor_string - Attache un attribut sous la forme d'une chaîne à un vendeur spécifique
    • radius_request_authenticator - Retourne l'identifiant demandé
    • radius_salt_encrypt_attr - Chiffre une valeur en utilisant un Salt
    • radius_send_request - Envoie une requête et attend une réponse
    • radius_server_secret - Retourne le secret partagé
    • radius_strerror - Retourne un message d'erreur
    • rand - Génère une valeur aléatoire
    • random_bytes - Génère des octets pseudo-aléatoire cryptographiquement sécurisé
    • random_int - Génère des nombres entiers pseudo-aléatoire cryptographiquement sécurisé
    • range - Crée un tableau contenant un intervalle d'éléments
    • rar:// - RAR
    • RarArchive::close - Ferme une archive RAR et libère toutes les ressources
    • RarArchive::getComment - Récupère un commentaire depuis une archive RAR
    • RarArchive::getEntries - Récupère la liste complète depuis l'archive RAR
    • RarArchive::getEntry - Récupère une entrée depuis une archive RAR
    • RarArchive::isBroken - Test si une archive est corrompue (incomplète)
    • RarArchive::isSolid - Vérifie si l'archive RAR est solide
    • RarArchive::open - Ouvre une archive RAR
    • RarArchive::setAllowBroken - Autorise ou non l'ouverture d'archives corrompues
    • RarArchive::__toString - Récupère une représentation sous forme de texte
    • RarEntry::extract - Extrait une entrée d'une archive
    • RarEntry::getAttr - Récupère les attributs d'une entrée
    • RarEntry::getCrc - Récupère le CRC d'une entrée
    • RarEntry::getFileTime - Récupère la date de dernière modification d'une entrée
    • RarEntry::getHostOs - Récupère le code de l'hôte pour une entrée
    • RarEntry::getMethod - Récupère la méthode utilisée pour l'ajout d'une entrée
    • RarEntry::getName - Récupère le nom de l'entrée
    • RarEntry::getPackedSize - Récupère la taille compressée d'une entrée
    • RarEntry::getStream - Récupère le gestion de fichier pour une entrée
    • RarEntry::getUnpackedSize - Récupère la taille décompressée d'une entrée
    • RarEntry::getVersion - Récupère la version minimale du logiciel RAR à utiliser pour décompresser une entrée
    • RarEntry::isDirectory - Teste si l'entrée courante est un dossier
    • RarEntry::isEncrypted - Teste si une entrée est cryptée
    • RarEntry::__toString - Récupère une représentation sous forme de chaîne de caractères d'une entrée
    • RarException::isUsingExceptions - Vérifie si le gestionnaire d'erreur utilise les exceptions ou non
    • RarException::setUsingExceptions - Active ou désactive les exceptions dans le gestionnaire d'erreurs
    • rar_wrapper_cache_stats - Statistique pour le cache du gestionnaire URL
    • rawurldecode - Décode une chaîne URL
    • rawurlencode - Encode une chaîne en URL, selon la RFC 3986
    • readdir - Lit une entrée du dossier
    • readfile - Affiche un fichier
    • readgzfile - Lit tout le fichier compressé
    • readline - Lit une ligne
    • readline_add_history - Ajoute une ligne à l'historique
    • readline_callback_handler_install - Initialise l'interface et le terminal de rappel de readline, affiche le prompt et retourne immédiatement
    • readline_callback_handler_remove - Efface un gestionnaire de rappel readline
    • readline_callback_read_char - Lit un caractère et informe l'interface de rappel readline
    • readline_clear_history - Efface l'historique
    • readline_completion_function - Enregistre une fonction de complétion
    • readline_info - Lit ou modifie diverses variables internes de readline
    • readline_list_history - Liste l'historique
    • readline_on_new_line - Informe readline que le curseur est passé à une nouvelle ligne
    • readline_read_history - Lit l'historique
    • readline_redisplay - Demande à readline de refaire l'affichage
    • readline_write_history - Écrit dans l'historique
    • readlink - Renvoie le contenu d'un lien symbolique
    • read_exif_data - Alias de exif_read_data
    • realpath - Retourne le chemin canonique absolu
    • realpath_cache_get - Récupère les entrées du cache realpath
    • realpath_cache_size - Récupère la taille du cache realpath
    • recode - Alias de recode_string
    • recode_file - Recodage de fichier à fichier, en fonction de la demande
    • recode_string - Recode une chaîne en fonction de la requête
    • RecursiveArrayIterator::getChildren - Retourne un itérateur pour l'entrée courante
    • RecursiveArrayIterator::hasChildren - Vérifie si l'entrée courante est un tableau ou un objet
    • RecursiveCachingIterator::getChildren - Retourne le fils de l'itérateur interne comme un CachingRecursiveIterator
    • RecursiveCachingIterator::hasChildren - Vérifie si l'élément courant de l'itérateur interne a un fils
    • RecursiveCachingIterator::__construct - Constructeur
    • RecursiveCallbackFilterIterator::getChildren - Retourne l'itérateur fils interne contenu dans un RecursiveCallbackFilterIterator
    • RecursiveCallbackFilterIterator::hasChildren - Vérifie si l'élément courant de l'itérateur interne a un fils
    • RecursiveCallbackFilterIterator::__construct - Crée un objet RecursiveCallbackFilterIterator depuis une interface RecursiveIterator
    • RecursiveDirectoryIterator::getChildren - Retourne un itérateur pour l'entrée courante si c'est un dossier
    • RecursiveDirectoryIterator::getSubPath - Récupère le sous-chemin
    • RecursiveDirectoryIterator::getSubPathname - Récupère le sous-chemin et le nom du fichier
    • RecursiveDirectoryIterator::hasChildren - Vérifie si l'entrée courante est un dossier et n'est pas '.' ou '..'
    • RecursiveDirectoryIterator::key - Retourne le chemin et le nom de l'entrée courante du dossier
    • RecursiveDirectoryIterator::next - Se déplace vers la prochaine entrée
    • RecursiveDirectoryIterator::rewind - Revient à la position initiale dans le dossier
    • RecursiveDirectoryIterator::__construct - Construit un objet RecursiveDirectoryIterator
    • RecursiveFilterIterator::getChildren - Retourne l'itérateur interne contenu dans un objet RecursiveFilterIterator
    • RecursiveFilterIterator::hasChildren - Vérifie si un fils existe pour l'itérateur interne de l'élément courant
    • RecursiveFilterIterator::__construct - Crée un objet RecursiveFilterIterator depuis un objet RecursiveIterator
    • RecursiveIterator::getChildren - Récupère l'itérateur de l'entrée courante
    • RecursiveIterator::hasChildren - Vérifie si un itérateur peut être créé depuis l'entrée courante
    • RecursiveIteratorIterator::beginChildren - Commence un fils
    • RecursiveIteratorIterator::beginIteration - Commence une itération
    • RecursiveIteratorIterator::callGetChildren - Récupère un fils
    • RecursiveIteratorIterator::callHasChildren - Vérifie si un fils existe
    • RecursiveIteratorIterator::current - Accède à la valeur de l'élément courant
    • RecursiveIteratorIterator::endChildren - Termine un fils
    • RecursiveIteratorIterator::endIteration - Termine un itérateur
    • RecursiveIteratorIterator::getDepth - Récupère la profondeur courante de la récursivité de l'itérateur
    • RecursiveIteratorIterator::getInnerIterator - Récupère l'itérateur interne
    • RecursiveIteratorIterator::getMaxDepth - Récupère la profondeur maximale
    • RecursiveIteratorIterator::getSubIterator - L'itérateur secondaire actif courant
    • RecursiveIteratorIterator::key - Accède à la clé courante
    • RecursiveIteratorIterator::next - Déplace l'itérateur à la position suivante
    • RecursiveIteratorIterator::nextElement - Élément suivant
    • RecursiveIteratorIterator::rewind - Replace l'itérateur au début
    • RecursiveIteratorIterator::setMaxDepth - Définit la profondeur maximale
    • RecursiveIteratorIterator::valid - Vérifie si la position courante est valide
    • RecursiveIteratorIterator::__construct - Construit un objet RecursiveIteratorIterator
    • RecursiveRegexIterator::getChildren - Retourne un itérateur depuis l'entrée courante
    • RecursiveRegexIterator::hasChildren - Vérifie si un itérateur peut être obtenu depuis l'entrée courante
    • RecursiveRegexIterator::__construct - Crée un nouveau RecursiveRegexIterator
    • RecursiveTreeIterator::beginChildren - Début d'un fils
    • RecursiveTreeIterator::beginIteration - Début d'une itération
    • RecursiveTreeIterator::callGetChildren - Récupère un fils
    • RecursiveTreeIterator::callHasChildren - Vérifie la présence d'un fils
    • RecursiveTreeIterator::current - Récupère l'élément courant
    • RecursiveTreeIterator::endChildren - Fin d'un fils
    • RecursiveTreeIterator::endIteration - Fin de l'itération
    • RecursiveTreeIterator::getEntry - Récupère l'entrée courante
    • RecursiveTreeIterator::getPostfix - Récupère le suffixe
    • RecursiveTreeIterator::getPrefix - Récupère le préfixe
    • RecursiveTreeIterator::key - Récupère la clé de l'élément courant
    • RecursiveTreeIterator::next - Se déplace sur l'élément suivant
    • RecursiveTreeIterator::nextElement - Prochain élément
    • RecursiveTreeIterator::rewind - Réinitialise la position de l'itérateur
    • RecursiveTreeIterator::setPostfix - Définit le suffixe
    • RecursiveTreeIterator::setPrefixPart - Définit une partie du préfixe
    • RecursiveTreeIterator::valid - Vérifie la validité
    • RecursiveTreeIterator::__construct - Construit un nouvel objet RecursiveTreeIterator
    • Reflection::export - Exporte
    • Reflection::getModifierNames - Récupère les nom des modificateurs
    • ReflectionClass::export - Exporte une classe
    • ReflectionClass::getConstant - Récupère une constante
    • ReflectionClass::getConstants - Récupère les constantes
    • ReflectionClass::getConstructor - Récupère le constructeur d'une classe
    • ReflectionClass::getDefaultProperties - Récupère les propriétés par défaut
    • ReflectionClass::getDocComment - Récupère les commentaires de documentation
    • ReflectionClass::getEndLine - Récupère la fin d'une ligne
    • ReflectionClass::getExtension - Récupère un objet ReflectionExtension pour l'extension qui définit la classe
    • ReflectionClass::getExtensionName - Récupère le nom de l'extension qui définit la classe
    • ReflectionClass::getFileName - Récupère le nom du fichier où la classe a été déclaré
    • ReflectionClass::getInterfaceNames - Récupère les noms des interfaces
    • ReflectionClass::getInterfaces - Récupère les interfaces
    • ReflectionClass::getMethod - Récupère un ReflectionMethod pour une méthode de classe
    • ReflectionClass::getMethods - Récupère un tableau des méthodes
    • ReflectionClass::getModifiers - Récupère les modificateurs de classe
    • ReflectionClass::getName - Récupère le nom de la classe
    • ReflectionClass::getNamespaceName - Récupère l'espace de noms
    • ReflectionClass::getParentClass - Récupère la classe parente
    • ReflectionClass::getProperties - Récupère les propriétés
    • ReflectionClass::getProperty - Récupère une ReflectionProperty pour une propriété d'une classe
    • ReflectionClass::getReflectionConstant - Récupère un ReflectionClassConstant pour une constante d'une classe
    • ReflectionClass::getReflectionConstants - Récupère les constantes de classe
    • ReflectionClass::getShortName - Récupère le nom court d'une classe
    • ReflectionClass::getStartLine - Récupère le numéro de ligne de départ
    • ReflectionClass::getStaticProperties - Récupère les propriétés statiques
    • ReflectionClass::getStaticPropertyValue - Récupère la valeur d'une propriété statique
    • ReflectionClass::getTraitAliases - Retourne un tableau des alias du trait
    • ReflectionClass::getTraitNames - Retourne un tableau de noms des traits utilisés par cette classe
    • ReflectionClass::getTraits - Retourne un tableau des traits utilisés par cette classe
    • ReflectionClass::hasConstant - Vérifie si une constante est définie
    • ReflectionClass::hasMethod - Vérifie si une méthode est définie
    • ReflectionClass::hasProperty - Vérifie si une propriété est définie
    • ReflectionClass::implementsInterface - Vérifie si une classe implémente une interface
    • ReflectionClass::inNamespace - Vérifie si une classe est définie dans un espace de noms
    • ReflectionClass::isAbstract - Vérifie si une classe est abstraite
    • ReflectionClass::isAnonymous - Vérifie si la classe est anonyme
    • ReflectionClass::isCloneable - Renseigne à propos de la propriété de duplication de la classe
    • ReflectionClass::isFinal - Vérifie si une classe est finale
    • ReflectionClass::isInstance - Vérifie si une classe est une instance d'une autre classe
    • ReflectionClass::isInstantiable - Vérifie si une classe est instanciable
    • ReflectionClass::isInterface - Vérifie si une classe est une interface
    • ReflectionClass::isInternal - Vérifie si une classe est définie comme interne par une extension
    • ReflectionClass::isIterable - Vérifie si cette classe est itérable
    • ReflectionClass::isIterateable - Alias de ReflectionClass::isIterable
    • ReflectionClass::isSubclassOf - Vérifie si la classe est une sous-classe
    • ReflectionClass::isTrait - Renseigne s'il s'agit d'un trait
    • ReflectionClass::isUserDefined - Vérifie si une classe a été définie dans l'espace utilisateur
    • ReflectionClass::newInstance - Créer une nouvelle instance de la classe en utilisant les arguments fournis
    • ReflectionClass::newInstanceArgs - Créer une nouvelle instance en utilisant les arguments fournis
    • ReflectionClass::newInstanceWithoutConstructor - Crée une nouvelle instance de la classe sans invoquer le constructeur
    • ReflectionClass::setStaticPropertyValue - Définit la valeur d'une propriété statiques
    • ReflectionClass::__construct - Construit une ReflectionClass
    • ReflectionClass::__toString - Crée une représentation textuelle de l'objet
    • ReflectionClassConstant::export - Exporte
    • ReflectionClassConstant::getDeclaringClass - Récupère la classe déclarante
    • ReflectionClassConstant::getDocComment - Récupère le commentaire de documentation
    • ReflectionClassConstant::getModifiers - Récupère les modificateurs de la constante de classe
    • ReflectionClassConstant::getName - Récupère le nom de la constante
    • ReflectionClassConstant::getValue - Récupère la valeur
    • ReflectionClassConstant::isPrivate - Vérifie si la constante de classe est privée
    • ReflectionClassConstant::isProtected - Vérifie si la constante de classe est protégée
    • ReflectionClassConstant::isPublic - Vérifie si la constante de classe est publique
    • ReflectionClassConstant::__construct - Construit une ReflectionClassConstant
    • ReflectionClassConstant::__toString - Retourne la représentation sous forme de chaîne de caractères de l'objet ReflectionClassConstant
    • ReflectionExtension::export - Exportation
    • ReflectionExtension::getClasses - Récupère les classes
    • ReflectionExtension::getClassNames - Récupère les noms des classes
    • ReflectionExtension::getConstants - Récupère les constantes
    • ReflectionExtension::getDependencies - Récupère les dépendances
    • ReflectionExtension::getFunctions - Récupère les fonctions d'une extension
    • ReflectionExtension::getINIEntries - Récupère les entrées ini de l'extension
    • ReflectionExtension::getName - Récupère le nom de l'extension
    • ReflectionExtension::getVersion - Récupère la version de l'extension
    • ReflectionExtension::info - Affiche des informations sur l'extension
    • ReflectionExtension::isPersistent - Vérifie si l'extension est persistante
    • ReflectionExtension::isTemporary - Vérifie si l'extension est temporaire
    • ReflectionExtension::__clone - Clonage
    • ReflectionExtension::__construct - Construit un nouvel objet ReflectionExtension
    • ReflectionExtension::__toString - Récupère une représentation textuelle
    • ReflectionFunction::export - Exporte une fonction
    • ReflectionFunction::getClosure - Retourne une fermeture créée dynamiquement pour la fonction
    • ReflectionFunction::invoke - Invoque une fonction
    • ReflectionFunction::invokeArgs - Invoque les arguments d'une fonction
    • ReflectionFunction::isDisabled - Vérifie si une fonction est désactivée
    • ReflectionFunction::__construct - Construit un nouvel objet ReflectionFunction
    • ReflectionFunction::__toString - Récupère une représentation textuelle
    • ReflectionFunctionAbstract::getClosureScopeClass - Retourne le contexte associé à la closure
    • ReflectionFunctionAbstract::getClosureThis - Retourne le pointeur lié à la fermeture
    • ReflectionFunctionAbstract::getDocComment - Récupère un commentaire
    • ReflectionFunctionAbstract::getEndLine - Récupère le numéro de la dernière ligne
    • ReflectionFunctionAbstract::getExtension - Récupère les informations d'une extension
    • ReflectionFunctionAbstract::getExtensionName - Récupère le nom de l'extension
    • ReflectionFunctionAbstract::getFileName - Récupère le nom du fichier
    • ReflectionFunctionAbstract::getName - Récupère le nom d'une fonction
    • ReflectionFunctionAbstract::getNamespaceName - Récupère l'espace de noms
    • ReflectionFunctionAbstract::getNumberOfParameters - Récupère le nombre de paramètres
    • ReflectionFunctionAbstract::getNumberOfRequiredParameters - Récupère le nombre de paramètres requis
    • ReflectionFunctionAbstract::getParameters - Récupère les paramètres
    • ReflectionFunctionAbstract::getReturnType - Récupère le type de retour définit pour une fonction
    • ReflectionFunctionAbstract::getShortName - Récupère le nom court d'une fonction
    • ReflectionFunctionAbstract::getStartLine - Récupère le numéro de ligne de départ
    • ReflectionFunctionAbstract::getStaticVariables - Récupère les variables statiques
    • ReflectionFunctionAbstract::hasReturnType - Vérifie si la fonction a un type de retour définit
    • ReflectionFunctionAbstract::inNamespace - Vérifie si une fonction est dans un espace de noms
    • ReflectionFunctionAbstract::isClosure - Vérifie si c'est une fermeture
    • ReflectionFunctionAbstract::isDeprecated - Vérifie si la fonction est obsolète
    • ReflectionFunctionAbstract::isGenerator - Vérifie si la fonction est un générateur
    • ReflectionFunctionAbstract::isInternal - Vérifie si la fonction est une fonction interne
    • ReflectionFunctionAbstract::isUserDefined - Vérifie si la fonction est définie dans l'espace utilisateur
    • ReflectionFunctionAbstract::isVariadic - Vérifie si la fonction est variadique
    • ReflectionFunctionAbstract::returnsReference - Vérifie si la fonction retourne une référence
    • ReflectionFunctionAbstract::__clone - Clone une fonction
    • ReflectionFunctionAbstract::__toString - Récupère une représentation textuelle
    • ReflectionGenerator::getExecutingFile - Récupère le nom de fichier du générateur actuellement exécuté
    • ReflectionGenerator::getExecutingGenerator - Récupère l'objet Generator exécuté
    • ReflectionGenerator::getExecutingLine - Récupère la ligne actuellement exécutée du générateur
    • ReflectionGenerator::getFunction - Récupère le nom de fonction du générateur
    • ReflectionGenerator::getThis - Récupère la valeur de $this du générateur
    • ReflectionGenerator::getTrace - Récupère la trace du générateur exécutant
    • ReflectionGenerator::__construct - Construit un objet ReflectionGenerator
    • ReflectionMethod::export - Exportation d'une méthode de reflection
    • ReflectionMethod::getClosure - Retourne une fermeture créée dynamiquement pour la méthode
    • ReflectionMethod::getDeclaringClass - Récupère la déclaration de la classe de la méthode réfléchie
    • ReflectionMethod::getModifiers - Récupère les modificateurs de la méthode
    • ReflectionMethod::getPrototype - Récupère le prototype de la méthode (s'il existe)
    • ReflectionMethod::invoke - Invoque
    • ReflectionMethod::invokeArgs - Invoque les arguments
    • ReflectionMethod::isAbstract - Vérifie si la méthode est abstraite
    • ReflectionMethod::isConstructor - Vérifie si la méthode est un constructeur
    • ReflectionMethod::isDestructor - Vérifie si la méthode est un destructeur
    • ReflectionMethod::isFinal - Vérifie si la méthode est finale
    • ReflectionMethod::isPrivate - Vérifie si la méthode est privée
    • ReflectionMethod::isProtected - Vérifie si la méthode est protégée
    • ReflectionMethod::isPublic - Vérifie si la méthode est publique
    • ReflectionMethod::isStatic - Vérifie si la méthode est statique
    • ReflectionMethod::setAccessible - Définit l'accessibilité de la méthode
    • ReflectionMethod::__construct - Construit un nouvel objet ReflectionMethod
    • ReflectionMethod::__toString - Retourne une représentation textuelle de la méthode
    • ReflectionNamedType::getName - Récupère le texte de la déclaration de type
    • ReflectionNamedType::isBuiltin - Vérifie si c'est un type intégré
    • ReflectionObject::export - Exportation
    • ReflectionObject::__construct - Construit un nouvel objet ReflectionObject
    • ReflectionParameter::allowsNull - Vérifie si la valeur null est autorisée comme valeur du paramètre
    • ReflectionParameter::canBePassedByValue - Vérifie si le paramètre peut être passé par valeur
    • ReflectionParameter::export - Exportation
    • ReflectionParameter::getClass - Récupère la classe de typage d'objets
    • ReflectionParameter::getDeclaringClass - Récupère la classe déclarante
    • ReflectionParameter::getDeclaringFunction - Récupère la fonction déclarante
    • ReflectionParameter::getDefaultValue - Récupère la valeur par défaut du paramètre
    • ReflectionParameter::getDefaultValueConstantName - Retourne le nom de la constante de la valeur par défaut si la valeur est une constante ou null
    • ReflectionParameter::getName - Récupère le nom du paramètre
    • ReflectionParameter::getPosition - Récupère la position d'un paramètre
    • ReflectionParameter::getType - Récupère le type du paramètre
    • ReflectionParameter::hasType - Vérifie si un paramètre a un type
    • ReflectionParameter::isArray - Vérifie si le paramètre attend un tableau
    • ReflectionParameter::isCallable - Vérifie si le paramètre est de type callable
    • ReflectionParameter::isDefaultValueAvailable - Vérifie si une valeur par défaut est disponible pour le paramètre
    • ReflectionParameter::isDefaultValueConstant - Vérifie si la valeur par défaut du paramètre est une constante
    • ReflectionParameter::isOptional - Vérifie si le paramètre est optionnel
    • ReflectionParameter::isPassedByReference - Vérifie si le paramètre est passé par référence
    • ReflectionParameter::isVariadic - Vérifie si le paramètre est variadique
    • ReflectionParameter::__clone - Clonage
    • ReflectionParameter::__construct - Constructeur
    • ReflectionParameter::__toString - Récupère une représentation textuelle
    • ReflectionProperty::export - Exporte
    • ReflectionProperty::getDeclaringClass - Récupère la classe déclarante
    • ReflectionProperty::getDefaultValue - Returns the default value declared for a property
    • ReflectionProperty::getDocComment - Récupère le commentaire de documentation d'une propriété
    • ReflectionProperty::getModifiers - Récupère les modificateurs de propriété
    • ReflectionProperty::getName - Récupère le nom de la proriété
    • ReflectionProperty::getType - Récupère le type d'une propriété
    • ReflectionProperty::getValue - Récupère la valeur de la propriété
    • ReflectionProperty::hasDefaultValue - Checks if property has a default value declared
    • ReflectionProperty::hasType - Vérifie si la propriété à un type
    • ReflectionProperty::isDefault - Vérifie si la propriété est celle par défaut
    • ReflectionProperty::isInitialized - Vérifie si une propriété est initialisée
    • ReflectionProperty::isPrivate - Vérifie si la propriété est privée
    • ReflectionProperty::isProtected - Vérifie si la propriété est protégée
    • ReflectionProperty::isPublic - Vérifie si la propriété est publique
    • ReflectionProperty::isStatic - Vérifie si la propriété est statique
    • ReflectionProperty::setAccessible - Définit l'accessibilité d'une propriété
    • ReflectionProperty::setValue - Définit la valeur de la propriété
    • ReflectionProperty::__clone - Clonage
    • ReflectionProperty::__construct - Construit un nouvel objet ReflectionProperty
    • ReflectionProperty::__toString - Récupère une représentation textuelle
    • ReflectionReference::fromArrayElement - Create a ReflectionReference from an array element
    • ReflectionReference::getId - Get unique ID of a reference
    • ReflectionType::allowsNull - Vérifie si null est permit
    • ReflectionType::__toString - To string
    • ReflectionUnionType::getTypes - Returns the types included in the union type
    • ReflectionZendExtension::export - Export
    • ReflectionZendExtension::getAuthor - Récupère l'auteur
    • ReflectionZendExtension::getCopyright - Récupère le copyright
    • ReflectionZendExtension::getName - Récupère le nom
    • ReflectionZendExtension::getURL - Récupère l'URL
    • ReflectionZendExtension::getVersion - Récupère la version
    • ReflectionZendExtension::__clone - Gestionnaire de clonage
    • ReflectionZendExtension::__construct - Constructeur
    • ReflectionZendExtension::__toString - Gestionnaire de conversion en chaîne de caractères
    • Reflector::export - Exporte
    • Reflector::__toString - Conversion en chaîne de caractères
    • RegexIterator::accept - Récupère le statut d'acceptation
    • RegexIterator::getFlags - Récupère les drapeaux
    • RegexIterator::getMode - Retourne le mode de l'opération
    • RegexIterator::getPregFlags - Retourne les drapeaux de l'expression rationnelle
    • RegexIterator::getRegex - Retourne l'expression rationnelle courante
    • RegexIterator::setFlags - Définit les drapeaux
    • RegexIterator::setMode - Définit le mode de l'opération
    • RegexIterator::setPregFlags - Définit les drapeaux de l'expression rationnelle
    • RegexIterator::__construct - Crée un nouvel objet RegexIterator
    • register_shutdown_function - Enregistre une fonction de rappel pour exécution à l'extinction
    • register_tick_function - Enregistre une fonction exécutée à chaque tick
    • rename - Renomme un fichier ou un dossier
    • reset - Remet le pointeur interne de tableau au début
    • ResourceBundle::count - Récupère le nombre d'éléments dans le faisceau
    • ResourceBundle::create - Crée une ressource représentant un faisceau
    • ResourceBundle::get - Récupère les données depuis le faisceau
    • ResourceBundle::getErrorCode - Récupère le dernier code erreur du faisceau
    • ResourceBundle::getErrorMessage - Récupère le dernier message d'erreur depuis le faisceau
    • ResourceBundle::getLocales - Récupère les locales supportées
    • restore_error_handler - Réactive l'ancienne fonction de gestion des erreurs
    • restore_exception_handler - Réactive l'ancienne fonction de gestion d'exceptions
    • restore_include_path - Restaure la valeur de la directive de configuration include_path
    • Result::getAffectedItemsCount - Get affected row count
    • Result::getAutoIncrementValue - Get autoincremented value
    • Result::getGeneratedIds - Get generated ids
    • Result::getWarnings - Get warnings from last operation
    • Result::getWarningsCount - Get warning count from last operation
    • Result::__construct - Result constructor
    • rewind - Replace le pointeur de fichier au début
    • rewinddir - Retourne à la première entrée du dossier
    • rmdir - Efface un dossier
    • round - Arrondit un nombre à virgule flottante
    • RowResult::fetchAll - Get all rows from result
    • RowResult::fetchOne - Get row from result
    • RowResult::getColumnNames - Get all column names
    • RowResult::getColumns - Get column metadata
    • RowResult::getColumnsCount - Get column count
    • RowResult::getWarnings - Get warnings from last operation
    • RowResult::getWarningsCount - Get warning count from last operation
    • RowResult::__construct - RowResult constructor
    • rpmaddtag - Add tag retrieved in query
    • rpmdbinfo - Get information from installed RPM
    • rpmdbsearch - Search RPM packages
    • rpminfo - Get information from a RPM file
    • rpmvercmp - RPM version comparison
    • RRDCreator::addArchive - Ajoute des valeurs de données RRA - archive pour chaque source de données
    • RRDCreator::addDataSource - Ajoute une définition de source de données pour la base de données RRD
    • RRDCreator::save - Sauvegarde la base de données RRD dans un fichier
    • RRDCreator::__construct - Crée une nouvelle instance RRDCreator
    • rrdc_disconnect - Ferme toutes les connexions vers le daemon de mise en cache rrd
    • RRDGraph::save - Sauvegarde le résultat d'une requête dans une image
    • RRDGraph::saveVerbose - Sauvegarde une requête de base de données RRD dans l'image et retourne les informations verbeuses sur le graphique généré.
    • RRDGraph::setOptions - Définit les options d'exportation d'un graphique RRD
    • RRDGraph::__construct - Crée une nouvelle instance RRDGraph
    • RRDUpdater::update - Met à jour un fichier de base de données RRD
    • RRDUpdater::__construct - Crée une nouvelle instance RRDUpdater
    • rrd_create - Crée un fichier de base de données rrd
    • rrd_error - Récupère le message de la dernière erreur survenue
    • rrd_fetch - Récupère les données pour le graphique
    • rrd_first - Récupère le timestamp du premier échantillon depuis le fichier RRD
    • rrd_graph - Crée une image depuis des données
    • rrd_info - Récupère les informations sur un fichier RRD
    • rrd_last - Récupère le timestamp unix du premier échantillon
    • rrd_lastupdate - Récupère les informations sur les dernières données mises à jour
    • rrd_restore - Restaure le fichier RRD depuis une sauvegarde XML
    • rrd_tune - Affine des options d'en-tête d'un fichier de base de données RRD
    • rrd_update - Met à jour une base de données RRD
    • rrd_version - Récupère les informations de version de la bibliothèque rrdtool
    • rrd_xport - Exporte les informations d'une base de données
    • rsort - Trie un tableau en ordre inverse
    • rtrim - Supprime les espaces (ou d'autres caractères) de fin de chaîne
    • runkit7_constant_add - Similar to define(), but allows defining in class definitions as well
    • runkit7_constant_redefine - Redefine an already defined constant
    • runkit7_constant_remove - Remove/Delete an already defined constant
    • runkit7_function_add - Add a new function, similar to create_function
    • runkit7_function_copy - Copy a function to a new function name
    • runkit7_function_redefine - Replace a function definition with a new implementation
    • runkit7_function_remove - Remove a function definition
    • runkit7_function_rename - Change a function's name
    • runkit7_import - Process a PHP file importing function and class definitions, overwriting where appropriate
    • runkit7_method_add - Dynamically adds a new method to a given class
    • runkit7_method_copy - Copies a method from class to another
    • runkit7_method_redefine - Dynamically changes the code of the given method
    • runkit7_method_remove - Dynamically removes the given method
    • runkit7_method_rename - Dynamically changes the name of the given method
    • runkit7_object_id - Return the integer object handle for given object
    • runkit7_superglobals - Return numerically indexed array of registered superglobals
    • runkit7_zval_inspect - Returns information about the passed in value with data types, reference counts, etc
  • s
    • sapi_windows_cp_conv - Convert string from one codepage to another
    • sapi_windows_cp_get - Get current codepage
    • sapi_windows_cp_is_utf8 - Indicates whether the codepage is UTF-8 compatible
    • sapi_windows_cp_set - Set process codepage
    • sapi_windows_generate_ctrl_event - Send a CTRL event to another process
    • sapi_windows_set_ctrl_handler - Set or remove a CTRL event handler
    • sapi_windows_vt100_support - Get or set VT100 support for the specified stream associated to an output buffer of a Windows console.
    • scandir - Liste les fichiers et dossiers dans un dossier
    • Schema::createCollection - Add collection to schema
    • Schema::dropCollection - Drop collection from schema
    • Schema::existsInDatabase - Check if exists in database
    • Schema::getCollection - Get collection from schema
    • Schema::getCollectionAsTable - Get collection table object
    • Schema::getCollections - Get all schema collections
    • Schema::getName - Get schema name
    • Schema::getSession - Get schema session
    • Schema::getTable - Get schema table
    • Schema::getTables - Get schema tables
    • Schema::__construct - constructor
    • SchemaObject::getSchema - Get schema object
    • scoutapm_get_calls - Returns a list of instrumented calls that have occurred
    • scoutapm_list_instrumented_functions - List functions scoutapm will instrument.
    • SeasLog::alert - Record alert log information
    • SeasLog::analyzerCount - Get log count by level, log_path and key_word
    • SeasLog::analyzerDetail - Get log detail by level, log_path, key_word, start, limit, order
    • SeasLog::closeLoggerStream - Manually release stream flow from logger
    • SeasLog::critical - Record critical log information
    • SeasLog::debug - Record debug log information
    • SeasLog::emergency - Record emergency log information
    • SeasLog::error - Record error log information
    • SeasLog::flushBuffer - Flush logs buffer, dump to appender file, or send to remote api with tcp/udp
    • SeasLog::getBasePath - Get SeasLog base path.
    • SeasLog::getBuffer - Get the logs buffer in memory as array
    • SeasLog::getBufferEnabled - Determin if buffer enabled
    • SeasLog::getDatetimeFormat - Get SeasLog datetime format style
    • SeasLog::getLastLogger - Get SeasLog last logger path
    • SeasLog::getRequestID - Get SeasLog request_id differentiated requests
    • SeasLog::getRequestVariable - Get SeasLog request variable
    • SeasLog::info - Record info log information
    • SeasLog::log - The Common Record Log Function
    • SeasLog::notice - Record notice log information
    • SeasLog::setBasePath - Set SeasLog base path
    • SeasLog::setDatetimeFormat - Set SeasLog datetime format style
    • SeasLog::setLogger - Set SeasLog logger name
    • SeasLog::setRequestID - Set SeasLog request_id differentiated requests
    • SeasLog::setRequestVariable - Manually set SeasLog request variable
    • SeasLog::warning - Record warning log information
    • SeasLog::__construct - Description
    • SeasLog::__destruct - Description
    • seaslog_get_author - Get SeasLog author.
    • seaslog_get_version - Get SeasLog version.
    • SeekableIterator::seek - Recherche une position
    • sem_acquire - Réserve un sémaphore
    • sem_get - Retourne un identifiant de sémaphore
    • sem_release - Libère un sémaphore
    • sem_remove - Détruit un sémaphore
    • Serializable::serialize - Représentation linéaire de l'objet
    • Serializable::unserialize - Construit un objet
    • serialize - Génère une représentation stockable d'une valeur
    • Session::close - Close session
    • Session::createSchema - Create new schema
    • Session::dropSchema - Drop a schema
    • Session::generateUUID - Get new UUID
    • Session::getDefaultSchema - Get default schema name
    • Session::getSchema - Get a new schema object
    • Session::getSchemas - Get the schemas
    • Session::getServerVersion - Get server version
    • Session::listClients - Get client list
    • Session::quoteName - Add quotes
    • Session::releaseSavepoint - Release set savepoint
    • Session::rollback - Rollback transaction
    • Session::rollbackTo - Rollback transaction to savepoint
    • Session::setSavepoint - Create savepoint
    • Session::sql - Execute SQL query
    • Session::startTransaction - Start transaction
    • Session::__construct - Description constructor
    • SessionHandler::close - Ferme la session
    • SessionHandler::create_sid - Retourne un nouvel ID de session
    • SessionHandler::destroy - Détruit une session
    • SessionHandler::gc - Nettoie les anciennes sessions
    • SessionHandler::open - Initialise une session
    • SessionHandler::read - Lit les données de session
    • SessionHandler::write - Ecrit des données dans la session
    • SessionHandlerInterface::close - Ferme la session
    • SessionHandlerInterface::destroy - Détruit une session
    • SessionHandlerInterface::gc - Nettoie les vieilles sessions
    • SessionHandlerInterface::open - Initialise la session
    • SessionHandlerInterface::read - Lit les données de session
    • SessionHandlerInterface::write - Ecrit les données de session
    • SessionIdInterface::create_sid - Créer un ID de session
    • SessionUpdateTimestampHandlerInterface::updateTimestamp - Mettre à jour l'horodatage
    • SessionUpdateTimestampHandlerInterface::validateId - Valider l'ID
    • session_abort - Abandonne les changements sur le tableau de session et termine la session
    • session_cache_expire - Récupère et/ou définie le délai d'expiration du cache
    • session_cache_limiter - Lit et/ou modifie le limiteur de cache de session
    • session_commit - Alias de session_write_close
    • session_create_id - Créer un nouvel ID de session
    • session_decode - Décode les données encodées de session
    • session_destroy - Détruit une session
    • session_encode - Encode les données de session
    • session_gc - Exécute le ramasse miette des données de session
    • session_get_cookie_params - Lit la configuration du cookie de session
    • session_id - Lit et/ou modifie l'identifiant courant de session
    • session_is_registered - Vérifie si une variable est enregistrée dans la session
    • session_module_name - Lit et/ou modifie le module de session courant
    • session_name - Lit et/ou modifie le nom de la session
    • session_regenerate_id - Remplace l'identifiant de session courant par un nouveau
    • session_register_shutdown - Fonction de fermeture de session
    • session_reset - Réinitialise le tableau de session avec les valeurs originales
    • session_save_path - Lit et/ou modifie le chemin de sauvegarde des sessions
    • session_set_cookie_params - Modifie les paramètres du cookie de session
    • session_set_save_handler - Configure les fonctions de stockage de sessions
    • session_start - Démarre une nouvelle session ou reprend une session existante
    • session_status - Détermine le statut de la session courante
    • session_unregister - Supprime une variable de la session
    • session_unset - Détruit toutes les variables d'une session
    • session_write_close - Écrit les données de session et ferme la session
    • setcookie - Envoie un cookie
    • setlocale - Modifie les informations de localisation
    • setproctitle - Définit le titre du processus
    • setrawcookie - Envoie un cookie sans encoder sa valeur en URL
    • setthreadtitle - Définit le titre du thread
    • settype - Affecte un type à une variable
    • set_error_handler - Spécifie une fonction utilisateur comme gestionnaire d'erreurs
    • set_exception_handler - Définit une fonction utilisateur de gestion d'exceptions
    • set_file_buffer - Alias de stream_set_write_buffer
    • set_include_path - Modifie la valeur de la directive de configuration include_path
    • set_time_limit - Fixe le temps maximum d'exécution d'un script
    • sha1 - Calcule le sha1 d'une chaîne de caractères
    • sha1_file - Calcule le sha1 d'un fichier
    • shell_exec - Exécute une commande via le Shell et retourne le résultat sous forme de chaîne
    • shmop_close - Ferme un bloc de mémoire partagée
    • shmop_delete - Détruit un bloc de mémoire partagée
    • shmop_open - Crée ou ouvre un bloc de mémoire partagée
    • shmop_read - Lit des données à partir d'un bloc
    • shmop_size - Lire la taille du bloc de mémoire partagée
    • shmop_write - Écrire dans un bloc de mémoire partagée
    • shm_attach - Crée ou ouvre un segment de mémoire partagée
    • shm_detach - Libère un segment de mémoire partagée
    • shm_get_var - Lit une variable dans la mémoire partagée
    • shm_has_var - Vérifie si une variable existe en mémoire partagée
    • shm_put_var - Insère ou modifie une variable de la mémoire partagée
    • shm_remove - Supprime un segment de mémoire partagée sous Unix
    • shm_remove_var - Efface une variable de la mémoire partagée
    • show_source - Alias de highlight_file
    • shuffle - Mélange les éléments d'un tableau
    • similar_text - Calcule la similarité de deux chaînes
    • SimpleXMLElement::addAttribute - Ajoute un attribut à l'élément SimpleXML
    • SimpleXMLElement::addChild - Ajoute un élément enfant au noeud XML
    • SimpleXMLElement::asXML - Retourne une chaîne XML basée sur un élément SimpleXML
    • SimpleXMLElement::attributes - Identifie les attributs d'un élément
    • SimpleXMLElement::children - Cherche les fils d'un noeud donné
    • SimpleXMLElement::count - Compte le nombre de fils pour un élément
    • SimpleXMLElement::getDocNamespaces - Retourne les espaces de noms déclarés dans un document
    • SimpleXMLElement::getName - Récupère le nom d'un élément XML
    • SimpleXMLElement::getNamespaces - Retourne les espaces de noms utilisés dans un document
    • SimpleXMLElement::registerXPathNamespace - Crée un contexte préfixe/ns pour la prochaine requête XPath
    • SimpleXMLElement::saveXML - Alias de SimpleXMLElement::asXML
    • SimpleXMLElement::xpath - Exécute une requête Xpath sur des données XML
    • SimpleXMLElement::__construct - Crée un nouvel objet SimpleXMLElement
    • SimpleXMLElement::__toString - Retourne le contenu sous forme de chaine
    • SimpleXMLIterator::current - Retourne l'entrée courante
    • SimpleXMLIterator::getChildren - Retourne un itérateur pour l'entrée courante, si c'est un objet SimpleXML
    • SimpleXMLIterator::hasChildren - Indique si l'entrée courante de SimpleXML est un objet
    • SimpleXMLIterator::key - Retourne la clé courante
    • SimpleXMLIterator::next - Se déplace sur l'entrée SimpleXML suivante
    • SimpleXMLIterator::rewind - Replace le pointeur SimpleXML au début
    • SimpleXMLIterator::valid - Vérifie si une ressource SimpleXML contient d'autres entrées
    • simplexml_import_dom - Construit un objet SimpleXMLElement à partir d'un objet DOM
    • simplexml_load_file - Convertit un fichier XML en objet
    • simplexml_load_string - Convertit une chaîne XML en objet
    • sin - Sinus
    • sinh - Sinus hyperbolique
    • sizeof - Alias de count
    • sleep - Arrête l'exécution durant quelques secondes
    • snmp2_get - Récupère un objet SNMP
    • snmp2_getnext - Récupère l'objet SNMP qui suit immédiatement l'identifiant de l'objet fourni
    • snmp2_real_walk - Retourne tous les objets incluant les identifiants de leurs objets respectifs
    • snmp2_set - Définit la valeur d'un objet SNMP
    • snmp2_walk - Récupère tous les objets SNMP depuis un agent
    • snmp3_get - Récupère un objet SNMP
    • snmp3_getnext - Récupère l'objet SNMP qui suit immédiatement l'objet fourni
    • snmp3_real_walk - Retourne tous les objets incluant les identifiants de leurs objets respectifs
    • snmp3_set - Définit la valeur d'un objet SNMP
    • snmp3_walk - Récupère tous les objets SNMP depuis un agent
    • SNMP::close - Ferme une session SNMP
    • SNMP::get - Récupère un objet SNMP
    • SNMP::getErrno - Récupère le dernier code erreur
    • SNMP::getError - Récupère le dernier message d'erreur
    • SNMP::getnext - Récupère un objet SNMP qui suit l'identifiant d'objet fourni
    • SNMP::set - Définitl a valeur d'un objet SNMP
    • SNMP::setSecurity - Configure les paramètres de sécurité des sessions SNMPv3
    • SNMP::walk - Récupère le sous-objet d'un objet SNMP
    • SNMP::__construct - Crée une instance SNMP représentant la session vers l'agent distant SNMP
    • snmpget - Reçoit un objet SNMP
    • snmpgetnext - Récupère un objet SNMP qui suit immédiatement l'objet fourni
    • snmprealwalk - Retourne tous les objets, y compris les identifiants respectifs inclus dans l'objet
    • snmpset - Définit la valeur d'un objet SNMP
    • snmpwalk - Reçoit tous les objets SNMP d'un agent
    • snmpwalkoid - Demande d'informations d'arbre sur une entité du réseau
    • snmp_get_quick_print - Lit la valeur courante de l'option quick_print de la bibliothèque NET-SNMP
    • snmp_get_valueretrieval - Retourne la méthode avec laquelle les valeurs SNMP seront retournées
    • snmp_read_mib - Lit et analyse un fichier MIB dans l'arbre actif MIB
    • snmp_set_enum_print - Retourne toutes les valeurs qui sont des énumérations avec leur valeur d'énumération au lieu de l'entier
    • snmp_set_oid_numeric_print - Définit le format de sortie de l'OID
    • snmp_set_oid_output_format - Définit le format de sortie OID
    • snmp_set_quick_print - Écrit la valeur courante de l'option enable de la bibliothèque NET-SNMP
    • snmp_set_valueretrieval - Spécifie la méthode avec laquelle les valeurs SNMP seront retournées
    • SoapClient::__call - Appelle une fonction SOAP (obsolète)
    • SoapClient::__construct - Constructeur SoapClient
    • SoapClient::__doRequest - Exécute une requête SOAP
    • SoapClient::__getCookies - Get list of cookies
    • SoapClient::__getFunctions - Retourne une liste de fonctions SOAP publiées
    • SoapClient::__getLastRequest - Retourne la dernière requête SOAP
    • SoapClient::__getLastRequestHeaders - Retourne les en-têtes de la dernière requête SOAP
    • SoapClient::__getLastResponse - Retourne la dernière réponse SOAP
    • SoapClient::__getLastResponseHeaders - Retourne les en-têtes de la dernière réponse SOAP
    • SoapClient::__getTypes - Retourne une liste des types SOAP
    • SoapClient::__setCookie - Définit un cookie pour les requêtes SOAP
    • SoapClient::__setLocation - Configure l'URL du service Web à utiliser
    • SoapClient::__setSoapHeaders - Ajoute un en-tête SOAP pour les requêtes suivantes
    • SoapClient::__soapCall - Appelle une fonction SOAP
    • SoapFault::__construct - Constructeur SoapFault
    • SoapFault::__toString - Produit une représentation chaîne d'un objet SoapFault
    • SoapHeader::__construct - Constructeur SoapHeader
    • SoapParam::__construct - Constructeur SoapParam
    • SoapServer::addFunction - Ajoute une ou plusieurs fonctions qui vont gérer les requêtes SOAP
    • SoapServer::addSoapHeader - Ajoute un en-tête SOAP à une réponse
    • SoapServer::fault - Emet une erreur SoapServer
    • SoapServer::getFunctions - Retourne la liste des fonctions définies
    • SoapServer::handle - Traite une requête SOAP
    • SoapServer::setClass - Configure la classe qui sera utilisée pour gérer les requêtes SOAP
    • SoapServer::setObject - Configure l'objet qui sera utilisé pour gérer les requêtes SOAP
    • SoapServer::setPersistence - Active le mode persistant de SoapServer
    • SoapServer::__construct - Constructeur SoapServer
    • SoapVar::__construct - Constructeur SoapVar
    • socket_accept - Accepte une connexion sur un socket
    • socket_addrinfo_bind - Create and bind to a socket from a given addrinfo
    • socket_addrinfo_connect - Create and connect to a socket from a given addrinfo
    • socket_addrinfo_explain - Get information about addrinfo
    • socket_addrinfo_lookup - Get array with contents of getaddrinfo about the given hostname
    • socket_bind - Lie un nom à un socket
    • socket_clear_error - Efface toutes les erreurs précédemment générées par un socket
    • socket_close - Ferme une instance de Socket
    • socket_cmsg_space - Calcule la taille du buffer
    • socket_connect - Crée une connexion sur un socket
    • socket_create - Crée un socket
    • socket_create_listen - Ouvre un socket sur un port pour accepter les connexions
    • socket_create_pair - Crée une paire de sockets identiques et les stocke dans un tableau
    • socket_export_stream - Export a socket into a stream that encapsulates a socket
    • socket_getopt - Alias de socket_get_option
    • socket_getpeername - Interroge l'autre extrémité de la communication
    • socket_getsockname - Interroge le socket local
    • socket_get_option - Lit les options du socket
    • socket_get_status - Alias de stream_get_meta_data
    • socket_import_stream - Importe un flux
    • socket_last_error - Lit la dernière erreur générée par un socket
    • socket_listen - Attend une connexion sur un socket
    • socket_read - Lit des données d'un socket
    • socket_recv - Reçoit des données d'un socket connecté
    • socket_recvfrom - Reçoit des données d'un socket, connecté ou pas
    • socket_recvmsg - Lit un message
    • socket_select - Exécute l'appel système select() sur un tableau de sockets avec une durée d'expiration
    • socket_send - Envoie des données à un socket connecté
    • socket_sendmsg - Envoi un message
    • socket_sendto - Envoie un message à un socket, qu'il soit connecté ou pas
    • socket_setopt - Alias de socket_set_option
    • socket_set_block - Met le socket en mode bloquant
    • socket_set_blocking - Alias de stream_set_blocking
    • socket_set_nonblock - Sélectionne le mode non bloquant d'un pointeur de fichier
    • socket_set_option - Modifie les options de socket
    • socket_set_timeout - Alias de stream_set_timeout
    • socket_shutdown - Éteint un socket en lecture et/ou écriture
    • socket_strerror - Retourne une chaîne décrivant un message d'erreur
    • socket_write - Écrit dans un socket
    • socket_wsaprotocol_info_export - Exports the WSAPROTOCOL_INFO Structure
    • socket_wsaprotocol_info_import - Imports a Socket from another Process
    • socket_wsaprotocol_info_release - Releases an exported WSAPROTOCOL_INFO Structure
    • sodium_add - Add large numbers
    • sodium_base642bin - Description
    • sodium_bin2base64 - Description
    • sodium_bin2hex - Encode to hexadecimal
    • sodium_compare - Compare large numbers
    • sodium_crypto_aead_aes256gcm_decrypt - Decrypt in combined mode with precalculation
    • sodium_crypto_aead_aes256gcm_encrypt - Encrypt in combined mode with precalculation
    • sodium_crypto_aead_aes256gcm_is_available - Check if hardware supports AES256-GCM
    • sodium_crypto_aead_aes256gcm_keygen - Get random bytes for key
    • sodium_crypto_aead_chacha20poly1305_decrypt - Verify that the ciphertext includes a valid tag
    • sodium_crypto_aead_chacha20poly1305_encrypt - Encrypt a message
    • sodium_crypto_aead_chacha20poly1305_ietf_decrypt - Verify that the ciphertext includes a valid tag
    • sodium_crypto_aead_chacha20poly1305_ietf_encrypt - Encrypt a message
    • sodium_crypto_aead_chacha20poly1305_ietf_keygen - Get random bytes for key
    • sodium_crypto_aead_chacha20poly1305_keygen - Get random bytes for key
    • sodium_crypto_aead_xchacha20poly1305_ietf_decrypt - Description
    • sodium_crypto_aead_xchacha20poly1305_ietf_encrypt - Description
    • sodium_crypto_aead_xchacha20poly1305_ietf_keygen - Description
    • sodium_crypto_auth - Compute a tag for the message
    • sodium_crypto_auth_keygen - Get random bytes for key
    • sodium_crypto_auth_verify - Verifies that the tag is valid for the message
    • sodium_crypto_box - Encrypt a message
    • sodium_crypto_box_keypair - Randomly generate a secret key and a corresponding public key
    • sodium_crypto_box_keypair_from_secretkey_and_publickey - Description
    • sodium_crypto_box_open - Verify and decrypt a ciphertext
    • sodium_crypto_box_publickey - Description
    • sodium_crypto_box_publickey_from_secretkey - Description
    • sodium_crypto_box_seal - Encrypt a message
    • sodium_crypto_box_seal_open - Decrypt the ciphertext
    • sodium_crypto_box_secretkey - Description
    • sodium_crypto_box_seed_keypair - Deterministically derive the key pair from a single key
    • sodium_crypto_generichash - Get a hash of the message
    • sodium_crypto_generichash_final - Complete the hash
    • sodium_crypto_generichash_init - Initialize a hash
    • sodium_crypto_generichash_keygen - Get random bytes for key
    • sodium_crypto_generichash_update - Add message to a hash
    • sodium_crypto_kdf_derive_from_key - Derive a subkey
    • sodium_crypto_kdf_keygen - Get random bytes for key
    • sodium_crypto_kx_client_session_keys - Description
    • sodium_crypto_kx_keypair - Creates a new sodium keypair
    • sodium_crypto_kx_publickey - Description
    • sodium_crypto_kx_secretkey - Description
    • sodium_crypto_kx_seed_keypair - Description
    • sodium_crypto_kx_server_session_keys - Description
    • sodium_crypto_pwhash - Derive a key from a password
    • sodium_crypto_pwhash_scryptsalsa208sha256 - Derives a key from a password
    • sodium_crypto_pwhash_scryptsalsa208sha256_str - Get an ASCII encoded hash
    • sodium_crypto_pwhash_scryptsalsa208sha256_str_verify - Verify that the password is a valid password verification string
    • sodium_crypto_pwhash_str - Get an ASCII-encoded hash
    • sodium_crypto_pwhash_str_needs_rehash - Description
    • sodium_crypto_pwhash_str_verify - Verifies that a password matches a hash
    • sodium_crypto_scalarmult - Compute a shared secret given a user's secret key and another user's public key
    • sodium_crypto_scalarmult_base - Alias de sodium_crypto_box_publickey_from_secretkey
    • sodium_crypto_secretbox - Encrypt a message
    • sodium_crypto_secretbox_keygen - Get random bytes for key
    • sodium_crypto_secretbox_open - Verify and decrypt a ciphertext
    • sodium_crypto_secretstream_xchacha20poly1305_init_pull - Description
    • sodium_crypto_secretstream_xchacha20poly1305_init_push - Description
    • sodium_crypto_secretstream_xchacha20poly1305_keygen - Description
    • sodium_crypto_secretstream_xchacha20poly1305_pull - Description
    • sodium_crypto_secretstream_xchacha20poly1305_push - Description
    • sodium_crypto_secretstream_xchacha20poly1305_rekey - Description
    • sodium_crypto_shorthash - Compute a fixed-size fingerprint for the message
    • sodium_crypto_shorthash_keygen - Get random bytes for key
    • sodium_crypto_sign - Sign a message
    • sodium_crypto_sign_detached - Sign the message
    • sodium_crypto_sign_ed25519_pk_to_curve25519 - Convert an Ed25519 public key to a Curve25519 public key
    • sodium_crypto_sign_ed25519_sk_to_curve25519 - Convert an Ed25519 secret key to a Curve25519 secret key
    • sodium_crypto_sign_keypair - Randomly generate a secret key and a corresponding public key
    • sodium_crypto_sign_keypair_from_secretkey_and_publickey - Description
    • sodium_crypto_sign_open - Check that the signed message has a valid signature
    • sodium_crypto_sign_publickey - Description
    • sodium_crypto_sign_publickey_from_secretkey - Extract the public key from the secret key
    • sodium_crypto_sign_secretkey - Description
    • sodium_crypto_sign_seed_keypair - Deterministically derive the key pair from a single key
    • sodium_crypto_sign_verify_detached - Verify signature for the message
    • sodium_crypto_stream - Generate a deterministic sequence of bytes from a seed
    • sodium_crypto_stream_keygen - Get random bytes for key
    • sodium_crypto_stream_xor - Encrypt a message
    • sodium_hex2bin - Decodes a hexadecimally encoded binary string
    • sodium_increment - Increment large number
    • sodium_memcmp - Test for equality in constant-time
    • sodium_memzero - Overwrite buf with zeros
    • sodium_pad - Add padding data
    • sodium_unpad - Remove padding data
    • SolrClient::addDocument - Ajoute un document à l'index
    • SolrClient::addDocuments - Ajoute une collection d'instances SolrInputDocument à l'index
    • SolrClient::commit - Commit tous les ajouts/modifications effectués sur l'index
    • SolrClient::deleteById - Effacement par Id
    • SolrClient::deleteByIds - Effacement par Ids
    • SolrClient::deleteByQueries - Efface tous les documents correspondant à des requêtes
    • SolrClient::deleteByQuery - Efface tous les documents correspondant à une requête
    • SolrClient::getById - Get Document By Id. Utilizes Solr Realtime Get (RTG)
    • SolrClient::getByIds - Get Documents by their Ids. Utilizes Solr Realtime Get (RTG)
    • SolrClient::getDebug - Récupère les données de débogage de la dernière tentative de connexion
    • SolrClient::getOptions - Récupère les options clientes définies en interne
    • SolrClient::optimize - Défragmente l'index
    • SolrClient::ping - Vérifie si le serveur Solr est disponible
    • SolrClient::query - Envoi une requête au serveur
    • SolrClient::request - Envoi une requête brute de mise à jour
    • SolrClient::rollback - Annule les ajouts/effacements effectués sur l'index depuis le dernier commit
    • SolrClient::setResponseWriter - Définit le gestionnaire à utiliser pour préparer la réponse depuis Solr
    • SolrClient::setServlet - Modifie le type d'un servlet en une nouvelle valeur
    • SolrClient::system - Retrieve Solr Server information
    • SolrClient::threads - Vérifie le statut des threads
    • SolrClient::__construct - Constructeur de l'objet SolrClient
    • SolrClient::__destruct - Destructeur pour SolrClient
    • SolrClientException::getInternalInfo - Retourne des informations internes sur l'endroit d'où est lancée l'exception
    • SolrCollapseFunction::getField - Returns the field that is being collapsed on
    • SolrCollapseFunction::getHint - Returns collapse hint
    • SolrCollapseFunction::getMax - Returns max parameter
    • SolrCollapseFunction::getMin - Returns min parameter
    • SolrCollapseFunction::getNullPolicy - Returns null policy
    • SolrCollapseFunction::getSize - Returns size parameter
    • SolrCollapseFunction::setField - Sets the field to collapse on
    • SolrCollapseFunction::setHint - Sets collapse hint
    • SolrCollapseFunction::setMax - Selects the group heads by the max value of a numeric field or function query
    • SolrCollapseFunction::setMin - Sets the initial size of the collapse data structures when collapsing on a numeric field only
    • SolrCollapseFunction::setNullPolicy - Sets the NULL Policy
    • SolrCollapseFunction::setSize - Sets the initial size of the collapse data structures when collapsing on a numeric field only
    • SolrCollapseFunction::__construct - Constructor
    • SolrCollapseFunction::__toString - Returns a string representing the constructed collapse function
    • SolrDisMaxQuery::addBigramPhraseField - Adds a Phrase Bigram Field (pf2 parameter)
    • SolrDisMaxQuery::addBoostQuery - Adds a boost query field with value and optional boost (bq parameter)
    • SolrDisMaxQuery::addPhraseField - Adds a Phrase Field (pf parameter)
    • SolrDisMaxQuery::addQueryField - Add a query field with optional boost (qf parameter)
    • SolrDisMaxQuery::addTrigramPhraseField - Adds a Trigram Phrase Field (pf3 parameter)
    • SolrDisMaxQuery::addUserField - Adds a field to User Fields Parameter (uf)
    • SolrDisMaxQuery::removeBigramPhraseField - Removes phrase bigram field (pf2 parameter)
    • SolrDisMaxQuery::removeBoostQuery - Removes a boost query partial by field name (bq)
    • SolrDisMaxQuery::removePhraseField - Removes a Phrase Field (pf parameter)
    • SolrDisMaxQuery::removeQueryField - Removes a Query Field (qf parameter)
    • SolrDisMaxQuery::removeTrigramPhraseField - Removes a Trigram Phrase Field (pf3 parameter)
    • SolrDisMaxQuery::removeUserField - Removes a field from The User Fields Parameter (uf)
    • SolrDisMaxQuery::setBigramPhraseFields - Sets Bigram Phrase Fields and their boosts (and slops) using pf2 parameter
    • SolrDisMaxQuery::setBigramPhraseSlop - Sets Bigram Phrase Slop (ps2 parameter)
    • SolrDisMaxQuery::setBoostFunction - Sets a Boost Function (bf parameter)
    • SolrDisMaxQuery::setBoostQuery - Directly Sets Boost Query Parameter (bq)
    • SolrDisMaxQuery::setMinimumMatch - Set Minimum "Should" Match (mm)
    • SolrDisMaxQuery::setPhraseFields - Sets Phrase Fields and their boosts (and slops) using pf2 parameter
    • SolrDisMaxQuery::setPhraseSlop - Sets the default slop on phrase queries (ps parameter)
    • SolrDisMaxQuery::setQueryAlt - Set Query Alternate (q.alt parameter)
    • SolrDisMaxQuery::setQueryPhraseSlop - Specifies the amount of slop permitted on phrase queries explicitly included in the user's query string (qf parameter)
    • SolrDisMaxQuery::setTieBreaker - Sets Tie Breaker parameter (tie parameter)
    • SolrDisMaxQuery::setTrigramPhraseFields - Directly Sets Trigram Phrase Fields (pf3 parameter)
    • SolrDisMaxQuery::setTrigramPhraseSlop - Sets Trigram Phrase Slop (ps3 parameter)
    • SolrDisMaxQuery::setUserFields - Sets User Fields parameter (uf)
    • SolrDisMaxQuery::useDisMaxQueryParser - Switch QueryParser to be DisMax Query Parser
    • SolrDisMaxQuery::useEDisMaxQueryParser - Switch QueryParser to be EDisMax
    • SolrDisMaxQuery::__construct - Class Constructor
    • SolrDocument::addField - Ajoute un champ au document
    • SolrDocument::clear - Efface tous les champs du document
    • SolrDocument::current - Récupère le champ courant
    • SolrDocument::deleteField - Efface un champ du document
    • SolrDocument::fieldExists - Vérifie si un champ existe dans le document
    • SolrDocument::getChildDocuments - Returns an array of child documents (SolrDocument)
    • SolrDocument::getChildDocumentsCount - Returns the number of child documents
    • SolrDocument::getField - Récupère un champ par son nom
    • SolrDocument::getFieldCount - Récupère le nombre de champs du document
    • SolrDocument::getFieldNames - Récupère un tableau de noms de champs du document
    • SolrDocument::getInputDocument - Retourne un objet SolrInputDocument équivalent à l'objet
    • SolrDocument::hasChildDocuments - Checks whether the document has any child documents
    • SolrDocument::key - Récupère la clé courante
    • SolrDocument::merge - Fusionne la source à l'objet SolrDocument courant
    • SolrDocument::next - Déplace le pointeur interne sur le champ suivant
    • SolrDocument::offsetExists - Vérifie si un champ particulier existe
    • SolrDocument::offsetGet - Récupère un champ
    • SolrDocument::offsetSet - Ajoute un champ au document
    • SolrDocument::offsetUnset - Efface un champ
    • SolrDocument::reset - Alias de SolrDocument::clear()
    • SolrDocument::rewind - Réinitialise le pointeur interne au début
    • SolrDocument::serialize - Utilisé pour une linéarisation personnalisée
    • SolrDocument::sort - Trie les champs du document
    • SolrDocument::toArray - Récupère un tableau représentant le document
    • SolrDocument::unserialize - Linéarisation personnalisée d'objets SolrDocument
    • SolrDocument::valid - Vérifie si la position courant interne est toujours valide
    • SolrDocument::__clone - Crée une copie de l'objet SolrDocument
    • SolrDocument::__construct - Constructeur
    • SolrDocument::__destruct - Destructeur
    • SolrDocument::__get - Accède à un champ comme une propriété
    • SolrDocument::__isset - Vérifie si un champ existe
    • SolrDocument::__set - Ajoute un champ au document
    • SolrDocument::__unset - Efface un champ du document
    • SolrDocumentField::__construct - Constructeur
    • SolrDocumentField::__destruct - Destructeur
    • SolrException::getInternalInfo - Récupère des informations internes lorsqu'une exception a été lancée
    • SolrGenericResponse::__construct - Constructeur
    • SolrGenericResponse::__destruct - Destructeur
    • SolrIllegalArgumentException::getInternalInfo - Retourne des informations sur l'endroit d'où l'exception a été émise
    • SolrIllegalOperationException::getInternalInfo - Récupère des informations internes lorsqu'une exception a été lancée
    • SolrInputDocument::addChildDocument - Adds a child document for block indexing
    • SolrInputDocument::addChildDocuments - Adds an array of child documents
    • SolrInputDocument::addField - Ajoute un champ au document
    • SolrInputDocument::clear - Réinitialise le document d'entrée
    • SolrInputDocument::deleteField - Efface un champ d'un document
    • SolrInputDocument::fieldExists - Vérifie si un champ existe
    • SolrInputDocument::getBoost - Récupère la valeur courante du boost pour le document
    • SolrInputDocument::getChildDocuments - Returns an array of child documents (SolrInputDocument)
    • SolrInputDocument::getChildDocumentsCount - Returns the number of child documents
    • SolrInputDocument::getField - Récupère un champ par son nom
    • SolrInputDocument::getFieldBoost - Récupère la valeur du boost pour un champ donné
    • SolrInputDocument::getFieldCount - Retourne le nombre de champs du document
    • SolrInputDocument::getFieldNames - Retourne un tableau contenant tous les champs du document
    • SolrInputDocument::hasChildDocuments - Returns true if the document has any child documents
    • SolrInputDocument::merge - Fusionne un document d'entrée dans un autre
    • SolrInputDocument::reset - Alias de SolrInputDocument::clear
    • SolrInputDocument::setBoost - Définit la valeur de boost pour le document
    • SolrInputDocument::setFieldBoost - Définit la valeur de boost pour un champ
    • SolrInputDocument::sort - Tri les champs du document
    • SolrInputDocument::toArray - Retourne un représentation sous forme de tableau du document d'entrée
    • SolrInputDocument::__clone - Crée une copie de l'objet SolrDocument
    • SolrInputDocument::__construct - Constructeur
    • SolrInputDocument::__destruct - Destructeur
    • SolrModifiableParams::__construct - Constructeur
    • SolrModifiableParams::__destruct - Destructeur
    • SolrObject::getPropertyNames - Récupère un tableau contenant les noms de toutes les propriétés
    • SolrObject::offsetExists - Vérifie si une propriété existe
    • SolrObject::offsetGet - Récupère une propriété
    • SolrObject::offsetSet - Définit la valeur d'une propriété
    • SolrObject::offsetUnset - Supprime la valeur de la propriété
    • SolrObject::__construct - Crée un objet Solr
    • SolrObject::__destruct - Destructeur
    • SolrParams::add - Alias de SolrParams::addParam
    • SolrParams::addParam - Ajoute un paramètre à l'objet
    • SolrParams::get - Alias de SolrParams::getParam
    • SolrParams::getParam - Retourne la valeur d'un paramètre
    • SolrParams::getParams - Retourne un tableau de paramètres non encodés URL
    • SolrParams::getPreparedParams - Retourne un tableau de paramètres encodés URL
    • SolrParams::serialize - Utilisé pour une linéarisation personnalisée
    • SolrParams::set - Alias de SolrParams::setParam
    • SolrParams::setParam - Définit un paramètre à une valeur spécifique
    • SolrParams::toString - Retourne tous les paramètres de l'objet
    • SolrParams::unserialize - Utilisé pour la linéarisation personnalisée
    • SolrPingResponse::getResponse - Récupère la réponse du serveur
    • SolrPingResponse::__construct - Constructeur
    • SolrPingResponse::__destruct - Destructeur
    • SolrQuery::addExpandFilterQuery - Overrides main filter query, determines which documents to include in the main group
    • SolrQuery::addExpandSortField - Orders the documents within the expanded groups (expand.sort parameter)
    • SolrQuery::addFacetDateField - Lie un facet.date
    • SolrQuery::addFacetDateOther - Ajoute une autre paramètre facet.date.other
    • SolrQuery::addFacetField - Ajoute un autre champ à la facette
    • SolrQuery::addFacetQuery - Ajoute une requête de facette
    • SolrQuery::addField - Spécifie quel champ doit retourner le résultat
    • SolrQuery::addFilterQuery - Spécifie un filtre de requête
    • SolrQuery::addGroupField - Add a field to be used to group results
    • SolrQuery::addGroupFunction - Allows grouping results based on the unique values of a function query (group.func parameter)
    • SolrQuery::addGroupQuery - Allows grouping of documents that match the given query
    • SolrQuery::addGroupSortField - Add a group sort field (group.sort parameter)
    • SolrQuery::addHighlightField - Lie un hl.fl
    • SolrQuery::addMltField - Spécifie un champ à utiliser pour les similitudes
    • SolrQuery::addMltQueryField - Lie un mlt.qf
    • SolrQuery::addSortField - Utilisé pour contrôler le tri du résultat
    • SolrQuery::addStatsFacet - Récupère un sous résultat pour y trouver des valeurs d'une facette donnée
    • SolrQuery::addStatsField - Lie un paramètre stats.field
    • SolrQuery::collapse - Collapses the result set to a single document per group
    • SolrQuery::getExpand - Returns true if group expanding is enabled
    • SolrQuery::getExpandFilterQueries - Returns the expand filter queries
    • SolrQuery::getExpandQuery - Returns the expand query expand.q parameter
    • SolrQuery::getExpandRows - Returns The number of rows to display in each group (expand.rows)
    • SolrQuery::getExpandSortFields - Returns an array of fields
    • SolrQuery::getFacet - Retourne la valeur du paramètre de facette
    • SolrQuery::getFacetDateEnd - Retourne la valeur du paramètre facet.date.end
    • SolrQuery::getFacetDateFields - Retourne tous les champs facet.date
    • SolrQuery::getFacetDateGap - Récupère la valeur du paramètre facet.date.gap
    • SolrQuery::getFacetDateHardEnd - Récupère la valeur du paramètre facet.date.hardend
    • SolrQuery::getFacetDateOther - Récupère la valeur du paramètre facet.date.other
    • SolrQuery::getFacetDateStart - Récupère la limite inférieure du premier intervalle de la date pour toutes les facettes de date pour ce champ
    • SolrQuery::getFacetFields - Récupère toutes les facettes des champs
    • SolrQuery::getFacetLimit - Récupère le nombre maximal de contraintes qui peut être retourné pour les facettes des champs
    • SolrQuery::getFacetMethod - Récupère la valeur du paramètre facet.method
    • SolrQuery::getFacetMinCount - Récupère le nombre minimal de facettes des champs qui doivent être incluses dans la réponse
    • SolrQuery::getFacetMissing - Récupère l'état courant du paramètre facet.missing
    • SolrQuery::getFacetOffset - Récupère la position dans la liste des contraintes à utiliser pour la pagination
    • SolrQuery::getFacetPrefix - Récupère le préfixe de la facette
    • SolrQuery::getFacetQueries - Récupère toutes les facettes des requêtes
    • SolrQuery::getFacetSort - Retourne le type de tri de la facette
    • SolrQuery::getFields - Récupère la liste des champs qui seront retournés dans la réponse
    • SolrQuery::getFilterQueries - Récupère un tableau de filtres de requêtes
    • SolrQuery::getGroup - Returns true if grouping is enabled
    • SolrQuery::getGroupCachePercent - Returns group cache percent value
    • SolrQuery::getGroupFacet - Returns the group.facet parameter value
    • SolrQuery::getGroupFields - Returns group fields (group.field parameter values)
    • SolrQuery::getGroupFormat - Returns the group.format value
    • SolrQuery::getGroupFunctions - Returns group functions (group.func parameter values)
    • SolrQuery::getGroupLimit - Returns the group.limit value
    • SolrQuery::getGroupMain - Returns the group.main value
    • SolrQuery::getGroupNGroups - Returns the group.ngroups value
    • SolrQuery::getGroupOffset - Returns the group.offset value
    • SolrQuery::getGroupQueries - Returns all the group.query parameter values
    • SolrQuery::getGroupSortFields - Returns the group.sort value
    • SolrQuery::getGroupTruncate - Returns the group.truncate value
    • SolrQuery::getHighlight - Récupère l'état du paramètre h1
    • SolrQuery::getHighlightAlternateField - Récupère le champ mis en évidence à utiliser comme champ par défaut ou comme champ de sauvegarde
    • SolrQuery::getHighlightFields - Récupère tous les champs pour lesquels Solr doit mettre en évidence un extrait
    • SolrQuery::getHighlightFormatter - Récupère le formatage utilisé pour mettre en évidence la sortie
    • SolrQuery::getHighlightFragmenter - Récupère le générateur d'extrait de texte pour la mise en évidence
    • SolrQuery::getHighlightFragsize - Retourne le nombre de caractères des fragments à considérer pour la mise en évidence
    • SolrQuery::getHighlightHighlightMultiTerm - Retourne si l'on doit activer la mise en évidence pour les intervalles/jokers/flous/préfixes des requêtes
    • SolrQuery::getHighlightMaxAlternateFieldLength - Retourne le nombre maximal de caractères du champ à retourner
    • SolrQuery::getHighlightMaxAnalyzedChars - Retourne le nombre maximal de caractères du document dans lequel les extraits seront cherchés
    • SolrQuery::getHighlightMergeContiguous - Retourne si l'on doit rassembler les fragments contigus en un seul fragment
    • SolrQuery::getHighlightRegexMaxAnalyzedChars - Retourne le nombre maximal de caractères depuis un champ lors de l'utilisation d'une regex
    • SolrQuery::getHighlightRegexPattern - Récupère l'expression rationnelle utilisée pour la fragmentation
    • SolrQuery::getHighlightRegexSlop - Récupère le facteur de déviation depuis la taille du fragment idéal
    • SolrQuery::getHighlightRequireFieldMatch - Retourne si le champ ne doit être mis en évidence que si la requête correspond à un champ en particulier
    • SolrQuery::getHighlightSimplePost - Récupère le texte qui doit apparaître après le terme mise en évidence
    • SolrQuery::getHighlightSimplePre - Retourne le texte qui doit apparaître avant le terme mise en évidence
    • SolrQuery::getHighlightSnippets - Récupère le nombre maximal d'extraits mis en évidence à générer par champ
    • SolrQuery::getHighlightUsePhraseHighlighter - Récupère l'état du paramètre hl.usePhraseHighlighter
    • SolrQuery::getMlt - Retourne si les résultats MoreLikeThis doivent être activés
    • SolrQuery::getMltBoost - Retourne si la requête doit être améliorée en utilisant la pertinence des termes
    • SolrQuery::getMltCount - Récupère le nombre de documents similaires à retourner pour chaque résultat
    • SolrQuery::getMltFields - Récupère tous les champs à utiliser pour la similarité
    • SolrQuery::getMltMaxNumQueryTerms - Retourne le nombre maximal de termes de requête qui peuvent être inclus lors de la génération d'une requête
    • SolrQuery::getMltMaxNumTokens - Retourne le nombre maximal de jokers à analyser dans chaque champ du document
    • SolrQuery::getMltMaxWordLength - Retourne la longueur minimale des mots en deçà de laquelle ils seront ignorés
    • SolrQuery::getMltMinDocFrequency - Retourne le seuil de fréquence d'apparition des mots
    • SolrQuery::getMltMinTermFrequency - Retourne la fréquence en deçà duquel les termes doivent être ignorés dans le document source
    • SolrQuery::getMltMinWordLength - Retourne la longueur minimum d'un mot en deça duquel il sera ignoré
    • SolrQuery::getMltQueryFields - Retourne les champs de la requête ainsi que leurs boosts
    • SolrQuery::getQuery - Retourne la requête principale
    • SolrQuery::getRows - Retourne le nombre maximal de documents
    • SolrQuery::getSortFields - Retourne tous les champs de tri
    • SolrQuery::getStart - Retourne la position dans le jeu complet de résultats
    • SolrQuery::getStats - Vérifie si les statistiques sont actives ou non
    • SolrQuery::getStatsFacets - Retourne toutes les statistiques définies
    • SolrQuery::getStatsFields - Retourne les statistiques des champs
    • SolrQuery::getTerms - Vérifie si le TermsComponent est activé ou non
    • SolrQuery::getTermsField - Récupère le champ depuis lequel les termes sont récupérés
    • SolrQuery::getTermsIncludeLowerBound - Vérifie si l'on doit inclure ou non la limite inférieure dans le jeu de résultats
    • SolrQuery::getTermsIncludeUpperBound - Vérifie si l'on doit inclure ou non la limite supérieure dans le jeu de résultats
    • SolrQuery::getTermsLimit - Retourne le nombre maximal de termes que Solr peut retourner
    • SolrQuery::getTermsLowerBound - Retourne le terme sur lequel on doit commencer
    • SolrQuery::getTermsMaxCount - Retourne la fréquence maximale des documents
    • SolrQuery::getTermsMinCount - Retourne la fréquence minimale des documents
    • SolrQuery::getTermsPrefix - Retourne le préfixe du terme
    • SolrQuery::getTermsReturnRaw - Si l'on doit retourner ou non les caractères brutes
    • SolrQuery::getTermsSort - Retourne un entier indiquant le nombre de termes stockés
    • SolrQuery::getTermsUpperBound - Retourne le terme sur lequel on doit s'arrêter
    • SolrQuery::getTimeAllowed - Retourne le délai d'exécution autorisé pour une requête
    • SolrQuery::removeExpandFilterQuery - Removes an expand filter query
    • SolrQuery::removeExpandSortField - Removes an expand sort field from the expand.sort parameter
    • SolrQuery::removeFacetDateField - Supprime un champ date
    • SolrQuery::removeFacetDateOther - Supprime un paramètre facet.date.other
    • SolrQuery::removeFacetField - Supprime un paramètre facet.date
    • SolrQuery::removeFacetQuery - Supprime un paramètre facet.query
    • SolrQuery::removeField - Efface un champ depuis la liste des champs
    • SolrQuery::removeFilterQuery - Supprime un filtre de requête
    • SolrQuery::removeHighlightField - Supprime un des champs utilisés pour la mise en évidence
    • SolrQuery::removeMltField - Supprime un des champs moreLikeThis
    • SolrQuery::removeMltQueryField - Supprime un des champs moreLikeThis de la requête
    • SolrQuery::removeSortField - Supprime un champ de tri
    • SolrQuery::removeStatsFacet - Supprime un paramètre stats.facet
    • SolrQuery::removeStatsField - Supprime un paramètre stats.field
    • SolrQuery::setEchoHandler - Bascule le paramètre echoHandler
    • SolrQuery::setEchoParams - Détermine les paramètres à inclure dans la réponse
    • SolrQuery::setExpand - Enables/Disables the Expand Component
    • SolrQuery::setExpandQuery - Sets the expand.q parameter
    • SolrQuery::setExpandRows - Sets the number of rows to display in each group (expand.rows). Server Default 5
    • SolrQuery::setExplainOther - Définit le paramètre de requête explainOther
    • SolrQuery::setFacet - Lie un paramètre facet. Active ou désactive les facet
    • SolrQuery::setFacetDateEnd - Lie un facet.date.end
    • SolrQuery::setFacetDateGap - Lie un facet.date.gap
    • SolrQuery::setFacetDateHardEnd - Lie un facet.date.hardend
    • SolrQuery::setFacetDateStart - Lie un facet.date.start
    • SolrQuery::setFacetEnumCacheMinDefaultFrequency - Définit la fréquence minimale du document utilisée pour déterminer le comptage des termes
    • SolrQuery::setFacetLimit - Lie un facet.limit
    • SolrQuery::setFacetMethod - Spécifie le type d'algorithme à utiliser pour un champ facet
    • SolrQuery::setFacetMinCount - Lie un facet.mincount
    • SolrQuery::setFacetMissing - Lie un facet.missing
    • SolrQuery::setFacetOffset - Définit la position dans la liste des contraintes pour la pagination
    • SolrQuery::setFacetPrefix - Spécifie un préfixe utilisé pour limiter les termes
    • SolrQuery::setFacetSort - Détermine le tri des facet
    • SolrQuery::setGroup - Enable/Disable result grouping (group parameter)
    • SolrQuery::setGroupCachePercent - Enables caching for result grouping
    • SolrQuery::setGroupFacet - Sets group.facet parameter
    • SolrQuery::setGroupFormat - Sets the group format, result structure (group.format parameter)
    • SolrQuery::setGroupLimit - Specifies the number of results to return for each group. The server default value is 1
    • SolrQuery::setGroupMain - If true, the result of the first field grouping command is used as the main result list in the response, using group.format=simple
    • SolrQuery::setGroupNGroups - If true, Solr includes the number of groups that have matched the query in the results
    • SolrQuery::setGroupOffset - Sets the group.offset parameter
    • SolrQuery::setGroupTruncate - If true, facet counts are based on the most relevant document of each group matching the query
    • SolrQuery::setHighlight - Active ou désactive la coloration
    • SolrQuery::setHighlightAlternateField - Spécifie le champ de sauvegarde à utiliser
    • SolrQuery::setHighlightFormatter - Spécifie un formateur pour la sortie colorisée
    • SolrQuery::setHighlightFragmenter - Définit un générateur d'extraits de texte pour le texte colorisé
    • SolrQuery::setHighlightFragsize - La taille du fragment à considérer pour la coloration
    • SolrQuery::setHighlightHighlightMultiTerm - Utilise SpanScorer pour coloriser les termes d'une phrase
    • SolrQuery::setHighlightMaxAlternateFieldLength - Définit le nombre maximal de caractères du champ à retourner
    • SolrQuery::setHighlightMaxAnalyzedChars - Spécifie le nombre de caractères dans un document pour y chercher des extraits correspondants
    • SolrQuery::setHighlightMergeContiguous - Si l'on doit rassembler les fragments proches dans un seul fragment
    • SolrQuery::setHighlightRegexMaxAnalyzedChars - Spécifie le nombre maximal de caractères à analyser
    • SolrQuery::setHighlightRegexPattern - Spécifie l'expression rationnelle pour la fragmentation
    • SolrQuery::setHighlightRegexSlop - Définit le facteur par lequel le fragmenteur regex peut dévier de la taille idéale du fragment
    • SolrQuery::setHighlightRequireFieldMatch - Champ correspondant requis lors de la colorisation
    • SolrQuery::setHighlightSimplePost - Définit le texte qui doit apparaître après un terme colorisé
    • SolrQuery::setHighlightSimplePre - Définit le texte qui doit apparaître avant un terme colorisé
    • SolrQuery::setHighlightSnippets - Définit le nombre maximal d'extraits à coloriser par champ
    • SolrQuery::setHighlightUsePhraseHighlighter - Si l'on doit coloriser les termes d'une phrase uniquement si ils apparaissent dans la requête
    • SolrQuery::setMlt - Active ou désactive moreLikeThis
    • SolrQuery::setMltBoost - Si la requête doit être stimulée par la pertinence des termes
    • SolrQuery::setMltCount - Définit le nombre de documents similaires à retourner à chaque résultat
    • SolrQuery::setMltMaxNumQueryTerms - Définit le nombre maximal de termes de requête à inclure
    • SolrQuery::setMltMaxNumTokens - Spécifie le nombre maximal de motifs à analyser
    • SolrQuery::setMltMaxWordLength - Définit la longueur maximale d'un mot
    • SolrQuery::setMltMinDocFrequency - Définit la fréquence mltMinDoc
    • SolrQuery::setMltMinTermFrequency - Définit la fréquence en dessous de laquelle les termes seront ignorés dans le document source
    • SolrQuery::setMltMinWordLength - Définit la longueur minimale d'un mot
    • SolrQuery::setOmitHeader - Exclut l'en-tête des résultats retournés
    • SolrQuery::setQuery - Définit la requête de recherche
    • SolrQuery::setRows - Spécifie le nombre maximal de lignes à retourner dans le résultat
    • SolrQuery::setShowDebugInfo - Drapeau pour afficher les informations de débogage
    • SolrQuery::setStart - Spécifie le nombre maximal de lignes à ignorer
    • SolrQuery::setStats - Active ou désactive le composant statistique
    • SolrQuery::setTerms - Active ou désactive le TermsComponent
    • SolrQuery::setTermsField - Définit le nom du champ dans lequel les termes seront récupérés
    • SolrQuery::setTermsIncludeLowerBound - Inclut le terme inférieure liée dans le jeu de résultat
    • SolrQuery::setTermsIncludeUpperBound - Inclut le terme supérieure liée dans le jeu de résultat
    • SolrQuery::setTermsLimit - Définit le nombre maximal de termes à retourner
    • SolrQuery::setTermsLowerBound - Spécifie le terme de départ
    • SolrQuery::setTermsMaxCount - Définit la fréquence maximale du document
    • SolrQuery::setTermsMinCount - Définit la fréquence minimale d'un document
    • SolrQuery::setTermsPrefix - Restreint les termes correspondants qui commencent avec un préfixe donné
    • SolrQuery::setTermsReturnRaw - Retourne les caractères brutes d'un terme indexé
    • SolrQuery::setTermsSort - Spécifie la façon dont seront triés les termes retournés
    • SolrQuery::setTermsUpperBound - Définit le terme à partir duquel on doit stopper
    • SolrQuery::setTimeAllowed - Le temps allouée pour faire une recherche
    • SolrQuery::__construct - Constructeur
    • SolrQuery::__destruct - Destructeur
    • SolrQueryResponse::__construct - Constructeur
    • SolrQueryResponse::__destruct - Destructeur
    • SolrResponse::getDigestedResponse - Récupère la réponse XML sous la forme de données PHP linéarisées
    • SolrResponse::getHttpStatus - Récupère le statut HTTP de la réponse
    • SolrResponse::getHttpStatusMessage - Récupère plus de détails sur le statut HTTP
    • SolrResponse::getRawRequest - Récupère la requête brute envpyée au serveur Solr
    • SolrResponse::getRawRequestHeaders - Récupère les en-têtes brutes de la requête envoyée au serveur Solr
    • SolrResponse::getRawResponse - Récupère la réponse brute du serveur
    • SolrResponse::getRawResponseHeaders - Récupère les en-têtes brutes de la réponse du serveur
    • SolrResponse::getRequestUrl - Récupère l'URL complète de la requête émise au serveur
    • SolrResponse::getResponse - Récupère l'objet SolrObject représentant la réponse XML du serveur
    • SolrResponse::setParseMode - Définit le mode d'analyse
    • SolrResponse::success - Vérifie si la requête au serveur a réussi
    • SolrServerException::getInternalInfo - Retourne des informations internes sur le lieu où l'exception a été émise
    • SolrUpdateResponse::__construct - Constructeur
    • SolrUpdateResponse::__destruct - Destructeur
    • SolrUtils::digestXmlResponse - Analyse une réponse XML dans un SolrObject
    • SolrUtils::escapeQueryChars - Protège une requête
    • SolrUtils::getSolrVersion - Récupère la version courant de l'extension Solr
    • SolrUtils::queryPhrase - Prépare une phrase depuis une chaîne non protégée par Lucene
    • solr_get_version - Retourne la version courante de l'extension Solr utilisée par Apache
    • sort - Trie un tableau
    • soundex - Calcule la clé soundex
    • SphinxClient::addQuery - Ajoute une requête à un batch multiple
    • SphinxClient::buildExcerpts - Construit les extraits de texte
    • SphinxClient::buildKeywords - Extrait les mots-clés d'une requête
    • SphinxClient::close - Ferme une connexion persistante ouverte
    • SphinxClient::escapeString - Protège les caractères spéciaux
    • SphinxClient::getLastError - Lit le dernier message d'erreur
    • SphinxClient::getLastWarning - Lit la dernière alerte
    • SphinxClient::open - Établit une connexion persistante avec le serveur
    • SphinxClient::query - Exécute une requête de recherche
    • SphinxClient::resetFilters - Supprime tous les filtres
    • SphinxClient::resetGroupBy - Supprime toutes les configurations de regroupement
    • SphinxClient::runQueries - Exécute une série de requêtes de recherche
    • SphinxClient::setArrayResult - Change le format du tableau de résultats
    • SphinxClient::setConnectTimeout - Configure le délai d'expiration de connexion
    • SphinxClient::setFieldWeights - Configure le poids des champs
    • SphinxClient::setFilter - Ajoute un nouveau filtre entier
    • SphinxClient::setFilterFloatRange - Ajoute un nouveau filtre décimal
    • SphinxClient::setFilterRange - Ajoute un nouveau filtre d'intervalle
    • SphinxClient::setGeoAnchor - Configure le point d'origine pour les calculs géographiques
    • SphinxClient::setGroupBy - Configure les attributs de regroupement
    • SphinxClient::setGroupDistinct - Configure les calculs au niveau des valeurs distinctes
    • SphinxClient::setIDRange - Configure l'intervalle de validité des identifiants de document
    • SphinxClient::setIndexWeights - Configure les poids de chaque index
    • SphinxClient::setLimits - Configure l'offset et la limite du résultat
    • SphinxClient::setMatchMode - Configure le mode de recherche en texte intégral
    • SphinxClient::setMaxQueryTime - Configure la durée maximale de recherche
    • SphinxClient::setOverride - Définit temporairement la valeur d'attribut pour un document
    • SphinxClient::setRankingMode - Configure le mode de classement
    • SphinxClient::setRetries - Configure le nombre de tentatives et le délai d'expiration
    • SphinxClient::setSelect - Définit une clause à la sélection
    • SphinxClient::setServer - Configure l'hôte et le port searchd
    • SphinxClient::setSortMode - Configure le mode de tri
    • SphinxClient::status - Récupère le statut de searchd
    • SphinxClient::updateAttributes - Modifie les attributs d'un document
    • SphinxClient::__construct - Crée un nouvel objet SphinxClient
    • SplDoublyLinkedList::add - Ajoute/insert une nouvelle valeur à l'index spécifié
    • SplDoublyLinkedList::bottom - Le noeud parent à partir duquel la liste découle
    • SplDoublyLinkedList::count - Compte le nombre d'éléments de la liste
    • SplDoublyLinkedList::current - Retourne l'entrée courante du tableau
    • SplDoublyLinkedList::getIteratorMode - Retourne le mode de l'itérateur
    • SplDoublyLinkedList::isEmpty - Vérifie si la liste est vide
    • SplDoublyLinkedList::key - Retourne l'index du noeud courant
    • SplDoublyLinkedList::next - Se déplace à l'entrée suivante
    • SplDoublyLinkedList::offsetExists - Vérifie si un index existe
    • SplDoublyLinkedList::offsetGet - Retourne la valeur d'un index
    • SplDoublyLinkedList::offsetSet - Spécifie la nouvelle valeur de l'index
    • SplDoublyLinkedList::offsetUnset - Efface la valeur d'un index
    • SplDoublyLinkedList::pop - Dépile et retourne le dernier élément de la liste
    • SplDoublyLinkedList::prev - Recule d'un élément
    • SplDoublyLinkedList::push - Ajoute un élément à la fin de la liste
    • SplDoublyLinkedList::rewind - Replace l'itérateur au début
    • SplDoublyLinkedList::serialize - Sérialise la liste
    • SplDoublyLinkedList::setIteratorMode - Définit le mode d'itération
    • SplDoublyLinkedList::shift - Déplace un noeud de la liste
    • SplDoublyLinkedList::top - Récupère le dernier noeud de la liste
    • SplDoublyLinkedList::unserialize - Désérialise la liste
    • SplDoublyLinkedList::unshift - Ajoute un élément à la liste
    • SplDoublyLinkedList::valid - Vérifie si la liste contient encore des noeuds
    • SplDoublyLinkedList::__construct - Construit une nouvelle liste
    • SplFileInfo::getATime - Lit la date de dernier accès au fichier
    • SplFileInfo::getBasename - Lit le nom de base du fichier
    • SplFileInfo::getCTime - Lit la date de modification du fichier
    • SplFileInfo::getExtension - Récupère l'extension d'un fichier
    • SplFileInfo::getFileInfo - Obtient un objet SplFileInfo pour un fichier
    • SplFileInfo::getFilename - Lit le nom du fichier
    • SplFileInfo::getGroup - Lit le groupe d'appartenance du fichier
    • SplFileInfo::getInode - Lit le inode du fichier
    • SplFileInfo::getLinkTarget - Lit la cible d'un lien symbolique
    • SplFileInfo::getMTime - Lit la date de dernière modification
    • SplFileInfo::getOwner - Lit le propriétaire du fichier
    • SplFileInfo::getPath - Le chemin sans le nom de fichier
    • SplFileInfo::getPathInfo - Crée un objet SplFileInfo pour un chemin
    • SplFileInfo::getPathname - Lit le chemin d'un fichier
    • SplFileInfo::getPerms - Lit les droits d'un fichier
    • SplFileInfo::getRealPath - Lit le chemin absolu d'un fichier
    • SplFileInfo::getSize - Lit la taille d'un fichier
    • SplFileInfo::getType - Lit le type de fichier
    • SplFileInfo::isDir - Indique si le fichier est un dossier
    • SplFileInfo::isExecutable - Indique si un fichier est exécutable
    • SplFileInfo::isFile - Indique si un fichier est un véritable fichier
    • SplFileInfo::isLink - Indique si un fichier est un lien
    • SplFileInfo::isReadable - Indique si le fichier est lisible
    • SplFileInfo::isWritable - Indique si on peut écrire dans un fichier
    • SplFileInfo::openFile - Crée un objet SplFileObject pour le fichier
    • SplFileInfo::setFileClass - Configure la classe utilisée avec SplFileInfo::openFile
    • SplFileInfo::setInfoClass - Configure la classe utilisée par SplFileInfo::getFileInfo et SplFileInfo::getPathInfo
    • SplFileInfo::__construct - Construit un nouvel objet SplFileInfo
    • SplFileInfo::__toString - Retourne le chemin d'un fichier sous forme de chaîne
    • SplFileObject::current - Récupère la ligne courante d'un fichier
    • SplFileObject::eof - Vérifie si la fin du fichier est atteinte
    • SplFileObject::fflush - Écrit l'affichage dans le fichier
    • SplFileObject::fgetc - Récupère un caractère depuis le fichier
    • SplFileObject::fgetcsv - Récupère une ligne depuis le fichier et l'analyse comme étant des données CSV
    • SplFileObject::fgets - Récupère une ligne d'un fichier
    • SplFileObject::fgetss - Récupère une ligne d'un fichier et supprime les balises HTML
    • SplFileObject::flock - Verrouille ou déverrouille un fichier
    • SplFileObject::fpassthru - Affiche toutes les données en attente sur un pointeur de fichier
    • SplFileObject::fputcsv - Écrit un tableau sous la forme d'une ligne CSV
    • SplFileObject::fread - Lit depuis un fichier
    • SplFileObject::fscanf - Analyse une entrée d'un fichier suivant un format donné
    • SplFileObject::fseek - Se déplace à une position donnée
    • SplFileObject::fstat - Récupère les informations d'un fichier
    • SplFileObject::ftell - Retourne la position courant dans le fichier
    • SplFileObject::ftruncate - Coupe le fichier à une longueur donnée
    • SplFileObject::fwrite - Écrit dans le fichier
    • SplFileObject::getChildren - Récupère le fils
    • SplFileObject::getCsvControl - Récupère les options pour CSV
    • SplFileObject::getCurrentLine - Alias de SplFileObject::fgets
    • SplFileObject::getFlags - Récupère les drapeaux pour l'objet SplFileObject
    • SplFileObject::getMaxLineLen - Récupère la longueur maximale d'une ligne
    • SplFileObject::hasChildren - Vérifie si SplFileObject a un fils
    • SplFileObject::key - Récupère le numéro de la ligne courant
    • SplFileObject::next - Se déplace sur la prochaine ligne
    • SplFileObject::rewind - Réinitialise le fichier à la première ligne
    • SplFileObject::seek - Se déplace sur une ligne spécifique
    • SplFileObject::setCsvControl - Définit les options CSV
    • SplFileObject::setFlags - Définit les drapeaux pour l'objet SplFileObject
    • SplFileObject::setMaxLineLen - Définit la longueur maximale d'une ligne
    • SplFileObject::valid - Vérifie si la fin du fichier a été atteinte
    • SplFileObject::__construct - Construit un nouvel objet fichier
    • SplFileObject::__toString - Alias de SplFileObject::fgets
    • SplFixedArray::count - Retourne la taille du tableau à taille fixe
    • SplFixedArray::current - Lit l'élément courant du tableau à taille fixe
    • SplFixedArray::fromArray - Importe un tableau PHP dans un tableau à taille fixe
    • SplFixedArray::getSize - Lit la taille du tableau à taille fixe
    • SplFixedArray::key - Retourne l'index de la position courante
    • SplFixedArray::next - Déplace l'itérateur à l'élément suivant
    • SplFixedArray::offsetExists - Vérifie si l'index demandé existe
    • SplFixedArray::offsetGet - Retourne la valeur à l'index donné
    • SplFixedArray::offsetSet - Affecte une valeur à un index donné
    • SplFixedArray::offsetUnset - Détruit l'élément à un index donné
    • SplFixedArray::rewind - Remet l'itérateur au début du tableau à taille fixe
    • SplFixedArray::setSize - Change la taille d'un tableau à taille fixe
    • SplFixedArray::toArray - Retourne un tableau PHP à partir d'un tableau à taille fixe
    • SplFixedArray::valid - Vérifie si le tableau contient encore un élément
    • SplFixedArray::__construct - Construit un nouveau SplFixedArray
    • SplFixedArray::__wakeup - Ré-initialise le tableau après sa dé-linéarisation
    • SplHeap::compare - Compare deux éléments
    • SplHeap::count - Compte le nombre d'éléments dans le tas
    • SplHeap::current - Retourne le noeud courant, pointé par l'itérateur
    • SplHeap::extract - Extrait un noeud du haut du tas
    • SplHeap::insert - Insère un élément dans le tas
    • SplHeap::isCorrupted - Informe si le tas est dans un état corrompu
    • SplHeap::isEmpty - Vérifie si le tas est vide
    • SplHeap::key - Retourne l'index du noeud courant
    • SplHeap::next - Se déplace au noeud suivant
    • SplHeap::recoverFromCorruption - Répare un tas
    • SplHeap::rewind - Revient au début de l'itérateur
    • SplHeap::top - Récupère le premier noeud du tas
    • SplHeap::valid - Vérifie si le tas contient des noeuds
    • SplHeap::__construct - Construit un nouveau tas vide
    • split - Scinde une chaîne en un tableau, grâce à une expression rationnelle
    • spliti - Scinde une chaîne en un tableau, grâce à une expression rationnelle
    • SplMaxHeap::compare - Compare deux éléments
    • SplMinHeap::compare - Compare deux éléments
    • SplObjectStorage::addAll - Ajoute tous les objets d'un autre stockage
    • SplObjectStorage::attach - Ajoute un objet dans le stockage
    • SplObjectStorage::contains - Vérifie si un stockage contient un objet
    • SplObjectStorage::count - Retourne le nombre d'objets dans le stockage
    • SplObjectStorage::current - Retourne l'objet courant
    • SplObjectStorage::detach - Retire un objet du stockage
    • SplObjectStorage::getHash - Calcule un identifiant unique pour les objets contenus
    • SplObjectStorage::getInfo - Retourne les données associés à l'élément en cours
    • SplObjectStorage::key - Retourne l'index de l'objet courant
    • SplObjectStorage::next - Passe au prochain élément
    • SplObjectStorage::offsetExists - Vérifie si un objet existe dans le stockage
    • SplObjectStorage::offsetGet - Retourne les données associées à un objet
    • SplObjectStorage::offsetSet - Associe des données à un stockage
    • SplObjectStorage::offsetUnset - Retire un objet du stockage
    • SplObjectStorage::removeAll - Retire les objets d'un stockage qui appartienne à un autre stockage
    • SplObjectStorage::removeAllExcept - Supprime tous les objets du stockage courant sauf ceux contenus dans d'autres stockages
    • SplObjectStorage::rewind - Remet l'itérateur au début
    • SplObjectStorage::serialize - Linéarise un stockage
    • SplObjectStorage::setInfo - Modifie les données associée à l'élément courant
    • SplObjectStorage::unserialize - Délinéarise un stockage à partir de sa forme en chaîne
    • SplObjectStorage::valid - Vérifie si l'élément courant est valide
    • SplObserver::update - Réception d'une mise à jour depuis un sujet
    • SplPriorityQueue::compare - Compare deux priorités
    • SplPriorityQueue::count - Compte le nombre d'éléments dans la file d'attente
    • SplPriorityQueue::current - Retourne le noeud courant, pointé par l'itérateur
    • SplPriorityQueue::extract - Extrait un noeud depuis le haut du tas
    • SplPriorityQueue::getExtractFlags - Récupère les drapeaux d'extraction
    • SplPriorityQueue::insert - Insère un élément dans la file d'attente
    • SplPriorityQueue::isCorrupted - Informe si la file prioritaire est dans un état corrompue
    • SplPriorityQueue::isEmpty - Vérifie si la file est vide
    • SplPriorityQueue::key - Retourne l'index du noeud courant
    • SplPriorityQueue::next - Se déplace sur le prochain noeud
    • SplPriorityQueue::recoverFromCorruption - Répare une file d'attente
    • SplPriorityQueue::rewind - Revient au début de l'itérateur
    • SplPriorityQueue::setExtractFlags - Définit le mode d'extraction
    • SplPriorityQueue::top - Récupère le noeud du haut de la file d'attente
    • SplPriorityQueue::valid - Vérifie si la file d'attente contient encore des noeuds
    • SplPriorityQueue::__construct - Construit une nouvelle file d'attente vide
    • SplQueue::dequeue - Supprime un nœud de la file d'attente
    • SplQueue::enqueue - Ajoute un élément à la file d'attente
    • SplQueue::setIteratorMode - Définit le mode de l'itérateur
    • SplQueue::__construct - Construit une nouvelle file d'attente, en utilisant une liste
    • SplStack::setIteratorMode - Définit le mode de l'itérateur
    • SplStack::__construct - Construit une nouvelle pile, en utilisant une liste
    • SplSubject::attach - Attache un SplObserver
    • SplSubject::detach - Détache un observateur
    • SplSubject::notify - Notifie un observateur
    • SplTempFileObject::__construct - Construit un nouvel objet représentant un fichier temporaire
    • spl_autoload - Implémentation par défaut d'__autoload()
    • spl_autoload_call - Essai toutes les fonctions __autoload() enregistrées pour charger la classe demandée
    • spl_autoload_extensions - Enregistre et retourne l'extension du fichier par défaut pour spl_autoload
    • spl_autoload_functions - Retourne toutes les fonctions __autoload() enregistrées
    • spl_autoload_register - Enregistre une fonction en tant qu'implémentation de __autoload()
    • spl_autoload_unregister - Efface une fonction donnée de l'implémentation __autoload()
    • spl_classes - Retourne les classes SPL disponibles
    • spl_object_hash - Retourne l'identifiant de hachage pour un objet donné
    • spl_object_id - Retourne le gestionnaire d'objet entier pour un objet donné
    • Spoofchecker::areConfusable - Vérifie si les chaînes données peuvent être confondues
    • Spoofchecker::isSuspicious - Vérifie si un texte contient des caractères suspects
    • Spoofchecker::setAllowedLocales - Locales à utiliser lors de la vérification
    • Spoofchecker::setChecks - Spécifie les vérifications à effectuer
    • Spoofchecker::__construct - Constructeur
    • sprintf - Retourne une chaîne formatée
    • SQLite3::backup - Backup one database to another database
    • SQLite3::busyTimeout - Définit le gestionnaire d'attente de la connexion
    • SQLite3::changes - Retourne le nombre de lignes modifiées (ou insérées, effacées) par la dernière requête SQL
    • SQLite3::close - Ferme la connexion avec la base de données
    • SQLite3::createAggregate - Enregistre une fonction PHP à utiliser comme fonction d'aggrégation SQLite
    • SQLite3::createCollation - Enregistre une fonction PHP pour l'utiliser comme fonction de classement SQL
    • SQLite3::createFunction - Enregistre une fonction PHP à utiliser comme fonction scalaire SQL
    • SQLite3::enableExceptions - Active le lancement d'exceptions
    • SQLite3::escapeString - Retourne une chaîne nettoyée
    • SQLite3::exec - Exécute une requête sur une base de données
    • SQLite3::lastErrorCode - Retourne le code erreur de la dernière requête SQL ayant échouée
    • SQLite3::lastErrorMsg - Retourne le message d'erreur, en anglais, de la dernière requête ayant échouée
    • SQLite3::lastInsertRowID - Retourne l'identifiant de la ligne corrspondant à la dernière requête de type INSERT
    • SQLite3::loadExtension - Tente de charger une extension de la bibliothèque SQLite
    • SQLite3::open - Ouvre une base de données SQLite
    • SQLite3::openBlob - Ouvre un flux de ressource pour lire un BLOB
    • SQLite3::prepare - Prépare une requête SQL pour exécution
    • SQLite3::query - Exécute une requête SQL
    • SQLite3::querySingle - Exécute une requête et retourne un seul résultat
    • SQLite3::setAuthorizer - Configures a callback to be used as an authorizer to limit what a statement can do
    • SQLite3::version - Retourne la version de la bibliothèque SQLite3
    • SQLite3::__construct - Instantie un objet SQLite3 et ouvre la base de données SQLite 3
    • SQLite3Result::columnName - Retourne le nom d'une colonne
    • SQLite3Result::columnType - Retourne le type d'une colonne
    • SQLite3Result::fetchArray - Récupère un jeu de résultats sous la forme d'un tableau associatif
    • SQLite3Result::finalize - Ferme un jeu de résultats
    • SQLite3Result::numColumns - Retourne le nombre de colonnes du jeu de résultats
    • SQLite3Result::reset - Repositionne le pointeur sur la première ligne du jeu de résultats
    • SQLite3Stmt::bindParam - Lie un paramètre à une variable de déclaration
    • SQLite3Stmt::bindValue - Lie la valeur d'un paramètre à une variable de déclaration
    • SQLite3Stmt::clear - Supprime tous les paramètres actuellement liés
    • SQLite3Stmt::close - Ferme une requête préparée
    • SQLite3Stmt::execute - Exécute une requête préparée
    • SQLite3Stmt::getSQL - Récupère le SQL d'une déclaration
    • SQLite3Stmt::paramCount - Retourne le nombre de paramètres d'une requête préparée
    • SQLite3Stmt::readOnly - Détermine si une déclaration est uniquement en lecture seule
    • SQLite3Stmt::reset - Réinitialise une requête préparée
    • sqlsrv_begin_transaction - Commence une transaction
    • sqlsrv_cancel - Annule une requête
    • sqlsrv_client_info - Retourne les informations sur le client ainsi que sur la connexion spécifiée
    • sqlsrv_close - Clôture une connexion établie et libère les ressources associées
    • sqlsrv_commit - Valide une transaction commencée avec la fonction sqlsrv_begin_transaction
    • sqlsrv_configure - Modifie la configuration du gestionnaire d'erreurs et d'historisations du driver
    • sqlsrv_connect - Ouvre une connexion sur une base de données Microsoft SQL Server
    • sqlsrv_errors - Retourne une erreur ainsi que certaines informations sur la dernière opération SQLSRV effectuée
    • sqlsrv_execute - Exécute une requête préparée avec la fonction sqlsrv_prepare
    • sqlsrv_fetch - Rend la prochaine ligne d'un jeu de résultats disponible pour lecture
    • sqlsrv_fetch_array - Retourne une ligne sous la forme d'un tableau
    • sqlsrv_fetch_object - Récupère la prochaine ligne de données du jeu de résultats sous la forme d'un objet
    • sqlsrv_field_metadata - Récupère les données méta pour les champs d'une requête préparée par la fonction sqlsrv_prepare ou la fonction sqlsrv_query
    • sqlsrv_free_stmt - Libère toutes les ressources de la requête spécifiée
    • sqlsrv_get_config - Retourne la valeur de la configuration spécifiée
    • sqlsrv_get_field - Récupère les données du champ depuis la ligne actuellement sélectionnée
    • sqlsrv_has_rows - Indique si la requête spécifiée contient des lignes
    • sqlsrv_next_result - Rend actif le prochain résultat de la requête spécifiée
    • sqlsrv_num_fields - Récupère le nombre de champs (colonnes) dans une requête
    • sqlsrv_num_rows - Récupère le nombre de lignes d'un jeu de résultats
    • sqlsrv_prepare - Prépare une requête pour exécution
    • sqlsrv_query - Prépare et exécute une requête
    • sqlsrv_rollback - Annule une transaction qui a été commencée grâce à la fonction sqlsrv_begin_transaction
    • sqlsrv_rows_affected - Retourne le nombre de lignes modifiées par la dernière requête de type INSERT, UPDATE, ou DELETE
    • sqlsrv_send_stream_data - Envoie des données depuis le flux vers le serveur
    • sqlsrv_server_info - Retourne des informations sur le serveur
    • SqlStatement::bind - Bind statement parameters
    • SqlStatement::execute - Execute the operation
    • SqlStatement::getNextResult - Get next result
    • SqlStatement::getResult - Get result
    • SqlStatement::hasMoreResults - Check for more results
    • SqlStatement::__construct - Description constructor
    • SqlStatementResult::fetchAll - Get all rows from result
    • SqlStatementResult::fetchOne - Get single row
    • SqlStatementResult::getAffectedItemsCount - Get affected row count
    • SqlStatementResult::getColumnNames - Get column names
    • SqlStatementResult::getColumns - Get columns
    • SqlStatementResult::getColumnsCount - Get column count
    • SqlStatementResult::getGeneratedIds - Get generated ids
    • SqlStatementResult::getLastInsertId - Get last insert id
    • SqlStatementResult::getWarnings - Get warnings from last operation
    • SqlStatementResult::getWarningsCount - Get warning count from last operation
    • SqlStatementResult::hasData - Check if result has data
    • SqlStatementResult::nextResult - Get next result
    • SqlStatementResult::__construct - Description constructor
    • sql_regcase - Prépare une expression rationnelle pour effectuer une recherche insensible à la casse
    • sqrt - Racine carrée
    • srand - Initialise le générateur de nombres aléatoires
    • sscanf - Analyse une chaîne à l'aide d'un format
    • ssdeep_fuzzy_compare - Calcule le score de correspondance entre 2 signatures de hachages flous
    • ssdeep_fuzzy_hash - Crée un hachage flou depuis une chaîne de caractères
    • ssdeep_fuzzy_hash_filename - Crée un hachage flou d'un fichier
    • ssh2:// - Shell sécurisé 2
    • ssh2_auth_agent - Authentification SSH en utilisant l'agent ssh
    • ssh2_auth_hostbased_file - Identification en utilisant une clé d'hôte publique
    • ssh2_auth_none - Identification en tant que "none"
    • ssh2_auth_password - Identification via SSH en utilisant un mot de passe en clair
    • ssh2_auth_pubkey_file - Identification en utilisant une clé publique
    • ssh2_connect - Connexion à un serveur SSH
    • ssh2_disconnect - Ferme une connexion à un serveur SSH distant
    • ssh2_exec - Exécute une commande sur un serveur distant
    • ssh2_fetch_stream - Parcours un flux étendu de données
    • ssh2_fingerprint - Récupère l'empreinte d'un serveur distant
    • ssh2_forward_accept - Accept a connection created by a listener
    • ssh2_forward_listen - Bind a port on the remote server and listen for connections
    • ssh2_methods_negotiated - Retourne une liste de méthodes négociées
    • ssh2_poll - Poll the channels/listeners/streams for events
    • ssh2_publickey_add - Ajoute une clé publique autorisée
    • ssh2_publickey_init - Initialise un Publickey Subsystem (sous-système de clé publique)
    • ssh2_publickey_list - Liste les clés publiques actuellement autorisées
    • ssh2_publickey_remove - Supprime un clé publique autorisée
    • ssh2_scp_recv - Demande un fichier via SCP
    • ssh2_scp_send - Envoie un fichier via SCP
    • ssh2_sftp - Initialise un sous-système SFTP
    • ssh2_sftp_chmod - Modifie le mode d'un fichier
    • ssh2_sftp_lstat - Statue un lien symbolique
    • ssh2_sftp_mkdir - Crée un dossier
    • ssh2_sftp_readlink - Retourne la cible d'un lien symbolique
    • ssh2_sftp_realpath - Résout le chemin réel d'un chemin fourni
    • ssh2_sftp_rename - Renomme un fichier distant
    • ssh2_sftp_rmdir - Efface un dossier
    • ssh2_sftp_stat - Statue un fichier sur un système de fichiers distant
    • ssh2_sftp_symlink - Crée un lien symbolique
    • ssh2_sftp_unlink - Efface un fichier
    • ssh2_shell - Demande un shell interactif
    • ssh2_tunnel - Ouvre un tunnel à travers un serveur distant
    • stat - Renvoie les informations à propos d'un fichier
    • Statement::getNextResult - Get next result
    • Statement::getResult - Get result
    • Statement::hasMoreResults - Check if more results
    • Statement::__construct - Description constructor
    • stats_absolute_deviation - Returns the absolute deviation of an array of values
    • stats_cdf_beta - Calculates any one parameter of the beta distribution given values for the others
    • stats_cdf_binomial - Calculates any one parameter of the binomial distribution given values for the others
    • stats_cdf_cauchy - Calculates any one parameter of the Cauchy distribution given values for the others
    • stats_cdf_chisquare - Calculates any one parameter of the chi-square distribution given values for the others
    • stats_cdf_exponential - Calculates any one parameter of the exponential distribution given values for the others
    • stats_cdf_f - Calculates any one parameter of the F distribution given values for the others
    • stats_cdf_gamma - Calculates any one parameter of the gamma distribution given values for the others
    • stats_cdf_laplace - Calculates any one parameter of the Laplace distribution given values for the others
    • stats_cdf_logistic - Calculates any one parameter of the logistic distribution given values for the others
    • stats_cdf_negative_binomial - Calculates any one parameter of the negative binomial distribution given values for the others
    • stats_cdf_noncentral_chisquare - Calculates any one parameter of the non-central chi-square distribution given values for the others
    • stats_cdf_noncentral_f - Calculates any one parameter of the non-central F distribution given values for the others
    • stats_cdf_noncentral_t - Calculates any one parameter of the non-central t-distribution give values for the others
    • stats_cdf_normal - Calculates any one parameter of the normal distribution given values for the others
    • stats_cdf_poisson - Calculates any one parameter of the Poisson distribution given values for the others
    • stats_cdf_t - Calculates any one parameter of the t-distribution given values for the others
    • stats_cdf_uniform - Calculates any one parameter of the uniform distribution given values for the others
    • stats_cdf_weibull - Calculates any one parameter of the Weibull distribution given values for the others
    • stats_covariance - Computes the covariance of two data sets
    • stats_dens_beta - Probability density function of the beta distribution
    • stats_dens_cauchy - Probability density function of the Cauchy distribution
    • stats_dens_chisquare - Probability density function of the chi-square distribution
    • stats_dens_exponential - Probability density function of the exponential distribution
    • stats_dens_f - Probability density function of the F distribution
    • stats_dens_gamma - Probability density function of the gamma distribution
    • stats_dens_laplace - Probability density function of the Laplace distribution
    • stats_dens_logistic - Probability density function of the logistic distribution
    • stats_dens_normal - Probability density function of the normal distribution
    • stats_dens_pmf_binomial - Probability mass function of the binomial distribution
    • stats_dens_pmf_hypergeometric - Probability mass function of the hypergeometric distribution
    • stats_dens_pmf_negative_binomial - Probability mass function of the negative binomial distribution
    • stats_dens_pmf_poisson - Probability mass function of the Poisson distribution
    • stats_dens_t - Probability density function of the t-distribution
    • stats_dens_uniform - Probability density function of the uniform distribution
    • stats_dens_weibull - Probability density function of the Weibull distribution
    • stats_harmonic_mean - Returns the harmonic mean of an array of values
    • stats_kurtosis - Computes the kurtosis of the data in the array
    • stats_rand_gen_beta - Generates a random deviate from the beta distribution
    • stats_rand_gen_chisquare - Generates a random deviate from the chi-square distribution
    • stats_rand_gen_exponential - Generates a random deviate from the exponential distribution
    • stats_rand_gen_f - Generates a random deviate from the F distribution
    • stats_rand_gen_funiform - Generates uniform float between low (exclusive) and high (exclusive)
    • stats_rand_gen_gamma - Generates a random deviate from the gamma distribution
    • stats_rand_gen_ibinomial - Generates a random deviate from the binomial distribution
    • stats_rand_gen_ibinomial_negative - Generates a random deviate from the negative binomial distribution
    • stats_rand_gen_int - Generates random integer between 1 and 2147483562
    • stats_rand_gen_ipoisson - Generates a single random deviate from a Poisson distribution
    • stats_rand_gen_iuniform - Generates integer uniformly distributed between LOW (inclusive) and HIGH (inclusive)
    • stats_rand_gen_noncentral_chisquare - Generates a random deviate from the non-central chi-square distribution
    • stats_rand_gen_noncentral_f - Generates a random deviate from the noncentral F distribution
    • stats_rand_gen_noncentral_t - Generates a single random deviate from a non-central t-distribution
    • stats_rand_gen_normal - Generates a single random deviate from a normal distribution
    • stats_rand_gen_t - Generates a single random deviate from a t-distribution
    • stats_rand_get_seeds - Get the seed values of the random number generator
    • stats_rand_phrase_to_seeds - Generate two seeds for the RGN random number generator
    • stats_rand_ranf - Generates a random floating point number between 0 and 1
    • stats_rand_setall - Set seed values to the random generator
    • stats_skew - Computes the skewness of the data in the array
    • stats_standard_deviation - Returns the standard deviation
    • stats_stat_binomial_coef - Returns a binomial coefficient
    • stats_stat_correlation - Returns the Pearson correlation coefficient of two data sets
    • stats_stat_factorial - Returns the factorial of an integer
    • stats_stat_independent_t - Returns the t-value from the independent two-sample t-test
    • stats_stat_innerproduct - Returns the inner product of two vectors
    • stats_stat_paired_t - Returns the t-value of the dependent t-test for paired samples
    • stats_stat_percentile - Returns the percentile value
    • stats_stat_powersum - Returns the power sum of a vector
    • stats_variance - Returns the variance
    • Stomp::abort - Annule une transaction en cours
    • Stomp::ack - Valide la réception d'un message
    • Stomp::begin - Débute une transaction
    • Stomp::commit - Valide une transaction en cours
    • Stomp::error - Récupère la dernière erreur stomp
    • Stomp::getReadTimeout - Récupère le délai d'expiration de lecture
    • Stomp::getSessionId - Retourne l'identifiant de la session courante
    • Stomp::hasFrame - Indique si un message est en attente de lecture ou non
    • Stomp::readFrame - Lit le prochain message
    • Stomp::send - Envoi un message
    • Stomp::setReadTimeout - Définit le délai d'expiration de lecture
    • Stomp::subscribe - Souscrit à l'écoute d'une destination donnée
    • Stomp::unsubscribe - Supprime une souscription existante
    • Stomp::__construct - Ouvre une connexion
    • Stomp::__destruct - Ferme une connexion
    • StompException::getDetails - Récupère les détails de l'exception
    • StompFrame::__construct - Constructeur
    • stomp_connect_error - Retourne une chaîne décrivant la dernière erreur de connexion
    • stomp_version - Récupère la version de l'extension Stomp
    • strcasecmp - Comparaison insensible à la casse de chaînes binaires
    • strchr - Alias de strstr
    • strcmp - Comparaison binaire de chaînes
    • strcoll - Comparaison de chaînes localisées
    • strcspn - Trouve un segment de chaîne ne contenant pas certains caractères
    • streamWrapper::dir_closedir - Ferme une ressource de dossier
    • streamWrapper::dir_opendir - Ouvre un dossier en lecture
    • streamWrapper::dir_readdir - Lit un fichier dans un dossier
    • streamWrapper::dir_rewinddir - Remet au début une ressource de dossier
    • streamWrapper::mkdir - Crée un dossier
    • streamWrapper::rename - Renomme un fichier ou un dossier
    • streamWrapper::rmdir - Supprime un dossier
    • streamWrapper::stream_cast - Lit la ressource sous-jacente de flux
    • streamWrapper::stream_close - Ferme une ressource de flux
    • streamWrapper::stream_eof - Tests for end-of-file on a file pointer
    • streamWrapper::stream_flush - Expédie le contenu
    • streamWrapper::stream_lock - Verrouillage logique de fichiers
    • streamWrapper::stream_metadata - Change les metadata du flux
    • streamWrapper::stream_open - Opens file or URL
    • streamWrapper::stream_read - Lit dans le flux
    • streamWrapper::stream_seek - Place le pointeur de flux à une position
    • streamWrapper::stream_set_option - Change les options du flux
    • streamWrapper::stream_stat - Lit les informations sur une ressource de fichier
    • streamWrapper::stream_tell - Lit la position courante dans un flux
    • streamWrapper::stream_truncate - Tronque un flux
    • streamWrapper::stream_write - Écrit dans un flux
    • streamWrapper::unlink - Efface un fichier
    • streamWrapper::url_stat - Lit les informations sur un fichier
    • streamWrapper::__construct - Construit un nouveau gestionnaire de flux
    • streamWrapper::__destruct - Détruit un gestionnaire de flux existant
    • stream_bucket_append - Ajoute un compartiment au corps
    • stream_bucket_make_writeable - Retourne un objet de compartiment depuis le corps pour des opérations sur celui-ci
    • stream_bucket_new - Crée un nouveau compartiment pour l'utiliser sur le flux courant
    • stream_bucket_prepend - Ajout initial d'un bucket dans une brigade
    • stream_context_create - Crée un contexte de flux
    • stream_context_get_default - Lit le contexte par défaut des flux
    • stream_context_get_options - Lit la valeur des options pour un flux/gestionnaire/contexte
    • stream_context_get_params - Lit les paramètres d'un contexte
    • stream_context_set_default - Configure le contexte par défaut des flux
    • stream_context_set_option - Configure une option pour un flux/gestionnaire/contexte
    • stream_context_set_params - Configure les paramètres pour un flux/gestionnaire/contexte
    • stream_copy_to_stream - Copie des données depuis un flux vers un autre
    • stream_filter_append - Attache un filtre à un flux en fin de liste
    • stream_filter_prepend - Attache un filtre à un flux en début de liste
    • stream_filter_register - Enregistre un filtre de flux
    • stream_filter_remove - Retire un filtre d'un flux
    • stream_get_contents - Lit tout un flux dans une chaîne
    • stream_get_filters - Liste les filtres enregistrés
    • stream_get_line - Lit une ligne dans un flux
    • stream_get_meta_data - Lit les en-têtes et données méta des flux
    • stream_get_transports - Liste les gestionnaires de transports de sockets disponibles
    • stream_get_wrappers - Liste les gestionnaires de flux
    • stream_isatty - Vérifie si un flux est un TTY
    • stream_is_local - Vérifie si un flux est local
    • stream_notification_callback - Une fonction de rappel pour le paramètre de contexte notification
    • stream_register_wrapper - Alias de stream_wrapper_register
    • stream_resolve_include_path - Résout un nom de fichier suivant les règles du chemin d'inclusion
    • stream_select - Surveille la modification d'un ou plusieurs flux
    • stream_set_blocking - Configure le mode bloquant d'un flux
    • stream_set_read_buffer - Configure le buffer de lecture d'un flux
    • stream_set_size - Change la taille du segment du flux
    • stream_set_timeout - Configure la durée d'expiration d'un flux
    • stream_set_write_buffer - Configure le buffer d'écriture d'un flux
    • stream_socket_accept - Accepte une connexion sur un socket créé par stream_socket_server
    • stream_socket_client - Ouvre une connexion socket Internet ou Unix
    • stream_socket_enable_crypto - Active ou non le chiffrement, pour un socket déjà connecté
    • stream_socket_get_name - Lit le nom de la socket locale ou distante
    • stream_socket_pair - Crée une paire de sockets connectées et indissociables
    • stream_socket_recvfrom - Lit des données depuis un socket, connecté ou pas
    • stream_socket_sendto - Envoie un message au socket, connecté ou pas
    • stream_socket_server - Crée un socket serveur Unix ou Internet
    • stream_socket_shutdown - Arrête une connexion full-duplex
    • stream_supports_lock - Indique si le flux supporte les verrous
    • stream_wrapper_register - Enregistre un gestionnaire d'URL
    • stream_wrapper_restore - Restaure un gestionnaire d'URL supprimé
    • stream_wrapper_unregister - Supprime un gestionnaire d'URL
    • strftime - Formate une date/heure locale avec la configuration locale
    • stripcslashes - Décode une chaîne encodée avec addcslashes
    • stripos - Recherche la position de la première occurrence dans une chaîne, sans tenir compte de la casse
    • stripslashes - Supprime les antislashs d'une chaîne
    • strip_tags - Supprime les balises HTML et PHP d'une chaîne
    • stristr - Version insensible à la casse de strstr
    • strlen - Calcule la taille d'une chaîne
    • strnatcasecmp - Comparaison de chaînes avec l'algorithme d'"ordre naturel" (insensible à la casse)
    • strnatcmp - Comparaison de chaînes avec l'algorithme d'"ordre naturel"
    • strncasecmp - Compare en binaire des chaînes de caractères
    • strncmp - Comparaison binaire des n premiers caractères
    • strpbrk - Recherche un ensemble de caractères dans une chaîne de caractères
    • strpos - Cherche la position de la première occurrence dans une chaîne
    • strptime - Analyse une date générée par strftime
    • strrchr - Trouve la dernière occurrence d'un caractère dans une chaîne
    • strrev - Inverse une chaîne
    • strripos - Cherche la position de la dernière occurrence d'une chaîne contenue dans une autre, de façon insensible à la casse
    • strrpos - Cherche la position de la dernière occurrence d'une sous-chaîne dans une chaîne
    • strspn - Trouve la longueur du segment initial d'une chaîne contenant tous les caractères d'un masque donné
    • strstr - Trouve la première occurrence dans une chaîne
    • strtok - Coupe une chaîne en segments
    • strtolower - Renvoie une chaîne en minuscules
    • strtotime - Transforme un texte anglais en timestamp
    • strtoupper - Renvoie une chaîne en majuscules
    • strtr - Remplace des caractères dans une chaîne
    • strval - Récupère la valeur d'une variable, au format chaîne
    • str_contains - Determine if a string contains a given substring
    • str_ends_with - Checks if a string ends with a given substring
    • str_getcsv - Analyse une chaîne de caractères CSV dans un tableau
    • str_ireplace - Version insensible à la casse de str_replace
    • str_pad - Complète une chaîne jusqu'à une taille donnée
    • str_repeat - Répète une chaîne
    • str_replace - Remplace toutes les occurrences dans une chaîne
    • str_rot13 - Effectue une transformation ROT13
    • str_shuffle - Mélange les caractères d'une chaîne de caractères
    • str_split - Convertit une chaîne de caractères en tableau
    • str_starts_with - Checks if a string starts with a given substring
    • str_word_count - Compte le nombre de mots utilisés dans une chaîne
    • substr - Retourne un segment de chaîne
    • substr_compare - Compare deux chaînes depuis un offset jusqu'à une longueur en caractères
    • substr_count - Compte le nombre d'occurrences de segments dans une chaîne
    • substr_replace - Remplace un segment dans une chaîne
    • SVM::crossvalidate - Test les paramètres d'entraînement sur les sous-jeux de données d’entraînement
    • SVM::getOptions - Retourne les paramètres courants d’entraînement
    • SVM::setOptions - Définit des paramètres d'entraînement
    • SVM::train - Crée un modèle SVMModel suivant les données d'entraînement
    • SVM::__construct - Construit un nouvel objet SVM
    • SVMModel::checkProbabilityModel - Retourne true si le modèle a des informations probablistes
    • SVMModel::getLabels - Récupère les labels utilisés pour entraîner le modèle
    • SVMModel::getNrClass - Retourne le nombre de classes utilisées pour entraîner le modèle
    • SVMModel::getSvmType - Récupère le type SVM utilisé pour entraîner le modèle
    • SVMModel::getSvrProbability - Récupère la valeur sigma pour les types de régression
    • SVMModel::load - Charge un modèle SVM sauvegardé
    • SVMModel::predict - Prédit une valeur pour des précédentes données non vues
    • SVMModel::predict_probability - Retourne les probabilités pour les données précédentes non présentées
    • SVMModel::save - Sauvegarde un modèle dans un fichier
    • SVMModel::__construct - Construit un nouvel objet SVMModel
    • svn_add - Prévoit l'ajout d'un élément dans le dossier de travail
    • svn_auth_get_parameter - Récupère un paramètre d'identification
    • svn_auth_set_parameter - Spécifie un paramètre d'identification
    • svn_blame - Récupère les condamnations SVN pour un fichier
    • svn_cat - Récupère le contenu d'un fichier du référentiel
    • svn_checkout - Extrait une copie de travail depuis un référentiel
    • svn_cleanup - Nettoie, récursivement, un dossier de travail, en finissant les opérations incomplètes et en supprimant les verrous
    • svn_client_version - Récupère la version des bibliothèques clientes SVN
    • svn_commit - Envoie les modifications depuis la copie locale vers le référentiel
    • svn_delete - Efface un élément d'un dossier de travail ou d'un dépôt
    • svn_diff - Compare deux chemins, récursivement
    • svn_export - Exporte le contenu d'un dossier SVN
    • svn_fs_abort_txn - Stoppe une transaction
    • svn_fs_apply_text - Crée et retourne un flux à utiliser pour modifier un fichier
    • svn_fs_begin_txn2 - Crée une nouvelle transaction
    • svn_fs_change_node_prop - Retourne true si tout est Ok, false sinon
    • svn_fs_check_path - Détermine quel type d'élément est pointé par un chemin donné
    • svn_fs_contents_changed - Retourne true si le contenu est différent, false sinon
    • svn_fs_copy - Copie un fichier ou un dossier
    • svn_fs_delete - Supprime un fichier ou un dossier
    • svn_fs_dir_entries - Énumère les éléments d'un dossier
    • svn_fs_file_contents - Retourne un flux afin d'accéder au contenu d'un fichier pour une révision donnée
    • svn_fs_file_length - Retourne la taille d'un fichier pour une révision donnée
    • svn_fs_is_dir - Retourne true si le chemin pointe vers un dossier, false sinon
    • svn_fs_is_file - Retourne true si le chemin pointe vers un fichier, false sinon
    • svn_fs_make_dir - Crée un nouveau dossier
    • svn_fs_make_file - Crée un fichier vide
    • svn_fs_node_created_rev - Retourne la révision dans laquelle le chemin, sous fsroot, a été créé
    • svn_fs_node_prop - Retourne la valeur d'une propriété d'un noeud
    • svn_fs_props_changed - Retourne true si les propriétés sont différentes, false sinon
    • svn_fs_revision_prop - Récupère la valeur d'une propriété nommée
    • svn_fs_revision_root - Récupère un gestionnaire sur une révision spécifique sur la racine du référentiel
    • svn_fs_txn_root - Crée et retourne une transaction
    • svn_fs_youngest_rev - Retourne le numéro de la révision la plus récente du système de fichiers
    • svn_import - Importe un chemin non-versionné dans un référentiel
    • svn_log - Récupère le message d'historisation d'une URL du référentiel
    • svn_ls - Retourne la liste du contenu d'un dossier d'un référentiel, optionnellement à la révision fournie
    • svn_mkdir - Crée un dossier dans la copie de travail ou dans le référentiel
    • svn_repos_create - Crée un nouveau référentiel Subversion
    • svn_repos_fs - Récupère un gestionnaire du système de fichiers
    • svn_repos_fs_begin_txn_for_commit - Crée une nouvelle transaction
    • svn_repos_fs_commit_txn - Livre une transaction et retourne la nouvelle révision
    • svn_repos_hotcopy - Effectue une copie à chaud du référentiel
    • svn_repos_open - Ouvre un verrou partagé sur un référentiel
    • svn_repos_recover - Exécute les procédures de récupération du référentiel
    • svn_revert - Revenir en arrière sur les changements de la copie de travail
    • svn_status - Récupère le statut des fichiers et des dossiers de la copie de travail
    • svn_update - Met à jour la copie de travail
    • Swoole\Async::dnsLookup - Async and non-blocking hostname to IP lookup.
    • Swoole\Async::read - Read file stream asynchronously.
    • Swoole\Async::readFile - Read a file asynchronously.
    • Swoole\Async::set - Update the async I/O options.
    • Swoole\Async::write - Write data to a file stream asynchronously.
    • Swoole\Async::writeFile - Description
    • Swoole\Atomic::add - Add a number to the value to the atomic object.
    • Swoole\Atomic::cmpset - Compare and set the value of the atomic object.
    • Swoole\Atomic::get - Get the current value of the atomic object.
    • Swoole\Atomic::set - Set a new value to the atomic object.
    • Swoole\Atomic::sub - Subtract a number to the value of the atomic object.
    • Swoole\Atomic::__construct - Construct a swoole atomic object.
    • Swoole\Buffer::append - Append the string or binary data at the end of the memory buffer and return the new size of memory allocated.
    • Swoole\Buffer::clear - Reset the memory buffer.
    • Swoole\Buffer::expand - Expand the size of memory buffer.
    • Swoole\Buffer::read - Read data from the memory buffer based on offset and length.
    • Swoole\Buffer::recycle - Release the memory to OS which is not used by the memory buffer.
    • Swoole\Buffer::substr - Read data from the memory buffer based on offset and length. Or remove data from the memory buffer.
    • Swoole\Buffer::write - Write data to the memory buffer. The memory allocated for the buffer will not be changed.
    • Swoole\Buffer::__construct - Fixed size memory blocks allocation.
    • Swoole\Buffer::__destruct - Destruct the Swoole memory buffer.
    • Swoole\Buffer::__toString - Get the string value of the memory buffer.
    • Swoole\Channel::pop - Read and pop data from swoole channel.
    • Swoole\Channel::push - Write and push data into Swoole channel.
    • Swoole\Channel::stats - Get stats of swoole channel.
    • Swoole\Channel::__construct - Construct a Swoole Channel
    • Swoole\Channel::__destruct - Destruct a Swoole channel.
    • Swoole\Client::close - Close the connection established.
    • Swoole\Client::connect - Connect to the remote TCP or UDP port.
    • Swoole\Client::getpeername - Get the remote socket name of the connection.
    • Swoole\Client::getsockname - Get the local socket name of the connection.
    • Swoole\Client::isConnected - Check if the connection is established.
    • Swoole\Client::on - Add callback functions triggered by events.
    • Swoole\Client::pause - Pause receiving data.
    • Swoole\Client::pipe - Redirect the data to another file descriptor.
    • Swoole\Client::recv - Receive data from the remote socket.
    • Swoole\Client::resume - Resume receiving data.
    • Swoole\Client::send - Send data to the remote TCP socket.
    • Swoole\Client::sendfile - Send file to the remote TCP socket.
    • Swoole\Client::sendto - Send data to the remote UDP address.
    • Swoole\Client::set - Set the Swoole client parameters before the connection is established.
    • Swoole\Client::sleep - Remove the TCP client from system event loop.
    • Swoole\Client::wakeup - Add the TCP client back into the system event loop.
    • Swoole\Client::__construct - Create Swoole sync or async TCP/UDP client, with or without SSL.
    • Swoole\Client::__destruct - Destruct the Swoole client.
    • Swoole\Connection\Iterator::count - Count connections.
    • Swoole\Connection\Iterator::current - Return current connection entry.
    • Swoole\Connection\Iterator::key - Return key of the current connection.
    • Swoole\Connection\Iterator::next - Move to the next connection.
    • Swoole\Connection\Iterator::offsetExists - Check if offet exists.
    • Swoole\Connection\Iterator::offsetGet - Offset to retrieve.
    • Swoole\Connection\Iterator::offsetSet - Assign a Connection to the specified offset.
    • Swoole\Connection\Iterator::offsetUnset - Unset an offset.
    • Swoole\Connection\Iterator::rewind - Rewinds iterator
    • Swoole\Connection\Iterator::valid - Check if current position is valid.
    • Swoole\Coroutine::call_user_func - Call a callback given by the first parameter
    • Swoole\Coroutine::call_user_func_array - Call a callback with an array of parameters
    • Swoole\Coroutine::cli_wait - Description
    • Swoole\Coroutine::create - Description
    • Swoole\Coroutine::getuid - Description
    • Swoole\Coroutine::resume - Description
    • Swoole\Coroutine::suspend - Description
    • Swoole\Coroutine\Client::close - Description
    • Swoole\Coroutine\Client::connect - Description
    • Swoole\Coroutine\Client::getpeername - Description
    • Swoole\Coroutine\Client::getsockname - Description
    • Swoole\Coroutine\Client::isConnected - Description
    • Swoole\Coroutine\Client::recv - Description
    • Swoole\Coroutine\Client::send - Description
    • Swoole\Coroutine\Client::sendfile - Description
    • Swoole\Coroutine\Client::sendto - Description
    • Swoole\Coroutine\Client::set - Description
    • Swoole\Coroutine\Client::__construct - Description
    • Swoole\Coroutine\Client::__destruct - Description
    • Swoole\Coroutine\Http\Client::addFile - Description
    • Swoole\Coroutine\Http\Client::close - Description
    • Swoole\Coroutine\Http\Client::execute - Description
    • Swoole\Coroutine\Http\Client::get - Description
    • Swoole\Coroutine\Http\Client::getDefer - Description
    • Swoole\Coroutine\Http\Client::isConnected - Description
    • Swoole\Coroutine\Http\Client::post - Description
    • Swoole\Coroutine\Http\Client::recv - Description
    • Swoole\Coroutine\Http\Client::set - Description
    • Swoole\Coroutine\Http\Client::setCookies - Description
    • Swoole\Coroutine\Http\Client::setData - Description
    • Swoole\Coroutine\Http\Client::setDefer - Description
    • Swoole\Coroutine\Http\Client::setHeaders - Description
    • Swoole\Coroutine\Http\Client::setMethod - Description
    • Swoole\Coroutine\Http\Client::__construct - Description
    • Swoole\Coroutine\Http\Client::__destruct - Description
    • Swoole\Coroutine\MySQL::close - Description
    • Swoole\Coroutine\MySQL::connect - Description
    • Swoole\Coroutine\MySQL::getDefer - Description
    • Swoole\Coroutine\MySQL::query - Description
    • Swoole\Coroutine\MySQL::recv - Description
    • Swoole\Coroutine\MySQL::setDefer - Description
    • Swoole\Coroutine\MySQL::__construct - Description
    • Swoole\Coroutine\MySQL::__destruct - Description
    • Swoole\Event::add - Add new callback functions of a socket into the EventLoop.
    • Swoole\Event::defer - Add a callback function to the next event loop.
    • Swoole\Event::del - Remove all event callback functions of a socket.
    • Swoole\Event::exit - Exit the eventloop, only available at client side.
    • Swoole\Event::set - Update the event callback functions of a socket.
    • Swoole\Event::wait - Description
    • Swoole\Event::write - Write data to the socket.
    • Swoole\Http\Client::addFile - Add a file to the post form.
    • Swoole\Http\Client::close - Close the http connection.
    • Swoole\Http\Client::download - Download a file from the remote server.
    • Swoole\Http\Client::execute - Send the HTTP request after setting the parameters.
    • Swoole\Http\Client::get - Send GET http request to the remote server.
    • Swoole\Http\Client::isConnected - Check if the HTTP connection is connected.
    • Swoole\Http\Client::on - Register callback function by event name.
    • Swoole\Http\Client::post - Send POST http request to the remote server.
    • Swoole\Http\Client::push - Push data to websocket client.
    • Swoole\Http\Client::set - Update the HTTP client paramters.
    • Swoole\Http\Client::setCookies - Set the http request cookies.
    • Swoole\Http\Client::setData - Set the HTTP request body data.
    • Swoole\Http\Client::setHeaders - Set the HTTP request headers.
    • Swoole\Http\Client::setMethod - Set the HTTP request method.
    • Swoole\Http\Client::upgrade - Upgrade to websocket protocol.
    • Swoole\Http\Client::__construct - Construct the async HTTP client.
    • Swoole\Http\Client::__destruct - Destruct the HTTP client.
    • Swoole\Http\Request::rawcontent - Get the raw HTTP POST body.
    • Swoole\Http\Request::__destruct - Destruct the HTTP request.
    • Swoole\Http\Response::cookie - Set the cookies of the HTTP response.
    • Swoole\Http\Response::end - Send data for the HTTP request and finish the response.
    • Swoole\Http\Response::gzip - Enable the gzip of response content.
    • Swoole\Http\Response::header - Set the HTTP response headers.
    • Swoole\Http\Response::initHeader - Init the HTTP response header.
    • Swoole\Http\Response::rawcookie - Set the raw cookies to the HTTP response.
    • Swoole\Http\Response::sendfile - Send file through the HTTP response.
    • Swoole\Http\Response::status - Set the status code of the HTTP response.
    • Swoole\Http\Response::write - Append HTTP body content to the HTTP response.
    • Swoole\Http\Response::__destruct - Destruct the HTTP response.
    • Swoole\Http\Server::on - Bind callback function to HTTP server by event name.
    • Swoole\Http\Server::start - Start the swoole http server.
    • Swoole\Lock::lock - Try to acquire the lock. It will block if the lock is not available.
    • Swoole\Lock::lock_read - Lock a read-write lock for reading.
    • Swoole\Lock::trylock - Try to acquire the lock and return straight away even the lock is not available.
    • Swoole\Lock::trylock_read - Try to lock a read-write lock for reading and return straight away even the lock is not available.
    • Swoole\Lock::unlock - Release the lock.
    • Swoole\Lock::__construct - Construct a memory lock.
    • Swoole\Lock::__destruct - Destory a Swoole memory lock.
    • Swoole\Mmap::open - Map a file into memory and return the stream resource which can be used by PHP stream operations.
    • Swoole\MySQL::close - Close the async MySQL connection.
    • Swoole\MySQL::connect - Connect to the remote MySQL server.
    • Swoole\MySQL::getBuffer - Description
    • Swoole\MySQL::on - Register callback function based on event name.
    • Swoole\MySQL::query - Run the SQL query.
    • Swoole\MySQL::__construct - Construct an async MySQL client.
    • Swoole\MySQL::__destruct - Destory the async MySQL client.
    • Swoole\Process::alarm - High precision timer which triggers signal with fixed interval.
    • Swoole\Process::close - Close the pipe to the child process.
    • Swoole\Process::daemon - Change the process to be a daemon process.
    • Swoole\Process::exec - Execute system commands.
    • Swoole\Process::exit - Stop the child processes.
    • Swoole\Process::freeQueue - Destroy the message queue created by swoole_process::useQueue.
    • Swoole\Process::kill - Send signal to the child process.
    • Swoole\Process::name - Set name of the process.
    • Swoole\Process::pop - Read and pop data from the message queue.
    • Swoole\Process::push - Write and push data into the message queue.
    • Swoole\Process::read - Read data sending to the process.
    • Swoole\Process::signal - Send signal to the child processes.
    • Swoole\Process::start - Start the process.
    • Swoole\Process::statQueue - Get the stats of the message queue used as the communication method between processes.
    • Swoole\Process::useQueue - Create a message queue as the communication method between the parent process and child processes.
    • Swoole\Process::wait - Wait for the events of child processes.
    • Swoole\Process::write - Write data into the pipe and communicate with the parent process or child processes.
    • Swoole\Process::__construct - Construct a process.
    • Swoole\Process::__destruct - Destory the process.
    • Swoole\Redis\Server::format - Description
    • Swoole\Redis\Server::setHandler - Description
    • Swoole\Redis\Server::start - Description
    • Swoole\Serialize::pack - Serialize the data.
    • Swoole\Serialize::unpack - Unserialize the data.
    • Swoole\Server::addlistener - Add a new listener to the server.
    • Swoole\Server::addProcess - Add a user defined swoole_process to the server.
    • Swoole\Server::after - Trigger a callback function after a period of time.
    • Swoole\Server::bind - Bind the connection to a user defined user ID.
    • Swoole\Server::clearTimer - Stop and destory a timer.
    • Swoole\Server::close - Close a connection to the client.
    • Swoole\Server::confirm - Check status of the connection.
    • Swoole\Server::connection_info - Get the connection info by file description.
    • Swoole\Server::connection_list - Get all of the established connections.
    • Swoole\Server::defer - Delay execution of the callback function at the end of current EventLoop.
    • Swoole\Server::exist - Check if the connection is existed.
    • Swoole\Server::finish - Used in task process for sending result to the worker process when the task is finished.
    • Swoole\Server::getClientInfo - Get the connection info by file description.
    • Swoole\Server::getClientList - Get all of the established connections.
    • Swoole\Server::getLastError - Get the error code of the most recent error.
    • Swoole\Server::heartbeat - Check all the connections on the server.
    • Swoole\Server::listen - Listen on the given IP and port, socket type.
    • Swoole\Server::on - Register a callback function by event name.
    • Swoole\Server::pause - Stop receiving data from the connection.
    • Swoole\Server::protect - Set the connection to be protected mode.
    • Swoole\Server::reload - Restart all the worker process.
    • Swoole\Server::resume - Start receving data from the connection.
    • Swoole\Server::send - Send data to the client.
    • Swoole\Server::sendfile - Send file to the connection.
    • Swoole\Server::sendMessage - Send message to worker processes by ID.
    • Swoole\Server::sendto - Send data to the remote UDP address.
    • Swoole\Server::sendwait - Send data to the remote socket in the blocking way.
    • Swoole\Server::set - Set the runtime settings of the swoole server.
    • Swoole\Server::shutdown - Shutdown the master server process, this function can be called in worker processes.
    • Swoole\Server::start - Start the Swoole server.
    • Swoole\Server::stats - Get the stats of the Swoole server.
    • Swoole\Server::stop - Stop the Swoole server.
    • Swoole\Server::task - Send data to the task worker processes.
    • Swoole\Server::taskwait - Send data to the task worker processes in blocking way.
    • Swoole\Server::taskWaitMulti - Execute multiple tasks concurrently.
    • Swoole\Server::tick - Repeats a given function at every given time-interval.
    • Swoole\Server::__construct - Construct a Swoole server.
    • Swoole\Server\Port::on - Register callback functions by event.
    • Swoole\Server\Port::set - Set protocol of the server port.
    • Swoole\Server\Port::__construct - Construct a server port
    • Swoole\Server\Port::__destruct - Destory server port
    • Swoole\Table::column - Set the data type and size of the columns.
    • Swoole\Table::count - Count the rows in the table, or count all the elements in the table if $mode = 1.
    • Swoole\Table::create - Create the swoole memory table.
    • Swoole\Table::current - Get the current row.
    • Swoole\Table::decr - Decrement the value in the Swoole table by $row_key and $column_key.
    • Swoole\Table::del - Delete a row in the Swoole table by $row_key.
    • Swoole\Table::destroy - Destroy the Swoole table.
    • Swoole\Table::exist - Check if a row is existed by $row_key.
    • Swoole\Table::get - Get the value in the Swoole table by $row_key and $column_key.
    • Swoole\Table::incr - Increment the value by $row_key and $column_key.
    • Swoole\Table::key - Get the key of current row.
    • Swoole\Table::next - Iterator the next row.
    • Swoole\Table::rewind - Rewind the iterator.
    • Swoole\Table::set - Update a row of the table by $row_key.
    • Swoole\Table::valid - Check current if the current row is valid.
    • Swoole\Table::__construct - Construct a Swoole memory table with fixed size.
    • Swoole\Timer::after - Trigger a callback function after a period of time.
    • Swoole\Timer::clear - Delete a timer by timer ID.
    • Swoole\Timer::exists - Check if a timer is existed.
    • Swoole\Timer::tick - Repeats a given function at every given time-interval.
    • Swoole\WebSocket\Server::exist - Check if the file descriptor exists.
    • Swoole\WebSocket\Server::on - Register event callback function
    • Swoole\WebSocket\Server::pack - Get a pack of binary data to send in a single frame.
    • Swoole\WebSocket\Server::push - Push data to the remote client.
    • Swoole\WebSocket\Server::unpack - Unpack the binary data received from the client.
    • swoole_async_dns_lookup - Async and non-blocking hostname to IP lookup
    • swoole_async_read - Read file stream asynchronously
    • swoole_async_readfile - Read a file asynchronously
    • swoole_async_set - Update the async I/O options
    • swoole_async_write - Write data to a file stream asynchronously
    • swoole_async_writefile - Write data to a file asynchronously
    • swoole_client_select - Get the file description which are ready to read/write or error
    • swoole_cpu_num - Get the number of CPU
    • swoole_errno - Get the error code of the latest system call
    • swoole_event_add - Add new callback functions of a socket into the EventLoop
    • swoole_event_defer - Add callback function to the next event loop
    • swoole_event_del - Remove all event callback functions of a socket
    • swoole_event_exit - Exit the eventloop, only available at the client side
    • swoole_event_set - Update the event callback functions of a socket
    • swoole_event_wait - Start the event loop
    • swoole_event_write - Write data to a socket
    • swoole_get_local_ip - Get the IPv4 IP addresses of each NIC on the machine
    • swoole_last_error - Get the lastest error message
    • swoole_load_module - Load a swoole extension
    • swoole_select - Select the file descriptions which are ready to read/write or error in the eventloop
    • swoole_set_process_name - Set the process name
    • swoole_strerror - Convert the Errno into error messages
    • swoole_timer_after - Trigger a one time callback function in the future
    • swoole_timer_exists - Check if a timer callback function is existed
    • swoole_timer_tick - Trigger a timer tick callback function by time interval
    • swoole_version - Get the version of Swoole
    • symlink - Crée un lien symbolique
    • SyncEvent::fire - Lance/défini l'événement
    • SyncEvent::reset - Réinitialise manuellement un événement
    • SyncEvent::wait - Attend que l'objet SyncEvent ne soit lancé
    • SyncEvent::__construct - Construit un nouvel objet SyncEvent
    • SyncMutex::lock - Obtient un verrou exclusif
    • SyncMutex::unlock - Déverouille le mutex
    • SyncMutex::__construct - Construit un nouvel objet SyncMutex
    • SyncReaderWriter::readlock - Obtiens un verrou de lecture
    • SyncReaderWriter::readunlock - Libère un verrou de lecture
    • SyncReaderWriter::writelock - Obtiens un verrou d'écriture exclusif
    • SyncReaderWriter::writeunlock - Libère un verrou d'écriture
    • SyncReaderWriter::__construct - Construit un nouvel objet SyncReaderWriter
    • SyncSemaphore::lock - Décrémente le compteur de l'objet SyncSemaphore ou attend
    • SyncSemaphore::unlock - Incrémente le compteur de l'objet SyncSemaphore
    • SyncSemaphore::__construct - Construit un nouvel objet SyncSemaphore
    • SyncSharedMemory::first - Check to see if the object is the first instance system-wide of named shared memory
    • SyncSharedMemory::read - Copy data from named shared memory
    • SyncSharedMemory::size - Returns the size of the named shared memory
    • SyncSharedMemory::write - Copy data to named shared memory
    • SyncSharedMemory::__construct - Constructs a new SyncSharedMemory object
    • syslog - Génère un message dans l'historique système
    • system - Exécute un programme externe et affiche le résultat
    • sys_getloadavg - Récupère la charge moyenne du système
    • sys_get_temp_dir - Retourne le chemin du répertoire utilisé pour les fichiers temporaires
  • t
    • Table::count - Get row count
    • Table::delete - Delete rows from table
    • Table::existsInDatabase - Check if table exists in database
    • Table::getName - Get table name
    • Table::getSchema - Get table schema
    • Table::getSession - Get table session
    • Table::insert - Insert table rows
    • Table::isView - Check if table is view
    • Table::select - Select rows from table
    • Table::update - Update rows in table
    • Table::__construct - Table constructor
    • TableDelete::bind - Bind delete query parameters
    • TableDelete::execute - Execute delete query
    • TableDelete::limit - Limit deleted rows
    • TableDelete::orderby - Set delete sort criteria
    • TableDelete::where - Set delete search condition
    • TableDelete::__construct - TableDelete constructor
    • TableInsert::execute - Execute insert query
    • TableInsert::values - Add insert row values
    • TableInsert::__construct - TableInsert constructor
    • TableSelect::bind - Bind select query parameters
    • TableSelect::execute - Execute select statement
    • TableSelect::groupBy - Set select grouping criteria
    • TableSelect::having - Set select having condition
    • TableSelect::limit - Limit selected rows
    • TableSelect::lockExclusive - Execute EXCLUSIVE LOCK
    • TableSelect::lockShared - Execute SHARED LOCK
    • TableSelect::offset - Set limit offset
    • TableSelect::orderby - Set select sort criteria
    • TableSelect::where - Set select search condition
    • TableSelect::__construct - TableSelect constructor
    • TableUpdate::bind - Bind update query parameters
    • TableUpdate::execute - Execute update query
    • TableUpdate::limit - Limit update row count
    • TableUpdate::orderby - Set sorting criteria
    • TableUpdate::set - Add field to be updated
    • TableUpdate::where - Set search filter
    • TableUpdate::__construct - TableUpdate constructor
    • taint - Nettoie une chaîne
    • tan - Tangente
    • tanh - Tangente hyperbolique
    • tcpwrap_check - Vérification Tcpwrap
    • tempnam - Crée un fichier avec un nom unique
    • textdomain - Définie le domaine par défaut
    • Thread::detach - Exécution
    • Thread::getCreatorId - Identification
    • Thread::getCurrentThread - Identification
    • Thread::getCurrentThreadId - Identification
    • Thread::getThreadId - Identification
    • Thread::globally - Exécution
    • Thread::isJoined - Détection de statut
    • Thread::isStarted - Détection de statut
    • Thread::join - Synchronisation
    • Thread::kill - Exécution
    • Thread::start - Exécution
    • Threaded::chunk - Manipulation
    • Threaded::count - Manipulation
    • Threaded::extend - Manipulation pendant l'exécution
    • Threaded::from - Création
    • Threaded::getTerminationInfo - Détection d'erreur
    • Threaded::isRunning - Détection de statut
    • Threaded::isTerminated - Détection de statut
    • Threaded::isWaiting - Détection de statut
    • Threaded::lock - Synchronisation
    • Threaded::merge - Manipulation
    • Threaded::notify - Synchronisation
    • Threaded::notifyOne - Synchronization
    • Threaded::pop - Manipulation
    • Threaded::run - Exécution
    • Threaded::shift - Manipulation
    • Threaded::synchronized - Synchronisation
    • Threaded::unlock - Synchronisation
    • Threaded::wait - Synchronisation
    • Throwable::getCode - Récupère le code de l'exception
    • Throwable::getFile - Récupère le fichier où l'objet a été crée
    • Throwable::getLine - Récupère le numéro de ligne où l'objet instancié a été jeté
    • Throwable::getMessage - Récupère le message
    • Throwable::getPrevious - Retourne le Throwable précédent
    • Throwable::getTrace - Récupère la trace d'appels
    • Throwable::getTraceAsString - Récupère la trace d'appels en tant que chaîne de caractères
    • Throwable::__toString - Récupère la représentation sous forme de chaîne de caractère de l'objet jeté
    • tidy::$errorBuffer - Retourne les alertes et erreurs qui sont survenues lors de l'analyse du document
    • tidy::body - Retourne un objet TidyNode, commencé à partir de la balise <body>
    • tidy::cleanRepair - Effectue les opérations de nettoyage et de réparation préparées pour un fichier HTML
    • tidy::diagnose - Établit le diagnostic pour le document analysé et réparé
    • tidy::getConfig - Lit la configuration Tidy courante
    • tidy::getHtmlVer - Détecte le version du code HTML utilisée dans un document
    • Tidy::getopt - Retourne la valeur de l'option de configuration Tidy
    • tidy::getOptDoc - Retourne la documentation pour le nom de l'option donnée
    • tidy::getRelease - Retourne la date de publication (version) de la bibliothèque Tidy
    • tidy::getStatus - Retourne le statut du document spécifié
    • tidy::head - Retourne un objet tidyNode à partir de la balise <head>
    • tidy::html - Retourne un objet tidyNode commençant à la balise <html>
    • tidy::isXhtml - Indique si le document est un document XHTML
    • tidy::isXml - Indique si le document est un document XML générique (non HTML/XHTML)
    • tidy::parseFile - Analyse les balises d'un fichier ou d'une URI
    • tidy::parseString - Analyse un document HTML contenu dans une chaîne
    • tidy::repairFile - Répare un fichier et le renvoie en tant que chaîne
    • tidy::repairString - Répare une chaîne HTML en utilisant un fichier de configuration optionnel
    • tidy::root - Retourne un objet tidyNode représentant la racine du document HTML
    • tidy::__construct - Construit un nouvel objet tidy
    • tidyNode::getParent - Retourne le noeud parent du noeud courant
    • tidyNode::hasChildren - Indique si le noeud a des enfants
    • tidyNode::hasSiblings - Indique si le noeud a des frères
    • tidyNode::isAsp - Vérifie si le noeud est du code ASP
    • tidyNode::isComment - Indique si le noeud représente un commentaire
    • tidyNode::isHtml - Indique si le noeud est une noeud d'élément
    • tidyNode::isJste - Indique si ce noeud est JSTE
    • tidyNode::isPhp - Indique si un noeud contient du code PHP
    • tidyNode::isText - Indique si le noeud représente du texte (sans balise)
    • tidyNode::__construct - Constructeur privée pour interdire l'instanciation directe
    • tidy_access_count - Retourne le nombre d'alertes d'accessibilité Tidy rencontrées dans le document
    • tidy_config_count - Retourne le nombre d'erreurs de configuration Tidy rencontrées dans le document
    • tidy_error_count - Retourne le nombre d'erreurs Tidy rencontrées dans le document
    • tidy_get_output - Retourne une chaîne représentant les balises telles qu'analysées par Tidy
    • tidy_warning_count - Retourne le nombre d'alertes Tidy rencontrées dans le document spécifié
    • time - Retourne le timestamp UNIX actuel
    • timezone_abbreviations_list - Alias de DateTimeZone::listAbbreviations
    • timezone_identifiers_list - Alias de DateTimeZone::listIdentifiers
    • timezone_location_get - Alias de DateTimeZone::getLocation
    • timezone_name_from_abbr - Retourne le nom du fuseau horaire à partir de son abréviation
    • timezone_name_get - Alias de DateTimeZone::getName
    • timezone_offset_get - Alias de DateTimeZone::getOffset
    • timezone_open - Alias de DateTimeZone::__construct
    • timezone_transitions_get - Alias de DateTimeZone::getTransitions
    • timezone_version_get - Lit la version de la timezonedb
    • time_nanosleep - Attendre pendant un nombre de secondes et de nanosecondes
    • time_sleep_until - Arrête le script pendant une durée spécifiée
    • tmpfile - Crée un fichier temporaire
    • token_get_all - Scinde un code source en éléments de base
    • token_name - Retourne le nom d'un élément de code source
    • TokyoTyrant::add - Ajoute une clé numérique
    • TokyoTyrant::connect - Connexion à une base de données
    • TokyoTyrant::connectUri - Connexion à une base de données en utilisant une URI
    • TokyoTyrant::copy - Copie la base de données
    • TokyoTyrant::ext - Exécute un script distant
    • TokyoTyrant::fwmKeys - Retourne la clé correspondante précédente
    • TokyoTyrant::get - Le but de get
    • TokyoTyrant::getIterator - Récupère un itérateur
    • TokyoTyrant::num - Nombre d'enregistrements contenus dans la base de données
    • TokyoTyrant::out - Supprime des enregistrements
    • TokyoTyrant::put - Insère des valeurs
    • TokyoTyrant::putCat - Concatène un enregistrement
    • TokyoTyrant::putKeep - Enregistre un nouvel enregistrement
    • TokyoTyrant::putNr - Enregistre une valeur
    • TokyoTyrant::putShl - Concatène un enregistrement
    • TokyoTyrant::restore - Restaure la base de données
    • TokyoTyrant::setMaster - Définit le maître de réplication
    • TokyoTyrant::size - Retourne la taille de la valeur
    • TokyoTyrant::stat - Récupère des statistiques
    • TokyoTyrant::sync - Synchronise la base de données
    • TokyoTyrant::tune - Règle les valeurs de connexion
    • TokyoTyrant::vanish - Vide la base de données
    • TokyoTyrant::__construct - Construit un nouvel objet TokyoTyrant
    • TokyoTyrantIterator::current - Récupère la valeur courante
    • TokyoTyrantIterator::key - Retourne la clé courante
    • TokyoTyrantIterator::next - Se déplace sur la prochaine clé
    • TokyoTyrantIterator::rewind - Réinitialise l'itérateur
    • TokyoTyrantIterator::valid - Réinitialise l'itérateur
    • TokyoTyrantIterator::__construct - Construit un itérateur
    • TokyoTyrantQuery::addCond - Ajoute une condition à la requête
    • TokyoTyrantQuery::count - Compte les enregistrements
    • TokyoTyrantQuery::current - Retourne l'élément courant
    • TokyoTyrantQuery::hint - Récupère les informations sur une requête
    • TokyoTyrantQuery::key - Retourne la clé courante
    • TokyoTyrantQuery::metaSearch - Récupère des enregistrements avec plusieurs requêtes
    • TokyoTyrantQuery::next - Déplace l'itérateur sur la prochaine entrée
    • TokyoTyrantQuery::out - Supprime des enregistrements en se basant sur une requête
    • TokyoTyrantQuery::rewind - Réinitialise l'itérateur
    • TokyoTyrantQuery::search - Cherche des enregistrements
    • TokyoTyrantQuery::setLimit - Limite les résultats
    • TokyoTyrantQuery::setOrder - Définit l'ordre des résultats
    • TokyoTyrantQuery::valid - Vérifie la validité de l'élément courant
    • TokyoTyrantQuery::__construct - Construit une nouvelle requête
    • TokyoTyrantTable::add - Ajoute un enregistrement
    • TokyoTyrantTable::genUid - Génère un identifiant unique
    • TokyoTyrantTable::get - Récupère une ligne
    • TokyoTyrantTable::getIterator - Récupère un itérateur
    • TokyoTyrantTable::getQuery - Récupère un objet de requête
    • TokyoTyrantTable::out - Supprime un enregistement
    • TokyoTyrantTable::put - Enregistre une ligne
    • TokyoTyrantTable::putCat - Concatène une ligne
    • TokyoTyrantTable::putKeep - Enregistre un nouvel enregistrement
    • TokyoTyrantTable::putNr - Enregistre une valeur
    • TokyoTyrantTable::putShl - Concatène un enregistrement
    • TokyoTyrantTable::setIndex - Définit l'index
    • touch - Modifie la date de modification et de dernier accès d'un fichier
    • trader_acos - Vector Trigonometric ACos
    • trader_ad - Chaikin A/D Line
    • trader_add - Ajoute un vecteur arithmétique
    • trader_adosc - Chaikin A/D Oscillator
    • trader_adx - Average Directional Movement Index
    • trader_adxr - Average Directional Movement Index Rating
    • trader_apo - Absolute Price Oscillator
    • trader_aroon - Aroon
    • trader_aroonosc - Aroon Oscillator
    • trader_asin - Vector Trigonometric ASin
    • trader_atan - Calcule l'arc tangente
    • trader_atr - Average True Range
    • trader_avgprice - Average Price
    • trader_bbands - Bollinger Bands
    • trader_beta - Beta
    • trader_bop - Balance Of Power
    • trader_cci - Commodity Channel Index
    • trader_cdl2crows - Two Crows
    • trader_cdl3blackcrows - Three Black Crows
    • trader_cdl3inside - Three Inside Up/Down
    • trader_cdl3linestrike - Three-Line Strike
    • trader_cdl3outside - Three Outside Up/Down
    • trader_cdl3starsinsouth - Three Stars In The South
    • trader_cdl3whitesoldiers - Three Advancing White Soldiers
    • trader_cdlabandonedbaby - Abandoned Baby
    • trader_cdladvanceblock - Advance Block
    • trader_cdlbelthold - Belt-hold
    • trader_cdlbreakaway - Breakaway
    • trader_cdlclosingmarubozu - Closing Marubozu
    • trader_cdlconcealbabyswall - Concealing Baby Swallow
    • trader_cdlcounterattack - Counterattack
    • trader_cdldarkcloudcover - Dark Cloud Cover
    • trader_cdldoji - Doji
    • trader_cdldojistar - Doji Star
    • trader_cdldragonflydoji - Dragonfly Doji
    • trader_cdlengulfing - Engulfing Pattern
    • trader_cdleveningdojistar - Evening Doji Star
    • trader_cdleveningstar - Evening Star
    • trader_cdlgapsidesidewhite - Up/Down-gap side-by-side white lines
    • trader_cdlgravestonedoji - Gravestone Doji
    • trader_cdlhammer - Hammer
    • trader_cdlhangingman - Hanging Man
    • trader_cdlharami - Harami Pattern
    • trader_cdlharamicross - Harami Cross Pattern
    • trader_cdlhighwave - High-Wave Candle
    • trader_cdlhikkake - Hikkake Pattern
    • trader_cdlhikkakemod - Modified Hikkake Pattern
    • trader_cdlhomingpigeon - Homing Pigeon
    • trader_cdlidentical3crows - Identical Three Crows
    • trader_cdlinneck - Masque In-Neck
    • trader_cdlinvertedhammer - Marteau inversé
    • trader_cdlkicking - Kicking
    • trader_cdlkickingbylength - Kicking - bull/bear déterminé par le plus marubozu
    • trader_cdlladderbottom - Bas de l'échelle
    • trader_cdllongleggeddoji - Doji : longueur des jambes
    • trader_cdllongline - Long Line Candle
    • trader_cdlmarubozu - Marubozu
    • trader_cdlmatchinglow - Matching Low
    • trader_cdlmathold - Mat Hold
    • trader_cdlmorningdojistar - Etoile Doji du matin
    • trader_cdlmorningstar - Etoile du matin
    • trader_cdlonneck - Masque On-Neck
    • trader_cdlpiercing - Masque Piercing
    • trader_cdlrickshawman - Rickshaw Man
    • trader_cdlrisefall3methods - Hausse / Baisse - 3 méthodes
    • trader_cdlseparatinglines - Lignes séparées
    • trader_cdlshootingstar - Etoile filante
    • trader_cdlshortline - Ligne courte de bougie
    • trader_cdlspinningtop - Toupie
    • trader_cdlstalledpattern - Masque bloqué
    • trader_cdlsticksandwich - Sandwich épinglé
    • trader_cdltakuri - Takuri (Dragonfly Doji avec une ombre inférieure très longue)
    • trader_cdltasukigap - Ecart Tasuki
    • trader_cdlthrusting - Masque de poussée
    • trader_cdltristar - Masque Tristar
    • trader_cdlunique3river - Unique 3 River
    • trader_cdlupsidegap2crows - Ecart inversé Two Crows
    • trader_cdlxsidegap3methods - Ecart supérieur/inférieur trois méthodes
    • trader_ceil - Vecteur plafonné
    • trader_cmo - Oscillateur dynamique Chande
    • trader_correl - Coefficient de corrélation de Pearson (r)
    • trader_cos - Vecteur trigonométrique Cos
    • trader_cosh - Vecteur trigonométrique Cosh
    • trader_dema - Moyenne mobile exponentielle double
    • trader_div - Vecteur arithmétique Div
    • trader_dx - Indice de mouvement directionnel
    • trader_ema - Moyenne mobile exponentielle
    • trader_errno - Récupère le code erreur
    • trader_exp - Vecteur arithmétique Exp
    • trader_floor - Niveau du vecteur
    • trader_get_compat - Récupère le mode de compatibilité
    • trader_get_unstable_period - Récupère la période d'instabilité
    • trader_ht_dcperiod - Transformation de Hilbert - Période de cycle dominant
    • trader_ht_dcphase - Transformation de Hilbert - Phase de cycle dominant
    • trader_ht_phasor - Transformation de Hilbert - Composants de la phase
    • trader_ht_sine - Transformation de Hilbert - Onde sinusoïdale
    • trader_ht_trendline - Transformation de Hilbert - Tendance instantanée
    • trader_ht_trendmode - Transformation de Hilbert - Mode tendance vs mode cycle
    • trader_kama - Moyenne mobile adaptative Kaufman
    • trader_linearreg - Régression linéaire
    • trader_linearreg_angle - Angle de régression linéaire
    • trader_linearreg_intercept - Interception de régression linéaire
    • trader_linearreg_slope - Pente de régression linéaire
    • trader_ln - Vecteur de Log naturel
    • trader_log10 - Vecteur Log10
    • trader_ma - Moyenne mobile
    • trader_macd - Moyenne du déplacement Convergence/Divergence
    • trader_macdext - MACD avec un type MA réglable
    • trader_macdfix - Moyen de déplacement Convergence/Divergence fixé à 12/26
    • trader_mama - MESA moyenne mobile adaptative
    • trader_mavp - Moyenne mobile avec durée variable
    • trader_max - Valeur la plus élevée sur une période déterminée
    • trader_maxindex - Indice de la valeur la plus élevée sur une période déterminée
    • trader_medprice - Prix médian
    • trader_mfi - Indice de fluidité de l'argent
    • trader_midpoint - Milieu sur la période
    • trader_midprice - Prix moyen sur la période
    • trader_min - Valeur la plus basse sur une période spécifique
    • trader_minindex - Indice de la valeur la plus basse sur une période déterminée
    • trader_minmax - Valeurs minimales et maximales sur une période donnée
    • trader_minmaxindex - Indices des valeurs minimales et maximales sur une période donnée
    • trader_minus_di - Indicateur minimum directionnel
    • trader_minus_dm - Mouvement minimum directionnel
    • trader_mom - Elan
    • trader_mult - Vecteur arithmétique mult
    • trader_natr - Intervalle réel normalisé moyen
    • trader_obv - Volume de l'équilibre
    • trader_plus_di - Indicateur positif de direction
    • trader_plus_dm - Mouvement directionnel positif
    • trader_ppo - Oscillateur de prix en pourcentage
    • trader_roc - Taux de variation : ((price/prevPrice)-1)*100
    • trader_rocp - Taux de variation en pourcentage : (price-prevPrice)/prevPrice
    • trader_rocr - Taux de rapport de changement : (price/prevPrice)
    • trader_rocr100 - Taux de taux de variation de l'échelle de 100 : (price/prevPrice)*100
    • trader_rsi - Indice de force relative
    • trader_sar - Parabolique SAR
    • trader_sarext - Parabolique SAR - Etendu
    • trader_set_compat - Définit le mode de compatibilité
    • trader_set_unstable_period - Définit une période instable
    • trader_sin - Vecteur trigonométrique sin
    • trader_sinh - Vecteur trigonométrique sinh
    • trader_sma - Moyenne mobile simple
    • trader_sqrt - Vecteur de racine carrée
    • trader_stddev - Déviation standard
    • trader_stoch - Stochastique
    • trader_stochf - Rapidité stochastique
    • trader_stochrsi - Index stochastique relatif fort
    • trader_sub - Vecteur de soustraction arithmétique
    • trader_sum - Résumé
    • trader_t3 - Triple moyenne mobile exponentielle (T3)
    • trader_tan - Vecteur trigonométrie Tan
    • trader_tanh - Vecteur trigonométrie Tanh
    • trader_tema - Triple moyenne mobile exponentielle
    • trader_trange - Intervalle réel
    • trader_trima - Moyenne mobile triangulaire
    • trader_trix - Taux de variation sur une journée (ROC) d'un triple EMA lissé
    • trader_tsf - Prévisions des séries chronologiques
    • trader_typprice - Prix ??typique
    • trader_ultosc - Oscillateur ultime
    • trader_var - Variance
    • trader_wclprice - Prix clos ??pondéré
    • trader_willr - Williams' %R
    • trader_wma - Moyenne mobile pondérée
    • trait_exists - Vérifie si un trait existe
    • Transliterator::create - Crée un Transliterator
    • Transliterator::createFromRules - Crée un translittérateur depuis des règles
    • Transliterator::createInverse - Crée un translittérateur inverse
    • Transliterator::getErrorCode - Récupère le dernier code erreur
    • Transliterator::getErrorMessage - Récupère le dernier message d'erreur
    • Transliterator::listIDs - Récupère les identifiants de ce translittérateur
    • Transliterator::transliterate - Translittère une chaîne de caractères
    • Transliterator::__construct - Constructeur privé pour interdire l'instantiation
    • trigger_error - Déclenche une erreur utilisateur
    • trim - Supprime les espaces (ou d'autres caractères) en début et fin de chaîne
  • u
    • uasort - Trie un tableau en utilisant une fonction de rappel
    • ucfirst - Met le premier caractère en majuscule
    • UConverter::convert - Convertit une chaîne d'un jeu de caractères vers un autre jeu de caractères
    • UConverter::fromUCallback - Fonction de rappel "from"
    • UConverter::getAliases - Récupère les alias du nom fourni
    • UConverter::getAvailable - Récupère le nom canonique des convertisseurs diponibles
    • UConverter::getDestinationEncoding - Récupère l'encodage de la destination
    • UConverter::getDestinationType - Récupère le type de la destination du convertisseur
    • UConverter::getErrorCode - Récupère le code de la dernière erreur survenue sur l'objet
    • UConverter::getErrorMessage - Récupère le message de la dernière erreur survenue sur l'objet
    • UConverter::getSourceEncoding - Récupère l'encodage de la source
    • UConverter::getSourceType - Récupère le type de source du convertisseur
    • UConverter::getStandards - Récupère les normes associées aux noms de conversion
    • UConverter::getSubstChars - Récupère les caractères de substitution
    • UConverter::reasonText - Récupère la chaîne représentant la raison de la fonction de rappel
    • UConverter::setDestinationEncoding - Définit l'encodage de la destination
    • UConverter::setSourceEncoding - Définit l'encodage de la source
    • UConverter::setSubstChars - Définit les caractères de substitution
    • UConverter::toUCallback - Fonction de rappel "to"
    • UConverter::transcode - Convertit une chaîne depuis un jeu de caractères vers un autre jeu de caractères
    • UConverter::__construct - Crée un objet UConverter
    • ucwords - Met en majuscule la première lettre de tous les mots
    • UI\Area::onDraw - Draw Callback
    • UI\Area::onKey - Key Callback
    • UI\Area::onMouse - Mouse Callback
    • UI\Area::redraw - Redraw Area
    • UI\Area::scrollTo - Area Scroll
    • UI\Area::setSize - Set Size
    • UI\Control::destroy - Destroy Control
    • UI\Control::disable - Disable Control
    • UI\Control::enable - Enable Control
    • UI\Control::getParent - Get Parent Control
    • UI\Control::getTopLevel - Get Top Level
    • UI\Control::hide - Hide Control
    • UI\Control::isEnabled - Determine if Control is enabled
    • UI\Control::isVisible - Determine if Control is visible
    • UI\Control::setParent - Set Parent Control
    • UI\Control::show - Control Show
    • UI\Controls\Box::append - Append Control
    • UI\Controls\Box::delete - Delete Control
    • UI\Controls\Box::getOrientation - Get Orientation
    • UI\Controls\Box::isPadded - Padding Detection
    • UI\Controls\Box::setPadded - Set Padding
    • UI\Controls\Box::__construct - Construct a new Box
    • UI\Controls\Button::getText - Get Text
    • UI\Controls\Button::onClick - Click Handler
    • UI\Controls\Button::setText - Set Text
    • UI\Controls\Button::__construct - Construct a new Button
    • UI\Controls\Check::getText - Get Text
    • UI\Controls\Check::isChecked - Checked Detection
    • UI\Controls\Check::onToggle - Toggle Callback
    • UI\Controls\Check::setChecked - Set Checked
    • UI\Controls\Check::setText - Set Text
    • UI\Controls\Check::__construct - Construct a new Check
    • UI\Controls\ColorButton::getColor - Get Color
    • UI\Controls\ColorButton::onChange - Change Handler
    • UI\Controls\ColorButton::setColor - Set Color
    • UI\Controls\Combo::append - Append Option
    • UI\Controls\Combo::getSelected - Get Selected Option
    • UI\Controls\Combo::onSelected - Selected Handler
    • UI\Controls\Combo::setSelected - Set Selected Option
    • UI\Controls\EditableCombo::append - Append Option
    • UI\Controls\EditableCombo::getText - Get Text
    • UI\Controls\EditableCombo::onChange - Change Handler
    • UI\Controls\EditableCombo::setText - Set Text
    • UI\Controls\Entry::getText - Get Text
    • UI\Controls\Entry::isReadOnly - Detect Read Only
    • UI\Controls\Entry::onChange - Change Handler
    • UI\Controls\Entry::setReadOnly - Set Read Only
    • UI\Controls\Entry::setText - Set Text
    • UI\Controls\Entry::__construct - Construct a new Entry
    • UI\Controls\Form::append - Append Control
    • UI\Controls\Form::delete - Delete Control
    • UI\Controls\Form::isPadded - Padding Detection
    • UI\Controls\Form::setPadded - Set Padding
    • UI\Controls\Grid::append - Append Control
    • UI\Controls\Grid::isPadded - Padding Detection
    • UI\Controls\Grid::setPadded - Set Padding
    • UI\Controls\Group::append - Append Control
    • UI\Controls\Group::getTitle - Get Title
    • UI\Controls\Group::hasMargin - Margin Detection
    • UI\Controls\Group::setMargin - Set Margin
    • UI\Controls\Group::setTitle - Set Title
    • UI\Controls\Group::__construct - Construct a new Group
    • UI\Controls\Label::getText - Get Text
    • UI\Controls\Label::setText - Set Text
    • UI\Controls\Label::__construct - Construct a new Label
    • UI\Controls\MultilineEntry::append - Append Text
    • UI\Controls\MultilineEntry::getText - Get Text
    • UI\Controls\MultilineEntry::isReadOnly - Read Only Detection
    • UI\Controls\MultilineEntry::onChange - Change Handler
    • UI\Controls\MultilineEntry::setReadOnly - Set Read Only
    • UI\Controls\MultilineEntry::setText - Set Text
    • UI\Controls\MultilineEntry::__construct - Construct a new Multiline Entry
    • UI\Controls\Picker::__construct - Construct a new Picker
    • UI\Controls\Progress::getValue - Get Value
    • UI\Controls\Progress::setValue - Set Value
    • UI\Controls\Radio::append - Append Option
    • UI\Controls\Radio::getSelected - Get Selected Option
    • UI\Controls\Radio::onSelected - Selected Handler
    • UI\Controls\Radio::setSelected - Set Selected Option
    • UI\Controls\Separator::__construct - Construct a new Separator
    • UI\Controls\Slider::getValue - Get Value
    • UI\Controls\Slider::onChange - Change Handler
    • UI\Controls\Slider::setValue - Set Value
    • UI\Controls\Slider::__construct - Construct a new Slider
    • UI\Controls\Spin::getValue - Get Value
    • UI\Controls\Spin::onChange - Change Handler
    • UI\Controls\Spin::setValue - Set Value
    • UI\Controls\Spin::__construct - Construct a new Spin
    • UI\Controls\Tab::append - Append Page
    • UI\Controls\Tab::delete - Delete Page
    • UI\Controls\Tab::hasMargin - Margin Detection
    • UI\Controls\Tab::insertAt - Insert Page
    • UI\Controls\Tab::pages - Page Count
    • UI\Controls\Tab::setMargin - Set Margin
    • UI\Draw\Brush::getColor - Get Color
    • UI\Draw\Brush::setColor - Set Color
    • UI\Draw\Brush::__construct - Construct a new Brush
    • UI\Draw\Brush\Gradient::addStop - Stop Manipulation
    • UI\Draw\Brush\Gradient::delStop - Stop Manipulation
    • UI\Draw\Brush\Gradient::setStop - Stop Manipulation
    • UI\Draw\Brush\LinearGradient::__construct - Construct a Linear Gradient
    • UI\Draw\Brush\RadialGradient::__construct - Construct a new Radial Gradient
    • UI\Draw\Color::getChannel - Color Manipulation
    • UI\Draw\Color::setChannel - Color Manipulation
    • UI\Draw\Color::__construct - Construct new Color
    • UI\Draw\Matrix::invert - Invert Matrix
    • UI\Draw\Matrix::isInvertible - Invertible Detection
    • UI\Draw\Matrix::multiply - Multiply Matrix
    • UI\Draw\Matrix::rotate - Rotate Matrix
    • UI\Draw\Matrix::scale - Scale Matrix
    • UI\Draw\Matrix::skew - Skew Matrix
    • UI\Draw\Matrix::translate - Translate Matrix
    • UI\Draw\Path::addRectangle - Draw a Rectangle
    • UI\Draw\Path::arcTo - Draw an Arc
    • UI\Draw\Path::bezierTo - Draw Bezier Curve
    • UI\Draw\Path::closeFigure - Close Figure
    • UI\Draw\Path::end - Finalize Path
    • UI\Draw\Path::lineTo - Draw a Line
    • UI\Draw\Path::newFigure - Draw Figure
    • UI\Draw\Path::newFigureWithArc - Draw Figure with Arc
    • UI\Draw\Path::__construct - Construct a new Path
    • UI\Draw\Pen::clip - Clip a Path
    • UI\Draw\Pen::fill - Fill a Path
    • UI\Draw\Pen::restore - Restore
    • UI\Draw\Pen::save - Save
    • UI\Draw\Pen::stroke - Stroke a Path
    • UI\Draw\Pen::transform - Matrix Transform
    • UI\Draw\Pen::write - Draw Text at Point
    • UI\Draw\Stroke::getCap - Get Line Cap
    • UI\Draw\Stroke::getJoin - Get Line Join
    • UI\Draw\Stroke::getMiterLimit - Get Miter Limit
    • UI\Draw\Stroke::getThickness - Get Thickness
    • UI\Draw\Stroke::setCap - Set Line Cap
    • UI\Draw\Stroke::setJoin - Set Line Join
    • UI\Draw\Stroke::setMiterLimit - Set Miter Limit
    • UI\Draw\Stroke::setThickness - Set Thickness
    • UI\Draw\Stroke::__construct - Construct a new Stroke
    • UI\Draw\Text\Font::getAscent - Font Metrics
    • UI\Draw\Text\Font::getDescent - Font Metrics
    • UI\Draw\Text\Font::getLeading - Font Metrics
    • UI\Draw\Text\Font::getUnderlinePosition - Font Metrics
    • UI\Draw\Text\Font::getUnderlineThickness - Font Metrics
    • UI\Draw\Text\Font::__construct - Construct a new Font
    • UI\Draw\Text\Font\Descriptor::getFamily - Get Font Family
    • UI\Draw\Text\Font\Descriptor::getItalic - Style Detection
    • UI\Draw\Text\Font\Descriptor::getSize - Size Detection
    • UI\Draw\Text\Font\Descriptor::getStretch - Style Detection
    • UI\Draw\Text\Font\Descriptor::getWeight - Weight Detection
    • UI\Draw\Text\Font\Descriptor::__construct - Construct a new Font Descriptor
    • UI\Draw\Text\Font\fontFamilies - Récupére les familles de polices
    • UI\Draw\Text\Layout::setColor - Set Color
    • UI\Draw\Text\Layout::setWidth - Set Width
    • UI\Draw\Text\Layout::__construct - Construct a new Text Layout
    • UI\Executor::kill - Stop Executor
    • UI\Executor::onExecute - Execution Callback
    • UI\Executor::setInterval - Interval Manipulation
    • UI\Executor::__construct - Construct a new Executor
    • UI\Menu::append - Append Menu Item
    • UI\Menu::appendAbout - Append About Menu Item
    • UI\Menu::appendCheck - Append Checkable Menu Item
    • UI\Menu::appendPreferences - Append Preferences Menu Item
    • UI\Menu::appendQuit - Append Quit Menu Item
    • UI\Menu::appendSeparator - Append Menu Item Separator
    • UI\Menu::__construct - Construct a new Menu
    • UI\MenuItem::disable - Disable Menu Item
    • UI\MenuItem::enable - Enable Menu Item
    • UI\MenuItem::isChecked - Detect Checked
    • UI\MenuItem::onClick - On Click Callback
    • UI\MenuItem::setChecked - Set Checked
    • UI\Point::at - Size Coercion
    • UI\Point::getX - Retrieves X
    • UI\Point::getY - Retrieves Y
    • UI\Point::setX - Set X
    • UI\Point::setY - Set Y
    • UI\Point::__construct - Construct a new Point
    • UI\quit - Quitte la boucle UI
    • UI\run - Entre dans la boucle UI
    • UI\Size::getHeight - Retrieves Height
    • UI\Size::getWidth - Retrives Width
    • UI\Size::of - Point Coercion
    • UI\Size::setHeight - Set Height
    • UI\Size::setWidth - Set Width
    • UI\Size::__construct - Construct a new Size
    • UI\Window::add - Add a Control
    • UI\Window::error - Affiche un message d'erreur
    • UI\Window::getSize - Get Window Size
    • UI\Window::getTitle - Get Title
    • UI\Window::hasBorders - Border Detection
    • UI\Window::hasMargin - Margin Detection
    • UI\Window::isFullScreen - Full Screen Detection
    • UI\Window::msg - Show Message Box
    • UI\Window::onClosing - Closing Callback
    • UI\Window::open - Open Dialog
    • UI\Window::save - Save Dialog
    • UI\Window::setBorders - Border Use
    • UI\Window::setFullScreen - Full Screen Use
    • UI\Window::setMargin - Margin Use
    • UI\Window::setSize - Set Size
    • UI\Window::setTitle - Window Title
    • UI\Window::__construct - Construct a new Window
    • uksort - Trie un tableau par ses clés en utilisant une fonction de rappel
    • umask - Change le "umask" courant
    • uniqid - Génère un identifiant unique
    • unixtojd - Convertit un timestamp UNIX en un jour Julien
    • unlink - Supprime un fichier
    • unpack - Déconditionne des données depuis une chaîne binaire
    • unregister_tick_function - Annule la fonction exécutée à chaque tick
    • unserialize - Crée une variable PHP à partir d'une valeur linéarisée
    • unset - Détruit une variable
    • untaint - Ne nettoie pas une chaîne
    • uopz_add_function - Adds non-existent function or method
    • uopz_allow_exit - Allows control over disabled exit opcode
    • uopz_backup - Sauvegarde une fonction
    • uopz_compose - Compose une classe
    • uopz_copy - Copie une fonction
    • uopz_delete - Supprime une fonction
    • uopz_del_function - Deletes previously added function or method
    • uopz_extend - Etend une classe à l'exécution
    • uopz_flags - Récupère ou défini les drapeaux d'une fonction ou d'une classe
    • uopz_function - Crée une fonction à l'exécution
    • uopz_get_exit_status - Retrieve the last set exit status
    • uopz_get_hook - Gets previously set hook on function or method
    • uopz_get_mock - Get the current mock for a class
    • uopz_get_property - Gets value of class or instance property
    • uopz_get_return - Gets a previous set return value for a function
    • uopz_get_static - Gets the static variables from function or method scope
    • uopz_implement - Implémente une interface à l'exécution
    • uopz_overload - Surcharge un opcode VM
    • uopz_redefine - Re-défini une constante
    • uopz_rename - Renomme une fonction à l'exécution
    • uopz_restore - Restaure une fonction sauvegardée
    • uopz_set_hook - Sets hook to execute when entering a function or method
    • uopz_set_mock - Use mock instead of class for new objects
    • uopz_set_property - Sets value of existing class or instance property
    • uopz_set_return - Provide a return value for an existing function
    • uopz_set_static - Sets the static variables in function or method scope
    • uopz_undefine - Supprime une constante
    • uopz_unset_hook - Removes previously set hook on function or method
    • uopz_unset_mock - Unset previously set mock
    • uopz_unset_return - Unsets a previously set return value for a function
    • urldecode - Décode une chaîne encodée URL
    • urlencode - Encode une chaîne en URL
    • user_error - Alias de trigger_error
    • use_soap_error_handler - Active le gestionnaire d'erreurs SOAP natif
    • usleep - Arrête l'exécution durant quelques microsecondes
    • usort - Trie un tableau en utilisant une fonction de comparaison
    • utf8_decode - Convertit une chaîne UTF-8 en ISO-8859-1
    • utf8_encode - Convertit une chaîne ISO-8859-1 en UTF-8
  • v
    • V8Js::executeString - Exécute une chaîne comme du code Javascript
    • V8Js::getExtensions - Retourne un tableau contenant les extensions enregistrées
    • V8Js::getPendingException - Retourne l'exception Javascript non attrapée restante
    • V8Js::registerExtension - Enregistre des extensions Javascript pour V8Js
    • V8Js::__construct - Construit un nouvel objet V8Js
    • V8JsException::getJsFileName - Le but de getJsFileName
    • V8JsException::getJsLineNumber - Le but de getJsLineNumber
    • V8JsException::getJsSourceLine - Le but de getJsSourceLine
    • V8JsException::getJsTrace - Le but de getJsTrace
    • variant::__construct - Constructeur de la classe variant
    • variant_abs - Retourne la valeur absolue d'un variant
    • variant_add - "Ajoute" deux valeurs de variants et retourne le résultat
    • variant_and - Effectue un ET entre deux variants et retourne le résultat
    • variant_cast - Convertit un variant en un nouvel objet variant de type différent
    • variant_cat - Assemble deux valeurs variantes ensemble et retourne le résultat
    • variant_cmp - Compare deux variants
    • variant_date_from_timestamp - Retourne une représentation date en variant d'un timestamp Unix
    • variant_date_to_timestamp - Convertit une valeur date/temps variante en un timestamp Unix
    • variant_div - Retourne le résultat de la division de deux variants
    • variant_eqv - Effectue une équivalence de bits de deux variants
    • variant_fix - Récupère la portion entière d'un variant
    • variant_get_type - Retourne le type d'un objet variant
    • variant_idiv - Convertit des variants en valeurs entières, et effectue alors une division
    • variant_imp - Exécute une implication sur les bits de deux variants
    • variant_int - Retourne la partie entière d'un variant
    • variant_mod - Divise deux variantes et retourne le reste
    • variant_mul - Multiplie les valeurs de deux variants
    • variant_neg - Effectue une négation logique sur un variant
    • variant_not - Exécute une négation sur les bits sur un variant
    • variant_or - Performe une disjonction logique sur deux variants
    • variant_pow - Retourne le résultat de la fonction puissance avec deux variants
    • variant_round - Arrondit le variant au nombre spécifié de décimales
    • variant_set - Assigne une nouvelle valeur pour un objet variant
    • variant_set_type - Convertit un variant en un autre type "sur-place"
    • variant_sub - Soustrait la valeur du variant de droite de la valeur de celui de gauche
    • variant_xor - Exécute une exclusion logique sur deux variants
    • VarnishAdmin::auth - S'Authentifie sur une instance Varnish
    • VarnishAdmin::ban - Ban des URLs en utilisant une expression VCL
    • VarnishAdmin::banUrl - Ban une URL en utilisant une expression VCL
    • VarnishAdmin::clearPanic - Efface les messages de panique de l'instance Varnish
    • VarnishAdmin::connect - Connexion à l'interface d'administration de l'instance Varnish
    • VarnishAdmin::disconnect - Déconnexion de l'interface d'administration d'une instance varnish
    • VarnishAdmin::getPanic - Récupère le dernier message de panique de l'instance Varnish
    • VarnishAdmin::getParams - Récupère les paramètres de configuration de l'instance Varnish courante
    • VarnishAdmin::isRunning - Vérifie si un processus esclave Varnish est actuellement en cours d'exécution
    • VarnishAdmin::setCompat - Définit le paramètre de configuration compat
    • VarnishAdmin::setHost - Définit le paramètre de configuration host
    • VarnishAdmin::setIdent - Définit le paramètre de configuration ident
    • VarnishAdmin::setParam - Définit un paramètre de configuration sur l'instance courante Varnish
    • VarnishAdmin::setPort - Définit le paramètre de configuration port
    • VarnishAdmin::setSecret - Définit le paramètre de configuration secret
    • VarnishAdmin::setTimeout - Définit le paramètre de configuration timeout
    • VarnishAdmin::start - Démarre un processus Varnish
    • VarnishAdmin::stop - Arrête un processus Varnish
    • VarnishAdmin::__construct - Constructeur VarnishAdmin
    • VarnishLog::getLine - Récupère la prochaine ligne de log
    • VarnishLog::getTagName - Récupère le nom de la balise représenté par son index
    • VarnishLog::__construct - Constructeur Varnishlog
    • VarnishStat::getSnapshot - Récupère les statistiques de l'instance courante Varnish
    • VarnishStat::__construct - Constructeur VarnishStat
    • var_dump - Affiche les informations d'une variable
    • var_export - Retourne le code PHP utilisé pour générer une variable
    • version_compare - Compare deux chaînes de version au format des versions PHP
    • vfprintf - Écrit une chaîne formatée dans un flux
    • virtual - Effectue une sous-requête Apache
    • vprintf - Affiche une chaîne formatée
    • vsprintf - Retourne une chaîne formatée
    • Vtiful\Kernel\Excel::addSheet - Ajoute une feuille de calcul
    • Vtiful\Kernel\Excel::autoFilter - Ajoute un filtre automatique
    • Vtiful\Kernel\Excel::constMemory - Ecrit un gros fichier avec une utilisation constante de la mémoire
    • Vtiful\Kernel\Excel::data - Ecrit des données
    • Vtiful\Kernel\Excel::fileName - Crée un nouveau fichier ainsi qu'une feuille de calcul
    • Vtiful\Kernel\Excel::getHandle - Récupère le gestionnaire de ressource
    • Vtiful\Kernel\Excel::header - Ecrit l'en-tête d'une feuille de calcul
    • Vtiful\Kernel\Excel::insertFormula - Insère une formule
    • Vtiful\Kernel\Excel::insertImage - Insère une image dans une cellule
    • Vtiful\Kernel\Excel::insertText - Ecrit du texte dans une cellule
    • Vtiful\Kernel\Excel::mergeCells - Fusionne des cellules
    • Vtiful\Kernel\Excel::output - Enregistre le fichier xlsx sur le disque
    • Vtiful\Kernel\Excel::setColumn - Définit le format d'une colonne
    • Vtiful\Kernel\Excel::setRow - Définit le format d'une ligne
    • Vtiful\Kernel\Excel::__construct - Constructeur de la classe Vtiful\Kernel\Excel
    • Vtiful\Kernel\Format::align - Définit l'alignement de la cellule
    • Vtiful\Kernel\Format::bold - Mise en gras
    • Vtiful\Kernel\Format::italic - Mise en italique
    • Vtiful\Kernel\Format::underline - Mise en souligné
  • w
    • Warning::__construct - Warning constructor
    • wddx_add_vars - Ajoute des variables à un paquet WDDX
    • wddx_deserialize - Délinéarise un paquet WDDX
    • wddx_packet_end - Clôt un paquet WDDX
    • wddx_packet_start - Commence un nouveau paquet WDDX avec une structure
    • wddx_serialize_value - Enregistre une valeur dans un paquet WDDX
    • wddx_serialize_vars - Enregistre plusieurs valeurs dans un paquet WDDX
    • WeakMap::count - Compte le nombre d'entrées du map
    • WeakMap::current - Retourne la valeur courante de l'itération
    • WeakMap::key - Retourne la clé courante de l'itérateur
    • WeakMap::next - Avance jusqu'au prochain élément du map
    • WeakMap::offsetExists - Vérifie si un objet est dans le map
    • WeakMap::offsetGet - Retourne la valeur pointée par un certain objet
    • WeakMap::offsetSet - Met à jour le map avec une nouvelle paire clé-valeur
    • WeakMap::offsetUnset - Supprime une entrée depuis le map
    • WeakMap::rewind - Réinitialise l'itérateur au début du map
    • WeakMap::valid - Vérifie si l'itérateur est toujours sur un élément map valide
    • WeakMap::__construct - Construit un nouveau map
    • Weakref::acquire - Acquière une forte référence sur un objet
    • Weakref::get - Retourne l'objet pointé par sa référence forte
    • Weakref::release - Libère une référence précédemment acquise
    • Weakref::valid - Vérifie si l'objet référencé existe toujours
    • Weakref::__construct - Construit une nouvelle référence forte
    • WeakReference::create - Créer une nouvelle référence faible
    • WeakReference::get - Récupère un objet faiblement référencé
    • WeakReference::__construct - Constructeur qui interdit l'initialisation
    • win32_continue_service - Reprise d'un service en pause
    • win32_create_service - Crée une nouvelle entrée pour service dans la base de données SCM
    • win32_delete_service - Supprime une entrée de service de la base de données SCM
    • win32_get_last_control_message - Retourne le dernier message de contrôle qui a été envoyé à ce service
    • win32_pause_service - Met en pause un service
    • win32_query_service_status - Questionne le statut d'un service
    • win32_send_custom_control - Envoyer un contrôle personnalisé au service
    • win32_set_service_exit_code - Définir ou renvoyer le code de sortie pour le service en cours d'exécution
    • win32_set_service_exit_mode - Définir ou renvoyer le mode de sortie pour le service en cours d'exécution
    • win32_set_service_status - Met à jour le statut d'un service
    • win32_start_service - Démarre un service
    • win32_start_service_ctrl_dispatcher - Enregistre un script avec SCM, alors il peut être interprété en tant que service avec le nom donné
    • win32_stop_service - Arrête un service
    • wincache_fcache_fileinfo - Extrait des informations sur les fichiers mis en cache dans le cache de fichiers
    • wincache_fcache_meminfo - Extrait des informations sur l'utilisation de la mémoire du cache de fichiers.
    • wincache_lock - Acquière un verrou exclusif sur une clé donnée
    • wincache_ocache_fileinfo - Extrait des informations sur les fichiers mis en cache dans le cache opcode
    • wincache_ocache_meminfo - Extrait des informations sur l'utilisation du cache opcode
    • wincache_refresh_if_changed - Actualise les entrées du cache pour les fichiers mis en cache
    • wincache_rplist_fileinfo - Récupère des informations du cache sur un chemin de fichier résolu
    • wincache_rplist_meminfo - Récupère des informations sur l'utilisation de la mémoire par le cache de chemin de fichier résolu
    • wincache_scache_info - Récupère des informations sur des fichiers mis en cache
    • wincache_scache_meminfo - Récupère des informations sur l'utilisation de la mémoire du cache
    • wincache_ucache_add - Ajoute une nouvelle variable au cache utilisateur
    • wincache_ucache_cas - Compare la variable avec son ancienne valeur et lui assigne une nouvelle valeur
    • wincache_ucache_clear - Supprime le contenu d'une entrée du cache utilisateur
    • wincache_ucache_dec - Décrémente la valeur associée à une clé
    • wincache_ucache_delete - Supprime les variables du cache utilisateur
    • wincache_ucache_exists - Vérifie si une variable existe dans le cache utilisateur
    • wincache_ucache_get - Récupère une variable stokée dans le cache utilisateur
    • wincache_ucache_inc - Incrémente la valeur associée à une clé
    • wincache_ucache_info - Récupère des informations sur des données stokées dans le cache utilisateur
    • wincache_ucache_meminfo - Récupère des informations sur l'utilisation mémoire du cache utilisateur
    • wincache_ucache_set - Ajoute une variable au cache utilisateur et écrase la variable si elle existe déjà dans le cache
    • wincache_unlock - Libère un verrou exclusif sur une clé donnée
    • wkhtmltox\Image\Converter::convert - Réalise une conversion d'image
    • wkhtmltox\Image\Converter::getVersion - Détermine la version du convertisseur
    • wkhtmltox\Image\Converter::__construct - Cré un nouveau convertisseur d'image
    • wkhtmltox\PDF\Converter::add - Ajoute un objet pour la conversion
    • wkhtmltox\PDF\Converter::convert - Lance la conversion PDF
    • wkhtmltox\PDF\Converter::getVersion - Détermine la version du convertisseur
    • wkhtmltox\PDF\Converter::__construct - Cré un nouveau convertisseur PDF
    • wkhtmltox\PDF\Object::__construct - Crée un nouvel objet PDF
    • wordwrap - Effectue la césure d'une chaîne
    • Worker::collect - Collect references to completed tasks
    • Worker::getStacked - Obtient la taille de pile restante
    • Worker::isShutdown - Détection de statut
    • Worker::isWorking - Détection de statut
    • Worker::shutdown - Arrêter le worker
    • Worker::stack - Empile la tâche
    • Worker::unstack - Dépile une tâche
  • x
    • xattr_get - Récupère un attribut étendu
    • xattr_list - Récupère une liste d'attributs étendus
    • xattr_remove - Efface un attribut étendu
    • xattr_set - Définit un attribut étendu
    • xattr_supported - Vérifie si un système de fichiers supporte les attributs étendus
    • xdiff_file_bdiff - Crée un diff binaire de 2 fichiers
    • xdiff_file_bdiff_size - Lit la taille d'un fichier créé lors de l'application d'un diff binaire
    • xdiff_file_bpatch - Patche un fichier avec un diff binaire
    • xdiff_file_diff - Créé un diff unifié entre deux fichiers
    • xdiff_file_diff_binary - Créé un diff binaire de deux fichier
    • xdiff_file_merge3 - Fusionne trois fichiers en un seul
    • xdiff_file_patch - Patche un fichier avec un diff unifié
    • xdiff_file_patch_binary - Alias de xdiff_file_bpatch
    • xdiff_file_rabdiff - Crée un diff binaire de 2 fichiers en utilisant l'algorithme polynomial de Rabin des empreintes digitales
    • xdiff_string_bdiff - Crée un diff binaire de 2 chaînes
    • xdiff_string_bdiff_size - Lit la taille d'un fichier créé en appliquant un diff binaire
    • xdiff_string_bpatch - Patche une chaîne avec un diff binaire
    • xdiff_string_diff - Créé un diff unifié entre deux chaînes
    • xdiff_string_diff_binary - Alias de xdiff_string_bdiff
    • xdiff_string_merge3 - Fusionne trois chaînes en une seule
    • xdiff_string_patch - Patche une chaîne avec un diff unifié
    • xdiff_string_patch_binary - Alias de xdiff_string_bpatch
    • xdiff_string_rabdiff - Crée un diff binaire de 2 chaînes en utilisant l'algorithme polynomial de Rabin des empreintes digitales
    • xhprof_disable - Stoppe le profilage xhprof
    • xhprof_enable - Démarre le profilage xhprof
    • xhprof_sample_disable - Stoppe le profilage xhprof sur échantillon
    • xhprof_sample_enable - Démarre le profilage en mode échantillonnage
    • XMLDiff\Base::diff - Produit la différence de deux documents XML
    • XMLDiff\Base::merge - Produit un nouveau document XML basé sur une différence
    • XMLDiff\Base::__construct - Constructeur
    • XMLDiff\DOM::diff - Trouve la différence de deux objets DOMDocument
    • XMLDiff\DOM::merge - Produit un DOMDocument fusionné
    • XMLDiff\File::diff - Effectue la différence entre deux documents XML
    • XMLDiff\File::merge - Fusionne un document XML
    • XMLDiff\Memory::diff - Différence entre deux documents XML
    • XMLDiff\Memory::merge - Fusionne un document XML
    • XMLReader::close - Ferme l'entrée XMLReader
    • XMLReader::expand - Retourne une copie du noeud courant comme un noeud d'objet DOM
    • XMLReader::getAttribute - Récupère la valeur d'un attribut par nom
    • XMLReader::getAttributeNo - Récupère la valeur d'un attribut par index
    • XMLReader::getAttributeNs - Récupère la valeur d'un attribut par nom local et URI
    • XMLReader::getParserProperty - Indique si la propriété spécifiée a été fixée
    • XMLReader::isValid - Indique si le document analysé est valide
    • XMLReader::lookupNamespace - Consulte l'espace de nom pour un préfixe
    • XMLReader::moveToAttribute - Déplace un curseur à un attribut nommé
    • XMLReader::moveToAttributeNo - Déplace le curseur à un attribut par index
    • XMLReader::moveToAttributeNs - Déplace le curseur à un attribut d'espace de nom
    • XMLReader::moveToElement - Positionne le curseur sur l'élément parent de l'attribut courant
    • XMLReader::moveToFirstAttribute - Positionne le curseur sur le premier attribut
    • XMLReader::moveToNextAttribute - Positionne le curseur sur le prochain attribut
    • XMLReader::next - Déplace le curseur au prochain noeud en sautant tous les sous arbres
    • XMLReader::open - Fixe le URI contenant le XML à analyser
    • XMLReader::read - Déplace le curseur sur le prochain noeud du document
    • XMLReader::readInnerXml - Lit le code XML du noeud courant
    • XMLReader::readOuterXml - Lit le code XML du noeud courant, y compris lui-même
    • XMLReader::readString - Lit le contenu du noeud courant sous forme de chaîne
    • XMLReader::setParserProperty - Fixe des options pour l'analyseur
    • XMLReader::setRelaxNGSchema - Fixe le nom du fichier ou l'URI pour le Schéma RelaxNG
    • XMLReader::setRelaxNGSchemaSource - Spécifie le schéma RelaxNG
    • XMLReader::setSchema - Valide le document avec XSD
    • XMLReader::XML - Fixe les données contenant le XML à analyser
    • xmlrpc_decode - Décode le XML en types PHP natifs
    • xmlrpc_decode_request - Décode le code XML en variables PHP natives
    • xmlrpc_encode - Génère le code XML pour une valeur PHP
    • xmlrpc_encode_request - Génère le XML pour une méthode
    • xmlrpc_get_type - Retourne le type XMLRPC d'une valeur PHP
    • xmlrpc_is_fault - Détermine si un tableau de valeurs représente un XMLRPC
    • xmlrpc_parse_method_descriptions - Décode le code XML en une liste de descriptions de méthodes
    • xmlrpc_server_add_introspection_data - Ajoute des données d'introspection
    • xmlrpc_server_call_method - Analyse une requête XML et appelle les méthodes associées
    • xmlrpc_server_create - Crée un serveur XMLRPC
    • xmlrpc_server_destroy - Détruit un serveur XMLRPC
    • xmlrpc_server_register_introspection_callback - Enregistre une fonction PHP pour générer la documentation
    • xmlrpc_server_register_method - Enregistre une fonction PHP avec une méthode
    • xmlrpc_set_type - Définit le type xmlrpc, base64 ou datetime, d'une valeur PHP
    • XMLWriter::endAttribute - Termine un attribut
    • XMLWriter::endCdata - Termine un bloc CDATA
    • XMLWriter::endComment - Termine un commentaire
    • XMLWriter::endDocument - Termine le document courant
    • XMLWriter::endDtd - Termine la DTD courante
    • XMLWriter::endDtdAttlist - Termine la liste des attributs de la DTD courante
    • XMLWriter::endDtdElement - Termine l'élément de la DTD courante
    • XMLWriter::endDtdEntity - Termine l'entité de la DTD courante
    • XMLWriter::endElement - Termine l'élément courant
    • XMLWriter::endPi - Termine le PI courant
    • XMLWriter::flush - Affiche le buffer courant
    • XMLWriter::fullEndElement - Termine l'élément courant
    • XMLWriter::openMemory - Crée un nouveau xmlwriter en utilisant la mémoire pour l'affichage des chaînes
    • XMLWriter::openUri - Crée un nouveau xmlwriter, en utilisant l'URI source pour l'affichage
    • XMLWriter::outputMemory - Retourne le buffer courant
    • XMLWriter::setIndent - Active ou non l'indentation
    • XMLWriter::setIndentString - Définit la chaîne à utiliser pour l'indentation
    • XMLWriter::startAttribute - Crée un attribut
    • XMLWriter::startAttributeNs - Crée un attribut pour l'espace de noms
    • XMLWriter::startCdata - Crée une balise CDATA
    • XMLWriter::startComment - Crée un commentaire
    • XMLWriter::startDocument - Crée un document
    • XMLWriter::startDtd - Crée une DTD
    • XMLWriter::startDtdAttlist - Crée une liste d'attributs pour la DTD
    • XMLWriter::startDtdElement - Crée un élément DTD
    • XMLWriter::startDtdEntity - Crée une entité DTD
    • XMLWriter::startElement - Crée un élément
    • XMLWriter::startElementNs - Crée un élément d'un espace de noms
    • XMLWriter::startPi - Crée une balise PI
    • XMLWriter::text - Écrit du texte
    • XMLWriter::writeAttribute - Écrit un attribut
    • XMLWriter::writeAttributeNs - Écrit un attribut d'un espace de noms
    • XMLWriter::writeCdata - Écrit un bloc CDATA
    • XMLWriter::writeComment - Écrit un commentaire
    • XMLWriter::writeDtd - Écrit une DTD
    • XMLWriter::writeDtdAttlist - Écrit une liste d'attributs DTD
    • XMLWriter::writeDtdElement - Écrit un élément DTD
    • XMLWriter::writeDtdEntity - Écrit une entité DTD
    • XMLWriter::writeElement - Écrit un élément
    • XMLWriter::writeElementNs - Écrit un élément d'un espace de noms
    • XMLWriter::writePi - Écrit la balise PI
    • XMLWriter::writeRaw - Écrit un texte XML brut
    • xml_error_string - Lit le message d'erreur de l'analyseur XML
    • xml_get_current_byte_index - Retourne l'index de l'octet courant d'un analyseur XML
    • xml_get_current_column_number - Retourne le numéro de colonne courant d'un analyseur XML
    • xml_get_current_line_number - Retourne le numéro de ligne courant d'un analyseur XML
    • xml_get_error_code - Récupère le code erreur de l'analyseur XML
    • xml_parse - Commence l'analyse d'un document XML
    • xml_parser_create - Création d'un analyseur XML
    • xml_parser_create_ns - Crée un analyseur XML
    • xml_parser_free - Détruit un analyseur XML
    • xml_parser_get_option - Lit les options d'un analyseur XML
    • xml_parser_set_option - Affecte les options d'un analyseur XML
    • xml_parse_into_struct - Analyse une structure XML
    • xml_set_character_data_handler - Affecte les gestionnaires de texte littéral
    • xml_set_default_handler - Affecte le gestionnaire XML par défaut
    • xml_set_element_handler - Affecte les gestionnaires de début et de fin de balise XML
    • xml_set_end_namespace_decl_handler - Configure le gestionnaire XML de données
    • xml_set_external_entity_ref_handler - Configure le gestionnaire XML de références externes
    • xml_set_notation_decl_handler - Configure le gestionnaire XML de notations
    • xml_set_object - Configure un objet comme analyseur XML
    • xml_set_processing_instruction_handler - Affecte les gestionnaires d'instructions exécutables
    • xml_set_start_namespace_decl_handler - Configure le gestionnaire de caractères
    • xml_set_unparsed_entity_decl_handler - Affecte les gestionnaires d'entités non déclarées
    • XSLTProcessor::getParameter - Récupère la valeur d'un paramètre
    • XSLTProcessor::getSecurityPrefs - Récupère les préférences de sécurité
    • XSLTProcessor::hasExsltSupport - Indique si PHP utilise EXSLT
    • XSLTProcessor::importStylesheet - Importe une feuille de style
    • XSLTProcessor::registerPHPFunctions - Active l'utilisation de PHP dans les feuilles de styles XSLT
    • XSLTProcessor::removeParameter - Efface un paramètre
    • XSLTProcessor::setParameter - Définit la valeur d'un paramètre
    • XSLTProcessor::setProfiling - Spécifie le fichier de profilage
    • XSLTProcessor::setSecurityPrefs - Définit les préférences de sécurité
    • XSLTProcessor::transformToDoc - Transforme en un document DOM
    • XSLTProcessor::transformToUri - Transforme en URI
    • XSLTProcessor::transformToXml - Transformer en XML
    • XSLTProcessor::__construct - Crée un nouvel objet XSLTProcessor
  • y
    • Yac::add - Stock un élément dans le cache
    • Yac::delete - Supprime un ou plusieurs éléments du cache
    • Yac::dump - Extraie les valeurs du cache
    • Yac::flush - Supprime toutes les valeurs mises en cache
    • Yac::get - Récupère un élément du cache
    • Yac::info - Statut du cache
    • Yac::set - Stock une valeur dans le cache
    • Yac::__construct - Constructeur
    • Yac::__get - Récupère un élément du cache
    • Yac::__set - Stock un élément dans le cache
    • Yaconf::get - Récupère une entrée
    • Yaconf::has - Détermine si une entrée existe
    • Yaf_Action_Abstract::execute - Point d'entrée de l'action
    • Yaf_Action_Abstract::getController - Récupère l'objet contrôleur
    • Yaf_Action_Abstract::getControllerName - Récupère le nom du contrôleur
    • Yaf_Application::app - Récupère une instance de l'application
    • Yaf_Application::bootstrap - Appelle bootstrap
    • Yaf_Application::clearLastError - Efface les informations de la dernière erreur
    • Yaf_Application::environ - Récupère la propriété environ
    • Yaf_Application::execute - Exécute une fonction de rappel
    • Yaf_Application::getAppDirectory - Récupère le dossier de l'application
    • Yaf_Application::getConfig - Récupère une instance de configuration
    • Yaf_Application::getDispatcher - Récupère une instance Yaf_Dispatcher
    • Yaf_Application::getLastErrorMsg - Récupère le message de la dernière erreur survenue
    • Yaf_Application::getLastErrorNo - Récupère le code de la dernière erreur survenue
    • Yaf_Application::getModules - Récupère les noms des modules définis
    • Yaf_Application::run - Démarre Yaf_Application
    • Yaf_Application::setAppDirectory - Modifie le dossier de l'application
    • Yaf_Application::__construct - Constructeur de Yaf_Application
    • Yaf_Application::__destruct - Le but de __destruct
    • Yaf_Config_Abstract::get - Permet de récupérer une valeur
    • Yaf_Config_Abstract::readonly - Vérifie si une configuration est en lecture seule
    • Yaf_Config_Abstract::set - Permet de définir une valeur
    • Yaf_Config_Abstract::toArray - Transforme en tableau
    • Yaf_Config_Ini::count - Compte tous les élements dans Yaf_Config.ini
    • Yaf_Config_Ini::current - Récupérer la valeur actuelle
    • Yaf_Config_Ini::key - Récupérer la clé de l'élément actuel
    • Yaf_Config_Ini::next - Avancer le pointeur interne
    • Yaf_Config_Ini::offsetExists - Le but de offsetExists
    • Yaf_Config_Ini::offsetGet - Le but de offsetGet
    • Yaf_Config_Ini::offsetSet - Le but de offsetSet
    • Yaf_Config_Ini::offsetUnset - Le but de offsetUnset
    • Yaf_Config_Ini::readonly - Le but de readonly
    • Yaf_Config_Ini::rewind - Le but de rewind
    • Yaf_Config_Ini::toArray - Retourne la configuration dans un tableau PHP
    • Yaf_Config_Ini::valid - Le but de valid
    • Yaf_Config_Ini::__construct - Constructeur Yaf_Config_Ini
    • Yaf_Config_Ini::__get - Récupérer un élément
    • Yaf_Config_Ini::__isset - Déterminer si une clé existe
    • Yaf_Config_Ini::__set - Le but de __set
    • Yaf_Config_Simple::count - Le but de count
    • Yaf_Config_Simple::current - Le but de current
    • Yaf_Config_Simple::key - Le but de key
    • Yaf_Config_Simple::next - Le but de next
    • Yaf_Config_Simple::offsetExists - Le but de offsetExists
    • Yaf_Config_Simple::offsetGet - Le but de offsetGet
    • Yaf_Config_Simple::offsetSet - Le but de offsetSet
    • Yaf_Config_Simple::offsetUnset - Le but de offsetUnset
    • Yaf_Config_Simple::readonly - Le but de readonly
    • Yaf_Config_Simple::rewind - Le but de rewind
    • Yaf_Config_Simple::toArray - Retourne un tableau PHP
    • Yaf_Config_Simple::valid - Le but de valid
    • Yaf_Config_Simple::__construct - Le but de __construct
    • Yaf_Config_Simple::__get - Le but de __get
    • Yaf_Config_Simple::__isset - Le but de __isset
    • Yaf_Config_Simple::__set - Le but de __set
    • Yaf_Controller_Abstract::display - Le but de display
    • Yaf_Controller_Abstract::forward - Transfère vers une autre action
    • Yaf_Controller_Abstract::getInvokeArg - Le but de getInvokeArg
    • Yaf_Controller_Abstract::getInvokeArgs - Le but de getInvokeArgs
    • Yaf_Controller_Abstract::getModuleName - Récupère le nom du module
    • Yaf_Controller_Abstract::getName - Récupère le nom du contrôleur
    • Yaf_Controller_Abstract::getRequest - Récupère l'objet de la demande courante
    • Yaf_Controller_Abstract::getResponse - Récupère l'objet de la réponse courante
    • Yaf_Controller_Abstract::getView - Récupère le moteur de visualisation
    • Yaf_Controller_Abstract::getViewpath - Le but de getViewpath
    • Yaf_Controller_Abstract::init - Initialisation du contrôleur
    • Yaf_Controller_Abstract::initView - Le but de initView
    • Yaf_Controller_Abstract::redirect - Redirige vers une URL
    • Yaf_Controller_Abstract::render - Affiche le rendu du template
    • Yaf_Controller_Abstract::setViewpath - Le but de setViewpath
    • Yaf_Controller_Abstract::__construct - Constructeur de Yaf_Controller_Abstract
    • Yaf_Dispatcher::autoRender - Active/désactive le rendu automatique
    • Yaf_Dispatcher::catchException - Active/désactive la récupération des exceptions
    • Yaf_Dispatcher::disableView - Désactive le moteur de visualisation
    • Yaf_Dispatcher::dispatch - Envoi une demande
    • Yaf_Dispatcher::enableView - Active le rendu de la vue
    • Yaf_Dispatcher::flushInstantly - Active/désactive l'envoi instantané
    • Yaf_Dispatcher::getApplication - Récupère l'application
    • Yaf_Dispatcher::getDefaultAction - Récupère le nom de l'action par défaut
    • Yaf_Dispatcher::getDefaultController - Récupère le nom du contrôleur par défaut
    • Yaf_Dispatcher::getDefaultModule - Récupère le nom du module par défaut
    • Yaf_Dispatcher::getInstance - Récupère l'instance du module d'envoi
    • Yaf_Dispatcher::getRequest - Récupère l'instance demandée
    • Yaf_Dispatcher::getRouter - Récupère l'instance routeur
    • Yaf_Dispatcher::initView - Initialise la vue et la retourne
    • Yaf_Dispatcher::registerPlugin - Enregistre un plugin
    • Yaf_Dispatcher::returnResponse - Le but de returnResponse
    • Yaf_Dispatcher::setDefaultAction - Modifie le nom par défaut de l'action
    • Yaf_Dispatcher::setDefaultController - Modifie le nom par défaut du controlleur
    • Yaf_Dispatcher::setDefaultModule - Modifie le nom par défaut du module
    • Yaf_Dispatcher::setErrorHandler - Définit un gestionnaire d'erreur personnalisé
    • Yaf_Dispatcher::setRequest - Le but de setRequest
    • Yaf_Dispatcher::setView - Définit un moteur de visualisation personnalisé
    • Yaf_Dispatcher::throwException - Active/désactive le lancement d'exceptions
    • Yaf_Dispatcher::__construct - Constructeur de Yaf_Dispatcher
    • Yaf_Exception::getPrevious - Le but de getPrevious
    • Yaf_Exception::__construct - Le but de __construct
    • Yaf_Loader::autoload - Le but de autoload
    • Yaf_Loader::clearLocalNamespace - Le but de clearLocalNamespace
    • Yaf_Loader::getInstance - Le but de getInstance
    • Yaf_Loader::getLibraryPath - Récupère le chemin de la bibliothèque
    • Yaf_Loader::getLocalNamespace - Récupère toutes les informations de tous les espaces de noms enregistrés
    • Yaf_Loader::getNamespacePath - Récupère le chemin d'un espace de noms enregistré
    • Yaf_Loader::import - Le but de import
    • Yaf_Loader::isLocalName - Le but de isLocalName
    • Yaf_Loader::registerLocalNamespace - Enregistre le préfixe local de la classe
    • Yaf_Loader::registerNamespace - Register namespace with searching path
    • Yaf_Loader::setLibraryPath - Modifie le chemin de la bibliothèque
    • Yaf_Loader::__construct - Le but de __construct
    • Yaf_Plugin_Abstract::dispatchLoopShutdown - Le but de dispatchLoopShutdown
    • Yaf_Plugin_Abstract::dispatchLoopStartup - Crochet avant une boucle de répétitionp
    • Yaf_Plugin_Abstract::postDispatch - Le but de postDispatch
    • Yaf_Plugin_Abstract::preDispatch - Le but de preDispatch
    • Yaf_Plugin_Abstract::preResponse - Le but de preResponse
    • Yaf_Plugin_Abstract::routerShutdown - Le but de routerShutdown
    • Yaf_Plugin_Abstract::routerStartup - Hook RouterStartup
    • Yaf_Registry::del - Supprime un élément du registre
    • Yaf_Registry::get - Récupère un élément depuis le registre
    • Yaf_Registry::has - Vérifie si un élément existe
    • Yaf_Registry::set - Ajoute un élément au registre
    • Yaf_Registry::__construct - Constructeur de la classe Yaf_Registry
    • Yaf_Request_Abstract::clearParams - Supprime tous les paramètres
    • Yaf_Request_Abstract::getActionName - Le but de getActionName
    • Yaf_Request_Abstract::getBaseUri - Le but de getBaseUri
    • Yaf_Request_Abstract::getControllerName - Le but de getControllerName
    • Yaf_Request_Abstract::getEnv - Récupère une variable ENV
    • Yaf_Request_Abstract::getException - Le but de getException
    • Yaf_Request_Abstract::getLanguage - Récupère la langue préférée du client
    • Yaf_Request_Abstract::getMethod - Récupère la méthode utilisée
    • Yaf_Request_Abstract::getModuleName - Le but de getModuleName
    • Yaf_Request_Abstract::getParam - Récupère un paramètre
    • Yaf_Request_Abstract::getParams - Récupère tous les paramètres
    • Yaf_Request_Abstract::getRequestUri - Le but de getRequestUri
    • Yaf_Request_Abstract::getServer - Récupère une variable SERVER
    • Yaf_Request_Abstract::isCli - Vérifie si la requête est une requête en ligne de commande
    • Yaf_Request_Abstract::isDispatched - Vérifie si la requête est une requête isDispatched
    • Yaf_Request_Abstract::isGet - Vérifie si la requête est une requête GET
    • Yaf_Request_Abstract::isHead - Vérifie si la requête est une requête HEAD
    • Yaf_Request_Abstract::isOptions - Vérifie si la requête est une requête OPTIONS
    • Yaf_Request_Abstract::isPost - Vérifie si la requête est une requête isPost
    • Yaf_Request_Abstract::isPut - Vérifie si la requête est une requête PUT
    • Yaf_Request_Abstract::isRouted - Vérifie si la requête a été routée
    • Yaf_Request_Abstract::isXmlHttpRequest - Vérifie si la requête est une requête AJAX
    • Yaf_Request_Abstract::setActionName - Définie le nom de l'action
    • Yaf_Request_Abstract::setBaseUri - Défini l'URI de base
    • Yaf_Request_Abstract::setControllerName - Définie le nom du contrôleur
    • Yaf_Request_Abstract::setDispatched - Le but de setDispatched
    • Yaf_Request_Abstract::setModuleName - Définit le nom du module
    • Yaf_Request_Abstract::setParam - Définie un paramètre dans une requête
    • Yaf_Request_Abstract::setRequestUri - Le but de setRequestUri
    • Yaf_Request_Abstract::setRouted - Le but de setRouted
    • Yaf_Request_Http::get - Récupère la variable depuis le client
    • Yaf_Request_Http::getCookie - Récupère une variable Cookie
    • Yaf_Request_Http::getFiles - Le but de getFiles
    • Yaf_Request_Http::getPost - Récupère une variable POST
    • Yaf_Request_Http::getQuery - Récupère un paramètre de la requête
    • Yaf_Request_Http::getRaw - Récupère le corps brut de la requête
    • Yaf_Request_Http::getRequest - Le but de getRequest
    • Yaf_Request_Http::isXmlHttpRequest - Vérifie s'il s'agit d'une requête Ajax
    • Yaf_Request_Http::__construct - Constructeur de __construct
    • Yaf_Request_Simple::get - Le but de get
    • Yaf_Request_Simple::getCookie - Le but de getCookie
    • Yaf_Request_Simple::getFiles - Le but de getFiles
    • Yaf_Request_Simple::getPost - Le but de getPost
    • Yaf_Request_Simple::getQuery - Le but de getQuery
    • Yaf_Request_Simple::getRequest - Le but de getRequest
    • Yaf_Request_Simple::isXmlHttpRequest - Détermine si la requête est une requête AJAX
    • Yaf_Request_Simple::__construct - Constructeur de __construct
    • Yaf_Response_Abstract::appendBody - Ajoute le corps de la réponse
    • Yaf_Response_Abstract::clearBody - Supprime tous les corps de réponse existants
    • Yaf_Response_Abstract::clearHeaders - Supprime toutes les en-têtes définies
    • Yaf_Response_Abstract::getBody - Récupère un contenu existant
    • Yaf_Response_Abstract::getHeader - Le but de getHeader
    • Yaf_Response_Abstract::prependBody - Le but de prependBody
    • Yaf_Response_Abstract::response - Envoie la réponse
    • Yaf_Response_Abstract::setAllHeaders - Le but de setAllHeaders
    • Yaf_Response_Abstract::setBody - Définit le contenu de la réponse
    • Yaf_Response_Abstract::setHeader - Définit l'en-tête de réponse
    • Yaf_Response_Abstract::setRedirect - Le but de setRedirect
    • Yaf_Response_Abstract::__construct - Le but de __construct
    • Yaf_Response_Abstract::__destruct - Le but de __destruct
    • Yaf_Response_Abstract::__toString - Récupère tout le corps sous la forme d'une chaîne de caractères
    • Yaf_Router::addConfig - Ajoute une route définie dans la configuration d'un routeur
    • Yaf_Router::addRoute - Ajoute une nouvelle route dans un routeur
    • Yaf_Router::getCurrentRoute - Récupère le nom effectif de la route
    • Yaf_Router::getRoute - Récupère une route via son nom
    • Yaf_Router::getRoutes - Récupère les routes enregistrées
    • Yaf_Router::route - Le but de route
    • Yaf_Router::__construct - Constructeur de la classe Yaf_Router
    • Yaf_Route_Interface::assemble - Assemble une requête
    • Yaf_Route_Interface::route - Route une requête
    • Yaf_Route_Map::assemble - Assemble une URL
    • Yaf_Route_Map::route - Le but route
    • Yaf_Route_Map::__construct - Le but de __construct
    • Yaf_Route_Regex::assemble - Assemble une URL
    • Yaf_Route_Regex::route - Le but de route
    • Yaf_Route_Regex::__construct - Contructeur Yaf_Route_Regex
    • Yaf_Route_Rewrite::assemble - Assemble une URL
    • Yaf_Route_Rewrite::route - Le but de route
    • Yaf_Route_Rewrite::__construct - Constructeur Yaf_Route_Rewrite
    • Yaf_Route_Simple::assemble - Assemble une URL
    • Yaf_Route_Simple::route - Route une requête
    • Yaf_Route_Simple::__construct - Constructeur de la classe Yaf_Route_Simple
    • Yaf_Route_Static::assemble - Assemble une URL
    • Yaf_Route_Static::match - Le but de match
    • Yaf_Route_Static::route - Route une requête
    • Yaf_Route_Supervar::assemble - Assemble une URL
    • Yaf_Route_Supervar::route - Le but de route
    • Yaf_Route_Supervar::__construct - Le but de __construct
    • Yaf_Session::count - Le but de count
    • Yaf_Session::current - Le but de current
    • Yaf_Session::del - Le but de del
    • Yaf_Session::getInstance - Le but de getInstance
    • Yaf_Session::has - Le but de has
    • Yaf_Session::key - Le but de key
    • Yaf_Session::next - Le but de next
    • Yaf_Session::offsetExists - Le but de offsetExists
    • Yaf_Session::offsetGet - Le but de offsetGet
    • Yaf_Session::offsetSet - Le but de offsetSet
    • Yaf_Session::offsetUnset - Le but de offsetUnset
    • Yaf_Session::rewind - Le but de rewind
    • Yaf_Session::start - Le but de start
    • Yaf_Session::valid - Le but de valid
    • Yaf_Session::__construct - Le constructeur de __construct
    • Yaf_Session::__get - Le but de __get
    • Yaf_Session::__isset - Le but de __isset
    • Yaf_Session::__set - Le but de __set
    • Yaf_Session::__unset - Le but de __unset
    • Yaf_View_Interface::assign - Assigne une valeur au moteur de rendu
    • Yaf_View_Interface::display - Construit et affiche un template
    • Yaf_View_Interface::getScriptPath - Le but de getScriptPath
    • Yaf_View_Interface::render - Construit un template
    • Yaf_View_Interface::setScriptPath - Le but de setScriptPath
    • Yaf_View_Simple::assign - Assigne une ou plusieurs variables
    • Yaf_View_Simple::assignRef - Le but de assignRef
    • Yaf_View_Simple::clear - Efface les valeurs assignées
    • Yaf_View_Simple::display - Construit et affiche
    • Yaf_View_Simple::eval - Évalue un template
    • Yaf_View_Simple::getScriptPath - Récupère le dossier contenant les templates
    • Yaf_View_Simple::render - Construit un template
    • Yaf_View_Simple::setScriptPath - Définit le dossier contenant les templates
    • Yaf_View_Simple::__construct - Constructeur de la classe Yaf_View_Simple
    • Yaf_View_Simple::__get - Récupère une variable assignée
    • Yaf_View_Simple::__isset - Le but de __isset
    • Yaf_View_Simple::__set - Définit une valeur du moteur
    • yaml_emit - Retourne une chaîne représentant une valeur YAML
    • yaml_emit_file - Envoie une représentation YAML vers un fichier
    • yaml_parse - Analyse un flux YAML
    • yaml_parse_file - Analyse un flux YAML depuis un fichier
    • yaml_parse_url - Analyse un flux YAML depuis une URL
    • Yar_Client::setOpt - Défini le contexte d'appel
    • Yar_Client::__call - Service d'appel
    • Yar_Client::__construct - Crée un client
    • Yar_Client_Exception::getType - Récupérer le type de l'exception
    • Yar_Concurrent_Client::call - Enregistre un appel concurrent
    • Yar_Concurrent_Client::loop - Envoi tous les appels
    • Yar_Concurrent_Client::reset - Nettoie tous les appels enregistré
    • Yar_Server::handle - Démarre un serveur RPC
    • Yar_Server::__construct - Enregistre un serveur
    • Yar_Server_Exception::getType - Récupérer le type de l'exception
    • yaz_addinfo - Retourne plus de détails après une erreur
    • yaz_ccl_conf - Configure l'analyseur CCL
    • yaz_ccl_parse - Appelle l'analyseur CCL
    • yaz_close - Ferme une connexion YAZ
    • yaz_connect - Prépare une connexion à un serveur Z39.50
    • yaz_database - Spécifie la base d'une session YAZ
    • yaz_element - Spécifie le type d'éléments YAZ à lire
    • yaz_errno - Retourne le numéro d'erreur
    • yaz_error - Retourne une description de l'erreur
    • yaz_es - Prépare pour une Requête de Service Étendu
    • yaz_es_result - Inspecte le résultat d'un service étendu
    • yaz_get_option - Retourne la valeur d'une option de connexion YAZ
    • yaz_hits - Retourne le nombre de résultats de la dernière recherche
    • yaz_itemorder - Prépare une requête Z39.50 Item Order avec le paquet ILL-Request
    • yaz_present - Prépare à la lecture (Z39.50 present)
    • yaz_range - Spécifie le nombre maximal de résultats à lire
    • yaz_record - Retourne un résultat
    • yaz_scan - Prépare un scan YAZ
    • yaz_scan_result - Retourne le résultat d'un scan
    • yaz_schema - Spécifie le schéma de lecture
    • yaz_search - Prépare une recherche
    • yaz_set_option - Modifie une ou plusieurs options de connexion YAZ
    • yaz_sort - Configure les critères de tri
    • yaz_syntax - Spécifie la syntaxe de lecture des lignes
    • yaz_wait - Attend l'exécution d'une requête
  • z
    • zend_thread_id - Retourne un identifiant unique du thread courant
    • zend_version - Lit la version courante du moteur Zend
    • ZipArchive::addEmptyDir - Ajoute un nouveau dossier à une archive Zip
    • ZipArchive::addFile - Ajoute un fichier à l'archive ZIP depuis le chemin fourni
    • ZipArchive::addFromString - Ajoute un fichier à une archive ZIP en utilisant son contenu
    • ZipArchive::addGlob - Ajoute des fichiers d'un dossier en utilisant un masque glob
    • ZipArchive::addPattern - Ajoute des fichiers d'un dossier en utilisant une expression régulière PCRE
    • ZipArchive::close - Ferme l'archive active
    • ZipArchive::count - Compte le nombre de fichiers dans l'archive
    • ZipArchive::deleteIndex - Efface une entrée de l'archive en utilisant son index
    • ZipArchive::deleteName - Efface une entrée dans l'archive en utilisant son nom
    • ZipArchive::extractTo - Extrait le contenu de l'archive
    • ZipArchive::getArchiveComment - Retourne le commentaire de l'archive ZIP
    • ZipArchive::getCommentIndex - Retourne le commentaire d'une entrée
    • ZipArchive::getCommentName - Retourne le commentaire d'une entrée en utilisant le nom de l'entrée
    • ZipArchive::getExternalAttributesIndex - Récupère les attributs externes d'une entrée définie par son index
    • ZipArchive::getExternalAttributesName - Récupère les attributs externes d'une entrée définie par son nom
    • ZipArchive::getFromIndex - Retourne le contenu d'une entrée en utilisant son index
    • ZipArchive::getFromName - Retourne le contenu de l'entrée en utilisant son nom
    • ZipArchive::getNameIndex - Retourne le nom d'une entrée en utilisant son index
    • ZipArchive::getStatusString - Retourne le message du statut de l'erreur, du système ou de zip
    • ZipArchive::getStream - Récupère un gestionnaire de fichier pour l'entrée définie par son nom (lecture seule)
    • ZipArchive::isCompressionMethodSupported - Vérifie si une méthode de compression est supportée par libzip
    • ZipArchive::isEncryptionMethodSupported - Vérifie si une méthode de cryptage est supportée par libzip
    • ZipArchive::locateName - Retourne l'index d'une entrée de l'archive
    • ZipArchive::open - Ouvre une archive ZIP
    • ZipArchive::registerCancelCallback - Enregistre une fonction de appel permettant d'annuler pendant la clôture d'une archive
    • ZipArchive::registerProgressCallback - Enregistre une fonction de rappel pour permettre des mises à jour pendant la fermeture de l'archive
    • ZipArchive::renameIndex - Renomme une entrée définie par son index
    • ZipArchive::renameName - Renomme une entrée définie par son nom
    • ZipArchive::replaceFile - Remplace un fichier d'une archive ZIP
    • ZipArchive::setArchiveComment - Définit le commentaire d'une archive ZIP
    • ZipArchive::setCommentIndex - Définit le commentaire d'une entrée définie par son index
    • ZipArchive::setCommentName - Définit le commentaire d'une entrée spécifiée par son nom
    • ZipArchive::setCompressionIndex - Définit la méthode de compression d'une entrée définit par son index
    • ZipArchive::setCompressionName - Définit la méthode de compression d'une entrée définit par son nom
    • ZipArchive::setEncryptionIndex - Définit la méthode de chiffrement d'une entrée définit par son index
    • ZipArchive::setEncryptionName - Définit la méthode de chiffrement d'une entrée définit par son nom
    • ZipArchive::setExternalAttributesIndex - Définit les attributs externes d'une entrée définie par son index
    • ZipArchive::setExternalAttributesName - Définit les attributs externes d'une entrée définie par son nom
    • ZipArchive::setMtimeIndex - Définit la date de modification d'une entrée
    • ZipArchive::setMtimeName - Définit le date de modification d'une entée par son nom
    • ZipArchive::setPassword - Définit le mot de passe de l'archive active
    • ZipArchive::statIndex - Récupère les détails d'une entrée définie par son index
    • ZipArchive::statName - Récupère les détails de l'entrée définie par son nom
    • ZipArchive::unchangeAll - Annule toutes les modifications faites sur l'archive
    • ZipArchive::unchangeArchive - Annule toutes les modifications globales faites sur l'archive
    • ZipArchive::unchangeIndex - Annule toutes les modifications faites sur une entrée, définie par nom index
    • ZipArchive::unchangeName - Annule toutes les modifications faites sur une entrée, définie par son nom
    • zip_close - Ferme une archive Zip
    • zip_entry_close - Ferme un dossier d'archive
    • zip_entry_compressedsize - Lit la taille compressée d'un dossier d'archives
    • zip_entry_compressionmethod - Lit la méthode de compression utilisée sur un dossier d'archives
    • zip_entry_filesize - Lit la taille décompressée d'un dossier d'archives
    • zip_entry_name - Lit le nom d'un dossier d'archives
    • zip_entry_open - Ouvre un dossier d'archives en lecture
    • zip_entry_read - Lit le contenu d'un fichier dans un dossier
    • zip_open - Ouvre une archive ZIP
    • zip_read - Lit la prochaine entrée dans une archive ZIP
    • zlib:// - Flux de compression
    • zlib_decode - Décompresse des données encodées raw/gzip/zlib
    • zlib_encode - Compresse des données avec l'encodage spécifié
    • zlib_get_coding_type - Retourne la méthode de compression utilisée avec Gzip
    • ZMQ::__construct - ZMQ constructor
    • ZMQContext::getOpt - Récupère une option de contexte
    • ZMQContext::getSocket - Crée un nouveau socket
    • ZMQContext::isPersistent - Vérifie si le contexte est persistent
    • ZMQContext::setOpt - Défini une option de socket
    • ZMQContext::__construct - Construit un nouvel objet ZMQContext
    • ZMQDevice::getIdleTimeout - Récupère le délai d'attente maximal d'inactivité
    • ZMQDevice::getTimerTimeout - Récupère le délai d'attente maximal du timer
    • ZMQDevice::run - Exécute le nouveau périphérique
    • ZMQDevice::setIdleCallback - Défini la fonction de rappel d'inactivité
    • ZMQDevice::setIdleTimeout - Défini le délai d'attente maximal d'inactivité
    • ZMQDevice::setTimerCallback - Défini la fonction de rappel du timer
    • ZMQDevice::setTimerTimeout - Défini le délai d'attente maximal du timer
    • ZMQDevice::__construct - Construit un nouveau périphérique
    • ZMQPoll::add - Ajoute un élément dans le poll
    • ZMQPoll::clear - Supprime tous les éléments du poll
    • ZMQPoll::count - Compte les éléments du poll
    • ZMQPoll::getLastErrors - Récupère les erreurs du poll
    • ZMQPoll::poll - Sonde les éléments
    • ZMQPoll::remove - Supprime un élément du poll
    • ZMQSocket::bind - Lie un socket
    • ZMQSocket::connect - Connecte le socket
    • ZMQSocket::disconnect - Déconnecte un socket
    • ZMQSocket::getEndpoints - Récupère la liste des points finaux
    • ZMQSocket::getPersistentId - Récupère l'ID persistent
    • ZMQSocket::getSocketType - Récupère le type du socket
    • ZMQSocket::getSockOpt - Récupère une option du socket
    • ZMQSocket::isPersistent - Vérifie si le socket est persistent
    • ZMQSocket::recv - Recoit un message
    • ZMQSocket::recvMulti - Recoit un message multipart
    • ZMQSocket::send - Envoi un message
    • ZMQSocket::sendmulti - Envoi un message multipart
    • ZMQSocket::setSockOpt - Défini une option de socket
    • ZMQSocket::unbind - Dé-lie le socket
    • ZMQSocket::__construct - Construit un nouveau ZMQSocket
    • Zookeeper::addAuth - Specify application credentials
    • Zookeeper::close - Close the zookeeper handle and free up any resources
    • Zookeeper::connect - Create a handle to used communicate with zookeeper
    • Zookeeper::create - Create a node synchronously
    • Zookeeper::delete - Delete a node in zookeeper synchronously
    • Zookeeper::exists - Checks the existence of a node in zookeeper synchronously
    • Zookeeper::get - Gets the data associated with a node synchronously
    • Zookeeper::getAcl - Gets the acl associated with a node synchronously
    • Zookeeper::getChildren - Lists the children of a node synchronously
    • Zookeeper::getClientId - Return the client session id, only valid if the connections is currently connected (ie. last watcher state is ZOO_CONNECTED_STATE)
    • Zookeeper::getConfig - Get instance of ZookeeperConfig
    • Zookeeper::getRecvTimeout - Return the timeout for this session, only valid if the connections is currently connected (ie. last watcher state is ZOO_CONNECTED_STATE). This value may change after a server re-connect
    • Zookeeper::getState - Get the state of the zookeeper connection
    • Zookeeper::isRecoverable - Checks if the current zookeeper connection state can be recovered
    • Zookeeper::set - Sets the data associated with a node
    • Zookeeper::setAcl - Sets the acl associated with a node synchronously
    • Zookeeper::setDebugLevel - Sets the debugging level for the library
    • Zookeeper::setDeterministicConnOrder - Enable/disable quorum endpoint order randomization
    • Zookeeper::setLogStream - Sets the stream to be used by the library for logging
    • Zookeeper::setWatcher - Set a watcher function
    • Zookeeper::__construct - Create a handle to used communicate with zookeeper
    • ZookeeperConfig::add - Add servers to the ensemble
    • ZookeeperConfig::get - Gets the last committed configuration of the ZooKeeper cluster as it is known to the server to which the client is connected, synchronously
    • ZookeeperConfig::remove - Remove servers from the ensemble
    • ZookeeperConfig::set - Change ZK cluster ensemble membership and roles of ensemble peers
    • zookeeper_dispatch - Calls callbacks for pending operations
  • _
    • __autoload - Tente de charger une classe indéfinie
    • __halt_compiler - Stoppe l'exécution du compilateur

User Contributed Notes

tudorsfatosu at yahoo dot dot com 20-Jun-2019 01:18
A new update regarding the number of entries in the list. We are currently at 11033 entries, in June 2019
crabovwik at yandex dot ru 07-Jan-2019 04:40
Today 07-01-2019 [dd.mm.yyyy]

10934 functions in this list ??
valbou26 at hotmail dot com 13-Apr-2018 09:29
Today : 2018-04-13
10641 functions in this list !

Keep growing ;)
Pieter Bootsma 10-Nov-2017 10:11
As of today, 10-11-2017 [dd-mm-yyyy], there are exactly 10102 functions listed above.
Geordy James 21-Apr-2017 06:18
In case anybody wondering as of 21/04/2017 [dd/mm/yyyy] there are exactly 9957 Functions listed above.
php at vanviegen dot net 14-Feb-2017 08:23
Here's a little script that scrapes all PHP function names from this page, and outputs a prefix-compressed Perl Compatible Regular Expression matching them. Useful for syntax highlighting.

<?php

$html = file_get_contents('http://php.net/manual/en/indexes.functions.php');

preg_match_all('/<li><a href="function.[^>]*>([a-zA-Z0-9_]*)<\/a>/', $html, $matches);
$funcs = $matches[1];

print '\b(?:';
$prefixes = [''];

foreach($funcs as $i => $func) {
    while(substr($func, 0, strlen($prefixes[0])) !== $prefixes[0]) {
        print ")";
        array_shift($prefixes);
    }
    if ($i) print '|';

    while(true) {
        $common = $func;
        for($j = $i+1; $j < count($funcs); $j++) {
            $lookAhead = $funcs[$j];
            $maxLen = min(strlen($lookAhead), strlen($func));
            for($ch = 0; $ch < $maxLen; $ch++) {
                if ($lookAhead[$ch] !== $func[$ch]) break;
            }
            $newCommon = substr($common, 0, $ch);
            if (strlen($newCommon) < strlen($prefixes[0])+2) break;
            $common = $newCommon;
        }
        if ($j < $i+4) break; // at least 4 functions with a common prefix of at least 2 chars
        print substr($common, strlen($prefixes[0])) . "(?:";
        array_unshift($prefixes, $common);
    }

    print substr($func, strlen($prefixes[0]));
}

print ')\b';
pn at bptv dot eu 13-Jul-2016 09:02
There are (07/13/2016 [mm/dd/yyyy]) exactly 9455 Functions listed above.
DIA 14-Apr-2016 09:42
Total number of functions listed above: 9450.
(04/14/2016 [mm/dd/yyyy])
M.A.Y 01-Jan-2016 07:39
Total number of php functions/methods listed above are 9634.
Today's date is 1/1/2016. (mm/dd/yy)
counter at county dot co 07-Apr-2015 02:17
In case anyone was wondering, the total function/method count in this list as of this date is exactly 9457


Liste d'examples

Liste de tous les exemples du manuel

  • Example#0 - Exemple d'introduction
  • Example#1 - Notre premier script PHP : bonjour.php
  • Example#2 - Récupération des informations du système depuis PHP
  • Example#3 - Afficher le contenu d'une variable (élément de tableau)
  • Example#4 - Exemple utilisant les structures de contrôle et les fonctions
  • Example#5 - Passer du mode PHP au mode HTML et vice-versa
  • Example#6 - Un simple formulaire HTML
  • Example#7 - Afficher des données issues d'un formulaire
  • Example#8 - Instructions d'installation de PHP (en module Apache)
  • Example#9 - Instructions d'installation (installation en tant que module statique d'Apache) de PHP
  • Example#10 - Exemples de commandes pour le redémarrage d'apache
  • Example#11 -
  • Example#12 -
  • Example#13 -
  • Example#14 -
  • Example#15 -
  • Example#16 -
  • Example#17 -
  • Example#18 -
  • Example#19 -
  • Example#20 -
  • Example#21 -
  • Example#22 -
  • Example#23 -
  • Example#24 - Portion du fichier lighttpd.conf
  • Example#25 - Appel des répondeurs FastCGI
  • Example#26 - Connexion à des instances distantes de php-fastcgi
  • Example#27 -
  • Example#28 -
  • Example#29 - Exemple d'installation de PHP sous OpenBSD avec Ports
  • Example#30 - Exemple d'installation sous Debian avec Apache 2
  • Example#31 - Stopper et démarrer Apache une fois PHP installé
  • Example#32 - Méthodes pour lister les paquets PHP 5 supplémentaires
  • Example#33 - Installer PHP avec MySQL et cURL
  • Example#34 - Configuration recommandée pour OpCache
  • Example#35 - Configuration recommandée pour WinCache
  • Example#36 - Ligne de commande pour configurer IIS et PHP
  • Example#37 - Structure d'un paquet PHP 5
  • Example#38 - Options de configuration de CGI et FastCGI du fichier php.ini
  • Example#39 - Configuration de l'extension FastCGI pour gérer les requêtes PHP
  • Example#40 - Configuration des permissions d'accès
  • Example#41 - Configuration du recyclage FastCGI et PHP
  • Example#42 - Configuration du délai d'expiration FastCGI
  • Example#43 - Modification du dossier contenant le fichier php.ini
  • Example#44 - Options CGI et FastCGI dans le fichier php.ini
  • Example#45 - Création d'une file de processus IIS FastCGI
  • Example#46 - Création d'un gestionnaire de mapping pour les requêtes PHP
  • Example#47 - Déterminer le compte utilisé comme identité anonyme sous IIS
  • Example#48 - Configuration des permissions d'accès aux fichiers
  • Example#49 - Définir index.php comme document par défaut sous IIS
  • Example#50 - Configuration du recyclage FastCGI et PHP
  • Example#51 - Configuration du délai d'expiration FastCGI
  • Example#52 - Modification du dossier contenant le fichier php.ini
  • Example#53 - PHP comme module Apache 1.3.x
  • Example#54 - PHP et Apache 1.3.x en tant que CGI
  • Example#55 - PHP et Apache 2.x comme gestionnaire
  • Example#56 -
  • Example#57 - PHP et Apache 2.x en tant que CGI
  • Example#58 - Configuration d'Apache pour exécuter PHP en tant que FastCGI
  • Example#59 - Configuration ISAPI de Sambar
  • Example#60 - Activer l'extension Bzip2 pour PHP-Windows
  • Example#61 - Modification du registre
  • Example#62 - Passer des variables d'environnement et des paramètres PHP à un pool
  • Example#63 - Définit les paramètres PHP dans le fichier nginx.conf
  • Example#64 - Appel de la fonction phpinfo
  • Example#65 - Les variables d'environnement dans un fichier php.ini
  • Example#66 - Extrait du php.ini
  • Example#67 - Exemple de configuration Apache
  • Example#68 - Balises d'ouvertures et de fermetures PHP
  • Example#69 - Echappement avancé en utilisant des conditions
  • Example#70 - Exemple montrant que la balise fermente englobe la nouvelle ligne qui suit
  • Example#71 - Exemple de commentaire
  • Example#72 - Les commentaires vont jusqu'à la fin de la ligne
  • Example#73 - Les commentaires de type C
  • Example#74 - Les entiers littéraux
  • Example#75 - Dépassement d'entier sur un système 32-bit
  • Example#76 - Dépassement d'entier sur un système 64-bit
  • Example#77 - Exemple invalide
  • Example#78 - Exemple valide
  • Example#79 - Exemple de chaînes Heredoc
  • Example#80 - Exemple d'utilisation de Heredoc pour passer des arguments
  • Example#81 - Utilisation de Heredoc pour initialiser des valeurs statiques
  • Example#82 - Utilisation des guillemets doubles avec Heredoc
  • Example#83 - Exemple de chaîne Nowdoc
  • Example#84 - Exemple de chaîne Nowdoc avec des variables
  • Example#85 - Exemple avec des données statiques
  • Example#86 - Exemple de la syntaxe simple
  • Example#87 - Indices numériques négatifs
  • Example#88 - Quelques exemples de chaînes
  • Example#89 - Exemple de Positions de Chaîne Invalide
  • Example#90 - Un tableau simple
  • Example#91 - Exemple sur la modification de type et l'écrasement
  • Example#92 - Exemple avec des clés de type int et string
  • Example#93 - Tableaux indexés sans clé
  • Example#94 - Exemple avec des clés seulement pour quelques éléments
  • Example#95 - Exemple complexe sur la modification de type et l'écrasement
  • Example#96 - Accès aux éléments d'un tableau
  • Example#97 - Faire référence à un tableau à la sortie d'une fonction ou d'une méthode
  • Example#98 - Utilisation de array()
  • Example#99 - Collection
  • Example#100 - Modification d'un élément dans la boucle
  • Example#101 - Indexation commençant à 1
  • Example#102 - Remplissage d'un tableau
  • Example#103 - Tri d'un tableau
  • Example#104 - Tableaux récursifs et multidimensionnels
  • Example#105 - Exemple de type d'argument itérable
  • Example#106 - Exemple de valeur par défaut d'un argument itérable
  • Example#107 - Exemple de type de retour itérable.
  • Example#108 - Exemple de type de retour itérable d'un générateur
  • Example#109 - Exemple de variation de type itérable
  • Example#110 - Exemples de fonctions de rappel
  • Example#111 - Exemple d'une fonction de rappel utilisant une Closure
  • Example#112 -
  • Example#113 - Déclaration de type de classe basique
  • Example#114 - Déclaration de type d'interface basique
  • Example#115 - Déclaration de type de retour basique
  • Example#116 - Retournant un objet
  • Example#117 - Déclaration de type d'argument nullable
  • Example#118 - Déclaration de type de retour nullable
  • Example#119 - Ancienne façon de rendre un argument nullable
  • Example#120 - Typage strict pour les valeurs d'arguments
  • Example#121 - Typage coercitif pour les valeurs d'arguments
  • Example#122 - Typage strict pour les valeurs de retour
  • Example#123 - Exemple de types étant forcé dans le type faisant partie de l'union
  • Example#124 - Paramètre typée passé par référence
  • Example#125 - Capturer l'exception de type TypeError
  • Example#126 - Validité des noms de variables
  • Example#127 - Assignation de référence
  • Example#128 - Assignation de référence et variables anonymes
  • Example#129 - Valeurs par défaut des variables non initialisées
  • Example#130 - Les variables sont locales à la fonction
  • Example#131 - Exemple avec global
  • Example#132 - Les variables globales et $GLOBALS
  • Example#133 - Exemple montrant les superglobales et la portée
  • Example#134 - Les variables statiques
  • Example#135 - Les variables statiques (2)
  • Example#136 - Les variables statiques et la récursivité
  • Example#137 - Déclaration de variables statiques
  • Example#138 - Exemple de propriété variable
  • Example#139 - Exemple avec un formulaire simple
  • Example#140 - Accéder simplement à des variables de formulaires POST
  • Example#141 - Variables de formulaires complexes
  • Example#142 - Exemple avec setcookie
  • Example#143 - Noms valides et invalides pour les constantes
  • Example#144 - Définir une constante
  • Example#145 - Définir des constantes en utilisant le mot-clé const
  • Example#146 - Associativité
  • Example#147 - Ordre d'évaluation indéfini
  • Example#148 - +, - et . ont la même priorité
  • Example#149 - Affectation par référence
  • Example#150 - Opérations sur les bits et les entiers
  • Example#151 - Opération sur les bits et les chaînes
  • Example#152 - Décalage de bits sur les entiers
  • Example#153 - Comparaison Booléen/null
  • Example#154 - Transcription des comparaisons standards des tableaux
  • Example#155 - Affectation d'une valeur par défaut
  • Example#156 - Comportement de PHP
  • Example#157 - Assigner une valeur par défaut
  • Example#158 - Imbrication de l'opération de fusion null
  • Example#159 - Opérateur d'exécution
  • Example#160 - Opérations arithmétiques sur un caractère
  • Example#161 - Illustration des opérateurs logiques
  • Example#162 - Opérateur de concaténation
  • Example#163 - Comparer des tableaux
  • Example#164 - Utilisation de instanceof avec des classes
  • Example#165 - Utilisation de instanceof avec des classes héritées
  • Example#166 - Utilisation de instanceof pour vérifier que l'objet n'est pas une instance de la classe
  • Example#167 - Utilisation de instanceof pour une interface
  • Example#168 - Utilisation de instanceof avec d'autres variables
  • Example#169 - Utilisation de instanceof pour tester d'autres variables
  • Example#170 - Utilisation de instanceof pour tester des constantes
  • Example#171 - Instruction switch
  • Example#172 - Instruction switch utilisant une chaîne de caractères
  • Example#173 - Structure of a match expression
  • Example#174 - Example of an unhandled match expression
  • Example#175 - Using a generalized match expressions to branch on integer ranges
  • Example#176 - Using a generalized match expressions to branch on string content
  • Example#177 - Exemple d'utilisation des ticks
  • Example#178 - Exemple d'utilisation des ticks
  • Example#179 - Déclaration d'un encodage pour un script
  • Example#180 - Exemple avec include
  • Example#181 - Inclusion de fichiers dans une fonction
  • Example#182 - Utiliser l'instruction include via HTTP
  • Example#183 - Comparaison de la valeur de retour d'une inclusion
  • Example#184 - include et return
  • Example#185 - Utilisation de la sortie du buffer pour inclure un fichier PHP dans une chaîne
  • Example#186 - Exemple avec goto
  • Example#187 - Exemple de boucle avec goto
  • Example#188 - Ce goto ne fonctionne pas
  • Example#189 - Pseudo code pour illustrer l'usage d'une fonction
  • Example#190 - Fonctions conditionnelles
  • Example#191 - Fonctions dans une autre fonction
  • Example#192 - Fonctions récursives
  • Example#193 - Nombre variable d'arguments sous forme de tableau
  • Example#194 - Function Argument List with trailing Comma
  • Example#195 - Passer des arguments optionnels après des arguments obligatoire
  • Example#196 - Passage d'arguments par référence
  • Example#197 - Valeur par défaut des arguments de fonctions
  • Example#198 - Utilisation de type non scalaire comme valeur par défaut
  • Example#199 - Les arguments sans valeur par défaut doivent être en premiers : erreur
  • Example#200 - Les arguments sans valeur par défaut doivent être en premiers : valide
  • Example#201 - Utilisation de ... pour accéder aux arguments variables
  • Example#202 - Utilisation de ... pour fournir des arguments
  • Example#203 - Transtypage d'arguments variables
  • Example#204 - Accès aux arguments variables dans des anciennes version de PHP
  • Example#205 - Syntaxe des arguments nommés
  • Example#206 - Arguments positionnels comparés aux arguments nommés
  • Example#207 - Même example que ci-dessus mais avec un ordre de paramètre différent
  • Example#208 - Combiner les arguments nommés avec les arguments positionnels
  • Example#209 - Exception Error quand un même paramètre est passer plusieurs fois
  • Example#210 - Utilisation de return
  • Example#211 - Retourner un tableau d'une fonction
  • Example#212 - Retourner une référence d'une fonction
  • Example#213 - Exemple de fonction variable
  • Example#214 - Exemple de méthode variable
  • Example#215 - Exemple de méthode variable avec des propriétés statiques
  • Example#216 - callables complexe
  • Example#217 - Exemples avec des fonctions anonymes
  • Example#218 - Assignation de fonction anonyme à une variable
  • Example#219 - Héritage de variable depuis le contexte parent
  • Example#220 - Fonctions anonymes et contexte
  • Example#221 - Liage automatique de $this
  • Example#222 - Tentative d'usage de $this dans une fonction anonyme statique
  • Example#223 - Tentative de liage d'un objet à une fonction anonyme statique
  • Example#224 - Les fonctions fléchées capturent les variables par valeur automatiquement
  • Example#225 - Les fonctions fléchées capturent les variables par valeur automatiquement, même imbriquées
  • Example#226 - Exemples de fonctions fléchées
  • Example#227 - Valeurs de la portée extérieure ne peuvent pas être modifiées par les fonctions fléchées
  • Example#228 - Définition typique d'une classe
  • Example#229 - Quelques exemples de la pseudo-variable $this
  • Example#230 - Création d'une instance
  • Example#231 - Assignation d'un objet
  • Example#232 - Créer de nouveaux objets
  • Example#233 - Accéder un membre d'un objet nouvellement créé
  • Example#234 - Accès de propriété contre appel de méthode
  • Example#235 - Appeler une fonction anonyme enregistré dans une propriété
  • Example#236 - Héritage simple d'une classe
  • Example#237 - Méthodes enfant compatibles
  • Example#238 - Erreur fatale quand une méthode enfant supprime un paramètre
  • Example#239 - Erreur fatale quand une méthode enfant rend un paramètre optionnel obligatoire
  • Example#240 - Erreur lors de l'utilisation des arguments nommés et que les paramètres ont été renommés dans une classe enfant
  • Example#241 - Résolution de nom de classe
  • Example#242 - Résolution de nom de classe manquante
  • Example#243 - Résolution du nom d'un objet
  • Example#244 - Opérateur nullsafe
  • Example#245 - Déclarations de propriétés
  • Example#246 - Exemple de propriétés typées
  • Example#247 - Accès aux propriétés
  • Example#248 - Définition et utilisation d'une constante de classe
  • Example#249 - Exemple d'utilisation de ::class
  • Example#250 - Exemple d'expressions pour une constante de classe
  • Example#251 - Modificateur de visibilité des constantes de classe, à partir de PHP 7.1
  • Example#252 - Exemple avec __autoload
  • Example#253 - Autre exemple d'auto-chargement
  • Example#254 - Auto-chargement avec gestion des exceptions
  • Example#255 - Auto-chargement avec gestion des exceptions. Exception personnalisée manquante
  • Example#256 - Constructeur lors de l'héritage
  • Example#257 - Utiliser les arguments d'un constructeur
  • Example#258 - Utilisant la promotion de propriété de constructeur
  • Example#259 - Utilisant la création via une méthode statique
  • Example#260 - Exemple avec un Destructeur
  • Example#261 - Déclaration de propriétés
  • Example#262 - Déclaration de méthodes
  • Example#263 - Déclaration de constantes à partir de PHP 7.1.0
  • Example#264 - Accès aux membres privés d'un objet du même type
  • Example#265 - Exemple d'héritage
  • Example#266 - :: en dehors de la définition de la classe
  • Example#267 - :: depuis la définition de la classe
  • Example#268 - Appel d'une méthode parente
  • Example#269 - Exemple avec une méthode statique
  • Example#270 - Exemple avec une propriété statique
  • Example#271 - Exemple de classe abstraite
  • Example#272 - Exemple avec une classe abstraite
  • Example#273 - Exemple d'interface
  • Example#274 - Les interfaces extensibles
  • Example#275 - Héritage de plusieurs interfaces
  • Example#276 - Interfaces avec des constantes
  • Example#277 - Exemple d'utilisation de Trait
  • Example#278 - Exemple avec l'ordre de précédence
  • Example#279 - Autre exemple d'ordre de précédence
  • Example#280 - Utilisation de plusieurs Traits
  • Example#281 - Résolution des conflits
  • Example#282 - Changer la visibilité des méthodes
  • Example#283 - Traits Composés depuis d'autres Traits
  • Example#284 - Obligations requises par les méthodes abstraites
  • Example#285 - Variables statiques
  • Example#286 - Méthodes statiques
  • Example#287 - Définir des propriétés
  • Example#288 - Résolution des conflits
  • Example#289 - Exemple de surcharge de propriétés avec les méthodes
     __get(),
     __set(),
     __isset() et
     __unset()
  • Example#290 - Surcharge de méthodes avec __call() et __callStatic()
  • Example#291 - Parcours d'objet simple
  • Example#292 - Itération d'un objet implémentant un itérateur
  • Example#293 - Itération d'un objet implémentant IteratorAggregate
  • Example#294 - Utilisation de sleep() et wakeup()
  • Example#295 - Serialize et unserialize
  • Example#296 - Exemple simple
  • Example#297 - Exemple avec __invoke()
  • Example#298 - Utilisation de __set_state()
  • Example#299 - Utilisation de __debugInfo()
  • Example#300 - Exemple de méthode finale
  • Example#301 - Exemple de classe finale
  • Example#302 - Exemple de duplication d'objets
  • Example#303 - Accès à un membre d'un objet fraîchement cloné
  • Example#304 - Exemple de comparaison d'objets en PHP
  • Example#305 - Utilisation de self::
  • Example#306 - Utilisation simple de static::
  • Example#307 - Utilisation de static:: dans un contexte non statique
  • Example#308 - Appel avec ou sans transmission
  • Example#309 - Références et Objets
  • Example#310 - Exemple de syntaxe des espaces de noms
  • Example#311 - Déclaration d'un espace de noms
  • Example#312 - Erreur de déclaration d'un espace de noms
  • Example#313 - Déclaration d'un espace de noms avec hiérarchie
  • Example#314 - Déclaration de plusieurs espaces de noms, syntaxe à combinaison simple
  • Example#315 - Déclaration de plusieurs espaces de noms, syntaxe à accolades
  • Example#316 - Déclaration de plusieurs espaces de noms avec un espace sans nom
  • Example#317 - Déclaration de plusieurs espaces de noms avec un espace sans nom (2)
  • Example#318 - Accès aux classes, fonctions et constantes globales depuis un espace de noms
  • Example#319 - Accès dynamique aux éléments
  • Example#320 - Accès dynamique à des espaces de noms
  • Example#321 - Exemple avec __NAMESPACE__, dans un code avec espace de noms
  • Example#322 - Exemple avec __NAMESPACE__, dans un code avec espace de noms global
  • Example#323 - Utilisation de __NAMESPACE__ pour une construction dynamique de noms
  • Example#324 - l'opérateur namespace, dans un espace de noms
  • Example#325 - l'opérateur namespace, dans l'espace de noms global
  • Example#326 - importation et alias avec l'opérateur use
  • Example#327 - importation et alias multiples avec l'opérateur use
  • Example#328 - Importation et noms d'espaces dynamiques
  • Example#329 - Importation et noms d'espaces absolus
  • Example#330 - Règles d'importation incorrectes
  • Example#331 - Spécification d'espace de noms global
  • Example#332 - Accès aux classes globales depuis un espace de noms
  • Example#333 - Accès aux fonctions et constantes globales dans un espace de noms
  • Example#334 - Exemples de résolutions d'espaces de noms
  • Example#335 - Accès à une classe globale de l'extérieur d'un espace de noms
  • Example#336 - Accéder à des classes globales hors d'un espace de noms
  • Example#337 - Accès aux classes internes depuis un espace de noms
  • Example#338 - Accès aux classes, fonctions et constantes internes dans un espace de noms
  • Example#339 - Noms d'espaces absolus
  • Example#340 - Noms qualifiés
  • Example#341 - Classes sans qualification
  • Example#342 - Fonctions et constantes sans espace de noms
  • Example#343 - Dangers de l'utilisation des espaces de noms dans une chaîne
  • Example#344 - Constantes indéfinies
  • Example#345 - Constantes qui ne peuvent être redéfinies
  • Example#346 - La classe Exception interne
  • Example#347 - Étendre la classe Exception
  • Example#348 - Convertir l'error reporting en exceptions
  • Example#349 - Lancer une exception
  • Example#350 - Gestion de l'exception avec un bloc finally
  • Example#351 - Interaction entre le bloc finally et return
  • Example#352 - Héritage d'une exception
  • Example#353 - Gestion des exceptions de capture multiple
  • Example#354 - Omettre la variable attrapé
  • Example#355 - Throw en tant qu'expression
  • Example#356 - Implémentation de la fonction range sous la forme d'un générateur
  • Example#357 - Un exemple simple de production de valeurs
  • Example#358 - Production d'une paire clé/valeur
  • Example#359 - Production de valeurs nulles
  • Example#360 - Production de valeurs par référence
  • Example#361 - yield from avec iterator_to_array
  • Example#362 - Utilisation basique de yield from
  • Example#363 - yield from et les valeurs retournées
  • Example#364 - Implementing optional methods of an interface with Attributes
  • Example#365 - Attribute Syntax
  • Example#366 - Reading Attributes using Reflection API
  • Example#367 - Reading Specific Attributes using Reflection API
  • Example#368 - Using target specification to restrict where attributes can be used
  • Example#369 - Simple Attribute Class
  • Example#370 - Using IS_REPEATABLE to allow attribute on a declaration multiple times
  • Example#371 - Utilisation des références avec des variables indéfinies
  • Example#372 - Référencer des variables globales depuis des fonctions
  • Example#373 - Références et structure foreach
  • Example#374 - Exemple avec $GLOBALS
  • Example#375 - Exemple avec $_SERVER
  • Example#376 - Exemple avec $_GET
  • Example#377 - Exemple avec $_POST
  • Example#378 - Exemple avec $_ENV
  • Example#379 - Exemple avec $_COOKIE
  • Example#380 - Exemple avec $php_errormsg
  • Example#381 - Exemple avec $http_response_header
  • Example#382 - Exemple avec $argc
  • Example#383 - Exemple avec $argv
  • Example#384 - Exemple avec Exception::getMessage
  • Example#385 - Exemple avec Exception::getPrevious
  • Example#386 - Exemple avec Exception::getCode
  • Example#387 - Exemple avec Exception::getFile
  • Example#388 - Exemple avec Exception::getLine
  • Example#389 - Exemple avec Exception::getTrace
  • Example#390 - Exemple avec Exception::getTraceAsString
  • Example#391 - Exemple avec Exception::__toString
  • Example#392 - Utilisation de set_error_handler pour changer tous les messages d'erreurs en ErrorException
  • Example#393 - Exemple avec ErrorException::ErrorException
  • Example#394 - Exemple de Error::getMessage
  • Example#395 - Exemple de Error::getPrevious
  • Example#396 - Exemple de Error::getCode
  • Example#397 - Exemple de Error::getFile
  • Example#398 - Exemple de Error::getLine
  • Example#399 - Exemple de Error::getTrace
  • Example#400 - Exemple de Error::getTraceAsString
  • Example#401 - Exemple de Error::__toString
  • Example#402 - Exemple simple
  • Example#403 - Exemple simple
  • Example#404 - Exemple basique
  • Example#405 - Exemple avec ArrayAccess::offsetExists
  • Example#406 - Exemple simple
  • Example#407 - Exemple Closure::bind
  • Example#408 - Exemple Closure::bindTo
  • Example#409 - Exemple deClosure::call
  • Example#410 - Generator::getReturn exemple
  • Example#411 - Exemple avec Generator::key
  • Example#412 - Exemple d'utilisation Generator::send pour injecter des données
  • Example#413 - >Lance une exception dans un générateur
  • Example#414 - Utilisation Simple de WeakReference
  • Example#415 - Exemple d'utilisation du paramètre bindto
  • Example#416 - Récupération d'une page et envoi de données POST
  • Example#417 - Ignore les redirections mais récupère les en-têtes et le contenu
  • Example#418 - Récupère une page et envoie des données avec la méthode POST
  • Example#419 - Exemple avec une utilisation simple du paramètre password
  • Example#420 - Détecte la dernière URL après des redirections
  • Example#421 - php://temp/maxmemory
  • Example#422 - php://filter/resource=<flux à filtrer>
  • Example#423 - php://filter/read=<liste de filtres à appliquer lors de la lecture>
  • Example#424 - php://filter/write=<liste des filtres à appliquer lors de l'écriture>
  • Example#425 - php://memory et php://temp ne sont pas réutilisables
  • Example#426 - Affichage d'un contenu data://
  • Example#427 - Récupération du type de média
  • Example#428 - Utilisation simple
  • Example#429 - Ouverture d'un flux depuis une connexion active
  • Example#430 - La variable $session doit rester disponible !
  • Example#431 - Parcours d'une archive RAR
  • Example#432 - Ouverture d'un fichier crypté (en-tête crypté)
  • Example#433 - Ligne d'invocation de PHP
  • Example#434 - Une erreur de vérification de variable conduit à un gros problème
  • Example#435 - Une attaque du système de fichiers!
  • Example#436 - Une vérification renforcée
  • Example#437 - Vérification renforcée de noms de fichiers
  • Example#438 - Script vulnérable aux octets nuls
  • Example#439 - Validation correcte de l'entrée
  • Example#440 - Hacher un champ mot de passe
  • Example#441 - Séparation des résultats en pages, et créer des administrateurs (PostgreSQL et MySQL)
  • Example#442 - Exemple d'injection SQL
  • Example#443 - Liste d'articles ... et ajout de mot de passe
  • Example#444 - Révélation des mots de passe
  • Example#445 - Modifier un mot de passe ... et gain de droits!
  • Example#446 - Une requête et son injection
  • Example#447 - Attaque d'un serveur de bases de données (MSSQL Server)
  • Example#448 - Attaque d'un serveur de base de données (MSSQL Server) - 2
  • Example#449 - Une navigation de fiches plus sécuritaire
  • Example#450 - Attaque de variables avec une page HTML personnalisée
  • Example#451 - Exploiter des variables classiques de débogage
  • Example#452 - Détecter des variables non protégées avec E_ALL
  • Example#453 - Utilisation dangereuse de variables
  • Example#454 - Masquer PHP avec un autre langage
  • Example#455 - Masquer PHP avec des types inconnus
  • Example#456 - Utiliser le type HTML pour les extensions PHP
  • Example#457 - Exemple d'identification HTTP simple
  • Example#458 - Exemple d'identification HTTP Digest
  • Example#459 - Identification HTTP avec nom d'utilisateur/mot de passe forcé
  • Example#460 - Un simple formulaire XForms de recherche
  • Example#461 - Utiliser des XForms pour remplir $_POST
  • Example#462 - Formulaire de chargement de fichier
  • Example#463 - Validation de téléchargement de fichiers
  • Example#464 - Envoi d'un tableau de fichiers
  • Example#465 - Télécharger plusieurs fichiers simultanément
  • Example#466 - Méthode PUT pour les chargements de fichiers
  • Example#467 - Directive Apache pour le chargement par méthode PUT
  • Example#468 - Sauvegarde de fichiers HTTP PUT
  • Example#469 - Connaître le titre d'une page distante
  • Example#470 - Stocker des données sur un serveur distant
  • Example#471 - Exemple montrant la différence avec le SAPI CGI :
  • Example#472 -
  • Example#473 - Affichage des modules internes (et chargés) de PHP et Zend
  • Example#474 - Erreur de syntaxe lors de l'utilisation de doubles guillemets
  • Example#475 - Utilisation de guillemets simples pour éviter une substitution par le shell
  • Example#476 - Exemple d'utilisation des options -B, -R et -E pour compter le nombre de lignes d'un projet.
  • Example#477 - Utilisation de l'option -v pour récupérer le nom du SAPI ainsi que la version de PHP et de Zend
  • Example#478 - Exemple avec --ini
  • Example#479 - Exemple avec --rf
  • Example#480 - Exemple avec --rc
  • Example#481 - Exemple avec --re
  • Example#482 - Exemple avec --ri
  • Example#483 - Exécute un script PHP en tant que script shell
  • Example#484 - Script prévu pour être exécuté en ligne de commande (script.php)
  • Example#485 - Fichier batch pour exécuter un script PHP en ligne de commande (script.bat)
  • Example#486 - Exécution de code en utilisant le shell interactif
  • Example#487 - Auto-complétion en utilisant la touche de tabulation
  • Example#488 - Définition de directives du php.ini dans un shell interactif
  • Example#489 - Démarrage du serveur web
  • Example#490 - Démarrage avec un dossier racine spécifique
  • Example#491 - Utilisation d'un script routeur
  • Example#492 - Vérification de l'utilisation CLI du serveur Web
  • Example#493 - Gestion des types de fichiers non supportés
  • Example#494 - Accès au CLI du serveur web depuis une machine distante
  • Example#495 - Création d'un nouveau conteneur zval
  • Example#496 - Affichage des informations zval
  • Example#497 - Incrémentation du refcount d'une zval
  • Example#498 - Décrémentation du refcount d'une zval
  • Example#499 - Création d'une zval array
  • Example#500 - Ajout d'un élément déja existant au tableau
  • Example#501 - Suppression d'un élément de tableau
  • Example#502 - Ajout du tableau comme référence à lui-même en tant qu'élement
  • Example#503 - Suppression de $a
  • Example#504 - Exemple d'utilisation mémoire
  • Example#505 - Impact de GC sur les performances
  • Example#506 - Lancement du script ci-dessus
  • Example#507 - Recompiler PHP pour activer le support du benchmark du GC
  • Example#508 - Statistiques GC
  • Example#509 - all_probes.d for tracing all PHP Static Probes with DTrace
  • Example#510 - all_probes.stp for tracing all PHP Static Probes with SystemTap
  • Example#511 - A apcu_add example
  • Example#512 - A apcu_cache_info example
  • Example#513 - apcu_cas example
  • Example#514 - apcu_dec example
  • Example#515 - A apcu_delete example
  • Example#516 - An apcu_entry example
  • Example#517 - apcu_exists example
  • Example#518 - A apcu_fetch example
  • Example#519 - apcu_inc example
  • Example#520 - A apcu_key_info example
  • Example#521 - A apcu_sma_info example
  • Example#522 - A apcu_store example
  • Example#523 - A APCUIterator::__construct example
  • Example#524 - Gestion d'erreurs avancées en PHP
  • Example#525 - Exemple avec debug_backtrace
  • Example#526 - Exemple avec debug_print_backtrace
  • Example#527 - Un exemple de error_clear_last
  • Example#528 - Exemple avec error_get_last
  • Example#529 - Exemples avec error_log
  • Example#530 - Exemple avec error_reporting
  • Example#531 - Exemple avec restore_error_handler
  • Example#532 - Exemple avec restore_exception_handler
  • Example#533 - Gestionnaire d'erreurs avec set_error_handler et trigger_error
  • Example#534 - Exemple avec set_exception_handler
  • Example#535 - Exemple avec trigger_error
  • Example#536 - Calling a function from shared library
  • Example#537 - Calling a function, returning a structure through an argument
  • Example#538 - Accessing existing C variables
  • Example#539 - Creating and Modifying C variables
  • Example#540 - Working with C arrays
  • Example#541 - Working with C enums
  • Example#542 -
  • Example#543 -
  • Example#544 - Création d'un grand tableau
  • Example#545 - Exemple de bufferisation de sortie
  • Example#546 - Exemple de réécriture de la sortie
  • Example#547 - Exemple avec ob_end_clean
  • Example#548 - Exemple avec ob_end_flush
  • Example#549 - Exemple avec ob_get_clean
  • Example#550 - Exemple avec ob_get_contents
  • Example#551 - Exemple avec ob_get_flush
  • Example#552 - Exemple avec ob_get_length
  • Example#553 - Exemple avec ob_gzhandler
  • Example#554 - Exemple avec ob_list_handlers
  • Example#555 - Exemple de gestion de sortie avec fonction de rappel
  • Example#556 - Crée un tampon de sortie in-effacable de sorte à être compatible avec PHP 5.3 et PHP 5.4
  • Example#557 - Exemple avec output_add_rewrite_var
  • Example#558 - Exemple avec output_reset_rewrite_vars
  • Example#559 - Exemple avec assert_options
  • Example#560 - Gestion des assertions avec un gestionnaire personnalisé
  • Example#561 - Utilisation d'un gestionnaire personnalisé pour afficher une description
  • Example#562 - Expectations sans exception personalisée
  • Example#563 - Expectations avec une exception personalisée
  • Example#564 - Exemple avec cli_get_process_title
  • Example#565 - Exemple avec cli_set_process_title
  • Example#566 - Exemples avec dl
  • Example#567 - Exemple avec extension_loaded
  • Example#568 - Exemple avec gc_enabled
  • Example#569 - Utilisation de gc_status
  • Example#570 - Exemple avec get_current_user
  • Example#571 - Exemple avec get_defined_constants
  • Example#572 - Affiche toutes les fonctions XML
  • Example#573 - Exemple avec get_include_path
  • Example#574 - Exemple avec get_included_files
  • Example#575 - Exemple avec get_loaded_extensions
  • Example#576 - Exemple avec get_magic_quotes_runtime
  • Example#577 - get_resources non-filtré
  • Example#578 - get_resources filtré
  • Example#579 - Exemple avec getenv
  • Example#580 - Exemple avec getlastmod
  • Example#581 - Exemple avec getopt : les bases
  • Example#582 - Second exemple avec getopt : Introduction aux options longues
  • Example#583 - Troisième exemple avec getopt : Passage de plusieurs options
  • Example#584 - Exemple de getopt : Utilisant rest_index
  • Example#585 - Exemple avec getrusage
  • Example#586 - Exemple avec ini_get_all
  • Example#587 - Désactive le paramètre details
  • Example#588 - Exemples avec ini_get
  • Example#589 - Exemple avec ini_restore
  • Example#590 - Définit une option de configuration
  • Example#591 - Exemple avec memory_get_usage
  • Example#592 - Exemple avec php_ini_loaded_file
  • Example#593 - Un exemple de liste retournée par php_ini_scanned_files
  • Example#594 - Exemple avec php_sapi_name
  • Example#595 - Exemples avec php_uname
  • Example#596 - Exemples avec quelques constantes liées au système
  • Example#597 - Exemple avec phpcredits
  • Example#598 - Affiche les développeurs principaux ansi que le groupe de documentation
  • Example#599 - Affiche tous les crédits
  • Example#600 - Exemple avec phpinfo
  • Example#601 - Exemple avec phpversion
  • Example#602 - Exemple avec PHP_VERSION_ID
  • Example#603 - Modification d'une variable d'environnement
  • Example#604 - Exemple avec restore_include_path
  • Example#605 - Exemple avec set_include_path
  • Example#606 - Ajout dans le chemin d'inclusion
  • Example#607 - Exemple avec sys_get_temp_dir
  • Example#608 - Exemple avec version_compare
  • Example#609 - Exemple avec zend_thread_id
  • Example#610 - Exemple avec zend_version
  • Example#611 - Custom Superglobals with runkit.superglobal=_FOO,_BAR in php.ini
  • Example#612 - A runkit7_function_add example
  • Example#613 - A runkit7_function_copy example
  • Example#614 - A runkit7_function_redefine example
  • Example#615 - runkit7_method_add example
  • Example#616 - runkit7_method_copy example
  • Example#617 - runkit7_method_redefine example
  • Example#618 - runkit7_method_remove example
  • Example#619 - runkit7_method_rename example
  • Example#620 - Basic uopz_add_function Usage
  • Example#621 - uopz_allow_exit example
  • Example#622 - Exemple avec uopz_backup
  • Example#623 - Exemple avec uopz_compose
  • Example#624 - Exemple avec uopz_copy
  • Example#625 - Basic uopz_del_function Usage
  • Example#626 - Exemple avec uopz_delete
  • Example#627 - Exemple avec uopz_delete et une classe
  • Example#628 - Exemple avec uopz_extend
  • Example#629 - Exemple avec uopz_flags
  • Example#630 - Transformer une Classe finale en non-finale
  • Example#631 - Exemple avec uopz_function
  • Example#632 - Exemple avec uopz_function et une classe
  • Example#633 - uopz_get_exit_status example
  • Example#634 - Basic uopz_get_hook Usage
  • Example#635 - uopz_get_mock example
  • Example#636 - Basic uopz_get_property Usage
  • Example#637 - uopz_get_return example
  • Example#638 - Basic uopz_get_static Usage
  • Example#639 - Exemple avec uopz_implement
  • Example#640 - Exemple avec uopz_overload
  • Example#641 - Exemple avec uopz_redefine
  • Example#642 - Exemple avec uopz_rename
  • Example#643 - Exemple avec uopz_rename et une classe
  • Example#644 - Exemple avec uopz_restore
  • Example#645 - Basic uopz_set_hook Usage
  • Example#646 - uopz_set_mock example
  • Example#647 - uopz_set_mock example
  • Example#648 - uopz_set_mock and static members
  • Example#649 - Basic uopz_set_property Usage
  • Example#650 - uopz_set_return example
  • Example#651 - uopz_set_return example
  • Example#652 - uopz_set_return class example
  • Example#653 - Basic uopz_set_static Usage
  • Example#654 - Exemple avec uopz_undefine
  • Example#655 - Basic uopz_unset_hook Usage
  • Example#656 - uopz_unset_mock example
  • Example#657 - uopz_unset_return example
  • Example#658 - Exemple d'utilisation de Weakref
  • Example#659 - Exemple d'utilisation de WeakRef
  • Example#660 - Exemple avec Weakref::acquire
  • Example#661 - Exemple d'acquisition / libération
  • Example#662 - Exemple avec Weakref::__construct
  • Example#663 - Exemple avec Weakref::release
  • Example#664 - Exemple d'utilisation de Weakmap
  • Example#665 - wincache.ignorelist exemple
  • Example#666 - Configuration de l'authentification pour wincache.php
  • Example#667 - Activer le gestionnaire de session WinCache
  • Example#668 - Activation des fonctionnalités de re routage des fonctions de WinCache
  • Example#669 - Reroute.ini
  • Example#670 - Un exemple de wincache_fcache_fileinfo
  • Example#671 - Un exemple de wincache_fcache_meminfo
  • Example#672 - Exemple avec wincache_lock
  • Example#673 - Un exemple de wincache_ocache_fileinfo
  • Example#674 - Un exemple de wincache_ocache_meminfo
  • Example#675 - Un exemple de wincache_refresh_if_changed
  • Example#676 - Exemple avec wincache_rplist_fileinfo
  • Example#677 - Exemple avec wincache_rplist_meminfo
  • Example#678 - Exemple avec wincache_scache_info
  • Example#679 - Exemple avec wincache_scache_meminfo
  • Example#680 - Exemple avec wincache_ucache_add et le paramètre key sous forme de chaîne de caractères
  • Example#681 - Exemple avec wincache_ucache_add et le paramètre key sous forme d'un tableau
  • Example#682 - Exemple avec wincache_ucache_cas
  • Example#683 - Exemple avec wincache_ucache_clear
  • Example#684 - Exemple avec wincache_ucache_dec
  • Example#685 - Exemple avec wincache_ucache_delete et le paramètre key sous forme de chaîne de caractères
  • Example#686 - Exemple avec wincache_ucache_delete et le paramètre key sous forme d'un tableau
  • Example#687 - Exemple avec wincache_ucache_delete et le paramètre key sous la forme d'un tableau où quelques éléments n'ont pas pu être supprimés
  • Example#688 - Exemple avec wincache_ucache_exists
  • Example#689 - Exemple avec wincache_ucache_get et le paramètre key sous forme de chaîne de caractères
  • Example#690 - Exemple avec wincache_ucache_get et le paramètre key sous forme d'un tableau
  • Example#691 - Exemple avec wincache_ucache_inc
  • Example#692 - Exemple avec wincache_ucache_info
  • Example#693 - Exemple avec wincache_ucache_meminfo
  • Example#694 - Exemple avec wincache_ucache_set et le paramètre key sous forme de chaîne de caractères
  • Example#695 - Exemple avec wincache_ucache_set et le paramètre key sous forme de tableau
  • Example#696 - Exemple avec wincache_unlock
  • Example#697 - Exemple avec Xhprof et la GUI optionnelle
  • Example#698 - Exemple avec xhprof_disable
  • Example#699 - Exemple avec xhprof_enable
  • Example#700 - Exemple avec xhprof_sample_disable
  • Example#701 - Permet de s'assurer que l'élément est stocké
  • Example#702 - Utilisation des mots de passe CHAP
  • Example#703 - Exemple avec radius_acct_open
  • Example#704 - Exemple avec radius_add_server
  • Example#705 - Exemple avec radius_auth_open
  • Example#706 - Exemple avec radius_create_request
  • Example#707 - Exemple avec radius_cvt_addr
  • Example#708 - Exemple avec radius_cvt_int
  • Example#709 - Exemple avec radius_cvt_string
  • Example#710 - Exemple avec radius_get_attr
  • Example#711 - Exemple avec radius_get_tagged_attr_data
  • Example#712 - Exemple avec radius_get_tagged_attr_tag
  • Example#713 - Exemple avec radius_get_vendor_attr
  • Example#714 - Exemple avec radius_put_attr
  • Example#715 - Exemple avec radius_put_int
  • Example#716 - Exemple avec radius_put_string
  • Example#717 - Exemple avec radius_put_vendor_attr
  • Example#718 - Affichage d'une chaîne avec une couleur donnée à l'écran
  • Example#719 - Exemple avec ncurses_getmouse
  • Example#720 - Writing a string with a specified color to the screen
  • Example#721 - Écriture d'une chaîne dans une couleur donnée
  • Example#722 - Exemple avec ncurses_mousemask
  • Example#723 - Affichage d'une chaîne en couleur à l'écran
  • Example#724 - Exemple d'interface de rappelde Readline
  • Example#725 - Exemple avec readline
  • Example#726 - Petit exemple avec bzip2
  • Example#727 - Compression de données
  • Example#728 - Décompression d'une chaîne
  • Example#729 - Exemple avec bzerror
  • Example#730 - Exemple avec bzopen
  • Example#731 - Exemple avec bzread
  • Example#732 - Exemple avec bzwrite
  • Example#733 - Utiliser un fichier externe
  • Example#734 - Utilier un fichier contenu dans une archive phar
  • Example#735 - Convertir une archive phar au format tar
  • Example#736 - Exemple d'utilisation de phar.cache_list
  • Example#737 - Un exemple avec Phar::addEmptyDir
  • Example#738 - Un exemple avec Phar::addFile
  • Example#739 - Un exemple avec Phar::addFromString
  • Example#740 - Un exemple avecPhar::apiVersion
  • Example#741 - Un exemple avecPhar::buildFromDirectory
  • Example#742 - Exemple avec Phar::buildFromIterator et SplFileInfo
  • Example#743 - Exemple avec Phar::buildFromIterator et d'autres itérateurs
  • Example#744 - Un exemple avec Phar::canCompress
  • Example#745 - Un exemple avec Phar::canWrite
  • Example#746 - Un exemple avec Phar::compress
  • Example#747 - Un exemple avec Phar::compressFiles
  • Example#748 - Un exemple avec Phar::__construct
  • Example#749 - Un exemple avec Phar::convertToData
  • Example#750 - Un exemple avec Phar::convertToExecutable
  • Example#751 - Exemple avec Phar::copy
  • Example#752 - Un exemple avec Phar::count
  • Example#753 - Exemple avec Phar::createDefaultStub
  • Example#754 - Un exemple avec Phar::decompress
  • Example#755 - Un exemple avec Phar::decompressFiles
  • Example#756 - Un exemple avec Phar::delMetaData
  • Example#757 - Un exemple avec Phar::delete
  • Example#758 - Exemple avec Phar::extractTo
  • Example#759 - Un exemple avec Phar::getMetadata
  • Example#760 - Exemple avec Phar::getStub
  • Example#761 - Un exemple avec Phar::hasMetadata
  • Example#762 - Exemple avec Phar::interceptFileFuncs
  • Example#763 - Un exemple avec Phar::interceptFileFuncs
  • Example#764 - Un exemple avec Phar::isBuffering
  • Example#765 - Exemple avec Phar::isCompressed
  • Example#766 - Un exemple avec Phar::loadPhar
  • Example#767 - Exemple avec Phar::mapPhar
  • Example#768 - Un exemple avec Phar::mount
  • Example#769 - Un exemple avec Phar::mungServer
  • Example#770 - Un exemple avec Phar::offsetExists
  • Example#771 - Exemple avec Phar::offsetGet
  • Example#772 - Un exemple avec Phar::offsetSet
  • Example#773 - Un exemple avec Phar::offsetUnset
  • Example#774 - Un exemple avec Phar::running
  • Example#775 - Un exemple avec Phar::setAlias
  • Example#776 - Un exemple avec Phar::setDefaultStub
  • Example#777 - Un exemple avec Phar::setMetadata
  • Example#778 - Un exemple avec Phar::setStub
  • Example#779 - Un exemple avec Phar::startBuffering
  • Example#780 - Un exemple Phar::stopBuffering
  • Example#781 - Un exemple avec Phar::unlinkArchive
  • Example#782 - Exemple avec Phar::webPhar
  • Example#783 - Un exemple avec PharData::addEmptyDir
  • Example#784 - Un exemple avec PharData::addFile
  • Example#785 - Exemple avec PharData::addFromString
  • Example#786 - Un exemple avec PharData::buildFromDirectory
  • Example#787 - Exemple avec PharData::buildFromIterator et SplFileInfo
  • Example#788 - Exemple avec PharData::buildFromIterator et d'autres itérateurs
  • Example#789 - Un exemple avec PharData::compress
  • Example#790 - Un exemple avec PharData::compressFiles
  • Example#791 - Un exemple avec PharData::__construct
  • Example#792 - Un exemple avec PharData::convertToData
  • Example#793 - Un exemple avec PharData::convertToExecutable
  • Example#794 - Un exemple avec PharData::copy
  • Example#795 - Exemple avec PharData::decompress
  • Example#796 - Un exemple avec PharData::decompressFiles
  • Example#797 - Un exemple avec PharData::delMetaData
  • Example#798 - Un exemple avec PharData::delete
  • Example#799 - Exemple avec PharData::extractTo
  • Example#800 - Un exemple avec PharData::offsetSet
  • Example#801 - Un exemple avec PharData::offsetUnset
  • Example#802 - Un exemple avec Phar::setMetadata
  • Example#803 - Un exemple avec PharFileInfo::chmod
  • Example#804 - Un exemple avec PharFileInfo::compress
  • Example#805 - Exemple avec PharFileInfo::__construct
  • Example#806 - Exemple avec PharFileInfo::decompress
  • Example#807 - Un exemple avec PharFileInfo::delMetaData
  • Example#808 - Exemple avec PharFileInfo::getCRC32
  • Example#809 - Un exemple avec PharFileInfo::getCompressedSize
  • Example#810 - Un exemple avec PharFileInfo::getMetadata
  • Example#811 - Un exemple avecPharFileInfo::getPharFlags
  • Example#812 - Un exemple avec PharFileInfo::isCRCChecked
  • Example#813 - Un exemple avec PharFileInfo::isCompressed
  • Example#814 - Un exemple avec PharFileInfo::setMetadata
  • Example#815 - Installation de Rar
  • Example#816 - Décompression à la volée
  • Example#817 - Exemple d'extractions RAR
  • Example#818 - Style orienté objet
  • Example#819 - Style procédural
  • Example#820 - Style orienté objet
  • Example#821 - Style procédural
  • Example#822 - Style orienté objet
  • Example#823 - Style procédural
  • Example#824 - Style orienté objet
  • Example#825 - Style procédural
  • Example#826 - Style orienté objet
  • Example#827 - Style procédural
  • Example#828 - Style orienté objet
  • Example#829 - Style procédural
  • Example#830 - Style orienté objet
  • Example#831 - Style procédural
  • Example#832 - Fonction de rappel pour le volume
  • Example#833 - Style orienté objet
  • Example#834 - Style procédural
  • Example#835 - Exemple avec RarArchive::__toString
  • Example#836 - Exemple avec RarEntry::extract
  • Example#837 - Comment extraire tous les fichiers d'une archive :
  • Example#838 - Exemple avec RarEntry::getAttr
  • Example#839 - Exemple avec RarEntry::getHostOs (version >= 2.0.0)
  • Example#840 - Exemple avec RarEntry::getHostOs (version <= 1.0.0)
  • Example#841 - Exemple avec RarEntry::getMethod
  • Example#842 - Exemple avec RarEntry::getName
  • Example#843 - Exemple avec RarEntry::getPackedSize
  • Example#844 - Exemple avec RarEntry::getStream
  • Example#845 - Exemple avec RarEntry::getUnpackedSize
  • Example#846 - Exemple avec RarEntry::getVersion
  • Example#847 - Exemple avec RarException::isUsingExceptions
  • Example#848 - Exemple avec RarException::setUsingExceptions
  • Example#849 - Création d'une archive Zip
  • Example#850 - Affiche les détails de l'archive et liste son contenu
  • Example#851 - Flux ZIP : lit les meta-données d'un fichier OpenOffice
  • Example#852 - Exemple d'utilisation de Zip
  • Example#853 - Crée un nouveau dossier dans l'archive
  • Example#854 - Ouverture et ajout
  • Example#855 - Ajout d'une entrée dans une nouvelle archive
  • Example#856 - Ajout d'un fichier dans un dossier d'une archive
  • Example#857 - Exemple avec ZipArchive::addGlob
  • Example#858 - Exemple avec ZipArchive::addPattern
  • Example#859 - Efface le fichier depuis l'archive en utilisant son index
  • Example#860 - Efface un fichier et un dossier de l'archive en utilisant les noms
  • Example#861 - Extrait toutes les entrées
  • Example#862 - Extrait deux entrées
  • Example#863 - Extrait le commentaire de l'archive
  • Example#864 - Affiche le commentaire d'une entrée
  • Example#865 - Affiche le commentaire d'une entrée
  • Example#866 - Extrait toutes les entrées avec leurs droits Unix
  • Example#867 - Récupère le contenu du fichier
  • Example#868 - Récupère le contenu d'un fichier
  • Example#869 - Convertit une image depuis une entrée ZIP
  • Example#870 - Exemple avec ZipArchive::getNameIndex
  • Example#871 - Récupère le contenu de l'entrée ZIP
  • Example#872 - Récupère une entrée Zip avec la fonction fopen et le gestionnaire de flux ZIP
  • Example#873 - Gestionnaire de flux et image, peut être utilisé également avec les fonctions XML
  • Example#874 - Crée une archive et l'utilise avec ZipArchive::locateName
  • Example#875 - Ouverture et extraction
  • Example#876 - Création d'une archive
  • Example#877 - Créer une archive temporaire
  • Example#878 - Archivage d'un fichier
  • Example#879 - Archive un fichier
  • Example#880 - Renommer une entrée
  • Example#881 - Renommer une entrée
  • Example#882 - Ouvre et remplace
  • Example#883 - Création d'une archive et définition d'un commentaire
  • Example#884 - Ouvre une archive et définit un commentaire pour une entrée
  • Example#885 - Ouvre une archive et définit le commentaire pour une entrée
  • Example#886 - Ajoute des fichiers avec différentes méthodes de compression dans une archive
  • Example#887 - Ajoute des fichiers avec différentes méthodes de compression dans une archive
  • Example#888 - Ajoute un fichier et définir la méthode de compression
  • Example#889 - Archiver et chiffrer un fichier
  • Example#890 - Archiver un fichier avec ses droits Unix
  • Example#891 - Archive un fichier
  • Example#892 - Archive un fichier
  • Example#893 - Récupère les informations d'une entrée
  • Example#894 - Récupère les informations d'une entrée
  • Example#895 - Exemple avec Zlib
  • Example#896 - Fonctionnement avec l'API de compression et de décompression incrémentale depuis PHP 7.0.0
  • Example#897 - Exemple avec gzclose
  • Example#898 - Exemple avec gzcompress
  • Example#899 - Exemple avec gzdeflate
  • Example#900 - Création d'un fichier gzip
  • Example#901 - Exemple avec gzeof
  • Example#902 - Exemple avec gzfile
  • Example#903 - Exemple avec gzgetc
  • Example#904 - Exemple avec gzgets
  • Example#905 - Exemple avec gzgetss
  • Example#906 - Exemple avec gzinflate
  • Example#907 - Exemple avec gzopen
  • Example#908 - Exemple avec gzpassthru
  • Example#909 - Exemple avec gzread
  • Example#910 - Exemple avec gzseek
  • Example#911 - Exemple avec gzuncompress
  • Example#912 - Exemple avec gzwrite
  • Example#913 - Exemple avec zlib_encode
  • Example#914 - Exemple avec random_bytes
  • Example#915 - Exemple avec random_int
  • Example#916 - Exemple avec hash_algos
  • Example#917 - Exemple avec hash_copy
  • Example#918 - Exemple
  • Example#919 - Exemple avec hash_file
  • Example#920 - Exemple avec hash_final
  • Example#921 - Exemple avec hash_hkdf
  • Example#922 - Exemple avec hash_hmac_algos
  • Example#923 - Exemple avec hash_hmac_file
  • Example#924 - Exemple avec hash_hmac
  • Example#925 - Exemple de hachage incrémental
  • Example#926 - Exemple avec hash_pbkdf2
  • Example#927 - Exemple avec hash_update_stream
  • Example#928 - Exemple avec hash
  • Example#929 - Exemple avec PHP-5.4 et supérieur
  • Example#930 - Chiffrement d'une valeur avec AES avec une clé 256-bit sous 2.4.x et supérieur, en mode CBC
  • Example#931 - Exemple avec mcrypt_create_iv
  • Example#932 - Exemple avec mcrypt_enc_get_algorithms_name
  • Example#933 - Exemple avec mcrypt_enc_get_modes_name
  • Example#934 - Exemple avec mcrypt_enc_get_supported_key_sizes
  • Example#935 - Exemple avec mcrypt_encrypt
  • Example#936 - Exemple avec mcrypt_get_block_size
  • Example#937 - Exemple avec mcrypt_get_cipher_name
  • Example#938 - Exemple avec mcrypt_get_iv_size
  • Example#939 - Exemple avec mcrypt_get_key_size
  • Example#940 - Exemple avec mcrypt_list_algorithms
  • Example#941 - Exemple avec mcrypt_list_modes
  • Example#942 - Exemple avec mcrypt_module_open
  • Example#943 - Utilisation de mcrypt_module_open pour chiffrer
  • Example#944 - Exemple avec mcrypt_module_self_test
  • Example#945 - Exemple avec mdecrypt_generic
  • Example#946 - Calcule le MD5 et le hmac, puis l'affiche comme un hexadécimal
  • Example#947 - Parcourir la liste des hash
  • Example#948 - Exemple avec mhash_get_block_size
  • Example#949 - Exemple avec mhash_get_hash_name
  • Example#950 - Exemple avec openssl_cipher_iv_length
  • Example#951 - openssl_csr_export_to_file() example
  • Example#952 - openssl_csr_export() example
  • Example#953 - openssl_csr_get_public_key() example
  • Example#954 - Exemple avec openssl_csr_get_subject()
  • Example#955 - Création d'un certificat autosigné
  • Example#956 - Créer un certficat ECC autosigné (à partir de PHP 7.1.0)
  • Example#957 - Exemple avec openssl_csr_sign - signer une CSR (comment être votre propre Autorité de Certification)
  • Example#958 - Calcule un secret partagé
  • Example#959 - Générer une paire de clé DH publique/privée en PHP
  • Example#960 - Exemple de chiffrement authentifié AES en mode GCM pour PHP 7.1+
  • Example#961 - Exemple de chiffrement authentifié AES en mode GCM pour PHP 5.6+
  • Example#962 - Exemple avec openssl_error_string
  • Example#963 - Exemple avec openssl_get_cert_locations
  • Example#964 - Exemple openssl_get_cipher_methods
  • Example#965 - Exemple avec openssl_get_curve_names
  • Example#966 - Exemple openssl_get_md_methods
  • Example#967 - Exemple avec openssl_open
  • Example#968 - Exemple avec openssl_pbkdf2()
  • Example#969 - openssl_pkcs12_read example
  • Example#970 - Exemple avec openssl_pkcs7_decrypt
  • Example#971 - Exemple avec openssl_pkcs7_encrypt
  • Example#972 - Exemple avec openssl_pkcs7_sign
  • Example#973 - openssl_pkey_derive example
  • Example#974 - Obtain the public key from a private key
  • Example#975 - Exemple openssl_random_pseudo_bytes
  • Example#976 - Exemple avec openssl_seal
  • Example#977 - Exemple avec openssl_sign
  • Example#978 - Exemple avec openssl_sign
  • Example#979 - Exemple avec openssl_spki_export_challenge
  • Example#980 - Exemple avec openssl_spki_export_challenge depuis <keygen>
  • Example#981 - Exemple avec openssl_spki_export
  • Example#982 - Exemple avec openssl_spki_export depuis <keygen>
  • Example#983 - Exemple avec openssl_spki_new
  • Example#984 - Exemple avec openssl_spki_verify
  • Example#985 - Exemple avec openssl_spki_verify depuis <keygen>
  • Example#986 - Exemple avec openssl_verify
  • Example#987 - Exemple avec openssl_verify
  • Example#988 - Exemple avec openssl_x509_verify
  • Example#989 - Utilisation basique de la fonction password_algos
  • Example#990 - Exemple avec password_hash
  • Example#991 - Exemple avec password_hash en définissant manuellement l'option cost
  • Example#992 - Exemple avec password_hash trouver un bon coût (cost)
  • Example#993 - Exemple avec password_hash et Argon2i
  • Example#994 - Usage de password_needs_rehash
  • Example#995 - Exemple avec password_verify
  • Example#996 - sodium_crypto_kx_keypair usage
  • Example#997 - password_hash example
  • Example#998 - password_hash example
  • Example#999 - Exemple avec DBA
  • Example#1000 - Lecture d'une base de données
  • Example#1001 - Exemple avec dba_handlers
  • Example#1002 - Lister les Priviléges pour une Colonne
  • Example#1003 - Lister les Colonnes d'une Table
  • Example#1004 - Connexion sans DSN
  • Example#1005 - Lister les DSNs disponibles
  • Example#1006 - Exemple avec odbc_execute et odbc_prepare
  • Example#1007 - Exemple avec odbc_fetch_into
  • Example#1008 - Exemple avec odbc_next_result
  • Example#1009 - Exemple avec odbc_prepare et odbc_execute
  • Example#1010 - Lister les Clés primaire d'une Colonne
  • Example#1011 - Liste les Colonnes d'une Procédure Stocké
  • Example#1012 - Liste les Procédures stocké d'une Base de Donnée
  • Example#1013 - Exemple avec odbc_result
  • Example#1014 - Exemple avec odbc_setoption
  • Example#1015 - Liste les Statistiques d'une Table
  • Example#1016 - Liste les Priviléges d'une Table
  • Example#1017 - Liste les Tables dans un Catalogue
  • Example#1018 - Utilisation de PDO::ATTR_DRIVER_NAME
  • Example#1019 - Connexion à MySQL
  • Example#1020 - Gestion des erreurs de connexion
  • Example#1021 - Fermeture d'une connexion
  • Example#1022 - Connexions persistantes
  • Example#1023 - Exécution d'un groupe dans une transaction
  • Example#1024 - Insertions répétitives en utilisant les requêtes préparées
  • Example#1025 - Insertions répétées en utilisant des requêtes préparées
  • Example#1026 - Récupération des données en utilisant des requêtes préparées
  • Example#1027 - Appel d'une procédure stockée avec un paramètre de sortie
  • Example#1028 - Appel d'une procédure stockée avec un paramètre d'entrée/sortie
  • Example#1029 - Utilisation invalide de marqueur
  • Example#1030 - Création d'une instance PDO et définition du mode d'erreur
  • Example#1031 - Crée une instance PDO et définit le mode d'erreur depuis le constructeur
  • Example#1032 - Affichage d'une image depuis une base de données
  • Example#1033 - Insertion d'une image dans une base de données
  • Example#1034 - Insertion d'une image dans une base de données Oracle
  • Example#1035 - Annule une transaction
  • Example#1036 - Valide une transaction basique
  • Example#1037 - Committing a DDL transaction
  • Example#1038 - Crée une instance PDO via une invocation de pilote
  • Example#1039 - Crée une instance PDO via une invocation URI
  • Example#1040 - Crée une instance PDO avec un alias
  • Example#1041 - Récupération d'un code SQLSTATE
  • Example#1042 - Affiche les champs d'erreurs pour une connexion PDO_ODBC sur une base de données DB2
  • Example#1043 - Exécution d'une requête DELETE
  • Example#1044 - Récupération des attributs de connexion à une base de données
  • Example#1045 - Exemple avec PDO::getAvailableDrivers
  • Example#1046 - Modèle de déclaration SQL avec des paramètres nommés
  • Example#1047 - Modèle de déclaration SQL avec des marqueurs
  • Example#1048 - Exemple avec PDO::query
  • Example#1049 - Protection d'une chaîne normale
  • Example#1050 - Protection d'une chaîne dangereuse
  • Example#1051 - Protection d'une chaîne complexe
  • Example#1052 - Annulation d'une transaction
  • Example#1053 - Lie l'affichage du jeu de résultats à des variables PHP
  • Example#1054 - Exécution d'une requête préparée avec des emplacements nommés
  • Example#1055 - Exécution d'une requête préparée avec des marqueurs de positionnement
  • Example#1056 - Appel une procédure stockée avec un paramètre INOUT
  • Example#1057 - Exécute une requête préparée avec des marqueurs nommés
  • Example#1058 - Exécute une requête préparée avec des points d'interrogation comme paramètre fictif
  • Example#1059 - Exemple avec PDOStatement::closeCursor
  • Example#1060 - Comptage des colonnes
  • Example#1061 - Exemple avec PDOStatement::debugDumpParams et des paramètres nommés
  • Example#1062 - Exemple avec PDOStatement::debugDumpParams et des paramètres anonymes
  • Example#1063 - Détermine la catégorie de l'erreur qui survient
  • Example#1064 - Affiche les champs de errorInfo pour une connexion PDO_ODBC sur une base de données DB2
  • Example#1065 - Exécute une requête préparée avec des variables et valeurs liées
  • Example#1066 - Exécute une requête préparée avec un tableau de valeurs (paramètres de nom)
  • Example#1067 - Exécute une requête préparée avec un tableau de valeurs (marqueurs)
  • Example#1068 - Exécute une requête préparée avec un marqueur de positionnement
  • Example#1069 - Exécute une requête préparée en utilisant un tableau pour les clauses IN
  • Example#1070 - Récupération de lignes en utilisant différentes méthodes
  • Example#1071 - Récupération des lignes avec un curseur scrollable
  • Example#1072 - Ordre de construction
  • Example#1073 - Récupération de toutes les lignes d'un jeu de résultats
  • Example#1074 - Récupération de toutes les valeurs d'une seule colonne depuis un jeu de résultats
  • Example#1075 - Grouper toutes les valeurs d'une seule colonne
  • Example#1076 - Instancier une classe pour chaque résultat
  • Example#1077 - Appel d'une fonction pour chaque résultat
  • Example#1078 - Retourne la première colonne de la ligne suivante
  • Example#1079 - Récupération des metainformations pour une colonne
  • Example#1080 - Récupération de multiples lignes de résultats retournées par une procédure stockée
  • Example#1081 - Retourne le nombre de lignes effacées
  • Example#1082 - Comptage des lignes retournées par une requête SELECT
  • Example#1083 - Définition du mode de récupération
  • Example#1084 - Insertion de LOBs dans CUBRID PDO
  • Example#1085 - Récupère des LOBs depuis CUBRID PDO
  • Example#1086 - Insertion d'un jeu dans CUBRID PDO avec le type de données par défaut.
  • Example#1087 - Spécifie le type de données lors de l'insertion du jeu dans CUBRID PDO
  • Example#1088 - Exemples de DSN PDO_CUBRID
  • Example#1089 - Exemple avec PDO::cubrid_schema
  • Example#1090 - Exemples avec PDO_DBLIB DSN
  • Example#1091 - Exemples avec PDO_FIREBIRD DSN
  • Example#1092 - Exemple avec un DSN PDO_FIREBIRD avec un port et un chemin
  • Example#1093 - Exemple avec un DSN PDO_FIREBIRD en local et un chemin vers le fichier employee.fdb sur un système Debian
  • Example#1094 - Un DSN PDO_FIREBIRD pour se connecter à une base de donnée en dialecte 1
  • Example#1095 - Exemple avec PDO_IBM DSN en utilisant db2cli.ini
  • Example#1096 - Exemple avec PDO_IBM DSN en utilisant une chaîne complète de connexion
  • Example#1097 - Exemple DSN de PDO_INFORMIX avec odbc.ini
  • Example#1098 - Exemple DSN de PDO_INFORMIX avec une chaîne de caractères de connexion
  • Example#1099 - Forcer la bufferisation des requêtes avec mysql
  • Example#1100 - Exemples avec le DSN de PDO_MYSQL
  • Example#1101 - Exemples de DSN PDO_SQLSRV
  • Example#1102 - Exemples avec PDO_OCI DSN
  • Example#1103 - Exemple avec PDO_ODBC DSN (pilote ODBC Manager)
  • Example#1104 - Exemple avec PDO_ODBC DSN (connexion non cataloguée IBM DB2)
  • Example#1105 - Exemple avec PDO_ODBC DSN (connexion non cataloguée Microsoft Access)
  • Example#1106 - Exemples avec PDO_PGSQL DSN
  • Example#1107 - Exemple avec PDO::pgsqlLOBCreate
  • Example#1108 - Exemple avec PDO::pgsqlLOBOpen
  • Example#1109 - Exemple avec PDO::pgsqlLOBUnlink
  • Example#1110 - Exemples avec PDO_SQLITE DSN
  • Example#1111 - Exemple d'agrégation avec une fonction max_length
  • Example#1112 - Exemple avec PDO::sqliteCreateCollation
  • Example#1113 - Exemple avec PDO::sqliteCreateFunction
  • Example#1114 - Exemple de récupération de données
  • Example#1115 - Exemple d'insertion de données
  • Example#1116 - Exemple avec cubrid_bind
  • Example#1117 - Exemple avec cubrid_bind et les types BLOB/CLOB
  • Example#1118 - Exemple avec cubrid_bind et BLOB/CLOB
  • Example#1119 - Exemple avec cubrid_close_prepare
  • Example#1120 - Exemple avec cubrid_close_request
  • Example#1121 - Exemple avec cubrid_col_get
  • Example#1122 - Exemple avec cubrid_col_size
  • Example#1123 - Exemple avec cubrid_column_names
  • Example#1124 - Exemple avec cubrid_column_types
  • Example#1125 - Exemple avec cubrid_commit
  • Example#1126 - Exemple avec cubrid_connect_with_url
  • Example#1127 - Exemple avec cubrid_connect_with_url
  • Example#1128 - Exemple avec cubrid_connect
  • Example#1129 - Exemple avec cubrid_current_oid
  • Example#1130 - Exemple avec cubrid_disconnect
  • Example#1131 - Exemple avec cubrid_drop
  • Example#1132 - Exemple avec cubrid_error_code_facility
  • Example#1133 - Exemple avec cubrid_error_code
  • Example#1134 - Exemple avec cubrid_error_msg
  • Example#1135 - Exemple avec cubrid_execute
  • Example#1136 - Exemple avec cubrid_fetch
  • Example#1137 - Exemple avec cubrid_free_result
  • Example#1138 - Exemple avec cubrid_get_charset
  • Example#1139 - Exemple avec cubrid_get_class_name
  • Example#1140 - Exemple avec cubrid_get_client_info
  • Example#1141 - Exemple avec cubrid_get_db_parameter
  • Example#1142 - Exemple avec cubrid_get_query_timeout
  • Example#1143 - Exemple avec cubrid_get_server_info
  • Example#1144 - Exemple avec cubrid_get
  • Example#1145 - Exemple avec cubrid_insert_id
  • Example#1146 - Exemple avec cubrid_is_instance
  • Example#1147 - Exemple avec cubrid_lob_close
  • Example#1148 - Exemple avec cubrid_lob_export
  • Example#1149 - Exemple avec cubrid_lob_get
  • Example#1150 - Exemple avec cubrid_lob_send
  • Example#1151 - Exemple avec cubrid_lob_size
  • Example#1152 - Exemple avec cubrid_lob2_bind
  • Example#1153 - cubrid_lob2_export example
  • Example#1154 - Exemple avec cubrid_lob2_export
  • Example#1155 - Exemple 1 avec cubrid_lob2_read
  • Example#1156 - Exemple 2 avec cubrid_lob2_read
  • Example#1157 - Exemple avec cubrid_lob2_seek64
  • Example#1158 - Exemple avec cubrid_lob2_seek
  • Example#1159 - Exemple 1 avec cubrid_lob2_write
  • Example#1160 - Exemple 2 avec cubrid_lob2_write
  • Example#1161 - Exemple avec cubrid_lock_read
  • Example#1162 - Exemple avec cubrid_lock_write
  • Example#1163 - Exemple avec cubrid_move_cursor
  • Example#1164 - Exemple avec cubrid_next_result
  • Example#1165 - Exemple avec cubrid_num_cols
  • Example#1166 - Exemple avec cubrid_num_rows
  • Example#1167 - Exemple avec cubrid_pconnect_with_url sans propriétés
  • Example#1168 - cubrid_pconnect_with_url url with properties example
  • Example#1169 - Exemple avec cubrid_connect
  • Example#1170 - Exemple avec cubrid_prepare
  • Example#1171 - Exemple avec cubrid_put
  • Example#1172 - Exempe avec cubrid_rollback
  • Example#1173 - Exemple avec cubrid_schema
  • Example#1174 - Exemple avec cubrid_seq_drop
  • Example#1175 - Exemple avec cubrid_seq_insert
  • Example#1176 - Exemple avec cubrid_seq_put
  • Example#1177 - Exemple avec cubrid_set_add
  • Example#1178 - Exemple avec cubrid_get_db_parameter
  • Example#1179 - Exemple avec cubrid_set_drop
  • Example#1180 - Exemple avec cubrid_version
  • Example#1181 - Exemple avec cubrid_affected_rows
  • Example#1182 - Exemple avec cubrid_client_encoding
  • Example#1183 - Exemple avec cubrid_close
  • Example#1184 - Exemple avec cubrid_data_seek
  • Example#1185 - Exemple avec cubrid_db_name
  • Example#1186 - Exemple avec cubrid_errno
  • Example#1187 - Exemple avec cubrid_error
  • Example#1188 - Exemple avec cubrid_fetch_array
  • Example#1189 - Exemple avec cubrid_fetch_assoc
  • Example#1190 - Exemple avec cubrid_fetch_field
  • Example#1191 - Exemple avec cubrid_fetch_lengths
  • Example#1192 - Exemple avec cubrid_fetch_object
  • Example#1193 - Exemple avec cubrid_fetch_row
  • Example#1194 - Exemple avec cubrid_field_flags
  • Example#1195 - Exemple avec cubrid_field_len
  • Example#1196 - Exemple avec cubrid_field_name
  • Example#1197 - Exemple avec cubrid_field_seek
  • Example#1198 - Exemple avec cubrid_field_table
  • Example#1199 - Exemple avec cubrid_field_type
  • Example#1200 - Exemple avec cubrid_list_dbs
  • Example#1201 - Exemple avec cubrid_num_fields
  • Example#1202 - Exemple avec cubrid_ping
  • Example#1203 - Requête invalide
  • Example#1204 - Requête valide
  • Example#1205 - Exemple avec cubrid_real_escape_string
  • Example#1206 - Exemple avec cubrid_result
  • Example#1207 - Exemple avec cubrid_unbuffered_query
  • Example#1208 - Exemple avec cubrid_load_from_glo
  • Example#1209 - Exemple avec cubrid_new_glo
  • Example#1210 - Exemple avec cubrid_save_to_glo
  • Example#1211 - Exemple avec cubrid_send_glo
  • Example#1212 - Insertion d'un enregistrement dans une base de données dBase
  • Example#1213 - Ferme un fichier de base de données dBase
  • Example#1214 - Création d'un fichier de base de données dBase
  • Example#1215 - Affiche les informations d'en-têtes pour un fichier de base de données dBase
  • Example#1216 - Liste tous les membres enregistrés dans la base de données
  • Example#1217 - Exemple avec dbase_numfields
  • Example#1218 - Lecture de tous les enregistrements de la base de données
  • Example#1219 - Ouverture d'un fichier de base de données dBase
  • Example#1220 - Vide une base de données dBase
  • Example#1221 - Mise à jour d'un enregistrement dans une base de données
  • Example#1222 - Exemple avec ibase_backup
  • Example#1223 - Exemple de ibase_backup avec des arguments
  • Example#1224 - Exemple avec ibase_blob_get
  • Example#1225 - Exemple avec ibase_blob_import
  • Example#1226 - Exemple avec ibase_connect
  • Example#1227 - Exemple avec ibase_execute
  • Example#1228 - Exemple avec ibase_fetch_object
  • Example#1229 - Exemple avec ibase_field_info
  • Example#1230 - Exemple avec ibase_name_result
  • Example#1231 - Exemple avec ibase_num_fields
  • Example#1232 - Exemple avec ibase_query
  • Example#1233 - Exemple avec ibase_restore
  • Example#1234 - Exemple de ibase_restore avec des arguments
  • Example#1235 - Exemple avec ibase_service_attach
  • Example#1236 - Exemple avec ibase_service_attach
  • Example#1237 - Exemple deibase_service_attach en utilisant la syntaxe hostname/port
  • Example#1238 - Exemple avec ibase_service_detach
  • Example#1239 - Exemple avec ibase_set_event_handler
  • Example#1240 - Exemple avec fbsql_close
  • Example#1241 - Exemple avec fbsql_connect
  • Example#1242 - Exemple avec fbsql_create_blob
  • Example#1243 - Exemple avec fbsql_create_clob
  • Example#1244 - Exemple avec fbsql_create_db
  • Example#1245 - Exemple avec fbsql_data_seek
  • Example#1246 - Exemple avec fbsql_create_clob
  • Example#1247 - Exemple avec fbsql_errno
  • Example#1248 - Exemple avec fbsql_error
  • Example#1249 - Exemple avec fbsql_fetch_array
  • Example#1250 - Exemple avec fbsql_fetch_assoc
  • Example#1251 - Exemple avec fbsql_fetch_field
  • Example#1252 - Exemple avec fbsql_fetch_object
  • Example#1253 - Exemple avec fbsql_field_name
  • Example#1254 - Exemple avec fbsql_field_type
  • Example#1255 - Exemple avec fbsql_list_dbs
  • Example#1256 - Exemple avec fbsql_list_fields
  • Example#1257 - Exemple avec fbsql_next_result
  • Example#1258 - Exemple avec fbsql_num_rows
  • Example#1259 - Exemple avec fbsql_query
  • Example#1260 - Exemple avec fbsql_query
  • Example#1261 - Exemple avec fbsql_read_blob
  • Example#1262 - Exemple avec fbsql_read_clob
  • Example#1263 - Exemple avec fbsql_table_name
  • Example#1264 - Récupération de la valeur de AUTOCOMMIT pour une connexion
  • Example#1265 - Modification de la valeur de AUTOCOMMIT pour une connexion
  • Example#1266 - Association de variables PHP à une requête préparée
  • Example#1267 - Appel de procédures d'enregistrement avec les paramètres IN et OUT
  • Example#1268 - Insertion d'un objet large binaire (BLOB) provenant directement d'un fichier
  • Example#1269 - Exemple avec db2_client_info
  • Example#1270 - Fermeture d'une connexion
  • Example#1271 - Récupération de la valeur de SQLSTATE pour une tentative de connexion échouée
  • Example#1272 - Récupération du message d'erreur retourné par une tentative de connexion échouée
  • Example#1273 - Création d'une connexion cataloguée
  • Example#1274 - Création d'une connexion non cataloguée
  • Example#1275 - Création d'une connexion avec autocommit désactivé par défaut
  • Example#1276 - Meilleure performance i5/OS
  • Example#1277 - Utilisation du contexte
  • Example#1278 - Exemple avec db2_escape_string
  • Example#1279 - Création d'une table avec db2_exec
  • Example#1280 - Exécution d'une requête SELECT avec un curseur flottant
  • Example#1281 - Retourne des données XML en tant que ResultSet SQL
  • Example#1282 - Exécuter un "JOIN" avec des données XML
  • Example#1283 - Retourne des données SQL faisant partie d'un document XML large
  • Example#1284 - Préparation et exécution d'une requête SQL avec des marqueurs
  • Example#1285 - Appel d'une procédure d'enregistrement avec un paramètre de SORTIE
  • Example#1286 - Retourne des données XML en tant que ResultSet SQL
  • Example#1287 - Exécuter un "JOIN" avec des données XML
  • Example#1288 - Retourne des données SQL faisant partie d'un document XML large
  • Example#1289 - Itère avec un curseur d'avancement seul
  • Example#1290 - Récupération de lignes spécifiques avec db2_fetch_array provenant d'un curseur flottant
  • Example#1291 - Itère avec un curseur d'avancement seul
  • Example#1292 - Récupération de lignes spécifiques avec db2_fetch_assoc provenant d'un curseur flottant
  • Example#1293 - Itère avec un curseur d'avancement seul
  • Example#1294 - Récupération de lignes spécifiques avec db2_fetch_both provenant d'un curseur flottant
  • Example#1295 - Exemple avec db2_fetch_object
  • Example#1296 - Itère à travers un jeu de résultats
  • Example#1297 - Alternatives recommandées i5/OS pour db2_fetch_row/db2_result
  • Example#1298 - Fixe et récupère les paramètres d'une ressource de connexion
  • Example#1299 - Exemple avec db2_last_insert_id
  • Example#1300 - Itére à travers différents types de données
  • Example#1301 - Exemple avec db2_next_result
  • Example#1302 - Exemple avec db2_num_fields
  • Example#1303 - Fermer une connexion DB2 persistante
  • Example#1304 - Exemple d'utilisation de db2_pconnect
  • Example#1305 - Utilisation de contextes de confiance DB2
  • Example#1306 - Préparation et exécution d'une requête SQL avec des marqueurs
  • Example#1307 - Exemple d'utilisation de db2_result
  • Example#1308 - Annulation d'une requête DELETE
  • Example#1309 - Exemple avec db2_server_info
  • Example#1310 - Fixer un paramètre à une ressource de connexion
  • Example#1311 - Fixe des paramètres multiples avec une ressource de connexion
  • Example#1312 - Fixe des paramètres multiples avec une clé invalide
  • Example#1313 - Fixe des paramètres multiples avec une valeur invalide
  • Example#1314 - Fixe des paramètres multiples avec une ressource de connexion et un mauvais type
  • Example#1315 - Fixe des paramètres multiples avec une mauvaise ressource
  • Example#1316 - Tout mettre ensemble
  • Example#1317 - Les curseurs i5/OS sont en lecture seule
  • Example#1318 - Exemple d'utilisation de PassEnv avec Ingres
  • Example#1319 - Exemple simple avec Ingres
  • Example#1320 - Exemple avec ingres_charset
  • Example#1321 - Exemple avec ingres_connect
  • Example#1322 - Exemple avec ingres_cursor
  • Example#1323 - Exemple avec ingres_errno
  • Example#1324 - Exemple avec ingres_error
  • Example#1325 - Exemple avec ingres_errsqlstate
  • Example#1326 - Protège les caractères spéciaux avant de les utiliser avec Ingres
  • Example#1327 - Exemple avec ingres_fetch_array
  • Example#1328 - Récupère une ligne dans un tableau associatif
  • Example#1329 - Exemple avec ingres_fetch_object
  • Example#1330 - Lit la valeur retournée par une procédure stockée Ingres
  • Example#1331 - Exemple avec ingres_fetch_row
  • Example#1332 - Libération d'un résultat Ingres
  • Example#1333 - Envoi d'une requête à Ingres
  • Example#1334 - Passage de paramètres de requête à ingres_query
  • Example#1335 - Insertion d'un BLOB dans les paramètres de requête
  • Example#1336 - Positionnement du curseur Ingres sur la 3ème ligne
  • Example#1337 - Configuration du format de date à ISO4
  • Example#1338 - Configuration du fuseau horaire de Hong-Kong
  • Example#1339 - Exécution d'une requête SQL sans buffer sur Ingres
  • Example#1340 - Passage de paramètres de requêtes à ingres_unbuffered_query
  • Example#1341 - Insertion d'un BLOB dans les paramètres de requêtes SQL Ingres
  • Example#1342 -
  • Example#1343 -
  • Example#1344 -
  • Example#1345 -
  • Example#1346 -
  • Example#1347 -
  • Example#1348 -
  • Example#1349 -
  • Example#1350 -
  • Example#1351 -
  • Example#1352 -
  • Example#1353 -
  • Example#1354 -
  • Example#1355 -
  • Example#1356 -
  • Example#1357 - Préférences de lecture via l'URI de connexion avec une syntaxe de type requête
  • Example#1358 - Préférences de lecture avec une syntaxe de type tableau pour les jeux de tags
  • Example#1359 - Passing a WriteConcern to a write operation
  • Example#1360 - Connection string WriteConcerns
  • Example#1361 - MongoDB::setWriteConcern and MongoCollection::setWriteConcern
  • Example#1362 - Unacknowledged WriteConcern, followed with Acknowledged Write
  • Example#1363 - Acknowledged Writes
  • Example#1364 - Majority Acknowledged Write
  • Example#1365 - Acknowledged and Journaled Write
  • Example#1366 - Connexion à l'instance MongoDB avec un cryptage SSL
  • Example#1367 - Connexion à l'instance MongoDB avec le cryptage SSL avec des vérifications
  • Example#1368 - Connexion à l'instance MongoDB qui nécessite des certificats client
  • Example#1369 - Authentification avec des certificats X.509
  • Example#1370 - Authentification sur la base de données "admin"
  • Example#1371 - Authentification sur une base de données normale
  • Example#1372 - Liste du jeux de réplication
  • Example#1373 - Mauvais noms pour le jeu de réplication
  • Example#1374 - Utilisation correcte des noms de deux jeux de réplication
  • Example#1375 -
  • Example#1376 -
  • Example#1377 -
  • Example#1378 -
  • Example#1379 -
  • Example#1380 -
  • Example#1381 - Héritage des préférences de lecture depuis le niveau de la base de données vers le curseur
  • Example#1382 -
  • Example#1383 -
  • Example#1384 -
  • Example#1385 -
  • Example#1386 -
  • Example#1387 -
  • Example#1388 -
  • Example#1389 - Utilisation basique de MongoClient
  • Example#1390 - Exemple avec MongoClient::close
  • Example#1391 - Exemple avec MongoClient::__construct et un pool de réplicats
  • Example#1392 - Connexion via socket UNIX
  • Example#1393 - Exemple d'authentification MongoClient::__construct
  • Example#1394 - Exemple avec MongoClient::__construct et des préférences de lecture
  • Example#1395 - Exemple avec MongoClient::__construct et des options
  • Example#1396 - Exemple avec MongoClient::__construct et les préférences de lecture
  • Example#1397 - Exemple avec MongoClient::getConnections
  • Example#1398 - Exemple avec MongoClient::getReadPreference
  • Example#1399 - Exemple avec MongoClient::getWriteConcern
  • Example#1400 - Exemple avec MongoClient::killCursor
  • Example#1401 - Exemple avec MongoClient::listDBs
  • Example#1402 - Exemple avec MongoClient::selectCollection
  • Example#1403 - Exemple avec MongoClient::setReadPreference
  • Example#1404 - Exemple avec MongoClient::setWriteConcern
  • Example#1405 - Sélection d'une base de données
  • Example#1406 - Exemple avec MongoDB::command et "distinct"
  • Example#1407 - Exemple avec MongoDB::command et "distinct"
  • Example#1408 - Exemple avec MongoDB::command et MapReduce
  • Example#1409 - Exemple avec la commande MongoDB::command "geoNear"
  • Example#1410 - Exemple avec MongoDB::createCollection
  • Example#1411 - Exemple pour MongoDB::createDBRef
  • Example#1412 - Exemple pour MongoDB::createDBRef
  • Example#1413 - Exemple avec MongoDB::drop
  • Example#1414 - Exemple avec MongoDB::execute
  • Example#1415 - Exemple avec MongoDB::execute
  • Example#1416 - Exemple de porté
  • Example#1417 - Exemple avec MongoDB::getCollectionInfo
  • Example#1418 - Exemple avec MongoDB::getCollectionNames
  • Example#1419 - Exemple pour MongoDB::getDBRef
  • Example#1420 - Exemple pour MongoDB::getGridFS
  • Example#1421 - Exemple avec MongoDB::getReadPreference
  • Example#1422 - Exemple avec MongoDB::getWriteConcern
  • Example#1423 - Exemple avec MongoDB::lastError
  • Example#1424 - Exemple avec MongoDB::lastError et une clé dupliquée
  • Example#1425 - Exemple avec MongoDB::listCollections
  • Example#1426 - Exemple pour MongoDB::repair
  • Example#1427 - Exemple avec MongoDB::setReadPreference
  • Example#1428 - Exemple avec MongoDB::setWriteConcern
  • Example#1429 - Exemple avec MongoCollection::aggregate
  • Example#1430 - Exemple avec MongoCollection::aggregate
  • Example#1431 - Exemple avec MongoCollection::aggregate
  • Example#1432 - Exemple avec MongoCollection::aggregate et des options de commande
  • Example#1433 - Exemple avec MongoCollection::aggregateCursor
  • Example#1434 - Exemple avec MongoCollection::aggregateCursor avec différentes tailles de lots initiaux
  • Example#1435 - Exemple avec MongoCollection::batchInsert
  • Example#1436 - Exemple avec MongoCollection::batchInsert où l'on ignore les erreurs
  • Example#1437 - Exemple avec MongoCollection::count
  • Example#1438 - Exemple avec MongoCollection::createDBRef
  • Example#1439 - Exemple avec MongoCollection::createIndex
  • Example#1440 - Indexation géospatiale
  • Example#1441 - Exemple de suppression de doublons
  • Example#1442 - Exemple avec MongoCollection::deleteIndex
  • Example#1443 - Exemple avec MongoCollection::deleteIndexes
  • Example#1444 - Exemple avec MongoCollection::distinct
  • Example#1445 - Exemple avec MongoCollection::distinct sur un document embarqué
  • Example#1446 - Exemple avec MongoCollection::drop
  • Example#1447 - Exemple avec MongoCollection::ensureIndex
  • Example#1448 - indexation géospatiale
  • Example#1449 - Exemple de suppression de données dupliquées
  • Example#1450 - Exemple avec MongoCollection::find
  • Example#1451 - Exemple avec MongoCollection::find
  • Example#1452 - Exemple pour MongoCollection::find en utilisant $where
  • Example#1453 - Exemple pour MongoCollection::find utilisant $in
  • Example#1454 - Récupération des résultats sous la forme d'un tableau
  • Example#1455 - Exemple avec MongoCollection::findAndModify
  • Example#1456 - Exemple avec MongoCollection::findAndModify et un gestionnaire d'erreur
  • Example#1457 - MongoCollection::findOne Cherche un document par son id.
  • Example#1458 - MongoCollection::findOne Cherche un document par condition.
  • Example#1459 - Exemple avec MongoCollection::getDBRef
  • Example#1460 - Exemple avec MongoCollection::find
  • Example#1461 - Exemple avec MongoCollection::getName
  • Example#1462 - Exemple avec MongoCollection::getReadPreference
  • Example#1463 - Exemple avec MongoCollection::getWriteConcern
  • Example#1464 - Exemple avec MongoCollection::group
  • Example#1465 - Exemple avec MongoCollection::group
  • Example#1466 - Passer une fonction keys
  • Example#1467 - Exemple avec MongoCollection::insert _id
  • Example#1468 - Exemple d'une écriture reconnue avec MongoCollection::insert
  • Example#1469 - Exemple avec MongoCollection::parallelCollectionScan
  • Example#1470 - Exemple avec MongoCollection::remove et justOne
  • Example#1471 - Exemple avec MongoCollection::save
  • Example#1472 - Exemple avec MongoCollection::setReadPreference avec un jeu de tags sous la forme d'un tableau
  • Example#1473 - Exemple avec MongoDB::setWriteConcern
  • Example#1474 - Exemple avec MongoCollection::toIndexString
  • Example#1475 - Exemple avec MongoCollection::__toString
  • Example#1476 - Exemple avec MongoCollection::update
  • Example#1477 - Exemples avec MongoCollection::update et upsert
  • Example#1478 - Exemple avec plusieurs MongoCollection::update
  • Example#1479 - Utilisation basique de MongoCursor
  • Example#1480 - Parcourt d'un MongoCursor
  • Example#1481 - Ajout d'options à MongoCursor
  • Example#1482 - Exemple de l'ajout d'un commentaire avec MongoCursor::addOption
  • Example#1483 - Exemple avec MongoCursor::addOption
  • Example#1484 - Exemple avec MongoCursor::awaitData
  • Example#1485 - Exemple avec MongoCursor::batchSize et des combinaisons avec la fonction MongoCursor::limit
  • Example#1486 - Exemple avec MongoCursor::count
  • Example#1487 - Exemple avec MongoCursor::doQuery
  • Example#1488 - Exemple avec MongoCursor::explain
  • Example#1489 - Exemple avec MongoCursor::getReadPreference
  • Example#1490 - Exemple avec MongoCursor::info
  • Example#1491 - Exemple avec MongoCursor::maxTimeMS
  • Example#1492 - Exemple avec MongoCursor::setFlag
  • Example#1493 - Exemple avec MongoCursor::setReadPreference
  • Example#1494 - Exemple avec MongoCursor::slaveOkay
  • Example#1495 - Exemple avec MongoCursor::sort
  • Example#1496 - Exemple avec MongoCursor::tailable
  • Example#1497 - Exemple avec MongoCursor::timeout
  • Example#1498 - Ajout d'options à MongoCommandCursor
  • Example#1499 - Exemple avec MongoCommandCursor::batchSize
  • Example#1500 - Exemple avec MongoCommandCursor
  • Example#1501 - Exemple avec MongoCommandCursor::createFromDocument
  • Example#1502 - Exemple de valeur retournée par MongoCommandCursor::getReadPreference
  • Example#1503 - Exemple avec MongoCommandCursor::info
  • Example#1504 - Exemple avec MongoCommandCursor::rewind
  • Example#1505 - Exemple avec MongoCommandCursor::setReadPreference et un tableau de jeux de tag
  • Example#1506 - Exemple avec MongoCommandCursor::timeout
  • Example#1507 - Exemple avec MongoId::__construct
  • Example#1508 - Exemple avec MongoId::__construct et des paramètres
  • Example#1509 - Exemple avec MongoId::__toString
  • Example#1510 - Exemple avec MongoCode::__construct
  • Example#1511 - Utilisation de MongoCode et $where
  • Example#1512 - Exemple avec MongoCode::__toString
  • Example#1513 - Stockage des dates avec MongoDate
  • Example#1514 - Exemple avec MongoDate::__construct
  • Example#1515 - Exemple avec MongoDate::toDateTime
  • Example#1516 - Masque d'une expression rationnelle
  • Example#1517 - Exemple avec MongoRegex::__construct
  • Example#1518 - Exemple avec MongoRegex::__toString
  • Example#1519 -
  • Example#1520 - Liage des documents
  • Example#1521 - Création de lien MongoDBRef
  • Example#1522 - Exemple avec MongoDBRef::create
  • Example#1523 - Exemple avec MongoCollection::createDBRef
  • Example#1524 - Exemple pour MongoGridFS::findOne
  • Example#1525 - Exemple avec MongoGridFS::storeBytes avec des méta-données additionnelles
  • Example#1526 - Exemple avec MongoGridFS::storeFile avec des méta-données additionnelles
  • Example#1527 - Exemple avec MongoGridFS::storeUpload et un formulaire HTML
  • Example#1528 - Exemples pour MongoGridFSFile::getBytes
  • Example#1529 - Exemple avec MongoGridFSFile::getResource
  • Example#1530 - Exemples pour MongoGridFSFile::write
  • Example#1531 - Exemple avec MongoWriteBatch
  • Example#1532 - Exemple avec MongoWriteBatch::add
  • Example#1533 - Exemple avec MongoWriteBatch::add
  • Example#1534 - Exemple avec MongoWriteBatch::add
  • Example#1535 - Exemple avec MongoWriteBatch::add
  • Example#1536 - Exemple avec MongoWriteBatch::add
  • Example#1537 - Exemple avec MongoWriteBatch::add
  • Example#1538 - Exemple avec MongoLog::setCallback
  • Example#1539 - Modification de la taille de la file d'attente
  • Example#1540 - Exemple avec Mongo::setPoolSize
  • Example#1541 - Changer la taille de la file
  • Example#1542 - Exemple Mongo::setPoolSize
  • Example#1543 - Exemple avec MongoResultException::getDocument
  • Example#1544 - Catching MongoDuplicateKeyException
  • Example#1545 - Catching MongoProtocolException
  • Example#1546 - MongoDB\Driver\Manager::__construct basic example
  • Example#1547 - MongoDB\Driver\Manager::__construct basic examples
  • Example#1548 - MongoDB\Driver\Manager::executeBulkWrite example
  • Example#1549 - MongoDB\Driver\Manager::executeCommand with a command returning a single result document
  • Example#1550 - MongoDB\Driver\Manager::executeCommand with a command returning a cursor
  • Example#1551 - Limiting execution time for a command
  • Example#1552 - MongoDB\Driver\Manager::executeQuery example
  • Example#1553 - Limiting execution time for a query
  • Example#1554 - MongoDB\Driver\Manager::getReadConcern example
  • Example#1555 - MongoDB\Driver\Manager::getReadPreference example
  • Example#1556 - Exemple avec MongoDB\Driver\Manager::getServers
  • Example#1557 - MongoDB\Driver\Manager::getWriteConcern example
  • Example#1558 - Composing MongoDB\Driver\Command to provide a helper to create collections
  • Example#1559 - Exemple avec MongoDB\Driver\Command::__construct
  • Example#1560 - Exemple avec MongoDB\Driver\Command::__construct
  • Example#1561 - MongoDB\Driver\Query::__construct example
  • Example#1562 - Mixed write operations are grouped by type
  • Example#1563 - Ordered write operations causing an error
  • Example#1564 - MongoDB\Driver\BulkWrite::__construct example
  • Example#1565 - MongoDB\Driver\BulkWrite::count example
  • Example#1566 - MongoDB\Driver\BulkWrite::delete example
  • Example#1567 - MongoDB\Driver\BulkWrite::insert example
  • Example#1568 - MongoDB\Driver\BulkWrite::update example
  • Example#1569 - MongoDB\Driver\WriteConcern::bsonSerialize with majority write concern
  • Example#1570 - MongoDB\Driver\WriteConcern::bsonSerialize with wtimeout and journal
  • Example#1571 - Exemple avec MongoDB\Driver\WriteConcern::__construct
  • Example#1572 - MongoDB\Driver\WriteConcern::getJournal example
  • Example#1573 - MongoDB\Driver\WriteConcern::getW example
  • Example#1574 - MongoDB\Driver\WriteConcern::getWtimeout example
  • Example#1575 - MongoDB\Driver\WriteConcern::isDefault example
  • Example#1576 - MongoDB\Driver\ReadPreference::bsonSerialize with primary read preference
  • Example#1577 - MongoDB\Driver\ReadPreference::bsonSerialize with secondary read preference and tag sets
  • Example#1578 - MongoDB\Driver\ReadPreference::bsonSerialize with secondary read preference and max staleness
  • Example#1579 - Exemple avec MongoDB\Driver\ReadPreference::__construct
  • Example#1580 - MongoDB\Driver\ReadPreference::getMaxStalenessSeconds example
  • Example#1581 - MongoDB\Driver\ReadPreference::getMode example
  • Example#1582 - MongoDB\Driver\ReadPreference::getModeString example
  • Example#1583 - MongoDB\Driver\ReadPreference::getTagSets example
  • Example#1584 - MongoDB\Driver\ReadConcern::bsonSerialize with empty read concern
  • Example#1585 - MongoDB\Driver\ReadConcern::bsonSerialize with local read concern
  • Example#1586 - MongoDB\Driver\ReadConcern::__construct example
  • Example#1587 - MongoDB\Driver\ReadConcern::getLevel example
  • Example#1588 - MongoDB\Driver\ReadConcern::isDefault example
  • Example#1589 - Lecture d'un jeu de résultats
  • Example#1590 - Lecture d'un jeu de résultats pour un curseur à queue
  • Example#1591 - Exemple avec MongoDB\Driver\Cursor::getId
  • Example#1592 - Exemple avec MongoDB\Driver\Cursor::getServer
  • Example#1593 - Exemple avec MongoDB\Driver\Cursor::isDead
  • Example#1594 - Exemple avec MongoDB\Driver\Cursor::setTypeMap
  • Example#1595 - Exemple avec MongoDB\Driver\Cursor::toArray
  • Example#1596 - Exemple avec MongoDB\Driver\CursorId::__toString
  • Example#1597 - Exemple avec MongoDB\Driver\Server::getHost
  • Example#1598 - Exemple avec MongoDB\Driver\Server::getInfo
  • Example#1599 - Exemple avec MongoDB\Driver\Server::getLatency
  • Example#1600 - Exemple avec MongoDB\Driver\Server::getPort
  • Example#1601 - Exemple avec MongoDB\Driver\WriteConcernError::getCode
  • Example#1602 - Exemple avec MongoDB\Driver\WriteConcernError::getInfo
  • Example#1603 - Exemple avec MongoDB\Driver\WriteConcernError::getMessage
  • Example#1604 - Exemple avec MongoDB\Driver\WriteError::getCode
  • Example#1605 - Exemple avec MongoDB\Driver\WriteError::getIndex
  • Example#1606 - Exemple avec MongoDB\Driver\WriteError::getMessage
  • Example#1607 - Exemple avec MongoDB\Driver\WriteResult::getDeletedCount
  • Example#1608 - Exemple avec MongoDB\Driver\WriteResult::getInsertedCount
  • Example#1609 - Exemple avec MongoDB\Driver\WriteResult::getMatchedCount
  • Example#1610 - Exemple avec MongoDB\Driver\WriteResult::getModifiedCount
  • Example#1611 - Exemple avec MongoDB\Driver\WriteResult::getServer
  • Example#1612 - Exemple avec MongoDB\Driver\WriteResult::getUpsertedCount
  • Example#1613 - Exemple avec MongoDB\Driver\WriteResult::getUpsertedIds
  • Example#1614 - Exemple avec MongoDB\Driver\WriteResult::getWriteConcernError
  • Example#1615 - MongoDB\Driver\WriteResult::getWriteErrors avec une seule erreur
  • Example#1616 - MongoDB\Driver\WriteResult::getWriteErrors avec plusieurs erreurs
  • Example#1617 - MongoDB\Driver\WriteResult::isAcknowledged avec la préocupation d'écriture reconnue
  • Example#1618 - MongoDB\Driver\WriteResult::isAcknowledged avec la préocupation d'écriture non reconnue
  • Example#1619 - Exemple avec MongoDB\BSON\fromJSON
  • Example#1620 - Exemple avec MongoDB\BSON\fromPHP
  • Example#1621 - MongoDB\BSON\toCanonicalExtendedJSON example
  • Example#1622 - Exemple avec MongoDB\BSON\toJSON
  • Example#1623 - MongoDB\BSON\toPHP example
  • Example#1624 - MongoDB\BSON\toRelaxedExtendedJSON example
  • Example#1625 - Exemple avec MongoDB\BSON\Binary::__construct
  • Example#1626 - Exemple avec MongoDB\BSON\Binary::getData
  • Example#1627 - Exemple avec MongoDB\BSON\Binary::getType
  • Example#1628 - Exemple avec MongoDB\BSON\Binary::__toString
  • Example#1629 - Exemple avec MongoDB\BSON\Decimal128::__construct
  • Example#1630 - Exemple avec MongoDB\BSON\Decimal128::__toString
  • Example#1631 - MongoDB\BSON\Javascript::__construct example
  • Example#1632 - Exemple avec MongoDB\BSON\Javascript::getCode
  • Example#1633 - Exemple avec MongoDB\BSON\Javascript::getScope
  • Example#1634 - Exemple avec MongoDB\BSON\Javascript::__toString
  • Example#1635 - Exemple avec MongoDB\BSON\MaxKey::__construct
  • Example#1636 - Exemple avec MongoDB\BSON\MinKey::__construct
  • Example#1637 - Exemple avec MongoDB\BSON\ObjectId::__construct
  • Example#1638 - Exemple avec MongoDB\BSON\ObjectId::getTimestamp
  • Example#1639 - Exemple avec MongoDB\BSON\ObjectId::__toString
  • Example#1640 - MongoDB\BSON\Regex::__construct example
  • Example#1641 - Exemple avec BSON\Regex::getFlags
  • Example#1642 - Exemple avec BSON\Regex::getPattern
  • Example#1643 - Exemple avec BSON\Regex::__toString
  • Example#1644 - Exemple avec MongoDB\BSON\Timestamp::__construct
  • Example#1645 - Exemple avec MongoDB\BSON\Timestamp::__toString
  • Example#1646 - Exemple avec MongoDB\BSON\UTCDatetime::__construct
  • Example#1647 - Exemple avec MongoDB\BSON\UTCDatetime::toDateTime
  • Example#1648 - Exemple avec MongoDB\BSON\UTCDatetime::__toString
  • Example#1649 - MongoDB\BSON\Serializable::bsonSerialize renvoyant un tableau associatif pour le document racine
  • Example#1650 - MongoDB\BSON\Serializable::bsonSerialize renvoyant un tableau séquentiel pour le document racine
  • Example#1651 - MongoDB\BSON\Serializable::bsonSerialize renvoyant un tableau associatif pour le champ de document
  • Example#1652 - MongoDB\BSON\Serializable::bsonSerialize renvoyant un tableau séquentiel pour le champ de document
  • Example#1653 - Exemple avec MongoDB\BSON\Unserializable::bsonUnserialize
  • Example#1654 - Exemple avec MongoDB\BSON\Int64::__toString
  • Example#1655 - Exemple avec MongoDB\Driver\Exception\WriteException::getWriteResult
  • Example#1656 - Comparaison des APIs MySQL
  • Example#1657 - Commande de configuration pour l'utilisation de mysqlnd ou de libmysqlclient
  • Example#1658 - Exemple de requêtes n'utilisant pas la mémoire tampon : mysqli
  • Example#1659 - Exemple de requêtes n'utilisant pas la mémoire tampon : pdo_mysql
  • Example#1660 - Problèmes lors de la définition du jeu de caractères avec SQL
  • Example#1661 - Exemple de définition du jeu de caractères : mysqli
  • Example#1662 - Exemple de définition du jeu de caractères : pdo_mysql
  • Example#1663 - Migration facile depuis l'ancienne extension mysql
  • Example#1664 - Interface procédurale et orientée objet
  • Example#1665 - Mauvais style de codage
  • Example#1666 - Signification spéciale de localhost
  • Example#1667 - Paramètres par défaut
  • Example#1668 - Connexion à MySQL
  • Example#1669 - Navigation dans des résultats mis en mémoire tampon
  • Example#1670 - Navigation dans des résultats non mis en mémoire tampon
  • Example#1671 - Le protocole texte retourne des chaînes de caractères par défaut
  • Example#1672 - Types natifs des données avec mysqlnd et l'option de connexion
  • Example#1673 - Première étape : la préparation
  • Example#1674 - Seconde étape : lie et exécute
  • Example#1675 - Requête de type INSERT préparée une seule fois, et exécutée plusieurs fois
  • Example#1676 - Moins d'aller-retour en utilisant les multi-INSERTs SQL
  • Example#1677 - Types de données natifs
  • Example#1678 - Liage des variables de sortie
  • Example#1679 - Utilisation de mysqli_result pour récupérer les résultats
  • Example#1680 - Jeu de résultats mis en mémoire tampon pour plus de flexibilité dans la lecture
  • Example#1681 - Appel d'une procédure stockée
  • Example#1682 - Utilisation des variables de session
  • Example#1683 - Récupération des résultats issus d'une procédure stockée
  • Example#1684 - Procédures stockées et requête préparée
  • Example#1685 - Procédures stockées et requête préparée en utilisant l'API de liage
  • Example#1686 - Requêtes multiples
  • Example#1687 - Injection SQL
  • Example#1688 - Définir le mode autocommit via SQL ou via l'API
  • Example#1689 - Validation et annulation d'une transaction
  • Example#1690 - Accès aux méta-données du jeu de résultats
  • Example#1691 - Méta-données via des requêtes préparées
  • Example#1692 - Exemple avec $mysqli->affected_rows
  • Example#1693 - Exemple avec mysqli::autocommit
  • Example#1694 - Exemple avec mysqli::begin_transaction
  • Example#1695 - Exemple avec mysqli::change_user
  • Example#1696 - Exemple avec mysqli::character_set_name
  • Example#1697 - Exemple avec $mysqli->connect_errno
  • Example#1698 - Exemple avec $mysqli->connect_error
  • Example#1699 - Exemple mysqli::__construct
  • Example#1700 - Étendre la classe mysqli
  • Example#1701 - Gestion d'erreur manuelle
  • Example#1702 - Génération d'un fichier de "traces"
  • Example#1703 - Exemple avec $mysqli->errno
  • Example#1704 - Exemple avec $mysqli->error_list
  • Example#1705 - Exemple avec $mysqli->error
  • Example#1706 - Exemple avec $mysqli->field_count
  • Example#1707 - Exemple avec mysqli::get_charset
  • Example#1708 - Exemple avec mysqli_get_client_info
  • Example#1709 - Exemple avec mysqli_get_client_version
  • Example#1710 - Exemple avec mysqli_get_connection_stats
  • Example#1711 - Exemple avec $mysqli->host_info
  • Example#1712 - Exemple avec $mysqli->protocol_version
  • Example#1713 - Exemple avec $mysqli->server_info
  • Example#1714 - Exemple avec $mysqli->server_version
  • Example#1715 - Exemple avec $mysqli->info
  • Example#1716 - Exemple avec $mysqli->insert_id
  • Example#1717 - Exemple avec mysqli::kill
  • Example#1718 - Exemple avec mysqli::multi_query
  • Example#1719 - Exemple avec mysqli::ping
  • Example#1720 - Exemple avec mysqli_poll
  • Example#1721 - Exemple avec mysqli::prepare
  • Example#1722 - Exemple avec mysqli::query
  • Example#1723 - Exemple avec mysqli::real_connect
  • Example#1724 - Exemple avec mysqli::real_escape_string
  • Example#1725 - Exemple avec mysqli::select_db
  • Example#1726 - Exemple avec mysqli::set_charset
  • Example#1727 - Exemple avec $mysqli->sqlstate
  • Example#1728 - Exemple avec mysqli::stat
  • Example#1729 - Exemple avec $mysqli->thread_id
  • Example#1730 - Exemple avec mysqli::use_result
  • Example#1731 - Exemple avec $mysqli->warning_count
  • Example#1732 - Style orienté objet
  • Example#1733 - Style procédural
  • Example#1734 - Style orienté objet
  • Example#1735 - Style procédural
  • Example#1736 - Style orienté objet
  • Example#1737 - Style procédural
  • Example#1738 - Style orienté objet
  • Example#1739 - Style procédural
  • Example#1740 - Style orienté objet
  • Example#1741 - Style procédural
  • Example#1742 - Style orienté objet
  • Example#1743 - Style procédural
  • Example#1744 - Style orienté objet
  • Example#1745 - Style procédural
  • Example#1746 - Style orienté objet
  • Example#1747 - Style procédural
  • Example#1748 - Style orienté objet
  • Example#1749 - Style procédural
  • Example#1750 - Style orienté objet
  • Example#1751 - Style procédural
  • Example#1752 - Style orienté objet
  • Example#1753 - Style procédural
  • Example#1754 - Style orienté objet
  • Example#1755 - Style procédural
  • Example#1756 - Style orienté objet
  • Example#1757 - Style procédural
  • Example#1758 - Style orienté objet
  • Example#1759 - Style procédural
  • Example#1760 - Style orienté objet
  • Example#1761 - Style procédural
  • Example#1762 - Style orienté objet
  • Example#1763 - Style orienté objet
  • Example#1764 - Style procédural
  • Example#1765 - Style orienté objet
  • Example#1766 - Style procédural
  • Example#1767 - Style orienté objet
  • Example#1768 - Style procédural
  • Example#1769 - Style orienté objet
  • Example#1770 - Style procédural
  • Example#1771 - mysqli_result::fetch_array example
  • Example#1772 - Exemple mysqli_result::fetch_assoc
  • Example#1773 - Comparaison de l'usage de mysqli_result iterator et mysqli_result::fetch_assoc
  • Example#1774 - Style orienté objet
  • Example#1775 - Style procédural
  • Example#1776 - Style orienté objet
  • Example#1777 - Style procédural
  • Example#1778 - Style orienté objet
  • Example#1779 - Style procédural
  • Example#1780 - Exemple mysqli_result::fetch_object
  • Example#1781 - Exemple mysqli_result::fetch_row
  • Example#1782 - Style orienté objet
  • Example#1783 - Style procédural
  • Example#1784 - Style orienté objet
  • Example#1785 - Style procédural
  • Example#1786 - Style orienté objet
  • Example#1787 - Style procédural
  • Example#1788 - Style orienté objet
  • Example#1789 - Style procédural
  • Example#1790 - Style orienté objet
  • Example#1791 - Style procédural
  • Example#1792 - Rapport d'erreur à l'exception des erreurs de mauvais index
  • Example#1793 - Un exemple avec mysqli_get_client_stats
  • Example#1794 - Connecting to a MySQL Server
  • Example#1795 - Creating a Schema and Collection on the MySQL Server
  • Example#1796 - Storing and Retrieving Data
  • Example#1797 - Fetching and Iterating Multiple Documents
  • Example#1798 - mysql_xdevapi\Expression example
  • Example#1799 - URI examples
  • Example#1800 - mysql_xdevapi\getSession example
  • Example#1801 - mysql_xdevapi\RowResult::getWarnings example
  • Example#1802 - mysql_xdevapi\RowResult::getWarningsCount example
  • Example#1803 - mysql_xdevapi\Client::__construct example
  • Example#1804 - mysql_xdevapi\Collection::add example
  • Example#1805 - mysql_xdevapi\Collection::addOrReplaceOne example
  • Example#1806 - mysql_xdevapi\Collection::getOne example
  • Example#1807 - mysql_xdevapi\Collection::count example
  • Example#1808 - mysql_xdevapi\Collection::createIndex example
  • Example#1809 - mysql_xdevapi\Collection::dropIndex example
  • Example#1810 - mysql_xdevapi\Collection::existsInDatabase example
  • Example#1811 - mysql_xdevapi\Collection::find example
  • Example#1812 - mysql_xdevapi\Collection::getName example
  • Example#1813 - mysql_xdevapi\Collection::getOne example
  • Example#1814 - mysql_xdevapi\Collection::getSchema example
  • Example#1815 - mysql_xdevapi\Collection::getSession example
  • Example#1816 - mysql_xdevapi\Collection::modify example
  • Example#1817 - mysql_xdevapi\Collection::remove example
  • Example#1818 - mysql_xdevapi\Collection::removeOne example
  • Example#1819 - mysql_xdevapi\Collection::replaceOne example
  • Example#1820 - mysql_xdevapi\CollectionAdd::__construct example
  • Example#1821 - mysql_xdevapi\CollectionAdd::execute example
  • Example#1822 - mysql_xdevapi\CollectionFind::bind example
  • Example#1823 - CollectionFind example
  • Example#1824 - CollectionFind example
  • Example#1825 - mysql_xdevapi\CollectionFind::fields example
  • Example#1826 - mysql_xdevapi\CollectionFind::groupBy example
  • Example#1827 - mysql_xdevapi\CollectionFind::having example
  • Example#1828 - mysql_xdevapi\CollectionFind::limit example
  • Example#1829 - mysql_xdevapi\CollectionFind::lockExclusive example
  • Example#1830 - mysql_xdevapi\CollectionFind::lockShared example
  • Example#1831 - mysql_xdevapi\CollectionFind::offset example
  • Example#1832 - mysql_xdevapi\CollectionFind::sort example
  • Example#1833 - mysql_xdevapi\CollectionModify::arrayAppend example
  • Example#1834 - mysql_xdevapi\CollectionModify::arrayInsert example
  • Example#1835 - mysql_xdevapi\CollectionModify::bind example
  • Example#1836 - mysql_xdevapi\CollectionModify::__construct example
  • Example#1837 - mysql_xdevapi\CollectionModify::execute example
  • Example#1838 - mysql_xdevapi\CollectionModify::limit example
  • Example#1839 - mysql_xdevapi\CollectionModify::patch example
  • Example#1840 - mysql_xdevapi\CollectionModify::replace example
  • Example#1841 - mysql_xdevapi\CollectionModify::set example
  • Example#1842 - mysql_xdevapi\CollectionModify::skip example
  • Example#1843 - mysql_xdevapi\CollectionModify::sort example
  • Example#1844 - mysql_xdevapi\CollectionModify::unset example
  • Example#1845 - mysql_xdevapi\CollectionRemove::bind example
  • Example#1846 - mysql_xdevapi\Collection::remove example
  • Example#1847 - mysql_xdevapi\CollectionRemove::execute example
  • Example#1848 - mysql_xdevapi\CollectionRemove::limit example
  • Example#1849 - mysql_xdevapi\CollectionRemove::sort example
  • Example#1850 - mysql_xdevapi\ColumnResult::__construct example
  • Example#1851 - mysql_xdevapi\ColumnResult::getCharacterSetName example
  • Example#1852 - mysql_xdevapi\ColumnResult::getCollationName example
  • Example#1853 - mysql_xdevapi\ColumnResult::getColumnLabel example
  • Example#1854 - mysql_xdevapi\ColumnResult::getColumnName example
  • Example#1855 - mysql_xdevapi\ColumnResult::getFractionalDigits example
  • Example#1856 - mysql_xdevapi\ColumnResult::getLength example
  • Example#1857 - mysql_xdevapi\ColumnResult::getSchemaName example
  • Example#1858 - mysql_xdevapi\ColumnResult::getTableLabel example
  • Example#1859 - mysql_xdevapi\ColumnResult::getTableName example
  • Example#1860 - mysql_xdevapi\ColumnResult::getType example
  • Example#1861 - mysql_xdevapi\ColumnResult::isNumberSigned example
  • Example#1862 - mysql_xdevapi\ColumnResult::isPadded example
  • Example#1863 - mysql_xdevapi\CrudOperationBindable::bind example
  • Example#1864 - mysql_xdevapi\CrudOperationLimitable::limit example
  • Example#1865 - mysql_xdevapi\CrudOperationSkippable::skip example
  • Example#1866 - mysql_xdevapi\CrudOperationSortable::sort example
  • Example#1867 - mysql_xdevapi\DatabaseObject::existsInDatabase example
  • Example#1868 - mysql_xdevapi\DatabaseObject::getName example
  • Example#1869 - mysql_xdevapi\DatabaseObject::getSession example
  • Example#1870 - A DocResult example
  • Example#1871 - mysql_xdevapi\DocResult::fetchAll example
  • Example#1872 - mysql_xdevapi\DocResult::fetchOne example
  • Example#1873 - mysql_xdevapi\DocResult::getWarnings example
  • Example#1874 - mysql_xdevapi\DocResult::getWarningsCount example
  • Example#1875 - execute() examples
  • Example#1876 - mysql_xdevapi\ExecutionStatus::__construct example
  • Example#1877 - mysql_xdevapi\Expression::__construct example
  • Example#1878 - mysql_xdevapi\Result::__construct example
  • Example#1879 - mysql_xdevapi\Result::getAffectedItemsCount example
  • Example#1880 - mysql_xdevapi\Result::getAutoIncrementValue example
  • Example#1881 - mysql_xdevapi\Result::getGeneratedIds example
  • Example#1882 - mysql_xdevapi\RowResult::getWarnings example
  • Example#1883 - mysql_xdevapi\RowResult::getWarningsCount example
  • Example#1884 - mysql_xdevapi\RowResult::__construct example
  • Example#1885 - mysql_xdevapi\RowResult::fetchAll example
  • Example#1886 - mysql_xdevapi\RowResult::fetchOne example
  • Example#1887 - mysql_xdevapi\RowResult::getColumnsCount example
  • Example#1888 - mysql_xdevapi\RowResult::getColumnNames example
  • Example#1889 - mysql_xdevapi\RowResult::getColumns example
  • Example#1890 - mysql_xdevapi\RowResult::getWarnings example
  • Example#1891 - mysql_xdevapi\RowResult::getWarningsCount example
  • Example#1892 - Schema::__construct example
  • Example#1893 - Schema::createCollection example
  • Example#1894 - Schema::dropCollection example
  • Example#1895 - Schema::existsInDatabase example
  • Example#1896 - Schema::getCollection example
  • Example#1897 - Schema::getCollectionAsTable example
  • Example#1898 - mysql_xdevapi\Schema::getCollections example
  • Example#1899 - mysql_xdevapi\Schema::getName example
  • Example#1900 - mysql_xdevapi\Schema::getSession example
  • Example#1901 - mysql_xdevapi\Schema::getTable example
  • Example#1902 - mysql_xdevapi\Schema::getTables example
  • Example#1903 - mysql_xdevapi\Session::getSchema example
  • Example#1904 - mysql_xdevapi\Session::close example
  • Example#1905 - mysql_xdevapi\Session::commit example
  • Example#1906 - mysql_xdevapi\Session::__construct example
  • Example#1907 - mysql_xdevapi\Session::createSchema example
  • Example#1908 - mysql_xdevapi\Session::dropSchema example
  • Example#1909 - mysql_xdevapi\Session::generateUuid example
  • Example#1910 - mysql_xdevapi\Session::getSchema example
  • Example#1911 - mysql_xdevapi\Session::getSchema example
  • Example#1912 - mysql_xdevapi\Session::getSchemas example
  • Example#1913 - mysql_xdevapi\Session::getServerVersion example
  • Example#1914 - mysql_xdevapi\Session::listClients example
  • Example#1915 - mysql_xdevapi\Session::quoteName example
  • Example#1916 - mysql_xdevapi\Session::releaseSavepoint example
  • Example#1917 - mysql_xdevapi\Session::rollback example
  • Example#1918 - mysql_xdevapi\Session::rollbackTo example
  • Example#1919 - mysql_xdevapi\Session::setSavepoint example
  • Example#1920 - mysql_xdevapi\Session::sql example
  • Example#1921 - mysql_xdevapi\Session::startTransaction example
  • Example#1922 - mysql_xdevapi\SqlStatement::bind example
  • Example#1923 - mysql_xdevapi\SqlStatement::__construct example
  • Example#1924 - mysql_xdevapi\SqlStatement::execute example
  • Example#1925 - mysql_xdevapi\SqlStatement::getNextResult example
  • Example#1926 - mysql_xdevapi\SqlStatement::getResult example
  • Example#1927 - mysql_xdevapi\SqlStatement::hasMoreResults example
  • Example#1928 - mysql_xdevapi\SqlStatementResult::__construct example
  • Example#1929 - mysql_xdevapi\SqlStatementResult::fetchAll example
  • Example#1930 - mysql_xdevapi\SqlStatementResult::fetchOne example
  • Example#1931 - mysql_xdevapi\SqlStatementResult::getAffectedItemsCount example
  • Example#1932 - mysql_xdevapi\SqlStatementResult::getColumnsCount example
  • Example#1933 - mysql_xdevapi\SqlStatementResult::getColumnNames example
  • Example#1934 - mysql_xdevapi\SqlStatementResult::getColumns example
  • Example#1935 - mysql_xdevapi\SqlStatementResult::getGeneratedIds example
  • Example#1936 - mysql_xdevapi\SqlStatementResult::getLastInsertId example
  • Example#1937 - mysql_xdevapi\SqlStatementResult::getWarnings example
  • Example#1938 - mysql_xdevapi\SqlStatementResult::getWarningsCount example
  • Example#1939 - mysql_xdevapi\SqlStatementResult::hasData example
  • Example#1940 - mysql_xdevapi\SqlStatementResult::nextResult example
  • Example#1941 - mysql_xdevapi\Statement::__construct example
  • Example#1942 - mysql_xdevapi\Statement::getNextResult example
  • Example#1943 - mysql_xdevapi\Statement::getResult example
  • Example#1944 - mysql_xdevapi\Statement::hasMoreResults example
  • Example#1945 - mysql_xdevapi\Table::__construct example
  • Example#1946 - mysql_xdevapi\Table::count example
  • Example#1947 - mysql_xdevapi\Table::delete example
  • Example#1948 - mysql_xdevapi\Table::existsInDatabase example
  • Example#1949 - mysql_xdevapi\Table::getName example
  • Example#1950 - mysql_xdevapi\Table::getSchema example
  • Example#1951 - mysql_xdevapi\Table::getSession example
  • Example#1952 - mysql_xdevapi\Table::insert example
  • Example#1953 - mysql_xdevapi\Table::isView example
  • Example#1954 - mysql_xdevapi\Table::count example
  • Example#1955 - mysql_xdevapi\Table::update example
  • Example#1956 - mysql_xdevapi\TableDelete::bind example
  • Example#1957 - mysql_xdevapi\TableDelete::__construct example
  • Example#1958 - mysql_xdevapi\TableDelete::execute example
  • Example#1959 - mysql_xdevapi\TableDelete::limit example
  • Example#1960 - mysql_xdevapi\TableDelete::orderBy example
  • Example#1961 - mysql_xdevapi\TableDelete::where example
  • Example#1962 - mysql_xdevapi\TableInsert::__construct example
  • Example#1963 - mysql_xdevapi\TableInsert::execute example
  • Example#1964 - mysql_xdevapi\TableInsert::values example
  • Example#1965 - mysql_xdevapi\TableSelect::bind example
  • Example#1966 - mysql_xdevapi\TableSelect::__construct example
  • Example#1967 - mysql_xdevapi\TableSelect::execute example
  • Example#1968 - mysql_xdevapi\TableSelect::groupBy example
  • Example#1969 - mysql_xdevapi\TableSelect::having example
  • Example#1970 - mysql_xdevapi\TableSelect::limit example
  • Example#1971 - mysql_xdevapi\TableSelect::lockExclusive example
  • Example#1972 - mysql_xdevapi\TableSelect::lockShared example
  • Example#1973 - mysql_xdevapi\TableSelect::offset example
  • Example#1974 - mysql_xdevapi\TableSelect::orderBy example
  • Example#1975 - mysql_xdevapi\TableSelect::where example
  • Example#1976 - mysql_xdevapi\TableUpdate::bind example
  • Example#1977 - mysql_xdevapi\TableUpdate::__construct example
  • Example#1978 - mysql_xdevapi\TableUpdate::execute example
  • Example#1979 - mysql_xdevapi\TableUpdate::limit example
  • Example#1980 - mysql_xdevapi\TableUpdate::orderby example
  • Example#1981 - mysql_xdevapi\TableUpdate::set example
  • Example#1982 - mysql_xdevapi\TableUpdate::where example
  • Example#1983 - mysql_xdevapi\Warning::__construct example
  • Example#1984 - Exemple de présentation de l'extension MySQL
  • Example#1985 - Exemple avec mysql_affected_rows
  • Example#1986 - Exemple avec mysql_affected_rows en utilisant les transactions
  • Example#1987 - Exemple avec mysql_client_encoding
  • Example#1988 - Exemple avec mysql_close
  • Example#1989 - Exemple avec mysql_connect
  • Example#1990 - Exemple avec mysql_connect en utilisant la syntaxe hostname:port
  • Example#1991 - Exemple avec mysql_connect en utilisant la syntaxe ":/path/to/socket"
  • Example#1992 - Exemple alternative avec mysql_create_db
  • Example#1993 - Exemple avec mysql_data_seek
  • Example#1994 - Exemple mysql_db_name
  • Example#1995 - Exemple alternatif avec mysql_db_query
  • Example#1996 - Exemple avec mysql_drop_db
  • Example#1997 - Exemple avec mysql_errno
  • Example#1998 - Exemple avec mysql_error
  • Example#1999 - Exemple avec mysql_escape_string
  • Example#2000 - Requête avec duplication de nom de colonnes
  • Example#2001 - mysql_fetch_array avec MYSQL_NUM
  • Example#2002 - mysql_fetch_array avec MYSQL_ASSOC
  • Example#2003 - mysql_fetch_array avec MYSQL_BOTH
  • Example#2004 - Exemple avec mysql_fetch_assoc
  • Example#2005 - Exemple avec mysql_fetch_field
  • Example#2006 - Exemple avec mysql_fetch_lengths
  • Example#2007 - Exemple avec mysql_fetch_object
  • Example#2008 - Exemple avec mysql_fetch_object
  • Example#2009 - Exemple avec mysql_fetch_row
  • Example#2010 - Exemple avec mysql_field_flags
  • Example#2011 - Exemple avec mysql_field_len
  • Example#2012 - Exemple avec mysql_field_name
  • Example#2013 - Exemple avec mysql_field_table
  • Example#2014 - Exemple avec mysql_field_type
  • Example#2015 - Exemple avec mysql_free_result
  • Example#2016 - Exemple avec mysql_get_client_info
  • Example#2017 - Exemple avec mysql_get_host_info
  • Example#2018 - Exemple avec mysql_get_proto_info
  • Example#2019 - Exemple avec mysql_get_server_info
  • Example#2020 - Requêtes MySQL
  • Example#2021 - Exemple avec mysql_insert_id
  • Example#2022 - Exemple avec mysql_list_dbs
  • Example#2023 - Exemple d'alternative à mysql_list_fields
  • Example#2024 - Exemple avec mysql_list_processes
  • Example#2025 - Exemple d'alternative à mysql_list_tables
  • Example#2026 - Exemple avec mysql_num_fields
  • Example#2027 - Exemple avec mysql_num_rows
  • Example#2028 - Exemple avec mysql_ping
  • Example#2029 - Requête invalide
  • Example#2030 - Requête valide
  • Example#2031 - Exemple simple avec mysql_real_escape_string
  • Example#2032 - Exemple avec mysql_real_escape_string et la nécessité de la présence d'une connexion
  • Example#2033 - Un exemple d'attaque par injection SQL
  • Example#2034 - Exemple avec mysql_result
  • Example#2035 - Exemple avec mysql_select_db
  • Example#2036 - Exemple avec mysql_stat
  • Example#2037 - Exemple alternatif pour mysql_stat
  • Example#2038 - Exemple avec mysql_tablename
  • Example#2039 - Exemple avec mysql_thread_id
  • Example#2040 - Activer le plugin (php.ini)
  • Example#2041 - Configuration minimale du plugin (mysqlnd_ms_plugin.ini)
  • Example#2042 - Configuration minimale recommandée pour le plugin (mysqlnd_ms_plugin.ini)
  • Example#2043 - Utiliser un seul serveur comme maitre et esclave (test seulement!)
  • Example#2044 - Fichier de configuration du plugin (mysqlnd_ms_plugin.ini)
  • Example#2045 - Ouvrir une connexion sujette à équilibrage
  • Example#2046 - Exécuter des requêtes
  • Example#2047 - Config du plugin avec un maitre et un esclave
  • Example#2048 - Problème possible : État de la connexion et variables SQL utilisateurs
  • Example#2049 - Configuration du plugin avec un esclave et un maitre
  • Example#2050 - Astuces SQL pour éviter les bascules de connexion
  • Example#2051 - Latence de réplication
  • Example#2052 - Création de table sur un esclave
  • Example#2053 - Configuration du plugin avec un esclave et un maitre
  • Example#2054 - Utilisation des astuces SQL pour les transactions
  • Example#2055 - Le paramètre trx_stickiness
  • Example#2056 - Gestion propre des transactions
  • Example#2057 - Masque général pour les transactions XA
  • Example#2058 - Les transactions locales et globales sont mutuellement exclusives
  • Example#2059 - Stockage du statut du coordinateur de transaction
  • Example#2060 - Consistence de session: lire ses écritures
  • Example#2061 - Requêtage en consistence de session
  • Example#2062 - Age maximum / retard de l'esclave
  • Example#2063 - Limiter le retard de l'esclave
  • Example#2064 - Reprise sur incident non activée
  • Example#2065 - Pas d'esclave avec le critère de retard
  • Example#2066 - Creation de la table de compteur sur le maitre
  • Example#2067 - Plugin config: SQL pour l'injection GTID coté client
  • Example#2068 - Injection GTID transparente
  • Example#2069 - Plugin config: SQL pour récupérer le GTID
  • Example#2070 - Obtenir le GTID après l'injection
  • Example#2071 - Plugin config: Vérifier un certain GTID
  • Example#2072 - Consistence de session et GTID combinés
  • Example#2073 - Configuration du plugin : utilisation de la fonctionnalité GTID interne à MySQL 5.6.5-m8
  • Example#2074 - Récapitulatif : qualité de service demandant de lire vos écritures
  • Example#2075 - Configuration du plugin : aucune entrée spéciale pour la mise en cache
  • Example#2076 - Mise en cache d'une requête esclave
  • Example#2077 - Lecture de vos écritures et mise en cache
  • Example#2078 - Failover manuel, optionnellement, automatique
  • Example#2079 - Failover manuel
  • Example#2080 - Cluster de groupes de noeuds
  • Example#2081 - Partitionnement manuelle en utilisant des astuces SQL
  • Example#2082 - Configuration du greffon: Des hôtes Fabric au lieu des serveurs MySQL
  • Example#2083 - Partitionnement manuel en utilisant les SQL hints
  • Example#2084 - On provoque une erreur de connexion
  • Example#2085 - Erreur de connexion sur l'exécution d'une requête
  • Example#2086 - On provoque une erreur de connexion
  • Example#2087 - Échec les plus courants
  • Example#2088 - Provoque une erreur passagère
  • Example#2089 - Boucle de tentative pour une erreur passagère
  • Example#2090 - Activation du plugin (php.ini)
  • Example#2091 - Configuration simple du plugin (mysqlnd_ms_plugin.ini) pour une réplication MySQL
  • Example#2092 - Plusieurs primaires - plusieurs maîtres (php.ini)
  • Example#2093 - Copie primaire avec plusieurs primaires et le partitionnement
  • Example#2094 - Plusieurs primaires - plusieurs maîtres (php.ini)
  • Example#2095 - Mise à jour synchrone dans n'importe quel cluster
  • Example#2096 - Masque général pour les transactions XA
  • Example#2097 - Conversion d'un hash PHP en frmat JSON
  • Example#2098 - Exemple d'utilisation des noms de section
  • Example#2099 - Liste des esclaves anonymes
  • Example#2100 - Liste Maître en utilisant les noms symboliques
  • Example#2101 - Mot clé pour configurer un serveur
  • Example#2102 - Nouveau filtre roundrobin, ancienne fonctionnalité
  • Example#2103 - Le filtre user remplace la fonction mysqlnd_ms_set_user_pick_server
  • Example#2104 - Message d'erreur commun dans le cas d'une erreur dans le fichier de configuration (à partir de la version 1.5.0)
  • Example#2105 - Validation renforcée du fichier de configuration depuis la version 1.5.0
  • Example#2106 - Erreur plus précise grâce à l'utilisation de mysqlnd_ms.force_config_usage=1
  • Example#2107 - Configuration minimale du plugin pour son utilisation avec MySQL Fabric
  • Example#2108 - Délai d'attente maximale optionnelle pour les communications avec Fabric
  • Example#2109 - Alerte lors de la violation des limitations des transactions
  • Example#2110 - Séquence de filtres invalide
  • Example#2111 - Balance de charge aléatoire avec le filtre random
  • Example#2112 - Balance de charge avec sélection aléatoire unique avec le filtre random
  • Example#2113 - Erreur de référencement
  • Example#2114 - Assignement d'un argument weight pour la balance de charge
  • Example#2115 - Filtre roundrobin
  • Example#2116 - Définition d'une fonction de rappel
  • Example#2117 - Utilisation d'une fonction de rappel
  • Example#2118 - Retourne des esclaves et des maîtres aléatoirement
  • Example#2119 - Partitionnement manuel
  • Example#2120 - Limitation globale du lag d'un esclave
  • Example#2121 - Basculement optionnel vers un maître lors d'un échec de connexion sur un esclave (PECL/mysqlnd_ms < 1.4.0)
  • Example#2122 - Nouvelle syntaxe depuis 1.4.0
  • Example#2123 - Désactivation des connexions paresseuses
  • Example#2124 - Echappement d'une chaîne sur une connexion paresseuse
  • Example#2125 - Utilisation du maître lors d'une écriture pour consolider les lectures
  • Example#2126 - Utilisation du maître pour l'exécution des transactions
  • Example#2127 - Aucun failover automatique, utilisation d'un gestionnaire d'erreurs
  • Example#2128 - Boucle de tentative pour les erreurs passagères
  • Example#2129 - Définition SQL pour la table de stockage MySQL de statut des transactions
  • Example#2130 - Définition SQL de la table de stockage MySQL de statut des transactions
  • Example#2131 - Définition SQL pour la table MySQL de stockage de statut de la collection des données incorrectes
  • Example#2132 - Exemple d'utilisation des noms de section
  • Example#2133 - Syntaxe sous forme de liste
  • Example#2134 - Vérification de l'activité du plugin sur un modèle de déploiement non-threadé
  • Example#2135 - Enregistrement des statistiques lorsque le script se termine
  • Example#2136 - Exemple montrant l'utilisation des constantes mysqlnd_ms
  • Example#2137 - Exemple avec mysqlnd_ms_dump_servers
  • Example#2138 - Exemple avec mysqlnd_ms_get_last_gtid
  • Example#2139 - Exemple avec mysqlnd_ms_get_last_used_connection
  • Example#2140 - Exemple avec mysqlnd_ms_get_stats
  • Example#2141 - Exemple avec mysqlnd_ms_match_wild
  • Example#2142 - Exemple avec mysqlnd_ms_query_is_select
  • Example#2143 - Exemple avec mysqlnd_ms_set_qos
  • Example#2144 - Exemple avec mysqlnd_ms_set_user_pick_server
  • Example#2145 - Activation du plugin (php.ini)
  • Example#2146 - Utilisation de l'astuce SQL MYSQLND_QC_ENABLE_SWITCH
  • Example#2147 - Utilisation de l'astuce SQL MYSQLND_QC_DISABLE_SWITCH
  • Example#2148 - Exemple montrant les types de requêtes non mis en cache
  • Example#2149 - Activation du cache pour toutes les requêtes en utilisant l'option de configuration ini mysqlnd_qc.cache_no_table
  • Example#2150 - Définir un TTL avec l'option de configuration ini mysqlnd_qc.ttl
  • Example#2151 - Définir un TTL avec des astuces SQL
  • Example#2152 - Définir une fonction de rappel avec mysqlnd_qc_set_is_select
  • Example#2153 -
  • Example#2154 - Collecte d'une requête de traçage
  • Example#2155 - Définir la profondeur des traces avec l'option de configuration ini mysqlnd_qc.query_trace_bt_depth
  • Example#2156 - Collecte de données statistiques avec la configuration ini mysqlnd_qc.time_statistics
  • Example#2157 - Exemple avec mysqlnd_qc_get_cache_info
  • Example#2158 - Exemple avec mysqlnd_qc_get_normalized_query_trace_log
  • Example#2159 - Utilisation d'un gestionnaire de stockage défini par l'utilisateur
  • Example#2160 - Utilisation des constantes d'astuces SQL
  • Example#2161 - Exemple avec mysqlnd_qc_set_cache_condition
  • Example#2162 -
  • Example#2163 - Exemple avec mysqlnd_qc_get_cache_info
  • Example#2164 - Exemple avec mysqlnd_qc_get_core_stats
  • Example#2165 -
  • Example#2166 - Exemple avec mysqlnd_qc_get_query_trace_log
  • Example#2167 - Exemple avec mysqlnd_qc_set_cache_condition
  • Example#2168 - Exemple avec mysqlnd_qc_set_is_select
  • Example#2169 -
  • Example#2170 - Activation du plugin (php.ini)
  • Example#2171 - Ce que fait une classe interne
  • Example#2172 - Installation d'un proxy
  • Example#2173 - Enregistration du proxy, mysqlnd_uh.enable=1
  • Example#2174 - Installation d'un proxy désactivée
  • Example#2175 - Proxy de connexion
  • Example#2176 - Proxy de requête préparée
  • Example#2177 - Surveillance de base
  • Example#2178 - Exemple avec MysqlndUhConnection::changeUser
  • Example#2179 - Exemple avec MysqlndUhConnection::charsetName
  • Example#2180 - Exemple avec MysqlndUhConnection::close
  • Example#2181 - Exemple avec MysqlndUhConnection::connect
  • Example#2182 - Exemple avec MysqlndUhConnection::endPSession
  • Example#2183 - Exemple avec MysqlndUhConnection::escapeString
  • Example#2184 - Exemple avec MysqlndUhConnection::getAffectedRows
  • Example#2185 - Exemple avec MysqlndUhConnection::getErrorNumber
  • Example#2186 - Exemple avec MysqlndUhConnection::getErrorString
  • Example#2187 - Exemple avec MysqlndUhConnection::getFieldCount
  • Example#2188 - Exemple avec MysqlndUhConnection::getHostInformation
  • Example#2189 - Exemple avec MysqlndUhConnection::getLastInsertId
  • Example#2190 - Exemple avec MysqlndUhConnection::getLastMessage
  • Example#2191 - Exemple avec MysqlndUhConnection::getProtocolInformation
  • Example#2192 - Exemple avec MysqlndUhConnection::getServerInformation
  • Example#2193 - Exemple avec MysqlndUhConnection::getServerStatistics
  • Example#2194 - Exemple avec MysqlndUhConnection::getServerVersion
  • Example#2195 - Exemple avec MysqlndUhConnection::getSqlstate
  • Example#2196 - Exemple avec MysqlndUhConnection::getStatistics
  • Example#2197 - Exemple avec MysqlndUhConnection::getThreadId
  • Example#2198 - Exemple avec MysqlndUhConnection::getWarningCount
  • Example#2199 - Exemple avec MysqlndUhConnection::init
  • Example#2200 - Exemple avec MysqlndUhConnection::kill
  • Example#2201 - Exemple avec MysqlndUhConnection::listFields
  • Example#2202 - Exemple avec MysqlndUhConnection::listMethod
  • Example#2203 - Exemple avec MysqlndUhConnection::moreResults
  • Example#2204 - Exemple avec MysqlndUhConnection::nextResult
  • Example#2205 - Exemple avec MysqlndUhConnection::ping
  • Example#2206 - Exemple avec MysqlndUhConnection::query
  • Example#2207 - Exemple avec MysqlndUhConnection::queryReadResultsetHeader
  • Example#2208 - Exemple avec MysqlndUhConnection::reapQuery
  • Example#2209 - Exempe avec MysqlndUhConnection::refreshServer
  • Example#2210 - Exemple avec MysqlndUhConnection::restartPSession
  • Example#2211 - Exemple avec MysqlndUhConnection::selectDb
  • Example#2212 - Exemple avec MysqlndUhConnection::sendClose
  • Example#2213 - Exemple avec MysqlndUhConnection::sendQuery
  • Example#2214 - Exemple avec MysqlndUhConnection::serverDumpDebugInformation
  • Example#2215 - Exemple avec MysqlndUhConnection::setAutocommit
  • Example#2216 - Exemple avec MysqlndUhConnection::setCharset
  • Example#2217 - Exemple avec MysqlndUhConnection::setClientOption
  • Example#2218 - Exemple avec MysqlndUhConnection::setServerOption
  • Example#2219 - Exemple avec MysqlndUhConnection::simpleCommand
  • Example#2220 - Exemple avec MysqlndUhConnection::simpleCommandHandleResponse
  • Example#2221 - Exemple avec MysqlndUhConnection::sslSet
  • Example#2222 - Exemple avec MysqlndUhConnection::stmtInit
  • Example#2223 - Exemple avec MysqlndUhConnection::storeResult
  • Example#2224 - Exemple avec MysqlndUhConnection::txCommit
  • Example#2225 - Exemple avec MysqlndUhConnection::txRollback
  • Example#2226 - Exemple avec MysqlndUhConnection::useResult
  • Example#2227 - Exemple avec MysqlndUhPreparedStatement::execute
  • Example#2228 - Exemple avec MysqlndUhPreparedStatement::prepare
  • Example#2229 - Exemple avec mysqlnd_uh_convert_to_mysqlnd
  • Example#2230 - Exemple avec mysqlnd_uh_set_connection_proxy
  • Example#2231 - Activation du plugin (php.ini)
  • Example#2232 - Table SQL utilisée dans le démarrage rapide
  • Example#2233 - Exemple simple
  • Example#2234 - Exemple avec mysqlnd_memcache_get_config
  • Example#2235 - Exemple avec mysqlnd_memcache_set et var_dump comme fonction de rappel de déboguage.
  • Example#2236 - Requête simple
  • Example#2237 - Insertion de données en utilisant des variables liées
  • Example#2238 - Liage d'une clause WHERE d'une requête
  • Example#2239 - Insertion de données dans une colonne CLOB
  • Example#2240 - Utilisation d'une procédure stockée PL/SQL
  • Example#2241 - Utilisation d'une procédure stockée PL/SQL
  • Example#2242 - Appel d'une fonction PL/SQL qui retourne un REF CURSOR
  • Example#2243 -
  • Example#2244 - user_oci8_probes.d pour suivre toutes les découvertes statiques au niveau utilisation PHP OCI8 avec DTrace
  • Example#2245 - Exemple avec oci_bind_array_by_name
  • Example#2246 - Insertion de données avec la fonction oci_bind_by_name
  • Example#2247 - Une association avec de multiples appels
  • Example#2248 - Association avec une boucle foreach
  • Example#2249 - Association dans une clause WHERE
  • Example#2250 - Association avec une clause LIKE
  • Example#2251 - Association avec REGEXP_LIKE
  • Example#2252 - Association de plusieurs valeurs dans une clause IN
  • Example#2253 - Association d'un ROWID retourné par une requête
  • Example#2254 - Association d'un ROWID dans un INSERT
  • Example#2255 - Association pour une fonction stockée PL/SQL
  • Example#2256 - Association de paramètres à une procédure stockée PL/SQL
  • Example#2257 - Association sur une colonne CLOB
  • Example#2258 - Association sur un booléen dans un script PL/SQL
  • Example#2259 - Exemple avec oci_client_version
  • Example#2260 - Fermeture d'une connexion
  • Example#2261 - Les connexions à la base de données sont fermées à partir du moment où les références le sont
  • Example#2262 - Fermeture d'un connexion ouverte plus d'une fois
  • Example#2263 - Les connexions sont fermées lorsque les variables sortent du contexte
  • Example#2264 - Exemple avec oci_commit
  • Example#2265 - Exemple avec oci_connect en utilisant la syntaxe simplifiée
  • Example#2266 - Exemple avec oci_connect en utilisant un nom de connexion réseau
  • Example#2267 - Exemple avec oci_connect en utilisant un jeu de caractère spécifique
  • Example#2268 - Exemple avec plusieurs appels à la fonction oci_connect
  • Example#2269 - Exemple avec oci_define_by_name
  • Example#2270 - Exemple avec oci_define_by_name et des noms de colonne sensibles à la casse
  • Example#2271 - Exemple avec oci_define_by_name et des colonnes de type LOB
  • Example#2272 - Exemple avec oci_define_by_name et un type explicite
  • Example#2273 - Exemple d'affichage d'un message d'erreur Oracle après une erreur de connexion
  • Example#2274 - Exemple d'affichage d'un message d'erreur Oracle après une erreur d'analyse
  • Example#2275 - Exemple d'affichage d'un message d'erreur Oracle après une erreur d'exécution rencontré dans une requête SQL
  • Example#2276 - Exemple avec oci_execute pour des requêtes
  • Example#2277 - Exemple avec oci_execute sans spécifier de mode
  • Example#2278 - Exemple avec oci_execute et OCI_NO_AUTO_COMMIT
  • Example#2279 - Exemple avec oci_execute et différents modes dans le même script
  • Example#2280 - Exemple avec oci_execute et OCI_DESCRIBE_ONLY
  • Example#2281 - Exemple avec oci_fetch_all
  • Example#2282 - Exemple avec oci_fetch_all et OCI_FETCHSTATEMENT_BY_ROW
  • Example#2283 - Exemple avec oci_fetch_all et OCI_NUM
  • Example#2284 - Exemple avec oci_fetch_array avec OCI_BOTH
  • Example#2285 - Exemple avec oci_fetch_array avec OCI_NUM
  • Example#2286 - Exemple avec oci_fetch_array avec OCI_ASSOC
  • Example#2287 - Exemple avec oci_fetch_array avec OCI_RETURN_NULLS
  • Example#2288 - oci_fetch_array with OCI_RETURN_LOBS
  • Example#2289 - Exemple avec oci_fetch_array avec des noms de colonnes sensibles à la casse
  • Example#2290 - Exemple avec oci_fetch_array avec des colonnes possédant des noms dupliqués
  • Example#2291 - Exemple avec oci_fetch_array et des colonnes DATE
  • Example#2292 - Exemple avec oci_fetch_array et REF CURSOR
  • Example#2293 - Pagination avec oci_fetch_array en utilisant une requête utilisant le paramètre LIMIT
  • Example#2294 - Exemple avec oci_fetch_array avec Oracle Database
  • Example#2295 - Exemple avec oci_fetch_assoc
  • Example#2296 - Exemple avec oci_fetch_object
  • Example#2297 - Exemple avec oci_fetch_object avec des noms de colonne sensibles à la casse
  • Example#2298 - Exemple avec oci_fetch_object avec des LOBs
  • Example#2299 - Exemple avec oci_fetch_row
  • Example#2300 - Exemple avec oci_fetch avec des variables définies
  • Example#2301 - Exemple avec oci_fetch et oci_result
  • Example#2302 - Exemple avec oci_field_name
  • Example#2303 - Exemple avec oci_field_name
  • Example#2304 - Exemple avec oci_field_precision
  • Example#2305 - Exemple avec oci_field_scale
  • Example#2306 - Exemple avec oci_field_size
  • Example#2307 - Exemple avec oci_field_type_raw
  • Example#2308 - Exemple avec oci_field_type
  • Example#2309 - Récupèration des jeux de résultats implicites via une boucle
  • Example#2310 - Récupère individuellement les gestionnaires de requêtes fils
  • Example#2311 - Définission explicite du compteur de pré-récupération
  • Example#2312 - Exemple de jeu de résultats implicite sans utiliser la fonction oci_get_implicit_resultset
  • Example#2313 - Exemple avec oci_new_connect
  • Example#2314 - Utiliser un REF CURSOR issu d'une procédure enregistrée
  • Example#2315 - Exemple avec oci_new_descriptor
  • Example#2316 - Exemple avec oci_new_descriptor
  • Example#2317 - Exemple avec oci_num_fields
  • Example#2318 - Exemple avec oci_num_rows
  • Example#2319 - Exemple avec oci_parse
  • Example#2320 - Exemple avec oci_parse et une requête PL/SQL
  • Example#2321 - Exemple avec oci_password_change pour changer le mot de passe d'un utilisateur déjà connecté
  • Example#2322 - Exemple avec oci_password_change pour se connecter et changer le mot de passe en une seule étape
  • Example#2323 - Exemple avec oci_pconnect
  • Example#2324 - Exemple avec oci_fetch et oci_result
  • Example#2325 - Exemple avec oci_rollback
  • Example#2326 - Exemple de retour à un point de sauvegarde (SAVEPOINT)
  • Example#2327 - Exemple avec oci_server_version
  • Example#2328 - Définition d'une action
  • Example#2329 - Setting the timeout
  • Example#2330 - Définit l'identifiant du client comme l'utilisateur de l'application
  • Example#2331 - Définit l'information sur le client
  • Example#2332 - Setting the DBOP
  • Example#2333 - 2 scripts peuvent utiliser différentes versions de myfunc() au même moment
  • Example#2334 - Définition du nom du module
  • Example#2335 - Modification de la valeur de préchargement pour une requête
  • Example#2336 - Modification de la valeur de préchargement pour une récupération REF CURSOR
  • Example#2337 - Définition de la valeur de préchargement lorsque l'on retourne un curseur REF CURSOR à Oracle
  • Example#2338 - Exemple avec oci_statement_type
  • Example#2339 - Création d'une base de données Paradox avec deux champs
  • Example#2340 - Convertit une date Paradox en un format humainement lisible
  • Example#2341 - Définit les champs date/heure dans une base de données Paradox à la date/heure courant
  • Example#2342 - Ouverture d'une base de données Paradox
  • Example#2343 - Ouverture d'une base de données Paradox
  • Example#2344 - Convertit un timestamp Paradox en un format humainement lisible
  • Example#2345 - Exemple général de l'extension PostgreSQL
  • Example#2346 - Exemple de fonctions PostgreSQL définies par l'utilisateur
  • Example#2347 - Exemple avec pg_affected_rows
  • Example#2348 - Exemple avec pg_cancel_query
  • Example#2349 - Exemple avec pg_client_encoding
  • Example#2350 - Exemple avec pg_close
  • Example#2351 - Exemple avec pg_connect
  • Example#2352 - Exemple avec pg_connection_busy
  • Example#2353 - Exemple avec pg_connection_reset
  • Example#2354 - Exemple avec pg_connection_status
  • Example#2355 - Exemple avec pg_convert
  • Example#2356 - Exemple avec pg_copy_from
  • Example#2357 - Exemple avec pg_copy_to
  • Example#2358 - Exemple avec pg_dbname
  • Example#2359 - Exemple avec pg_delete
  • Example#2360 - Exemple avec pg_end_copy
  • Example#2361 - Exemple avec pg_escape_bytea
  • Example#2362 - Exemple avec pg_escape_identifier
  • Example#2363 - Exemple avec pg_escape_literal
  • Example#2364 - Exemple avec pg_escape_string
  • Example#2365 - Exemple avec pg_execute
  • Example#2366 - Exemple avec pg_fetch_all_columns
  • Example#2367 - Exemple avec pg_fetch_all
  • Example#2368 - Exemple avec pg_fetch_array
  • Example#2369 - Exemple avec pg_fetch_assoc
  • Example#2370 - Exemple avec pg_fetch_object
  • Example#2371 - Exemple avec pg_fetch_result
  • Example#2372 - Exemple avec pg_fetch_row
  • Example#2373 - Exemple avec pg_field_is_null
  • Example#2374 - Récupération d'informations des champs
  • Example#2375 - Récupération d'informations des champs
  • Example#2376 - Récupération d'informations à propos des champs
  • Example#2377 - Récupération d'informations des champs
  • Example#2378 - Récupération des informations d'une table à partir d'un champ
  • Example#2379 - Récupération d'informations des champs
  • Example#2380 - Récupération d'informations des champs
  • Example#2381 - Exemple avec pg_free_result
  • Example#2382 - Exemple avec pg_get_notify
  • Example#2383 - Exemple avec pg_get_pid
  • Example#2384 - Exemple avec pg_get_result
  • Example#2385 - Exemple avec pg_host
  • Example#2386 - Exemple avec pg_insert
  • Example#2387 - Exemple avec pg_last_error
  • Example#2388 - Exemple avec pg_last_notice
  • Example#2389 - Exemple avec pg_last_oid
  • Example#2390 - Exemple avec pg_lo_close
  • Example#2391 - Exemple avec pg_lo_create
  • Example#2392 - Exemple avec pg_lo_export
  • Example#2393 - Exemple avec pg_lo_import
  • Example#2394 - Exemple avec pg_lo_open
  • Example#2395 - Exemple avec pg_lo_read_all
  • Example#2396 - Exemple avec pg_lo_read
  • Example#2397 - Exemple avec pg_lo_seek
  • Example#2398 - Exemple avec pg_lo_tell
  • Example#2399 - Exemple avec pg_lo_truncate
  • Example#2400 - Exemple avec pg_lo_unlink
  • Example#2401 - Exemple avec pg_lo_write
  • Example#2402 - Récupération des métadonnées d'une table
  • Example#2403 - Exemple avec pg_num_fields
  • Example#2404 - Exemple avec pg_num_rows
  • Example#2405 - Exemple avec pg_options
  • Example#2406 - Exemple avec pg_parameter_status
  • Example#2407 - Exemple avec pg_pconnect
  • Example#2408 - Exemple avec pg_ping
  • Example#2409 - Exemple avec pg_port
  • Example#2410 - Exemple avec pg_prepare
  • Example#2411 - Exemple avec pg_put_line
  • Example#2412 - Exemple avec pg_query_params
  • Example#2413 - Exemple avec pg_query
  • Example#2414 - Utilisation de pg_query avec plusieurs requêtes
  • Example#2415 - Exemple avec pg_result_error_field
  • Example#2416 - Exemple avec pg_result_error
  • Example#2417 - Exemple avec pg_result_seek
  • Example#2418 - Exemple avec pg_result_status
  • Example#2419 - Exemple avec pg_select
  • Example#2420 - Exemple avec pg_send_execute
  • Example#2421 - Exemple pg_send_prepare
  • Example#2422 - Exemple avec pg_send_query_params
  • Example#2423 - Exemple avec pg_send_query
  • Example#2424 - Exemple avec pg_set_client_encoding
  • Example#2425 - Exemple avec pg_set_error_verbosity
  • Example#2426 - Exemple avec pg_trace
  • Example#2427 - Exemple avec pg_transaction_status
  • Example#2428 - Exemple avec pg_tty
  • Example#2429 - Exemple avec pg_unescape_bytea
  • Example#2430 - Exemple avec pg_untrace
  • Example#2431 - Exemple avec pg_update
  • Example#2432 - Exemple avec pg_version
  • Example#2433 - Backup an existing database
  • Example#2434 - Exemple avec SQLite3::changes
  • Example#2435 - Exemple avec SQLite3::close
  • Example#2436 - Exemple avec SQLite3::__construct
  • Example#2437 - Exemple d'une fonction d'agrégation avec max_length
  • Example#2438 - Exemple avec SQLite3::createCollation
  • Example#2439 - Exemple avec SQLite3::createFunction
  • Example#2440 - Exemple avec SQLite3::enableExceptions
  • Example#2441 - Exemple avec SQLite3::exec
  • Example#2442 - Exemple avec SQLite3::loadExtension
  • Example#2443 - Exemple avec SQLite3::open
  • Example#2444 - Exemple avec SQLite3::openBlob
  • Example#2445 - Écrire progressivement un BLOB
  • Example#2446 - Exemple avec SQLite3::prepare
  • Example#2447 - Exemple avec SQLite3::query
  • Example#2448 - Exemple avec SQLite3::querySingle
  • Example#2449 - SQLite3::setAuthorizer example
  • Example#2450 - Exemple avec SQLite3::version
  • Example#2451 - Utilisation de SQLite3Stmt::bindParam
  • Example#2452 - Exemple avec SQLite3Stmt::bindValue
  • Example#2453 - Inspecter le SQL étendue
  • Example#2454 - Exemple avec sqlsrv_begin_transaction
  • Example#2455 - Exemple avec sqlsrv_cancel
  • Example#2456 - Exemple avec sqlsrv_client_info
  • Example#2457 - Example avec sqlsrv_close
  • Example#2458 - Exemple avec sqlsrv_commit
  • Example#2459 - Connexion en utilisant l'authentification Windows.
  • Example#2460 - Connexion en spécifiant un nom d'utilisateur et un mot de passe.
  • Example#2461 - Connexion sur un port spécifique.
  • Example#2462 - Exemple avec functionname
  • Example#2463 - Exemple avec sqlsrv_execute
  • Example#2464 - Récupération d'un tableau associatif
  • Example#2465 - Récupération d'un tableau numérique
  • Example#2466 - Exemple avec sqlsrv_fetch_object
  • Example#2467 - Exemple avec sqlsrv_fetch
  • Example#2468 - Exemple avec sqlsrv_field_metadata
  • Example#2469 - Exemple avec sqlsrv_free_stmt
  • Example#2470 - sqlsrv_get_field example
  • Example#2471 - Exemple avec sqlsrv_has_rows
  • Example#2472 - Exemple avec sqlsrv_next_result
  • Example#2473 - Exemple avec sqlsrv_num_fields
  • Example#2474 - Exemple avec sqlsrv_num_rows
  • Example#2475 - Exemple avec sqlsrv_prepare
  • Example#2476 - sqlsrv_query example
  • Example#2477 - Exemple avec sqlsrv_rollback
  • Example#2478 - Exemple avec sqlsrv_rows_affected
  • Example#2479 - Exemple avec sqlsrv_send_stream_data
  • Example#2480 - Exemple avec sqlsrv_server_info
  • Example#2481 - Insertion et récupération d'une paire clé-valeur
  • Example#2482 - Exemple avec TokyoTyrant::add
  • Example#2483 - Exemple avec TokyoTyrant::connect
  • Example#2484 - Exemple avec TokyoTyrant::connectUri
  • Example#2485 - Exemple avec TokyoTyrant::copy
  • Example#2486 - Exemple avec TokyoTyrant::ext
  • Example#2487 - Exemple avec TokyoTyrant::fwmKeys
  • Example#2488 - Exemple avec TokyoTyrant::get
  • Example#2489 - Exemple avec TokyoTyrant::getIterator
  • Example#2490 - Exemple avec TokyoTyrant::num
  • Example#2491 - Exemple avec TokyoTyrant::out
  • Example#2492 - Exemple avec TokyoTyrant::put
  • Example#2493 - Exemple avec TokyoTyrant::putCat
  • Example#2494 - Exemple avec tokyotyrant::putKeep
  • Example#2495 - Exemple avec TokyoTyrant::putNr
  • Example#2496 - Exemple avec TokyoTyrant::putShl
  • Example#2497 - Exemple avec TokyoTyrant::setMaster
  • Example#2498 - Exemple avec TokyoTyrant::size
  • Example#2499 - Exemple avec TokyoTyrant::stat
  • Example#2500 - Exemple avec TokyoTyrant::vanish
  • Example#2501 - Exemple avec TokyoTyrantTable::genUid
  • Example#2502 - Exemple avec TokyoTyrantTable::get
  • Example#2503 - Exemple avec TokyoTyrantTable::getIterator
  • Example#2504 - Exemple avec TokyoTyrantTable::getQuery
  • Example#2505 - Exemple avec TokyoTyrantTable::out
  • Example#2506 - Exemple avec TokyoTyrantTable::put
  • Example#2507 - Exemple avec TokyoTyrantTable::putCat
  • Example#2508 - Exemple avec TokyoTyrantTable::putKeep
  • Example#2509 - Exemple avec TokyoTyrantQuery::addCond
  • Example#2510 - Exemple avec TokyoTyrantQuery::__construct
  • Example#2511 - Exemple avec TokyoTyrantQuery::count
  • Example#2512 - Exemple avec TokyoTyrantQuery iterator
  • Example#2513 - Exemple avec TokyoTyrantQuery::hint
  • Example#2514 - Exemple avec TokyoTyrantQuery iterator
  • Example#2515 - Exemple avec TokyoTyrantQuery::metaSearch
  • Example#2516 - Exemple avec TokyoTyrantQuery iterator
  • Example#2517 - Exemple avec TokyoTyrantQuery::out
  • Example#2518 - Exemple avec TokyoTyrantQuery iterator
  • Example#2519 - Exemple avec TokyoTyrantQuery::search
  • Example#2520 - Exemple avec TokyoTyrantQuery iterator
  • Example#2521 - Exemple avec TokyoTyrantIterator::__construct
  • Example#2522 - Exemple avec cal_days_in_month
  • Example#2523 - Exemple avec cal_from_jd
  • Example#2524 - Exemple avec cal_info
  • Example#2525 - Exemple avec easter_date
  • Example#2526 - Exemple avec easter_days
  • Example#2527 - Fonctions calendrier
  • Example#2528 - Comportement de débordement
  • Example#2529 - Exemple avec jdtojewish
  • Example#2530 - DateTimeImmutable::add/sub ajout d'un interval de temps écoulé.
  • Example#2531 - DateTimeImmutable::modify et strtotime incrémentation ou décrémentation de valeurs individuelles
  • Example#2532 - L'ajout ou la soustraction de dates/heures peut dépasser (en plus ou en moins) des dates
  • Example#2533 - Exemple avec DateTime::add
  • Example#2534 - Autres exemples avec DateTime::add
  • Example#2535 - Attention à l'ajout de mois
  • Example#2536 - Exemple avec DateTime::__construct
  • Example#2537 - Autres exemples avec DateTime::__construct
  • Example#2538 - Exemple avec DateTime::createFromFormat
  • Example#2539 - Autres exemples avec DateTime::createFromFormat
  • Example#2540 - Texte de Format avec des caractères litéraux
  • Example#2541 - Créer un objet de date et temps mutable
  • Example#2542 - Creating a mutable date time object
  • Example#2543 - Exemple avec DateTime::getLastErrors
  • Example#2544 - Exemple avec DateTime::modify
  • Example#2545 - Méfiez-vous lors de l'ajout ou la soustraction de mois
  • Example#2546 - Exemple avec DateTime::setDate
  • Example#2547 - Les valeurs qui dépassent leurs bornes sont ajoutées à leur parent
  • Example#2548 - Exemple avec DateTime::setISODate
  • Example#2549 - Les valeurs qui excèdent leur bornes s'ajoutent à leur parent
  • Example#2550 - Calcul du mois dans lequel est une semaine
  • Example#2551 - Exemple avec DateTime::setTime
  • Example#2552 - Les valeurs qui dépassent leur borne sont ajoutées à leur parent
  • Example#2553 - Exemple avec DateTime::setTimestamp
  • Example#2554 - DateTime::setTimestamp alternative pour PHP 5.2
  • Example#2555 - Exemple avec DateTime::setTimeZone
  • Example#2556 - Exemple avec DateTime::sub
  • Example#2557 - Autres exemples avec DateTime::sub
  • Example#2558 - Attention à la soustraction de mois
  • Example#2559 - Creating an immutable date time object
  • Example#2560 - Création d'un objet date heure immutable
  • Example#2561 - Exemple avec DateTime::diff
  • Example#2562 - Comparaison de deux objets DateTime
  • Example#2563 - Exemple avec DateTime::format
  • Example#2564 - Exemple avec DateTime::getOffset
  • Example#2565 - Exemple avec DateTime::getTimestamp
  • Example#2566 - Exemple avec DateTime::getTimezone
  • Example#2567 - Interception des erreurs avec DateTimeZone
  • Example#2568 - Exemple avec DateTimeZone::getLocation
  • Example#2569 - Exemple avec DateTimeZone::getOffset
  • Example#2570 - Exemple avec timezone_transitions_get
  • Example#2571 - Exemple avec timezone_abbreviations_list
  • Example#2572 - Exemple avec timezone_identifiers_list
  • Example#2573 - Exemple avec DateInterval
  • Example#2574 - Analyse d'intervalles de dates valides
  • Example#2575 - Exemple avec DateInterval
  • Example#2576 - DateInterval et retenue
  • Example#2577 - DateInterval et DateTime::diff avec les modificateurs %a et %d
  • Example#2578 - Exemple avec DatePeriod
  • Example#2579 - Exemple avec DatePeriod et DatePeriod::EXCLUDE_START_DATE
  • Example#2580 - Exemple avec DatePeriod::getDateInterval
  • Example#2581 - Exemples avec DatePeriod::getEndDate
  • Example#2582 - DatePeriod::getEndDate sans date de fin
  • Example#2583 - Exemple DatePeriod::getStartDate
  • Example#2584 - Exemple avec checkdate
  • Example#2585 - Récupération du décalage horaire par défaut
  • Example#2586 - Récupération de l'abréviation d'un décalage horaire
  • Example#2587 - Récupération du décalage horaire par défaut
  • Example#2588 - Exemple avec date_parse_from_format
  • Example#2589 - Exemple avec date_parse
  • Example#2590 - Exemple avec date_parse et des formats relatifs
  • Example#2591 - Exemple avec date_sun_info
  • Example#2592 - Nuit polaire
  • Example#2593 - Soleil de minuit
  • Example#2594 - Exemple avec date_sunrise
  • Example#2595 - Pas de levé de soleil
  • Example#2596 - Exemple avec date_sunset
  • Example#2597 - Pas de coucher du soleil
  • Example#2598 - Exemple avec date
  • Example#2599 - Protection des caractères dans la fonction date
  • Example#2600 - Exemple avec date et mktime
  • Example#2601 - Exemple avec date
  • Example#2602 - Exemple avec getdate
  • Example#2603 - Exemple avec gettimeofday
  • Example#2604 - Exemple avec gmdate
  • Example#2605 - Exemple avec gmmktime
  • Example#2606 - Exemple avec gmstrftime
  • Example#2607 - Exemple avec idate
  • Example#2608 - Exemple avec localtime
  • Example#2609 - Durée d'exécution d'un script avec la fonction microtime
  • Example#2610 - Durée d'exécution d'un script en PHP 5
  • Example#2611 - Exemple avec microtime et REQUEST_TIME_FLOAT (depuis PHP 5.4.0)
  • Example#2612 - Exemple simple avec mktime
  • Example#2613 - Exemple avec mktime
  • Example#2614 - Dernier jour d'un mois
  • Example#2615 - Exemple avec strftime
  • Example#2616 - Exemple au format de date ISO 8601:1988
  • Example#2617 - %e fonctionnant sous toute plateforme
  • Example#2618 - Affiche tous les formats connus ou non.
  • Example#2619 - Exemple avec strptime
  • Example#2620 - Exemple avec strtotime
  • Example#2621 - Vérification d'erreur
  • Example#2622 - Exemple avec time
  • Example#2623 - Exemple avec timezone_name_from_abbr
  • Example#2624 - Lecture de la version de la timezonedb
  • Example#2625 - Mesure l'exécution de différents blocs et retourne le total
  • Example#2626 - Fermeture d'une ressource de fichier
  • Example#2627 - Positionnement et suppression d'un verrou
  • Example#2628 - Ouverture d'un fichier
  • Example#2629 - Positionnement dans un fichier
  • Example#2630 - Définition du débit des bauds sur un port série
  • Example#2631 - Exemple avec chdir
  • Example#2632 - Exemple avec chroot
  • Example#2633 - Exemple avec closedir
  • Example#2634 - Exemple avec dir
  • Example#2635 - Exemple avec getcwd
  • Example#2636 - Exemple avec opendir
  • Example#2637 - Liste de toutes les entrées d'un dossier
  • Example#2638 - Liste toutes les entrées du dossier courant et enlève les . et ..
  • Example#2639 - Un simple exemple avec scandir
  • Example#2640 - Exemple avec finfo_buffer
  • Example#2641 - Exemple avec finfo_file
  • Example#2642 - Style orienté objet
  • Example#2643 - Style procédural
  • Example#2644 - Exemple avec mime_content_type
  • Example#2645 - Exemple avec basename
  • Example#2646 - Modification de groupe d'un fichier
  • Example#2647 - Exemple avec chown
  • Example#2648 - Exemple avec clearstatcache
  • Example#2649 - Exemple avec copy
  • Example#2650 - Exemple avec dirname
  • Example#2651 - Exemple avec disk_free_space
  • Example#2652 - Exemple avec disk_total_space
  • Example#2653 - Exemple avec fclose
  • Example#2654 - Gestion des délais d'attente dépassés feof
  • Example#2655 - Exemple avec feof et un pointeur de fichier invalide
  • Example#2656 - Écriture d'un fichier en utilisant fflush
  • Example#2657 - Exemple avec fgetc
  • Example#2658 - Lit et affiche le contenu d'un fichier CSV
  • Example#2659 - Lecture d'un fichier ligne par ligne
  • Example#2660 - Lecture d'un fichier PHP ligne par ligne
  • Example#2661 - Teste l'existence d'un fichier
  • Example#2662 - Lit et affiche le code HTML d'un site Web
  • Example#2663 - Recherche un fichier dans le include_path
  • Example#2664 - Lit une section d'un fichier
  • Example#2665 - Utilisation des contextes de flux
  • Example#2666 - Utilisation simple de file_put_contents
  • Example#2667 - Utilisation d'options pour file_put_contents
  • Example#2668 - Exemple avec file
  • Example#2669 - Exemple avec fileatime
  • Example#2670 - Exemple avec filectime
  • Example#2671 - Recherche le groupe d'un fichier
  • Example#2672 - Comparaison de l'inode d'un fichier avec le fichier courant
  • Example#2673 - Exemple avec filemtime
  • Example#2674 - Recherche du propriétaire d'un fichier
  • Example#2675 - Affichage des droits en valeur octale
  • Example#2676 - Affichage de tous les droits
  • Example#2677 - Exemple avec filesize
  • Example#2678 - Exemple avec filetype
  • Example#2679 - Exemple avec flock
  • Example#2680 - Exemple avec flock en utilisant l'option LOCK_NB
  • Example#2681 - Vérifier le nom d'une couleur avec un masque Shell
  • Example#2682 - Exemple avec fopen
  • Example#2683 - Utilisation de fpassthru avec un fichier binaire
  • Example#2684 - Exemple avec fputcsv
  • Example#2685 - Exemple avec fread
  • Example#2686 - Exemple avec fread et un fichier binaire
  • Example#2687 - Exemple avec fread et un fichier distant
  • Example#2688 - Exemple avec fscanf
  • Example#2689 - Contenu du fichier users.txt
  • Example#2690 - Exemple avec fseek
  • Example#2691 - Exemple avec fstat
  • Example#2692 - Exemple avec ftell
  • Example#2693 - Exemple avec ftruncate
  • Example#2694 - Exemple avec fwrite
  • Example#2695 - Un moyen pratique pour remplacer opendir par glob
  • Example#2696 - Exemple avec is_dir
  • Example#2697 - Exemple avec is_executable
  • Example#2698 - Exemple avec is_file
  • Example#2699 - Création et vérification d'un lien symbolique
  • Example#2700 - Exemple avec is_readable
  • Example#2701 - Exemple avec is_uploaded_file
  • Example#2702 - Exemple avec is_writable
  • Example#2703 - Modification du groupe d'un lien symbolique
  • Example#2704 - Modification du propriétaire d'un lien symbolique
  • Example#2705 - Création d'un lien
  • Example#2706 - Exemple avec linkinfo
  • Example#2707 - Comparaison entre stat et lstat
  • Example#2708 - Exemple avec mkdir
  • Example#2709 - mkdir utilisant le paramètre recursive
  • Example#2710 - Téléchargement de plusieurs fichiers
  • Example#2711 - Contenu du fichier sample.ini
  • Example#2712 - Exemple avec parse_ini_file
  • Example#2713 - parse_ini_file pour analyser un fichier php.ini
  • Example#2714 - Interpolation de Valeur
  • Example#2715 - Exemple avec pathinfo
  • Example#2716 - Exemple pathinfo sans extension
  • Example#2717 - Exemple avec pathinfo
  • Example#2718 - Exemple avec pclose
  • Example#2719 - Exemple avec popen
  • Example#2720 - Exemple avec popen
  • Example#2721 - Forcer le téléchargement en utilisant readfile
  • Example#2722 - Exemple avec readlink
  • Example#2723 - Exemple avec realpath_cache_get
  • Example#2724 - Exemple avec realpath_cache_size
  • Example#2725 - Exemple avec realpath
  • Example#2726 - Exemple avec realpath sous Windows
  • Example#2727 - Exemple avec rename
  • Example#2728 - Exemple avec rewind
  • Example#2729 - Exemple avec rmdir
  • Example#2730 - Exemple avec stat
  • Example#2731 - Utilisation des informations issues de stat conjointement avec la fonction touch
  • Example#2732 - Création d'un lien symbolique
  • Example#2733 - Exemple avec tempnam
  • Example#2734 - Exemple avec tmpfile
  • Example#2735 - Exemple avec touch
  • Example#2736 - Exemple avec touch en utilisant le paramètre time
  • Example#2737 - Exemple avec umask
  • Example#2738 - Exemple avec unlink
  • Example#2739 - Exemple d'utilisatio d'inotify
  • Example#2740 - Exemple avec setproctitle
  • Example#2741 - Exemple avec setthreadtitle
  • Example#2742 - Vérifie si l'administrateur système a signé le fichier
  • Example#2743 - Affiche les noms de tous les attributs étendus d'un fichier
  • Example#2744 - Efface tous les attributs étendus d'un fichier
  • Example#2745 - Définition des attributs étendus dans un fichier .wav
  • Example#2746 - Exemple avec xattr_supported
  • Example#2747 - Exemple avec xdiff_file_bdiff_size
  • Example#2748 - Exemple avec xdiff_file_bdiff
  • Example#2749 - Exemple avec xdiff_file_bpatch
  • Example#2750 - Exemple avec xdiff_file_diff_binary
  • Example#2751 - Exemple avec xdiff_file_diff
  • Example#2752 - Exemple avec xdiff_file_merge3
  • Example#2753 - Exemple avec xdiff_file_patch_binary
  • Example#2754 - Exemple avec xdiff_file_patch
  • Example#2755 - Exemple de retour à l'état initial après l'application d'un patch
  • Example#2756 - Exemple avec xdiff_file_rabdiff
  • Example#2757 - Exemple avec xdiff_string_bdiff_size
  • Example#2758 - Exemple avec xdiff_string_diff
  • Example#2759 - Exemple avec xdiff_string_patch
  • Example#2760 - Exemple d'utilisation d'Enchant
  • Example#2761 - Liste les interfaces fournies par un sponsor donné
  • Example#2762 - Exemple avec enchant_broker_dict_exists
  • Example#2763 - Liste tous les dictionnaires disponibles pour un sponsor
  • Example#2764 - Exemple avec enchant_broker_request_dict
  • Example#2765 - Ajout d'un mot à un PWL
  • Example#2766 - Exemple avec enchant_dict_describe
  • Example#2767 - Exemple avec enchant_dict_quick_check
  • Example#2768 - Exemple avec enchant_dict_suggest
  • Example#2769 - Exemple d'utilisation
  • Example#2770 - Exemple avec Gender\Gender::country
  • Example#2771 - Exemple avec bindtextdomain
  • Example#2772 - Exemple avec gettext
  • Example#2773 - Exemple avec ngettext
  • Example#2774 - Exemple avec iconv_get_encoding
  • Example#2775 - Exemple avec iconv_mime_decode_headers
  • Example#2776 - Exemple avec iconv_mime_decode
  • Example#2777 - Exemple avec iconv_mime_encode
  • Example#2778 - Exemple avec iconv_set_encoding
  • Example#2779 - Exemple avec iconv
  • Example#2780 - Exemple avec ob_iconv_handler
  • Example#2781 - Exemple d'API procédurale pour intl
  • Example#2782 - Exemple d'API orientée objet pour intl
  • Example#2783 - Règles de FRENCH_COLLATION
  • Example#2784 - Règles ALTERNATE_HANDLING
  • Example#2785 - Règles CASE_FIRST
  • Example#2786 - Règles CASE_LEVEL
  • Example#2787 - Exemple avec collator_asort
  • Example#2788 - Exemple avec collator_compare
  • Example#2789 - Exemple avec Collator::__construct
  • Example#2790 - Exmple avec collator_create
  • Example#2791 - Exemple avec collator_get_attribute
  • Example#2792 - Exemple avec collator_get_error_code
  • Example#2793 - Exemple avec collator_get_error_message
  • Example#2794 - Exemple avec collator_get_locale
  • Example#2795 - Exemple collator_get_sort_key
  • Example#2796 - Exemple avec collator_get_strength
  • Example#2797 - Exemple avec collator_set_attribute
  • Example#2798 - Exemple avec collator_set_strength
  • Example#2799 - Exemple avec collator_sort_with_sort_keys
  • Example#2800 - Exemple avec collator_sort
  • Example#2801 - Exemple avec numfmt_create::create, Style procédural
  • Example#2802 - Exemple avec numfmt_create::create, style POO
  • Example#2803 - Exemple avec numfmt_format_currency, Style procédural
  • Example#2804 - Exemple avec numfmt_format_currency, style POO
  • Example#2805 - Exemple avec numfmt_format, Style procédural
  • Example#2806 - Exemple avec numfmt_format, style POO
  • Example#2807 - Exemple avec numfmt_get_attribute, Style procédural
  • Example#2808 - Exemple avec numfmt_get_attribute, style POO
  • Example#2809 - Exemple avec numfmt_get_error_code, Style procédural
  • Example#2810 - Exemple avec numfmt_get_error_code, style POO
  • Example#2811 - Exemple avec numfmt_get_error_message, Style procédural
  • Example#2812 - Exemple avec numfmt_get_error_code, style POO
  • Example#2813 - Exemple avec numfmt_get_error_code, Style procédural
  • Example#2814 - Exemple avec numfmt_get_pattern, Style procédural
  • Example#2815 - Exemple avec numfmt_get_pattern, style POO
  • Example#2816 - Exemple avec numfmt_get_symbol, Style procédural
  • Example#2817 - Exemple avec numfmt_get_symbol, style POO
  • Example#2818 - Exemple avec numfmt_get_text_attribute, Style procédural
  • Example#2819 - Exemple avec numfmt_get_text_attribute, style POO
  • Example#2820 - Exemple avec numfmt_parse_currency, Style procédural
  • Example#2821 - Exemple avec numfmt_parse_currency, Style procédural
  • Example#2822 - Exemple avec numfmt_parse, Style procédural
  • Example#2823 - Exemple avec numfmt_parse, style POO
  • Example#2824 - Exemple avec numfmt_set_attribute, Style procédural
  • Example#2825 - Exemple avec numfmt_set_attribute, style POO
  • Example#2826 - Exemple avec numfmt_set_pattern, Style procédural
  • Example#2827 - Exemple avec numfmt_set_pattern, style POO
  • Example#2828 - Exemple avec numfmt_set_symbol, Style procédural
  • Example#2829 - Exemple avec numfmt_set_symbol, style POO
  • Example#2830 - Exemple avec numfmt_set_text_attribute, Style procédural
  • Example#2831 - Exemple avec numfmt_set_text_attribute, Style procédural
  • Example#2832 - Exemple avec locale_accept_from_http, procédural
  • Example#2833 - Exemple avec locale_accept_from_http, POO
  • Example#2834 - Exemple avec locale_compose, procédural
  • Example#2835 - Exemple avec locale_compose, POO
  • Example#2836 - Exemple avec locale_filter_matches, procédural
  • Example#2837 - Exemple avec locale_filter_matches, POO
  • Example#2838 - Exemple avec locale_get_all_variants, procédural
  • Example#2839 - Exemple avec locale_get_all_variants, POO
  • Example#2840 - Exemple avec locale_get_default, procédural
  • Example#2841 - Exemple avec locale_get_default, POO
  • Example#2842 - Exemple avec locale_get_display_language, procédural
  • Example#2843 - Exemple avec locale_get_display_language, POO
  • Example#2844 - Exemple avec locale_get_display_name, procédural
  • Example#2845 - Exemple avec locale_get_display_name, POO
  • Example#2846 - Exemple avec locale_get_display_region, procédural
  • Example#2847 - Exemple avec locale_get_display_region, POO
  • Example#2848 - Exemple avec locale_get_display_script, procédural
  • Example#2849 - Exemple avec locale_get_display_script, POO
  • Example#2850 - Exemple avec locale_get_display_variant, procédural
  • Example#2851 - Exemple avec locale_get_display_variant, POO
  • Example#2852 - Exemple avec locale_get_keywords, procédural
  • Example#2853 - Exemple avec locale_get_keywords, POO
  • Example#2854 - Exemple avec locale_get_primary_language, procédural
  • Example#2855 - Exemple avec locale_get_primary_language, POO
  • Example#2856 - Exemple avec locale_get_region, procédural
  • Example#2857 - Exemple avec locale_get_region, POO
  • Example#2858 - Exemple avec locale_get_script, procédural
  • Example#2859 - Exemple avec locale_get_script, POO
  • Example#2860 - Exemple avec locale_lookup, procédural
  • Example#2861 - Exemple avec Locale::lookup, POO
  • Example#2862 - Exemple avec locale_parse, procédural
  • Example#2863 - Exemple avec locale_parse, POO
  • Example#2864 - Exemple avec locale_set_default, procédural
  • Example#2865 - Exemple avec locale_set_default, POO
  • Example#2866 - Normalizer::getRawDecomposition example
  • Example#2867 - Exemple avec normalizer_is_normalized, en style procédural
  • Example#2868 - Exemple avec normalizer_is_normalized, en style orienté objet
  • Example#2869 - Exemple avec normalizer_normalize, procédural
  • Example#2870 - Exemple avec normalizer_normalize, POO
  • Example#2871 - Exemple avec msgfmt_create, style procédural
  • Example#2872 - Exemple avec msgfmt_create, style procédural
  • Example#2873 - Exemple avec msgfmt_format_message, style procédural
  • Example#2874 - Exemple avec msgfmt_format_message, style procédural
  • Example#2875 - Exemple avec msgfmt_format, style procédural
  • Example#2876 - Exemple avec msgfmt_format, style POO
  • Example#2877 - Exemple avec msgfmt_get_error_message, style procédural
  • Example#2878 - Exemple avec msgfmt_get_error_message, style POO
  • Example#2879 - Exemple avec msgfmt_get_locale, style procédural
  • Example#2880 - Exemple avec msgfmt_get_locale, style POO
  • Example#2881 - Exemple avec msgfmt_get_pattern, style procédural
  • Example#2882 - Exemple avec msgfmt_get_pattern, style POO
  • Example#2883 - Exemple avec msgfmt_parse_message, style procédural
  • Example#2884 - Exemple avec msgfmt_parse_message, style POO
  • Example#2885 - Exemple avec msgfmt_parse, style procédural
  • Example#2886 - Exemple avec msgfmt_parse, style POO
  • Example#2887 - Exemple avec msgfmt_set_pattern, style procédural
  • Example#2888 - Exemple avec msgfmt_set_pattern, style POO
  • Example#2889 - Exemple avec IntlCalendar::add
  • Example#2890 - Exemple avec IntlCalendar::after
  • Example#2891 - Exempe avec IntlCalendar::clear
  • Example#2892 - Exemple avec IntlCalendar::createInstance
  • Example#2893 - Exemple avec IntlCalendar::equals
  • Example#2894 - Exemple avec IntlCalendar::fieldDifference
  • Example#2895 - IntlCalendar::fromDateTime
  • Example#2896 - IntlCalendar::get
  • Example#2897 - IntlCalendar::getActualMaximum
  • Example#2898 - IntlCalendar::getAvailableLocales
  • Example#2899 - IntlCalendar::getDayOfWeekType
  • Example#2900 - IntlCalendar::getErrorCode and IntlCalendar::getErrorMessage
  • Example#2901 - IntlCalendar::getErrorMessage
  • Example#2902 - IntlCalendar::getFirstDayOfWeek
  • Example#2903 - IntlCalendar::getKeyworkValuesForLocale
  • Example#2904 - Maxima examples
  • Example#2905 - IntlCalendar::getLocale
  • Example#2906 - IntlCalendar::getMinimalDaysInFirstWeek
  • Example#2907 - Exemple avec IntlCalendar::getNow
  • Example#2908 - IntlCalendar::getRepeatedWallTimeOption
  • Example#2909 - IntlCalendar::getSkippedWallTimeOption
  • Example#2910 - IntlCalendar::getTime
  • Example#2911 - Exemple avec IntlCalendar::getTimeZone
  • Example#2912 - Exemple avec IntlCalendar::getType
  • Example#2913 - IntlCalendar::inDaylightTime
  • Example#2914 - IntlCalendar::isEquivalentTo
  • Example#2915 - IntlCalendar::isLenient
  • Example#2916 - IntlCalendar::isWeekend
  • Example#2917 - IntlCalendar::roll
  • Example#2918 - IntlCalendar::set
  • Example#2919 - Exemple avec IntlCalendar::setFirstDayOfWeek
  • Example#2920 - Exemple avec IntlCalendar::setTime
  • Example#2921 - Exemple avec IntlCalendar::setTimeZone
  • Example#2922 - Exemple avec IntlCalendar::toDateTime
  • Example#2923 - Exemple avec datefmt_create, procédural
  • Example#2924 - Exemple avec datefmt_create, POO
  • Example#2925 - Exemple avec datefmt_format
  • Example#2926 - Exemple orienté objet
  • Example#2927 - Exemple avec un objet IntlCalendar
  • Example#2928 - Exemple avec IntlDateFormatter::formatObject
  • Example#2929 - Exemple avec datefmt_get_calendar
  • Example#2930 - Exemple orienté objet
  • Example#2931 - Exemple avec datefmt_get_datetype
  • Example#2932 - Exemple orienté objet
  • Example#2933 - Exemple avec datefmt_get_error_code
  • Example#2934 - Exemple orienté objet
  • Example#2935 - Exemple avec datefmt_get_error_message
  • Example#2936 - Exemple orienté objet
  • Example#2937 - Exemple avec datefmt_get_locale
  • Example#2938 - Exemple orienté objet
  • Example#2939 - Exemple avec datefmt_get_pattern
  • Example#2940 - Exemple orienté objet
  • Example#2941 - Exemple avec datefmt_get_timetype
  • Example#2942 - Exemple orienté objet
  • Example#2943 - Exemple avec datefmt_get_timezone_id
  • Example#2944 - Exemple orienté objet
  • Example#2945 - Exemple avec IntlDateFormatter::getCalendarObject
  • Example#2946 - Exemple avec IntlDateFormatter::getTimeZone
  • Example#2947 - Exemple avec datefmt_is_lenient
  • Example#2948 - Exemple orienté objet
  • Example#2949 - Exemple avec datefmt_localtime
  • Example#2950 - Exemple orienté objet
  • Example#2951 - Exemple orienté objet
  • Example#2952 - Exemple avec datefmt_parse
  • Example#2953 - Exemple avec datefmt_set_calendar
  • Example#2954 - Exemple orienté objet
  • Example#2955 - Exemple avec des arguments à IntlCalendar
  • Example#2956 - Exemple avec datefmt_set_lenient
  • Example#2957 - Exemple orienté objet
  • Example#2958 - Exemple avec datefmt_get_pattern
  • Example#2959 - Exemple orienté objet
  • Example#2960 - Exemple avec IntlDateFormatter::setTimeZone
  • Example#2961 - Exemple avec resourcebundle_count
  • Example#2962 - Exemple orienté objet
  • Example#2963 - Exemple avec resourcebundle_create
  • Example#2964 - Exemple avec ResourceBundle::create
  • Example#2965 - Exemple avec resourcebundle_get_error_code
  • Example#2966 - Exemple orienté objet
  • Example#2967 - Exemple avec resourcebundle_get_error_message
  • Example#2968 - Exemple orienté objet
  • Example#2969 - Exemple avec resourcebundle_get
  • Example#2970 - Exemple orienté objet
  • Example#2971 - Exemple avec resourcebundle_locales
  • Example#2972 - Exemple orienté objet
  • Example#2973 - Exemple Spoofchecker::areConfusable
  • Example#2974 - Exemple Spoofchecker::isSuspicious
  • Example#2975 - Récupération des identifiants transliterator enregistrés
  • Example#2976 - Conversion des échappements en unité UTF-16
  • Example#2977 - Exemple avec grapheme_extract
  • Example#2978 - Exemple avec grapheme_stripos
  • Example#2979 - Exemple avec grapheme_stristr
  • Example#2980 - Exemple avec grapheme_strlen
  • Example#2981 - Exemple avec grapheme_strpos
  • Example#2982 - Exemple avec grapheme_strripos
  • Example#2983 - Exemple avec grapheme_strrpos
  • Example#2984 - Exemple avec grapheme_strstr
  • Example#2985 - Exemple avec grapheme_substr
  • Example#2986 - Exemple avec idn_to_ascii
  • Example#2987 - Exemple avec idn_to_utf8
  • Example#2988 - Test de différents codepoint
  • Example#2989 - Test de différents codepoint
  • Example#2990 - Test de différents codepoint
  • Example#2991 - Test de différents codepoint
  • Example#2992 - Test de différents codepoint
  • Example#2993 - Test de différents codepoint
  • Example#2994 - Test de différents codepoint
  • Example#2995 - Test de différents codepoint
  • Example#2996 - Test de différents codepoint
  • Example#2997 - Enumerating over a sample range of code points
  • Example#2998 - Enumerating over a sample range of code points
  • Example#2999 - Test de différents codepoint
  • Example#3000 - Test de différents codepoint
  • Example#3001 - Test de différents codepoint
  • Example#3002 - Test de différents codepoint
  • Example#3003 - Test de différents codepoint
  • Example#3004 - Test de différentes propriétés
  • Example#3005 - Test de différentes propriétés
  • Example#3006 - Test de différentes propriétés
  • Example#3007 - Test de différents codepoint
  • Example#3008 - Test de différentes propriétés
  • Example#3009 - Test de différentes propriétés
  • Example#3010 - Test de différentes propriétés
  • Example#3011 - Test de différentes propriétés
  • Example#3012 - Test de différentes propriétés
  • Example#3013 - Test de différentes propriétés
  • Example#3014 - Test de différents codepoint
  • Example#3015 - Test de différents codepoint
  • Example#3016 - Test de différents codepoint
  • Example#3017 - Test de différents codepoint
  • Example#3018 - Test de différents codepoint
  • Example#3019 - Test de différents codepoint
  • Example#3020 - Test de différents codepoint
  • Example#3021 - Test de différents codepoint
  • Example#3022 - Test de différents codepoint
  • Example#3023 - Test de différents codepoint
  • Example#3024 - Test de différents codepoint
  • Example#3025 - Test de différents codepoint
  • Example#3026 - Test de différents codepoint
  • Example#3027 - Test de différents codepoint
  • Example#3028 - Test de différents codepoint
  • Example#3029 - Test de différents codepoint
  • Example#3030 - Test de différents codepoint
  • Example#3031 - Test de différents codepoint
  • Example#3032 - Test de différents codepoint
  • Example#3033 - Test de différents codepoint
  • Example#3034 - Test de différents codepoint
  • Example#3035 - Test de différents codepoint
  • Example#3036 - Test de différents codepoint
  • Example#3037 - Test de différents codepoint
  • Example#3038 - Test de différents codepoint
  • Example#3039 - Test de différents codepoint
  • Example#3040 - Test de différents codepoint
  • Example#3041 - Test de différents codepoint
  • Example#3042 - Test de différents codepoint
  • Example#3043 - Test de différents codepoint
  • Example#3044 - Test de différents codepoint
  • Example#3045 - Test de différents codepoint
  • Example#3046 - Exemple avec intl_error_name
  • Example#3047 - Exemple avec intl_get_error_code
  • Example#3048 - Exemple avec intl_get_error_message
  • Example#3049 - Exemple avec intl_is_failure
  • Example#3050 - Configuration de php.ini pour mbstring
  • Example#3051 - Configuration de php.ini pour les utilisateurs de EUC-JP
  • Example#3052 - Configuration de php.ini pour les utilisateurs de SJIS
  • Example#3053 - Désactive la conversion HTTP dans le php.ini
  • Example#3054 - Exemple de configuration de mbstring dans php.ini
  • Example#3055 - Exemple de script avec mbstring
  • Example#3056 - Exemple avec mb_convert_case
  • Example#3057 - Exemple avec mb_convert_case avec du texte UTF-8 non latin
  • Example#3058 - Exemple avec mb_convert_encoding
  • Example#3059 - Exemple avec mb_convert_kana
  • Example#3060 - Exemple avec mb_convert_variables
  • Example#3061 - Exemple avec map
  • Example#3062 - L'exemple map échappe la chaîne JavaScript
  • Example#3063 - Exemple avec mb_detect_encoding
  • Example#3064 - Exemple avec mb_detect_order
  • Example#3065 - Exemple d'ordre de détection inutile
  • Example#3066 - Exemple avec mb_encode_mimeheader
  • Example#3067 - Exemple avec map
  • Example#3068 - Exemple avec mb_encode_numericentity
  • Example#3069 - Exemple avec mb_encoding_aliases
  • Example#3070 - Exemple avec mb_ereg_replace_callback
  • Example#3071 - mb_ereg_replace_callback utilise les fonctions anonymes supporté en PHP 5.3.0 ou supérieur
  • Example#3072 - Exemple avec mb_internal_encoding
  • Example#3073 - Exemple avec mb_list_encodings
  • Example#3074 - Exemple avec mb_output_handler
  • Example#3075 - Exemple avec mb_preferred_mime_name
  • Example#3076 - Exemple avec mb_strimwidth
  • Example#3077 - Exemple avec mb_strtolower
  • Example#3078 - Exemple avec mb_strtolower avec du texte UTF-8 non latin
  • Example#3079 - Exemple avec mb_strtoupper
  • Example#3080 - Exemple avec mb_strtoupper et du texte UTF-8 non latin
  • Example#3081 - Exemple mb_strwidth
  • Example#3082 - Exemple avec mb_substitute_character
  • Example#3083 - Exemple avec mb_substr_count
  • Example#3084 - pspell_add_to_personal
  • Example#3085 - Exemple avec pspell_check
  • Example#3086 - Exemple avec pspell_add_to_personal
  • Example#3087 - pspell_config_create
  • Example#3088 - pspell_config_ignore
  • Example#3089 - Exemple avec pspell_config_mode
  • Example#3090 - pspell_config_personal
  • Example#3091 - pspell_config_repl
  • Example#3092 - pspell_config_runtogether
  • Example#3093 - pspell_new_config
  • Example#3094 - pspell_new_personal
  • Example#3095 - pspell_new
  • Example#3096 - pspell_add_to_personal
  • Example#3097 - pspell_store_replacement
  • Example#3098 - Exemple avec pspell_suggest
  • Example#3099 - Exemple avec recode_file
  • Example#3100 - Exemple avec recode_string
  • Example#3101 - Exemple avec exif_imagetype
  • Example#3102 - Exemple avec exif_read_data
  • Example#3103 - exif_read_data avec les flux disponible depuis PHP 7.2.0
  • Example#3104 - Exemple pour exif_tagname
  • Example#3105 - Exemple avec exif_thumbnail
  • Example#3106 - Création d'une image PNG avec PHP
  • Example#3107 - Ajout d'un tatouage numérique sur des images en utilisant un canal Alpha
  • Example#3108 - Exemple avec imagecopymerge pour créer un tatouage numérique translucide
  • Example#3109 - Exemple avec gd_info
  • Example#3110 - getimagesize et types MIME
  • Example#3111 - Exemple avec getimagesize
  • Example#3112 - getimagesize avec une URL
  • Example#3113 - getimagesize qui retourne IPTC
  • Example#3114 - Exemple avec getimagesizefromstring
  • Example#3115 - Exemple avec image_type_to_extension
  • Example#3116 - Exemple avec image_type_to_mime_type
  • Example#3117 - Exemple avec image2wbmp
  • Example#3118 - Exemple pour imageaffinematrixconcat
  • Example#3119 - Exemple pour imageaffinematrixget
  • Example#3120 - Exemple avec imagealphablending
  • Example#3121 - Comparaison de 2 lignes, dont l'une est anti-aliasée
  • Example#3122 - Dessine d'un cercle avec imagearc
  • Example#3123 - Enregistrer un fichier BMP
  • Example#3124 - Exemple avec imagechar
  • Example#3125 - Exemple avec imagecharup
  • Example#3126 - Exemple avec imagecolorallocate
  • Example#3127 - Exemple d'utilisation de imagecolorallocatealpha
  • Example#3128 - Conversion de valeur alpha typique pour l'utiliser avec imagecolorallocatealpha
  • Example#3129 - Accès aux valeurs RGB
  • Example#3130 - Valeurs RVB lisibles en utilisant la fonction imagecolorsforindex
  • Example#3131 - Recherche d'un jeu de couleur dans une image
  • Example#3132 - Cherche un jeu de couleurs dans une image
  • Example#3133 - Exemple avec imagecolorclosesthwb
  • Example#3134 - Exemple avec imagecolordeallocate
  • Example#3135 - Récupération des couleurs composant le logo GD
  • Example#3136 - Récupération des couleurs composant le logo GD
  • Example#3137 - Exemple avec imagecolormatch
  • Example#3138 - Exemple avec imagecoloresolve pour récupérer les couleurs d'une image
  • Example#3139 - Exemple avec imagecoloresolve pour récupérer les couleurs d'une image
  • Example#3140 - Exemple avec imagecolorset
  • Example#3141 - Exemple avec imagecolorsforindex
  • Example#3142 - Récupération du nombre total de couleurs dans une image en utilisant la fonction imagecolorstotal
  • Example#3143 - Exemple avec imagecolortransparent
  • Example#3144 - Impression du logo PHP.net avec imageconvolution
  • Example#3145 - Flou gaussien avec imageconvolution
  • Example#3146 - On coupe le logo PHP.net
  • Example#3147 - Fusionne 2 copies du logo PHP.net avec 75% de transparence
  • Example#3148 - Exemple avec imagecopymergegray
  • Example#3149 - Exemple simple
  • Example#3150 - Redimensionnement proportionnel d'une image
  • Example#3151 - Redimensionnement d'une image
  • Example#3152 - Création d'une image GD et affichage de cette image
  • Example#3153 - Convertit une image BMP en image PNG en utilisant imagecreatefrombmp
  • Example#3154 - Exemple avec imagecreatefromgd2
  • Example#3155 - Exemple avec imagecreatefromgd2part
  • Example#3156 - Exemple avec imagecreatefromgd
  • Example#3157 - Exemple de prise en charge d'une erreur lors du chargement d'une image GIF
  • Example#3158 - Exemple de gestion d'une erreur lors du chargement d'une image JPEG
  • Example#3159 - Exemple de gestion d'une erreur lors du chargement d'une image PNG
  • Example#3160 - Exemple avec imagecreatefromstring
  • Example#3161 - Exemple de gestion d'une erreur lors du chargement d'une image WBMP
  • Example#3162 - Convertit une image WebP en une image jpeg en utilisant la fonction imagecreatefromwebp
  • Example#3163 - Convertie une image XBM en une image PNG en utilisant la fonction imagecreatefromxbm
  • Example#3164 - Création d'une instance d'image en utilisant la fonction imagecreatefromxpm
  • Example#3165 - Création d'un flux d'image GD, et affichage
  • Example#3166 - Exemple avec imagecrop
  • Example#3167 - Rognage automatique correcte
  • Example#3168 - Exemple avec imagedashedline
  • Example#3169 - Alternative à la fonction imagedashedline
  • Example#3170 - Exemple avec imagedestroy
  • Example#3171 - Exemple avec imageellipse
  • Example#3172 - Exemple avec imagefill
  • Example#3173 - Création d'un camembert en 3D
  • Example#3174 - Exemple avec imagefilledellipse
  • Example#3175 - Exemple avec imagefilledpolygon
  • Example#3176 - Exemple avec imagefilledrectangle
  • Example#3177 - Remplissage d'un ellipse avec une couleur
  • Example#3178 - Exemple avec imagefilter
  • Example#3179 - Exemple avec imagefilter
  • Example#3180 - Exemple avec imagefilter
  • Example#3181 - Exemple d'image en négatif avec imagefilter
  • Example#3182 - Exemple de pixelisation avec imagefilter
  • Example#3183 - Exemple de dispersion imagefilter
  • Example#3184 - Retourne une image verticalement
  • Example#3185 - Retourne une image horizontalement
  • Example#3186 - Exemple avec imagefontheight et des polices internes
  • Example#3187 - Exemple avec imagefontheight et imageloadfont
  • Example#3188 - Exemple avec imagefontwidth et les polices internes
  • Example#3189 - Exemple avec imagefontwidth et imageloadfont
  • Example#3190 - Exemple avec imageftbbox
  • Example#3191 - Exemple avec imagefttext
  • Example#3192 - Exemple avec imagegammacorrect
  • Example#3193 - Affichage d'une image GD2
  • Example#3194 - Sauvegarde d'une image GD2
  • Example#3195 - Affichage d'une image GD
  • Example#3196 - Sauvegarde d'une image GD
  • Example#3197 - Exemple avec imagegetclip
  • Example#3198 - Affichage d'une image en utilisant imagegif
  • Example#3199 - Conversion d'une image PNG en GIF, en utilisant imagegif
  • Example#3200 - Exemple avec imagegrabscreen
  • Example#3201 - Exemple avec imagegrabwindow
  • Example#3202 - Activation de l'entrelacement en utilisant la fonction imageinterlace
  • Example#3203 - Détection simple d'une image en truecolor avec imageistruecolor
  • Example#3204 - Affichage d'une image JPEG vers le navigateur
  • Example#3205 - Sauvegarde d'une image JPEG dans un fichier
  • Example#3206 - Affichage de l'image avec une qualité de 75% vers le navigateur
  • Example#3207 - Exemple avec imagelayereffect
  • Example#3208 - Trace une ligne fine
  • Example#3209 - Exemple avec imageloadfont
  • Example#3210 - Exemple avec imageopenpolygon
  • Example#3211 - Exemple avec imagepalettecopy
  • Example#3212 - Convertit n'importe quelle ressource image en couleur vraie
  • Example#3213 - Exemple avec imagepolygon
  • Example#3214 - Exemple avec imagerectangle
  • Example#3215 - Définir et récupérer la résolution d'une image
  • Example#3216 - Rotation d'une image de 180 degrés
  • Example#3217 - Utilisation simple de imagesavealpha
  • Example#3218 - Exemple avec imagesetbrush
  • Example#3219 - Exemple avec imagesetinterpolation
  • Example#3220 - Exemple avec imagesetpixel
  • Example#3221 - Exemple pour imagesetstyle
  • Example#3222 - Exemple avec imagesetthickness
  • Example#3223 - Exemple avec imagesettile
  • Example#3224 - Exemple avec imagestring
  • Example#3225 - Exemple avec imagestringup
  • Example#3226 - Exemple avec imagesx
  • Example#3227 - Exemple avec imagesy
  • Example#3228 - Convertion d'une image truecolor en une palette
  • Example#3229 - Exemple avec imagettfbbox
  • Example#3230 - Exemple avec imagettftext
  • Example#3231 - Exemple avec imagetypes
  • Example#3232 - Affichage d'une image WBMP
  • Example#3233 - Sauvegarde de l'image WBMP
  • Example#3234 - Affichage de l'image avec un premier-plan différent
  • Example#3235 - Sauvegarde d'un fichier WebP
  • Example#3236 - Sauvegarde d'un fichier XBM
  • Example#3237 - Sauvegarde d'un fichier XBM avec une couleur de premier-plan différente
  • Example#3238 - Exemple avec iptcembed
  • Example#3239 - Exemple avec iptcparse() et getimagesize
  • Example#3240 - Exemple avec jpeg2wbmp
  • Example#3241 - Exemple avec png2wbmp
  • Example#3242 - Gmagick Example
  • Example#3243 - Exemple avec Gmagick::despeckleimage
  • Example#3244 - Exemple avec Gmagick::setCompressionQuality
  • Example#3245 - Création d'une miniature avec Imagick
  • Example#3246 - Création de miniature de toutes les images JPG d'un dossier
  • Example#3247 - Création d'un reflet sur une image
  • Example#3248 - Remplissage d'un texte avec un dégradé
  • Example#3249 - Lit une image GIF et redimensionne toutes les frames
  • Example#3250 - Create a PHP logo
  • Example#3251 - Exemple avec Imagick::adaptiveBlurImage
  • Example#3252 - Exemple avec Imagick::adaptiveResizeImage
  • Example#3253 - Exemple avec Imagick::adaptiveSharpenImage
  • Example#3254 - Exemple avec Imagick::adaptiveThresholdImage
  • Example#3255 - Exemple avec Imagick::addNoiseImage
  • Example#3256 - Exemple avec Imagick::affineTransformImage
  • Example#3257 - Exemple avec Imagick::annotateImage
  • Example#3258 - Exemple avec Imagick::appendImages
  • Example#3259 - Imagick::autoLevelImage
  • Example#3260 - Exemple avec Imagick::blackThresholdImage
  • Example#3261 - Imagick::blueShiftImage
  • Example#3262 - Exemple avec Imagick::blurImage
  • Example#3263 - Exemple avec Imagick::borderImage
  • Example#3264 - Imagick::brightnessContrastImage
  • Example#3265 - Exemple avec Imagick::charcoalImage
  • Example#3266 - Exemple avec Imagick::chopImage
  • Example#3267 - Clonage d'objet Imagick avec différentes versions d'Imagick
  • Example#3268 - Exemple avec Imagick::clutImage
  • Example#3269 - Exemple avec Imagick::colorizeImage
  • Example#3270 - Imagick::colorMatrixImage
  • Example#3271 - Exemple avec Imagick::commentImage
  • Example#3272 - Exemple avec Imagick::compareImageLayers
  • Example#3273 - Exemple avec Imagick::compareImages
  • Example#3274 - Using Imagick::compositeImage:
  • Example#3275 - Exemple avec Imagick::contrastImage
  • Example#3276 - Exemple avec Imagick::convolveImage
  • Example#3277 - Exemple avec Imagick::cropImage
  • Example#3278 - Exemple avec Imagick::deskewImage
  • Example#3279 - Exemple avec Imagick::despeckleImage
  • Example#3280 - Exemple avec Imagick::distortImage
  • Example#3281 - Exemple avec Imagick::edgeImage
  • Example#3282 - Exemple avec Imagick::embossImage
  • Example#3283 - Exemple avec Imagick::enhanceImage
  • Example#3284 - Exemple avec Imagick::equalizeImage
  • Example#3285 - Exemple avec Imagick::evaluateImage
  • Example#3286 - Exemple avec Imagick::exportImagePixels
  • Example#3287 - Imagick::filter
  • Example#3288 - Exemple avec Imagick::flipImage
  • Example#3289 - Exemple avec Imagick::floodfillPaintImage
  • Example#3290 - Exemple avec Imagick::flopImage
  • Example#3291 - Imagick::forwardFourierTransformImage
  • Example#3292 - Exemple avec Imagick::frameImage
  • Example#3293 - Crée un gradient sinusoidal
  • Example#3294 - Crée un gradient depuis le polynome (4x^2 - 4x + 1)
  • Example#3295 - Crée un gradient complexe depuis le polynome (4x^2 - 4x^2 + 1) modulé par un gradient sinusoidal
  • Example#3296 - Exemple avec Imagick::fxImage
  • Example#3297 - Exemple avec Imagick::gammaImage
  • Example#3298 - Exemple avec Imagick::gaussianBlurImage
  • Example#3299 - Exemple avec Imagick::getImageGeometry
  • Example#3300 - Exemple avec Imagick::getImageHistogram
  • Example#3301 - Exemple avec Imagick::getImageLength:
  • Example#3302 - Exemple avec Imagick::getImageProperties
  • Example#3303 - Exemple avec Imagick::getImageProperty
  • Example#3304 - Exemple avec Imagick::getIteratorIndex
  • Example#3305 - Exemple avec Imagick::getPixelIterator
  • Example#3306 - Imagick::getPixelRegionIterator example
  • Example#3307 - Obtention de la taille d'une image RVB brute définie à 200x400, après mise à l'échelle à 400x800 (par rapport à la largeur/hauteur)
  • Example#3308 - Exemple avec Imagick::haldClutImage
  • Example#3309 - Imagick::identifyFormat
  • Example#3310 - Exemple de format du résultat
  • Example#3311 - Exemple avec Imagick::implodeImage
  • Example#3312 - Exemple avec Imagick::importImagePixels
  • Example#3313 - Exemple avec Imagick::levelImage
  • Example#3314 - Exemple avec Imagick::linearStretchImage
  • Example#3315 - Exemple avec Imagick::magnifyImage
  • Example#3316 - Exemple avec Imagick::medianFilterImage
  • Example#3317 - Exemple avec Imagick::mergeImageLayers
  • Example#3318 - Exemple avec Imagick::modulateImage
  • Example#3319 - Convolve Imagick::morphology
  • Example#3320 - Correlate Imagick::morphology
  • Example#3321 - Erode Imagick::morphology
  • Example#3322 - Erode Intensity Imagick::morphology
  • Example#3323 - Dilate Imagick::morphology
  • Example#3324 - Dilate intensity Imagick::morphology
  • Example#3325 - Distance with Chebyshev kernel Imagick::morphology
  • Example#3326 - Distance with Manhattan kernel Imagick::morphology
  • Example#3327 - Distance with ocatagonal kernel Imagick::morphology
  • Example#3328 - Distance with Euclidean kernel Imagick::morphology
  • Example#3329 - Edge Imagick::morphology
  • Example#3330 - Open Imagick::morphology
  • Example#3331 - Open intensity Imagick::morphology
  • Example#3332 - Close Imagick::morphology
  • Example#3333 - Close Intensity Imagick::morphology
  • Example#3334 - Smooth Imagick::morphology
  • Example#3335 - Edge in Imagick::morphology
  • Example#3336 - Edge out Imagick::morphology
  • Example#3337 - The 'TopHat' method, or more specifically 'White Top Hat', returns the pixels that were removed by a Opening of the shape, that is the pixels that were removed to round off the points, and the connecting bridged between shapes. Imagick::morphology
  • Example#3338 - The 'BottomHat' method, also known as 'Black TopHat' is the pixels that a Closing of the shape adds to the image. That is the pixels that were used to fill in the 'holes', 'gaps', and 'bridges'. Imagick::morphology
  • Example#3339 - Hit and Miss Imagick::morphology
  • Example#3340 - Thinning Imagick::morphology
  • Example#3341 - Thicken Imagick::morphology
  • Example#3342 - Thick to generate a convex hull Imagick::morphology
  • Example#3343 - Iterative morphology Imagick::morphology
  • Example#3344 - Helper functon to get an image silhouette Imagick::morphology
  • Example#3345 - Exemple avec Imagick::motionBlurImage
  • Example#3346 - Exemple avec Imagick::negateImage
  • Example#3347 - Exemple avec Imagick::newImage
  • Example#3348 - Exemple avec Imagick::newPseudoImage
  • Example#3349 - Exemple avec Imagick::normalizeImage
  • Example#3350 - Exemple avec Imagick::oilPaintImage
  • Example#3351 - Exemple avec Imagick::optimizeImageLayers
  • Example#3352 - Exemple avec Imagick::orderedPosterizeImage
  • Example#3353 - Exemple avec Imagick::pingImageBlob
  • Example#3354 - Exemple avec Imagick::pingImageFile
  • Example#3355 - Exemple avec Imagick::polaroidImage
  • Example#3356 - Exemple avec Imagick::posterizeImage
  • Example#3357 - Exemple avec Imagick::quantizeImage
  • Example#3358 - Exemple avec Imagick::queryFontMetrics
  • Example#3359 - Exemple avec Imagick::queryFonts
  • Example#3360 - Exemple avec Imagick::queryFormats
  • Example#3361 - Exemple avec Imagick::radialBlurImage
  • Example#3362 - Exemple avec Imagick::raiseImage
  • Example#3363 - Exemple avec Imagick::randomThresholdImage
  • Example#3364 - Exemple avec Imagick::readImageBlob
  • Example#3365 - Exemple avec Imagick::recolorImage
  • Example#3366 - Exemple avec Imagick::reduceNoiseImage
  • Example#3367 - Exemple avec Imagick::resampleImage
  • Example#3368 - Exemple avec Imagick::resizeImage
  • Example#3369 - Exemple avec Imagick::rollImage
  • Example#3370 - Exemple avec Imagick::rotateImage
  • Example#3371 - Imagick::rotationalBlurImage
  • Example#3372 - Exemple avec Imagick::roundCorners:
  • Example#3373 - Exemple avec Imagick::scaleImage
  • Example#3374 - Exemple avec Imagick::segmentImage
  • Example#3375 - Imagick::selectiveBlurImage
  • Example#3376 - Exemple avec Imagick::separateImageChannel
  • Example#3377 - Exemple avec Imagick::sepiaToneImage
  • Example#3378 - Exemple avec Imagick::setCompressionQuality
  • Example#3379 - Exemple avec Imagick::setFont
  • Example#3380 - Exemple avec Imagick::setImage
  • Example#3381 - Exemple avec Imagick::setImageArtifact
  • Example#3382 - Exemple avec Imagick::setImageBias
  • Example#3383 - Exemple avec Imagick::setImageClipMask
  • Example#3384 - Exemple avec Imagick::setImageCompressionQuality
  • Example#3385 - Modification d'un GIF animé avec Imagick::setImageDelay
  • Example#3386 - Utilisation basique de la méthode Imagick::setImageIterations
  • Example#3387 - Exemple avec Imagick::setImageOpacity
  • Example#3388 - Exempe avec Imagick::setImageOrientation
  • Example#3389 - Exemple avec Imagick::setImageProperty
  • Example#3390 - Exempe avec Imagick::setImageResolution
  • Example#3391 - Modification d'un GIF animé avec la méthode Imagick::setImageTicksPerSecond
  • Example#3392 - Exemple avec Imagick::setIteratorIndex
  • Example#3393 - Tentative d'atteindre la taille '$extent' avec Imagick::setOption
  • Example#3394 - Exemple avec Imagick::setOption
  • Example#3395 - Exemple avec Imagick::setOption
  • Example#3396 - Exemple avec Imagick::setPointSize
  • Example#3397 - Imagick::setProgressMonitor
  • Example#3398 - Exemple avec Imagick::setSamplingFactors
  • Example#3399 - Exemple avec Imagick::shadeImage
  • Example#3400 - Exemple avec Imagick::shadowImage
  • Example#3401 - Exemple avec Imagick::sharpenImage
  • Example#3402 - Exemple avec Imagick::shaveImage
  • Example#3403 - Exemple avec Imagick::shearImage
  • Example#3404 - Crée une gradient d'image en utilisant la méthode Imagick::sigmoidalContrastImage pour mélanger deux images en douceur, où le mélange est défini par les variables $contrast et $midpoint.
  • Example#3405 - Exemple avec Imagick::sketchImage
  • Example#3406 - Imagick::smushImages
  • Example#3407 - Exemple avec Imagick::solarizeImage
  • Example#3408 - Exemple avec Imagick::sparseColorImage et SPARSECOLORMETHOD_BARYCENTRIC
  • Example#3409 - Exemple avec Imagick::sparseColorImage et SPARSECOLORMETHOD_BILINEAR
  • Example#3410 - Exemple avec Imagick::sparseColorImage et SPARSECOLORMETHOD_SPEPARDS
  • Example#3411 - Exemple avec Imagick::sparseColorImage et SPARSECOLORMETHOD_VORONOI
  • Example#3412 - Exemple avec Imagick::sparseColorImage et SPARSECOLORMETHOD_BARYCENTRIC
  • Example#3413 - createGradientImage est utilisé par les autres exemples. Imagick::sparseColorImage
  • Example#3414 - Exemple avec Imagick::spliceImage
  • Example#3415 - Exemple avec Imagick::spreadImage
  • Example#3416 - Imagick::statisticImage
  • Example#3417 - Imagick::subImageMatch
  • Example#3418 - Exemple avec Imagick::swirlImage
  • Example#3419 - Exemple avec Imagick::textureImage
  • Example#3420 - Exemple avec Imagick::thresholdImage
  • Example#3421 - Exemple avec Imagick::thumbnailImage
  • Example#3422 - Exemple avec Imagick::tintImage
  • Example#3423 - Exemple avec Imagick::transformImage:
  • Example#3424 - Imagick::transformImageColorspace example
  • Example#3425 - Imagick::transformImageColorspace
  • Example#3426 - Exemple avec Imagick::transparentPaintImage
  • Example#3427 - Exemple avec Imagick::transposeImage
  • Example#3428 - Exemple avec Imagick::transverseImage
  • Example#3429 - Exemple avec Imagick::trimImage:
  • Example#3430 - Exemple avec Imagick::uniqueImageColors
  • Example#3431 - Exemple avec Imagick::unsharpMaskImage
  • Example#3432 - Exemple avec Imagick::vignetteImage
  • Example#3433 - WaveImage peut être très lent ; Imagick::waveImage
  • Example#3434 - Exemple avec Imagick::whiteThresholdImage
  • Example#3435 - Exemple avec ImagickDraw::affine
  • Example#3436 - Exemple avec ImagickDraw::arc
  • Example#3437 - Exemple avec ImagickDraw::bezier
  • Example#3438 - Exemple avec ImagickDraw::circle
  • Example#3439 - Exemple avec ImagickDraw::composite
  • Example#3440 - Exemple avec ImagickDraw::ellipse
  • Example#3441 - Exemple avec ImagickDraw::line
  • Example#3442 - Exemple avec ImagickDraw::matte
  • Example#3443 - Exemple avec ImagickDraw::pathCurveToQuadraticBezierAbsolute
  • Example#3444 - ImagickDraw::pathCurveToQuadraticBezierSmoothAbsolute
  • Example#3445 - ImagickDraw::pathCurveToQuadraticBezierSmoothRelative
  • Example#3446 - Exemple avec ImagickDraw::pathStart
  • Example#3447 - Exemple avec ImagickDraw::point
  • Example#3448 - Exemple avec ImagickDraw::polygon
  • Example#3449 - Exempe avec ImagickDraw::polyline
  • Example#3450 - Exemple avec ImagickDraw::popDefs
  • Example#3451 - Exemple avec ImagickDraw::push
  • Example#3452 - Exemple avec ImagickDraw::pushPattern
  • Example#3453 - Exemple avec ImagickDraw::rectangle
  • Example#3454 - Exemple avec ImagickDraw::rotate
  • Example#3455 - Exemple avec ImagickDraw::roundRectangle
  • Example#3456 - Exemple avec ImagickDraw::scale
  • Example#3457 - Exemple avec ImagickDraw::setClipPath
  • Example#3458 - Exemple avec ImagickDraw::setClipRule
  • Example#3459 - Exemple avec ImagickDraw::setClipUnits
  • Example#3460 - Exemple avec ImagickDraw::setFillAlpha
  • Example#3461 - Exemple avec ImagickDraw::setFillColor
  • Example#3462 - Exemple avec ImagickDraw::setFillOpacity
  • Example#3463 - Exemple avec ImagickDraw::setFillRule
  • Example#3464 - Exemple avec ImagickDraw::setFont
  • Example#3465 - Exemple avec ImagickDraw::setFontFamily
  • Example#3466 - Exemple avec ImagickDraw::setFontSize
  • Example#3467 - Exemple avec ImagickDraw::setFontStretch
  • Example#3468 - Exemple avec ImagickDraw::setFontStyle
  • Example#3469 - Exemple avec ImagickDraw::setFontWeight
  • Example#3470 - Exemple avec ImagickDraw::setGravity
  • Example#3471 - Exemple avec ImagickDraw::setStrokeAlpha
  • Example#3472 - Exemple avec ImagickDraw::setStrokeAntialias
  • Example#3473 - Exemple avec ImagickDraw::setStrokeColor
  • Example#3474 - Exemple avec ImagickDraw::setStrokeDashArray
  • Example#3475 - Exemple avec ImagickDraw::setStrokeDashOffset
  • Example#3476 - Exemple avec ImagickDraw::setStrokeLineCap
  • Example#3477 - Exemple avec ImagickDraw::setStrokeLineJoin
  • Example#3478 - Exemple avec ImagickDraw::setStrokeMiterLimit
  • Example#3479 - Exemple avec ImagickDraw::setStrokeOpacity
  • Example#3480 - Exemple avec ImagickDraw::setStrokeWidth
  • Example#3481 - Exemple avec ImagickDraw::setTextAlignment
  • Example#3482 - Exemple avec ImagickDraw::setTextAntialias
  • Example#3483 - Exemple avec ImagickDraw::setTextDecoration
  • Example#3484 - Exemple avec ImagickDraw::setTextUnderColor
  • Example#3485 - Exemple avec ImagickDraw::setVectorGraphics
  • Example#3486 - Exemple avec ImagickDraw::setViewBox
  • Example#3487 - Exemple avec ImagickDraw::skewX
  • Example#3488 - Exemple avec ImagickDraw::skewY
  • Example#3489 - Exemple avec ImagickDraw::translate
  • Example#3490 - Exemple avec ImagickPixel::construct
  • Example#3491 - Utilisation simple de la méthode Imagick::getColor
  • Example#3492 - Utilisation basique de la méthode Imagick::getColorAsString
  • Example#3493 - ImagickPixel getColorCount
  • Example#3494 - Utilisation basique de la méthode Imagick::getColorValue
  • Example#3495 - ImagickPixel::getColorValueQuantum
  • Example#3496 - Exemple avec Imagick::getHSL
  • Example#3497 - Exemple avec ImagickPixel::isSimilar
  • Example#3498 - Exemple avec ImagickPixel::setColor
  • Example#3499 - Exemple avec Imagick::setColorValue
  • Example#3500 - ImagickPixel::setColorValueQuantum
  • Example#3501 - Exemple avec ImagickPixel::setHSL pour modifier une couleur
  • Example#3502 - Exemple avec ImagickPixelIterator::clear
  • Example#3503 - Exemple avec ImagickPixelIterator::construct
  • Example#3504 - Exemple avec ImagickPixelIterator::getNextIteratorRow
  • Example#3505 - Exemple avec ImagickPixelIterator::resetIterator
  • Example#3506 - Exemple avec ImagickPixelIterator::setIteratorRow
  • Example#3507 - ImagickKernel::addKernel
  • Example#3508 - ImagickKernel::addUnityKernel
  • Example#3509 - ImagickKernel::addUnityKernel
  • Example#3510 - ImagickKernel::fromBuiltin
  • Example#3511 - ImagickKernel::fromMatrix
  • Example#3512 - ImagickKernel::getMatrix
  • Example#3513 - ImagickKernel::scale
  • Example#3514 - ImagickKernel::separate
  • Example#3515 - Exemple avec imap_append
  • Example#3516 - Exemple avec imap_check
  • Example#3517 - Exemple avec imap_createmailbox
  • Example#3518 - Exemple avec imap_delete
  • Example#3519 - Exemple avec imap_fetch_overview
  • Example#3520 - Exemple avecimap_gc
  • Example#3521 - Exemple avec imap_get_quota
  • Example#3522 - Exemple avec imap_get_quota 4.3 ou supérieur
  • Example#3523 - Exemple avec imap_get_quotaroot
  • Example#3524 - Exemple avec imap_getacl
  • Example#3525 - Exemple avec imap_getmailboxes
  • Example#3526 - Exemple avec imap_list
  • Example#3527 - Exemple avec imap_mail_compose
  • Example#3528 - Exemple avec imap_mailboxmsginfo
  • Example#3529 - Exemple avec imap_mime_header_decode
  • Example#3530 - Différentes utilisations de imap_open
  • Example#3531 - Exemple avec imap_open
  • Example#3532 - Exemple avec imap_ping
  • Example#3533 - Exemple avec imap_reopen
  • Example#3534 - Exemple avec imap_rfc822_parse_adrlist
  • Example#3535 - Exemple avec imap_rfc822_write_address
  • Example#3536 - Exemple avec imap_search
  • Example#3537 - Exemple avec imap_set_quota
  • Example#3538 - Exemple avec imap_setflag_full
  • Example#3539 - Exemple avec imap_status
  • Example#3540 - Exemple avec imap_thread
  • Example#3541 - Exemple avec imap_timeout
  • Example#3542 - Utilisation de base de la fonction imap_utf8
  • Example#3543 - Calcul du hachage et enregistrement d'un utilisateur de liste de diffusion
  • Example#3544 - Envoi d'un mail
  • Example#3545 - Envoi d'un mail avec des en-têtes supplémentaires
  • Example#3546 - Envoi d'un mail avec un array d'en-têtes supplémentaires
  • Example#3547 - Envoi d'un mail avec un paramètre de ligne de commande additionnel
  • Example#3548 - Envoi de mail HTML
  • Example#3549 - Exemple avec mailparse_determine_best_xfer_encoding
  • Example#3550 - Exemple avec mailparse_rfc822_parse_addresses
  • Example#3551 - Exemple avec mailparse_stream_encode
  • Example#3552 - Exemple avec mailparse_uudecode_all
  • Example#3553 - Exemple avec bcadd
  • Example#3554 - Exemple avec bccomp
  • Example#3555 - Exemple avec bcdiv
  • Example#3556 - Exemple avec bcmod
  • Example#3557 - bcmod aved des décimales
  • Example#3558 - Exemple avec bcmul
  • Example#3559 - bcpow exemple pour scale
  • Example#3560 - Exemple avec bcpow
  • Example#3561 - bcpow exemple pour scale
  • Example#3562 - Exemple avec bcscale
  • Example#3563 - Exemple avec bcsqrt
  • Example#3564 - Exemple avec bcsub
  • Example#3565 - Factorielle avec GMP
  • Example#3566 - Exemple avec gmp_abs
  • Example#3567 - Exemple avec gmp_add
  • Example#3568 - Exemple avec gmp_and
  • Example#3569 - Exemple avec gmp_clrbit
  • Example#3570 - Exemple avec gmp_cmp
  • Example#3571 - Exemple avec gmp_com
  • Example#3572 - Exemple avec gmp_div_q
  • Example#3573 - Division de nombres GMP
  • Example#3574 - Exemple avec gmp_div_r
  • Example#3575 - Exemple avec gmp_divexact
  • Example#3576 - Exemple avec gmp_export
  • Example#3577 - Exemple avec gmp_fact
  • Example#3578 - Exemple avec gmp_gcd
  • Example#3579 - Résolution d'une équation Diophantine linéaire
  • Example#3580 - Exemple avec gmp_hamdist
  • Example#3581 - Exemple avec gmp_import
  • Example#3582 - Création d'un nombre GMP
  • Example#3583 - Exemple avec gmp_intval
  • Example#3584 - Exemple avec gmp_invert
  • Example#3585 - Exemple avec gmp_jacobi
  • Example#3586 - Exemple avec gmp_legendre
  • Example#3587 - Exemple avec gmp_mod
  • Example#3588 - Exemple avec gmp_mul
  • Example#3589 - Exemple avec gmp_neg
  • Example#3590 - Exemple avec gmp_nextprime
  • Example#3591 - Exemple avec gmp_or
  • Example#3592 - Exemple avec gmp_perfect_square
  • Example#3593 - Exemple avec gmp_popcount
  • Example#3594 - Exemple avec gmp_pow
  • Example#3595 - Exemple avec gmp_powm
  • Example#3596 - Exemple avec gmp_prob_prime
  • Example#3597 - Exemple avec gmp_random_bits
  • Example#3598 - Exemple avec gmp_random_range
  • Example#3599 - Exemple avec gmp_random_seed
  • Example#3600 - Exemple avec gmp_random
  • Example#3601 - Exemple avec gmp_scan0
  • Example#3602 - Exemple avec gmp_scan1
  • Example#3603 - Exemple avec gmp_setbit - index 0
  • Example#3604 - Exemple avec gmp_setbit - index 1
  • Example#3605 - Exemple avec gmp_setbit - annule un octet
  • Example#3606 - Exemple avec gmp_sign
  • Example#3607 - Exemple avec gmp_sqrt
  • Example#3608 - Exemple avec gmp_sqrtrem
  • Example#3609 - Convertir un nombre GMP en chaîne de caractères
  • Example#3610 - Exemple avec gmp_sub
  • Example#3611 - Exemple avec gmp_testbit
  • Example#3612 - Exemple avec gmp_xor
  • Example#3613 - Exemple avec abs
  • Example#3614 - Exemple avec base_convert
  • Example#3615 - Exemple avec bindec
  • Example#3616 - bindec interprète l'entrée comme un entier non-signé
  • Example#3617 - Exemple avec ceil
  • Example#3618 - Exemple avec cos
  • Example#3619 - Exemple avec decbin
  • Example#3620 - Exemple avec dechex
  • Example#3621 - Exemple avec la fonction dechex avec de gros entiers
  • Example#3622 - Exemple avec decoct
  • Example#3623 - Exemple avec deg2rad
  • Example#3624 - Exemple avec exp
  • Example#3625 - Using fdiv
  • Example#3626 - Exemple avec floor
  • Example#3627 - Exemple avec fmod
  • Example#3628 - Exemple avec hexdec
  • Example#3629 - Exemple de intdiv
  • Example#3630 - Exemple avec is_nan
  • Example#3631 - Exemple avec max
  • Example#3632 - Exemple avec min
  • Example#3633 - Calcule un nombre flottant aléatoire
  • Example#3634 - Exemple avec mt_rand
  • Example#3635 - Exemple avec mt_srand
  • Example#3636 - Exemple avec octdec
  • Example#3637 - Exemple avec pi
  • Example#3638 - Exemple avec pow
  • Example#3639 - Exemple avec rad2deg
  • Example#3640 - Exemple avec rand
  • Example#3641 - Exemple avec round
  • Example#3642 - Comment precision affecte un flottant
  • Example#3643 - Exemple avec mode
  • Example#3644 - Exemple avec mode et precision
  • Example#3645 - Exemple avec sin
  • Example#3646 - Exemple avec sqrt
  • Example#3647 - Exemple avec srand
  • Example#3648 - Exemple avec tan
  • Example#3649 - Évaluer un document FDF
  • Example#3650 - Ajout de code JavaScript à un document FDF
  • Example#3651 - Préremplir un formulaire PDF
  • Example#3652 - Enregistrement d'un fichier téléchargé
  • Example#3653 - Détecter tous les noms d'un formulaire FDF
  • Example#3654 - Accès aux données de formulaire FDF
  • Example#3655 - Accéder aux données du formulaire
  • Example#3656 - Lire un document FDF sous forme de chaîne de caractères
  • Example#3657 - Passer des données FDF à un second formulaire
  • Example#3658 - Exemple avec gnupg clearsign (Style procédural)
  • Example#3659 - Exemple avec gnupg clearsign (Style orienté objet)
  • Example#3660 - keylistiterator
  • Example#3661 - Exemple avec gnupg_adddecryptkey (Style procédural)
  • Example#3662 - Exemple avec gnupg_adddecryptkey (Style orienté objet)
  • Example#3663 - Exemple avec gnupg_addencryptkey (Style procédural)
  • Example#3664 - Exemple avec gnupg_addencryptkey (Style orienté objet)
  • Example#3665 - Exemple avec gnupg_addsignkey (Style procédural)
  • Example#3666 - Exemple avec gnupg_addsignkey (Style orienté objet)
  • Example#3667 - Exemple avec gnupg_cleardecryptkeys (Style procédural)
  • Example#3668 - Exemple avec gnupg_cleardecryptkeys (Style orienté objet)
  • Example#3669 - Exemple avec gnupg_clearencryptkeys (Style procédural)
  • Example#3670 - Exemple avec gnupg_clearencryptkeys (Style orienté objet)
  • Example#3671 - Exemple avec gnupg_clearsignkeys (Style procédural)
  • Example#3672 - Exemple avec gnupg_clearsignkeys (Style orienté objet)
  • Example#3673 - Exemple avec gnupg_decrypt (Style procédural)
  • Example#3674 - Exemple avec gnupg_decrypt (Style orienté objet)
  • Example#3675 - Exemple avec gnupg_decryptverify (Style procédural)
  • Example#3676 - Exemple avec gnupg_decryptverify (Style orienté objet)
  • Example#3677 - Exemple avec gnupg_encrypt (Style procédural)
  • Example#3678 - Exemple avec gnupg_encrypt (Style orienté objet)
  • Example#3679 - Exemple avec gnupg_encryptsign (Style procédural)
  • Example#3680 - Exemple avec gnupg_encryptsign (Style orienté objet)
  • Example#3681 - Exemple avec gnupg_export (Style procédural)
  • Example#3682 - Exemple avec gnupg_export (Style orienté objet)
  • Example#3683 - Exemple avec gnupg_geterror (Style procédural)
  • Example#3684 - Exemple avec gnupg_geterror (Style orienté objet)
  • Example#3685 - Exemple avec gnupg_getprotocol (Style procédural)
  • Example#3686 - Exemple avec gnupg_getprotocol (Style orienté objet)
  • Example#3687 - Exemple avec gnupg_import (Style procédural)
  • Example#3688 - Exemple avec gnupg_import (Style orienté objet)
  • Example#3689 - Exemple avec gnupg_init (Style procédural)
  • Example#3690 - Exemple avec gnupg_init (Style orienté objet)
  • Example#3691 - Exemple avec gnupg_keyinfo (Style procédural)
  • Example#3692 - Exemple avec gnupg_keyinfo (Style orienté objet)
  • Example#3693 - Exemple avec gnupg_setarmor (Style procédural)
  • Example#3694 - Exemple avec gnupg_setarmor (Style orienté objet)
  • Example#3695 - Exemple avec gnupg_seterrormode (Style procédural)
  • Example#3696 - Exemple avec gnupg_seterrormode (Style orienté objet)
  • Example#3697 - Exemple avec gnupg_setsignmode (Style procédural)
  • Example#3698 - Exemple avec gnupg_setsignmode (Style orienté objet)
  • Example#3699 - Exemple avec gnupg_sign (Style procédural)
  • Example#3700 - Exemple avec gnupg_sign (Style orienté objet)
  • Example#3701 - Exemple avec gnupg_verify (Style procédural)
  • Example#3702 - Exemple avec gnupg_verify (Style orienté objet)
  • Example#3703 - Création et utilisation d'un motif
  • Example#3704 - Création et utilisation d'un modèle PostScript
  • Example#3705 - Coupe un texte
  • Example#3706 - Dessin d'un rectangle
  • Example#3707 - Création et utilisation d'une tache de couleur
  • Example#3708 - Rotation d'un système de coordonnées
  • Example#3709 - Placement de texte à une position donnée
  • Example#3710 - Dessin d'une ligne pointillée
  • Example#3711 - Translation du système de coordonnées
  • Example#3712 - A rpmdbinfo example
  • Example#3713 - Searching for the package owning a file
  • Example#3714 - A rpminfo example
  • Example#3715 - Exemple
  • Example#3716 - Exemple
  • Example#3717 - Exemple
  • Example#3718 - Exemple
  • Example#3719 - Exemple
  • Example#3720 - Exemple
  • Example#3721 - Exemple
  • Example#3722 - Exemple
  • Example#3723 - Exemple
  • Example#3724 - example
  • Example#3725 - Exemple
  • Example#3726 - Exemple
  • Example#3727 - Exemple
  • Example#3728 - Exemple
  • Example#3729 - Exemple
  • Example#3730 - Exemple
  • Example#3731 - Exemple
  • Example#3732 - Exemple
  • Example#3733 - Exemple
  • Example#3734 - Demandes incorrectes
  • Example#3735 - Exécution d'une demande dans la fonction de rappel d'une autre
  • Example#3736 - Exécution d'une demande depuis la fonction de rappel d'une autre
  • Example#3737 - Utilisation de eio et libevent
  • Example#3738 - Annulation d'une demande
  • Example#3739 - Appel de la fonction eio_chmod
  • Example#3740 - Fabrication d'une demande personnalisée
  • Example#3741 - Création d'un groupe de demandes
  • Example#3742 - Utilisation de eio avec libevent
  • Example#3743 - Utilisation de eio avec l'extension event
  • Example#3744 - Exemple avec eio_cancel
  • Example#3745 - Exemple avec eio_custom
  • Example#3746 - Exemple avec eio_event_loop
  • Example#3747 - eio_lstat example
  • Example#3748 - Utilisation de eio avec libevent
  • Example#3749 - Le regroupement des requêtes
  • Example#3750 - Exemple avec eio_grp
  • Example#3751 - Exemple avec eio_link
  • Example#3752 - Exemple avec eio_lstat
  • Example#3753 - Exemple avec eio_mkdir
  • Example#3754 - Exemple avec eio_mknod
  • Example#3755 - Exemple avec eio_nreqs
  • Example#3756 - Exempe avec eio_open
  • Example#3757 - Exemple avec eio_poll
  • Example#3758 - Exemple avec eio_read
  • Example#3759 - Exemple avec eio_readdir
  • Example#3760 - Exemple avec eio_readlink
  • Example#3761 - Exemple avec eio_realpath
  • Example#3762 - Exemple avec eio_rename
  • Example#3763 - Exemple avec eio_rmdir
  • Example#3764 - Exemple avec eio_stat
  • Example#3765 - Exemple avec eio_statvfs
  • Example#3766 - Exemple avec eio_symlink
  • Example#3767 - Exemple de minuteurs
  • Example#3768 - Minuteur périodique. Alerte toutes les 10.5 secondes
  • Example#3769 - Minuteur périodique. Utilisation de la fonction de rappel de reprogrammation
  • Example#3770 - Minuteur périodique. Alerte toutes les 10.5 secondes, en commençant maintenant
  • Example#3771 - Attend que STDIN devienne accessible en lecture
  • Example#3772 - Utilisation de quelques I/O asynchrones pour accéder à un socket
  • Example#3773 - Encapsule une boucle dans une autre
  • Example#3774 - Encapsule une boucle créée avec le backend kqueue dans la boucle par défaut
  • Example#3775 - Gestion du signal SIGTERM
  • Example#3776 - Surveillance des modifications dans /var/log/messages
  • Example#3777 - Surveillance des modifications dans /var/log/messages. On regarde les modifications avec une seconde de délai
  • Example#3778 - Modification du statut d'un processus
  • Example#3779 - Using reschedule callback
  • Example#3780 - Encapsule une boucle créée avec le backend kqueue dans la boucle par défaut
  • Example#3781 - Encapsule une boucle dans une autre
  • Example#3782 - Boucle embarqué créé avec le backend kqueue dans la boucle par défaut
  • Example#3783 - Encapsulage d'une boucle créée avec le gestionnaire kqueue dans la boucle par défaut
  • Example#3784 - Periodic timer. Use reschedule callback
  • Example#3785 - Timer périodique. Appelé toutes les 10.5 secondes
  • Example#3786 - Watcher chaque heure
  • Example#3787 - Gestion d'un signal SIGTERM
  • Example#3788 - Surveillance des modifications dans /var/log/messages
  • Example#3789 - Sruveillance des modifications dans le dossier /var/log/messages
  • Example#3790 - timers simples
  • Example#3791 - Surveillance des modifications dans of /var/log/messages. Détecte les mises à jour oubliées en ajoutant une seconde de délai
  • Example#3792 - Enregistre un Watcher I/O pour des sockets UDP
  • Example#3793 - Exemple d'Utilisation avec Expect
  • Example#3794 - Autre exemple d'utilisation d'Expect
  • Example#3795 - Exemple avec expect_expectl
  • Example#3796 - Exemple avec expect_popen
  • Example#3797 - Exemple de contrôle de processus
  • Example#3798 - Exemple avec pcntl_fork
  • Example#3799 - Exemple avec pcntl_signal_dispatch
  • Example#3800 - Exemple avec pcntl_signal_get_handler
  • Example#3801 - Exemple avec pcntl_signal
  • Example#3802 - Exemple avec pcntl_sigprocmask
  • Example#3803 - Exemple avec pcntl_sigwaitinfo
  • Example#3804 - Exemple avec posix_access
  • Example#3805 - Exemple avec posix_ctermid
  • Example#3806 - Exemple avec posix_get_last_error
  • Example#3807 - Exemple avec posix_getcwd
  • Example#3808 - Exemple avec posix_getegid
  • Example#3809 - Exemple avec posix_geteuid
  • Example#3810 - Exemple avec posix_getgid
  • Example#3811 - Exemple avec posix_getgrgid
  • Example#3812 - Exemple avec posix_getgrnam
  • Example#3813 - Exemple avec posix_getgroups
  • Example#3814 - Exemple avec posix_getlogin
  • Example#3815 - Exemple avec posix_getpgid
  • Example#3816 - Exemple avec posix_getpid
  • Example#3817 - Exemple avec posix_getppid
  • Example#3818 - Exemple avec posix_getpwnam
  • Example#3819 - Exemple avec posix_getpwuid
  • Example#3820 - Exemple avec posix_getrlimit
  • Example#3821 - Exemple avec posix_getsid
  • Example#3822 - Exemple avec posix_getuid
  • Example#3823 - Exemple avec posix_mknod
  • Example#3824 - Exemple avec posix_setegid
  • Example#3825 - Exemple avec posix_setgid
  • Example#3826 - Exemple avec posix_setuid
  • Example#3827 - Exemple avec posix_strerror
  • Example#3828 - Exemple avec posix_times
  • Example#3829 - Exemple avec posix_uname
  • Example#3830 - Exemple avec escapeshellarg
  • Example#3831 - Exemple avec escapeshellcmd
  • Example#3832 - Exemple avec exec
  • Example#3833 - Utilisation de proc_nice pour définir la priorité de processus à haute
  • Example#3834 - Exemple avec proc_open
  • Example#3835 - Bizarrerie de proc_open sur Windows
  • Example#3836 - Exemple avec shell_exec
  • Example#3837 - Exemple avec system
  • Example#3838 - Example showing Future as return value
  • Example#3839 - Example showing Future as synchronization point
  • Example#3840 - Parcours une partie de la table des propriétés
  • Example#3841 - Compte les propriétés d'un objet
  • Example#3842 - Héritage à l'exécution
  • Example#3843 - Objets sécurisés Thread depuis les closures
  • Example#3844 - Détection des erreurs fatales dans Threads
  • Example#3845 - Détecte le statut de l'objet référencé
  • Example#3846 - Détecte le statut de l'objet référencé
  • Example#3847 - Détecte le statut de l'objet référencé
  • Example#3848 - Verouille les propriétés de l'objet
  • Example#3849 - Fusionne l'objet threadé dans la table des propriétés
  • Example#3850 - Notifications et attente
  • Example#3851 - Notifications and Waiting
  • Example#3852 - Enlève le dernier élément depuis la table des propriétés d'un objet threadé
  • Example#3853 - Enlève le premier élément depuis la table de propriétés de l'objet threadé
  • Example#3854 - Synchronisation
  • Example#3855 - Verouillage de la table des propriétés de l'objet threadé
  • Example#3856 - Notifications et attente
  • Example#3857 - Retourne l'identité du Thread ou du processus qui a créé le Thread référencé
  • Example#3858 - Retourne le thread actuellement en cours d'exécution
  • Example#3859 - Retourne l'identité du thread actuellement en cours d'exécution
  • Example#3860 - Retourne l'identité du Thread référencé
  • Example#3861 - Exécution dans le scope global
  • Example#3862 - Détecte le statut du Thread référencé
  • Example#3863 - Indique si le Thread référencé a été démarré
  • Example#3864 - Rejoint le Thread référencé
  • Example#3865 - Termine le thread référencé
  • Example#3866 - Démarre les Threads
  • Example#3867 - A basic example of Worker::collect
  • Example#3868 - Un exemple de base de Worker::getStacked
  • Example#3869 - Détecte le statut d'un worker
  • Example#3870 - Détecte le statut d'un Worker
  • Example#3871 - Eteint le worker référencé
  • Example#3872 - Empilage d'une tâche pour l'exécution sur un worker
  • Example#3873 - Supprime l'objet depuis la pile d'attente des Workers
  • Example#3874 - Exemple de méthode protégée : les méthodes protégées peuvent seulement être exécutées par un seul Thread à la fois.
  • Example#3875 - Exemple de méthode privée : les méthodes privées ne peuvent être exécutées par l'objet Threaded que pendant leur exécution
  • Example#3876 - Un exemple de base de Pool::collect
  • Example#3877 - Création d'un Pool
  • Example#3878 - Shutting down a pool
  • Example#3879 - Soumission de tâches
  • Example#3880 - Soumission d'une tâche à un worker spécifique
  • Example#3881 - Création et destruction d'un Mutex
  • Example#3882 - Création et destruction d'un Mutex
  • Example#3883 - Verrouillage et déverrouillage d'un Mutex
  • Example#3884 - Verrouillage et déverrouillage d'un Mutex
  • Example#3885 - Verrouillage et déverrouillage du Mutex
  • Example#3886 - Diffusion d'une condition
  • Example#3887 - Création et destruction d'une condition
  • Example#3888 - Création et destruction d'une condition
  • Example#3889 - Signallement d'une condition
  • Example#3890 - Attente des conditions
  • Example#3891 - New immutability semantics of Threaded
  • Example#3892 - Volatile use-case
  • Example#3893 - Adding a new class task to a thread
  • Example#3894 - Adding a new file task to a thread
  • Example#3895 - Adding a new function task to a thread
  • Example#3896 - Joining a thread
  • Example#3897 - Starting a new thread
  • Example#3898 - Getting the task count of a thread
  • Example#3899 - Locking a hash table's mutex lock
  • Example#3900 - Getting a hash table's size
  • Example#3901 - Locking a hash table's mutex lock
  • Example#3902 - Creating a new vector
  • Example#3903 - Deleting values in a vector
  • Example#3904 - Inserting a value into a vector
  • Example#3905 - Locking a vector's mutex lock
  • Example#3906 - Popping a value from a vector
  • Example#3907 - Pushing values to a vector
  • Example#3908 - Resizing a vector
  • Example#3909 - Shifting a value from a vector
  • Example#3910 - Getting a vector's size
  • Example#3911 - Locking a vector's mutex lock
  • Example#3912 - Unshifting a value to the front of a vector
  • Example#3913 - Updating a value in a vector
  • Example#3914 - Retrieving the front value of a queue
  • Example#3915 - Retrieving the front value in a loop (bad example - don't do this)
  • Example#3916 - Retrieving the front value in a loop (good example)
  • Example#3917 - Locking a queue's mutex lock
  • Example#3918 - Popping a value from a queue
  • Example#3919 - Pushing a value to a queue
  • Example#3920 - Getting a queue's size
  • Example#3921 - Locking a queue's mutex lock
  • Example#3922 - Creating a new atomic integer
  • Example#3923 - Decrementing an atomic integer's value
  • Example#3924 - Getting an atomic integer's value
  • Example#3925 - Incrementing an atomic integer's value
  • Example#3926 - Grouping together an atomic integer's operations (requiring a mutex lock)
  • Example#3927 - Setting an atomic integer's value
  • Example#3928 - Grouping together an atomic integer's operations (requiring a mutex lock)
  • Example#3929 - Introduction à la mémoire partagée
  • Example#3930 - Fermeture d'un bloc de mémoire partagée
  • Example#3931 - Effacement d'un bloc de mémoire partagée
  • Example#3932 - Créer un nouveau bloc de mémoire partagée Shmop
  • Example#3933 - Lit un bloc de mémoire partagée
  • Example#3934 - Lit la taille d'un bloc de mémoire partagée
  • Example#3935 - Écrit un bloc de mémoire partagée
  • Example#3936 - Exemple avec SyncMutex::__construct et un mutex nommé avec un délai d'attente maximal pour le verrou
  • Example#3937 - Exemple avec SyncMutex::__construct et un mutex non nommé
  • Example#3938 - Exemple avec SyncMutex::lock
  • Example#3939 - Exemple avec SyncMutex::unlock
  • Example#3940 - Exemple avec SyncSemaphore::__construct
  • Example#3941 - Exemple avec SyncSemaphore::lock
  • Example#3942 - Exemple avec SyncSemaphore::unlock
  • Example#3943 - Exemple avec SyncEvent::__construct
  • Example#3944 - Exemple avec SyncEvent::fire
  • Example#3945 - Exemple avec SyncEvent::reset
  • Example#3946 - Exemple avec SyncEvent::wait
  • Example#3947 - Exemple avec SyncReaderWriter::__construct
  • Example#3948 - Exemple avec SyncReaderWriter::readlock
  • Example#3949 - Exemple avec SyncReaderWriter::readunlock
  • Example#3950 - Exemple avec SyncReaderWriter::writelock
  • Example#3951 - Exemple avec SyncReaderWriter::writeunlock
  • Example#3952 - SyncSharedMemory::__construct example
  • Example#3953 - SyncSharedMemory::first example
  • Example#3954 - SyncSharedMemory::__construct example
  • Example#3955 - SyncSharedMemory::size example
  • Example#3956 - SyncSharedMemory::write example
  • Example#3957 - Exemple avec geoip_asnum_by_name
  • Example#3958 - Exemple avec geoip_continent_code_by_name
  • Example#3959 - Exemple avec geoip_country_code_by_name
  • Example#3960 - Exemple avec geoip_country_code3_by_name
  • Example#3961 - Exemple avec geoip_country_name_by_name
  • Example#3962 - Exemple avec geoip_database_info
  • Example#3963 - Exemple avec geoip_db_avail
  • Example#3964 - Exemple avec geoip_db_filename
  • Example#3965 - Exemple avec geoip_db_get_all_info
  • Example#3966 - Exemple avec geoip_db_get_all_info
  • Example#3967 - Exemple avec geoip_domain_by_name
  • Example#3968 - Exemple avec geoip_id_by_name
  • Example#3969 - Exemple avec geoip_isp_by_name
  • Example#3970 - Exemple avec geoip_netspeedcell_by_name
  • Example#3971 - Exemple avec geoip_org_by_name
  • Example#3972 - Exemple avec geoip_record_by_name
  • Example#3973 - Exemple avec geoip_region_by_name
  • Example#3974 - Exemple avec geoip_region_name_by_code pour les USA et le Canada
  • Example#3975 - Exemple avec geoip_region_name_by_code en utilisant les codes FIPS
  • Example#3976 - Exemple avec geoip_setup_custom_directory
  • Example#3977 - Exemple avec geoip_time_zone_by_country_and_region pour les USA et Canada
  • Example#3978 - Exemple avec geoip_time_zone_by_country_and_region et les codes FIPS
  • Example#3979 - xor.data file
  • Example#3980 - Simple train
  • Example#3981 - Simple test
  • Example#3982 - Exemple avec fann_create_train_from_callback
  • Example#3983 - Exemple avec fann_read_train_from_file
  • Example#3984 - Exemple avec JsonSerializable::jsonSerialize retournant un tableau
  • Example#3985 - Exemple avec JsonSerializable::jsonSerialize retournant un tableau associatif
  • Example#3986 - Exemple avec JsonSerializable::jsonSerialize retournant un entier
  • Example#3987 - Exemple avec JsonSerializable::jsonSerialize retournant une chaîne de caractères
  • Example#3988 - Exemple avec json_decode
  • Example#3989 - Accès à des propriétés d'objet invalides
  • Example#3990 - Erreurs habituelles lors de l'utilisation de la fonction json_decode
  • Example#3991 - Erreurs avec le paramètre depth
  • Example#3992 - Exemple avec json_decode et de gros entiers
  • Example#3993 - Exemple avec json_encode
  • Example#3994 - Exemple avec json_encode montrant quelques drapeaux en action
  • Example#3995 - Exemple avec l'option JSON_NUMERIC_CHECK
  • Example#3996 - Exemple avec un tableau séquentiel et un tableau non-séquentiel
  • Example#3997 - Exemple avec l'option JSON_PRESERVE_ZERO_FRACTION
  • Example#3998 - Exemple avec json_last_error
  • Example#3999 - json_last_error avec json_encode
  • Example#4000 - json_last_error et JSON_THROW_ON_ERROR
  • Example#4001 - Exemple avec Lua::assign
  • Example#4002 - Exemple avec Lua::call
  • Example#4003 - Exemple avec Lua::eval
  • Example#4004 - Exemple avec Lua::registerCallback
  • Example#4005 - Exemple avec LuaClosure::__invoke
  • Example#4006 - Execute some Lua code
  • Example#4007 - Calling a Lua function
  • Example#4008 - Profiling Lua code
  • Example#4009 - Loading code into Lua
  • Example#4010 - Manipulating the usage timer
  • Example#4011 - Registering PHP functions to call from Lua
  • Example#4012 - Calling a Lua function
  • Example#4013 - Calling a Lua function
  • Example#4014 - Exemple avec constant
  • Example#4015 - Définition d'une constante
  • Example#4016 - Constantes avec des Noms Réservés
  • Example#4017 - Vérifier la présence de constantes avec defined
  • Example#4018 - Exemple avec eval - concaténation de texte
  • Example#4019 - Exemple avec exit
  • Example#4020 - Exemple avec exit et un code d'erreur
  • Example#4021 - Exemple d'exécution des fonctions d'extinction et des destructeurs d'objets
  • Example#4022 - Exemple avec get_browser : liste des capacités du navigateur du client web
  • Example#4023 - Exemple avec __halt_compiler
  • Example#4024 - Exemple avec highlight_string
  • Example#4025 - hrtime usage
  • Example#4026 - Exemple avec ignore_user_abort
  • Example#4027 - Exemple avec pack
  • Example#4028 - Exemple avec php_strip_whitespace
  • Example#4029 - Basic sapi_windows_generate_ctrl_event Usage
  • Example#4030 - Basic sapi_windows_set_ctrl_handler Usage
  • Example#4031 - sapi_windows_vt100_support default state
  • Example#4032 - sapi_windows_vt100_support changing state
  • Example#4033 - Example usage of VT100 support enabled
  • Example#4034 - Exemple avec sleep
  • Example#4035 - Exemple avec sys_getloadavg
  • Example#4036 - Exemple avec time_nanosleep
  • Example#4037 - Exemple avec time_sleep_until
  • Example#4038 - Exemple avec uniqid
  • Example#4039 - Exemple avec unpack
  • Example#4040 - Exemple avec unpack et un argument de répétition
  • Example#4041 - Exemple avec unpack avec des clés non nommées
  • Example#4042 - Exemple avec usleep
  • Example#4043 - Get and set base path
  • Example#4044 - Get and set logger
  • Example#4045 - Fast write log
  • Example#4046 - Fast count some type of log count value
  • Example#4047 - Acquisit some type of log list
  • Example#4048 - seaslog_get_author example
  • Example#4049 - seaslog_get_version example
  • Example#4050 - SeasLog::alert example
  • Example#4051 - SeasLog::analyzerCount example
  • Example#4052 - SeasLog::analyzerDetail example
  • Example#4053 - SeasLog::closeLoggerStream example
  • Example#4054 - SeasLog::__construct example
  • Example#4055 - SeasLog::critical example
  • Example#4056 - SeasLog::debug example
  • Example#4057 - SeasLog::__destruct example
  • Example#4058 - SeasLog::emergency example
  • Example#4059 - SeasLog::error example
  • Example#4060 - SeasLog::flushBuffer example
  • Example#4061 - SeasLog::getBasePath example
  • Example#4062 - SeasLog::getBuffer example
  • Example#4063 - SeasLog::getBufferEnabled example
  • Example#4064 - SeasLog::getDatetimeFormat example
  • Example#4065 - SeasLog::getLastLogger example
  • Example#4066 - SeasLog::getRequestID example
  • Example#4067 - SeasLog::getRequestVariable example
  • Example#4068 - SeasLog::info example
  • Example#4069 - SeasLog::log example
  • Example#4070 - SeasLog::notice example
  • Example#4071 - SeasLog::setBasePath example
  • Example#4072 - SeasLog::setDatetimeFormat example
  • Example#4073 - SeasLog::setLogger example
  • Example#4074 - SeasLog::setRequestID example
  • Example#4075 - SeasLog::setRequestVariable example
  • Example#4076 - SeasLog::warning example
  • Example#4077 - Exemple avec SplDoublyLinkedList::__construct
  • Example#4078 - Exemple avec SplStack::__construct
  • Example#4079 - Exemple avec SplQueue::__construct
  • Example#4080 - Gestion des tâches avec SplQueue
  • Example#4081 - Exemple avec SplFixedArray
  • Example#4082 - Exemple avec SplFixedArray::__construct
  • Example#4083 - Exemple avec SplFixedArray::count
  • Example#4084 - Exemple avec SplFixedArray::fromArray
  • Example#4085 - Exemple avec SplFixedArray::getSize
  • Example#4086 - Exemple avec SplFixedArray::setSize
  • Example#4087 - Exemple avec SplFixedArray::toArray
  • Example#4088 - Exemple avec SplObjectStorage, sous forme d'ensemble d'objets
  • Example#4089 - Exemple avec SplObjectStorage, sous forme de carte
  • Example#4090 - Exemple avec SplObjectStorage::addAll
  • Example#4091 - Exemple avec SplObjectStorage::attach
  • Example#4092 - Exemple avec SplObjectStorage::contains
  • Example#4093 - Exemple avec SplObjectStorage::count
  • Example#4094 - Exemple avec SplObjectStorage::current
  • Example#4095 - Exemple avec SplObjectStorage::detach
  • Example#4096 - Exemple avec SplObjectStorage::getHash
  • Example#4097 - Exemple avec SplObjectStorage::getInfo
  • Example#4098 - Exemple avec SplObjectStorage::key
  • Example#4099 - Exemple avec SplObjectStorage::next
  • Example#4100 - Exemple avec SplObjectStorage::offsetExists
  • Example#4101 - Exemple avec SplObjectStorage::offsetGet
  • Example#4102 - Exemple avec SplObjectStorage::offsetSet
  • Example#4103 - Exemple avec SplObjectStorage::offsetUnset
  • Example#4104 - Exemple avec SplObjectStorage::removeAll
  • Example#4105 - Exemple avec SplObjectStorage::removeAllExcept
  • Example#4106 - Exemple avec SplObjectStorage::rewind
  • Example#4107 - Exemple avec SplObjectStorage::serialize
  • Example#4108 - Exemple avec SplObjectStorage::setInfo
  • Example#4109 - Exemple avec SplObjectStorage::unserialize
  • Example#4110 - Exemple avec SplObjectStorage::valid
  • Example#4111 - Exemple avec AppendIterator::append
  • Example#4112 - Itère un AppendIterator avec la structure foreach
  • Example#4113 - Itère un AppendIterator avec l'API AppendIterator
  • Example#4114 - Exemple avec AppendIterator::getInnerIterator
  • Example#4115 - Exemple avec AppendIterator.getIteratorIndex
  • Example#4116 - Exemple avec AppendIterator::key
  • Example#4117 - Exemple avec ArrayIterator::current
  • Example#4118 - Exemple avec ArrayIterator::key
  • Example#4119 - Exemple avec ArrayIterator::next
  • Example#4120 - Exemple avec ArrayIterator::rewind
  • Example#4121 - Exemple avec ArrayIterator::valid
  • Example#4122 - Exemple avec CachingIterator::getCache
  • Example#4123 - Arguments disponibles pour la fonction de rappel
  • Example#4124 - Exemples simples de fonction de rappel
  • Example#4125 - Exemple avec DirectoryIterator::__construct
  • Example#4126 - Exemple avec DirectoryIterator::current
  • Example#4127 - Exemple avec DirectoryIterator::getATime
  • Example#4128 - Exemple avec DirectoryIterator::getBasename
  • Example#4129 - Exemple avec DirectoryIterator::getCTime
  • Example#4130 - Exemple avec DirectoryIterator::getExtension
  • Example#4131 -
  • Example#4132 - Exemple avec DirectoryIterator::getFilename
  • Example#4133 - Exemple avec DirectoryIterator::getGroup
  • Example#4134 - Exemple avec sDirectoryIterator::getInode
  • Example#4135 - Exemple avec DirectoryIterator::getMTime
  • Example#4136 - Exemple avec DirectoryIterator::getOwner
  • Example#4137 - Exemple avec DirectoryIterator::getPath
  • Example#4138 - Exemple avec DirectoryIterator::getPathname
  • Example#4139 - Exemple avec DirectoryIterator::getPerms
  • Example#4140 - Exemple avec DirectoryIterator::getSize
  • Example#4141 - Exemple avec DirectoryIterator::getType
  • Example#4142 - Exemple avec DirectoryIterator::isDir
  • Example#4143 - Exemple avec DirectoryIterator::isDot
  • Example#4144 - Exemple avec DirectoryIterator::isExecutable
  • Example#4145 - Exemple avec DirectoryIterator::isFile
  • Example#4146 - Exemple avec DirectoryIterator::isLink
  • Example#4147 - Exemple avec DirectoryIterator::isReadable
  • Example#4148 - Exemple avec DirectoryIterator::isWritable
  • Example#4149 - Exemple avec DirectoryIterator::key
  • Example#4150 - Exemple avec DirectoryIterator::next
  • Example#4151 - Exemple avec DirectoryIterator::rewind
  • Example#4152 - Exemple avec DirectoryIterator::seek
  • Example#4153 - Exemple avec DirectoryIterator::__toString
  • Example#4154 - Exemple avec DirectoryIterator::valid
  • Example#4155 - Exemple avec FilesystemIterator::__construct
  • Example#4156 - Exemple avec FilesystemIterator::current
  • Example#4157 - Exemple avec FilesystemIterator::key
  • Example#4158 - Exemple avec FilesystemIterator::next
  • Example#4159 - Exemple avec FilesystemIterator::rewind
  • Example#4160 - Exemple avec FilesystemIterator::key
  • Example#4161 - Exemple avec FilterIterator::accept
  • Example#4162 - Exemple avec GlobIterator
  • Example#4163 - Exemple avec GlobIterator::count
  • Example#4164 - Exemple avec InfiniteIterator::__construct
  • Example#4165 - Exemple d'utilisation de LimitIterator
  • Example#4166 - Exemple LimitIterator::__construct
  • Example#4167 - Exemple LimitIterator::getPosition
  • Example#4168 - Itère un MultipleIterator
  • Example#4169 - Exemple avec NoRewindIterator::__construct
  • Example#4170 - Exemple avec NoRewindIterator::rewind
  • Example#4171 - Exemple avec RecursiveArrayIterator::getChildren
  • Example#4172 - Exemple avec RecursiveArrayIterator::hasChildren
  • Example#4173 - Arguments disponibles pour la fonction de rappel
  • Example#4174 - Exemple simple d'une fonction de rappel récursive
  • Example#4175 - Exemple avec RecursiveCallbackFilterIterator::hasChildren
  • Example#4176 - Exemple avec RecursiveDirectoryIterator
  • Example#4177 - Exemple getSubPath
  • Example#4178 - Exemple getSubPathname
  • Example#4179 - Exemple avec RecursiveFilterIterator
  • Example#4180 - Exemple avec RecursiveFilterIterator
  • Example#4181 - Parcours d'un RecursiveIteratorIterator
  • Example#4182 - Exemple avec RecursiveRegexIterator::__construct
  • Example#4183 - Exemple avec RecursiveRegexIterator::getChildren
  • Example#4184 - Exemple avec RecursiveRegexIterator::hasChildren
  • Example#4185 - Exemple avec RegexIterator::accept
  • Example#4186 - Exemple avec RegexIterator::__construct
  • Example#4187 - Exemple avec RegexIterator::getFlags
  • Example#4188 - Exemple avec RegexIterator::getMode
  • Example#4189 - Exemple avec RegexIterator::getPregFlags
  • Example#4190 - Exemple avec RegexIterator::setFlags
  • Example#4191 - Exemple avec RegexIterator::setMode
  • Example#4192 - Exemple avec RegexIterator::setPregFlags
  • Example#4193 - Exemple avec Countable::count
  • Example#4194 - Utilisation simple
  • Example#4195 - Exemple avec SeekableIterator::seek
  • Example#4196 - Exemple avec class_implements
  • Example#4197 - Exemple avec class_parents
  • Example#4198 - Exemples pour class_uses
  • Example#4199 - Exemple avec iterator_apply
  • Example#4200 - Exemple avec iterator_count
  • Example#4201 - Exemple avec iterator_count qui modifie la position
  • Example#4202 - Exemple avec iterator_count dans une boucle foreach
  • Example#4203 - Exemple avec iterator_to_array
  • Example#4204 - Exemple avec spl_autoload_extensions
  • Example#4205 - Exemple avec spl_autoload_register comme remplacement d'une fonction __autoload
  • Example#4206 - Exemple avec spl_autoload_register où la classe n'est pas chargée
  • Example#4207 - Exemple avec spl_classes
  • Example#4208 - Exemple avec spl_object_hash
  • Example#4209 - Un exemple de spl_object_id
  • Example#4210 - Exemple avec SplFileInfo::__construct
  • Example#4211 - Exemple avec SplFileInfo::getBasename
  • Example#4212 - Exemple avec SplFileInfo::getCTime
  • Example#4213 - Exemple avec SplFileInfo::getExtension
  • Example#4214 -
  • Example#4215 - Exemple avec SplFileInfo::getFilename
  • Example#4216 - Exemple avec SplFileInfo::getGroup
  • Example#4217 - Exemple avec SplFileInfo::getLinkTarget
  • Example#4218 - Exemple avec SplFileInfo::getOwner
  • Example#4219 - Exemple avec SplFileInfo::getPath
  • Example#4220 - Exemple avec SplFileInfo::getPathInfo
  • Example#4221 - Exemple avec SplFileInfo::getPathname
  • Example#4222 - Exemple avec SplFileInfo::getPerms
  • Example#4223 - Exemple avec SplFileInfo::getRealPath
  • Example#4224 - Exemple avec SplFileInfo::getType
  • Example#4225 - Exemple avec SplFileInfo::isDir
  • Example#4226 - Exemple avec SplFileInfo::isExecutable
  • Example#4227 - Exemple avec SplFileInfo::isFile
  • Example#4228 - Exemple avec SplFileInfo::isLink
  • Example#4229 - Exemple avec SplFileInfo::isReadable
  • Example#4230 - Exemple avec SplFileInfo::openFile
  • Example#4231 - Exemple avec SplFileInfo::setFileClass
  • Example#4232 - Exemple avec SplFileInfo::setFileClass
  • Example#4233 - Exemple avec SplFileInfo::__toString
  • Example#4234 - Exemple avec SplFileObject::__construct
  • Example#4235 - Exemple avec SplFileObject::current
  • Example#4236 - Exemple avec SplFileObject::eof
  • Example#4237 - Exemple avec SplFileObject::fflush
  • Example#4238 - Exemple avec SplFileObject::fgetc
  • Example#4239 - Exemple avec SplFileObject::fgetcsv
  • Example#4240 - Exemple avec SplFileObject::READ_CSV
  • Example#4241 - Exemple avec SplFileObject::fgets
  • Example#4242 - Exemple avec SplFileObject::fgetss
  • Example#4243 - Exemple avec SplFileObject::flock
  • Example#4244 - Exemple avec SplFileObject::fpassthru
  • Example#4245 - Exemple avec SplFileObject::fputcsv
  • Example#4246 - Exemple avec SplFileObject::fread
  • Example#4247 - Exemple avec SplFileObject::fscanf
  • Example#4248 - Exemple avec SplFileObject::fseek
  • Example#4249 - Exemple avec SplFileObject::fstat
  • Example#4250 - Exemple avec SplFileObject::ftell
  • Example#4251 - Exemple avec SplFileObject::ftruncate
  • Example#4252 - Exemple avec SplFileObject::fwrite
  • Example#4253 - Exemple avec SplFileObject::getCsvControl
  • Example#4254 - Exemple avec SplFileObject::getFlags
  • Example#4255 - Exemple avec SplFileObject::getMaxLineLen
  • Example#4256 - Exemple avec SplFileObject::key
  • Example#4257 - Exemple avec SplFileObject::key et SplFileObject::setMaxLineLen
  • Example#4258 - Exemple avec SplFileObject::next
  • Example#4259 - Exemple avec SplFileObject::rewind
  • Example#4260 - Exemple avec SplFileObject::seek
  • Example#4261 - Exemple avec SplFileObject::setCsvControl
  • Example#4262 - Exemple avec SplFileObject::setFlags
  • Example#4263 - Exemple avec SplFileObject::setMaxLineLen
  • Example#4264 - Exemple avec SplFileObject::valid
  • Example#4265 - Exemple avec SplTempFileObject
  • Example#4266 - Exemple avec ArrayObject::append
  • Example#4267 - Exemple avec ArrayObject::asort
  • Example#4268 - Exemple avec ArrayObject::__construct
  • Example#4269 - Exemple avec ArrayObject::count
  • Example#4270 - Exemple avec ArrayObject::exchangeArray
  • Example#4271 - Exemple avec ArrayObject::getArrayCopy
  • Example#4272 - Exemple avec ArrayObject::getFlags
  • Example#4273 - Exemple avec ArrayObject::getIterator
  • Example#4274 - Exemple avec ArrayObject::getIteratorClass
  • Example#4275 - Exemple avec ArrayObject::ksort
  • Example#4276 - Exemple avec ArrayObject::natcasesort
  • Example#4277 - Exemple avec ArrayObject::natsort
  • Example#4278 - Exemple avec ArrayObject::offsetExists
  • Example#4279 - Exemple avec ArrayObject::offsetGet
  • Example#4280 - Exemple avec ArrayObject::offsetSet
  • Example#4281 - Exemple avec ArrayObject::offsetUnset
  • Example#4282 - Exemple avec ArrayObject::serialize
  • Example#4283 - Exemple avec ArrayObject::setFlags
  • Example#4284 - Exemple avec ArrayObject::setIteratorClass
  • Example#4285 - Exemple avec ArrayObject::uasort
  • Example#4286 - Exemple avec ArrayObject::uksort
  • Example#4287 - Exemples avec file_get_contents
  • Example#4288 - Envoi d'une requête de type POST sur un serveur sécurisé
  • Example#4289 - Écrire des données dans un fichier compressé
  • Example#4290 - Un flux pour lire et écrire des variables globales
  • Example#4291 - Liste des fichiers d'une archive tar
  • Example#4292 - Exemple avec stream_bucket_prepend
  • Example#4293 - Exemple avec stream_context_create
  • Example#4294 - Exemple avec stream_context_get_default
  • Example#4295 - Exemple avec stream_context_get_options
  • Example#4296 - Exemple avec stream_context_get_params
  • Example#4297 - Exemple avec stream_context_set_default
  • Example#4298 - Exemple avec stream_copy_to_stream
  • Example#4299 - Contrôler l'application des filtres
  • Example#4300 - Filtre sur les lettres majuscules sur le flux foo-bar.txt
  • Example#4301 - Enregistrement d'une classe de filtre générique pour correspondre avec de multiples noms de filtres
  • Example#4302 - Refiltrage dynamique d'un flux
  • Example#4303 - Exemple avec stream_get_contents
  • Example#4304 - Exemple avec stream_get_filters
  • Example#4305 - Exemple avec stream_get_meta_data
  • Example#4306 - Exemple avec stream_get_transports
  • Example#4307 - Exemple avec stream_get_wrappers
  • Example#4308 - Vérification de l'existence d'un gestionnaire de flux
  • Example#4309 - Exemple avec stream_is_local
  • Example#4310 - Exemple avec stream_isatty
  • Example#4311 - Exemple avec stream_notification_callback
  • Example#4312 - Barre de progression simple pour un client de téléchargement en ligne de commande
  • Example#4313 - Exemple avec stream_resolve_include_path
  • Example#4314 - Exemple avec stream_select
  • Example#4315 - Exemple avec stream_set_timeout
  • Example#4316 - Exemple avec stream_set_write_buffer
  • Example#4317 - Exemple avec stream_socket_client
  • Example#4318 - Utilisation de connexions UDP
  • Example#4319 - Exemple avec stream_socket_enable_crypto
  • Example#4320 - Exemple avec stream_socket_pair
  • Example#4321 - Exemple avec stream_socket_recvfrom
  • Example#4322 - Exemple avec stream_socket_sendto
  • Example#4323 - Exemple avec stream_socket_server
  • Example#4324 - Utiliser un serveur de socket UDP
  • Example#4325 - Exemple avec stream_socket_shutdown
  • Example#4326 - Comment enregistrer un gestionnaire de flux
  • Example#4327 - Utilisation de base de Tidy
  • Example#4328 - Exemple avec tidy::getBody
  • Example#4329 - Exemple avec tidy::cleanrepair
  • Example#4330 - Exemple avec tidy::__construct
  • Example#4331 - Exemple avec tidy::diagnose
  • Example#4332 - Exemple avec tidy_get_error_buffer
  • Example#4333 - Exemple avec tidy::getConfig
  • Example#4334 - Exemple avec Tidy::getopt
  • Example#4335 - Affichage de toutes les options avec leur documentation et leur valeur par défaut
  • Example#4336 - Exemple avec tidy::getStatus
  • Example#4337 - Exemple avec tidy::head
  • Example#4338 - Exemple avec tidy::html
  • Example#4339 - Exemple avec tidy::parseFile
  • Example#4340 - Exemple avec tidy::parseString
  • Example#4341 - Exemple avec tidy::repairFile
  • Example#4342 - Exemple avec tidy::repairString
  • Example#4343 - Exemple avec tidy::root
  • Example#4344 - Exemple avec tidyNode::hasChildren
  • Example#4345 - Exemple avec tidyNode::hasChildren
  • Example#4346 - Exemple avec tidyNode::hasSiblings
  • Example#4347 - Extrait di code ASP depuis un document HTML mixte
  • Example#4348 - Extrait les commentais depuis un document HTML
  • Example#4349 - Extrait du code HTML depuis un document mixte
  • Example#4350 - Extrait du code JSTE depuis un document HTML
  • Example#4351 - Récupération de code PHP dans un document HTML
  • Example#4352 - Extrait du texte depuis un document HTML mixte
  • Example#4353 - Exemple avec ob_tidyhandler
  • Example#4354 - Exemple avec tidy_access_count
  • Example#4355 - Exemple avec tidy_config_count
  • Example#4356 - Exemple avec tidy_error_count
  • Example#4357 - Exemple avec tidy_get_output
  • Example#4358 - Exemple avec tidy_warning_count
  • Example#4359 - Supprime les commentaires avec le tokenizer
  • Example#4360 - PhpToken::getTokenName example
  • Example#4361 - PhpToken::is example
  • Example#4362 - Usage with array
  • Example#4363 - PhpToken::isIgnorable example
  • Example#4364 - PhpToken::__toString example
  • Example#4365 - PhpToken::tokenize example
  • Example#4366 - Extending PhpToken
  • Example#4367 - Exemple avec token_get_all
  • Example#4368 - Exemple d'utilisation incorrecte de la fonction token_get_all
  • Example#4369 - token_get_all dans une classe en utilisant un mot réservé
  • Example#4370 - Exemple avec token_name
  • Example#4371 - Exemple avec base64_decode
  • Example#4372 - Exemple avec base64_encode
  • Example#4373 - Exemple avec get_headers
  • Example#4374 - Exemple avec get_headers en utilisant HEAD
  • Example#4375 - Ce que la fonction get_meta_tags analyse
  • Example#4376 - Ce que la fonction get_meta_tags retourne
  • Example#4377 - Utilisation simple de http_build_query
  • Example#4378 - http_build_query avec tableau indexé
  • Example#4379 - http_build_query avec tableau complexe
  • Example#4380 - Utilisation de http_build_query avec un objet
  • Example#4381 - Exemple avec parse_url
  • Example#4382 - Exemple avec la fonction parse_url sans schéma
  • Example#4383 - Exemple avec rawurldecode
  • Example#4384 - Exemple avec rawurlencode
  • Example#4385 - Exemple avec rawurlencode
  • Example#4386 - Exemple avec urldecode
  • Example#4387 - Exemple avec urlencode
  • Example#4388 - Exemple avec urlencode et htmlentities
  • Example#4389 - Exécution d'un Javascript simple
  • Example#4390 - Exemples Yaml
  • Example#4391 - Exemple d'analyse de fonction de rappel
  • Example#4392 - Exemple d'émission des fonctions de rappel
  • Example#4393 - Exemple yaml_emit
  • Example#4394 - Exemple yaml_parse
  • Example#4395 - Une architecture classique d'une application
  • Example#4396 - Entry
  • Example#4397 - Règle de ré-écriture des requêtes
  • Example#4398 - Configuration de l'application
  • Example#4399 - Controlleur par défaut
  • Example#4400 - Template de rendu par défaut
  • Example#4401 - Exécution de l'application
  • Example#4402 - Exemple avec un tableau PHP
  • Example#4403 - Exemple avec un fichier ini
  • Example#4404 - Exemple avec A Bootstrap
  • Example#4405 - Exemple avec Yaf_Application::bootstrap
  • Example#4406 - Exemple avec Yaf_Application::clearLastError
  • Example#4407 - Un exemple de fichier de configuration au format ini
  • Example#4408 - Exemple avec Yaf_Application::__construct
  • Example#4409 - Exemple avec Yaf_Application::__construct
  • Example#4410 - Exemple avec Yaf_Application::environ
  • Example#4411 - Exemple avec Yaf_Application::execute
  • Example#4412 - Exemple avec Yaf_Application::getConfig
  • Example#4413 - Exemple avec Yaf_Application::getDispatcher
  • Example#4414 - Exemple avec Yaf_Application::getLastErrorMsg
  • Example#4415 - Exemple avec Yaf_Application::getLastErrorNo
  • Example#4416 - Exemple avec Yaf_Application::getModules
  • Example#4417 - Bootstrap example
  • Example#4418 - Exemple avec Yaf_Dispatcher::autoRender
  • Example#4419 - Exemple avec Yaf_Dispatcher::catchException
  • Example#4420 - Exemple avec Yaf_Dispatcher::registerPlugin
  • Example#4421 - Exemple avec Yaf_Dispatcher::setView
  • Example#4422 - Exemple avec Yaf_Dispatcher::setView
  • Example#4423 - Exemple avec Yaf_Dispatcher::throwexception
  • Example#4424 - Exemple avec Yaf_Dispatcher::throwexception
  • Example#4425 - Exemple avec Yaf_Config_Ini
  • Example#4426 - Définission d'une action dans un fichier séparé
  • Example#4427 - Dummy_action.php
  • Example#4428 - Exemple avec Yaf_Controller_Abstract::forward
  • Example#4429 - Exemple avec Yaf_Action_Abstract::execute
  • Example#4430 - Exemple avec Yaf_Action_Abstract::execute
  • Example#4431 - Exemple avec Yaf_View_Simple::assign
  • Example#4432 - Exemple avec template
  • Example#4433 - Exemple avec Yaf_View_Simple::assignRef
  • Example#4434 - Exemple avec template
  • Example#4435 - Exemple avec Yaf_View_Simple::clear
  • Example#4436 - Exemple avec Yaf_View_Simple::__constructor
  • Example#4437 - Exemple avec Yaf_View_Simple::__set
  • Example#4438 - Exemple de configuration
  • Example#4439 - Enregistrement de localnamespace
  • Example#4440 - Load class example
  • Example#4441 - Exemple de chargement de classe via des espaces de noms
  • Example#4442 - Exemple de chargement de classe MVC
  • Example#4443 - Distinctions d'une classe MVC
  • Example#4444 - Exemple de chargement MVC
  • Example#4445 - Exemple avec Yaf_Loader::registerNamespace
  • Example#4446 - Exemple avec Yaf_Loader::registerLocalNamespace
  • Example#4447 - Yaf_Loader::registerNamespaceexample
  • Example#4448 - Exemple d'un plugin
  • Example#4449 - Exemple avec Yaf_Plugin_Abstract::routerShutdown
  • Example#4450 - Exemple avec Yaf_Response_Abstract::appendBody
  • Example#4451 - Exemple avec Yaf_Response_Abstract::getBody
  • Example#4452 - Exemple avec Yaf_Response_Abstract::prependBody
  • Example#4453 - Exemple avec Yaf_Response_Abstract::response
  • Example#4454 - Exemple avec Yaf_Response_Abstract::setBody
  • Example#4455 - Exemple avec Yaf_Route_Map::assemble
  • Example#4456 - Exemple avec Yaf_Route_Map
  • Example#4457 - Exemple avec Yaf_Route_Map
  • Example#4458 - Exemple avec Yaf_Route_Map
  • Example#4459 - Exemple avec Yaf_Route_Regex::assemble
  • Example#4460 - Exemple avec Yaf_Route_Regex
  • Example#4461 - Exemple avec Yaf_Route_Regex (depuis la version 2.3.0)
  • Example#4462 - Exemple avec Yaf_Route_Regex et la capture du nom (depuis 2.3.0)
  • Example#4463 - Exemple avec Yaf_Route_Regex
  • Example#4464 - Exemple avec Yaf_Route_Rewrite::assemble
  • Example#4465 - Exemple avec Yaf_Route_Rewrite
  • Example#4466 - Exemple avec Yaf_Route_Rewrite
  • Example#4467 - Exemple avec Yaf_Route_Rewrite (depuis 2.3.0)
  • Example#4468 - Règle de ré-écriture pour Apache
  • Example#4469 - Règle de ré-écriture pour Apache
  • Example#4470 - Règle de ré-écriture pour Lighttpd
  • Example#4471 - Règle de ré-écriture pour Nginx
  • Example#4472 - Exemple avec Yaf_Route_Static (route par défaut)
  • Example#4473 - Exemple avec application.ini
  • Example#4474 - Exemple avec Yaf_Dispatcher::autoConfig
  • Example#4475 - Exemple avec Yaf_Dispatcher::autoRender
  • Example#4476 - Enregistre quelques routes dans le Bootstrap
  • Example#4477 - plugin Dummy.php (sous le dossier application.directory/plugins)
  • Example#4478 - Exemple avec Yaf_Route_Simple::assemble
  • Example#4479 - Exemple avec Yaf_Route_Simple::route
  • Example#4480 - Exemple avec Yaf_Route_Simple::route
  • Example#4481 - Exemple avec Yaf_Route_Static::assemble
  • Example#4482 - Exemple avec Yaf_Route_Static::route
  • Example#4483 - Exemple avec Yaf_Route_Supervar::assemble
  • Example#4484 - Exemple avec Yaf_Route_Supervar
  • Example#4485 - Exemple INI
  • Example#4486 - Exemple avec les sections INI
  • Example#4487 - Exemple INI
  • Example#4488 - Exemple avec Taint
  • Example#4489 - Vector
  • Example#4490 - Map
  • Example#4491 - Ds\Collection::clear example
  • Example#4492 - Ds\Collection::copy exemple
  • Example#4493 - Ds\Collection::isEmpty exemple
  • Example#4494 - Ds\Collection::toArray exemple
  • Example#4495 - Ds\Hashable::hash example
  • Example#4496 - Ds\Sequence::allocate example
  • Example#4497 - Ds\Sequence::apply example
  • Example#4498 - Ds\Sequence::capacity example
  • Example#4499 - Ds\Sequence::contains example
  • Example#4500 - Ds\Sequence::filter example using callback function
  • Example#4501 - Ds\Sequence::filter example without a callback function
  • Example#4502 - Ds\Sequence::find example
  • Example#4503 - Ds\Sequence::first example
  • Example#4504 - Ds\Sequence::get example
  • Example#4505 - Ds\Sequence::get example using array syntax
  • Example#4506 - Ds\Sequence::insert example
  • Example#4507 - Ds\Sequence::join example using a separator string
  • Example#4508 - Ds\Sequence::join example without a separator string
  • Example#4509 - Ds\Sequence::last example
  • Example#4510 - Ds\Sequence::map example
  • Example#4511 - Ds\Sequence::merge example
  • Example#4512 - Ds\Sequence::pop example
  • Example#4513 - Ds\Sequence::push example
  • Example#4514 - Ds\Sequence::reduce with initial value example
  • Example#4515 - Ds\Sequence::reduce without an initial value example
  • Example#4516 - Ds\Sequence::remove example
  • Example#4517 - Ds\Sequence::reverse example
  • Example#4518 - Ds\Sequence::reversed example
  • Example#4519 - Ds\Sequence::rotate example
  • Example#4520 - Ds\Sequence::set example
  • Example#4521 - Ds\Sequence::set example using array syntax
  • Example#4522 - Ds\Sequence::shift example
  • Example#4523 - Ds\Sequence::slice example
  • Example#4524 - Ds\Sequence::sort example
  • Example#4525 - Ds\Sequence::sort example using a comparator
  • Example#4526 - Ds\Sequence::sorted example
  • Example#4527 - Ds\Sequence::sorted example using a comparator
  • Example#4528 - Ds\Sequence::sum integer example
  • Example#4529 - Ds\Sequence::sum float example
  • Example#4530 - Ds\Sequence::unshift example
  • Example#4531 - Ds\Vector::allocate example
  • Example#4532 - Ds\Vector::apply example
  • Example#4533 - Ds\Vector::capacity example
  • Example#4534 - Ds\Vector::clear example
  • Example#4535 - Ds\Vector::__construct example
  • Example#4536 - Ds\Vector::contains example
  • Example#4537 - Ds\Vector::copy example
  • Example#4538 - Ds\Vector::filter example using callback function
  • Example#4539 - Ds\Vector::filter example without a callback function
  • Example#4540 - Ds\Vector::find example
  • Example#4541 - Ds\Vector::first example
  • Example#4542 - Ds\Vector::get example
  • Example#4543 - Ds\Vector::get example using array syntax
  • Example#4544 - Ds\Vector::insert example
  • Example#4545 - Ds\Vector::isEmpty example
  • Example#4546 - Ds\Vector::join example using a separator string
  • Example#4547 - Ds\Vector::join example without a separator string
  • Example#4548 - Ds\Vector::last example
  • Example#4549 - Ds\Vector::map example
  • Example#4550 - Ds\Vector::merge example
  • Example#4551 - Ds\Vector::pop example
  • Example#4552 - Ds\Vector::push example
  • Example#4553 - Ds\Vector::reduce with initial value example
  • Example#4554 - Ds\Vector::reduce without an initial value example
  • Example#4555 - Ds\Vector::remove example
  • Example#4556 - Ds\Vector::reverse example
  • Example#4557 - Ds\Vector::reversed example
  • Example#4558 - Ds\Vector::rotate example
  • Example#4559 - Ds\Vector::set example
  • Example#4560 - Ds\Vector::set example using array syntax
  • Example#4561 - Ds\Vector::shift example
  • Example#4562 - Ds\Vector::slice example
  • Example#4563 - Ds\Vector::sort example
  • Example#4564 - Ds\Vector::sort example using a comparator
  • Example#4565 - Ds\Vector::sorted example
  • Example#4566 - Ds\Vector::sorted example using a comparator
  • Example#4567 - Ds\Vector::sum integer example
  • Example#4568 - Ds\Vector::sum float example
  • Example#4569 - Ds\Vector::toArray example
  • Example#4570 - Ds\Vector::unshift example
  • Example#4571 - Ds\Deque::allocate example
  • Example#4572 - Ds\Deque::apply example
  • Example#4573 - Ds\Deque::capacity example
  • Example#4574 - Ds\Deque::clear example
  • Example#4575 - Ds\Deque::__construct example
  • Example#4576 - Ds\Deque::contains example
  • Example#4577 - Ds\Deque::copy example
  • Example#4578 - Ds\Deque::filter example using callback function
  • Example#4579 - Ds\Deque::filter example without a callback function
  • Example#4580 - Ds\Deque::find example
  • Example#4581 - Ds\Deque::first example
  • Example#4582 - Ds\Deque::get example
  • Example#4583 - Ds\Deque::get example using array syntax
  • Example#4584 - Ds\Deque::insert example
  • Example#4585 - Ds\Deque::isEmpty example
  • Example#4586 - Ds\Deque::join example using a separator string
  • Example#4587 - Ds\Deque::join example without a separator string
  • Example#4588 - Ds\Deque::last example
  • Example#4589 - Ds\Deque::map example
  • Example#4590 - Ds\Deque::merge example
  • Example#4591 - Ds\Deque::pop example
  • Example#4592 - Ds\Deque::push example
  • Example#4593 - Ds\Deque::reduce with initial value example
  • Example#4594 - Ds\Deque::reduce without an initial value example
  • Example#4595 - Ds\Deque::remove example
  • Example#4596 - Ds\Deque::reverse example
  • Example#4597 - Ds\Deque::reversed example
  • Example#4598 - Ds\Deque::rotate example
  • Example#4599 - Ds\Deque::set example
  • Example#4600 - Ds\Deque::set example using array syntax
  • Example#4601 - Ds\Deque::shift example
  • Example#4602 - Ds\Deque::slice example
  • Example#4603 - Ds\Deque::sort example
  • Example#4604 - Ds\Deque::sort example using a comparator
  • Example#4605 - Ds\Deque::sorted example
  • Example#4606 - Ds\Deque::sorted example using a comparator
  • Example#4607 - Ds\Deque::sum integer example
  • Example#4608 - Ds\Deque::sum float example
  • Example#4609 - Ds\Deque::toArray example
  • Example#4610 - Ds\Deque::unshift example
  • Example#4611 - Ds\Map::allocate example
  • Example#4612 - Ds\Map::apply example
  • Example#4613 - Ds\Map::capacity example
  • Example#4614 - Ds\Map::clear example
  • Example#4615 - Ds\Map::__construct example
  • Example#4616 - Ds\Map::copy example
  • Example#4617 - Ds\Map::diff example
  • Example#4618 - Ds\Map::filter example using callback function
  • Example#4619 - Ds\Map::filter example without a callback function
  • Example#4620 - Ds\Map::first example
  • Example#4621 - Ds\Map::get example
  • Example#4622 - Ds\Map::get example using array syntax
  • Example#4623 - Ds\Map::hasKey example
  • Example#4624 - Ds\Map::hasValue example
  • Example#4625 - Ds\Map::intersect example
  • Example#4626 - Ds\Map::isEmpty example
  • Example#4627 - Ds\Map::keys example
  • Example#4628 - Ds\Map::ksort example
  • Example#4629 - Ds\Map::ksort example using a comparator
  • Example#4630 - Ds\Map::ksorted example
  • Example#4631 - Ds\Map::ksorted example using a comparator
  • Example#4632 - Ds\Map::last example
  • Example#4633 - Ds\Map::map example
  • Example#4634 - Ds\Map::merge example
  • Example#4635 - Ds\Map::pairs example
  • Example#4636 - Ds\Map::put example
  • Example#4637 - Ds\Map::put example using objects as keys
  • Example#4638 - Ds\Map::putAll example
  • Example#4639 - Ds\Map::reduce with initial value example
  • Example#4640 - Ds\Map::reduce without an initial value example
  • Example#4641 - Ds\Map::remove example
  • Example#4642 - Ds\Map::reverse example
  • Example#4643 - Ds\Map::reversed example
  • Example#4644 - Ds\Map::skip example
  • Example#4645 - Ds\Map::slice example
  • Example#4646 - Ds\Map::sort example
  • Example#4647 - Ds\Map::sort example using a comparator
  • Example#4648 - Ds\Map::sort example
  • Example#4649 - Ds\Map::sort example using a comparator
  • Example#4650 - Ds\Map::sum integer example
  • Example#4651 - Ds\Map::sum float example
  • Example#4652 - Ds\Map::toArray example
  • Example#4653 - Ds\Map::union example
  • Example#4654 - Ds\Map::values example
  • Example#4655 - Ds\Map::xor example
  • Example#4656 - Ds\Pair::clear example
  • Example#4657 - Ds\Pair::copy example
  • Example#4658 - Ds\Pair::isEmpty example
  • Example#4659 - Ds\Pair::toArray example
  • Example#4660 - Ds\Set::add example using integers
  • Example#4661 - Ds\Set::add example using objects
  • Example#4662 - Ds\Set::allocate example
  • Example#4663 - Ds\Set::capacity example
  • Example#4664 - Ds\Set::clear example
  • Example#4665 - Ds\Set::__construct example
  • Example#4666 - Ds\Set::contains example
  • Example#4667 - Ds\Set::copy example
  • Example#4668 - Ds\Set::diff example
  • Example#4669 - Ds\Set::filter example using callback function
  • Example#4670 - Ds\Set::filter example without a callback function
  • Example#4671 - Ds\Set::first example
  • Example#4672 - Ds\Set::get example
  • Example#4673 - Ds\Set::get example using array syntax
  • Example#4674 - Ds\Set::intersect example
  • Example#4675 - Ds\Set::isEmpty example
  • Example#4676 - Ds\Set::join example using a separator string
  • Example#4677 - Ds\Set::join example without a separator string
  • Example#4678 - Ds\Set::last example
  • Example#4679 - Ds\Set::merge example
  • Example#4680 - Ds\Set::reduce with initial value example
  • Example#4681 - Ds\Set::reduce without an initial value example
  • Example#4682 - Ds\Set::remove example
  • Example#4683 - Ds\Set::reverse example
  • Example#4684 - Ds\Set::reversed example
  • Example#4685 - Ds\Set::slice example
  • Example#4686 - Ds\Set::sort example
  • Example#4687 - Ds\Set::sort example using a comparator
  • Example#4688 - Ds\Set::sorted example
  • Example#4689 - Ds\Set::sorted example using a comparator
  • Example#4690 - Ds\Set::sum integer example
  • Example#4691 - Ds\Set::sum float example
  • Example#4692 - Ds\Set::toArray example
  • Example#4693 - Ds\Set::union example
  • Example#4694 - Ds\Set::xor example
  • Example#4695 - Ds\Stack::clear example
  • Example#4696 - Ds\Stack::__construct example
  • Example#4697 - Ds\Stack::copy example
  • Example#4698 - Ds\Stack::isEmpty example
  • Example#4699 - Ds\Stack::peek example
  • Example#4700 - Ds\Stack::pop example
  • Example#4701 - Ds\Stack::push example
  • Example#4702 - Ds\Stack::toArray example
  • Example#4703 - Ds\Queue::allocate example
  • Example#4704 - Ds\Queue::capacity example
  • Example#4705 - Ds\Queue::clear example
  • Example#4706 - Ds\Queue::__construct example
  • Example#4707 - Ds\Queue::copy example
  • Example#4708 - Ds\Queue::isEmpty example
  • Example#4709 - Ds\Queue::peek example
  • Example#4710 - Ds\Queue::pop example
  • Example#4711 - Ds\Queue::push example
  • Example#4712 - Ds\Queue::toArray example
  • Example#4713 - Ds\PriorityQueue::allocate example
  • Example#4714 - Ds\PriorityQueue::capacity example
  • Example#4715 - Ds\PriorityQueue::clear example
  • Example#4716 - Ds\PriorityQueue::__construct example
  • Example#4717 - Ds\PriorityQueue::copy example
  • Example#4718 - Ds\PriorityQueue::isEmpty example
  • Example#4719 - Ds\PriorityQueue::peek example
  • Example#4720 - Ds\PriorityQueue::pop example
  • Example#4721 - Ds\PriorityQueue::push example
  • Example#4722 - Ds\PriorityQueue::toArray example
  • Example#4723 - Utilisation du module cURL pour récupérer la page d'accueil de example.com
  • Example#4724 - Initialise une session cURL et récupère une page web
  • Example#4725 - Copie d'une ressource cURL
  • Example#4726 - Exemple avec curl_errno
  • Example#4727 - Exemple avec curl_error
  • Example#4728 - Exemple avec curl_escape
  • Example#4729 - Récupère le contenu d'une page web
  • Example#4730 - Exemple avec curl_getinfo
  • Example#4731 - Exemple de curl_getinfo avec le paramètre option
  • Example#4732 - Initialiser une session cURL et récupérer une page web
  • Example#4733 - Exemple avec curl_multi_add_handle
  • Example#4734 - Exemple avec curl_multi_close
  • Example#4735 - Exemple avec curl_multi_exec
  • Example#4736 - Exemple avec curl_multi_info_read
  • Example#4737 - Exemple avec curl_multi_init
  • Example#4738 - Exemple avec curl_multi_strerror
  • Example#4739 - Exemple avec curl_reset
  • Example#4740 - Initialisation d'une nouvelle session cURL et récupération d'une page web
  • Example#4741 - Notre propre implémentation de la fonction curl_setopt_array
  • Example#4742 - Initialisation d'une nouvelle session CURL et recherche d'une page Web
  • Example#4743 - Exempe avec curl_share_setopt
  • Example#4744 - Exemple avec curl_share_init
  • Example#4745 - Exemple avec curl_share_setopt
  • Example#4746 - Exemple avec curl_errno
  • Example#4747 - Exemple avec curl_escape
  • Example#4748 - Exemple avec curl_version
  • Example#4749 - Exemple avec CURLFile::__construct
  • Example#4750 - Exemple de téléversement de plusieurs fichiers avec CURLFile::__construct
  • Example#4751 - Client HTTP simple
  • Example#4752 - Client HTTP en utilisant une résolution DNS asynchrone
  • Example#4753 - Serveur d'affichage
  • Example#4754 - Serveur d'affichage SSL
  • Example#4755 - Gestionnaire de signal
  • Example#4756 - Utilisation d'une boucle libevent pour réaliser les requêtes de l'extension `eio'
  • Example#4757 - Divers
  • Example#4758 - Serveur HTTP simple
  • Example#4759 - Serveur HTTPS simple
  • Example#4760 - Connexion OpenSSL
  • Example#4761 - Exemple avec EventHttpConnection::makeRequest
  • Example#4762 - Ecoute d'une connexion en se basant sur un socket de domaine Unix
  • Example#4763 - Exemple de serveur SMTP
  • Example#4764 - Gestion d'un signal SIGTERM
  • Example#4765 - Exemple avec Event::addSignal
  • Example#4766 - Exemple avec Event::addTimer
  • Example#4767 - Exemple avec EventBase::getFeatures
  • Example#4768 - Exemple avec EventBase::getMethod
  • Example#4769 - Exemple avec EventBuffer::search
  • Example#4770 - Exemple avec EventBufferEvent::connect
  • Example#4771 - Connexion à un socket UNIX, lecture de la réponse depuis le serveur, et affichage dans une console
  • Example#4772 - Exemple avec EventBufferEvent::connectHost
  • Example#4773 - Fonction de rappel pour un événement de lecture sur le tampon
  • Example#4774 - Exemple avec EventBufferEvent::getOutput
  • Example#4775 - Exemple avec EventBufferEvent::sslError
  • Example#4776 - Exemple de serveur SMTP
  • Example#4777 - Exemple avec EventConfig::avoidMethod
  • Example#4778 - Exemple avec EventConfig::__construct
  • Example#4779 - Exemple avec EventConfig::requireFeatures
  • Example#4780 - Exemple avec EventHttp::accept
  • Example#4781 - Exemple avec EventHttp::addServerAlias
  • Example#4782 - Exemple avec EventHttp::bind
  • Example#4783 - Serveur HTTP simple
  • Example#4784 - Exemple avec EventHttp::setCallback
  • Example#4785 - Exemple avec EventHttp::setDefaultCallback
  • Example#4786 - Exemple avec EventHttpConnection::makeRequest
  • Example#4787 - Exemple avec EventHttpConnection::setCloseCallback
  • Example#4788 - Exemple avec EventHttpRequest::__construct
  • Example#4789 - Exemple avec EventHttpRequest::sendError
  • Example#4790 - Exemple avec EventListener::__construct
  • Example#4791 - Exemple avec EventSslContext::__construct
  • Example#4792 - Exemple avec FTP
  • Example#4793 - Exemple avec ftp_alloc
  • Example#4794 - Exemple avec ftp_cdup
  • Example#4795 - Exemple avec ftp_chdir
  • Example#4796 - Exemple avec ftp_chmod
  • Example#4797 - Exemple avec ftp_close
  • Example#4798 - Exemple avec ftp_connect
  • Example#4799 - Exemple avec ftp_delete
  • Example#4800 - Exemple avec ftp_exec
  • Example#4801 - Exemple avec ftp_fget
  • Example#4802 - Exemple avec ftp_fput
  • Example#4803 - Exemple avec ftp_get_option
  • Example#4804 - Exemple avec ftp_get
  • Example#4805 - Exemple avec ftp_login
  • Example#4806 - Exemple avec ftp_mdtm
  • Example#4807 - Exemple avec ftp_mkdir
  • Example#4808 - Exemple avec ftp_mlsd
  • Example#4809 - Exemple avec ftp_nb_continue
  • Example#4810 - Exemple avec ftp_nb_fget
  • Example#4811 - Exemple avec ftp_nb_fput
  • Example#4812 - Exemple avec ftp_nb_get
  • Example#4813 - Reprise d'un téléchargement avec ftp_nb_get
  • Example#4814 - Reprise d'un téléchargement à la position 100 dans un nouveau fichier avec ftp_nb_get
  • Example#4815 - Exemple avec ftp_nb_put
  • Example#4816 - Reprise d'un chargement avec ftp_nb_put
  • Example#4817 - Exemple avec ftp_nlist
  • Example#4818 - Exemple avec ftp_pasv
  • Example#4819 - Exemple avec ftp_put
  • Example#4820 - Exemple avec ftp_pwd
  • Example#4821 - Utilisation de ftp_raw pour s'identifier manuellement sur un serveur FTP
  • Example#4822 - Exemple avec ftp_rawlist
  • Example#4823 - Exemple avec ftp_rename
  • Example#4824 - Exemple avec ftp_rmdir
  • Example#4825 - Exemple avec ftp_set_option
  • Example#4826 - Envoi d'une commande SITE à un serveur FTP
  • Example#4827 - Exemple avec ftp_size
  • Example#4828 - Exemple avec ftp_ssl_connect
  • Example#4829 - Exemple avec ftp_systype
  • Example#4830 - Client et agent Gearman simple
  • Example#4831 - Client et agent Gearman simple, en arrière-plan
  • Example#4832 - Client et agent Gearman simple, avec la soumission de tâches
  • Example#4833 - Ajout de deux serveurs
  • Example#4834 - Ajout de deux serveurs
  • Example#4835 - Ajout de 2 tâches
  • Example#4836 - Ajout de 2 tâches en passant le contexte de l'application
  • Example#4837 - 2 tâches dont une en arrière-plan
  • Example#4838 - Une tâche de forte priorité en même temps que deux tâches normales
  • Example#4839 - Une tâche de faible priorité en même temps que deux tâches normales
  • Example#4840 - Surveiller l'accomplissement de plusieurs tâches de fond
  • Example#4841 - Soumission d'une seule tâche avec un retour immédiat
  • Example#4842 - Soumission d'un travail et récupération incrémentale du statut
  • Example#4843 - Soumet et surveille un travail en arrière-plan
  • Example#4844 - Soumission d'une tâche avec un retour immédiat
  • Example#4845 - Soumission d'une tâche et récupération incrémentale du statut
  • Example#4846 - Récupère le statut d'un travail dont l'exécution prend du temps
  • Example#4847 - Surveille le statut d'un travail en arrière-plan mettant du temps à s'exécuter
  • Example#4848 - Agent simple qui utilise des données de contexte de l'application
  • Example#4849 - Ajout de serveurs Gearman
  • Example#4850 - Ajout de 2 serveurs de travaux
  • Example#4851 - Exemple avec GearmanWorker::setId
  • Example#4852 - Un agent simple qui attend 5 secondes
  • Example#4853 - Exécution d'un agent en mode non bloquant
  • Example#4854 - Exemple avec GearmanWorker::work
  • Example#4855 - Testing support for paged result control
  • Example#4856 - Recherche avec LDAP
  • Example#4857 - Lier avec des information ppolicy
  • Example#4858 - Modifier la description uniquement si elle n'est pas vide
  • Example#4859 - Lire des valeurs avant leurs suppresion
  • Example#4860 - Supprimer une référence
  • Example#4861 - Utiliser la pagination pour une recherche
  • Example#4862 - Exemple complet avec identification LDAP
  • Example#4863 - Authentification avec LDAP
  • Example#4864 - Connexion anonyme à un serveur LDAP
  • Example#4865 - Exemple complet de vérification de mot de passe avec lDAP
  • Example#4866 - Exemple de connexion à un serveur LDAP
  • Example#4867 - Exemple de connexion à un serveur LDAP SSL
  • Example#4868 - Pagination LDAP
  • Example#4869 - Pagination LDAP
  • Example#4870 - Exemple avec ldap-count-entries
  • Example#4871 - Énumérer tous les messages d'erreur LDAP
  • Example#4872 - Générer et intercepter une erreur
  • Example#4873 - Chercher une addresse email
  • Example#4874 - PASSWD extended operation
  • Example#4875 - Whoami extended operation
  • Example#4876 - Affiche la liste des attributs d'une entrée
  • Example#4877 - Vérification de la version du protocole
  • Example#4878 - Liste toutes les valeurs de l'attribut "mail" d'une entrée
  • Example#4879 - Produit une liste de tous les services d'une société
  • Example#4880 - Ajout d'un numéro de téléphone à un contact
  • Example#4881 - Renomme un utilisateur
  • Example#4882 - Ajoute deux adresses emails à un utilisateur
  • Example#4883 - Modifie le mot de passe d'un utilisateur
  • Example#4884 - Modifie le mot de passe d'un utilisateur (Active Directory)
  • Example#4885 - Exemple avec ldap_parse_result
  • Example#4886 - Recherche LDAP
  • Example#4887 - Modification de la version du protocole
  • Example#4888 - Modification des contrôles du serveur
  • Example#4889 - Tri LDAP
  • Example#4890 - Exemple avec l'extension Memcache
  • Example#4891 - Utilisation de memcache comme gestionnaire de session
  • Example#4892 - Exemple avec Memcache::add
  • Example#4893 - Exemple avec Memcache::addServer
  • Example#4894 - Exemple avec Memcache::close
  • Example#4895 - Exemple avec Memcache::connect
  • Example#4896 - Exemple avec Memcache::decrement
  • Example#4897 - Exemple avec Memcache::delete
  • Example#4898 - Exemple avec Memcache::flush
  • Example#4899 - Exemple avec Memcache::get
  • Example#4900 - Exemple avec Memcache::getExtendedStats
  • Example#4901 - Exemple avec Memcache::getServerStatus
  • Example#4902 - Exemple avec Memcache::getVersion
  • Example#4903 - Exemple avec Memcache::increment
  • Example#4904 - Exemple avec Memcache::pconnect
  • Example#4905 - Exemple avec Memcache::replace
  • Example#4906 - Exemple avec Memcache::set
  • Example#4907 - Exemple avec Memcache::set
  • Example#4908 - Exemple avec Memcache::setCompressThreshold
  • Example#4909 - Exemple avec Memcache::setServerParams
  • Example#4910 - Exemple de fonction de rappel de résultats
  • Example#4911 - Fonctions de rappel sur clé absente
  • Example#4912 - Exemple avec Memcached::addServer
  • Example#4913 - Exemple avec Memcached::addServers
  • Example#4914 - Exemple avec Memcached::append
  • Example#4915 - Exemple avec Memcached::cas
  • Example#4916 - Création d'un objet Memcached
  • Example#4917 - Exemple avec Memcached::decrement
  • Example#4918 - Exemple avec Memcached::delete
  • Example#4919 - Exemple avec Memcached::fetch
  • Example#4920 - Exemple avec Memcached::fetchAll
  • Example#4921 - Exemple avec Memcached::flush
  • Example#4922 - Exemple avec Memcached::get 1
  • Example#4923 - Exemple avec Memcached::get 2
  • Example#4924 - Exemple avec Memcached::getDelayed
  • Example#4925 - Exemple de Memcached::getMulti pour Memcached v3
  • Example#4926 - Exemple de Memcached::getMulti pour Memcached v1 et v2
  • Example#4927 - Exemple de Memcached::GET_PRESERVE_ORDER pour Memcached v3
  • Example#4928 - Exemple de Memcached::GET_PRESERVE_ORDER pour Memcached v1 et v2
  • Example#4929 - Lecture des options Memcached
  • Example#4930 - Exemple avec Memcached::getResultCode
  • Example#4931 - Exemple avec Memcached::getResultMessage
  • Example#4932 - Exemple avec Memcached::getServerByKey
  • Example#4933 - Exemple avec Memcached::getResultCode
  • Example#4934 - Exemple avec Memcached::getStats
  • Example#4935 - Exemple avec Memcached::getVersion
  • Example#4936 - Exemple avec Memcached::getResultCode
  • Example#4937 - Exemple avec Memcached::prepend
  • Example#4938 - Exemple avec Memcached::set
  • Example#4939 - Exemple avec Memcached::setByKey
  • Example#4940 - Exemple avec Memcached::setMulti
  • Example#4941 - Configuration d'une option Memcached
  • Example#4942 - Définit des options Memcache
  • Example#4943 - Exemple avec mqseries_back
  • Example#4944 - Exemple avec mqseries_begin
  • Example#4945 - Exemple avec mqseries_close
  • Example#4946 - Exemple avec mqseries_cmit
  • Example#4947 - Exemple avec mqseries_conn
  • Example#4948 - Exemple avec mqseries_connx
  • Example#4949 - Exemple avec mqseries_connx en utilisant une connexion SSL et une URL OCSP Responder
  • Example#4950 - Exemple avec mqseries_disc
  • Example#4951 - Exemple avec mqseries_get
  • Example#4952 - Exemple avec mqseries_inq
  • Example#4953 - Exemple avec mqseries_open
  • Example#4954 - Exemple avec mqseries_put
  • Example#4955 - Exemple avec mqseries_strerror
  • Example#4956 - Exemple avec dns_get_record
  • Example#4957 - Exemple avec dns_get_record et DNS_ANY
  • Example#4958 - Exemple avec fsockopen
  • Example#4959 - Utilisation d'une connexion UDP
  • Example#4960 - Exemple avec gethostbyaddr
  • Example#4961 - Exemple avec gethostbyname
  • Example#4962 - Exemple avec gethostbynamel
  • Example#4963 - Exemple avec gethostname
  • Example#4964 - Exemple avec getprotobyname
  • Example#4965 - Exemple avec getservbyname
  • Example#4966 - Exemple avec header_register_callback
  • Example#4967 - Supprimer un en-tête HTTP avec header_remove
  • Example#4968 - Supprimer tous les en-têtes HTTP avec header_remove
  • Example#4969 - Boîte de téléchargement
  • Example#4970 - Directives concernant la mise en cache
  • Example#4971 - Exemple avec headers_list
  • Example#4972 - Exemple avec headers_sent
  • Example#4973 - Utiliser http_response_code dans un environnement de serveur Web
  • Example#4974 - Utiliser http_response_code dans un environnement CLI
  • Example#4975 - Exemple avec inet_ntop
  • Example#4976 - Exemple avec inet_pton
  • Example#4977 - Exemple avec ip2long
  • Example#4978 - Affichage d'une adresse IP
  • Example#4979 - Exemple d'envoi d'un cookie avec setcookie
  • Example#4980 - Exemple d'effacement d'un cookie avec setcookie
  • Example#4981 - setcookie et les tableaux
  • Example#4982 - Exemple avec syslog
  • Example#4983 - Utilisation procédurale de rrd
  • Example#4984 - Utilisation orientée objet de rrd
  • Example#4985 - Exemple avec RRDGraph::setOptions
  • Example#4986 - Défini plusieurs options de couleur
  • Example#4987 - Exemple avec RRDUpdater::update
  • Example#4988 - Fetch instrumented calls
  • Example#4989 - Fetch the list of functions scoutapm will instrument
  • Example#4990 - Exemple avec snmp_get_quick_print
  • Example#4991 - Exemple avec snmp_get_valueretrieval
  • Example#4992 - Exemple avec snmp_read_mib
  • Example#4993 - Exemple avec snmp_set_enum_print
  • Example#4994 - Exemple avec snmprealwalk
  • Example#4995 - Exemple avec snmp_set_quick_print
  • Example#4996 - Exemple avec snmp_set_valueretrieval
  • Example#4997 - Exemple avec snmp2_get
  • Example#4998 - Exemple avec snmp2_get_next
  • Example#4999 - Exemple avec snmp2_real_walk
  • Example#5000 - Exemple avec snmp2_set
  • Example#5001 - Exemple avec snmp2_set pour configurer l'identifiant de l'objet SNMP BITS
  • Example#5002 - Exemple avec snmp2_walk
  • Example#5003 - Exemple avec snmp3_get
  • Example#5004 - Exemple avec snmp3_getnext
  • Example#5005 - Exemple avec snmp3_real_walk
  • Example#5006 - Exemple avec snmp3_set
  • Example#5007 - Exemple avec snmp3_set pour configurer l'identifiant de l'objet SNMP BITS
  • Example#5008 - Exemple avec snmp3_walk
  • Example#5009 - Exemple avec snmpget
  • Example#5010 - Exemple avec snmpgetnext
  • Example#5011 - Exemple avec snmprealwalk
  • Example#5012 - Exemple avec snmpset
  • Example#5013 - Exemple avec snmpset pour configurer l'identifiant de l'objet SNMP BITS
  • Example#5014 - Exemple avec snmpwalk
  • Example#5015 - Exemple avec snmpwalkoid
  • Example#5016 - Exemple avec SNMP::close
  • Example#5017 - Récupération de sysLocation
  • Example#5018 - Un seul objet SNMP
  • Example#5019 - Plusieurs objets SNMP
  • Example#5020 - SNMP::getErrno example
  • Example#5021 - Exemple avec SNMP::getError
  • Example#5022 - Un seul objet SNMP
  • Example#5023 - Plusieurs objets SNMP
  • Example#5024 - Définit un seul identifiant d'objet SNMP
  • Example#5025 - Définit plusieurs valeurs en utilisant un seul appel à la méthode SNMP::set call
  • Example#5026 - Exemple avec SNMP::set pour configurer l'identifiant d'objet SNMP BITS
  • Example#5027 - Exemple avec SNMP::setSecurity
  • Example#5028 - Exemple avec SNMP::walk
  • Example#5029 - Exemple avec la paramètre suffixAsKey
  • Example#5030 - Exemple de socket : serveur TCP/IP simple
  • Example#5031 - Exemple avec les sockets : client TCP/IP simple
  • Example#5032 - Utilisation de socket_bind pour définir l'adresse de la source
  • Example#5033 - Exemple avec socket_create_pair
  • Example#5034 - Exemple IPC avec socket_create_pair
  • Example#5035 - Exemple avec socket_get_option
  • Example#5036 - Exemple avec socket_import_stream
  • Example#5037 - Exemple avec socket_last_error
  • Example#5038 - Exemples avec socket_recv
  • Example#5039 - Exemple avec socket_recvfrom
  • Example#5040 - Passer null à socket_select
  • Example#5041 - Analyser le résultat de socket_select
  • Example#5042 - Exemple avec socket_select
  • Example#5043 - Exemple avec socket_sendto
  • Example#5044 - Exemple avec socket_set_block
  • Example#5045 - Exemple avec socket_set_nonblock
  • Example#5046 - Exemple avec socket_set_option
  • Example#5047 - Exemple avec socket_strerror
  • Example#5048 - Authentification en utilisant un agent ssh
  • Example#5049 - Identification en utilisant une clé d'hôte publique
  • Example#5050 - Récupération de la liste des méthodes d'identification
  • Example#5051 - Identification avec un mot de passe
  • Example#5052 - Identification en utilisant une clé publique
  • Example#5053 - Exemple avec ssh2_connect
  • Example#5054 - Exécution d'une commande
  • Example#5055 - Ouverture d'un shell et récupération du flux stderr qui lui est associé
  • Example#5056 - Comparaison d'une empreinte à une valeur connue
  • Example#5057 - Détermine quelles méthodes ont été négociées
  • Example#5058 - Ajout d'une clé publique avec ssh2_publickey_add
  • Example#5059 - Liste des clés autorisées avec ssh2_publickey_list
  • Example#5060 - Téléchargement d'un fichier via SCP
  • Example#5061 - Chargement d'un fichier via SCP
  • Example#5062 - Changement du mode du fichier sur le serveur distant
  • Example#5063 - Statue un lien symbolique via SFTP
  • Example#5064 - Création d'un dossier sur un serveur distant
  • Example#5065 - Lecture d'un lien symbolique
  • Example#5066 - Résoudre un nom de chemin
  • Example#5067 - Renommer un fichier via sftp
  • Example#5068 - Effacement d'un dossier sur un serveur distant
  • Example#5069 - Statut d'un fichier via SFTP
  • Example#5070 - Création d'un lien symbolique
  • Example#5071 - Effacement d'un fichier
  • Example#5072 - Ouverture d'un fichier via SFTP
  • Example#5073 - Exécution d'une commande
  • Example#5074 - Ouverture d'un tunnel sur un hôte arbitraire
  • Example#5075 - Style orienté objet
  • Example#5076 - Style procédural
  • Example#5077 - Exemple avec stomp_connect_error
  • Example#5078 - Exemple avec stomp_version
  • Example#5079 - Style orienté objet
  • Example#5080 - Style procédural
  • Example#5081 - Style orienté objet
  • Example#5082 - Style procédural
  • Example#5083 - Style orienté objet
  • Example#5084 - Style procédural
  • Example#5085 - Style orienté objet
  • Example#5086 - Style procédural
  • Example#5087 - Style orienté objet
  • Example#5088 - Style procédural
  • Example#5089 - Style orienté objet
  • Example#5090 - Style procédural
  • Example#5091 - Style orienté objet
  • Example#5092 - Style procédural
  • Example#5093 - Style orienté objet
  • Example#5094 - Style procédural
  • Example#5095 - Style orienté objet
  • Example#5096 - Style procédural
  • Example#5097 - Entraînement depuis un tableau
  • Example#5098 - Entraînement depuis un fichier
  • Example#5099 - Exemple avec svn_add
  • Example#5100 - Exemple d'identification
  • Example#5101 - Exemple d'utilisation de svn_blame
  • Example#5102 - Exemple d'utilisation
  • Example#5103 - Exemple d'utilisation
  • Example#5104 - Exemple d'utilisation
  • Example#5105 - Exemple d'utilisation
  • Example#5106 - Exemple d'utilisation
  • Example#5107 - Exemple d'utilisation
  • Example#5108 - Comparaison de deux révisions d'un chemin du référentiel
  • Example#5109 - Comparaison, plus portable, de deux fichiers locaux
  • Example#5110 - Exemple d'utilisation de svn_export
  • Example#5111 - Exemple d'utilisation
  • Example#5112 - Exemple avec svn_log
  • Example#5113 - Exemple avec svn_ls
  • Example#5114 - Exemple d'utilisation
  • Example#5115 - Exemple d'utilisation
  • Example#5116 - Refuser toutes les connexions depuis localhost
  • Example#5117 - Bannir une URL
  • Example#5118 - Récupération de statistiques
  • Example#5119 - Lecture des logs Varnish depuis la mémoire partagée
  • Example#5120 - Exemple avec VarnishAdmin::__construct
  • Example#5121 - Recherche parallèle en utilisant Yaz
  • Example#5122 - Configuration CCL
  • Example#5123 - Analyse CCL
  • Example#5124 - Mise à Jour d'Enregistrements
  • Example#5125 - Tableau pour des enregistrements GRS-1
  • Example#5126 - Travail avec MARCXML
  • Example#5127 - Fonction PHP qui analyse les titres sur un serveur YAZ
  • Example#5128 - Exemples de Requête
  • Example#5129 - Critères de Tri
  • Example#5130 - Exemple avec ZMQContext
  • Example#5131 - Exemple avec ZMQContext
  • Example#5132 - Exemple avec ZMQContext
  • Example#5133 - Exemple avec ZMQSocket
  • Example#5134 - Un exemple d'envoi/réception
  • Example#5135 - Exemple avec ZMQPoll
  • Example#5136 - zookeeper_dispatch example #1
  • Example#5137 - zookeeper_dispatch example #2
  • Example#5138 - Zookeeper::addAuth example
  • Example#5139 - Zookeeper::create example
  • Example#5140 - Zookeeper::delete example
  • Example#5141 - Zookeeper::exists example
  • Example#5142 - Zookeeper::get example
  • Example#5143 - Zookeeper::get stat example
  • Example#5144 - Zookeeper::getAcl example
  • Example#5145 - Zookeeper::getChildren example
  • Example#5146 - Zookeeper::set example
  • Example#5147 - Zookeeper::setAcl example
  • Example#5148 - Zookeeper::setDebugLevel example
  • Example#5149 - ZookeeperConfig::add example
  • Example#5150 - ZookeeperConfig::get example
  • Example#5151 - ZookeeperConfig::remove example
  • Example#5152 - ZookeeperConfig::set example
  • Example#5153 - Exemple avec solr_get_version
  • Example#5154 - Contenu du fichier BootStrap
  • Example#5155 - Ajout d'un document à l'index
  • Example#5156 - Fusion d'un document dans un autre
  • Example#5157 - Recherche de documents - réponses sous la forme d'un objet SolrObject
  • Example#5158 - Recherche de documents - réponses sous la forme d'un objet SolrDocument
  • Example#5159 - Exemple simple avec TermsComponent
  • Example#5160 - Exemple simple avec TermsComponent en utilisant un préfixe
  • Example#5161 - Exemple simple avec TermsComponent en spécifiant une fréquence minimale
  • Example#5162 - Exemple simple avec Facet
  • Example#5163 - Exemple simple avec Facet et un champ optionnel d'écrasement pour mincount
  • Example#5164 - Exemple avec les Facet
  • Example#5165 - Connexion à un serveur SSL
  • Example#5166 - Exemple avec SolrQuery
  • Example#5167 - Exemple "Solr Real Time Get (RTG)" avec SolrClient::getById
  • Example#5168 - SolrInputDocument::addChildDocument example
  • Example#5169 - SolrInputDocument::addChildDocuments example
  • Example#5170 - Exemple avec SolrDocument::toArray
  • Example#5171 - Exemple avec SolrObject::__construct
  • Example#5172 - Exemple avec SolrObject::offsetUnset
  • Example#5173 - Exemple avec SolrClient::addDocument example
  • Example#5174 - Exemple 2 avec SolrClient::addDocument
  • Example#5175 - Exemple avec SolrClient::addDocuments
  • Example#5176 - Exemple avec SolrClient::__construct
  • Example#5177 - Exemple avec SolrQuery::deleteByQuery
  • Example#5178 - SolrClient::getById example
  • Example#5179 - SolrClient::getByIds example
  • Example#5180 - Exemple avec SolrClient::ping
  • Example#5181 - Exemple avec SolrClient::query
  • Example#5182 - Exemple avec SolrClient::request
  • Example#5183 - Exemple avec SolrClient::setResponseWriter
  • Example#5184 - Exemple avec SolrParams::setParam
  • Example#5185 - Exemple avec SolrQuery::addFacetField
  • Example#5186 - Exemple avec SolrQuery::addFacetField
  • Example#5187 - Exemple avec SolrQuery::addFilterQuery
  • Example#5188 - SolrQuery::addGroupSortField example
  • Example#5189 - SolrQuery::collapse example
  • Example#5190 - SolrQuery::setExpand example
  • Example#5191 - SolrDisMaxQuery::addBigramPhraseField example
  • Example#5192 - SolrDisMaxQuery::addBoostQuery example
  • Example#5193 - SolrDisMaxQuery::addPhraseField example
  • Example#5194 - SolrDisMaxQuery::addQueryField example
  • Example#5195 - SolrDisMaxQuery::addTrigramPhraseField example
  • Example#5196 - SolrDisMaxQuery::addUserField example
  • Example#5197 - SolrDisMaxQuery::__construct example
  • Example#5198 - SolrDisMaxQuery::removeBigramPhraseField example
  • Example#5199 - SolrDisMaxQuery::removeBoostQuery example
  • Example#5200 - SolrDisMaxQuery::removePhraseField example
  • Example#5201 - SolrDisMaxQuery::removeQueryField example
  • Example#5202 - SolrDisMaxQuery::removeTrigramPhraseField example
  • Example#5203 - SolrDisMaxQuery::removeUserField example
  • Example#5204 - SolrDisMaxQuery::setBigramPhraseFields example
  • Example#5205 - SolrDisMaxQuery::setBigramPhraseSlop example
  • Example#5206 - SolrDisMaxQuery::setBoostFunction example
  • Example#5207 - SolrDisMaxQuery::setBoostQuery example
  • Example#5208 - SolrDisMaxQuery::setMinimumMatch example
  • Example#5209 - SolrDisMaxQuery::setPhraseFields example
  • Example#5210 - SolrDisMaxQuery::setPhraseSlop example
  • Example#5211 - SolrDisMaxQuery::setQueryAlt example
  • Example#5212 - SolrDisMaxQuery::setQueryPhraseSlop example
  • Example#5213 - SolrDisMaxQuery::setTieBreaker example
  • Example#5214 - SolrDisMaxQuery::setTrigramPhraseFields example
  • Example#5215 - SolrDisMaxQuery::setTrigramPhraseSlop example
  • Example#5216 - SolrDisMaxQuery::setUserFields example
  • Example#5217 - SolrDisMaxQuery::useDisMaxQueryParser example
  • Example#5218 - SolrDisMaxQuery::useEDisMaxQueryParser example
  • Example#5219 - SolrCollapseFunction::__construct example
  • Example#5220 - SolrCollapseFunction::setHint example
  • Example#5221 - SolrCollapseFunction::setMax example
  • Example#5222 - Exemple simple
  • Example#5223 - Désactiver l'analyse des fichiers PHP dans un dossier avec .htaccess
  • Example#5224 - Exemple avec apache_get_modules
  • Example#5225 - Exemple avec apache_get_version
  • Example#5226 - Exemple avec apache_getenv
  • Example#5227 - Exemple avec apache_lookup_uri
  • Example#5228 - Passage d'informations entre PHP et Perl
  • Example#5229 - Valeurs d'identification dans le fichier access.log
  • Example#5230 - Exemple avec apache_request_headers
  • Example#5231 - Exemple avec apache_response_headers
  • Example#5232 - Exemple avec apache_setenv
  • Example#5233 - Exemple avec getallheaders
  • Example#5234 - Enregistrer une variable avec $_SESSION.
  • Example#5235 - Retirer une variable de session avec la superglobale $_SESSION.
  • Example#5236 - Compter le nombre de passages d'un utilisateur sur une page
  • Example#5237 - Exemple
  • Example#5238 - Exemple avec session_cache_expire
  • Example#5239 - Exemple avec session_cache_limiter
  • Example#5240 - Exemple de session_create_id avec session_regenerate_id
  • Example#5241 - Destruction d'une session avec $_SESSION
  • Example#5242 - Exemple de session_gc pour les planificateurs de tâches comme cron
  • Example#5243 - Exemple de session_gc pour des scripts accessible par l'utilisateur
  • Example#5244 - Exemple avec session_name
  • Example#5245 - Exemple avec session_regenerate_id
  • Example#5246 - Eviter la perte de session par session_regenerate_id
  • Example#5247 - Gestionnaire de session personnalisé : voir le code complet dans la documentation sur l'interface SessionHandlerInterface.
  • Example#5248 - Gestionnaire de sauvegarde de session personnalisé en utilisant des objets
  • Example#5249 - page1.php
  • Example#5250 - Récupération de la session : page2.php
  • Example#5251 - Remplacement de la durée de vie du cookie
  • Example#5252 - Lecture de la session et fermeture
  • Example#5253 - Utilisation de la classe SessionHandler pour ajouter un cryptage aux gestionnaires de sauvegarde interne de PHP.
  • Example#5254 - Exemple avec SessionHandlerInterface
  • Example#5255 - Tokenize comma separated integer list
  • Example#5256 - Tokenize assign statement
  • Example#5257 - Simple calculator
  • Example#5258 - Parse words out from a sentence
  • Example#5259 - Exemples de masques valides
  • Example#5260 - Exemples de masques invalides
  • Example#5261 - Exemple de comparaison de preg_filter avec preg_replace
  • Example#5262 - Exemple avec preg_grep
  • Example#5263 - preg_last_error_msg example
  • Example#5264 - Exemple avec preg_last_error
  • Example#5265 - Extraction de tous les numéros de téléphone d'un texte
  • Example#5266 - Recherche les couples de balises HTML (gourmand)
  • Example#5267 - Utilisation d'un sous-masque nommé
  • Example#5268 - Trouve la chaîne "php"
  • Example#5269 - Trouve le mot "web"
  • Example#5270 - Lire un nom de domaine dans une URL
  • Example#5271 - Utilisation des sous-masques nommés
  • Example#5272 - Exemple avec preg_quote
  • Example#5273 - Mise en italique d'un mot dans un texte
  • Example#5274 - Exemple de preg_replace_callback_array
  • Example#5275 - preg_replace_callback et fonction anonyme
  • Example#5276 - Exemple avec preg_replace_callback
  • Example#5277 - Exemple avec preg_replace_callback en utilisant une structure récursive pour gérer du BB code
  • Example#5278 - Utilisation des références arrières avec des littéraux numériques
  • Example#5279 - Utilisation de tableaux indexé avec preg_replace
  • Example#5280 - Remplacement de plusieurs valeurs simultanément
  • Example#5281 - Suppression des espaces
  • Example#5282 - Utilisation du paramètre count
  • Example#5283 - Exemple avec preg_split : Éclatement d'une chaîne de recherche
  • Example#5284 - Scinder une chaîne en caractères
  • Example#5285 - Scinde une chaîne et capture les positions
  • Example#5286 - Exemples d'expressions rationnelles
  • Example#5287 - Exemple avec ereg_replace
  • Example#5288 - Exemple avec ereg_replace
  • Example#5289 - Remplacer les URL par des liens cliquables
  • Example#5290 - Exemple avec ereg
  • Example#5291 - Mise en évidence des résultats de la recherche
  • Example#5292 - Exemple avec eregi
  • Example#5293 - Exemple avec split
  • Example#5294 - Exemple avec split
  • Example#5295 - Exemple avec spliti
  • Example#5296 - Exemple avec sql_regcase
  • Example#5297 - Exemple avec addcslashes
  • Example#5298 - Exemple avec addslashes
  • Example#5299 - Exemple avec chr
  • Example#5300 - Comportement de débordement
  • Example#5301 - Construite une chaîne UTF-8 à partir d'octet individuel
  • Example#5302 - Exemple avec chunk_split
  • Example#5303 - Exemple avec convert_uudecode
  • Example#5304 - Exemple avec convert_uuencode
  • Example#5305 - Exemple avec count_chars
  • Example#5306 - Afficher une somme de contrôle CRC32
  • Example#5307 - Exemple avec crypt
  • Example#5308 - Utilisation de crypt avec htpasswd
  • Example#5309 - Utilisation de crypt avec différents types de chiffrement
  • Example#5310 - Exemple avec echo
  • Example#5311 - Exemple avec explode
  • Example#5312 - Exemple de valeurs retournées par la fonction explode
  • Example#5313 - Exemple avec explode et le paramètre limit
  • Example#5314 - fprintf : Entiers avec zéros initiaux
  • Example#5315 - fprintf : Format monétaire
  • Example#5316 - Exemple avec la table de traduction des caractères en entités HTML
  • Example#5317 - Exemple avec hex2bin
  • Example#5318 - Décoder des entités HTML
  • Example#5319 - Exemple avec htmlentities
  • Example#5320 - Utilisation de ENT_IGNORE
  • Example#5321 - Exemple avec htmlspecialchars_decode
  • Example#5322 - Exemple avec htmlspecialchars
  • Example#5323 - Exemple avec implode
  • Example#5324 - Exemple avec lcfirst
  • Example#5325 - Exemple avec levenshtein
  • Example#5326 - Exemple avec localeconv
  • Example#5327 - Exemple avec ltrim
  • Example#5328 - Exemple d'utilisation de md5_file
  • Example#5329 - Exemple avec md5
  • Example#5330 - Exemple avec metaphone
  • Example#5331 - Utilisation du paramètre max_phonemes
  • Example#5332 - Utilisant le paramètre de max_phonemes
  • Example#5333 - Exemple avec money_format
  • Example#5334 - Exemple avec nl2br
  • Example#5335 - Génération de code HTML valide avec le paramètre use_xhtml
  • Example#5336 - Divers séparateurs de nouvelles lignes
  • Example#5337 - Exemple avec number_format
  • Example#5338 - Exemple avec ord
  • Example#5339 - Examiner les octets individuels d'une chaîne UTF-8
  • Example#5340 - Exemple avec parse_str
  • Example#5341 - Déformation des nom par parse_str
  • Example#5342 - Exemple avec print
  • Example#5343 - printf : divers exemples
  • Example#5344 - printf : spécificateurs chaînes de caractères
  • Example#5345 - Exemple avec rtrim
  • Example#5346 - Exemple avec setlocale
  • Example#5347 - Exemple avec setlocale sous Windows
  • Example#5348 - Exemple avec sha1_file
  • Example#5349 - Exemple avec sha1
  • Example#5350 - Exemple de similar_text en inversant les arguments
  • Example#5351 - Exemples Soundex
  • Example#5352 - Échange d'arguments
  • Example#5353 - Spécification du caractère de remplissage
  • Example#5354 - Spécificateur de position avec d'autres spécificateurs
  • Example#5355 - sprintf : entier sans espace
  • Example#5356 - sprintf : formatage de devises
  • Example#5357 - sprintf : notation scientifique
  • Example#5358 - Exemple avec sscanf
  • Example#5359 - sscanf - utilisation des paramètres optionnels
  • Example#5360 - Using the empty string ''
  • Example#5361 - Showing case-sensitivity
  • Example#5362 - Using the empty string ''
  • Example#5363 - Showing case-sensitivity
  • Example#5364 - Exemple avec str_ireplace
  • Example#5365 - Exemple avec str_pad
  • Example#5366 - Exemple avec str_repeat
  • Example#5367 - Exemple 1 avec str_replace
  • Example#5368 - Exemple 2 avec str_replace
  • Example#5369 - Exemple avec str_rot13
  • Example#5370 - Exemple avec str_shuffle
  • Example#5371 - Exemple avec str_split
  • Example#5372 - Using the empty string ''
  • Example#5373 - Showing case-sensitivity
  • Example#5374 - Exemple avec str_word_count
  • Example#5375 - Exemple avec strcasecmp
  • Example#5376 - Exemple d'utilisation de strcmp
  • Example#5377 - Exemple avec strcspn
  • Example#5378 - Exemple avec strip_tags
  • Example#5379 - Exemple avec stripos
  • Example#5380 - Exemple avec stripslashes
  • Example#5381 - Utilisation de stripslashes sur un tableau
  • Example#5382 - Exemple avec stristr
  • Example#5383 - Teste si une chaîne de caractères est trouvée ou pas
  • Example#5384 - Utilisation d'une "chaîne de caractères" en chiffre
  • Example#5385 - Exemple avec strlen
  • Example#5386 - Exemple avec strpbrk
  • Example#5387 - Avec ===
  • Example#5388 - Avec !==
  • Example#5389 - Utiliser un offset
  • Example#5390 - Exemple avec strrchr
  • Example#5391 - Inverser une chaîne avec strrev
  • Example#5392 - Exemple avec strripos
  • Example#5393 - Vérifie si une occurrence est trouvée dans une chaîne
  • Example#5394 - Recherche avec des positions
  • Example#5395 - Exemple avec strspn
  • Example#5396 - Exemple avec strstr
  • Example#5397 - Exemple avec strtok
  • Example#5398 - Comportement de strtok sur une partie vide trouvée
  • Example#5399 - Exemple avec strtolower
  • Example#5400 - Exemple avec strtoupper
  • Example#5401 - Exemple avec strtr
  • Example#5402 - Exemple avec strtr et 2 arguments
  • Example#5403 - Comparaison de comportement de strtr
  • Example#5404 - Exemple avec substr_compare
  • Example#5405 - Exemple avec substr_count
  • Example#5406 - Exemple avec substr_replace
  • Example#5407 - Utilisation de substr_replace pour remplacer plusieurs chaînes en une seule fois
  • Example#5408 - Exemple de offset négatif
  • Example#5409 - Utilisation d'une valeur négative pour length
  • Example#5410 - Exemple avec substr
  • Example#5411 - Comportement du cast avec substr
  • Example#5412 -
  • Example#5413 - Exemple avec trim
  • Example#5414 - Suppression de caractères dans un tableau avec trim
  • Example#5415 - Exemple avec ucfirst
  • Example#5416 - Exemple avec ucwords
  • Example#5417 - Exemple avec ucwords et un séparation personnalisé
  • Example#5418 - Exemple de ucwords des séparateurs supplémentaires
  • Example#5419 - vfprintf : zéro comme caractères d'espacements
  • Example#5420 - Exemple avec vprintf : entiers complétés avec des zéros
  • Example#5421 - Exemple avec vsprintf : entiers avec zéro initiaux
  • Example#5422 - Exemple avec wordwrap
  • Example#5423 - Exemple avec wordwrap
  • Example#5424 - Exemple avec wordwrap
  • Example#5425 - Exemple avec array_change_key_case
  • Example#5426 - Exemple avec array_chunk
  • Example#5427 - Récupère la colonne des prénoms
  • Example#5428 - Récupère la colonne des noms, indexé par la colonne "id"
  • Example#5429 - Récupère la colonne des username depuis la propriété publique "username" d'un objet
  • Example#5430 - Récupère la colonne nom depuis la propriété privée "name" d'un objet en utilisant la méthode magique __get.
  • Example#5431 - Exemple avec array_combine
  • Example#5432 - Exemple avec array_count_values
  • Example#5433 - Exemple avec array_diff_assoc
  • Example#5434 - Exemple avec array_diff_assoc
  • Example#5435 - Exemple avec array_diff_key
  • Example#5436 - Exemple avec array_diff_uassoc
  • Example#5437 - Exemple avec array_diff_ukey
  • Example#5438 - Exemple avec array_diff
  • Example#5439 - Exemple avec la fonction array_diff avec des types qui ne correspondent pas
  • Example#5440 - Exemple avec array_fill_keys
  • Example#5441 - Exemple avec array_fill
  • Example#5442 - Exemple avec array_filter
  • Example#5443 - Exemple avec array_filter callback
  • Example#5444 - Exemple avec array_filter et mode
  • Example#5445 - Exemple avec array_flip
  • Example#5446 - Exemple avec array_flip : collision
  • Example#5447 - Exemple avec array_intersect_assoc
  • Example#5448 - Exemple avec array_intersect_key
  • Example#5449 - Exemple avec array_intersect_uassoc
  • Example#5450 - Exemple avec array_intersect_ukey
  • Example#5451 - Exemple avec array_intersect
  • Example#5452 - Exemple avec array_key_exists
  • Example#5453 - array_key_exists et isset
  • Example#5454 - Usage simple de array_key_first
  • Example#5455 - Exemple avec array_keys
  • Example#5456 - Exemple avec array_map
  • Example#5457 - array_map : utilisation d'une fonction quelconque (depuis PHP 5.3.0)
  • Example#5458 - array_map : utilisation de plusieurs tableaux
  • Example#5459 - Exécution d'une opération zip de tableaux
  • Example#5460 - null callback avec seulement array
  • Example#5461 - array_map - avec des clés sous la forme de chaîne de caractères
  • Example#5462 - Exemple avec array_merge_recursive
  • Example#5463 - Exemple avec array_merge
  • Example#5464 - Exemple simple avec array_merge
  • Example#5465 - Exemple avec array_merge avec des types non-tableaux
  • Example#5466 - Trier plusieurs tableaux
  • Example#5467 - Trier un tableau multidimensionnel
  • Example#5468 - Classer les résultats d'une base de données
  • Example#5469 - Tri non sensible à la casse
  • Example#5470 - Exemple avec array_pad
  • Example#5471 - Exemple avec array_pop
  • Example#5472 - Exemple avec array_product
  • Example#5473 - Exemple avec array_push
  • Example#5474 - Exemple avec array_rand
  • Example#5475 - Exemple avec array_reduce
  • Example#5476 - Exemple avec array_replace_recursive
  • Example#5477 - Exemple avec array_replace_recursive et la récursivité
  • Example#5478 - Exemple avec array_replace
  • Example#5479 - Exemple avec array_reverse
  • Example#5480 - Exemple avec array_search
  • Example#5481 - Exemple avec array_shift
  • Example#5482 - Exemple avec array_slice
  • Example#5483 - array_slice et basé sur un tableau
  • Example#5484 - array_slice et tableau avec des clés mixtes
  • Example#5485 - Exemples avec array_splice
  • Example#5486 - Déclaration équivalentes à des exemples de array_splice divers
  • Example#5487 - Exemple avec array_sum
  • Example#5488 - Exemple avec array_udiff_assoc
  • Example#5489 - Exemple avec array_udiff_uassoc
  • Example#5490 - Exemple avec array_udiff en utilisant les objets stdClass
  • Example#5491 - Exemple avec array_udiff en utilisant des objets DateTime
  • Example#5492 - Exemple avec array_uintersect_assoc
  • Example#5493 - Exemple avec array_uintersect_uassoc
  • Example#5494 - Exemple avec array_uintersect
  • Example#5495 - Exemple avec array_unique
  • Example#5496 - Exemple avec array_unique et les types
  • Example#5497 - Exemple avec array_unshift
  • Example#5498 - Exemple avec array_values
  • Example#5499 - Exemple avec array_walk_recursive
  • Example#5500 - Exemple avec array_walk
  • Example#5501 - Exemple avec array
  • Example#5502 - Index automatique avec array
  • Example#5503 - Index commençant à 1 avec array
  • Example#5504 - Accéder à un tableau dans des doubles guillemets
  • Example#5505 - Exemple avec arsort
  • Example#5506 - Exemple avec asort
  • Example#5507 - Exemple avec compact
  • Example#5508 - Exemple avec count
  • Example#5509 - Exemple de récursivité avec count
  • Example#5510 - Exemple d'utilisation de current
  • Example#5511 - Exemple avec each
  • Example#5512 - Passer en revue un tableau avec each
  • Example#5513 - Exemple avec end
  • Example#5514 - Exemple avec extract
  • Example#5515 - Exemple avec in_array
  • Example#5516 - Exemple avec in_array et le mode strict
  • Example#5517 - Exemple avec in_array et un tableau en paramètre
  • Example#5518 - Exemple avec key
  • Example#5519 - Exemple avec krsort
  • Example#5520 - Exemple avec ksort
  • Example#5521 - Exemple avec list
  • Example#5522 - Exemple d'utilisation de list
  • Example#5523 - Utilisation d'un sous-list
  • Example#5524 - Utilisation de list en tenant compte de l'ordre
  • Example#5525 - list et l'ordre de définition des index
  • Example#5526 - list avec des clés
  • Example#5527 - Exemple avec natcasesort
  • Example#5528 - Exemple d'utilisation de base avec natsort
  • Example#5529 - Exemples montrant les pièges de natsort
  • Example#5530 - Exemple avec next
  • Example#5531 - Exemple avec prev
  • Example#5532 - Exemple avec range
  • Example#5533 - Exemple avec reset
  • Example#5534 - Exemple avec rsort
  • Example#5535 - Exemple avec shuffle
  • Example#5536 - Exemple avec sort
  • Example#5537 - Exemple avec sort en utilisant l'ordre naturel sans tenir compte de la casse
  • Example#5538 - Exemple avec uasort
  • Example#5539 - Exemple avec uksort
  • Example#5540 - Exemple avec usort
  • Example#5541 - Tri avec usort sur un tableau multidimensionnel
  • Example#5542 - Tri avec usort sur un objet
  • Example#5543 - Exemple avec usort en utilisant une closure pour trier un tableau multi-dimensionnel
  • Example#5544 - classes.inc
  • Example#5545 - test_script.php
  • Example#5546 - Exemple avec class_alias
  • Example#5547 - Exemple avec class_exists
  • Example#5548 - Exemple avec le paramètre autoload
  • Example#5549 - Exemple avec get_called_class
  • Example#5550 - Exemple avec get_class_methods
  • Example#5551 - Exemple avec get_class_vars
  • Example#5552 - Exemple avec get_class_vars et les contextes
  • Example#5553 - Exemple avec get_class
  • Example#5554 - Utilisation de get_class dans une superclasse
  • Example#5555 - Utilisation get_class avec des namespace de classe
  • Example#5556 - Exemple avec get_declared_classes
  • Example#5557 - Exemple avec get_declared_interfaces
  • Example#5558 - Exemple avec get_object_vars
  • Example#5559 - Exemple avec get_parent_class
  • Example#5560 - Exemple avec interface_exists
  • Example#5561 - Exemple avec is_a
  • Example#5562 - Utilisation de l'opérateur instanceof avec PHP 5
  • Example#5563 - Exemple avec is_subclass_of
  • Example#5564 - Exemple avec is_subclass_of en utilisant une interface
  • Example#5565 - Exemple avec method_exists
  • Example#5566 - Exemple avec method_exists en appel statique
  • Example#5567 - Exemple avec property_exists
  • Example#5568 - Exemple avec classkit_import
  • Example#5569 - Exemple avec classkit_method_add
  • Example#5570 - Exemple avec classkit_method_copy
  • Example#5571 - Exemple avec classkit_method_redefine
  • Example#5572 - Exemple avec classkit_method_remove
  • Example#5573 - Exemple avec classkit_method_rename
  • Example#5574 - Exemple avec ctype_alnum (en utilisant les locales par défaut)
  • Example#5575 - Exemple avec ctype_alpha (en utilisant les locales courantes)
  • Example#5576 - Exemple avec ctype_cntrl
  • Example#5577 - Exemple avec ctype_digit
  • Example#5578 - Exemple avec ctype_digit pour comparer des chaînes et des nombres
  • Example#5579 - Exemple avec ctype_graph
  • Example#5580 - Exemple avec ctype_lower (en utilisant les locales courantes)
  • Example#5581 - Exemple avec ctype_print
  • Example#5582 - Exemple avec ctype_punct
  • Example#5583 - Exemple avec ctype_space
  • Example#5584 - Exemple avec ctype_upper (en utilisant la locale courante)
  • Example#5585 - Exemple avec ctype_xdigit
  • Example#5586 - Configurer le filtre par défaut pour qu'il agisse comme htmlspecialchars
  • Example#5587 - Configurer le filtre par défaut pour agir comme htmlspecialchars
  • Example#5588 - Validation d'adresses email avec filter_var
  • Example#5589 - Validation d'adresses IP avec filter_var
  • Example#5590 - Passage d'options à la fonction filter_var
  • Example#5591 - Nettoyage et validation d'adresses email
  • Example#5592 - Configurer le filtre par défaut
  • Example#5593 - Exemple avec filter_input_array
  • Example#5594 - Exemple avec filter_input
  • Example#5595 - Exemple avec filter_list
  • Example#5596 - Exemple avec filter_var_array
  • Example#5597 - Exemple avec filter_var
  • Example#5598 - Exemple avec call_user_func_array
  • Example#5599 - Exemple avec call_user_func_array en utilisant un espace de nom
  • Example#5600 - Utilisation d'une fonction lambda
  • Example#5601 - En passant une valeur par référence
  • Example#5602 - Exemple avec call_user_func par référence
  • Example#5603 - Exemple avec call_user_func
  • Example#5604 - Exemple avec call_user_func en utilisant un espace de noms
  • Example#5605 - Utilisation d'une méthode de classe avec call_user_func
  • Example#5606 - Utilisation d'une fonction lambda avec call_user_func
  • Example#5607 - Création d'une fonction anonyme avec create_function
  • Example#5608 - Traitement générique par fonction avec create_function
  • Example#5609 - Utilisation de fonctions anonymes comme fonction de rappel
  • Example#5610 - Exemple avec forward_static_call_array
  • Example#5611 - Exemple avec forward_static_call
  • Example#5612 - Exemple avec func_get_arg
  • Example#5613 - Exemple avec func_get_arg avant et après PHP 5.3
  • Example#5614 - Exemple func_get_arg avec des arguments par référence et par valeur
  • Example#5615 - Exemple avec func_get_args
  • Example#5616 - Exemples func_get_args avant et après PHP 5.3
  • Example#5617 - Exemple func_get_args avec des arguments par référence et par valeur
  • Example#5618 - Exemple avec func_num_args
  • Example#5619 - Exemples func_num_args avant et après PHP 5.3
  • Example#5620 - Exemple avec function_exists
  • Example#5621 - Exemple avec get_defined_functions
  • Example#5622 - Exemple avec register_shutdown_function
  • Example#5623 - Exemple avec register_tick_function
  • Example#5624 - Exemple avec Quickhash
  • Example#5625 - Exemple avec Quickhash utilisant ArrayAccess
  • Example#5626 - Exemple avec Quickhash utilisant Iterator
  • Example#5627 - Example avec Quickhash et des valeurs chaines de caractères
  • Example#5628 - Exemple QuickHashIntSet::add
  • Example#5629 - Exemple QuickHashIntSet::__construct
  • Example#5630 - Exemple QuickHashIntSet::delete
  • Example#5631 - Exemple QuickHashIntSet::exists
  • Example#5632 - Exemple QuickHashIntSet::getSize
  • Example#5633 - Exemple QuickHashIntSet::loadFromFile
  • Example#5634 - Exemple QuickHashIntSet::loadFromString
  • Example#5635 - Exemple QuickHashIntSet::saveToFile
  • Example#5636 - Exemple QuickHashIntSet::saveToString
  • Example#5637 - Exemple QuickHashIntHash::add
  • Example#5638 - Exemple QuickHashIntHash::__construct
  • Example#5639 - Exemple QuickHashIntHash::delete
  • Example#5640 - Exemple QuickHashIntHash::exists
  • Example#5641 - Exemple QuickHashIntHash::get
  • Example#5642 - Exemple QuickHashIntHash::getSize
  • Example#5643 - Format du fichier QuickHash IntHash
  • Example#5644 - Format du fichier QuickHash IntHash
  • Example#5645 - Exemple QuickHashIntHash::loadFromFile
  • Example#5646 - Exemple QuickHashIntHash::loadFromString
  • Example#5647 - Exemple QuickHashIntHash::saveToFile
  • Example#5648 - Exemple QuickHashIntHash::saveToString
  • Example#5649 - Exemple QuickHashIntHash::set
  • Example#5650 - Exemple QuickHashIntHash::update
  • Example#5651 - Exemple avec QuickHashStringIntHash::add
  • Example#5652 - Exemple avec QuickHashStringIntHash::__construct
  • Example#5653 - Exemple avec QuickHashStringIntHash::delete
  • Example#5654 - Exemple avec QuickHashStringIntHash::get
  • Example#5655 - Exemple avec QuickHashStringIntHash::getSize
  • Example#5656 - QuickHash StringIntHash file format
  • Example#5657 - Format de fichier QuickHash IntHash
  • Example#5658 - Exemple avec QuickHashStringIntHash::loadFromFile
  • Example#5659 - Exemple avec QuickHashStringIntHash::loadFromString
  • Example#5660 - Exemple avec QuickHashStringIntHash::saveToFile
  • Example#5661 - Exemple avec QuickHashStringIntHash::saveToString
  • Example#5662 - Exemple avec QuickHashStringIntHash::set
  • Example#5663 - Exemple avec QuickHashStringIntHash::update
  • Example#5664 - Exemple avec QuickHashIntStringHash::add
  • Example#5665 - Exemple avec QuickHashIntStringHash::__construct
  • Example#5666 - Exemple avec QuickHashIntStringHash::delete
  • Example#5667 - Exemple avec QuickHashIntStringHash::get
  • Example#5668 - Exemple avec QuickHashIntStringHash::getSize
  • Example#5669 - Format de fichier QuickHash IntString
  • Example#5670 - Format de fichier QuickHash IntString
  • Example#5671 - Exemple avec QuickHashIntStringHash::loadFromFile
  • Example#5672 - Exemple avec QuickHashIntStringHash::loadFromString
  • Example#5673 - Exemple avec QuickHashIntStringHash::saveToFile
  • Example#5674 - Exemple avec QuickHashIntStringHash::saveToString
  • Example#5675 - Exemple avec QuickHashIntStringHash::set
  • Example#5676 - Exemple avec QuickHashIntStringHash::update
  • Example#5677 - Exemple avec Reflection depuis un Shell (un Terminal)
  • Example#5678 - Étendre les classes internes
  • Example#5679 - Exemple Reflection::getModifierNames
  • Example#5680 - Utilisation simple de ReflectionClass
  • Example#5681 - Utilisation basique de ReflectionClass::export
  • Example#5682 - Utilisation de ReflectionClass::getConstant
  • Example#5683 - Utilisation simple de ReflectionClass::getConstructor
  • Example#5684 - Exemple avec ReflectionClass::getDefaultProperties
  • Example#5685 - Exemple avec ReflectionClass::getDocComment
  • Example#5686 - Exemple avec ReflectionClass::getEndLine
  • Example#5687 - Utilisation simple de ReflectionClass::getExtension
  • Example#5688 - Utilisation simple de ReflectionClass::getExtensionName
  • Example#5689 - Exemple avec ReflectionClass::getInterfaceNames
  • Example#5690 - >Exemple avec ReflectionClass::getInterfaces
  • Example#5691 - Utilisation simple de ReflectionClass::getMethod
  • Example#5692 - Utilisation simple de ReflectionClass::getMethods
  • Example#5693 - Filtrage des résultats depuis ReflectionClass::getMethods
  • Example#5694 - Exemple avec ReflectionClass::getName
  • Example#5695 - Exemple avec ReflectionClass::getNamespaceName
  • Example#5696 - Exemple avec ReflectionClass::getProperties
  • Example#5697 - Exemple avec ReflectionClass::getProperty
  • Example#5698 - Exemple basique de ReflectionClass::getReflectionConstants
  • Example#5699 - Exemple avec ReflectionClass::getShortName
  • Example#5700 - Exemple avec ReflectionClass::getStaticPropertyValue
  • Example#5701 - Exemple avec ReflectionClass::hasConstant
  • Example#5702 - Exemple avec ReflectionClass::hasMethod
  • Example#5703 - Exemple avec ReflectionClass::hasProperty
  • Example#5704 - Exemple avec ReflectionClass::inNamespace
  • Example#5705 - Exemple avec ReflectionClass::isAbstract
  • Example#5706 - Exemple avec ReflectionClass::isAnonymous
  • Example#5707 - Utilisation basique de ReflectionClass::isCloneable
  • Example#5708 - Exemple avec ReflectionClass::isFinal
  • Example#5709 - Exemple avec ReflectionClass::isInstance
  • Example#5710 - Exemple avec ReflectionClass::isInstantiable
  • Example#5711 - Exemple avec ReflectionClass::isInterface
  • Example#5712 - Exemple avec ReflectionClass::isInternal
  • Example#5713 - Utilisation simple de ReflectionClass::isIterable
  • Example#5714 - Utilisation basique de ReflectionClass::newInstanceArgs
  • Example#5715 - Exemple pour ReflectionClass::__toString
  • Example#5716 - Exemple avec ReflectionExtension
  • Example#5717 - Exemple avec ReflectionExtension::getClasses
  • Example#5718 - Exemple avec ReflectionExtension::getClassNames
  • Example#5719 - Exemple avec ReflectionExtension::getConstants
  • Example#5720 - Exemple avec ReflectionExtension::getDependencies
  • Example#5721 - Exemple avec ReflectionExtension::getFunctions
  • Example#5722 - Exemple avec ReflectionExtension::getINIEntries
  • Example#5723 - Exemple avec ReflectionExtension::getName
  • Example#5724 - Exemple avec ReflectionExtension::getVersion
  • Example#5725 - Exemple avec ReflectionExtension::info
  • Example#5726 - Exemple avec ReflectionFunction::__construct
  • Example#5727 - Exemple avec ReflectionFunction::invoke
  • Example#5728 - Exemple avec ReflectionFunction::invokeArgs
  • Example#5729 - Exemple pour ReflectionFunction::invokeArgs avec des références
  • Example#5730 - Exemple pour ReflectionFunction::__toString
  • Example#5731 - Exemple avec ReflectionFunctionAbstract::getReturnType
  • Example#5732 - Utilisation sur les fonctions intégrés
  • Example#5733 - Exemple avec ReflectionFunctionAbstract::hasReturnType
  • Example#5734 - Utilisation sur les fonctions intégrés
  • Example#5735 - Exemple de ReflectionFunctionAbstract::isClosure
  • Example#5736 - Exemple avec ReflectionFunctionAbstract::isDeprecated
  • Example#5737 - Exemple avec ReflectionMethod::__construct
  • Example#5738 - Exemple pour ReflectionMethod::getDeclaringClass
  • Example#5739 - Exemple avec ReflectionMethod::getModifiers
  • Example#5740 - Exemple avec ReflectionMethod::getPrototype
  • Example#5741 - Exemple avec ReflectionMethod::invoke
  • Example#5742 - Exemple pour ReflectionMethod::invokeArgs
  • Example#5743 - Définition d'une classe simple
  • Example#5744 - ReflectionMethod::__toString example
  • Example#5745 - Exemple avec ReflectionNamedType::isBuiltin
  • Example#5746 - Exemple avec ReflectionParameter
  • Example#5747 - Exemple d'utilisation de la classe ReflectionParameter
  • Example#5748 - Récupération de la classe qui a déclarée la méthode
  • Example#5749 - Récupérer les valeurs par défaut des paramètres de la fonction
  • Example#5750 - Récupérer les noms des constantes qui servent de valeurs par défaut aux paramètres d'une fonction
  • Example#5751 - Utilisation de ReflectionParameter::getType à partir de PHP 7.1.0
  • Example#5752 - Utilisation de ReflectionParameter::getType antérieur à PHP 7.1.0
  • Example#5753 - Exemple avec ReflectionParameter::hasType
  • Example#5754 - Exemple avec ReflectionProperty::__construct
  • Example#5755 - Récupération d'une valeur depuis une propriété privée ou protégée en utilisant la classe ReflectionProperty
  • Example#5756 - ReflectionClass::getDefaultValue example
  • Example#5757 - ReflectionProperty::getDocComment example
  • Example#5758 - Multiple property declarations
  • Example#5759 - Exemple de ReflectionProperty::getType
  • Example#5760 - Exemple avec ReflectionProperty::getValue
  • Example#5761 - ReflectionClass::hasDefaultValue example
  • Example#5762 - Exemple de ReflectionProperty::hasType
  • Example#5763 - Exemple avec ReflectionClass::isDefault
  • Example#5764 - Exemple de ReflectionProperty::isInitialized
  • Example#5765 - Définition d'une classe simple
  • Example#5766 - Exemple avec ReflectionProperty::setValue
  • Example#5767 - Exemple avec ReflectionType::allowsNull
  • Example#5768 - Exemple avec ReflectionType::__toString
  • Example#5769 - ReflectionUnionType::getTypes example
  • Example#5770 - Exemple avec ReflectionGenerator::__construct
  • Example#5771 - Exemple avec ReflectionGenerator::getExecutingFile
  • Example#5772 - Exemple avec ReflectionGenerator::getExecutingGenerator
  • Example#5773 - Exemple avec ReflectionGenerator::getExecutingLine
  • Example#5774 - Exemple avec ReflectionGenerator::getFunction
  • Example#5775 - Exemple avec ReflectionGenerator::getThis
  • Example#5776 - Exemple avec ReflectionGenerator::getTrace
  • Example#5777 - Basic ReflectionReference::getId usage
  • Example#5778 - Exemple avec boolval
  • Example#5779 - Exemple avec debug_zval_dump
  • Example#5780 -
  • Example#5781 - Une comparaison simple empty / isset.
  • Example#5782 - empty sur des positions dans une chaîne
  • Example#5783 - Exemple avec floatval
  • Example#5784 - Exemple avec floatval avec des caractères à gauche non numériques
  • Example#5785 - Exemple avec get_defined_vars
  • Example#5786 - get_resource_id exemple
  • Example#5787 - Exemple avec get_resource_type
  • Example#5788 - Exemple avec gettype
  • Example#5789 - Exemples avec intval
  • Example#5790 - Exemple avec is_array
  • Example#5791 - Exemple avec is_bool
  • Example#5792 - Exemple avec is_callable
  • Example#5793 - is_callable et les constructeurs
  • Example#5794 - Exemples avec is_countable
  • Example#5795 - Exemple avec is_float
  • Example#5796 - Exemple avec is_int
  • Example#5797 - Exemples avec is_iterable
  • Example#5798 - Exemple avec is_null
  • Example#5799 - Exemple avec is_numeric
  • Example#5800 - Exemple avec is_object
  • Example#5801 - Exemple avec is_resource
  • Example#5802 - Exemple avec is_scalar
  • Example#5803 - Exemple avec is_string
  • Example#5804 - Exemple avec isset
  • Example#5805 - isset sur des positions dans une chaîne
  • Example#5806 - Exemple avec print_r
  • Example#5807 - Exemple avec le paramètre return
  • Example#5808 - Exemple avec serialize
  • Example#5809 - Exemple avec settype
  • Example#5810 - Exemple pour strval utilisant la méthode magique PHP 5 __toString().
  • Example#5811 - Exemple avec unserialize
  • Example#5812 - Exemple avec la directive unserialize_callback_func
  • Example#5813 - Exemple avec unset
  • Example#5814 - Exemple avec un transtypage (unset)
  • Example#5815 - Exemple avec var_dump
  • Example#5816 - Exemple avec var_export
  • Example#5817 - Exporter stdClass (à partir de PHP 7.3.0)
  • Example#5818 - Exporter des classes à partir de PHP 5.1.0
  • Example#5819 - Utilisation de __set_state (à partir de PHP 5.1.0)
  • Example#5820 -
  • Example#5821 - Exemple avec OAuth::fetch
  • Example#5822 - Exemple avec OAuth::getAccessToken
  • Example#5823 - Exemple avec OAuth::getRequestToken
  • Example#5824 - Exemple avec OAuth::setRequestEngine
  • Example#5825 - Exemple avec OAuth::setRsaCertificate
  • Example#5826 - L'exemple OAuth::setToken
  • Example#5827 - Exemple avec OAuthProvider::__construct
  • Example#5828 - Exemple avec OAuthProvider::consumerHandler
  • Example#5829 - Exemple avec OAuthProvider::generateToken
  • Example#5830 - Exemple avec OAuthProvider::is2LeggedEndpoint
  • Example#5831 - Exemple avec OAuthProvider::timestampNonceHandler
  • Example#5832 - Exemple avec OAuthProvider::tokenHandler
  • Example#5833 - Exemple avec is_soap_fault
  • Example#5834 - Gestion des erreurs par exception avec SOAP
  • Example#5835 - Exemple avec SoapClient::__construct
  • Example#5836 - Exemple avec SoapClient::__doRequest
  • Example#5837 - Exemple avec SoapClient::__getFunctions
  • Example#5838 - Exemple avec SoapClient::__getLastRequest
  • Example#5839 - SoapClient::__getLastRequestHeaders() example
  • Example#5840 - Exemple avec SoapClient::__getLastResponse
  • Example#5841 - Exemple avec SoapClient::__getLastResponseHeaders
  • Example#5842 - Exemple avec SoapClient::__getTypes
  • Example#5843 - Exemple avec SoapClient::__setLocation
  • Example#5844 - Exemple avec SoapClient::__setSoapHeaders
  • Example#5845 - Configuration d'en-têtes multiples pour SOAP
  • Example#5846 - Exemple avec SoapClient::__soapCall
  • Example#5847 - Exemple avec SoapServer::addFunction
  • Example#5848 - Exemples avec SoapServer::__construct
  • Example#5849 - Exemple avec SoapServer::getFunctions
  • Example#5850 - Exemple avec SoapServer::handle
  • Example#5851 - Exemple SoapServer::setPersistence
  • Example#5852 - Quelques exemples avec SoapFault
  • Example#5853 - Emission d'exceptions SoapFault
  • Example#5854 - Exemple avec SoapHeader::__construct
  • Example#5855 - Exemple avec SoapParam::__construct
  • Example#5856 - Exemple avec SoapVar::__construct
  • Example#5857 - Exemple de serveur Yar
  • Example#5858 - Accès au serveur depuis un navigateur (requête GET)
  • Example#5859 - Exemple de client Yar
  • Example#5860 - Exemple de client Yar concurrent
  • Example#5861 - Exemple avec Yar_Server::__construct
  • Example#5862 - Exemple avec Yar_Server::handle
  • Example#5863 - Exemple avec Yar_Client::__call
  • Example#5864 - Exemple avec Yar_Client::__construct
  • Example#5865 - Exemple avec Yar_Client::setOpt
  • Example#5866 - Exemple avec Yar_Concurrent_Client::call
  • Example#5867 - Exemple avec Yar_Concurrent_Client::loop
  • Example#5868 - Exemple avec Yar_Concurrent_Client::reset
  • Example#5869 - Exemple avec Yar_Server_Exception::getType
  • Example#5870 - Exemple avec Yar_Client_Exception::getType
  • Example#5871 - Exemple avec XMLRPC
  • Example#5872 - Exemple de type XML-RPC
  • Example#5873 - Exemple avec xmlrpc_set_type
  • Example#5874 - For Each en ASP
  • Example#5875 - Foreach en PHP
  • Example#5876 - Exemple com (1)
  • Example#5877 - Exemple com (2)
  • Example#5878 - Exemple dotnet
  • Example#5879 - Exemple variant
  • Example#5880 - Basic COMPersistHelper::saveToFile Usage
  • Example#5881 - Exemple de connexions d'événements COM
  • Example#5882 - Enregistre un script PHP pour exécuter en tant que service
  • Example#5883 - Efface un service
  • Example#5884 - Exécution d'un service
  • Example#5885 - Exemple avec win32_create_service
  • Example#5886 - Un exemple win32_create_service avec les dépendances
  • Example#5887 - Exemple de win32_create_service avec les options de récupération
  • Example#5888 - Exemple avec win32_delete_service
  • Example#5889 - Exemple avec win32_start_service_ctrl_dispatcher
  • Example#5890 - book.xml
  • Example#5891 - Création d'un nouvel objet DOMAttr
  • Example#5892 - Exemple avec DOMAttr::isId()
  • Example#5893 - Création d'un nouvel objet DOMCdataSection
  • Example#5894 - Création d'un nouveau DOMComment
  • Example#5895 - Création d'un nouveau DOMDocument
  • Example#5896 - Création d'un nouvel élément et insertion en tant que racine
  • Example#5897 - Passer comme value du texte contenant & non échappé
  • Example#5898 - Création d'un nouvel élément et insertion en tant que racine
  • Example#5899 - Un exemple avec un espace de noms en préfixe
  • Example#5900 - Exemple avec DOMDocument::getElementById()
  • Example#5901 - Exemple de base
  • Example#5902 - Récupération de tous les éléments XInclude
  • Example#5903 - Exemple avec DOMDocument::importNode
  • Example#5904 - Création d'un Document
  • Example#5905 - Création d'un document
  • Example#5906 - Création d'un document
  • Example#5907 - Création d'un Document
  • Example#5908 - Invocation statique de loadXML
  • Example#5909 - Ajout d'un nouvelle méthode à DOMElement
  • Example#5910 - Récupération d'éléments sous la forme d'une classe personnalisée
  • Example#5911 - Récupération du propriétaire du document
  • Example#5912 - Les objets personalisé sont éphémère
  • Example#5913 - Sauvegarde d'un arbre DOM dans un fichier
  • Example#5914 - Sauvegarde d'un arbre HTML dans une chaîne de caractères
  • Example#5915 - Sauvegarde d'un arbre HTML dans un fichier
  • Example#5916 - Sauvegarde de l'arbre DOM dans une chaîne de caractères
  • Example#5917 - Exemple de validation DTD
  • Example#5918 - Exemple avec DOMDocument::xinclude()
  • Example#5919 - Ajout de données XML à votre document
  • Example#5920 - Création d'un nouveau DOMElement
  • Example#5921 - Ajout d'un attribut
  • Example#5922 - Création d'un nouveau DOMEntityReference
  • Example#5923 - Création d'un document avec une DTD attachée
  • Example#5924 - Test votre implémentation DOM
  • Example#5925 - Ajout d'un fils
  • Example#5926 - Enfant imbriqué
  • Example#5927 - Exemple avec DOMNode::getLineNo
  • Example#5928 - Exemple avec DOMNode::getNodePath
  • Example#5929 - Effacement d'un fils
  • Example#5930 - Parcours de toutes les entrées de la table
  • Example#5931 - Création d'un nouveau DOMProcessingInstruction
  • Example#5932 - Création d'un nouveau DOMText
  • Example#5933 - Récupération du nombre total de livres anglais
  • Example#5934 - Récupération de tous les livres anglais
  • Example#5935 - book.xml
  • Example#5936 - Exemple avec DOMXPath::registerPHPFunctions et php:functionString
  • Example#5937 - Exemple avec DOMXPath::registerPHPFunctions et php:function
  • Example#5938 - Importation d'un objet SimpleXML dans DOM avec dom_import_simplexml
  • Example#5939 - Exemple avec libxml_get_errors
  • Example#5940 - Exemple avec libxml_set_external_entity_loader
  • Example#5941 - Exemple avec libxml_set_streams_context
  • Example#5942 - Exemple avec libxml_use_internal_errors
  • Example#5943 - Fichier avec une chaîne XML qui sera inclus partout
  • Example#5944 - Lecture de <plot>
  • Example#5945 - Récupération de <line>
  • Example#5946 - Accéder à un élément non-unique avec SimpleXML
  • Example#5947 - Utilisation des attributs
  • Example#5948 - Comparaison des éléments et des attributs avec du texte
  • Example#5949 - Comparaison de 2 éléments
  • Example#5950 - Utilisation de XPath
  • Example#5951 - Attribuer des valeurs
  • Example#5952 - Ajout d'éléments et d'attributs
  • Example#5953 - Interopérabilité DOM
  • Example#5954 - Chargement de chaînes XML cassées
  • Example#5955 - Ajoute des attributs et enfants à un élément SimpleXML
  • Example#5956 - Ajoute des attributs et des enfants à un élément SimpleXML
  • Example#5957 - Obtenir du XML avec SimpleXML
  • Example#5958 - Utilisation de SimpleXMLElement::asXML avec les résultats de SimpleXMLElement::xpath
  • Example#5959 - Interprétation d'une chaîne XML
  • Example#5960 - Parcours d'un pseudo-tableau children()
  • Example#5961 - Utilisation des espaces de noms
  • Example#5962 - Crée un objet SimpleXMLElement
  • Example#5963 - Crée un objet SimpleXMLElement à partir d'un URL
  • Example#5964 - Comptage du nombre de fils
  • Example#5965 - Récupère les espaces de noms du document
  • Example#5966 - Travail avec plusieurs espaces de noms
  • Example#5967 - Récupère les noms des éléments XML
  • Example#5968 - Récupère les espaces de noms utilisés dans un document
  • Example#5969 - Fixe un préfixe d'espace de nom pour utiliser dans une requête XPath
  • Example#5970 - Récupérer le contenu chaine
  • Example#5971 - Xpath
  • Example#5972 - Retourne l'élément courant
  • Example#5973 - Lecture des sous-éléments de l'objet courant
  • Example#5974 - Vérifie si un élément a des sous-éléments
  • Example#5975 - Le nom de la balise XML courante
  • Example#5976 - Passe au prochain élément
  • Example#5977 - Retour au premier élément
  • Example#5978 - Vérifie si un élément est valide
  • Example#5979 - Import DOM
  • Example#5980 - Interprétation d'un document XML
  • Example#5981 - Convertir une chaîne XML
  • Example#5982 - Linéarisation d'une valeur simple avec WDDX
  • Example#5983 - Utilisation de paquets incrémentaux avec WDDX
  • Example#5984 - Exemple avec wddx_serialize_vars
  • Example#5985 - Afficher une structure XML
  • Example#5986 - Transtypage XML -> HTML
  • Example#5987 - Entité externe
  • Example#5988 - xmltest.xml
  • Example#5989 - xmltest2.xml
  • Example#5990 - Exemple avec xml_parse_into_struct
  • Example#5991 - moldb.xml - Petite base de données moléculaires
  • Example#5992 - parsemoldb.php : Analyse moldb.xml et crée un tableau d'objets moléculaires
  • Example#5993 - Analyse de gros documents XML par morceaux
  • Example#5994 - Exemple avec xml_set_object
  • Example#5995 - Validation XML
  • Example#5996 - Créer un document XML basique
  • Example#5997 - Travailler avec les espaces de noms XML
  • Example#5998 - Travailler avec l'API OO
  • Example#5999 - Écrire directement de l'XML
  • Example#6000 - XMLWriter::setIndent et divers contenus
  • Example#6001 - Utilisation Basique de XMLWriter::startAttribute
  • Example#6002 - Mélanger des Sous-éléments et Attributs
  • Example#6003 - Utilisation Basique de xmlwriter_write_cdata
  • Example#6004 - collection.xml
  • Example#6005 - collection.xsl
  • Example#6006 - fruits.xml
  • Example#6007 - fruits.xsl
  • Example#6008 - Collating and printing errors
  • Example#6009 - Exemple avec XSLTProcessor
  • Example#6010 - Test du support EXSLT
  • Example#6011 - Appel d'une fonction PHP depuis une feuille de style
  • Example#6012 - Modification du propriétaire avant la transformation
  • Example#6013 - Exemple d'utilisation du profilage
  • Example#6014 - Transformation en un document DOM
  • Example#6015 - Transformation en un fichier HTML
  • Example#6016 - Transformation en une chaîne
  • Example#6017 - Un élément de formulaire HTML caché
  • Example#6018 - Données éditables par l'utilisateur
  • Example#6019 - Dans une URL
  • Example#6020 - Génération de Javascript avec PHP
  • Example#6021 - Exemple de code PHP/FI
  • Example#6022 - Active la sortie d'erreur à l'écran pour dev.site.com
  • Example#6023 - Ajoute un script de sécurité pour les zones protégées
  • Example#6024 - include_path sous Unix
  • Example#6025 - include_path sous Windows
  • Example#6026 - include_path sous Unix en utilisant la variable d'environnement ${USER}
  • Example#6027 - string.rot13
  • Example#6028 - string.toupper
  • Example#6029 - string.tolower
  • Example#6030 - string.strip_tags
  • Example#6031 - convert.base64-encode & convert.base64-decode
  • Example#6032 - convert.quoted-printable-encode & convert.quoted-printable-decode
  • Example#6033 - convert.iconv.*
  • Example#6034 - zlib.deflate and zlib.inflate
  • Example#6035 - zlib.deflate simple
  • Example#6036 - bzip2.compress et bzip2.decompress
  • Example#6037 - Chiffrement / Déchiffrement avec with Blowfish
  • Example#6038 - Chiffrer un fichier en utilisant AES-128 CBC avec SHA256 HMAC

User Contributed Notes

There are no user contributed notes for this page.


Historique des modifications

Les modifications suivantes ont été apportées aux fonctions des extensions embarquées.

Version | Function | Description
PECL OCI8 1.4 | oci_set_prefetch | Avant cette version, rows doit être >= 1.
PECL OCI8 1.3.4 | oci_set_prefetch | Avant cette version, le préchargement était limité et devait être inférieur aux nombres de lignes définies par le paramètre rows ainsi qu'à 1024 * rows octets. La restriction sur la taille en octets a maintenant disparu.
PECL 3.0.0 | IntlDateFormatter::format | Il est maintenant possible de passer un objet IntlCalendar comme valeur du paramètre datetime.
8.0.3 | bind_textdomain_codeset | codeset est désormais nullable. Auparavant, il n'était pas possible de récupérer l'encodage actuellement défini.
bindtextdomain | directory est désormais nullable. Auparavant, il n'était pas possible de récupérer le dossier actuellement défini.
8.0.0, PECL OCI8 3.0.0 | OCICollection::append | La classe OCI-Collection a été renommée en OCICollection pour aligner avec les standards de nommage PHP.
OCICollection::assign | La classe OCI-Collection a été renommée en OCICollection pour aligner avec les standards de nommage PHP.
OCICollection::assignElem | La classe OCI-Collection a été renommée en OCICollection pour aligner avec les standards de nommage PHP.
OCICollection::free | La classe OCI-Collection a été renommée en OCICollection pour aligner avec les standards de nommage PHP.
OCICollection::getElem | La classe OCI-Collection a été renommée en OCICollection pour aligner avec les standards de nommage PHP.
OCICollection::max | La classe OCI-Collection a été renommée en OCICollection pour aligner avec les standards de nommage PHP.
OCICollection::size | La classe OCI-Collection a été renommée en OCICollection pour aligner avec les standards de nommage PHP.
OCICollection::trim | La classe OCI-Collection a été renommée en OCICollection pour aligner avec les standards de nommage PHP.
OCILob::append | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::close | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::eof | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::erase | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::export | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::flush | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::free | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::getBuffering | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::import | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::load | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::read | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::rewind | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::save | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::saveFile | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::seek | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::setBuffering | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::size | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::tell | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::truncate | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::write | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::writeTemporary | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
OCILob::writeToFile | La classe OCI-Lob a été renommée en OCILob pour aligner avec les standards de nommage PHP.
8.0.0 / 1.18.1 | ZipArchive::addGlob | "comp_method", "comp_flags", "enc_method" et "enc_password" dans options ont été ajouté.
8.0.0 / 1.18.0 | ZipArchive::addEmptyDir | flags a été ajouté.
ZipArchive::addFile | flags a été ajouté.
ZipArchive::addFromString | flags a été ajouté.
ZipArchive::addGlob | flags a été ajouté.
ZipArchive::getStatusString | Cette méthode peut être appelé sur une archive fermée.
ZipArchive::getStatusString | Cette méthode ne retourne plus false en cas d'échec.
8.0.0 | CURLFile::__construct | mime_type and posted_filename are nullable now; previously their default was 0.
DateTime::format | Antérieur à cette version, false était retourné en cas d'échec.
DateTime::format | Le caractère de format p a été ajouté.
DateTime::getOffset | Antérieur à cette version, false était retourné en cas d'échec.
DateTime::getTimestamp | Ces fonctions ne retourne plus false en cas d'échec.
DateTimeZone::getOffset | Antérieur à cette version, false était retourné en cas d'échec.
DateTimeZone::listIdentifiers | Antérieur à cette version, false était retourné en cas d'échec.
DOMImplementation::createDocument | doctype is now nullable.
apache_note | note_value est désormais nullable.
array_filter | callback est désormais nullable.
array_splice | length est désormais nullable.
bcadd | scale est désormais nullable.
bccomp | scale est désormais nullable.
bcdiv | scale est désormais nullable.
bcmod | scale est désormais nullable.
bcmul | scale est désormais nullable.
bcpowmod | scale est désormais nullable.
bcscale | scale est désormais nullable.
bcsqrt | scale est désormais nullable.
bcsub | scale est désormais nullable.
bzdecompress | Le type de use_less_memory a été modifié de int à bool. Auparavant, la valeur par défaut était 0.
bzwrite | length est désormais nullable.
com_event_sink | sink_interface is nullable now.
com_get_active_object | codepage est désormais nullable.
convert_uuencode | Antérieur à cette version, tenter de convertir une chaîne vide retournait false pour aucune raison particulière.
count_chars | Antérieur à cette version, la fonction retournait false en cas d'échec.
crypt | Le salt n'est plus optionnel.
curl_close | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_copy_handle | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_copy_handle | En cas de succès, cette fonction retourne désormais une instance de CurlHandle; auparavant uneresource était retourné.
curl_errno | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_error | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_escape | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_exec | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_getinfo | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_getinfo | option is nullable now; previously, the default was 0.
curl_init | url est désormais nullable.
curl_init | Cette fonction retourne désormais une instance de CurlHandle; auparavant, une resource était retournée.
curl_multi_add_handle | multi_handle attend désormais une instance de CurlMultiHandle; auparavant; une resource était attendue.
curl_multi_add_handle | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_multi_close | multi_handle attend désormais une instance de CurlMultiHandle; auparavant; une resource était attendue.
curl_multi_errno | Cette fonction ne retourne plus false en cas d'échec.
curl_multi_errno | multi_handle attend désormais une instance de CurlMultiHandle; auparavant; une resource était attendue.
curl_multi_exec | multi_handle attend désormais une instance de CurlMultiHandle; auparavant; une resource était attendue.
curl_multi_getcontent | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_multi_info_read | multi_handle attend désormais une instance de CurlMultiHandle; auparavant; une resource était attendue.
curl_multi_init | Cette fonction retourne désormais une instance de CurlMultiHandle; auparavant, une resource était retournée.
curl_multi_remove_handle | multi_handle attend désormais une instance de CurlMultiHandle; auparavant; une resource était attendue.
curl_multi_remove_handle | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_multi_select | multi_handle attend désormais une instance de CurlMultiHandle; auparavant; une resource était attendue.
curl_multi_setopt | multi_handle attend désormais une instance de CurlMultiHandle; auparavant; une resource était attendue.
curl_pause | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_reset | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_setopt | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_setopt_array | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
curl_share_close | share_handle attend désormais une instance de CurlShareHandle; auparavant; une resource était attendue.
curl_share_errno | The function no longer returns false on failure.
curl_share_errno | share_handle attend désormais une instance de CurlShareHandle; auparavant; une resource était attendue.
curl_share_init | Cette fonction retourne désormais une instance de CurlShareHandle; auparavant, une resource était retournée.
curl_share_setopt | share_handle attend désormais une instance de CurlShareHandle; auparavant; une resource était attendue.
curl_unescape | handle attend désormais une instance de CurlHandle; auparavant; une resource était attendue.
date | timestamp est désormais nullable.
date_sunrise | latitude, longitude, zenith et utcOffset sont désormais nullable.
date_sunset | latitude, longitude, zenith et utcOffset sont désormais nullable.
deflate_add | context expects a DeflateContext instance now; previously, a resource was expected.
deflate_init | On success, this function returns a DeflateContext instance now; previously, a resource was returned.
easter_date | year est désormais nullable.
easter_days | year est désormais nullable.
enchant_broker_describe | Antérieur à cette version, cette fonction retournait false en cas d'échec.
enchant_broker_describe | broker attend désormais une instance de EnchantBroker ; auparavant, une ressource était attendu.
enchant_broker_dict_exists | broker attend désormais une instance de EnchantBroker ; auparavant, une ressource était attendu.
enchant_broker_free | broker attend désormais une instance de EnchantBroker ; auparavant, une ressource était attendu.
enchant_broker_free_dict | dictionary attend désormais une EnchantDictionary; auparavant, une ressource était attendu.
enchant_broker_get_dict_path | broker attend désormais une instance de EnchantBroker ; auparavant, une ressource était attendu.
enchant_broker_get_error | broker attend désormais une instance de EnchantBroker ; auparavant, une ressource était attendu.
enchant_broker_init | En cas de succès, cette fonction retourne désormais une instance de EnchantBroker ; auparavant une ressource était retournée.
enchant_broker_list_dicts | broker attend désormais une instance de EnchantBroker ; auparavant, une ressource était attendu.
enchant_broker_list_dicts | Antérieur à cette version, la fonction retournait false en cas d'échec.
enchant_broker_request_dict | En cas de succès, cette fonction retourne désormais une instance de EnchantDictionary ; auparavant une ressource était retournée.
enchant_broker_request_dict | broker attend désormais une instance de EnchantBroker ; auparavant, une ressource était attendu.
enchant_broker_request_pwl_dict | broker attend désormais une instance de EnchantBroker ; auparavant, une ressource était attendu.
enchant_broker_request_pwl_dict | En cas de succès, cette fonction retourne désormais une instance de EnchantDictionary ; auparavant une ressource était retournée.
enchant_broker_set_dict_path | broker attend désormais une instance de EnchantBroker ; auparavant, une ressource était attendu.
enchant_broker_set_ordering | broker attend désormais une instance de EnchantBroker ; auparavant, une ressource était attendu.
enchant_dict_add | dictionary attend désormais une instance de EnchantDictionary ; auparavant, une ressource était attendu.
enchant_dict_add_to_session | dictionary attend désormais une instance de EnchantDictionary ; auparavant, une ressource était attendu.
enchant_dict_check | dictionary attend désormais une instance de EnchantDictionary ; auparavant, une ressource était attendu.
enchant_dict_describe | dictionary attend désormais une instance de EnchantDictionary ; auparavant, une ressource était attendu.
enchant_dict_describe | Antérieur à cette version, cette fonction retournait false en cas d'échec.
enchant_dict_get_error | dictionary attend désormais une instance de EnchantDictionary ; auparavant, une ressource était attendu.
enchant_dict_is_added | dictionary attend désormais une instance de EnchantDictionary ; auparavant, une ressource était attendu.
enchant_dict_quick_check | dictionary attend désormais une instance de EnchantDictionary ; auparavant, une ressource était attendu.
enchant_dict_store_replacement | dictionary attend désormais une instance de EnchantDictionary ; auparavant, une ressource était attendu.
enchant_dict_suggest | dictionary attend désormais une instance de EnchantDictionary ; auparavant, une ressource était attendu.
exif_read_data | required_sections est désormais nullable.
finfo_buffer | context est désormais nullable.
finfo_file | context est désormais nullable.
fsockopen | timeout est désormais nullable.
getdate | timestamp est désormais nullable.
gmdate | timestamp est désormais nullable.
gmmktime | hour n'est plus optionnel.
gmmktime | minute, second, month, day et year sont désormais nullable.
gmp_binomial | Cette fonction ne retourne plus false en cas d'échec.
gmp_export | Cette fonction ne retourne plus false en cas d'échec.
gmp_import | Cette fonction ne retourne plus false en cas d'échec.
gmstrftime | timestamp est désormais nullable.
gzgets | length est désormais nullable ; auparavant, la valeur par défaut était 1024.
gzwrite | length est désormais nullable; auparavant la valeur par défaut était 0.
hash_update_file | stream_context est désormais nullable.
html_entity_decode | encoding est désormais nullable.
htmlentities | encoding est désormais nullable.
iconv_mime_decode | encoding est désormais nullable.
iconv_mime_decode_headers | encoding est désormais nullable.
iconv_strlen | encoding est désormais nullable.
iconv_strpos | encoding est désormais nullable.
iconv_strrpos | encoding est désormais nullable.
iconv_substr | length et encoding sont désormais nullable.
idate | timestamp est désormais nullable.
ignore_user_abort | enable est désormais nullable.
imagexbm | Le quatrième paramètre, qui n'était pas utilisé, a été supprimé.
imap_append | options et internal_date sont désormais nullable.
imap_headerinfo | Le paramètre defaulthost inutilisé a été supprimé.
imap_mail | additional_headers, cc, bcc, et return_path sont désormais nullable.
imap_sort | reverse est un bool au lieu de int.
imap_sort | search_criteria et charset sont désormais nullable.
implode | Passer le separator après array n'est plus supporté.
inflate_add | context expects an InflateContext instance now; previously, a resource was expected.
inflate_get_read_len | context expects an InflateContext instance now; previously, a resource was expected.
inflate_get_status | context expects an InflateContext instance now; previously, a resource was expected.
inflate_init | On success, this function returns an InflateContext instance now; previously, a resource was returned.
jdtounix | Cette fonction ne retourne désormais plus false en cas d'échec, mais lève une ValueError à la place.
ldap_add | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_add_ext | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_bind_ext | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_compare | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_delete | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_delete_ext | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_exop_passwd | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_list | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_mod_add | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_mod_del | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_mod_replace | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_modify_batch | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_mod_add_ext | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_mod_del_ext | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_mod_replace_ext | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_read | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_rename | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_rename_ext | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_sasl_bind | dn, password, mech, realm, authc_id, authz_id and props are nullable now.
ldap_search | controls est désormais nullable ; auparavant, sa valeur par défaut était [].
ldap_set_rebind_proc | callback is nullable now.
levenshtein | Antérieur à cette version, levenshtein devait être appelée avec soit deux soit cinq arguments.
libxml_use_internal_errors | use_errors est désormais nullable. Auparavant, sa valeur par défaut était false.
localtime | timestamp est désormais nullable.
mb_check_encoding | value et encoding sont désormais nullable.
mb_chr | encoding est désormais nullable.
mb_convert_encoding | from_encoding est désormais nullable.
mb_convert_kana | encoding est désormais nullable.
mb_decode_numericentity | encoding est désormais nullable.
mb_detect_order | encoding est désormais nullable.
mb_encode_mimeheader | charset et transfer_encoding sont désormais nullable.
mb_encode_numericentity | encoding est désormais nullable.
mb_ereg | Cette fonction retourne désormais true en cas de succès. Auparavant, elle retournait la longueur d'octet de la chaîne trouvé, si une correspondence pour pattern était trouvé dans string et que matches était fournis. Si la paramètre optionnel matches n'était pas fournis ou que la longueur de la chaîne correspondante était 0, cette fonction retournait 1.
mb_ereg_match | options is nullable now.
mb_ereg_replace | options est désormais nullable.
mb_ereg_replace_callback | options est désormais nullable.
mb_ereg_search | pattern and options are nullable now.
mb_ereg_search_init | pattern and options are nullable now.
mb_ereg_search_pos | pattern and options are nullable now.
mb_ereg_search_regs | pattern and options are nullable now.
mb_eregi | Cette fonction retourne désormais true en cas de succès. Auparavant, elle retournait la longueur d'octet de la chaîne trouvé, si une correspondence pour pattern était trouvé dans string et que matches était fournis. Si la paramètre optionnel matches n'était pas fournis ou que la longueur de la chaîne correspondante était 0, cette fonction retournait 1.
mb_eregi_replace | options est désormais nullable.
mb_get_info | Les types "func_overload" et "func_overload_list" ne sont désormais plus supporté.
mb_http_input | type est désormais nullable.
mb_http_output | encoding est désormais nullable.
mb_internal_encoding | encoding est désormais nullable.
mb_language | language est désormais nullable.
mb_ord | encoding est désormais nullable.
mb_parse_str | Le second paramètre n'est plus optionnel.
mb_regex_encoding | encoding est désormais nullable.
mb_regex_set_options | Si le paramètre options est fourni et non null, les options précédentes sont retournées. Auparavant, les options courantes étaient retournées.
mb_regex_set_options | options est désormais nullable.
mb_scrub | encoding est désormais nullable.
mb_send_mail | additional_params is nullable now.
mb_str_split | This function no longer returns false on failure.
mb_str_split | encoding est désormais nullable.
mb_strcut | encoding est désormais nullable.
mb_strimwidth | encoding est désormais nullable.
mb_stripos | encoding est désormais nullable.
mb_stristr | encoding est désormais nullable.
mb_strlen | encoding est désormais nullable.
mb_strpos | encoding est désormais nullable.
mb_strrchr | encoding est désormais nullable.
mb_strrichr | encoding est désormais nullable.
mb_strripos | encoding est désormais nullable.
mb_strrpos | encoding est désormais nullable.
mb_strstr | encoding est désormais nullable.
mb_strwidth | encoding est désormais nullable.
mb_substitute_character | Passer une chaîne vide à substitute_character n'est plus supporté; "none" devrait être fourni à la place.
mb_substitute_character | encoding est désormais nullable.
mb_substr | encoding est désormais nullable.
mb_substr_count | encoding est désormais nullable.
metaphone | Cette fonction retournait false en cas d'échec.
mhash | key est désormais nullable.
mktime | minute, second, month, day et year sont désormais nullable.
mktime | hour n'est plus optionnel.
msg_get_queue | En cas de succès, cette fonction retourne une instance de SysvMessageQueue désormais; auparavant, une resource était retournée.
msg_receive | queue attend désormais une SysvMessageQueue; auparavant, une resource était attendue.
msg_remove_queue | queue attend désormais une SysvMessageQueue; auparavant, une resource était attendue.
msg_send | queue attend désormais une SysvMessageQueue; auparavant, une resource était attendue.
msg_set_queue | queue attend désormais une SysvMessageQueue; auparavant, une resource était attendue.
msg_stat_queue | queue attend désormais une SysvMessageQueue; auparavant, une resource était attendue.
number_format | Antérieur à cette version, number_format acceptée un, deux, ou quatre paramètres (mais pas trois).
ob_implicit_flush | flag attend une valeur bool désormais ; auparavant, un int était attendu.
odbc_columns | schema, table and column are now nullable.
odbc_error | odbc is nullable now.
odbc_errormsg | odbc is nullable now.
odbc_exec | flags was removed.
odbc_fetch_row | row is nullable now.
odbc_procedurecolumns | Prior to this version, the function could only be called with either one or five arguments.
odbc_procedures | Prior to this version, the function could only be called with either one or four arguments.
odbc_tables | schema, table and types are now nullable.
openssl_csr_export | csr accepte désormais une instance de OpenSSLCertificateSigningRequest ; auparavant, une ressource de type OpenSSL X.509 CSR était accepté.
openssl_csr_export_to_file | csr accepte désormais une instance de OpenSSLCertificateSigningRequest ; auparavant, une ressource de type OpenSSL X.509 CSR était acceptée.
openssl_csr_get_public_key | csr accepte désormais une instance de OpenSSLCertificateSigningRequest ; auparavant, une ressource de type OpenSSL X.509 CSR était acceptée.
openssl_csr_get_public_key | En cas de succès, cette fonction retourne désormais une instance de OpenSSLAsymmetricKey ; auparavant une ressource de type OpenSSL key était retournée.
openssl_csr_get_subject | csr accepte désormais une instance de OpenSSLCertificateSigningRequest ; auparavant, une ressource de type OpenSSL X.509 CSR était accepté.
openssl_csr_new | csr accepte désormais une instance de OpenSSLCertificateSigningRequest ; auparavant, une ressource de type OpenSSL X.509 CSR était acceptée.
openssl_csr_new | En cas de succès, cette fonction retourne désormais une instance de OpenSSLAsymmetricKey ; auparavant une ressource de type OpenSSL key était retournée.
openssl_csr_sign | ca_certificate accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_csr_sign | En cas de succès, cette fonction retourne désormais une instance de OpenSSLCertificate ; auparavant une ressource de type OpenSSL X.509 était retournée.
openssl_csr_sign | csr accepte désormais une instance de OpenSSLCertificateSigningRequest ; auparavant, une ressource de type OpenSSL X.509 CSR était acceptée.
openssl_csr_sign | ca_certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 était acceptée.
openssl_dh_compute_key | private_key accepte désormais une instance de OpenSSLAsymmetricKey ; auparavant, une ressource de type OpenSSL key était acceptée.
openssl_free_key | key accepte désormais une instance de OpenSSLAsymmetricKey ; auparavant, une ressource de type OpenSSL key était accepté.
openssl_free_key | Cette fonction est désormais obsolète car elle n'a plus d'effet.
openssl_open | private_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 CSR était acceptée.
openssl_open | cipher_algo n'est désormais plus un paramètre optionnel.
openssl_pkcs7_decrypt | private_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 CSR était acceptée.
openssl_pkcs7_encrypt | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 CSR était acceptée.
openssl_pkcs7_sign | private_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_pkcs7_sign | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 CSR était acceptée.
openssl_pkcs7_verify | signers_certificates_filename, untrusted_certificates_filename, content et output_filename sont désormais nullable.
openssl_pkcs12_export | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 CSR était acceptée.
openssl_pkcs12_export | private_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_pkcs12_export_to_file | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 CSR était acceptée.
openssl_pkcs12_export_to_file | private_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_pkey_export | key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_pkey_export_to_file | key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_pkey_free | Cette fonction est désormais obsolète car elle n'a plus d'effet.
openssl_pkey_free | key accepte désormais une instance de OpenSSLAsymmetricKey ; auparavant, une ressource de type OpenSSL key était accepté.
openssl_pkey_get_details | key accepte désormais une instance de OpenSSLAsymmetricKey ; auparavant, une ressource de type OpenSSL key était accepté.
openssl_pkey_get_private | En cas de succès, cette fonction retourne désormais une instance de OpenSSLAsymmetricKey ; auparavant, une ressource de type OpenSSL key était retourné.
openssl_pkey_get_private | private_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_pkey_get_private | passphrase est désormais nullable.
openssl_pkey_get_public | En cas de succès, cette fonction retourne désormais une instance de OpenSSLAsymmetricKey ; auparavant, une ressource de type OpenSSL key était retournée.
openssl_pkey_get_public | public_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_pkey_new | En cas de succès, cette fonction retourne désormais une instance de OpenSSLAsymmetricKey ; auparavant, une ressource de type OpenSSL key était retournée.
openssl_private_decrypt | private_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_private_encrypt | private_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_public_decrypt | public_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_public_encrypt | public_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_random_pseudo_bytes | strong_result est désormais nullable.
openssl_seal | iv est désormais nullable.
openssl_seal | public_key accepte désormais un tableau d'instance de OpenSSLAsymmetricKey ; auparavant, un tableau de ressources de type OpenSSL key était acceptée.
openssl_seal | cipher_algo n'est désormais plus un paramètre optionnel.
openssl_sign | private_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_spki_new | private_key accepte désormais une instance de OpenSSLAsymmetricKey ; auparavant, une ressource de type OpenSSL key était acceptée.
openssl_verify | public_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_x509_check_private_key | private_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_x509_check_private_key | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 était acceptée.
openssl_x509_checkpurpose | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 était acceptée.
openssl_x509_checkpurpose | untrusted_certificates_file est désormais nullable.
openssl_x509_export | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 était acceptée.
openssl_x509_export_to_file | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 était acceptée.
openssl_x509_fingerprint | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 était acceptée.
openssl_x509_free | Cette fonction est désormais obsolète car elle n'a plus d'effet.
openssl_x509_free | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 était accepté.
openssl_x509_parse | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 était acceptée.
openssl_x509_read | En cas de succès, cette fonction retourne désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 était retournée.
openssl_x509_read | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 était acceptée.
openssl_x509_verify | public_key accepte désormais une instance de OpenSSLAsymmetricKey ou OpenSSLCertificate ; auparavant, une ressource de type OpenSSL key ou OpenSSL X.509 était acceptée.
openssl_x509_verify | certificate accepte désormais une instance de OpenSSLCertificate ; auparavant, une ressource de type OpenSSL X.509 était acceptée.
pack | This function no longer returns false on failure.
parse_str | result n'est plus optionnel.
readline_info | var_name et value sont désormais nullable.
readline_read_history | filename est désormais nullable.
readline_write_history | filename est désormais nullable.
sem_acquire | semaphore attend désormais une SysvSemaphore; auparavant, une resource était attendue.
sem_get | Le type de auto_release a été modifié de int à bool.
sem_get | En cas de succès, cette fonction retourne une instance de SysvSemaphore désormais; auparavant; une resource était retourné.
sem_release | semaphore attend désormais une SysvSemaphore; auparavant, une resource était attendue.
sem_remove | semaphore attend désormais une SysvSemaphore; auparavant, une resource était attendue.
session_cache_expire | value est désormais nullable.
session_cache_limiter | value est désormais nullable.
session_id | id est désormais nullable.
session_module_name | module est désormais nullable.
session_name | name est désormais nullable.
session_save_path | path est désormais nullable.
session_set_cookie_params | path, domain, secure et httponly sont désormais nullable.
set_error_handler | errcontext a été supprimé, et ne sera plus passé aux fermetures utilisateur.
set_error_handler | errno ne vaut désormais plus 0 quand l'expression a été ignoré par l' opérateur de contrôle d'erreur @.
shm_attach | En cas de succès, cette fonction retourne une instance de SysvSharedMemory désormais; auparavant; une resource était retourné.
shm_attach | size est désormais nullable.
shm_detach | shm attend une instance de SysvSharedMemory désormais; auparavant, une resource était attendue.
shm_get_var | shm attend une instance de SysvSharedMemory désormais; auparavant, une resource était attendue.
shm_has_var | shm attend une instance de SysvSharedMemory désormais; auparavant, une resource était attendue.
shm_put_var | shm attend une instance de SysvSharedMemory désormais; auparavant, une resource était attendue.
shm_remove | shm attend une instance de SysvSharedMemory désormais; auparavant, une resource était attendue.
shm_remove_var | shm attend une instance de SysvSharedMemory désormais; auparavant, une resource était attendue.
shmop_close | shmop attend une instance de Shmop désormais; auparavant une resource était attendu.
shmop_delete | shmop attend une instance de Shmop désormais; auparavant une resource était attendu.
shmop_open | shmop attend une instance de Shmop désormais; auparavant une resource était attendu.
shmop_read | shmop attend une instance de Shmop désormais; auparavant une resource était attendu.
shmop_size | shmop attend une instance de Shmop désormais; auparavant une resource était attendu.
shmop_write | Antérieur à PHP 8.0.0, false était retourné en cas d'échec.
shmop_write | shmop attend une instance de Shmop désormais; auparavant une resource était attendu.
socket_accept | En cas de succès, cette fonction retourne désormais une instance de Socket ; auparavant, une resource était retournée.
socket_addrinfo_bind | On success, this function returns a Socket instance now; previously, a resource was returned.
socket_addrinfo_bind | address est désormais une instance de AddressInfo ; auparavant, c'était une resource.
socket_addrinfo_connect | address est désormais une instance de AddressInfo ; auparavant, c'était une resource.
socket_addrinfo_connect | On success, this function returns a Socket instance now; previously, a resource was returned.
socket_addrinfo_explain | address est désormais une instance de AddressInfo ; auparavant, c'était une resource.
socket_addrinfo_lookup | service is nullable now.
socket_addrinfo_lookup | On success, this function returns a array of AddressInfo instances now; previously, an array of resources was returned.
socket_bind | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_clear_error | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_clear_error | socket est désormais nullable.
socket_close | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_connect | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_connect | port est désormais nullable.
socket_create | En cas de succès, cette fonction retourne désormais une instance de Socket ; auparavant, une resource était retournée.
socket_create_listen | En cas de succès, cette fonction retourne désormais une instance de Socket ; auparavant, une resource était retournée.
socket_create_pair | pair est une référence à un tableau d'instance de Socket ; auparavant, c'était une référence à un tableau de resources.
socket_export_stream | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_get_option | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_getpeername | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_getsockname | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_import_stream | En cas de succès, cette fonction retourne désormais une instance de Socket ; auparavant, une resource était retournée.
socket_last_error | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_last_error | socket est désormais nullable.
socket_listen | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_read | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_recv | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_recvfrom | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_recvmsg | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_send | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_sendmsg | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_sendto | port est désormais nullable.
socket_sendto | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_set_block | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_set_nonblock | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_set_option | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_shutdown | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_write | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_write | length est désormais nullable.
socket_wsaprotocol_info_export | socket est désormais une instance de Socket ; auparavant, c'était une resource.
socket_wsaprotocol_info_import | On success, this function returns a Socket instance now; previously, a resource was returned.
soundex | Antérieur à cette version, appeler la fonction avec une chaîne vide retournait false pour aucune raison particulière.
sprintf | Cette fonction ne retourne plus false en cas d'échec.
str_word_count | characters est désormais nullable.
strcspn | length est désormais nullable.
strftime | timestamp est désormais nullable.
strip_tags | allowed_tags est désormais nullable.
stripos | Passing an entier as needle is no longer supported.
stristr | Passing an entier as needle is no longer supported.
strpos | Passing an entier as needle is no longer supported.
strrchr | Passing an entier as needle is no longer supported.
strripos | Passing an entier as needle is no longer supported.
strrpos | Passing an entier as needle is no longer supported.
strspn | length est désormais nullable.
strstr | Passing an entier as needle is no longer supported.
strtotime | baseTimestamp est désormais nullable.
substr | Cette fonction retourne une chaîne vide où auparavant elle retournait false
substr | length est désormais nullable.
substr_compare | length est désormais nullable.
substr_count | length est désormais nullable.
substr_replace | length est désormais nullable.
unixtojd | timestamp est désormais nullable.
vsprintf | Cette fonction ne retourne plus false en cas d'échec.
xml_get_current_byte_index | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_get_current_column_number | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_get_current_line_number | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_get_error_code | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_parse | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_parse_into_struct | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_parser_create | Cette fonction retourne désormais une instance de XMLParser; auparavant, une resource était retournée, ou false si une erreur survient.
xml_parser_create | encoding est désormais nullable.
xml_parser_create_ns | Cette fonction retourne désormais une instance de XMLParser; auparavant, une resource était retournée, ou false si une erreur survient.
xml_parser_create_ns | encoding est désormais nullable.
xml_parser_free | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_parser_get_option | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_parser_set_option | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_set_character_data_handler | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_set_default_handler | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_set_element_handler | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_set_end_namespace_decl_handler | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_set_external_entity_ref_handler | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_set_notation_decl_handler | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_set_object | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_set_processing_instruction_handler | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_set_start_namespace_decl_handler | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
xml_set_unparsed_entity_decl_handler | parser attend une instance de XMLParser désormais; auparavent, une resource était attendu.
zip_close | Cette fonction est obsolète en faveur de l'API orientée objet, voir ZipArchive::close.
zip_entry_close | Cette fonction est obsolète en faveur de l'API orientée objet.
zip_entry_compressedsize | Cette fonction est obsolète en faveur de l'API orientée objet, voir ZipArchive::statIndex.
zip_entry_compressionmethod | Cette fonction est obsolète en faveur de l'API orientée objet, voir ZipArchive::statIndex.
zip_entry_filesize | Cette fonction est obsolète en faveur de l'API orientée objet, voir ZipArchive::statIndex.
zip_entry_name | Cette fonction est obsolète en faveur de l'API orientée objet, voir ZipArchive::statIndex.
zip_entry_open | Cette fonction est obsolète en faveur de l'API orientée objet.
zip_entry_read | Cette fonction est obsolète en faveur de l'API orientée objet, voir ZipArchive::getFromIndex.
zip_open | Cette fonction est obsolète en faveur de l'API orientée objet, voir ZipArchive::open.
zip_read | Cette fonction est obsolète en faveur de l'API orientée objet, voir ZipArchive::statIndex.
ReflectionClass::getConstants | filter a été ajouté.
ReflectionClass::getReflectionConstants | filter a été ajouté.
ReflectionMethod::getClosure | object est désormais nullable.
ReflectionParameter::getDefaultValue | Cette méthode permet désormais de récupérer la valeur par défaut de fonctions et méthodes de classe intégré. Auparavant, ReflectionException était émit.
ReflectionParameter::getDefaultValueConstantName | Cette méthode permet désormais de récupérer le nom de la constante de la valeur par défaut de fonctions et méthodes de classe intégré. Auparavant, ReflectionException était émit.
ReflectionProperty::getValue | object est désormais nullable.
ReflectionProperty::isInitialized | object est désormais nullable.
SoapClient::__doRequest | The type of oneWay is booléen now; formerly it was entier.
SoapClient::__setCookie | value is now nullable.
SoapServer::handle | request is now nullable.
tidy::__construct | filename, config, encoding et useIncludePath sont désormais nullable.
tidy::parseFile | config et encoding sont désormais nullable.
tidy::parseString | config et encoding sont désormais nullable.
tidy::repairFile | config et encoding sont désormais nullable.
tidy::repairFile | tidy::repairFile est désormais une méthode statique.
tidy::repairString | Cette fonction n'accepte plus le paramètre useIncludePath.
tidy::repairString | config et encoding sont désormais nullable.
tidy::repairString | tidy::repairString est désormais une méthode statique.
XMLReader::getAttribute | Cette fonction ne peut plus retourner false.
XMLReader::getAttributeNs | Cette fonction ne peut plus retourner false.
XMLReader::lookupNamespace | Cette fonction ne peut plus retourner false.
XMLReader::next | name est désormais nullable.
XMLReader::open | XMLReader::open est désormais déclaré comme méthode statique, mais peut toujours être appelé sur une instance de XMLReader.
XMLReader::XML | XMLReader::xml est désormais déclaré comme méthode statique, mais peut toujours être appelé sur une instance de XMLReader.
XMLWriter::endAttribute | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::endCdata | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::endComment | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::endDocument | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::endDtd | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::endDtdAttlist | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::endDtdElement | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::endDtdEntity | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::endElement | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::endPi | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::flush | Cette fonction ne peut plus retourner false.
XMLWriter::flush | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::fullEndElement | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::openMemory | Cette fonction retourne désormais une instance de XMLWriter en cas de succès. Auparavant, une ressource était retournée dans ce cas.
XMLWriter::openUri | Cette fonction retourne désormais une instance de XMLWriter en cas de succès. Auparavant, une ressource était retournée dans ce cas.
XMLWriter::outputMemory | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::setIndent | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::setIndentString | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::startAttribute | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::startAttributeNs | prefix est désormais nullable.
XMLWriter::startAttributeNs | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::startCdata | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::startComment | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::startDocument | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::startDtd | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::startDtdAttlist | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::startDtdElement | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::startDtdEntity | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::startElement | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::startElementNs | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::startPi | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::text | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::writeAttribute | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::writeAttributeNs | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::writeCdata | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::writeComment | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::writeDtd | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::writeDtdAttlist | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::writeDtdElement | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::writeDtdEntity | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::writeDtdEntity | publicId, systemId et notationData sont désormais nullable.
XMLWriter::writeElement | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::writeElementNs | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::writePi | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
XMLWriter::writeRaw | writer attend une instance de XMLWriter désormais; auparavant, une resource était attendu.
ZipArchive::setEncryptionIndex | password est désormais nullable.
ZipArchive::setEncryptionName | password est désormais nullable.
7.4.4 | proc_open | Ajout de l'option create_new_console au paramètre other_options.
7.4.0 | array_merge | Cette fonction peut désormais être appelée sans paramètres. Auparavant, au moins un paramètre était requis.
array_merge_recursive | Cette fonction peut désormais être appelée sans paramètres. Auparavant, au moins un paramètre était requis.
base_convert | Passer des caractères invalides génèrera désormais une notice obsolète. Le résultat sera toujours calculé comme si les caractères invalides n'existaient pas.
bindec | Passer des caractères invalides génèrera désormais une notice obsolète. Le résultat sera toujours calculé comme si les caractères invalides n'existaient pas.
chr | Cette fonction n'accepte plus silencieusement les codepoints non supporté, et casts ces valeurs à 0.
fgetcsv | Le paramètre escape accepte désormais une chaîne de caractère vide afin de désactiver le mécanisme d'échapement propriétaire.
fputcsv | Le paramètre escape accepte désormais une chaîne de caractères vide afin de désactiver le mécanisme d'échapement propriétaire.
get_declared_classes | Précédement get_declared_classes retournait toujours les classes parentes avant les classes enfant. Ceci n'est plus le cas. Aucun ordre particulier n'est garentie pour la valeur de retour de get_declared_classes.
get_magic_quotes_gpc | Cette fonction a été rendue obsolète.
get_magic_quotes_runtime | Cette fonction a été rendue obsolète.
gzread | Cette fonction retourne désormais false en cas d'échec; auparavant 0 était retourné.
gzwrite | Cette fonction retourne désormais false en cas d'échec; auparavant 0 était retourné.
hash_algos | Support pour crc32c a été ajouté.
hexdec | Passer des caractères invalides génèrera désormais une notice obsolète. Le résultat sera toujours calculé comme si les caractères invalides n'existaient pas.
idn_to_ascii | La valeur par défaut du paramètre variant est maintenant INTL_IDNA_VARIANT_UTS46 à la place de la constante INTL_IDNA_VARIANT_2003 déprécié.
idn_to_utf8 | La valeur par défaut du paramètre variant est maintenant INTL_IDNA_VARIANT_UTS46 à la place de la constante INTL_IDNA_VARIANT_2003 déprécié.
imagecropauto | La valeur par défault de mode a été modifié en IMG_CROP_AUTO. Auparavant, la valeur par défaut était -1 qui correspond à IMG_CROP_DEFAULT, mais passer -1 est désormais obsolète.
imagecropauto | Le comportement de imagecropauto de la bibliothèque libgd intégré a été syncrhonisé avec celle de libgd système : IMG_CROP_DEFAULT n'utilise plus IMG_CROP_SIDES comme solution de replis et la tolérance de rognage utilise désormais le même algorithme que libgd système.
imagefilter | Support de dispersion (IMG_FILTER_SCATTER) ajouté.
implode | Passer separator après les array (i.e. utilisant la signature antérieure) a été rendu obsolète.
ldap_control_paged_result | Cette fonction est devenue obsolète.
ldap_control_paged_result_response | Cette fonction est devenue obsolète.
money_format | Cette fonction est obsolète. Utiliser NumberFormatter::formatCurrency à la place.
octdec | Passer des caractères invalides génèrera désormais une notice obsolète. Le résultat sera toujours calculé comme si les caractères invalides n'existaient pas.
password_hash | Le paramètre algo attend désormais une chaîne de caractères, mais continue d'accepter un entier afin de conserver une compatibilité antérieure.
password_needs_rehash | Le paramètre algo attend désormais une chaîne de caractères, mais continue d'accepter un entier afin de conserver une compatibilité antérieure.
preg_replace_callback | Le paramètre flags a été ajouté.
preg_replace_callback_array | Le paramètre flags a été ajouté.
proc_open | Ajout de l'option create_process_group au paramètre other_options.
proc_open | proc_open accepte désormais un tableau pour cmd.
stat | Sous Windows, le numéro du volume est maintenant le numéro de série qui contient le fichier, et le numéro de l'inode est l'identifiant associé avec le fichier.
stat | Les valeurs statiques size, atime, mtime et ctime des liens symboliques sont toujours ceux de la cible. Ce n'était précédemment pas le cas This was previously not the case for NTS builds on Windows.
str_getcsv | Le paramètre escape interprète désormais une chaîne vide en tant que signal de désactiver le mécanisme d'échappement propriétaire. Auparavant, une chaîne vide était traité comme la valeur par défaut du paramètre.
strip_tags | allowed_tags accepte désormais un tableau.
SplFileObject::fgetcsv | Le paramètre escape accepte désormais une chaîne de caractère vide afin de désactivé le mécanisme d'échapement propriétaire.
SplFileObject::fputcsv | Le paramètre escape accepte désormais une chaîne de caractères vide afin de désactivé le mécanisme d'échapement propriétaire.
SplFileObject::fwrite | Cette fonction retourne désormais false au lieu de zéro en cas d'échec.
SplFileObject::getCsvControl | Le caractère d'espacement peut désormais être une chaîne vide.
SplFileObject::setCsvControl | Le paramètre escape accepte désormais une chaîne de caractère vide afin de désactivé le mécanisme d'échapement propriétaire.
SQLite3Stmt::bindParam | param supporte désormais la notation @param.
SQLite3Stmt::bindValue | param supporte désormais la notation @param.
7.3.24, 7.4.12 | jdtounix | La limite supérieure du paramètre julian_day a été étendue. Avant, elle était de 2465342 suivant l'architecture.
tidyNode::isHtml | Cette fonction a été corrigée pour avoir un comportement raisonnable. Auparavant, la plupart des noeuds était rapporté comme étant un noeud HTML.
7.3.15, 7.4.3 | curl_setopt | Introduction de la constante CURLOPT_HTTP09_ALLOWED.
7.3.14, 7.4.2 | dba_open | Le pilote lmdb supporte désormais un paramètre additionel $mapsize.
7.3.0 | DateTime::createFromFormat | Le spécificateur de format v a été ajouté.
apache_request_headers | Cette fonction devient disponible pour l'API serveur (SAPI) FPM (FastCGI Process Manager).
array_push | Cette fonction peut désormais être appelée avec un seul paramètre. Auparavant, au moins deux paramètres étaient requis.
array_unshift | Cette fonction peut désormais être appelée avec un seul paramètre. Auparavant, au moins deux paramètres étaient requis.
bcmul | bcmul retourne désormais les nombres avec la précision demandé. Auparavant, les nombres retournés pouvait omettre les zéros décimaux trainant à la fin.
bcpow | bcpow retourne désormais les nombres avec la précision demandé. Auparavant, les nombres retournés pouvait omettre les zéros décimaux trainant à la fin.
bcscale | bcscale peut désormais être utilisée pour récupérer la précision actuelle ; quand elle est utilisée pour définir une nouvelle précision, elle retourne désormais l'ancienne précision. Auparavant, scale était obligatoire, et bcscale retournait toujours true.
compact | compact émet maintenant une erreur de niveau E_NOTICE si une chaîne donnée fait référence à une variable non définie. Autrefois, ces chaînes ont été silencieusement ignorées.
curl_getinfo | Ajout de CURLINFO_CONTENT_LENGTH_DOWNLOAD_T, CURLINFO_CONTENT_LENGTH_UPLOAD_T, CURLINFO_HTTP_VERSION, CURLINFO_PROTOCOL, CURLINFO_PROXY_SSL_VERIFYRESULT, CURLINFO_SCHEME, CURLINFO_SIZE_DOWNLOAD_T, CURLINFO_SIZE_UPLOAD_T, CURLINFO_SPEED_DOWNLOAD_T, CURLINFO_SPEED_UPLOAD_T, CURLINFO_APPCONNECT_TIME_T, CURLINFO_CONNECT_TIME_T, CURLINFO_FILETIME_T, CURLINFO_NAMELOOKUP_TIME_T, CURLINFO_PRETRANSFER_TIME_T, CURLINFO_REDIRECT_TIME_T, CURLINFO_STARTTRANSFER_TIME_T, CURLINFO_TOTAL_TIME_T.
curl_setopt | Introduit CURLOPT_ABSTRACT_UNIX_SOCKET, CURLOPT_KEEP_SENDING_ON_ERROR, CURLOPT_PRE_PROXY, CURLOPT_PROXY_CAINFO, CURLOPT_PROXY_CAPATH, CURLOPT_PROXY_CRLFILE, CURLOPT_PROXY_KEYPASSWD, CURLOPT_PROXY_PINNEDPUBLICKEY, CURLOPT_PROXY_SSLCERT, CURLOPT_PROXY_SSLCERTTYPE, CURLOPT_PROXY_SSL_CIPHER_LIST, CURLOPT_PROXY_SSLKEY, CURLOPT_PROXY_SSLKEYTYPE, CURLOPT_PROXY_SSL_OPTIONS, CURLOPT_PROXY_SSL_VERIFYHOST, CURLOPT_PROXY_SSL_VERIFYPEER, CURLOPT_PROXY_SSLVERSION, CURLOPT_PROXY_TLSAUTH_PASSWORD, CURLOPT_PROXY_TLSAUTH_TYPE, CURLOPT_PROXY_TLSAUTH_USERNAME, CURLOPT_SOCKS5_AUTH, CURLOPT_SUPPRESS_CONNECT_HEADERS, CURLOPT_DISALLOW_USERNAME_IN_URL, CURLOPT_DNS_SHUFFLE_ADDRESSES, CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS, CURLOPT_HAPROXYPROTOCOL, CURLOPT_PROXY_TLS13_CIPHERS, CURLOPT_SSH_COMPRESSION, CURLOPT_TIMEVALUE_LARGE et CURLOPT_TLS13_CIPHERS.
define | case_insensitive est obsolète et sera supprimée dans la version 8.0.0.
ftp_fget | Le paramètre mode est maintenant optionel. Précédemment il était obligatoire.
ftp_fput | Le paramètre mode est maintenant optionnel. Précédemment il était obligatoire.
ftp_get | Le paramètre mode est maintenant optionel. Précédemment il était obligatoire.
ftp_nb_fget | Le paramètre mode est maintenant optionel. Précédemment il était obligatoire.
ftp_nb_fput | Le paramètre mode est maintenant optionel. Précédemment il était obligatoire.
ftp_nb_get | Le paramètre mode est maintenant optionnel. Précédemment il était obligatoire.
ftp_nb_put | Le paramètre mode est maintenant optionel. Précédemment il était obligatoire.
ftp_put | Le paramètre mode est maintenant optionel. Précédemment il était obligatoire.
getallheaders | Cette fonction devient disponible pour l'API serveur (SAPI) FPM (FastCGI Process Manager).
imagecreatefromstring | WEBP est désormais supporté (si supporté par la libgd utilisé).
is_countable | is_countable a été ajouté.
json_decode | Le flags JSON_THROW_ON_ERROR a été ajouté.
json_encode | Le flags JSON_THROW_ON_ERROR a été ajoutée.
list | Le support pour l'assignement par référence dans la déstructuration de tableau a été ajouté.
mb_convert_case | Ajout du support de MB_CASE_FOLD, MB_CASE_UPPER_SIMPLE, MB_CASE_LOWER_SIMPLE, MB_CASE_TITLE_SIMPLE, et MB_CASE_FOLD_SIMPLE en tant que mode.
password_hash | Ajout de la prise en charge des mots de passe Argon2id à l'aide de PASSWORD_ARGON2ID.
preg_quote | Le caractère # est maintenant protégé
session_get_cookie_params | L'entrée "samesite" a été ajouté dans le tableau retourné.
session_set_cookie_params | Une signature alternative supportant un tableau d'lifetime_or_options a été ajouté. Cette signature supporte la définition de l'attribut SameSite du cookie.
setcookie | Une signature alternative supportant un tableau d'options a été ajouté. Cette signature supporte la définition de l'attribut SameSite du cookie.
setrawcookie | Une signature alternative supportant un tableau d'options a été ajouté. Cette signature supporte la définition de l'attribut SameSite du cookie.
stripos | Passer un entier comme before_needle a été rendu obsolète.
stristr | Passer un entier comme before_needle a été rendu obsolète.
strpos | Passer un entier comme before_needle a été rendu obsolète.
strrchr | Passer un entier comme before_needle a été rendu obsolète.
strripos | Passer un entier comme before_needle a été rendu obsolète.
strrpos | Passer un entier comme before_needle a été rendu obsolète.
strstr | Passer un entier comme before_needle a été rendu obsolète.
unlink | Sur Windows, il est désormais possible de unlink les fichiers dont les gestionnaires sont utilisés, ce qui auparavant échouait. Cependant, il n'est toujours pas possible de recréer le fichier supprimé, jusqu'à ce que tous ses gestionnaires soient fermés.
var_export | Exporte désormais les objets stdClass en tant qu'un tableau transtyper vers un objet ((object) array( ... )), au lieu d'utiliser la méthode non existante stdClass::__setState. L'effet pratique est que désormais stdClass est exportable, et que le code résultant fonctionnera même sur des versions antérieure de PHP.
xml_set_external_entity_ref_handler | La valeur de retour de handler n'est désormais plus ignoré quand l'extension a été compilé contre libxml. Auparavant, la valeur de retour était ignoré et l'analyse ne s'arrêtait jamais.
7.3 | ldap_add | Support pour controls a été ajouté.
ldap_compare | Support pour controls a été ajouté.
ldap_delete | Support pour controls a été ajouté.
ldap_exop | Support for serverctrls added
ldap_exop_passwd | Support for controls added
ldap_list | Support pour controls a été ajouté.
ldap_mod_add | Support pour controls a été ajouté.
ldap_mod_del | Support pour controls a été ajouté.
ldap_mod_replace | Support pour controls a été ajouté.
ldap_modify_batch | Support pour controls a été ajouté.
ldap_mod_add_ext | Support for controls added
ldap_mod_del_ext | Support for controls added
ldap_mod_replace_ext | Support for controls added
ldap_parse_result | Support pour controls a été ajouté.
ldap_read | Support pour controls a été ajouté.
ldap_rename | Support pour controls a été ajouté.
ldap_rename_ext | Support for controls added
ldap_search | Support pour controls a été ajouté.
7.2.19, 7.3.6, 7.4.0 | DatePeriod::__construct | recurrences doit désormais être plus grand que 0.
7.2.19, 7.3.6 | SplFileObject::__toString | Modifié d'un alias de SplFileObject::current en un alias de SplFileObject::fgets.
7.2.18, 7.3.5 | substr_compare | offset peut désormais être égal à la taille de haystack.
7.2.0 | array_unique | Si flags est SORT_STRING, précédemment array était copié et les éléments non-unique était supprimé (sans compresser le tableau après), mais maintenant un nouveau tableau est construit en ajoutant les éléments unique. Par conséquence le résultat final peut avoir des index numérique différent.
assert | L'utilisation d'une chaîne de caractères en tant qu'assertion est est devenue obsolète. Ceci émet désormais une notice E_DEPRECATED quand assert.active et zend.assertions sont tous les deux définit à 1.
bcmod | num1 et num2 ne sont plus tronqués en entier. Le comportement de bcmod suit fmod plutôt que l'opérateur %.
bcmod | Le paramètre scale a été ajouté.
count | count va maintenant générer un avertissement sur des types dénombrables non valides sont passés au paramètre value.
date_parse | L'élément zone du tableau retourné représente maintenant des secondes au lieu des minutes, et son signe est inversé. Par exemple, -120 est maintenant 7200.
date_parse_from_format | L'élément zone du tableau retourné représente des secondes au lieu de minutes maintenant, et son signe est inversé. Par exemple -120 est maintenant égal à 7200.
exif_read_data | Le paramètre file prend désormais en charge les fichier locaux ou les ressources de flux.
exif_read_data | La prise en charge des formats EXIF suivants a été ajoutée : Samsung DJI Panasonic Sony Pentax Minolta Sigma/Foveon AGFA Kyocera Ricoh Epson
exif_thumbnail | Le paramètre file supporte les fichiers locaux ou les ressources de flux.
get_class | Antérieur à cette version, la valeur par défaut pour object était null et avait le même effet que pas passer de valeur. Désormais null n'est plus la valeur par défaut pour object, et n'est plus une entrée valide.
gettype | Les ressources fermées sont maintenant rapportées en tant que 'resource (closed)'. Précédement la valeur retournée pour des ressources fermées était 'unknown type'.
hash_copy | Accepte et retourne une classe HashContext au lieu d'une ressource.
hash_final | Accepte une HashContext au lieu d'une ressource.
hash_hmac | L'utilisation de fonctions de hachage non cryptographiques (adler32, crc32, crc32b, fnv132, fnv1a32, fnv164, fnv1a64, joaat) a été désactivée.
hash_hmac_file | L'utilisation de fonctions de hachage non cryptographiques (adler32, crc32, crc32b, fnv132, fnv1a32, fnv164, fnv1a64, joaat) a été désactivée.
hash_init | Retourne une HashContext au lieu d'une ressource.
hash_init | L'usage de fonction de hachage non-cryptographique (adler32, crc32, crc32b, fnv132, fnv1a32, fnv164, fnv1a64, joaat) avec HASH_HMAC a été désactivé.
hash_pbkdf2 | L'utilisation de fonctions de hachage non cryptographiques (adler32, crc32, crc32b, fnv132, fnv1a32, fnv164, fnv1a64, joaat) a été désactivée.
hash_update | Accepte une HashContext au lieu d'une ressource.
hash_update_file | Accepte une HashContext au lieu d'une ressource.
hash_update_stream | Accepte une HashContext au lieu d'une ressource.
idn_to_ascii | INTL_IDNA_VARIANT_2003 a été déprécié; utiliser INTL_IDNA_VARIANT_UTS46 à la place.
idn_to_utf8 | INTL_IDNA_VARIANT_2003 a été déprécie; utiliser INTL_IDNA_VARIANT_UTS46 à la place.
imageantialias | imageantialias est maintenant généralement disponible. Auparavant, elle était seulement disponible si PHP a été compilé avec la version groupée de la bibliothèque GD.
imagegd | imagegd permet maintenant de produire des images TrueColor. Auparavant, elles ont été implicitement converties en palette.
imagelayereffect | Ajout de la constante IMG_EFFECT_MULTIPLY (nécessite la libgd système >= 2.1.1 ou la libgd embarquée).
imagetypes | Ajout de la constante IMG_BMP.
is_object | is_object retourne maintenant true pour un objet délinéarisé sans une définition de classe (classe de __PHP_Incomplete_Class). Précédement false était retourné.
json_decode | Les flags JSON_INVALID_UTF8_IGNORE, et JSON_INVALID_UTF8_SUBSTITUTE ont été ajouté.
json_decode | Le paramètre associative est désormais nullable.
json_encode | Les flags JSON_INVALID_UTF8_IGNORE, et JSON_INVALID_UTF8_SUBSTITUTE ont été ajoutées.
mail | Le paramètre additional_params accepte maintenant les array.
mb_check_encoding | Cette fonction accepte maintenant également un tableau comme valeur de value. Auparavant, seules les chaîne de caractères était prises en charge.
mb_convert_encoding | Cette fonction accepte désormais un tableau en tant que string. Auparavant, seulement les chaîne de caractères étaient supportées.
mb_parse_str | Un appel à la fonction mb_parse_str sans le second paramètre est devenu obsolète.
mb_send_mail | Le paramètre additional_headers accepte désormais un tableau.
mt_rand | mt_rand a reçu une correction de bogue pour un bug de polarisation modulo. Cela signifie que les séquences générées avec une valeur d'initialisation spécifique peuvent différer de php 7.1 sur les machines 64-bit.
number_format | number_format a été modifié pour ne plus permettre de retourner -0, précédemment -0 pouvait être retourné pour des cas où num valait -0.01.
openssl_pkcs7_verify | Le paramètre output_filename a été ajouté.
pack | Les types float et double prennent en charge Big Endian et Little Endian.
parse_str | L'utilisation de parse_str sans le second argument émet une note E_DEPRECATED.
password_hash | Ajout de la prise en charge des mots de passe Argon2i à l'aide de PASSWORD_ARGON2I.
preg_match | PREG_UNMATCHED_AS_NULL est maintenant supporté pour le paramètre $flags.
preg_match_all | PREG_UNMATCHED_AS_NULL est maintenant supporté pour le paramètre $flags.
preg_quote | delimiter est désormais nullable.
proc_nice | Cette fonction est maintenant disponible sur Windows.
rand | rand a reçu une correction de bogue pour un bug de polarisation modulo. Cela signifie que les séquences générées dans certain cas spécifiques peuvent différer de php 7.1 sur les machines 64-bit.
read_exif_data | Cet alias de fonction a été déconseillé.
session_abort | Le type de retour de cette fonction est désormais booléen. Auparavant, c'était void.
session_module_name | Il est désormais explicitement interdit de définir le nom du mode en tant que "user". Auparavent, ceci était silencieusement ignoré.
session_name | session_name vérifie l'état de la session, auparavant elle vérifiait uniquement l'état du cookie. Par conséquent, les versions plus anciennes de session_name autorise l'appel de session_name après session_start ce qui peut causer le plantage de PHP et peut donner lieu à des comportements étranges.
session_reset | Le type de retour de cette fonction est désormais booléen. Auparavant, c'était void.
session_set_cookie_params | Cette fonction retourne true en cas de succès ou false si une erreur survient. Auparavant la fonction retourner void.
session_unset | Le type de retour de cette fonction est désormais booléen. Auparavant, c'était void.
session_write_close | Le type de retour de cette fonction est désormais booléen. Auparavant, c'était void.
set_error_handler | errcontext est devenu obsolète. L'usage de ce paramètre émet une notice E_DEPRECATED.
unpack | Les types float et double supporte à la fois l'orientation Big Endian et Little Endian.
utf8_decode | Cette fonction a été déplacée dans le cœur de PHP ; auparavant, il était nécessaire d'installer l'extension XML pour l'utiliser.
utf8_encode | Cette fonction a été déplacée dans le coeur de PHP, auparavant, il était nécessaire d'installer l'extension XML pour l'utiliser.
PDOStatement::debugDumpParams | PDOStatement::debugDumpParams retourne maintenant le SQL envoyé à la base de données, y compris la requête complète, RAW (y compris les espaces réservés remplacés avec leurs valeurs délimitées). Notez que cela ne sera disponible que si les instructions préparées émulées sont activées.
ReflectionClass::getMethods | filter est désormais nullable.
ReflectionClass::getProperties | filter est désormais nullable.
SQLite3::openBlob | Le paramètre flags a été ajouté, permettant d'écrire des BLOBs ; précédement seul la lecture était supporté.
7.1.24, 7.2.12, 7.3.0 | xml_parser_get_option | options supporte désormais XML_OPTION_SKIP_TAGSTART et XML_OPTION_SKIP_WHITE.
7.1.5 | IntlDateFormatter::format | Ajout du support pour fournir un objet générique DateTimeInterface pour le paramètre datetime. Anciennement, seulement les objets valide DateTime étaient supportés.
7.1.4 | PDO::sqliteCreateFunction | Le paramètre flags a été ajouté.
SQLite3::createFunction | Le paramètre flags a été ajouté.
7.1.0 | DateInterval::format | Les caratères de format F et f ont été ajoutés.
DateTime::__construct | A partir de maintenant, les microsecondes sont préremplie avec les valeurs actuelles et non plus avec '00000'.
DateTime::setTime | Le paramètre microsecond a été ajouté.
DateTimeZone::listIdentifiers | countryCode est désormais nullable.
array_rand | L'algorithme interne de génération aléatoire a été modifié pour utiliser le générateur aleatoire de nombre Mersenne Twister au lieu de la fonction aléatoire libc
curl_multi_setopt | Ajout de CURLMOPT_PUSHFUNCTION.
exif_imagetype | Ajout de la prise en charge de WebP.
file_get_contents | Ajout du support pour des positions offset négative.
get_headers | Le paramètre context a été ajouté.
getenv | varname peut désormais être omit pour récupérer un tableau associatif de toutes les variables d'environnement.
getimagesize | Ajout du support de WebP.
getopt | Ajout du paramètre rest_index.
grapheme_extract | Le support des valeurs négatives pour offset a été ajouté.
grapheme_stripos | Ajout du support des offsets négatifs.
grapheme_strpos | Ajout du support des offsets négatifs.
hash_algos | Support pour sha512/224, sha512/256, sha3-224, sha3-256, sha3-384 et sha3-512 ont été ajouté.
iconv_strpos | Suppport pour les offsets négatifs a été ajouté.
json_decode | Une clé JSON vide ("") peut être encodée dans la propriété d'objet vide au lieu d'utiliser une clé avec la valeur _empty_.
json_encode | Le flags JSON_UNESCAPED_LINE_TERMINATORS a été ajoutée.
json_encode | serialize_precision est utilisé à la place de precision lors de l'encodage de valeurs flottantes.
list | Il est maintenant possible de spécifier les clés dans la list. Cela permet de déstructurer des tableaux avec des clés non-entières ou non séquentielles.
long2ip | La type du paramètre ip a été modifié de string en int.
mb_ereg | mb_ereg va maintenant affecter matches à un array vide, si rien ne correspond. Auparavant, les matches n'étaient pas modifiées dans ce cas.
mb_ereg_replace | Cette fonction vérifie si string est valide pour l'encodage courant.
mb_ereg_replace | Le modificateur e est désormais obsolète.
mb_ereg_replace_callback | Cette fonction vérifie si string est valide pour l'encodage courant.
mb_ereg_search_setpos | La prise en charge d'une offset négative a été ajoutée.
mb_eregi | mb_eregi définira désormais matches en un tableau vide, s'il n'y a aucune correspondance. Auparavant, matches n'était pas modifié dans ce cas.
mb_eregi_replace | Le modificateur e est désormais obsolète.
mb_eregi_replace | Cette fonction vérifie si string est valide pour l'encodage courant.
mb_strimwidth | Support pour starts et widths négatifs a été ajouté.
mb_stripos | Support pour offsets négatifs a été ajouté.
mb_strpos | Support pour offsets négatifs a été ajouté.
mt_rand | rand est devenu un alias de mt_rand.
mt_rand | mt_rand a été mis à jour pour utiliser la version corrigée, correcte, de l'algorithme Twister Mersenne. Pour revenir à l'ancien comportement, utilisez mt_srand avec MT_RAND_PHP comme deuxième paramètre.
mt_srand | srand a été changé pour être un alias de mt_srand.
mt_srand | mt_rand a été mis à jour pour utiliser la version corrigé, correcte de l'algorithme de Mersenne Twister. Pour retourner à l'ancien comportement, utilisez mt_srand avec MT_RAND_PHP comme deuxième paramètre.
openssl_csr_new | options supporte désormais curve_name.
openssl_decrypt | Les paramètres tag et aad ont été ajoutée.
openssl_encrypt | Les paramètres tag, aad et tag_length ont été ajoutés.
openssl_pkey_new | L'option curve_name a été ajouté pour permettre la création de clés EC.
output_add_rewrite_var | Avant php 7.1.0, la réécriture des variables définis par output_add_rewrite_var utilisez la même mémoire tampon de sortie du module de session trans sid. Depuis PHP 7.1.0, le tampon de sortie dédié est utilisé, url_rewriter.tags est utilisé uniquement pour les fonctions de sortie, ajout de url_rewriter.hosts.
output_reset_rewrite_vars | Avant php 7.1.0, les variables de réécriture définis par output_add_rewrite_var utilisaient la même mémoire tampon de sortie du module de session trans sid. Depuis PHP 7.1.0, la mémoire tampon de sortie dédiée est utilisée et output_reset_rewrite_vars supprime uniquement les vars de réécriture définis par output_add_rewrite_var.
pcntl_signal | À partir de PHP 7.1.0 le gestionnaire de la fonction de rappel est doté d'un second argument qui contient le siginfo de ce signal spécifique. Ces données sont seulement fournies si le système d'exploitation a la structure siginfo_t. Si le système d'exploitation n'implémente pas siginfo_t NULL est fournit.
pcntl_signal_get_handler | La fonction pcntl_signal_get_handler a été ajoutée.
pg_fetch_all | Le paramètre result_type a été ajouté.
pg_last_notice | Le paramètre option a été ajouté.
pg_select | Le paramètre result_type a été ajouté.
rand | rand a été fait un alias de mt_rand.
session_start | session_start retourne maintenant false et n'initialise plus $_SESSION lorsqu'il n'a pas pu démarrer la session.
shuffle | L'algorithme interne de génération aléatoire a été modifié pour utiliser le générateur de nombre aléatoire Mersenne Twister au lieu de la fonction libc rand.
srand | srand est devenu un alias de mt_srand.
str_shuffle | L'algorithme de randomisation a été modifié pour utiliser le Générateur de Nombre Aléatoire Mersenne Twister à la place de la fonction rand de libc.
stripos | Ajout du support des nombres négatifs pour le paramètre offset.
strpos | Ajout du support des nombres négatifs pour le paramètre offset.
substr_count | Ajout du support des nombres négatifs pour offset et length. length peut aussi être 0 maintenant.
unpack | La position offset optionnelle à été ajouté.
unserialize | L'élément allowed_classes de options) est maintenant strictement typé, c'est à dire si quelque chose autre qu'un tableau array ou un booléan bool est donné unserialize retourne false et émet une E_WARNING.
ReflectionType::__toString | ReflectionType::__toString a été rendu obsolète.
SessionHandler::gc | Antérieur à cette version, cette fonction retournée true en cas de succès.
SessionHandlerInterface::gc | Prior to this version, the function returned true on success.
7.0.16, 7.1.2 | dns_get_record | Ajout du support pour les enregistrements de type CAA.
fopen | L'option 'e' a été ajoutée.
7.0.15, 7.1.1 | get_defined_functions | Le paramètre exclude_disabled a été ajouté.
7.0.15,7.1.1 | pack | Les codes "e", "E", "g" and "G" ont été ajouté pour activer la prise en charge de l'ordre des octets pour les nombres à virgule flottante simple et double précision.
7.0.11 | iconv_substr | Si string est égal à offset caractères long, une chaîne vide sera retournée. Antérieur à cette version, false était retourné dans ce cas.
7.0.10 | imagetypes | Ajout de la constante IMG_WEBP.
SQLite3::__construct | Le filename peut maintenant être vide pour utiliser une base de données privée, temporaire sur disque.
7.0.7 | curl_multi_setopt | Ajout de CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, CURLMOPT_MAX_HOST_CONNECTIONS, CURLMOPT_MAX_PIPELINE_LENGTH et CURLMOPT_MAX_TOTAL_CONNECTIONS.
curl_setopt | Introduit CURL_HTTP_VERSION_2, CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE, CURL_HTTP_VERSION_2TLS, CURL_REDIR_POST_301, CURL_REDIR_POST_302, CURL_REDIR_POST_303, CURL_REDIR_POST_ALL, CURL_VERSION_KERBEROS5, CURL_VERSION_PSL, CURL_VERSION_UNIX_SOCKETS, CURLAUTH_NEGOTIATE, CURLAUTH_NTLM_WB, CURLFTP_CREATE_DIR, CURLFTP_CREATE_DIR_NONE, CURLFTP_CREATE_DIR_RETRY, CURLHEADER_SEPARATE, CURLHEADER_UNIFIED, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, CURLMOPT_MAX_HOST_CONNECTIONS, CURLMOPT_MAX_PIPELINE_LENGTH, CURLMOPT_MAX_TOTAL_CONNECTIONS, CURLOPT_CONNECT_TO, CURLOPT_DEFAULT_PROTOCOL, CURLOPT_DNS_INTERFACE, CURLOPT_DNS_LOCAL_IP4, CURLOPT_DNS_LOCAL_IP6, CURLOPT_EXPECT_100_TIMEOUT_MS, CURLOPT_HEADEROPT, CURLOPT_LOGIN_OPTIONS, CURLOPT_PATH_AS_IS, CURLOPT_PINNEDPUBLICKEY, CURLOPT_PIPEWAIT, CURLOPT_PROXY_SERVICE_NAME, CURLOPT_PROXYHEADER, CURLOPT_SASL_IR, CURLOPT_SERVICE_NAME, CURLOPT_SSL_ENABLE_ALPN, CURLOPT_SSL_ENABLE_NPN, CURLOPT_SSL_FALSESTART, CURLOPT_SSL_VERIFYSTATUS, CURLOPT_STREAM_WEIGHT, CURLOPT_TCP_FASTOPEN, CURLOPT_TFTP_NO_OPTIONS, CURLOPT_UNIX_SOCKET_PATH, CURLOPT_XOAUTH2_BEARER, CURLPROTO_SMB, CURLPROTO_SMBS, CURLPROXY_HTTP_1_0, CURLSSH_AUTH_AGENT et CURLSSLOPT_NO_REVOKE.
7.0.0 | array_column | Ajout de la possibilité pour les array paramètres d'être un tableau ou un objet.
assert | assert est maintenant une construction de langage et non une fonction. assertion peut maintenant être une expression. Le second paramètre est maintenant interprété soit comme une exception (si un objet Throwable est fourni), soit comme une description supportée depuis PHP 5.4.8 et ultérieur.
current | array est maintenant toujours passé par valeur. Précédemment à cette version,il était passé par référence si possible et par valeur dans les autres cas.
define | Les valeurs array sont autorisées.
dirname | Ajout du paramètre optionnel levels.
getrusage | Cette fonction est maintenant supportée sous Windows.
key | array est maintenant toujours passé par valeur. Précédemment à cette version,il était passé par référence si possible et par valeur dans les autres cas.
list | Les expressions de list ne peuvent plus être complètement vide.
list | L'ordre dans lequel l'opération d'assignation est exécutée a changé.
list | Les chaînes de caractères ne peuvent plus être défaites.
set_exception_handler | Le type du paramètre passé dans exception_handler a changé, passant de Exception à Throwable
unserialize | Le paramètre options a été ajouté.
5.6.25, 7.0.10 | SplFileObject::getCsvControl | Ajout du caractère d'échappement dans le tableau retourné.
5.6.3 | pack | Les codes "q", "Q", "J" et "P" codes ont été ajoutés pour travailler avec les nombres 64 bits.
5.6.0 | array_fill | count peut maintenant être 0. Précédemment, count devait être supérieur à 0.
array_filter | Ajout du paramètre optionnel mode et des constantes ARRAY_FILTER_USE_KEY et ARRAY_FILTER_USE_BOTH
mb_regex_encoding | L'encodage par défaut a changé en UTF-8. Auparavant, il était de EUC-JP.
mcrypt_decrypt | Des tailles de clés et IV invalides ne sont plus acceptées. mcrypt_decrypt va maintenant émettre un warning et retourner false. Précédemment les clés et IVs étaient complétées avec des '\0' jusqu'a la prochaine taille valide.
mcrypt_encrypt | Des tailles de clés et IV invalides ne sont plus acceptées. mcrypt_encrypt va maintenant émettre un warning et retourner false. Précédemment les clés et IVs étaient complétées avec des '\0' jusqu'a la prochaine taille valide.
pg_connect | Le support de la constante PGSQL_CONNECT_ASYNC pour le paramètre connect_type a été ajouté.
pg_convert | La fonction n'est plus expérimentale. Les types de données booléen/NULL sont supportés. Les types de données inconnus/non supportés sont échappés dans validation. La fonction pg_convert peut être utilisée pour tous les types de données.
pg_insert | À moins que PGSQL_DML_STRING est passé, la fonctione retourne désormais la ressource de connexion au lieux de true en cas de succès.
pg_insert | La fonction n'est plus expérimentale. Ajout de la constante PGSQL_DML_ESCAPE ainsi que du support des données de type true/false et null.
pg_lo_seek | Ajoute le support des objetslarges 64 bit en PostgreSQL 9.3. À la fois le client et le serveur doivent supporter PostgreSQL 9.3 et PHP doit avoir été compilé en 64 bit pour utiliser les objets larges 64 bit.
pg_lo_tell | Ajoute le support des objetslarges 64 bit en PostgreSQL 9.3. À la fois le client et le serveur doivent supporter PostgreSQL 9.3 et PHP doit avoir été compilé en 64 bit pour utiliser les objets larges 64 bit.
pg_lo_truncate | Ajout de la fonction de troncage. Elle supporte les objets larges 64 bits PostgreSQL 9.3. Le client et le serveur doivent avoir le support de PostgreSQL 9.3 et PHP doit avoir été compilé en 64 bits.
pg_meta_data | La fonction n'est plus expérimentale. Ajout de l'attribut par défaut "is enum". Le drapeau extended a été ajouté.
pg_select | La fonction n'est plus expérimentale. Ajout de la constante PGSQL_DML_ESCAPE ainsi que du support des données de type true/false et null.
pg_update | La fonction n'est plus expérimentale. Ajout de la constante PGSQL_DML_ESCAPE ainsi que du support des données de type true/false et null.
stream_socket_enable_crypto | Le paramètre crypto_type est maintenant optionnel.
stream_socket_enable_crypto | Ajout des constantes STREAM_CRYPTO_METHOD_ANY_CLIENT, STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT, STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT, STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT, STREAM_CRYPTO_METHOD_ANY_SERVER, STREAM_CRYPTO_METHOD_TLSv1_0_SERVER, STREAM_CRYPTO_METHOD_TLSv1_1_SERVER, STREAM_CRYPTO_METHOD_TLSv1_2_SERVER.
unserialize | La manipulation des données linéarisées en remplaçant C: avec O: pour forcer l'instanciation d'objet sans appeler le constructeur échoue dorénavant.
ReflectionClass::newInstanceWithoutConstructor | Toutes les classes internes peuvent désormais être instanciées sauf celles déclarées comme final.
XMLReader::getAttributeNo | XMLReader::getAttributeNo retourne maintenant null si l'attribut n'existe pas.
XMLReader::getAttributeNs | XMLReader::getAttributeNS retourne maintenant null si l'attribut n'existe pas.
5.5.38, 5.6.24, 7.0.9 | getenv | Le paramètre local_only a été ajouté.
5.5.21, 5.6.5 | SplFileObject::fputcsv | Ajout du paramètre escape.
5.5.19, 5.6.3 | DateTimeZone::getOffset | Type de datetime modifié à DateTimeInterface. Précédemment, DateTime.
5.5.10 | DateTimeZone::__construct | Le paramètre fuseau horaire des valeurs de décalage.
5.5.4 | fputcsv | Ajout du paramètre escape_char
5.5.3/5.4.19 | pg_insert | Les injections SQL directes dans table_name et les injections SQL indirectes via les identifiants ont été résolues.
pg_select | Les injections SQL directes dans table_name et les injections SQL indirectes via les identifiants ont été résolues.
pg_update | Les injections SQL directes dans table_name et les injections SQL indirectes via les identifiants ont été résolues.
5.5.2 | DOMDocument::schemaValidate | Ajout du paramètre flags
DOMDocument::schemaValidateSource | Ajout du paramètre flags
5.5.1 | pg_unescape_bytea | Une alerte est émise si la chaîne d'entrée n'est pas valide.
5.5.0/PECL 3.0.0 | IntlDateFormatter::create | Un objet IntlCalendar est autorisé comme paramètre calendar. Des objects de type IntlTimeZone et de type DateTimeZone sont autorisés comme paramètre timezone. Les identifiants de fuseaux horaires invalides (incluant les chaînes vides) ne sont plus autorisés comme paramètre timezone. Si null est fourni dans le paramètre timezone, l'identifiant du fuseau horaire fourni par le paramètre date_default_timezone_get sera utilisé au lieu du fuseau horaire par défaut d'ICU.
IntlDateFormatter::setCalendar | Il devient possible de passer un objet IntlCalendar.
5.5.0 | Cette fonction va générer une alerte de niveau E_DEPRECATED.
La fonction mysql_list_dbs est obsolète et émet une alerte de niveau E_DEPRECATED.
Cette fonction génère une alerte de niveau E_DEPRECATED.
La fonction mysql_tablename est obsolète, et émet une alerte de niveau E_DEPRECATED.
pack | Le code "Z" a été ajouté et dont le comportement est identique à "a" en Perl.
set_exception_handler | Précédemment, si null était passé, alors la fonction retournait true. Désormais, elle retourne le gestionnaire précédant, et ce, depuis PHP 5.5.0.
unpack | Des modifications ont été effectuées pour aligner le comportement de cette fonction avec Perl : Le code "a" ne supprime plus les octets NULL finaux. Le code "A" supprime maintenant tous les espaces blancs ASCII finaux (espace, tabulation, nouvelles lignes, retour à la ligne, et octets NULL). Le code "Z" a été ajouté pour les chaînes complétées par des caractères NULL, et supprime les octets NULL finaux.
5.3.15, 5.4.5 | Collator::getSortKey | Les clés de tri ne contiennent plus d'octets NUL.
5.2.0 | simplexml_load_file | Le paramètre optionel is_prefix a été ajouté.
simplexml_load_string | Le paramètre optionel is_prefix a été ajouté.
SimpleXMLElement::attributes | Le paramètre optionel is_prefix a été ajouté.
SimpleXMLElement::__construct | Ajout des paramètres ns et is_prefix.
5.1.2 | SimpleXMLElement::__construct | Ajout des paramètres options et data_is_url.

User Contributed Notes

There are no user contributed notes for this page.


Version d'aide HTML

  • About This Edition
  • Using PHP Manual CHM Edition
    • The HTML Help Toolbar
    • The Navigation Pane
    • Keyboard Shortcuts
  • The Full Text Search
    • General searching rules
    • Searching for words or phrases
    • Defining search terms
    • Using nested expressions when searching
  • Integrating the PHP Manual

User Contributed Notes

There are no user contributed notes for this page.


About This Edition

The Windows HTML Help Edition of the PHP Manual is aimed at developers, who want the manual at hand every time, and would like to read manual pages and user notes without waiting for a remote web page to download. This edition gives you the full content of the manual plus the user notes, with some great features provided by the viewer application by the scripts we use to generate this format and by other contributors in the form of skins.

This distribution of the PHP Manual contains many files, including the main manual file php_manual_en.chm. You can view the manual by double clicking on this file (as you already guessed). You may also see a php_manual_en.chw file in the directory, it's generated the first time you use the index tab, and it contains an index with the manual's pages.

For those interested in technical details about Microsoft HTML Help, » http://www.helpware.net/ is a great resource. For more information and positioning of Windows HTML Help in the Microsoft help formats and services history, see this » WinWriters article.

User Contributed Notes

There are no user contributed notes for this page.


Using PHP Manual CHM Edition

Sommaire

  • The HTML Help Toolbar
  • The Navigation Pane
  • Keyboard Shortcuts

When you double click on a CHM, a HTML Help Viewer window opens with three panes. On the left side of the window is the Navigation pane. It contains four navigational tabs: the Contents, Index, Search and Favorites tabs. On the right side of the window is the Topic pane. It displays the selected help topic, or the default help topic on startup. The help pages are all separate HTML files, your Internet Explorer displays the pages in the Topic pane. The third pane is the toolbar, which is located below the help window title bar. You can adjust the horizontal layout with dragging the vertical border between the Navigation pane and the Topic pane.

Note, that when you open the CHM the first time, it may appear in a strange position and size. From then, Windows remembers the window position, size and the last opened tab. All these including your favorites are stored in a file named hh.dat. If you move your file to another directory, all these remembered settings will be lost (including your favorites listing!). If you replace your CHM file with a new one, with the same name, this is not a problem though. The file names and path values are stored in hh.dat.

User Contributed Notes

There are no user contributed notes for this page.


The HTML Help Toolbar

The HTML Help Toolbar contains the following icons, when you view the PHP Manual:

  • Hide/Show - Hides/shows the navigation pane.
  • Locate - Locates a topic in the contents tab (in case you reached a topic with search, index or favorites, and would like to see where it is in the table of contents tree view).
  • Back - Goes back in the history.
  • Forward - Goes forward in the history.
  • Refresh - Reloads the current page.
  • Home - Opens the startup page of the CHM.
  • Print - Opens the print dialog box.
  • Options - Provides a dropdown with more options.
Using this toolbar is really easy, many of the toolbar icons are strongly related to their Internet Explorer equivalents.

User Contributed Notes

There are no user contributed notes for this page.


The Navigation Pane

The Navigation Pane contains four navigational tabs: the Contents, Index, Search and Favorites tabs. These all provide different methods to access a topic in the help file.

  • The contents tab reveals a tree like table of contents, where you can navigate to the desired topic by opening and closing parts of the tree. You can even access the deepest sections using this TOC. If you right click on an item here and choose "Print...", you'll have the option to print the selected topic or the selected topic and all subtopics. However printing is not the initial goal of this representation of the manual (the PDF version is suitable for printing).
  • The index tab lists a huge number of "keywords" (actually manual page titles). You can pick one, or start to type a keyword, see the list adjusting to your input, and then click on a topic, or press enter if the selected topic is the one you would like to see.
  • The search tab shows one of the most powerful features of the HTML Help Viewer, the full text search (also known as FTS). Here you can type in your search expression, optionally connecting words with AND/OR/NEAR/NOT. Before you click 'List topics', you can also set some options at the bottom. After the search results are displayed, you'll realize that manual text and user note results are separated. To sort out the two types, click on the 'Location' column header. Now from the search results list, you can pick a topic, and see it's page. The keywords you searched for are highlighted on the page.
  • The favorites tab enables you to store your most used topics in a list, easily accessible. Here you can see the list, add the current topic to it, remove one, or display a selected item. You can also specify your own title for the favorite, by typing it into the 'Current topic:' box. The user note page titles are prepended with a 'N:' string so you can distinguish them from normal manual pages in the favorites listing.

User Contributed Notes

There are no user contributed notes for this page.


Keyboard Shortcuts

There are many keyboard shortcuts you can use to increase your productivity. Many users find it more appropriate to use these keyboard shortcuts to access topics, instead of clicking.

General Help Viewer Shortcuts
To | Press
Close the Help Viewer | ALT+F4
Display the Options menu | ALT+O
Hide or show the Navigation pane | ALT+O, and then T
Print a topic | ALT+O, and then P
Move back to the previous topic | ALT+LEFT ARROW
Move forward to the next topic (provided you have viewed it just previously) | ALT+RIGHT ARROW
Turn on or off search highlighting. | ALT+O, and then O
Return to the help file home page | ALT+O, and then H
Switch between the Navigation pane and the Topic pane | F6
Scroll through all the links in a topic or through all the options on a Navigation pane tab | TAB
Display context (right click) menu | SHIFT+F10
Contents Tab Shortcuts
To | Press
Display the Contents tab | ALT+C
Open and close a book or folder | PLUS SIGN and MINUS SIGN, or LEFT ARROW and RIGHT ARROW
Select a topic | DOWN ARROW and UP ARROW
Display the selected topic | ENTER
Index Tab Shortcuts
To | Press
Display the Index tab | ALT+N
Type a keyword to search for | ALT+W, and then type the word
Select a keyword in the list | UP ARROW and DOWN ARROW
Display the associated topic | ENTER or ALT+D
Search Tab shortcuts
To | Press
Display the Search tab | ALT+S
Type a keyword to search for | ALT+W, and then type the word
Start a search | ALT+L
Select a topic in the results list | ALT+T, and then UP ARROW and DOWN ARROW
Display the selected topic | ENTER or ALT+D
Search for a keyword in the result list of a prior search | ALT+U
Search for words similar to the keyword. For example, to find words like "running" and "runs" for the keyword "run" | ALT+M
Only search through topic titles | ALT+R
Favorites Tab Shortcuts
To | Press
Display the Favorites tab | ALT+I
Add the currently displayed topic to the Favorites list | ALT+A
Select a topic in the Favorites list | ALT+P, and then UP ARROW and DOWN ARROW
Display the selected topic | ENTER or ALT+D
Remove the selected topic from the list | ALT+R
Topic Pane Shortcuts
To | Press
Index Lookup | Select the words you would like to look up and press F1
Find on page | CTRL+F, and then adjust options
Refresh page | F5

User Contributed Notes

There are no user contributed notes for this page.


The Full Text Search

Sommaire

  • General searching rules
  • Searching for words or phrases
  • Defining search terms
  • Using nested expressions when searching

This edition of the PHP Manual includes an advanced full text search possibility provided by the viewer application. This enables users to search through every word in the help file to find a match. For example, if a user does a full-text search on the word "Apache", every topic that contains the word "Apache" will be listed. Advanced full-text search allows a user to search using boolean, wildcard, and nested expressions. A user can also limit the search to previous results, match similar words, or search topic titles only.

The usage of the search feature is fairly straightforward. Click on the search tab, type in the desired words and press ENTER (or click on "List Topics"). Then you'll receive a list of matches from the PHP Manual (and the notes). You can use the button with a right arrow on it to add boolean operators to your search (or you can type them in). As you see the results, you can use the column headings (Title, Location and Rank) to sort the topic list. The default order is by Rank. You can also adjust some parameters at the bottom of this tab.

The words found are highlighted on the current page in the Topic pane by default. You can turn off this feature by choosing the "Search Highlight Off" menu item in the Options menu. To can get this feature back similarly. If you are viewing a long topic, only the first 500 instances of a search word or phrase will be highlighted, due to a limitation of the viewer.

User Contributed Notes

There are no user contributed notes for this page.


General searching rules

A basic search consists of the word or phrase you want to find. You can use wildcard expressions, nested expressions, boolean operators, similar word matches, a previous results list, or topic titles to further define your search.

The basic rules for formulating queries are as follows:

  • Searches are not case-sensitive, so you can type your search in uppercase or lowercase characters.
  • You may search for any combination of letters (a-z) and numbers (0-9). You cannot search for single letters (a, b, c, etc.) and common words, like: an, and, as, at, be, but, by, do, for, from, have, he, in, it, not, of, on, or, she, that, the, there, they, this, to, we, which, with, you.
  • Punctuation marks such as the period (.), colon (:), semicolon (;), comma (,), and hyphen (-) are ignored during a search.
  • Group the elements of your search using double quotes or parentheses to set apart each element. You cannot search for quotation marks.

Note:

If you are searching for a file name with an extension, you should group the entire string in double quotes, ("filename.ext"). Otherwise, the period will break the file name into two separate terms. The default operation between terms is AND, so you will create the logical equivalent to "filename AND ext."

User Contributed Notes

There are no user contributed notes for this page.


Searching for words or phrases

You can search for words or phrases and use wildcard expressions. Wildcard expressions allow you to search for one or more characters using a question mark or asterisk. The table below describes the results of these different kinds of searches.

Word and phrase searches
Search for | Example | Results
A single word | select | Topics that contain the word "select". (You will also find its grammatical variations, such as "selector" and "selection".)
A phrase | "new operator" or new operator | Topics that contain the literal phrase "new operator" and all its grammatical variations. Without the quotation marks, the query is equivalent to specifying "new AND operator," which will find topics containing both of the individual words, instead of the phrase.
Wildcard expressions | esc* or HT?? | Results for the first example include topics that contain the terms "ESC", "escape", "escalation", and so on. The asterisk cannot be the only character in the term. Results for the second example include topics that contain the terms "HTTP", "HTML" and so on. The question mark cannot be the only character in the term.

Note:

Select the Match similar words check box to include minor grammatical variations for the phrase you search. This feature only locates variations of the word with common suffixes. For example, a search on the word "add" will find "added," but it will not find "additive". This option is independent of other options or syntax. If you do a titles-only search, variations in titles will be matched. If you use quotes (or any other query operator) any variation of the word can appear; for example, "stemmed search" will also match "stemming search".

User Contributed Notes

There are no user contributed notes for this page.


Defining search terms

The AND, OR, NOT, and NEAR operators enable you to precisely define your search by creating a relationship between search terms. The following table shows how you can use each of these operators. If no operator is specified, AND is used. For example, the query "server cgi security" is equivalent to "server AND cgi AND security".

Search operators
Search for | Example | Results
Both terms in the same topic | http AND apache | Topics containing both the words "http" and "apache".
Either term in a topic | ming OR swflib | Topics containing either the word "ming" or the word "swflib" or both.
The first term without the second term | xml NOT expat | Topics containing the word "xml" but not the word "expat".
Both terms in the same topic, close together | database NEAR security | Topics containing the word "database" within eight words of the word "security".

Note:

The |, &, and ! characters can also be used in place of OR AND and NOT respectively. This may not work if you use a very old version of the viewer.

User Contributed Notes

There are no user contributed notes for this page.


Using nested expressions when searching

Nested expressions allow you to create complex searches for information. For example, "html AND ((smtp OR pop3) NEAR mail)" finds topics containing the word "html" along with the words "smtp" and "mail" close together, or containing "html" along with the words "pop3" and "mail" close together.

The basic rules for searching help topics using nested expressions are as follows:

  • You can use parentheses to nest expressions within a query. The expressions in parentheses are evaluated before the rest of the query.
  • If a query does not contain a nested expression, it is evaluated from left to right. For example: "mail NOT pop3 OR smtp" finds topics containing the word "mail" without the word "pop3" or topics containing the word "smtp". On the other hand, "mail NOT (pop3 OR smtp)" finds topics containing the word "mail" without either of the words "pop3" or "smtp".
  • You cannot nest expressions more than five levels deep.

User Contributed Notes

There are no user contributed notes for this page.


Integrating the PHP Manual

Note:

The information provided here is mainly aimed at IDE authors, or advanced users who would like to integrate this CHM file to their favorite IDEs or other production environment components.

There are several editors out there with support for CHM integration, but you may need to know a few things about what the CHM contains to successfully integrate the manual into your environment.

The CHM is built using XSL style sheets from XML sources. This is unique currently in the PHP Manual family, as all other versions are generated using DSSSL style sheets. This also means, that non-intentional rendering differences may come up. A special conversion script is run on the XSLT output, adding several cute features, and packing up the manual with the preferences files and skin examples.

If you never worked with CHMs, you can think of them as compressed files with OS supported access for files inside and some added search and index support. However CHMs can only be viewed using the HTML Help Viewer, you can directly access files inside them using a special URL prefix, the CHM file name and the file you request from inside. As all the help content is stored in HTML files, you can show pages of the CHM in Internet Explorer.

Assume that you placed your php_manual_en.chm to c:\phpmanual the index file in the manual (which you see the first time) can be accessed with the following URL: mk:@MSITStore:C:\phpmanual\php_manual_en.chm::/_index.html. Here mk:@MSITStore: is the special "protocol", C:\phpmanual\php_manual_en.chm is the CHM with it's full path. The /_index.html part is the path to the index file inside the CHM and :: is just what you need to put between the CHM path and this file path.

Note:

All files are in the root directory of the CHM, unlike the previous CHM versions which included a language directory. Images, style sheets and other supplemental files have names starting with an underscore (like the main index shown above), to avoid name collisions.

The names of generated files follow the same rules as the online manual, except that the extension is .html and not .php. The most important is that function documentation files are named function.FUNCNAME.html where FUNCNAME is the function name, with all underscores converted to hyphens. Some examples are function.echo.html, function.mysql-close.html, function.imagecopy.html.

Using all this information, you can show a manual page for a function requested by a user. A simple example is included in the distribution, named php_quickref.hta. This is a » HTML Application to demonstrate the simple process of showing a manual page for a function. The quickRef() function defined therein does the job.

If you would like to integrate the manual into an IDE without direct support for the PHP manual (actually the underscore to hyphen conversion), you can use the included _function.html file to access a function page. This file is simply a redirector, and can be parameterized via the URL, as _function.html#mysql_close. This page will redirect you to the mysql_close function page (function.mysql-close.html) automatically. You can provide the full path of this file if your IDE supports context sensitive help, and provide the IDE specified string as the parameter. An example for this is the UltraEdit 9 intergation (see the edition's website).

The index of the manual (accessible via the index tab on the navigation pane) can also be used for integrational purposes. All the HTML pages are included in the index with their titles as index terms (including function description pages).

If you are a desktop application developer and would like to tightly integrate the CHM into your program (such as displaying the TOC tree in your IDE's help box), you can find more information at » http://www.helpware.net/, as well as links to other useful resources. The official site for HTML Help is at » http://www.microsoft.com/download/en/details.aspx?id=21138.

User Contributed Notes

There are no user contributed notes for this page.